Вирусы (и антивирусы)

индекс
185,66

Интересная техника сокрытия кодов JS «вируса»

Сегодня скинули код, дропающий на машину штатный вирус «отправьте SMS для разблокировки». Предысторию и методику чистки изложил force

Попробовал расковырять. Взял код, отформатировал, стал дебагать… Хм, интересно… В коде идет вызов (после приведения к читабельному виду)

window['eval'](var2);

А вот в var2 — бинарные данные. Ух ты… Но ведь eval не может выполнять бинарные данные!!!


Поглядел код… а он оказывается для дешифровки использует свое тело и, соответственно, после форматирования кода тело изменилось и результат дешифровки тоже.

Значит надо как-то запустить неформатированный код и при этом ничего вредного не словить. Как? Вызов debugger; не вставить, брейкпоинт не сделать — все в одну строку…

Зная что скрипт делает eval можно применить вот такую конструкцию:

window.eval = function(arg) {
 debugger;
}


После чего успешно словить вызов eval и получить весь код, который вирус пытался выполнить…

UPD1: Собственно, к чему я это все? Раньше мне не встречались такие изощренные конструкции. В основном применялся простой eval(base64_decode('...')); Ну и ИМХО интересный метод отладки через переопределение eval…

UPD2: Попытка деобфускейта и расковырки первичного «вируса» — тыц. Исходный код (до операции) видно на 22 строке. То, что было там ранее — на следующей в комментарии. Запускать не пробовал =). Файл детектируется эвристическими анализаторами антивирусов.

UPD3: Уже сейчас, разобрав код, понятно, что декодировщик не использует весь свой код для работы. Ему нужны только числа и не важно их положение, важен порядок. Изначальный «глюк» с бинарными данными получился потому, что я поменял название функции на более человечное. А как видно там были числа. Именно по этому все и сломалось. Добавление новых не-чисел не влияет на работу скрипта.

UPD4: Что в итоге делал полученный код? Он определял браузер, установленные плагины и прочую интересную для дальнейших действий информацию (включена ли Java, язык системы (?)). Далее, в соответствии с полученными данными, формировался URL для получения дальнейшего скрипта, который, в свою очередь, рендерил на страницу наиболее подходящий для данной конфигурации эксплойт. В моем окружении это был Java-апплет. Как сообщили коллеги — загружаемый по ссылке апплет использует вот эту уязвимость. Коды «вторичного» вируса и сам апплет-эксполит имеются.

UPD5: В каментах сообщают об экстеншене для FF, который позволяет видеть весь определенный и выполненный на странице код
+81
11 февраля 2010, 16:25
53

комментарии (43)

+3
hannimed #
Интересно. А почему они делают window['eval'], а не просто eval(var2) — какая-то особенность?
И да, прикрепите код, интересно всё-таки.
+5
Olegas #
Думаю что-бы дополнительно скрыться от антивирусов и их эвристических анализаторов. Изначально не видно что будет eval, он получается в процессе работы.

Код прикрепил в UPD2
+5
garex #
Интересное кино.

А с этим window.eval = function(arg) — это грамотно получилось.
+4
Daedmen #
Для фф есть аддон Javascript Deobfuscator https://addons.mozilla.org/en-US/firefox/addon/10345 который умеет показывать какой сейчас js компилится и какой выполняется. Скорее всего им тоже можно было расшифровать.
0
Olegas #
Да, это расширение могло бы решить проблему. Но скрипт бы все же выполнился, что нежелательно (т.к. он сконструирован на лету ему пришлось бы пройти через eval чтобы быть «скомпилированным»).
0
vilgeforce #
Есть Malzilla, но не всегда хорошо работает. Если Javascript Deobfuscator сможет нормально вскрывать сложные скрипты, тогда отключение от сети или работа в виртуалке спасет :-)
0
Olegas #
Ну он поможет только получить код. Т.е. сделать то, для чего (в данном конкретном случае) я использовал отладчик и замену window.eval = function()
0
vilgeforce #
Надо будет поиграться на досуге…
+3
Approved_by_Biolante #
Можно отключиться от интернета — тогда ничего угрожать при деобфускации и выполнении скрипта не будет.
0
dima117 #
вроде firebug показывает весь выполненный js код тоже
0
vilgeforce #
window['eval'] вроде не видел.
+4
force #
Добавлю ещё, может кому интересно будет, что сервер с вирусами находится на этом IP: 91.213.174.12, можете посмотреть, там много доменов непонятного назначения, видимо чтобы дольше не банили? А автор походе Bondarenko Dmitriy Vladimirovich, если данные не левые.

ЗЫ: Если желания хватит, то расскажу, как мы этот троян быстренько грохнули, чтобы потом выяснять, откуда он вообще взялся.
+2
force #
Написал пост, иначе история была бы не полной © :)
0
yevgeny #
Такое в jQuery 1.3 использовалось для обработки нестандартного джейсона (JSON по спецификации должен везде иметь двойные кавычки):
if ( type == "json" ) data = window["eval"]("(" + data + ")");
0
egorinsk #
Ха. теперь вирусописатели будут проверять typeof(window.eval), или как там.
+1
Olegas #
Безтолку. В обоих случаях он function. Да и зачем? Ну узнал вирус что eval заменен, оригинальный та негде получить уже.
0
myiworm #
узнать что заменён и не выполнить — с целью запутать.
+2
Olegas #
А как еще он сможет свои деструктивные функции выполнить кроме как через eval? Эффект достигнут (с)
0
myiworm #
почему деструктивные? зачастую там простой ифрейм, который прячут. определили что подменён евал — дали другой урл, реверсер ушел по неверному пути.
0
Olegas #
Тогда код должен быть в чистом виде, не закодированный.
0
egorinsk #
Определить подмену можно, так как одно ждело функция а другое — native code-функция.
0
Olegas #
А расскажите пожалуйста как, интересно.
typeof() в обоих случаях честно говорит 'function'
+2
egorinsk #
1) window.eval.toString()
2) Посмотреть window.eval.prototype и .constructor
+1
razetdinov #
fakeEval = function () { debugger; };
fakeEval.prototype = eval.prototype;
fakeEval.toString = function () { return 'function eval() { [native code] }' };
eval = fakeEval;
0
egorinsk #
Function.toSource() забыли :)

А если так сделать: var decodeKey = eval('… '); и этим decodeKey расшифровывать тело вируса? Если вы подмените eval, он например, неправильно расшифруется и ничего не произойдет.

А еще можно, например, для расшифровки использовать куски ДОМа, который исседователь при расшифровке не скопирует :) А еще выкачивать вирус по кускам АЯКС-запросами :)
+3
tenshi #
создать ифрейм и взять эвал из него
0
egorinsk #
Да вы тут все вирусописатели я смотрю!
0
aspect #
на подопечном сайте был встроен троян который был обфускейчен не меньше десяти раз, через алерты прогнал — оказался банальный iframe
0
myiworm #
Вы на это извращение гляньте:
pastebin.com/f3cc7e96d
0
Olegas #
Да… мне достался совсем даже не закодированный экземпляр =)
0
esenin #
Жесть, рульный «Hello World!»
–2
ColorFlow #
> определял браузер, установленные плагины и прочую интересную для дальнейших
> действий информацию (включена ли Java, язык системы (?)).
> Далее, в соответствии с полученными данными, формировался URL
> для получения дальнейшего скрипта, который, в свою очередь, рендерил
> на страницу наиболее подходящий для данной конфигурации эксплойт

user_pref(«Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_1; en-us) AppleWebKit/531.9 (KHTML, like Gecko) Version/4.0.3 Safari/531.9»);
спасёт отца русской демократии от злодейского «определителя»
+1
Olegas #
Нет, не так, а вот так: «navigator.plugins», так «window.navigator.javaEnabled», так «navigator.mimeTypes[»video/x-ms-wmv"].enabledPlugin" и вот так «opera.buildNumber()»
0
ColorFlow #
чего-чего?!
+4
smmurf #
В общем, юзерагент ему для определения не нужен.
0
ColorFlow #
ок. а куда и как эти «navigator.plugins», так «window.navigator.javaEnabled» писать?
0
Olegas #
Их заполняет сам user-agent (и сами плагины). И никто со стороны им этим заниматься не запретит.
0
Olegas #
Это куски кода, которые занимались определением того, какой эксплоит подсунуть данному пользователю.

Или имелось ввиду, что надо работать на Mac под Safari и тогда никакие вирусы не страшны =)?
0
tipok #
Блин, даже дырку WindowsMediaPlayer под Firefox используют.
НЛО прилетело и опубликовало эту надпись здесь
0
Olegas #
Да, можно. Но хотелось прямо здесь и сейчас =)
Можно просто отключить сеть на самом деле.

А еще хотелось под IE, т.к. изначально коллега словил вирус под ним.
–2
Marshalkin #
Ребят, ну сколько можно?! Писать СЛОВИТЬ и ВПОЙМАТЬ безграмотно!
Извините, если задел чьи-то чувства, просто глаз режет…
+1
mitrichlab #
base64_deOcde >> base64_deCode
опечатка

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.