Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР 130, ОКТЯБРЬ 2009 г.

Троянская битва. Объявляем войну обфусцированным лоадерам

Леонид «Cr@wler» Исупов (crawler@xakep.ru)

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

Трудности перевода

Рассмотрим обфусцированный троян-лоадер, который распознается антивирусом ESET NOD32 как «trojandownloader.iframe.ey.gen». Зашифрованный архив с текстом вредоносного скрипта ты сможешь найти на нашем DVD, но помни, что он предназначен только для ознакомления с принципами работы вредоносных программ. За распространение троян-лоадера несешь ответственность только ты. То же относится и к твоей личной безопасности - ни автор, ни редакция не отвечают за последствия действий, которые могут быть выполнены с использованием данного ознакомительного материала и текста вредоносного скрипта.

Если открыть html-страницу, которая содержит потенциально опасные инструкции, при помощи любого текстового редактора, – можно обнаружить, что между тегами <script language="javascript"> и </script> находится обфусцированный javascript-код. Его основные части: функция, которая, скорее всего, предназначена для расшифровки троян-лоадера, и инструкция вызова данной функции, которая передает в качестве аргумента зашифрованный код. Скрипт обфусцирован, поэтому его функциональность определить чрезвычайно трудно. Он практически нечитабелен - имена переменных и функций выглядят как бессмысленные наборы символов. Чтобы понять назначение тех или иных частей кода, необходимо скрипт деобфусцировать. Можно воспользоваться специальными онлайн-«бьютиферами» кода, то есть сервисами, которые превращают обфусцированный код в нечто более привлекательное.

Пример такого сервиса - javascript-beautifier, располагающийся по адресу http://jsbeautifier.org (о процессе деобфускации рассматриваемого троян-лоадера можно прочесть, опять же, на нашем DVD: я очень подробно описал особенности восстановления обфусцированного кода). После того, как я воспользовался деобфускатором и приложил очень много усилий к определению предназначения той или иной переменной, я получил достаточно удобочитаемый код («говорящие» названия даны некоторым переменным и функциям мной):

function Strange_Function(string_parameter)

{

var String_withoutUpcase = arguments.callee.toString().replace(/W/g, '').toUpperCase();// любопытная инструкция

//далее располагается объявление многочисленных переменных
//и инструкции получения переменной "M6Nnm6jY0", которая передается функции eval () ниже

eval(M6Nnm6jY0); //выполнение полученной последовательности

}

Strange_Function('...Очень большой аргумент-строка...'); //передача зашифрованного кода лоадера функции

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

Обфускация Javascript? Не проблема!

Перед тем, как говорить об исследовании кода, нужно уделить внимание инструментам, которые будут использоваться в работе. Каждый слышал как о браузере Mozilla Firefox, так и о плагинах, которые для него создаются в большом количестве. Нас интересуют плагины, позволяющие отлаживать код java. Ничего лучше, чем Firebug, я не встречал. Он способен выполнять отладку сценариев - пошагово, с точками останова, позволяет устанавливать наблюдения за переменными и исследовать HTML-код. Будем считать, что выбор сделан. Необходимо также позаботиться и о безопасности собственного компьютера, ведь исследование троян-лоадера в ничем не защищенной среде операционной системы, при использовании браузера, работающего в «хостовой» ОС без посредничества, может привести к заражению компьютера.

Один достаточно очевидный выход, о котором, вероятно, ты сразу же подумал, - использование виртуальной машины. Не думаю, что это решение можно назвать подходящим: операционная система, работающая под ее управлением, может быть заражена точно так же, как и ОС, управляемая машиной «железной». Для исследования троян-лоадера часто требуется доступ к сети, а это значит, зараженная виртуальная машина станет источником потенциальной опасности, что неприемлемо. Альтернативное решение - использование так называемых «песочниц» - утилит, способных выполнять программы в искусственно созданной среде. При запуске браузера в «песочнице» все изменения, которые инициирует выполняемый java-код, никак не влияют ни на операционную систему, ни на систему файловую. Я рекомендую использовать Sandboxie - эта замечательная «песочница» обеспечит полную безопасность при работе с потенциально вредоносным java-кодом. И последнее: антивирусные средства могут воспрепятствовать исследованию, поэтому во время «испытаний» их лучше отключить.

Существует необычный метод, позволяющий получить текст «исходного», незащищенного троян-лоадера, который генерирует javascript-сценарий. Он невероятно прост, и мы рассмотрим его, однако нужно помнить, что использование метода не дает полного понимания принципов защиты javascript-кода (и способов, позволяющих этот код восстановить). Поэтому после этого мы уделим немного времени разбору защитных методов, которые дополняют обфускацию. Итак, перейдем к практике.

Запускай браузер в Sandboxie, перетащив его ярлык прямо на окно программы (думаю, что с настройками Sandboxie ты разберешься самостоятельно, они несложны – в конце концов, можешь продолжить работу в режиме «по умолчанию»). Когда браузер будет запущен, открой файл, в котором содержится вредоносный код, предварительно активировав окно Firebug нажатием на изображение симпатичного жучка в правом нижнем углу браузера. Скрипт выполнится, а нас автоматически перебросит на сайт поисковой системы Google. Что ж, для начала неплохо. Firebug уже отследил функциональность скрипта, и можно приступать к его повторному выполнению с целью детального исследования. В окне Firebug перейдем на вкладку «Сценарий» («Script» в английской версии плагина; будем считать, что ты установил русифицированную версию Firebug). Если она отключена, необходимо ее активировать. Сейчас нужно включить опцию «Останавливаться на всех ошибках». Это поможет не проскочить через целевой скрипт и остановиться на одной из ошибок, которые он инициирует. После того, как это сделано, нажмем на кнопку браузера «Назад» и обновим страницу. Выполнение java-кода моментально приостановится, а в окне «Сценарий» отобразится следующее сообщение:

r = CLSID.CreateObject(name); CLSID.CreateObject is not a function.

Ошибка позволила остановиться прямо в дебрях распакованного троян-лоадером вредоносного кода. Чтобы получить доступ к тексту этого java-скрипта, необходимо нажать на кнопку вкладки «Сценарий», открывающую список всех выполняющихся скриптов и фрагментов кода, которые передаются функции eval (), и выбрать из списка самый последний вариант. В основном окне вкладки «Сценарий» возникнет код расшифрованного java-скрипта.

Текст лоадера отображается, но скопировать из окна Firebug, как ни странно, его невозможно. Это недостаток плагина - текст не может быть скопирован из него корректно, если имеет слишком большой размер (функция «Копировать исходный код» не функционирует; возможно, в новой, более стабильной версии Firebug недостаток будет устранен). Решение все-таки существует. Открой вкладку «Стек вызовов», которая располагается справа от окна «Сценарий», и выбери из списка вызовов функцию «oD2vKFj61». Автоматически отобразится необходимый нам код. Найди в окне кода переменную «ud7a00v7W». Как видишь, скрипт выполняет определенный набор инструкций, полученный в результате неких манипуляций с зашифрованной строкой, путем выполнения команды «eval (ud7a00v7W)». Открой вкладку «Наблюдение», расположенную справа от окна сценария. Нажми на поле «Новое наблюдение...» и введи в него имя переменной (ud7a00v7W). После этого она отобразится в списке «Наблюдение». Нажми на нее правой кнопкой мыши и выбери «Копировать значение». Теперь расшифрованный код троян-лоадера находится в буфере обмена.
Первые трудности остались позади. Поговорим о том, какими путями троянописатель пытался «отбить нюх» у реверсера и заставить его отказаться от исследования. Возможно, ты удивишься, но обфускация и шифрование кода - не единственное, что было припасено в арсенале автора лоадера (об этом я упоминал чуть выше, когда речь шла о невозможности запуска деобфусцированного кода). Если внимательно посмотреть на код обфусцированного скрипта, можно заметить довольно странную конструкцию, расположенную внутри функции, запускающей процесс декодирования:

var t1jXcSnPQ=arguments.callee.toString().replace(/W/g,'').toUpperCase();

Далее, по ходу выполнения функции, значение переменной t1jXcSnPQ используется несколько раз. Вызов функции callee массива arguments наряду с преобразованием значения в строку ("toString()") указывает на то, что функция использует собственный текст для выполнения дешифрования. Это препятствует какому-либо вмешательству в код функции, и ее изменение становится невозможным. Попытка получения кода расшифрованного скрипта путем внедрения в javascript-код конструкций, присваивающих его значение атрибутам текстовых полей html-документа, заканчивается неудачей. Например, выполнение присвоения значения атрибуту «VALUE» специально созданного тега «TEXT» лишено тут какого-либо смысла, ведь результат расшифровки при изменении тела функции будет принципиально иным, нежели в случае с вызовом оригинальной дешифрующей функции. По этой причине использование отладчика javascript-сценариев - один из самых простых способов, позволяющих эффективно и быстро обходить достаточно сложную защиту.

Латаем дыры

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

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

if (n0lterOf() || DnCWiFOj() || SOhxTHtY() || u5r_Qafm() || Fv2QJVho() || uzbeukYW() || bF4sn2HS()) { }
setTimeout("window.location = 'http://www.google.com'", 5000);

Мы уже убедились, что скрипт перебрасывает браузер на сайт поисковой системы Google; теперь - выяснили, что происходит чуть раньше этого события. Займемся анализом каждой из функций. Поисковики, бюллетени безопасности и баг-трекеры помогут нам в получении подробностей, касающихся каждой из используемых вредоносным кодом дыр. Полный текст каждой из функций ты можешь найти на диске, так как ограниченный размер журнальной статьи не позволяет привести их целиком. Мы ограничимся лишь списком дыр.

1) Функция «n0lterOf()»:
Используется уязвимый ActiveX-компонент (более подробное описание приводится здесь: http://www.kb.cert.org/vuls/id/234812). При помощи функции «yXjO37yr()» способна создавать и загружать файл «C:win....exe» (с произвольным набором символов в имени). Происходит попытка загрузки с адреса http://guuatwe.com/in.cgi?02010258020000000019f696fa242c146581fe980f.

2) Функция «DnCWiFOj()»:
Функция пытается выполнить код, записанный в unescape-последовательности, видимо, провоцируя переполнение буфера.

3) Функция «SOhxTHtY()»:
Используется попытка создания уязвимого ActiveXObject-а и переполнения буфера (подобный механизм используется в Trojan-Downloader.Win32.Tiny).

4) Функция «u5r_Qafm()»:
Повреждение памяти через ActiveX в America Online SuperBuddy (memory corruption). Метод позволяет выполнять действия над контролируемым диапазоном памяти.

5) Функция «Fv2QJVho ()»:
Попытка использования переполнения кучи, уязвимая библиотека - NCTAudioFile2.dll из NCTSoft NCTVideoStudio. Идентификатор класса (CLSID) - 77829F14-D911-40FF-A2F0-D11DB8D6D0BC.

6) Функция «uzbeukYW()»:
Уязвимость, содержащаяся в программе GOM Player 2.1.6.3499 и более ранних ее версиях, позволяет выполнять произвольный код на удаленной машине. Она заключается в ошибке проверки границ данных в ActiveX-компоненте GomWebCtrl.GomManager.1 (GomWeb3.dll) при обработке метода «OpenURL()». Для выполнения произвольного кода используется передача при помощи сформированной ссылки длинного аргумента (более 500 байт), что вызывает переполнение стека.

7) Функция «bF4sn2HS()»:
Ошибка, которая используется функцией, содержится в ActiveX-компоненте Microsoft Access Snapshot Viewer-а. Уязвимость позволяет инициировать переполнение буфера и выполнять произвольный код на удаленной машине с правами пользователя, запустившего Internet Explorer.

Заключение

Как ты, возможно, заметил, троянописатели ориентировались на Internet Explorer, которым пользуется основная масса интернет-серферов, хотя некоторые из уязвимостей присутствуют и в других браузерах. Помимо практической пользы, из нашего опыта можно извлечь хороший урок: троянописатели придумывают все новые способы заражения компьютеров пользователей. Впрочем, противостоять им все же можно, и в этом мы сегодня убедились. Успехов в исследованиях!

Содержание
ttfb: 6.7079067230225 ms