Всем привет.
На борде уже был обзор лоадера Matanbuchus, но его предыдущую версию ( TriumphLoader ) с небольшими модификациями льют до сих пор. Меня заинтересовал семпл, я решил выловить его на трекерах и отреверсить.
Первоначальный анализ файла
Исходный файл весит 368 кб, упакован, собран в VS 2008.
Поверхностный анализ файла не выявил сигнатур известных инструментов защиты, секция кода содержит шифрованные данные, на что указывает высокая энтропия. Секция импорта содержит скудный набор применяемых функций, следовательно делаем выводы, что лоадер ищет нужны для работы api динамически.
В коде выявлены признаки применения алгоритма шифрования TEA (наличие констант и сам граф управления), в том числе применение характерных констант:
Динамический анализ образца
Защищаемый модуль расшифровывается при помощи алгоритма TEA в выделенный сегмент памяти, далее ему присваиваются соответствующие права с использованием функции VirtualProtect.
Указанный код расшифровывает в новый сегмент памяти ещё часть кода и PE файл после кода.
Новая расшифрованная часть кода находит необходимые для работы функции при помощи GetProcAddress и списка захардкодженных названий, после чего копирует PE файл во вновь выделенный сегмент ( теперь начало сегмента - начало PE файла ).
Новый сегмент вновь копируется в первоначальный сегмент загрузки (ImageBase 0x400000 в данном случае), предварительно заполненный нулями.
При передаче управления на код полученного PE файла осуществляется парсинг экспорта ntdll и kernel32 с целью поиска специфических функций.
Мьютекс выставляется с названием имени пользователя. Проверяется наличие ключа реестра NetHelper. Созадется директория C:\ProgramData\NetHelper\Cache\<случайное значение>, путь вписывается в указанный ключ реестра. Расшифровывается URL, представленный на рисунке:
Функционал по загрузке модуля с указанного URL посредством WinInet API:
Проверяется раскладка клавиатуры на предмет принадлежности к РФ и ряду стран СНГ, при совпадении осуществляется завершение.
Далее происходит сбор данных о системе (переменные окружения, оборудование, состояние памяти).
Для закрепления в системе лоадер создаёт задание в планировщике посредством запуска schtasks.exe через cmd
Механизмы защиты
Для защиты лоадер использует сугубо стандартные средства - IsDebuggerPresent, OutputDebugString, GetTickCount.
В ходе анализа были выявлены дебаг строки:
Взаимодействие с CnC
После сбора информации о системе в админку осуществляется POST запрос по пути "/zalupauwuna/gate.php" с параметром request, закодированным в base64.
После декодировки получаем следующее:
Пример формирования json'a:
Перед кодированием в base64 значения полей шифруется специальным алгоритмом ( принадлежность не установлена )
Значения полей:
На рисунке представлен участок шифрования и кодирования в base64 собранных данных (видны принимаемые в качестве аргументов ключи bu и hw):
Таблица кодирования в base64 в сдампленном сэмпле:
В ответ с сервера управления поступает также закодированный в base64 json {task: <значение в base64>}, в логике лоадера подразумевается работа с командами:
P.S: Спасибо killanas за помощь в реверсе сэмпла
На борде уже был обзор лоадера Matanbuchus, но его предыдущую версию ( TriumphLoader ) с небольшими модификациями льют до сих пор. Меня заинтересовал семпл, я решил выловить его на трекерах и отреверсить.
Первоначальный анализ файла
Исходный файл весит 368 кб, упакован, собран в VS 2008.
Поверхностный анализ файла не выявил сигнатур известных инструментов защиты, секция кода содержит шифрованные данные, на что указывает высокая энтропия. Секция импорта содержит скудный набор применяемых функций, следовательно делаем выводы, что лоадер ищет нужны для работы api динамически.
В коде выявлены признаки применения алгоритма шифрования TEA (наличие констант и сам граф управления), в том числе применение характерных констант:
Динамический анализ образца
Защищаемый модуль расшифровывается при помощи алгоритма TEA в выделенный сегмент памяти, далее ему присваиваются соответствующие права с использованием функции VirtualProtect.
Указанный код расшифровывает в новый сегмент памяти ещё часть кода и PE файл после кода.
Новая расшифрованная часть кода находит необходимые для работы функции при помощи GetProcAddress и списка захардкодженных названий, после чего копирует PE файл во вновь выделенный сегмент ( теперь начало сегмента - начало PE файла ).
Новый сегмент вновь копируется в первоначальный сегмент загрузки (ImageBase 0x400000 в данном случае), предварительно заполненный нулями.
При передаче управления на код полученного PE файла осуществляется парсинг экспорта ntdll и kernel32 с целью поиска специфических функций.
Мьютекс выставляется с названием имени пользователя. Проверяется наличие ключа реестра NetHelper. Созадется директория C:\ProgramData\NetHelper\Cache\<случайное значение>, путь вписывается в указанный ключ реестра. Расшифровывается URL, представленный на рисунке:
Функционал по загрузке модуля с указанного URL посредством WinInet API:
Проверяется раскладка клавиатуры на предмет принадлежности к РФ и ряду стран СНГ, при совпадении осуществляется завершение.
Далее происходит сбор данных о системе (переменные окружения, оборудование, состояние памяти).
Для закрепления в системе лоадер создаёт задание в планировщике посредством запуска schtasks.exe через cmd
SCHTASKS /Create /SC MINUTE /MO 1 /TN "Service for windows Network Helper updates" /TR C:\ProgramData\NetHelper\Cache\<случайные значения>\<nethelper>.exe /F
Механизмы защиты
Для защиты лоадер использует сугубо стандартные средства - IsDebuggerPresent, OutputDebugString, GetTickCount.
В ходе анализа были выявлены дебаг строки:
Взаимодействие с CnC
После сбора информации о системе в админку осуществляется POST запрос по пути "/zalupauwuna/gate.php" с параметром request, закодированным в base64.
После декодировки получаем следующее:
Пример формирования json'a:
Перед кодированием в base64 значения полей шифруется специальным алгоритмом ( принадлежность не установлена )
Значения полей:
"bn":"0hex" - константа
"bt":"NewLoader" - константа
"bu":"v0.1" - константа
"hw" - MAC адрес
"un" - имя пользователя
"cn" - имя компьютера
"os" - версия ОС
"pr" - уровень привилегий
"ip" - IP адрес, маска подсети, шлюз
"cp" - модель процессора
"ca" - разрядность ОС
"cc" - количество ядер
"gp" - название контроллера домена
"ra":4095 - константа
На рисунке представлен участок шифрования и кодирования в base64 собранных данных (видны принимаемые в качестве аргументов ключи bu и hw):
Таблица кодирования в base64 в сдампленном сэмпле:
В ответ с сервера управления поступает также закодированный в base64 json {task: <значение в base64>}, в логике лоадера подразумевается работа с командами:
А также с ключами taskParm и taskId. Примеры некоторых строк, указывающих на работу с перечисленными командами:Update
Uninstall
RunPE & CMD
DLL & Execute
AutoRunExe & Execute
MEMLOAD & DLL
RunPE & PS
RunPE & WERFAULT
EXE & Execute
MEMLOAD & NET
MEMLOAD & NATIVE
P.S: Спасибо killanas за помощь в реверсе сэмпла