1. Delivery Chain: ISO → LNK → DLL Sideloading
Spear-phishing email с темой «Q3 Financial Audit — Confidential». Вложение Audit_Q3_2024.iso (2.1 MB). Внутри:
Setup.exe с рабочей директорией ISOПри монтировании ISO и клике на LNK — запускается Setup.exe, который ищет Setup.dll в текущей директории (DLL Search Order Hijacking). Подгружает malicious DLL → Entry Point DllMain → запуск шеллкода.
2. Loader Analysis — Unpacking Shellcode
DLL экспортирует DllRegisterServer (обычный для regsvr32) и ServiceMain. В DllMain(DLL_PROCESS_ATTACH):
- Anti-VM: проверка
SMBIOS(VMware/VirtualBox),CPUIDhypervisor bit, MAC адреса (00:0C:29, 00:50:56, 00:1C:14), процессы (vmtoolsd, vboxtray, wireshark, procmon, ida, x64dbg). - Anti-Debug:
IsDebuggerPresent,CheckRemoteDebuggerPresent,NtQueryInformationProcess(ProcessDebugPort),NtSetInformationThread(ThreadHideFromDebugger), Timing checks (RDTSC). - Time-based evasion:
GetTickCount64delta > 10 мин между запусками → exit. - Если проверки пройдены — аллоцирует RWX память (
VirtualAlloc), расшифровывает эмбедненный шеллкод (XOR 0x9A + ROL 3), копирует, создаёт поток (CreateThread).
# Shellcode Extraction from Loader (IDAPython)
import idc, idaapi, idautils
def find_shellcode():
# Pattern: VirtualAlloc + RtlMoveMemory + CreateThread
for ea in idautils.Functions():
name = idc.get_func_name(ea)
if 'DllMain' in name or 'sub_' in name:
for head in idautils.Heads(ea, idc.get_func_attr(ea, idc.FUNCATTR_END)):
mnem = idc.print_insn_mnem(head)
if mnem == 'call':
op = idc.print_operand(head, 0)
if 'VirtualAlloc' in op:
print(f'VirtualAlloc at 0x{head:X}')
# Trace back to find shellcode buffer
# ...
# XOR Decoder
shellcode_enc = bytes([0x9A ^ b for b in raw_shellcode])
shellcode = bytes([(b << 3 | b >> 5) & 0xFF for b in shellcode_enc]) # ROL 3
with open('beacon_shellcode.bin', 'wb') as f:
f.write(shellcode)Извлечённый шеллкод (298 KB) — это Cobalt Strike Beacon (Stageless, x64). Загружаем в Cobalt Strike Parser (CS2CF / beacon-config-extractor) для конфига.
3. Cobalt Strike Beacon Config Extraction
Beacon конфиг зашифрован RC4 (ключ деривируется от watermark). Парсер находит конфиг по сигнатуре 0x00 0x00 0x00 0x00 (beacon metadata header) + известные смещения.
{
"watermark": 1337,
"beacon_type": "x64 stageless",
"c2": [
{
"protocol": "https",
"host": "cdn.financial-audit-services[.]com",
"port": 443,
"uri": "/api/v1/telemetry",
"headers": {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36",
"Accept": "*/*",
"Connection": "keep-alive"
}
}
],
"spawnto_x86": "C:\\Windows\\SysWOW64\\rundll32.exe",
"spawnto_x64": "C:\\Windows\\System32\\rundll32.exe",
"pipename": "msagent_%d",
"sleep": 60000,
"jitter": 23,
"maxdns": 255,
"dns_idle": "8.8.8.8",
"dns_sleep": 0,
"proxy_behavior": "use_ie",
"killdate": "2025-12-31",
"proc_inject": {
"min_alloc": 17500,
"startrwx": false,
"userwx": false,
"transforms": ["x64\\thread_hijack", "x64\\dynamic_syscall"],
"execute": "CreateThread"
}
}Ключевые детали для 헌팅:
Watermark: 1337
Cobalt Strike 4.0+ (trial/leaked). Не уникален, но подтверждает CS framework.
Malleable Profile: «Amazon CloudFront»
C2 URI /api/v1/telemetry, заголовки имитируют легативный API трафик. TLS JA3 fingerprint = 771,4865-4867-4866-49195-49199-52393-52392-49196-49200-49162-49161-49171-49172-156-157-47-53 (совпадает с публичным профилем «Amazon CloudFront» из Malleable C2 Profiles репозитория).