Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР 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, которым пользуется основная масса интернет-серферов, хотя некоторые из уязвимостей присутствуют и в других браузерах. Помимо практической пользы, из нашего опыта можно извлечь хороший урок: троянописатели придумывают все новые способы заражения компьютеров пользователей. Впрочем, противостоять им все же можно, и в этом мы сегодня убедились. Успехов в исследованиях!

Содержание
загрузка...
Журнал Хакер #151Журнал Хакер #150Журнал Хакер #149Журнал Хакер #148Журнал Хакер #147Журнал Хакер #146Журнал Хакер #145Журнал Хакер #144Журнал Хакер #143Журнал Хакер #142Журнал Хакер #141Журнал Хакер #140Журнал Хакер #139Журнал Хакер #138Журнал Хакер #137Журнал Хакер #136Журнал Хакер #135Журнал Хакер #134Журнал Хакер #133Журнал Хакер #132Журнал Хакер #131Журнал Хакер #130Журнал Хакер #129Журнал Хакер #128Журнал Хакер #127Журнал Хакер #126Журнал Хакер #125Журнал Хакер #124Журнал Хакер #123Журнал Хакер #122Журнал Хакер #121Журнал Хакер #120Журнал Хакер #119Журнал Хакер #118Журнал Хакер #117Журнал Хакер #116Журнал Хакер #115Журнал Хакер #114Журнал Хакер #113Журнал Хакер #112Журнал Хакер #111Журнал Хакер #110Журнал Хакер #109Журнал Хакер #108Журнал Хакер #107Журнал Хакер #106Журнал Хакер #105Журнал Хакер #104Журнал Хакер #103Журнал Хакер #102Журнал Хакер #101Журнал Хакер #100Журнал Хакер #099Журнал Хакер #098Журнал Хакер #097Журнал Хакер #096Журнал Хакер #095Журнал Хакер #094Журнал Хакер #093Журнал Хакер #092Журнал Хакер #091Журнал Хакер #090Журнал Хакер #089Журнал Хакер #088Журнал Хакер #087Журнал Хакер #086Журнал Хакер #085Журнал Хакер #084Журнал Хакер #083Журнал Хакер #082Журнал Хакер #081Журнал Хакер #080Журнал Хакер #079Журнал Хакер #078Журнал Хакер #077Журнал Хакер #076Журнал Хакер #075Журнал Хакер #074Журнал Хакер #073Журнал Хакер #072Журнал Хакер #071Журнал Хакер #070Журнал Хакер #069Журнал Хакер #068Журнал Хакер #067Журнал Хакер #066Журнал Хакер #065Журнал Хакер #064Журнал Хакер #063Журнал Хакер #062Журнал Хакер #061Журнал Хакер #060Журнал Хакер #059Журнал Хакер #058Журнал Хакер #057Журнал Хакер #056Журнал Хакер #055Журнал Хакер #054Журнал Хакер #053Журнал Хакер #052Журнал Хакер #051Журнал Хакер #050Журнал Хакер #049Журнал Хакер #048Журнал Хакер #047Журнал Хакер #046Журнал Хакер #045Журнал Хакер #044Журнал Хакер #043Журнал Хакер #042Журнал Хакер #041Журнал Хакер #040Журнал Хакер #039Журнал Хакер #038Журнал Хакер #037Журнал Хакер #036Журнал Хакер #035Журнал Хакер #034Журнал Хакер #033Журнал Хакер #032Журнал Хакер #031Журнал Хакер #030Журнал Хакер #029Журнал Хакер #028Журнал Хакер #027Журнал Хакер #026Журнал Хакер #025Журнал Хакер #024Журнал Хакер #023Журнал Хакер #022Журнал Хакер #021Журнал Хакер #020Журнал Хакер #019Журнал Хакер #018Журнал Хакер #017Журнал Хакер #016Журнал Хакер #015Журнал Хакер #014Журнал Хакер #013Журнал Хакер #012Журнал Хакер #011Журнал Хакер #010Журнал Хакер #009Журнал Хакер #008Журнал Хакер #007Журнал Хакер #006Журнал Хакер #005Журнал Хакер #004Журнал Хакер #003Журнал Хакер #002Журнал Хакер #001