Анализ Guntior

в 19:08, , рубрики: Malware, Reversing, информационная безопасность, метки: ,

Добрый вечер всем! В этой заметке речь пойдет о анализе (реверсинге) малвари. Точного названия нет, но на ав порталах он именуется как Guntior. А точнее (kernelmode.info) Guntior bootkit (Chinese combine). Под катом куча картинок, осторожнее! Эта малварь представляет собой целый комплекс для развертывания плацдарма на машине жертвы. В комплект входит буткит (украденный у Stoned Bootkit), лоадер для загрузки файлов и прочее. Я буду анализировать следующий файл (отчет Virustotal'а)

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

Функции пустышки:
image

Начнем свою экскурсию с точки входа библиотеки. Загружаем файл в IDA и ждем пока переварит файл. Ниже на скрине показана точка входа, куда передастся управление после проверки типа вызова (сказано коряво, но точнее сказать не смог. проверяется fdwReason == 1)
image

Все ухищрения до процедуры ConnectToPipe () для нас не вызывает интереса. Это обычные прелюдии любого бота лоадера (проверяется версия ОС, получаются имена). Двойным кликом заходим в процедуру ConnectToPipe ()
image

С помощью именованных каналов осуществляется пересылка информации. Очень полезный трюк для межпрограммного взаимодействия. Выходим из псевдо кода нажатием Esc, и смотрим дальше. идет создание потока со стартовым адресом ConnectToPipe_2. В этом адресе осуществляется подключение и запись в пайп. Возвращаемся на шаг назад и анализируем создание следующего потока с адресом sub_100007E0. Вот тут начинается вся веселуха.
image

Рассмотрим процедуру UnpackStartDriver (). Вызовом GetRand () получается случайное символы для имени создаваемого сервиса. Внутри нее дружная пара апишек rand/srand совместно с GetSystemTimeAsFileTime

image

Функции OpenSCManager/CreateService создают сервис с случайным именем (помним как имя получилось?). Далее заходим в функцию UnpackResource ()
image

Выходим из процедуры, анализируем следующую строку. StartServiceA запускает созданный сервис. Все эти ухищрения нужны для комфортного запуска драйвера. Хотя можно было бы обойтись вызовом ZwLoadDriver&NtSetInformationProcess. Полностью выходим назад к процедуре sub_100007E0. Анализируем процедуру GetKERNEL_Adresses
image

Получаются псевдо адреса ядерных апи и отправляются драйверуDeviceIoControl. Далее создается еще один поток, с адресом Search_Kill_AV. Наверное понятно, что она делает. Весь список завершаемых процессов можете посмотреть здесь. Завершение идет весьма интересно: получаются ид процессов и отправляются на драйвер, где и завершается процесс. Выходим назад, стартуется поток, внутри которго проходит проверка параметров передаваемых драйверу. Возвращаемся назад, последний наш герой sub_10001424.

image

И так, первым делом вызывается функциия CheckInet, внутри которого мясорубка с вызовом InternetOpenA/InternetOpenUrlA/HttpQueryInfoA/InternetCloseHandle лоадер стучится на baidu.com, проверяя доступность сети.

image

Странно, то что в малвари используют открытый вызов апи. Обычно все происходит через хеши прочие фишки, призванные вызвать затруднение у реверсера. И так, возвращаемся назад. Вызывается процедура DownloadConfig ()

image

Загружается файл конфигурации, внутри которого содержатся задания (ссылки, имена). Однако этот конфиг зашифрован) Расшифровка происходит вызовом DecryptConfig (). А сейчас, мы сделаем пару фишек из серии black magic art. Скачиваем этот файл конфига, копируем процедуру расшифровки, компилируем его с помощью пакета masm32. Запускаем на выполнение. Вуаля! У нас есть чистый, расшифрованный файл конфигруации. Скрин. Конфиг выглядит так:

[info]
isdown=1
huifang=10
jiange=20
url1=_адрес-загружаемого_файла_
pid1=
biaoshi1=

Далее с помощью GetPrivateProfileIntA отбираются нужные параметры. Загруженный файл запускается на машине жертвы.
Хотя можно было поступить еще проще: в отладчике начать выполнение с этой программы или еще легче: написать функцию расшифровки xor на python'е. Выходим назад к начальной процедуре, и заходим в sub_0**CF2. В нем отсылается информация гейту в виде:
unionid=%s&mac=%s&iever=%d&alexa=%d&systemver=%d&antisoftware=%s&pluginver=%s, неся в себе идентификаторы системы. На этом анализ завершен. С следующей заметке рассмотрим анализ драйвера малвари

Автор: felize


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js