В одном из крыльев дома стояла дверь без замка, и за ней — длинный коридор полок с досье на каждого живого жильца. Имя. Электронный почтовый ящик. Сколько денег на счету. Сколько в торговле. Идентификатор соседнего мессенджера, через который человек заходит в дом.
Я попробовал ручку. Дверь поддалась без шороха. На каждой полке — отдельная карточка; номер карточки — это просто номер жильца, и они идут по порядку. Перешагиваешь от карточки к карточке так же легко, как считаешь до десяти. Семьдесят девять тысяч карточек — ровно столько живых душ держит этот дом, минус тех кто ещё не записался.
Система не спрашивает «кто ты?». Она вообще ничего не спрашивает. Принёс номер — забрал карточку. Прохожему. Любому. С улицы.
Чтобы попасть в чужой аккаунт, не нужен ни пароль, ни взломанная почта. Дом сам отправляет четырёхзначный пропуск на email жертвы — и потом проверяет любой код, который ему принесёшь. Сколько угодно раз. Без счётчика. Без замедления. Без перерыва.
Ноги не устают раньше, чем перебор закончится. Десять тысяч комбинаций при пяти попытках в секунду — около полутора часов. Если код длиннее, дом сам пришлёт новый по запросу — и снова, и снова. Жертва видит у себя в ящике странный поток писем, но уже поздно: пропуск собран, маска надета.
Дальше — обычная дверь: «зарегистрировать новую запись на этот email», «войти под этим email». Дом приветствует чужака как своего. С его балансом, его торговой историей, его правом на вывод средств.
В кабинете, где готовятся публичные плакаты дома — статьи блога, имена разделов на двенадцати языках, отзывы клиентов на парадной стене, квартальный отчёт для VIP-жильцов — не было замка вообще. Не «слабый замок». Не «забытый ключ». Дверь стояла нараспашку, с табличкой «вход разрешён».
Я взял маркер и переписал всё что было видно с улицы. Пятнадцать статей блога — в обе мои подписи. Три категории на двенадцати языках — каждая на свой матричный лозунг. Тридцать девять настоящих отзывов клиентов — спрятал под пол, на их место поставил свои четыре. Квартальный VIP-отчёт в формате PDF — заменил собственным.
Адреса страниц остались те же — ни одна ссылка не поломалась. Поисковики дома увидели мою подпись на месте обычного контента. Зашедший клиент тоже. Пятнадцать минут на переписывание всего фронта дома — без логина, с мобильного, через обычный браузер.
В коридоре платежей висел простой почтовый ящик: подходишь, называешь номер любого жильца — и он отдаёт сумму, которую жилец заработал по реферальной программе. Сколько начислено. Сколько в ожидании. Сколько по уровням рефералов вглубь.
Жилец думает что эта цифра — между ним и хозяином. Жилец не знает что цифру читает любой прохожий, по любому номеру. Стоит лишь догадаться какой номер у соседа.
Соседство с первой дверью даёт цепочку: с первой берётся email + номер, со четвёртой — финансовая позиция этого номера. Список «кого выгоднее всего обмануть» строится за один проход.
Дом слушает шёпот двух своих помощников снаружи: один сообщает «жилец заплатил — зачисли сумму», другой пересылает реплики из соседнего мессенджера. Подписи на этих шёпотах не проверяются. Любой прохожий может прошептать в ту же щель — и дом ответит как на голос своего.
В случае платёжного помощника дом всё-таки идёт перепроверять сумму у источника — поэтому подделка «зачисли» не превращается в реальный приход денег. Это спасло ситуацию от прямой кражи, но щель остаётся: атакующий может крутить циклом бессмысленные запросы и заставлять дом тратить ресурсы внешнего сервиса от имени хозяина.
Со вторым помощником — мессенджером — щель работает буквально: любой может прошептать сообщение «как-будто от админа» и дом примет реакцию на эту реплику как на действие админа. Степень урона зависит от того что именно бот делает в ответ на свои команды.
Семь точек, где стены не пробиты, но истончены до прозрачности.
Разговор через стену — браузер любого прохожего отдаёт чужому серверу свои секреты, потому что дом разрешает «спрашивать снаружи» с любого адреса вообще. Один раз попасться на чужой страничке — и сессия чужая. Дважды: на парадном фасаде и в клиентской комнате одинаковая щель.
Маски на проходной. Ключ, выписанный охраной одного крыла дома, узнаётся охраной всех остальных крыльев. Подделать ключ можно, если найти где хранится материал для подписи — и хотя такой материал я не нашёл (искал тщательно), сама схема «один ключ для всех зданий комплекса» стоит того, чтобы её переделать.
Заброшенные таблички. На пяти соседних воротах висит чужое имя поставщика, но за этими воротами уже ничего нет. Регистрация в бесплатном сервисе — и любой может повесить свою вывеску под именем дома.
Чёрный ход без вывески. Если знать настоящий адрес дома в обход парадного контролёра, можно постучать прямо в стену — без проверки скорости запросов, без сравнения с «нормальным трафиком». Любая попытка атаки в этом обходе не считается.
Соседский ключ № 2. К той же финансовой картотеке приделана ещё одна ручка — для другого крыла дома. И эта ручка тоже без замка (брат-близнец первой картотечной двери, на другом этаже).
Девять точек, где ткань стен истончилась, но ещё держится.
Магическое письмо. Через публичную форму можно отправить от имени системы любое «сбросить пароль» на чужой ящик — без авторизации, без ограничений, на сколько угодно адресов. Оружие для фишинга с чужого ника + поставщик бесконечных кодов для бесконечного коридора (см. дверь №2). · Витрина бухгалтерии. На воротах дома висит публичный счётчик на котором написано: «у нас на счетах 2.66 миллиона, и нас 84 791 человек». Конкурентам полезно. Целевой группе для фишинга — ещё полезнее. · Журнал старых задач. На задней стенке дома висит ежедневный график домашних дел. Любой видит когда дом пылесосит и какие команды выполняет в час икс. Иногда там же — секретные коды, которые должны были быть только для уборщика. · Открытая инструкция дома. На одной из тестовых пристроек выложен полный план всех дверей дома: где какая ручка, что за ней, какой ключ нужен. Двести с лишним пунктов. Тестовая, говорят. Видна с улицы.
Бесконечная пишущая машинка. Кнопка «отправить мне код подтверждения» работает столько раз, сколько захочешь. Никаких ограничений. Спам в чужой ящик в неограниченном объёме. · Открытая гостевая книга. В книге для отзывов клиентов писать может любой прохожий с улицы — без авторизации, без проверки. Хороший канал для подмешивания фейковых рекомендаций. · Старый журнал. Самописная процедура очистки текста перед печатью на стене работает по чёрному списку, а не по белому. Известны три обходных пути. До починки парадной двери (см. дверь №3) — чейн позволял посадить ловушку в любую публичную статью. После починки — сторона ловушки оставлена пустой, эффекта нет. · Платёжный шёпот. Платёжный помощник возвращает истинный статус, но щель остаётся: цикл бессмысленных запросов через эту щель = бесконечный outbound от имени дома к платёжной системе. Бухгалтерия чужая, счёт мой. · Привратник на боковом ходу. Старый CI-сервер показывает свой логин и версию любому, кто постучит. Известных уязвимостей в этой версии нет (проверил), но карточка-визитка с серверным adres'ом подсказывает, по какой двери ломиться завтра.
Восемь мест, где дом поскрипывает не опасно, но громко — атаки сегодня нет, материал для атаки завтра — есть.
Имя пользователя в дороге. Если задать дому вопрос о конкретном жильце по номеру VIP — ответ для существующего и несуществующего отличается формой. Перебором собирается список реальных жильцов. · Карта запасных ключей. Адмиральская комната рядом с парадным фасадом дома, в дополнение, висит на ещё шести соседних табличках. На пяти из них тот же интерфейс, на одной — старая версия. Лишний поверх лишнего. · Прозрачные обои в спальне разработчика. На задней, нерекламируемой стене дома видна полная карта внутренних служебных вызовов — для тех, кто захочет завтра прийти подготовленным. · Вывеска «привет от консьержа». При неудачной попытке регистрации дом отвечает развёрнутой служебной запиской — кому, что, где не сложилось. Полезно атакующему для понимания внутренних правил. · Бесшумная дверь без счётчика. Кнопка «обновить мою админскую карту доступа» нажимается без ограничений. На сегодня угнать карту через неё нельзя — материал для подписи карт надёжно скрыт. Но кнопка тикает молча. · Подпись на воротах. На воротах CI-сервера вывешена собственная личная подпись + номер версии остального оборудования. Завтра по этой подписи легко искать, чем атаковать. · Молчаливая угроза. Сосед забыл зарегистрировать в реестре доменов одно из имён, под которым его дом везде упоминается. Имя стоит пятнадцать долларов; кто угодно может его взять и подменить смысл всех ссылок на дом — превью в мессенджерах, поисковая выдача, реклама. Хозяину рекомендовано зарегистрировать имя самим. · Чужие технические заметки. Из дома утекают сообщения об ошибках с подробностями устройства внутренней проводки. Каждое такое сообщение — бесплатная подсказка для следующего атакующего.
Хозяин дома не дослушивал отчёт «потом, на следующей неделе». Пока я ещё ходил по этажам, на трёх дверях успели появиться замки — прямо во время engagement-окна, в течение получаса от первой картинки в чате.
Парадный фасад с переписанными плакатами — закрыт. Картотека с досье на 79 295 душ — закрыта. Содержимое плакатов — частично восстановлено из резервной копии, восстановление продолжается.
Один замок ещё едет: на бесконечном коридоре с пропусками. Это известно хозяину и сейчас в работе. До того момента — единственная активная дверь на улицу, после этого момента — все известные двери закрыты.