Он вдруг поймал себя на мысли, что впервые за долгое время думает об этой купленной по дешевке квартире не как о временном логове, где можно перекантоваться до лучших времен, а как о постоянном жилище. Только вот позвать кого‑то в такое жилище было немного стремно. Серёга‑то ладно, он на подобные мелочи обращать внимание не привык, а вот при мысли о том, что жирные пятна на стенах и драный линолеум на полу кухни увидит Маша, становилось неловко. Кириллу вдруг остро захотелось создать хотя бы иллюзию уюта — накатить минимальный патч к реальности, прежде чем кто‑то заметит, что грозный хакер Кикс обитает в такой запущенной норе, где отовсюду разве что не торчат скользкие хвосты червей, а вот плесенью кое‑где все‑таки попахивает. Мать этого точно не одобрила бы.
Воодушевившись столь своевременной мыслью, он соорудил себе кофе с бутербродом и принялся остервенело отдирать обои в коридоре и в комнате. За этим увлекательным занятием Кирилл провел следующие несколько часов, пока не выдохся окончательно. Чтобы немного перевести дух, он включил ноутбук и запустил «Иду», решив поковырять трояна, которого вытащил с принесенного Иваном винчестера, — тот уже заждался своего часа.

Трой и вправду оказался непростым. Ту часть, которую писал он сам, Кирилл решил не трогать, просто еще раз убедился в том, что не ошибся, когда ему показалось, будто кто‑то без спроса позаимствовал его код. А вот с новыми функциями, ответственными за распространение червя, пришлось немного повозиться.
Судя по его внутренней логике, обновленный троян и вправду самостоятельно копировал себя по сети, но при этом умел выполнять поступающие с удаленного сервера команды, которые отдавал этой программе неведомый оператор. Туда же вредонос отсылал отчеты о проделанной работе и информацию о каждой зараженной машине. И вот ведь что интересно: обычно адрес такого управляющего сервера авторы вирусов жестко забивали непосредственно в коде, в редких случаях — шифровали содержащую его строку, а потом заставляли трояна расшифровывать ее в памяти. Эта программа действовала гораздо умнее.
Червь просыпался каждую полночь по Гринвичу и начинал считать. Он брал сегодняшнюю дату и превращал ее в число, затем добавлял к нему секретное значение, известное только ему и его создателю. Результат пропускался через хеш‑функцию, превращаясь в бессмысленную кашу из битов.
Но из этой каши червь лепил имена.
Первые восемь символов хеша становились доменом. Червь пытался соединиться с этим адресом и, если натыкался на пустоту, генерировал следующий, а затем еще один и еще. И так десятки, сотни раз, методично перебирая математически предсказуемую, но для постороннего глаза совершенно случайную последовательность. Где‑то на другом конце планеты его хозяин делал то же самое. Он знал алгоритм, знал «зерно», знал дату. Его программа тоже считала, генерируя ту же самую последовательность доменов. И когда она выдавала очередной адрес, хозяин регистрировал его, один из тысячи сгенерированных.
Червь находил этот единственный живой домен. Соединение устанавливалось, приказы загружались, миссия продолжалась. Очень разумный подход: если очередной домен заблокируют правоохранители или сам сервак грохнут из‑за жалоб пострадавших пользователей, ботнет будет жить, а таинственный злодей сможет и дальше отдавать команды зараженным машинам — расползшиеся по сети трояны просто подключатся к следующему серверу. Изящное решение, придуманное явно не новичком и не случайным вирусописателем. Понять бы еще, кто такой умный и талантливый изобрел столь интересный ход…
Кирилл выгрузил образ червя в виртуальную машину, выставил нужное время и значение на календаре, словил момент полуночного пробуждения программы, а потом с помощью несложного скрипта начал записывать в текстовый файл дату и получившийся домен. Затем следующий, и еще, и еще. Когда набралось изрядное количество строк, Кирилл загнал получившийся файлик в написанный им скрипт‑реконструктор, который начал методично перебирать возможные значения «зерна», для каждого прогоняя алгоритм вперед и сравнивая результат с наблюдаемыми доменами. В какой‑то момент последовательность сошлась так, что программа начала повторять генерируемые трояном наборы символов. Получилось! «Секретным словом» оказалась строка 0x4C69616D — на первый взгляд бессмысленная, но отчего‑то заставившая Кирилла насторожиться. Нечто странное, неуловимо знакомое привиделось ему в этих символах…
Стараясь отогнать наваждение, Кирилл снова открыл бинарник в дизассемблере. В сегменте, где червь формировал сообщения, прятались фрагменты текста — названия внутренних переменных отладки, не вычищенные при сборке: WatcherInit, TC_ResponseQueue. Он пробежал бинарник по диагонали и в debug-секции, которую нельзя было увидеть в рантайме, внезапно наткнулся на комментарий: If you read this — you’re still faster than your habits.
Кирилл откинулся на скрипучем стуле. Такие пасхалки‑послания не появляются в коде вредоносов сами собой. Похоже, автор этого поделия неплохо говорит по‑английски и каким‑то образом смог раздобыть образец его винлокера, который Кирилл совершенно не планировал выпускать в «дикую природу». А это возможно только в одном случае — если создатель червя внимательно за ним следил, а может быть, даже хотел, чтобы Кирилл об этом догадался. Он вновь взглянул на символы «секретной фразы», мысленно сопоставил их с таблицей ASCII… и наконец разгадал эту причудливую головоломку.
0x4C = L
0x69 = i
0x61 = a
0x6D = m
Загадочный паззл 0x4C69616D сложился в понятное Liam. Это была не просто весточка, не вызов и не угроза, а, скорее, привет от человека, который в силах заранее просчитать твои шаги и все равно хочет, чтобы ты их сделал. Впрочем, всегда остается ненулевой шанс, что это чья‑то чужая игра, непонятная шахматная партия, которую затеял некто, хорошо знающий расположение фигур на доске. И Кирилл, при всем своем чутье, не имел права округлять вероятность до единицы. Иллюзия очевидности — худший эксплоит в сознании хакера. Сейчас понятно главное: если это действительно Лиам, то та давняя история с TerraCore все еще не окончена. И цель, похоже, заключалась именно в том, чтобы осторожно напомнить: «я не потерял тебя из виду, парень». Правда, в этом напоминании — раздражающе мало ясности. Зачем он отправил это послание и почему — именно здесь и сейчас?
Кирилл задумался, нервно постукивая пальцами по подбородку. Зашитый в червя алгоритм генерации доменов выглядел красиво и элегантно, но имел один неочевидный изъян. Зная его секрет, Кирилл мог каким‑то образом вывести из стоя настоящий командный сервер, а потом зарегистрировать следующий домен раньше своего оппонента, кем бы тот ни был. И тогда… Тогда он сумеет перехватить управление всеми зараженными компьютерами в сети.
Этот прием в хакерской среде называют синкхолом. Когда программа по известному алгоритму сама придумывает доменные имена для своего управляющего центра, ее можно поймать на опережении. Кирилл уже знал, какие домены появятся в будущем, поэтому мог заранее зарегистрировать один из них и поднять на нем сервер‑ловушку. Для червя это будет выглядеть так, будто он связался со своим хозяином, но на самом деле он попадет в контролируемую изолированную инфраструктуру. Простой и эффективный ход: не атака на армию, а захват штаба, куда эта армия сама приходит за приказами. Вот только как вырубить уже существующий командный сервак?
На самом‑то деле способ напрашивается только один: DDoS-атака, метод простой и надежный, как удар ногой по запертой двери. Всего‑то и требуется — завалить сервер мусорными запросами, забить его канал до отказа так, чтобы ни одна зараженная машина не сумела сквозь него пробиться. Вот только для реализации такой атаки тоже нужен ресурс, которого у Кирилла сейчас под рукой нет. Обращаться к старым знакомым категорически не хотелось, как не хотелось и лезть на всем известные хакерские площадки в поисках подходящего исполнителя. Это же опять придется перелопачивать кучу сообщений, оценивать предложения по репутации их авторов, вступать с ними в переписку, уточнять детали оплаты, заморачиваться с гарантами… Кроме всего прочего, была у этого нежелания как минимум одна рациональная причина.
Кирилл вдруг вспомнил яркую, как вспышка молнии, картинку из детства: погруженное в кромешную тьму помещение, залитое таинственным алым светом. Помимо страсти к рыбалке, у отца было еще одно увлечение — он редко расставался с тяжелым фотоаппаратом «Зоркий» и маленьким прибором в ароматно пахнущем кожей чехле, который он называл экспонометром. Нащелкав несколько пленок, отец надолго запирался в темной ванной комнате, вызывая недовольное ворчание матери. Там творилось магическое действо, за которым так любил наблюдать маленький Кирилл: отец зажигал небольшую лампу со сменными красными светофильтрами, собирал аккуратно сложенный в чемодан проектор‑фотоувеличитель, доставал глянцеватель, разливал по пластиковым ванночкам химические реактивы… Года через два после его смерти мама вынесла на помойку все эти вещи, потому что они занимали полезное место на антресолях. Сделанные отцом фотографии, пожелтевшие осколки воспоминаний в пыльном семейном фотоальбоме — остались.
Кирилл вспомнил, как завороженно созерцал настоящее волшебство: на опущенном в ванночку с прозрачной жидкостью листе фотобумаги медленно проступало изображение — улыбающиеся лица, силуэты домов, кроны деревьев, покрытые черно‑белой листвой. Так и сейчас картинка происходящего понемногу проявлялась из небытия, обрастая деталями. Связан ли до сих пор Лиам с «Террой» или нет, но, вполне вероятно, он потерял Кирилла из виду. И возможно, этот троян — попытка зацепить его, отследить реакцию, выяснить, где он обитает сейчас. Если Кирилл призовет на помощь местных хакеров, это будет след. Яркий, очевидный и совершенно ненужный.
Продолжение доступно только участникам
Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».
Присоединяйся к сообществу «Xakep.ru»!
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее

