Конференция DEFCON 17. Посмеёмся над вашими вирусами! Часть 1

Далее можно загрузить это в IDA и увидеть, что всё в таблице импортированных адресов выглядит нормально, и мы можем проследовать по перекрёстным ссылкам для установки указателя на нужном файле. Так мы попадаем именно в точку расположения зависимого кода шифрования.



Таким образом, с помощью всего нескольких команд для дампа памяти мы нашли место, в котором спрятался Coreflood. Мы деассемблировали, извлекли и вставили заголовок PE, даже не имея его, и получили полностью восстановленную таблицу адресов менее чем за 20 секунд.

Следующая история называется «Дорогая, извини, что снова тебя побеспокоил – я ужал интернет»! Эта история повествует о том, что дефектный IP-генератор Conficker.B сканирует только часть интернета. Здесь мы снова возвращаемся к функции rand. Важной частью этой функции является самая последняя инструкция, которую я пометил зелёной стрелкой – она выполняет любое конечное значение в EAX с величиной 7FFF. Если вы не знакомы с принципами ассемблирования и не знаете, что может сделать эта инструкция, то вот небольшое демо по этому поводу.



Мы перемещаем максимальное значение, которое может содержать EAX, в этот реестр и выполняем конечную инструкцию. Вы можете увидеть, что она «отрубает» верхнюю половину значения и затем вычитает 7FFF, которое в десятичной системе конвертируется в число 32767. Видимо, авторы не осознавали, что это ограничение, которое запускает Windows, не возвращает целому числу тот размер, который они хотели. Оно «отрубает» его так, чтобы значение не превышало 7FFF, так что один байт 7F никогда не будет больше этого значения 7F, то есть он никогда не будет равен 80 или чему-то подобному.

Далее в левой части слайда, который я назвал «Порочный метод», вы видите код Conficker.B. Здесь показан один вызов rand, инициирующий первый октет IP-адреса, который предназначается для сканирования после того, как вернётся из rand. Следующий системный вызов rand инициирует третий и четвертый октет IP-адреса, но из-за вышесказанного два из этих октетов никогда не будут больше, чем 7F. Таким образом, большая часть интернета не сможет быть просканирована из-за того, что Conficker.B использует этот алгоритм.

В правой части слайда находится часть исходного кода, показывающая работу ассемблера. Его трудно прочесть на экране, но этот пример есть в открытом доступе, и вы можете ознакомиться с ним онлайн, если вам это интересно.



В нижней части следующего слайда под названием «Симуляция порочного метода» размещена ссылка на этот инструмент. Вы также видите, что IP-адрес генерируется с PRNG, но не сканируется.



Я хочу сказать большое спасибо Брэндону Энрайту, который сделал график, приведённый на следующем слайде. Это график носит название «кривой Гильберта», и я сейчас увеличу изображение, чтобы вам было лучше видно на экране. Синий цвет на графике обозначает диапазон IP-адресов, недоступных для сканирования Conficker.B, использующего этот порочный алгоритм. Темно-красный цвет показывает то, что можно просканировать. Вы видите, что большинство участков графика не тёмно-красного, а фиолетового цвета, и вы не увидите, почему так получается, пока не увеличите соответствующий прямоугольник.



Даже в этом увеличенном прямоугольнике, в каждом блоке /16, вы видите множество синих фрагментов, которые превращают темно-красный цвет в фиолетовый. Это те части адресов, которые Conficker.B не в состоянии просканировать.



Это довольно интересно, потому что многие люди уверены, что Conficker.B создали «великие умы». Возможно, так и есть, но эти умы не были осведомлены об ограничениях, которые существую в Windows rand().

Мэттью Ричард: вернемся к тем парням, которые, как я уже говорил, не слишком хорошо управляются со своими вирусами, так что в киберпреступности это сродни пословице «человек человеку волк», поэтому такие парни не пользуются уважением в своих кругах.

Давайте поговорим о хакерском инструментарии Neosploit, который «достал» всех. Можно сказать, что девизом его разработчиков было «Спасибо за наличку, теперь пора бежать». Neosploit – это набор инструментов для организации веб-атак, так что парни из киберпреступности будут его покупать и настраивать против парней на сервере, взламывать сервер, загружать коды и так далее.



Создатели Neosploit совершили хорошую инвестицию, продавая свой инструмент, но не позволяя его изменять, модифицировать или пользоваться его отдельными частями. Третья версия этого инструментария была выпущена в апреле 2008 года, и большинство уникальных эксплойтов написаны на языке С, так что это не PHP или какие-то там отстойные веб-приложения. Клиенты получали бинарный дистрибутив с набором CGI эксплойтов.

Neosploit обладает функциями, не позволяющими клиентам разделять или обрезать эксплойты. Для этого все эксплойты были представлены в двоичном формате, зашифрованном с помощью XOR. Создатели сделали так, чтобы никто не смог разрезать, склеить и создать свой собственный комплект эксплойтов на основе Neosploit. Существует 40-50-60 различных типов веб-атак, в основе которых находятся украденные и скопированные коды, вставленные в собственные эксплойты, так что ребята Neosploit оказались немного умнее, зашифровав свои эксплойты изнутри. На скриншоте вы видите, что у них имеется файл с ключом neosploit.key, так что это полностью лицензионное ПО.



Не сомневаюсь, что у них была куча действительно хороших клиентов, на которых они заработали кучу денег. Самыми известными их клиентами были Torpig. Думаю, вы слышали о рутките Mebroot, с помощью которого они компрометировали системы для создания сети ботнет. Но у создателей Neosploit было много и других клиентов. В мае 2008 года они выпустили свежее усовершенствование — 3-ю версию своего инструментария. Клиентам предлагалось совершить предоплату пакета эксплойтов со всеми последующими обновлениями за $1000. Позже я подробнее расскажу об этом, пока что замечу, что они действительно беспокоились о пиратах и стремились максимально защитить от них свой продукт, так что было определенно очень весело.



Даже СМИ писали, что эти эксплойты повсюду. Так что само собой, мы попробуем деассемблировать код и показать, как работает Neosploit.

Первая весёлая вещь, которую они сделали, после того, как усиленно раскручивали этот набор эксплойтов с апреля по июль — это прекратили его поддержку с 20.07.2008 г. В объяснении, которое они просто разместили на своём сайте, было сказано следующее: «К сожалению, дальнейшая поддержка продукта неосуществима. Приносим извинения за доставленные неудобства, но бизнес есть бизнес, и время, потраченное на проект, себя не оправдало. Последние месяцы мы старались до последнего удовлетворять требования клиентов, но когда-нибудь поддержка должна была прекратиться. Мы были с вами полтора года и надеемся, что для вашего бизнеса это было не самое худшее время. Теперь нас не будет рядом с вами, но, тем не менее мы желаем, чтобы ваш бизнес процветал ещё очень долго». В общем, мы получили ваши деньги, вы оплатили подписку, так что будьте здоровы!

Однако они просто пошутили и в августе 2008 снова вернулись и выпустили совершенно новую версию 3.1, которую предоставили своим ключевым клиентам, указав, что все остальные клиенты получат обновление после того, как за него заплатят. Данное обновление содержало несколько новых эксплойтов для Adobe PDF, Shockwave Flash и Quicktime для Firefox.

Затем они снова решили быть серьёзными и объявили, что на самом деле прекращают выпускать обновления, так что все, кто сделал предоплату подписки, облажались.

Итак, перейдём к рассмотрению Neosploit, этого довольно крутого комплекта для организации веб-атак. Поскольку его разработчики боролись с пиратами и кражей эксплойтов, которые могли бы быть скопированы и вставлены в чужие комплекты, они взяли каждый эксплойт и поместили его в файл CGI, закодировав таким образом, что вытащить его оттуда было очень нелегко. Двоичные файлы эксплойтов, написанные на языке С, немного отличались от PHP скриптов.



В блоге Neosploit была размешена фраза Данчо Данчева, что «любой желающий может создать новый эксплойт», но это довольно трудно. Я решил выяснить, насколько это трудно и приступил к разборке одного из эксплойтов.

Каждый эксплойт сохранялся в зашифрованной форме с использованием 3-х байтового ключа XOR. На каждый поступающий запрос эксплойт расшифровывался и предоставлялся пользователю для работы, и такой цикл постоянно повторялся.



Так что даже если бы вы смогли пройти сквозь память, а снять дамп памяти всё ещё довольно сложно, и получить все эксплойты, то всё равно эти буферы очищались каждый раз.

К счастью, если вы сможете копировать и вставлять эти эксплойты в нужную вам программу, то можно найти ответ. Для этого используется очень мощный инструмент расшифровки – IDA скриптинг. С его помощью можно комментировать или снимать дамп определённой области памяти, обновлять эксплойты, он может быть полезен для работы с вредоносным ПО, которое использует строки, усложнённые xor, base64 и т.д. Я написал IDE скрипт, с помощью которого попытался деассемблировать снятый дамп памяти зашифрованного эксплойта.



Он проходит через все зашифрованные объекты, ищет все вызовы функций расшифровки, захватывает зашифрованные объекты, дешифрует их с помощью XOR и затем снимает дамп. Это один способ, но думаю, вы могли бы написать свой собственный скрипт, приложение, делающее то же самое. Если вы знаете, как добавить новые эксплойты в Neosploit, то сможете сделать что-то в этом направлении и конечно, как только вы снимите дамп, то узнаете весь открытый текст, сможете его «выдрать» из инструментация и перепродать. Новые ребята, разрабатывающие эксплойты, просто сдались, потому что кто-то заработал хорошие деньги, не заботясь о своих клиентах.

Если кто-либо слышал великого хип-хоп философа Бигги Смоллса из Notorius B.I.G, то знает его песню под названием Ten crack commandments, «Десять заповедей крэка», в которой заключена великая мудрость. Если вы наркодилер, то соблюдайте 4 заповедь: «Никогда не сиди на собственной дури, которую ты толкаешь». Вероятно, парень, которого я назвал Peeper и который распространял собственный вредоносный код, никогда не слышал эту песню, потому что тестировал свой продукт на себе.

Его атака заключалась в следующем. Он отправлял электронные письма, маскируясь под различные государственные учреждения и обращаясь к людям по имени: «Уважаемый такой-то, кто-то подал в Федеральную Торговую Комиссию жалобу на вашу компанию, поэтому кликнике сюда, чтобы скачать документ, в котором подробно описана суть».



Далее пользователь переходил по ссылке и пытался скачать этот документ, а это действительно был документ Word в формате .doc. Однако там имелась одна очень хитрая особенность. У вас была возможность просто перетащить исполняемые файлы из документа Word и затем их переименовать, но при попытке загрузить файл появлялось сообщение: «Microsoft Word обнаружил проблему, и документ не может быть загружен. Пожалуйста, дважды кликнике по иконке документа, чтобы продолжить». Потрясающая задумка!



Естественно, люди кликали, они кликали 6 раз, чтобы получить это зараженное сообщение, так что у этого парня была куча жертв. Мне понравилось это сообщение: «Они попытались меня обмануть, бла-бла-бла».

Следующее, что мы обнаружили, отслеживая этого парня, это открытые каталоги Drop Directory, куда он сбрасывал полученную информацию.



Возможно, у него не было своих инструментов для управления ими или он думал, что открытые каталоги хорошая вещь, но открытые каталоги – это плохо, если вы храните много информации, полученной от разных людей. Любой сервер, который он бы настроил для своего «посадочного» сайта, имел открытый каталог, и вы могли просто зайти туда и просмотреть списки всех его жертв и каждую по отдельности.

В каком-то смысле он был хорошим разработчиком, потому что писал качественный код. Но его недостатком было то, что адресуя свой код действующему серверу, он использовал свой реальный IP-адрес, а вы не продержитесь долго, используя подобные вещи.



Так что на самом деле, у него был стандартный DSL модем, выходивший на связь из Украины, он протестировал весь свой код и вредоносное ПО, обладающее хорошей функцией под названием «следи за мной», или «следи за ним». Этот парень занимался тем, что воровал банковскую информацию, но иногда ему просто хотелось наблюдать за своими жертвами, чтобы увидеть, что они делают, поэтому мы назвали его Peeper, или «Наблюдатель». Он не удовлетворялся простой функциональностью своего ПО, он начал следить сам. Выглядит довольно странно, как будто вы открыли окна удаленного доступа VNC на собственном компьютере и зациклили их, получая всё меньшие и меньшие изображения. Фактически он проделывал это много раз, на многих «посадочных» серверах, действительно, это было очень и очень странно. Так что просматривая эти «посадочные» сервера, можно было сказать: «о, смотрите, это картинка, где он наблюдает сам за собой, наблюдающим за собой, который наблюдает за собой».



«Свет мой, зеркальце, скажи, кто на свете всех милее»?

Больше всего мне понравилось то, что он сделал сам для себя. Он использовал эту функцию «следи за мной» в процессе разработки кода. Фактически он писал код, наблюдая за собой, отправляющим всё это обратно на сервер command and control. Тем самым он давал возможность официалам ворваться через черный ход, уложить его лицом в пол и конфисковать его компьютер. Короче говоря, ничто так не помогает избавиться от вас, как изображение дерева исходного кода, привязанное к вашему IP-адресу.



Последний фрагмент вредоносного ПО, который мы рассмотрим, наверняка заинтересует людей, хорошо знакомых с Internet Explorer 7. Но не беспокойтесь, Microsoft уверяет, что всё под контролем, верьте им!



Итак, у Microsoft была большая проблема с Internet Explorer 6, вызванная тем, что из этого браузера было очень легко выкрасть сохранённые пароли. Обычно вы заходите на сайт, вас спрашивают, хотите ли вы сохранить пароль, вызывается специальная форма, вы отвечаете «да», и он сохраняется в реестре. Проблема IE 6 состояла в том, что если вы входите в систему как пользователь, вам достаточно сделать один системный вызов CryptUnprotectData(), чтобы расшифровать эти пароли, которые действительно не имеют защиты.

Поэтому вредоносное ПО, запущенное с полномочиями пользователя, свободно читало эти пароли и отсылало их злоумышленнику. Поэтому в IE 7 они установили великолепную «заплатку» — пароли стали шифроваться 128-ти битным ключом. Действительно не взламываемое решение!
Если посмотреть глубже, вы можете увидеть хеш, имеющийся на сайте, я объясню это немного позже, в котором имеется двоичный файл, содержащий имя пользователя и пароль. Я хочу процитировать ещё одного великого философа, Джона Траволту, из фильма «Меч-рыба». Мой любимый отрывок – это когда он сидит там и объясняет: «Этот шифр настолько хорош, что даже я не могу его взломать». Я думаю, он имел в виду 512-ти битное шифрование, и он, лучший в мире шифровальщик, почему его и наняли, говорит, что даже он не может этого сделать.

Итак, вот что сделали Microsoft. Они шифруют пароль, для чего они будут генерировать 128-и битный ключ на основе хеша MD5 сайта, для которого они сохраняют этот пароль. Это кажется довольно разумным, так что если вы зашли на www.bank.com/login.sp, то они возьмут эту строку, сделают все литеры строчными, затем перекодируют их в большие символы и используют алгоритм MD5, превратив эту строку в ключ, который будет использован для шифрования пароля в реестре для имени пользователя.

Затем, когда вы посещаете этот сайт, для которого имеется сохранённый пароль, они поступают обратным образом: IE нормализуют URL, перекодирует строку и посмотрит в реестр, чтобы узнать, нет ли там каких-либо сохранённых для вас значений. Подробно это происходит так:

  • читается хеш регистра по каждому URL в index.dat;
  • URL конвертируется в строчный вид;
  • параметры GET сокращаются;
  • URL конвертируется в большие символы;
  • если хеш значения URL равен какому-либо значению в регистре, данные расшифровываются с помощью этого URL.

Это кажется довольно разумным, но если задуматься, то здесь имеется небольшая проблема. На самом деле здесь слишком мало энтропии, и хакер с этим легко справится. Это не намного сложней, чем шифрование паролей в IE 6.

Взломать его довольно просто. Чтобы сохранить пароль, пользователь должен посетить сайт, который затем легко можно найти в index.dat или в разделе ключей реестра “TypedURLS”. Если рассматривать только США, то всего имеется около 15000 сайтов банков и кредитных союзов, и вы можете легко их найти. Вы знаете сайты, для которых хотите найти пароли, и у каждого такого сайта есть странички входа, поэтому достаточно легко собрать целую коллекцию ключей. Как видим, защита здесь явно недостаточна.

Конечно, если вы плохой парень, вы, вероятно, знаете много сайтов, для которых нужны пароли: Facebook, Myspace или Twitter или других со страницей логина, так что вы можете просто вычислить такие сайты. Можно воспользоваться сервисом Alexa, который ведёт список наиболее популярных сайтов, собирая статистику их посещаемости. Ключи действительно легко расшифровать, вы можете сделать что-то вроде «радужной таблицы» Rainbow Table на основе этих общих источников и тогда у вас появятся все ключи для расшифровки паролей.

Для плохих парней это довольно просто, так что мораль истории с IE 7 звучит так: это не настолько хорошо, как пытаются уверить его разработчики.

Можно ли помочь в данной ситуации? Честно говоря, нет. Этим вопросом никто как следует не занимался. Мы с Майклом рассмотрели целую кучу приложений, включая Mozilla Firefox, и увидели, что практически все пытались написать для них инструмент для извлечения паролей. Действительно мало что может защитить вас, если вы храните пароли от сайтов, вы наверняка знаете такую вещь, как инструмент «Remember My password». Почти все пароли можно извлечь тем или иным способом. В сравнении с другими браузерами Firefox и IE 7 обеспечивают более сильную защиту, так как вы на самом деле сначала должны ввести пароль, но даже если вы просто ввели пароль, не сохраняя его, парень может уже сможет его украсть.

Избегайте взлома, не сохраняйте ценные пароли, если вы запускаете сайт с формой для входа, не позволяйте пользователям сохранять свои данные.

Напоследок мы рассмотрим троян под названием Laqma. Это типичный троян, похищающий конфиденциальные данные и другие части информации, которые он берёт из кукиз. Он загружает свои кукиз каким-то странным способом, благодаря чему не подвергается санации данных, пользователь заражается, троян ворует значения его кукиз и отправляет на сайт command and control.



Этот троян загружается с файлом, который может иметь любое имя. Если вы эмулируете троян с помощью собственного кода, вы можете указать любое имя, например другой PHP -файл, так что вы сможете просто загрузить свой собственный скрипт PHP на сайт плохого парня, воспользовавшись этой уязвимостью – возможностью загрузки произвольных файлов.

А сейчас я передаю слово Майклу для последнего демо.

Майкл Лай: извините, что это не смешно, но это стоит посмотреть, потому что это круто. Сейчас я попытаюсь представить это демо в удобном для презентации формате, чтобы вы всё увидели. Презентация базируется на рутките Laqma, который мы установили. Представьте себе, что вы занимаетесь разбором инцидентов или обратным инжинирингом вредоносного ПО и сталкиваетесь с компьютером, зараженным Laqma или любым руткитом, который забрасывает крючки в таблицу диспетчера системной службы. В первую очередь вы попытаетесь выяснить, какие функции попались на крючок в SSDT, а затем вы можете попытаться восстановить работающий модуль ядра в случае проверки его с помощью IDA или чего-то подобного.
Поэтому здорово, что я написал плагин для инструмента командной строки Volatility, который автоматизирует все эти задачи. У меня уже сняты дамп памяти компьютера, зараженного Laqma, поэтому я просто использую SSDT плагин, который разработал Брендон Долан Гавит, это потрясающий плагин. По умолчанию он просто распечатывает все записи из SSDT, модуль и адрес, на который указывает функция SSDT, и делает это для всех четырёх SSDT.



Все эти записи должны быть легально указаны внутри ядра TOS, для второй таблицы они должны быть указаны внутри win32k, а для третьей и четвёртой таблиц это расположение случайно, потому что не устанавливается по умолчанию. Поэтому я собираюсь использовать SSDT скрипт Брендона Долана Гавита и просто установить в командной строке фильтр, так что я буду игнорировать всё, что указано внутри ядра TOS и внутри win32k.

В итоге получается четыре функции, показанные внизу экрана, которые указывают на имя модуля, имя домена, drv, .sys, перечислены значения ключей скрытых записей реестра для скрытых процессов и информация по системным запросам. Как я сказал, это первый этап. Далее нужно выяснить, какие SSDT функции попались на крючок. Следующий этап состоит в снятии дампа модуля и поиске спрятанных там ключей реестра и файлов.



Этот процесс немного автоматизирован с помощью плагина SSDT. Вы видите, как на экране промелькнул BSOD, это сработала программа командной строки IDA. В результате автоматической обработки создаётся IDB, это ещё немного автоматизации, в результате которой помечаются функции IDB, соответствующие «пойманным на крючок» функциям SSDT.

Таким образом, с помощью одного небольшого шага мы узнали, какие функции SSDТ были связаны с дампом, владеющим созданным IDB модулем, и смогли их назвать, чтобы точно знать, где искать в IDB, когда я начну заниматься обратным инжинирингом.
Надеюсь, вам было весело!


Спасибо, что остаётесь с нами. Вам нравятся наши статьи? Хотите видеть больше интересных материалов? Поддержите нас оформив заказ или порекомендовав знакомым, 30% скидка для пользователей Хабра на уникальный аналог entry-level серверов, который был придуман нами для Вас: Вся правда о VPS (KVM) E5-2650 v4 (6 Cores) 10GB DDR4 240GB SSD 1Gbps от $20 или как правильно делить сервер? (доступны варианты с RAID1 и RAID10, до 24 ядер и до 40GB DDR4).

VPS (KVM) E5-2650 v4 (6 Cores) 10GB DDR4 240GB SSD 1Gbps до декабря бесплатно при оплате на срок от полугода, заказать можно тут.

Dell R730xd в 2 раза дешевле? Только у нас 2 х Intel Dodeca-Core Xeon E5-2650v4 128GB DDR4 6x480GB SSD 1Gbps 100 ТВ от $249 в Нидерландах и США! Читайте о том Как построить инфраструктуру корп. класса c применением серверов Dell R730xd Е5-2650 v4 стоимостью 9000 евро за копейки?

Комментарии (3)


  1. 4eyes
    06.11.2018 22:25
    +1

    и мы можем проследовать по перекрёстным ссылкам для установки указателя на нужном файле. Так мы попадаем именно в точку расположения зависимого кода шифрования.
    [CENSORED]!

    Давайте я помогу:
    … You can further verify that by just taking that and follow the cross-references to SetFilePointer in this case, and here we are exactly at that point of the location-dependent encryption code.

    … вы можете проверить его, загрузив в IDA и пробежавшись по ссылкам на SetFilePointer. И вот? мы точно в месте расположения кода, реализующего шифрование зависящее от местоположения (см. про SetFilePointer в первой части)

    Дальше читать не осилил. Извините за болезненную критику, вы наверняка устали, но перевод не закончен.


  1. mayorovp
    07.11.2018 10:35

    Здесь мы снова возвращаемся к функции rand. Важной частью этой функции является самая последняя инструкция, которую я пометил зелёной стрелкой – она выполняет любое конечное значение в EAX с величиной 7FFF

    Простите, что-что она делает?


    И да, вопрос по материалу — какого черта нужно было дизассемблировать функцию rand, когда можно было открыть документацию, и прочитать там:


    The rand function returns a pseudorandom integer in the range 0 to RAND_MAX (32767).


  1. Livid
    07.11.2018 16:17
    +1

    Видимо, авторы не осознавали, что это ограничение, которое запускает Windows, не возвращает целому числу тот размер, который они хотели.

    Ограничение запускает Windows? Возвращает целому числу размер? Что это за машинный перевод? И так весь текст. Читать невозможно, приходится в голове переводить на английский чтобы хоть что-то из этого словесного салата приобрело подобие смысла.