mlw #41: новый сложный загрузчик apt-группировки ta505 … ·...
TRANSCRIPT
ptsecurity.com
Mlw #41: новый сложный загрузчик APT-группировки TA505
Алексей ВишняковЭксперт PT ESC
Старший специалист экспертного центра безопасности (PT ESC)
• Киберразведка
• Анализ APT
• Поддержка реагирования на инциденты
Докладчик на ИБ-конференциях(PHDays, AVAR, Nullcon)
Twitter: @Vishnyak0v
PT ExpertSecurity Center
Threat
Intelligence
50+отслеживаемых групп
Incident
Response
50+расследований в год
Network
Security
5000+сетевых сигнатур
Экспертиза в продукты
Содержание
• Введение
• PE упаковщик
• Стадии:
• подготовки
• закрепления
• полезной нагрузки
• C&C плагина
• Заключение
Введение
Киберпреступная группа TA505
• Активна с 2014 года
• Атаковали более чем полмира
• Огромный арсенал: Dridex, Locky, ServHelper и дюжины других семейств
• Связи с другими группировками: Buhtrap, Silence
ServHelper and FlawedGrace - New malware introduced by TA505: proofpoint.com/us/threat-insight/post/servhelper-and-
flawedgrace-new-malware-introduced-ta505
Операция TA505: как мы анализировали новые инструменты создателей трояна Dridex,
шифровальщика Locky и ботнета Neutrino: ptsecurity.com/ru-ru/research/pt-esc-threat-intelligence/operation-ta505-part1/
TA505 is Expanding its Operations: yoroi.company/research/ta505-is-expanding-its-operations/
Введение
• File size: 287440 bytes
• PE32 executable for MS Windows (console) Intel 80386 32-bit
• Microsoft Visual C++
• MD5: 58a875aeaa00ddb684349446ec9d36af
• SHA1: f6d3545a962e88e31365d9218460381d5265025d
• SHA256: d19a8ebbcd0dd9f1f438ac04d510270a135ba4c0c59f3f5eb92ae7e4ea5d8f71
• Imphash: e58e198778a2bd20fd323a8924987ccf
• SSDEEP: 6144:7xohcLcBrQsCSQ+Rd1f4kdn6PAScLl14aG3wUhJzM6rG8mb7+:7s5+sCcLdKM/6r3mbq
Введение
PE упаковщик
Часть 1: упаковщик группы TA505
PE упаковщик
Бесполезные инструкции,
предшествующие основной
логике
PE упаковщик
Процедура декодирования
“SUB-XOR-ROL7-XOR”
PE упаковщик
Запуск шеллкода
struct ShellcodeArgs {
HMODULE hkernel32;
void *aEncodedBlob;
unsigned int nEncodedBlobSize;
unsigned int nBlobMagic;
unsigned int nBlobSize;
};
PE упаковщик
Начало шеллкода второй стадии
PE упаковщик
Усечение полезной
нагрузки “от 5 к 3
байт”
Снова декодирование
“SUB-XOR-ROL7-XOR”
PE упаковщик
Декомпрессия aPLib
(см. упаковщик FSG)
PE упаковщик
Замена собственной
точки входа в PEB
PE упаковщик
Часть 2: кастомный упаковщик
PE упаковщик
C:\_SHARED\mlw41_DNSG\c_drop\Release\c_drop.pdb
PE упаковщик
Кодирующий алгоритм на базе XOR
PE упаковщик
Декомпрессия LZNT1
Сжатый PE
Стадия подготовки
Рекогносцировка, импорты DLL,
конфигурация
Стадия подготовки
Имя: pld32.dll
Одна экспортированная
функция в целях
выполнения релокаций
Стадия подготовки
Определение версии ОС с
помощью структуры
KUSER_SHARED_DATA
Стадия подготовки
geoffchappell.com/studies/windows/km/ntoskrnl/structs/kuser_shared_data/index.htm
Стадия подготовки
Массив байт: смещения функций
в SDT
Стадия подготовки
eax ==
KeServiceDescriptorTable
index
Стадия подготовки
# 2-bytes value API
0 15 00 NtAllocateVirtualMemory
1 1B 00 NtFreeVirtualMemory
2 52 00 NtCreateFile
3 0C 00 NtClose
4 03 00 NtReadFile
5 0E 00 NtQueryInformationFile
6 4F 00 NtResumeThread
7 50 01 NtSetContextThread
Как это выглядит для нашей ВМ
# 2-bytes value API
8 25 00 NtMapViewOfSection
9 47 00 NtCreateSection
10 34 00 NtOpenSection
11 30 00 NtOpenFile
12 4D 00 NtProtectVirtualMemory
13 33 00 NtQuerySystemInformation
14 3A 00 NtQueryAttributesFile
15 27 00 NtUnmapViewOfSection
Стадия подготовки
FastSysCall в Wow64
Это x86?
Прямой вызов функции
через syscall
Стадия подготовки
ИМХО: качество в деталях
Стадия подготовки
Загрузка
вспомогательных
библиотек с помощью
fast syscalls
Стадия подготовки
Парсинг таблицы
экспорта DLL
Стадия подготовки
Алгоритм вычисления хэша функций
Стадия подготовки
Определение адресов
функций для
предзаданных
библиотек по хэшам
Стадия подготовки
Хэши функций
Стадия подготовки
Скрипт на IDA Python для
определения функций,
часть 1
[Число хэшей, массив
хэшей, массив адресов]
Стадия подготовки
Скрипт на IDA Python для
определения функций,
часть 2
Стадия подготовки
Бинго!
href
Стадия подготовки
Поиск хэша своего
имени в блэклисте
Стадия подготовки
Получение
информации
о жестком диске
Стадия подготовки
Проверка имен
антивирусных
продуктов и ВМ
Стадия подготовки
Самоупаковка и шифрование
Стадия подготовки
Структура конфигурации
в результате разведки
Стадия закрепления
Шеллкод, инжекты, скрипты, задачи,
анти-DFIR
Стадия закрепления
Генерация промежуточного шеллкода
420 байтов• Вшитый код
532 байта• Путь реестра• Размер полезной нагрузки• Относительные адреса основных API-функций из ntdll
Стадия закрепления
Шеллкод
Конфигурация
Стадия закрепления
Стадия закрепления
Стадия закрепления
Стадия закрепления
ZwOpenProcess ->
InitializeProcThreadAttributeList ->
UpdateProcThreadAttribute ->
CreateProcessW
Стадия закрепления
Правка контекста
потока ROP
гаджетом в ntdll
Стадия закрепления
Инжект через NtSetContextThread с ROP
Стадия закрепления
Запись скрипта в систему
Стадия закрепления
Генерация ps1 стартера
Стадия закрепления
Запуск скрипта
Стадия закрепления
Формирование пути JScript
Стадия закрепления
Формирование пути JScript
Стадия закрепления
Создание JScript
MAC времена?
Стадия закрепления
Извлечение и использование MAC отметок из ntdll
(Timestomping)
Стадия закрепления
AddressBook.js
Стадия закрепления
Планирование задач с помощью COM интерфейсов
Стадия закрепления
Очистка логов событий
Стадия полезной нагрузки
Генерация GUID,
открытие маппинга
файла
Стадия полезной нагрузки
Сохранение полезной нагрузки на диск и запуск, или …
Стадия полезной нагрузки
… инжект в msiexec через NtSetContextThread
Стадия полезной нагрузки
… инжект через LoadLibraryW, wups.dll и сплайсинг
Стадия полезной нагрузки
… инжект через LoadLibraryW, wups.dll и сплайсинг
Стадия полезной нагрузки
Перехваченные функции
Стадия полезной нагрузки
Шифрование и сохранение полезной
нагрузки в реестре
Стадия C&C плагина
Взаимодействие с C2, X25 запросы,
туннелирование
Стадия C&C плагина
Расшифровка и запуск плагина
Стадия C&C плагина
Похоже, что это правильный временной штамп?
Стадия C&C плагина
Структура зашифрованного конфига
Проверочные
байты
Стадия C&C плагина
Структура зашифрованного конфига
Проверочные
байты
Ключ RC4
Стадия C&C плагина
Структура зашифрованного конфига
Проверочные
байты
Ключ RC4
Размер
конфига
Стадия C&C плагина
Структура зашифрованного конфига
Проверочные
байты
Ключ RC4
Размер
конфига
Зашифрованный
конфиг
C&C plugin stage
Расшифрованный конфиг
<a>37.59.52.229</a><b>a12</b><c>zjs4zmhmr2ws</c><d>1</d>
C&C Новый ключ RC4
Стадия C&C плагина
Base64 декодирование
Стадия C&C плагина
Замена символов в запросе
‘+’ -> -11P || -22L
‘/’ -> -33S || -44L
‘=‘ -> -55E || -66Q || -77A || -88L ||
-99S
Стадия C&C плагина
Разделение данных на
порции
Соединение
через точки
Стадия C&C плагина
Вычисление MD5 и кастомное Base64 кодирование
Стадия C&C плагина
Генерация доменного
имени:
/[a-z]{2}[0-9]{2}.com/
Стадия C&C плагина
Структура заголовка пакета, 0x18 байт
struct PacketHeader {
DWORD rand; // rand(0xAAAABBBB) + 0x11111111
BYTE num; // номер последовательности
BYTE zero; // неизвестно, обычно 0
DWORD xored_volume_info; // volume_info ^ rand
DWORD xored_chunks; // chunks ^ rand
DWORD rand; // обычно то же, что и rand
};
Стадия C&C плагина
Вшитая структура UDP запроса
Стадия C&C плагина
X25 DNS тип запроса
Стадия C&C плагина
70FLQwcAqHfxh-11PlBS0PvQUtD.ol68.com
ivMAAAEAzcW6xIrzAACK8wAA.ol68.com
Стадия C&C плагина
7ZWPrs2G1tlcONzJnd68Kfb73DYaa0dOB68Dq5djUoy9UAB
YdFhtAeAaTW-
22Lr.1AjwSkBXvVhSlW31sveIvBTvk1TUHtcS6MRj87VIKkXTl
QyFLTcP5Ck0FX-11P.irbmr-
11PhFWVXcPj2BjkAzRWryseAaDlLajqH7kjXjE4Y7fn4RIt-
44LswTTX.BZwPrcF-44LbLn5ZcgT.ySADOwjSjha5-
44L8kgAzvaIeJi.ol68.com
Заголовок
Порция полезной нагрузки
Стадия C&C плагина
…
Стадия C&C плагина
1. Берем все 6 порций
2. Соединяем «как есть»
3. Кастомный base64
декодирование
4. Расшифровываем RC4
5. Готово!
Стадия C&C плагина
Fu-33S2umvUVm44Ezor-44Lrcw6w-88L-
55E.FoVHKQklUbP97RaFRykL4c1H.ol68.com
Fu-33S2umvUVm44Ezor-44Lrcw6w-88L-
55E.uI6dHQkl-44L7gn2biOnR2l6hdz.ol68.com
Стадия C&C плагина
… кастомное base64 декодирование -> вычисление
MD5 от полезной нагрузки
Почему дважды? …
Стадия C&C плагина
Полезная нагрузка в ответе
Заголовок Полезная нагрузка
Стадия C&C плагина
Конфиг малвари
Снова проверка MD5
Заключение
Похожий образецв твиттере
twitter.com/vk_intel/status/1177269767297806337
Заключение
Proofpoint пишет о Snatch
proofpoint.com/us/threat-insight/post/ta505-distributes-new-sdbbot-remote-access-trojan-get2-downloader
Заключение
@tildedennis про Snatch
github.com/tildedennis/malware/blob/master/snatch_loader/decrypt_cfg.py
Заключение
Такой же алгоритм генерации ключа
Заключение
Blue team: на что обратить внимание
• Все любят задачи• PowerShell/WScript процессы и .ps1/.js файлы на диске• msiexec и приостановленные процессы• Контроль целостности системных библиотек (сплайсинг до сих
пор жив)
Заключение
Blue team: на что обратить внимание
• Контроль потока выполнения? (ROP гаджеты -> kBouncer -> JOP)• Необычные типы запросов и DNS туннелирование• Легкий и качественный троян загрузчик – устойчивый тренд
APT != целевая атака
ptsecurity.com/ru-ru/research/pt-esc-threat-
intelligence/
PT ESC Threat Intelligence blog
PT ESC Incident Response Alertptsecurity.com/ru-
ru/services/esc/
Вопросы
ptsecurity.com/ru-ru/research/pt-esc-threat-intelligence/operation-ta505-part1/
ptsecurity.com/ru-ru/research/pt-esc-threat-intelligence/operation-ta505-part2/
Полезные ссылки
Часть 1. Как мы анализировали новые инструменты создателей
трояна Dridex, шифровальщика Locky и ботнета Neutrino
Часть 2. Изучаем бэкдор ServHelper с NetSupport RAT
Операция TA505:
Часть 3. Сетевая инфраструктура группировки
ptsecurity.com/ru-ru/research/pt-esc-threat-intelligence/operation-ta505-part3/
Часть 4. Близнецы
ptsecurity.com/ru-ru/research/pt-esc-threat-intelligence/operation-ta505-part4/