Интересная техника сокрытия кодов 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, который позволяет видеть весь определенный и выполненный на странице код
    Метки:
    Поделиться публикацией
    Похожие публикации
    Реклама помогает поддерживать и развивать наши сервисы

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

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

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

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

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

                                    А еще можно, например, для расшифровки использовать куски ДОМа, который исседователь при расшифровке не скопирует :) А еще выкачивать вирус по кускам АЯКС-запросами :)
                            • +3
                              создать ифрейм и взять эвал из него
                              • 0
                                Да вы тут все вирусописатели я смотрю!
                          • 0
                            на подопечном сайте был встроен троян который был обфускейчен не меньше десяти раз, через алерты прогнал — оказался банальный iframe
                            • 0
                              Вы на это извращение гляньте:
                              pastebin.com/f3cc7e96d
                              • 0
                                Да… мне достался совсем даже не закодированный экземпляр =)
                                • 0
                                  Жесть, рульный «Hello World!»
                                • –2
                                  > определял браузер, установленные плагины и прочую интересную для дальнейших
                                  > действий информацию (включена ли 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
                                    Нет, не так, а вот так: «navigator.plugins», так «window.navigator.javaEnabled», так «navigator.mimeTypes[»video/x-ms-wmv"].enabledPlugin" и вот так «opera.buildNumber()»
                                    • 0
                                      чего-чего?!
                                      • +4
                                        В общем, юзерагент ему для определения не нужен.
                                        • 0
                                          ок. а куда и как эти «navigator.plugins», так «window.navigator.javaEnabled» писать?
                                          • 0
                                            Их заполняет сам user-agent (и сами плагины). И никто со стороны им этим заниматься не запретит.
                                        • 0
                                          Это куски кода, которые занимались определением того, какой эксплоит подсунуть данному пользователю.

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

                                          А еще хотелось под IE, т.к. изначально коллега словил вирус под ним.
                                        • –2
                                          Ребят, ну сколько можно?! Писать СЛОВИТЬ и ВПОЙМАТЬ безграмотно!
                                          Извините, если задел чьи-то чувства, просто глаз режет…
                                          • +1
                                            base64_deOcde >> base64_deCode
                                            опечатка
                                            • 0
                                              Альтернативный сервис по проверке сайта на вирусы http://www.secbot.org/

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