Бесплатно Угрозы HTML: что скрывает статический сайт?

Тема в разделе "Сборник статей по безопасности и анонимности", создана пользователем Hermanicus, 17 апр 2017.

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

    предисловие: ввиду того, что пишу про веб-угрозы, приходится давать примеры, которые зоркий фильтр AV-school режет на подходе, посему исходники пришлось выложить отдельно, их можно найти тут

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

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

    Натравленный на ftp-папку сайта антивирус перманентно ругался на HTML/Infected.Gen, но лечить ситуацию предлагал тотальным удалением страниц.

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

    Первым делом, открываем подозрительный html-файл в любом текстовом редакторе и ищем фразу iframe в итоге имеем две находки:

    0 надо сказать, найдены они были не одновременно в одном документе, а в ходе проверки всех html-страниц.

    отличительная черта - в обоих случаях конструкции iframe располагались после закрывающего тега </html>, то есть были дописаны в самый конец файла, что уже является залогом их зловредности.

    второе, но не менее значимое - преднамеренная маскировка iframe'ов в браузере: в первом случае за это отвечает конструкция width="0" height="0" frameborder="0", то есть указание нулевого размера по ширине и высоти, а также отсутствие обрамляющей рамки.

    во втором случае прячет фрейм атрибут style='display:none' .
    Нажмите, чтобы раскрыть...​
    ну ладно. Фреймы почистили. с ними всё просто и наглядно, но пока я гонялся за фреймами, моё внимание привлек странный скрипт, вставленный во все страницы по принципу

    1 надо сказать, антивирус по поводу его наличия молчит, что не удивительно - ведь скрипт активно использует обфускацию (запутывание кода, частичное самошифрование)

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

    для начала, приведем его к читаемому виду, расставив инструкции друг за другом в столбик, пропуская строку после вхождения символа точки с запятой

    3 перво-наперво видим конструкции вида


    Описание var RedCepo=-31;

    RedCepo+=31; var QecePaxao=17;

    QecePaxao+=-15 var MatJeme=31;

    MatJeme+=-30; var XaceQen=-24;

    XaceQen+=40;
    Нажмите, чтобы раскрыть...​
    это самый банальный метод запутывания кода - добавление лишних инструкций, формирующих значение переменных. (банальнее только совершенно бесполезный код и переменные) переписываем их по-человечески, выполняя нехитрое арифметическое сложение

    Описание var RedCepo=0; var QecePaxao=2; var MatJeme=1; var XaceQen=16;
    Нажмите, чтобы раскрыть...​
    теперь ситуация уже интереснее

    Описание

    XalSee='eIvz1azx2l5Ru'.replace(/[Iz1zx25Ru]/g, '' var YerNadc='fIwrNJ8oAmLDIC87EhVWQ0au2rsLNiCBoU0dlSe0NO'.replace(/[IwNJ8ALDI87EVWQ0u2sLNiBU0lS0NO]/g, '' конструкция 'blablabla'.replace(/tratata/g, '') удаляет из строки blablabla символы tratata поочередно.
    Нажмите, чтобы раскрыть...​
    то бишь, если удалить из строки eIvz1azx2l5Ru символы Iz1zx25Ru получится строка eval - любимая функция зловредных сриптов, выполняющая команды, переданные ей в виде текстовой строки.

    удаляя же из fIwrNJ8oAmLDIC87EhVWQ0au2rsLNiCBoU0dlSe0NO символы из набора IwNJ8ALDI87EVWQ0u2sLNiBU0lS0NO, мы получим строку fromCharCode - название функции, преобразующей цифры в соответсвующие им символы.

    итак, теперь мы имеем

    4 отлично. очевидно все переменные кроме var DaTazn=''; нужны исключительно для шифрования куска кода

    Листинг : Описание

    XalSee=DekeyQekaw[XalSee];YerNadc=BaTes[YerNadc]; for (DecPeyi=RedCepo;DecPeyi<ZeKat.length-1;

    DecPeyi+=QecePaxao) DaTazn += YerNadc(GeWewai((ZeKat[DecPeyi+RedCepo].length-1).toString(XaceQen)+(ZeKat[DecPeyi+MatJeme].length-1).toString(XaceQen), XaceQen));
    Нажмите, чтобы раскрыть...​
    XalSee(DaTazn); посему расшифровываем код простой поочередной автозаменой текстового редактора также даем осмысленные названия переменным, чтобы было легче втыкать

    ZeKat меняем на array (массив)

    DecPeyi на i (индекс, порядковый номер) получаем

    5 что же делает этот код?

    для начала у нас заводится массив из слов той самой огромной строки несуразицы при помощи функции *.split(' '); данная функция разрезает строку на слова, разделенные тем, что указано в параметре (в нашем случае - пробел) и пихает в массив.

    далее готовятся к бою функции eval и fromCharCode, после чего цикл берет каждую новую пару соседних слов

    (сначала zefakev mayel, потом qeqenal kegexedezagejaxe итд ), вычисляет их длину, отнимает от длины каждого слова единицу, преобразует эту цифру (длину слова) в текстовый формат, потом из этмх двух цифр составляет число (из цифр 6 и 4 делается число 64), и, наконец, в строку tmp_str дописывается символ, кодом которого является полученное число.

    в процессе полного прохода цикла по массиву array в строке tmp_str посимвольно формируется зловредный код, который впоследствии выполняет функция eval что же за код?

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

    Именно это я вам и предлагаю сделать в качестве разминки.
     

Поделиться этой страницей