Tijdens ons recente onderzoek bij Seqrite In onze laboratoria hebben we een geavanceerde variant van de Masslogger-malware ontdekt, die zich verspreidt via .VBE-bestanden (VBScript Encoded). Aanvankelijk leek het een typische scriptgebaseerde dreiging, maar na een diepere analyse bleek het een meertraps, bestandsloze malware te zijn die sterk afhankelijk is van het Windows-register om zijn schadelijke payload op te slaan en uit te voeren.
In deze blogpost hebben we de interne stroom van VBScript-code, het gebruikte verduisteringsmechanisme en hoe het systeem wordt gemanipuleerd om bestandsloos te blijven, geanalyseerd. Ook hebben we de Stagers en de mogelijkheden van de uiteindelijke Masslogger-payload uitgelegd.
Initiële infectievector:
De infectie begint met een .VBE-bestand, dat waarschijnlijk wordt verspreid via spam of drive-by downloads. Een .VBE-bestand is een VBScript dat is gecodeerd met Microsofts ingebouwde coderingsschema om willekeurige inspectie te detecteren. Eenmaal gedecodeerd, onthult het script meerdere lagen van verduistering, modulaire routines en echte functionaliteit.
Analyse van gedecodeerd .VBS – [VBScript] bestand:
In eerste instantie bereidt en schrijft het .VBS-bestand meerdere registerwaarden voor onder een specifieke sleutel die door de malware wordt gebruikt. Het stelt de uitvoeringsomgeving in voor het opslaan van een bestandsloze payload.
Namen van registersleutels en waarden zijn hardgecodeerd en eenvoudig. Slechts enkele van de kritieke waardegegevens blijven echter gecodeerd en worden gedecodeerd tijdens de uitvoering van het bestand.
-Registerinstellingen voor opdrachten en Stager-configuratie:
Subroutine AKAAU() wordt gebruikt om sleutels en waarden voor te bereiden voordat ze naar het register worden geschreven. Waardenamen en waardegegevens worden opgeslagen als een aparte array – respectievelijk "QORXG" en "ZBZLV". Beide arrays worden naar het register geschreven met behulp van "RegWrite".

Zodra het systeem is geïnfecteerd, kunnen we de volgende schadelijke registervermeldingen vinden in de Register-editor:

Hier is een samenvatting van de registervermeldingen die naar het systeem zijn geschreven op het registerpad “HKCU\Software\”:
| Waarde Naam: | Prijs Data | Samenvatting |
| cn | Stop-Process -Naam conhost -Force | Sluit het conhost.exe-proces geforceerd af. |
| i | “AddInProcess32.exe” | Doelproces voor code-injectie. |
| in | "0" | Controlevlag, die controleert of de PowerShell-opdracht al is uitgevoerd. |
| moment | LPICU | Verduisterde PowerShell-opdrachten. De-verduisteren en Stager-1 in het geheugen laden. |
| Pad | esBbIgyFlZcXjUl | Naam van het registersleutelpad. Deze wordt toegevoegd aan "HKCU\Software\". |
| r | WAJLA | .Net assembly, opgeslagen in omgekeerd stringformaat. Stager-2. |
| s | RKFYI(DGSLP) | Hexadecimale gedecodeerde string. .Net-assembly opgeslagen in omgekeerd Base64-formaat. Stager-1. |
| v | HIKGO() | Verduisterde opdrachten voor PowerShell. Deobfuscatie en laden van Stager-1 in het geheugen. Specifiek gebruikt als simulatie van gebruikersinvoer. |
Tabel 1: Overzicht van toegevoegde registervermeldingen
Voordat deze registervermeldingen worden weggeschreven, roept de malware een subroutine "ZGYHW()" aan die controleert of het bestand " C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe " aanwezig is op de opgegeven locatie.
Afhankelijk van de aanwezigheid implementeert malware verschillende versies van Stagers. Specifiek Stager-2 in dit scenario:

– Registerinstellingen voor definitieve payload-implementatie:
Nadat bovenstaande registers geconfigureerd en geschreven zijn, wordt een andere subroutine "XSSAY()" aangeroepen. Deze functie is verantwoordelijk voor het lezen van een andere, grotere stringdata (een daadwerkelijke Masslogger-payload, gecodeerd bewaard). Deze data wordt vervolgens opgesplitst in blokken van 25,000 tekens en in gesegmenteerde vorm naar een ander register geschreven.

Elk deel wordt naar het register geschreven op de volgende paden:
- HKEY_CURRENT_USER\SOFTWARE\esBbIgyFlZcXjUl\donn\segment1
- HKEY_CURRENT_USER\SOFTWARE\esBbIgyFlZcXjUl\donn\segment2
- HKEY_CURRENT_USER\SOFTWARE\esBbIgyFlZcXjUl\donn\segment*

-Taakplanner:
Malware zorgt voor persistentie via een geplande Windows-taak, waardoor malware op het systeem actief blijft. De trigger voor de taak start op de datum van infectie (20xx-xx–xxT00:00:00) en wordt elke minuut (PT1M) herhaald. De taak wordt gepland om te worden uitgevoerd zonder rekening te houden met de batterijgerelateerde beperkingen.

De taak gebruikt dezelfde naam als een aangemaakte registersleutel, bijvoorbeeld esBbIgyFlZcXjUl, en wordt geactiveerd om een .VBS-bestand uit te voeren. Dit .VBS-bestand fungeert als een permanente uitvoeringslus die controleert of er een registersleutel is aangemaakt om aan te geven of een payload moet worden uitgevoerd.
-Taakplannerscript – Kan gebruikersinvoer simuleren:
Zoals we op de onderstaande afbeelding kunnen zien:
- Het programma draait ongeveer 10000 keer, met tussen elke cyclus een pauze van 10 seconden.
- Hiermee wordt de registerwaarde ‘i’ gelezen om de naam van het proces te achterhalen en te bevestigen of het proces wel of niet actief is.
- Vervolgens wordt gecontroleerd of de registerwaarde 'in' op 1 staat,
- Indien dit het geval is, voert het in stilte de kwaadaardige opdracht uit die in het register is opgeslagen “instant”.
- Wanneer de waarde in “in” niet op 1 is gezet.
- Het start PowerShell in de zichtbare venstermodus en gebruikt de “.SendKeys”-methoden om waarden van de registers “v” en “cn” in te voeren, gevolgd door “{ENTER}”.
- Deze techniek lijkt op het simuleren van gebruikersinvoer in PowerShell.

Zoals we in de samenvattende tabel zagen,
Het registerteken "cn" wordt gebruikt om het actieve proces conhost.exe geforceerd te stoppen.
De registers "instant" en "v" worden door PowerShell gebruikt om de Stager .Net-assembly te de-obfusceren, voor te bereiden en in het geheugen te laden, zonder de schijf aan te raken.
Controleer de systeembeveiligingsstatus:
Malware controleert de beveiligingsstatus van het doelsysteem en blijft mogelijk onopgemerkt tijdens de uitvoering. Dit gebeurt door een aantal belangrijke registers te raadplegen. Hieronder vindt u enkele registers waar AV-/beveiligingsproducten doorgaans hun aanwezigheid registreren:
- “HKLM\SOFTWARE\Microsoft\Beveiligingscentrum\Provider\Av”,
- “HKLM\SOFTWARE\Microsoft\Beveiligingscentrum\Monitoring”,
- “HKLM\SOFTWARE\Microsoft\Windows\HuidigeVersie\Beveiliging en Onderhoud\Providers”,
- “HKLM\SOFTWARE\Microsoft\Windows Defender\Beveiligingscentrum\Providers”
Deze registers worden in gecodeerde vorm in het script gedefinieerd. Malware probeert te inventariseren via de subsleutels van de bovenstaande sleutels en probeert de waarde "DisplayName" te lezen. DisplayName bevat de naam van de geïnstalleerde antivirus-/beveiligingstool. Als er meerdere beveiligingsproducten op het doelsysteem zijn geïnstalleerd, stopt de malware de uitvoering ervan.

-Trigger voor Stager:
De subroutine SQSKP() in een .VBE-bestand is een cruciaal onderdeel van de malware-uitvoeringsketen. Deze construeert en voert dynamisch een PowerShell-opdracht uit die een .NET-stager die uit het Windows-register is opgehaald, in het geheugen uitvoert.

De gedecodeerde tekst is hier een gedeobfusceerde PowerShell-opdracht, nadat |path| is vervangen door RVOYN.

Zoals we kunnen zien in Figuur 10 –
- Deze PowerShell-opdracht wordt gevormd en toegewezen aan de variabele “LPICU”.
- De inhoud van de variabele wordt vervolgens weggeschreven naar de registerwaarde “\instant”, die wordt aangemaakt in de registersleutel “Computer\HKEY_CURRENT_USER\SOFTWARE\esBbIgyFlZcXjUl”.
- De functie voert de geconstrueerde PowerShell-opdracht stilzwijgend uit, waarbij “0” het PowerShell-venster verbergt.
- De PowerShell leest vervolgens registersleutel “HKCU\Software\esBbIgyFlZcXjUl\s” – Deze registersleutel bevat de Stager-1, bewaard in de vertrouwde Base64-gecodeerde indeling.

We hebben gezien dat malware-auteurs deze coderingscombinatie implementeren in veel van de recente inloggegevensdieven, waaronder VIPKeylogger, Remcos, AsyncRAT etc.
- De PowerShell-opdracht draait de string om, voegt ze samen, decodeert base64-strings en laadt deze als een .Net-assembly met behulp van de functie “[AppDomain]::CurrentDomain.Load ()” in het geheugen. Deze aanpak stelt malware in staat om:
- Vermijd het schrijven van daadwerkelijke malwarebestanden naar schijf (ontwijkingsmogelijkheid).
- Dynamisch payload construeren en laden tijdens runtime.
- Roept de invoermethode “[vv]::v('esBbIgyFlZcXjUl')” aan, die verwijst naar het registerpad.
We hebben de dump van de gedeobfusceerde stager-1-payload meegenomen voor verdere analyse. Onze observaties zijn als volgt:
Analyse van Stager-1:
Stager-1 is een klein uitvoerbaar bestand dat gecodeerd wordt bewaard in het register "HKCU\Software\esBbIgyFlZcXjUl\s". Het is gecompileerd in .Net en is ongeveer 14 KB groot.
Bij analyse van de code ontdekten we dat het bestand probeert inhoud te lezen van een andere registersleutel met de naam "r" – [HKCU\Software\esBbIgyFlZcXjUl\r].
Die inhoud wordt omgedraaid en er wordt een ander .Net gecompileerd binair bestand gevormd: stager-2.
Dit binaire bestand wordt vervolgens in het geheugen geladen met behulp van "Assembly.Load(). Stager-1 probeert methode r() te vinden binnen de klasse r in de Stager-2 assembly. Dit is het startpunt voor de uitvoering van stager-2.

Analyse van Stager-2:
Nadat Stager-1 de installatie heeft voltooid, gaat de malware naar de Stager-2-loader. Deze infectiefase is gericht op het extraheren van de daadwerkelijke Masslogger-payload uit het register en het injecteren ervan in het doelproces.
Stager-2 construeert in eerste instantie potentiële bestandspaden om het proces te starten en voert code-injectie uit.
Er wordt gecontroleerd of er in een van deze paden een bestand bestaat (waarvan de naam is afgeleid van de registerwaarde 'i').
In ons geval vonden we het doelbestand/procespad als volgt:
“%WINDIR%\Microsoft.NET\Framework\v4.0.30319\AddInProcess32.exe”

Bovendien extraheert malware de daadwerkelijke Masslogger-payload die eerder is geschreven (door subroutine "XSSAY()") in meerdere registersubsleutels onder de onderstaande registers, die we eerder zagen ".
- HKEY_CURRENT_USER\SOFTWARE\esBbIgyFlZcXjUl\donn\segment1
- HKEY_CURRENT_USER\SOFTWARE\esBbIgyFlZcXjUl\donn\segment2
- HKEY_CURRENT_USER\SOFTWARE\esBbIgyFlZcXjUl\donn\segment*
De BBX()-functie van klasse 'r' is verantwoordelijk voor het verzamelen van alle waarde-items, het samenvoegen ervan, het omkeren van de gecombineerde string en het decoderen van hexadecimaal naar onbewerkte bytes. Deze techniek stelt malware-auteurs in staat een volledig PE-binair bestand over meerdere registersleutels te verbergen. De gedecodeerde payload wordt vervolgens gebruikt voor procesuitholling. Procesuitholling wordt uitgevoerd met de functie .XGP().
Dit is een slimme manier om alles in het register op te slaan en het geheugen alleen voor de uitvoering te gebruiken.

- Specifieke Franse ladingaflevering:
Geo-gerichte payload-levering is nu gebruikelijk in geavanceerde malware om het gedrag te veranderen op basis van de locatie van het slachtoffer. Fase 2 van deze infectie controleert of de invoertaal van het huidige systeem is ingesteld op Frans ('Fr') en of de landinstelling 'Frankrijk' bevat.

Als aan de voorwaarden is voldaan, probeert het een speciaal vervaardigde extra payload te downloaden van de hardgecodeerde URL: hxxps://144.91.92.251/MoDi.txt. Ten tijde van de analyse was de URL niet toegankelijk.
- Sporen beëindigen en verlaten:
Aan het einde van de uitvoering beëindigt de malware op geforceerde wijze de actieve instanties van de processen conhost.exe en PowerShell.exe.

Door deze processen te stoppen, probeert malware waarschijnlijk zijn activiteitssporen te verbergen. Ten slotte verlaat de applicatie de applicatie met ProjectData.EndApp(), waarmee de levenscyclus van stager 2 wordt voltooid.
Analyse van de uiteindelijke lading van de Masslogger:
Na succesvolle deobfuscatie van de uiteindelijke payload uit het register, wordt Masslogger geïnjecteerd in het doelproces – "AddInProcess32.exe". We kunnen de marker van deze malware zien in de geheugendump van het geïnjecteerde proces, zoals hieronder:

We hebben een geheugendump gemaakt van deze payload, die de laatste fase in de malwareketen vertegenwoordigt. Deze is verantwoordelijk voor het uitvoeren van de belangrijkste inloggegevens: het stelen van informatie.
-Gegevensverzameling:
Net als veel infostealer-malware richt deze malware zich op meerdere webbrowsers en enkele e-mailclients om gevoelige informatie te stelen, zoals opgeslagen gebruikersnamen, wachtwoorden, automatisch ingevulde gegevens, enz. Hieronder vindt u een lijst met webbrowsers en enkele e-mailclients die Masslogger probeert te targeten.

Laten we een van de modules in detail bekijken, waarin malware probeert opgeslagen inloggegevens van de Chrome-browser te verzamelen.

Het lokaliseert de inloggegevens van de gebruiker door de SQLite-database 'Login Data' te raadplegen. Het extraheert website-URL's, samen met bijbehorende gebruikersnamen en wachtwoorden, en verzamelt deze voor verder gebruik. Als er geldige inloggegevens worden gevonden, worden deze opgeslagen in een gestructureerde vorm, zoals de website, gebruikersnaam en het wachtwoord.
Naast het targeten van browsers en e-mailclients om informatie te stelen, beschikt Masslogger ook over de volgende mogelijkheden:
- Keylogger-activiteit.
- Maak en wis snapshotbestanden.
- Haal klembordgegevens op.
- Probeer de gebruikersactiviteit te monitoren door GetForegroundWindow, GetWindowText etc. aan te roepen.
- Lees systeemdetails, zoals IP-adres en land.
- Meerdere bestanden naar de server uploaden.
-Gegevens-exfiltering:
Met de SpeedOffPWExport()-methode in de uiteindelijke payload is data-exfiltratie mogelijk door verzamelde inloggegevens en systeemgegevens via meerdere kanalen, zoals FTP, SMTP of Telegram, naar externe locaties te versturen.
Als FTP is ingeschakeld, uploadt de methode de gestolen gegevens als een .txt-bestand naar een externe FTP-server met behulp van hard gecodeerde inloggegevens.

Bij SMTP wordt een e-mailbericht samengesteld met de gegevens in de berichttekst of als bijgevoegd tekstbestand. Dit bericht wordt vervolgens verzonden via de opgegeven mailserver.

Als Telegram-exfiltratie is ingeschakeld, worden de gegevens als document verzonden via de Telegram Bot API, inclusief een bijschrift met de gebruikersnaam en het IP-adres van het slachtoffer.

Conclusie:
De fileless variant van Masslogger toont de opkomende trend van informatie-stelende malware. Het wordt geleverd via een .VBE-script en misbruikt het Windows-register om daadwerkelijke uitvoerbare bestanden op te slaan en laadt die bestanden rechtstreeks in het geheugen zonder de schijf te raken. Het kan opgeslagen inloggegevens van meerdere browsers en e-mailclients verzamelen en meerdere kanalen gebruiken [FTP, SMTP, Telegram Bot] voor data-exfiltratie.
Deze variant laat zien dat malware die inloggegevens steelt verschuift naar bestandsloos en werkt in meerdere fasen (Stager-1, Stager-2). Dit vormt een uitdaging voor traditionele antivirus- en handtekeninggebaseerde detectiemethoden. Om dit te voorkomen, moeten beveiligingsverdedigers geavanceerde detectiemechanismen gebruiken, zoals gedragsdetectie, het monitoren van registerafwijkingen, enzovoort.
Indicatoren van Compromis (IoC's):
Bestand MD5:
.VBE: 29DBD06402D208E5EBAE1FB7BA78AD7A
.VBS: F30F07EBD35B4C53B7DB1F936F72BE93
Stager-1: 2F1E771264FC0A782B8AB63EF3E74623
Stager-2: 37F0EB34C8086282752AF5E70F57D34C
MassLogger Payload: 1E11B72218448EF5F3FCA3C5312D70DB
URL:
hxxps://144.91.92.251/MoDi.txt
Seqrite Detectie:
Script.trojan.49618.GC
Trojan.MSIL
Trojan.YakbeexMSIL.ZZ4
MITRE ATT & CK
| Tactiek | Techniek-ID | Techniek naam | Subtechniek-ID | Naam van de subtechniek |
| Eerste toegang | T1566 | Phishing | T1566.001 | Spear phishing-bijlage |
| Uitvoering | T1059 | Commando- en scriptinterpreter | T1059.005 | Visual Basic |
| Uitvoering | T1059 | Commando- en scriptinterpreter | T1059.001 | PowerShell |
| Volharding | T1053 | Geplande taak/taak | T1053.005 | Geplande taak |
| verdediging ontduiking | T1140 | Bestanden of informatie decoderen/decoderen | - | - |
| verdediging ontduiking | T1112 | Wijzig register | - | - |
| verdediging ontduiking | T1055 | Procesinjectie | T1055.012 | Uithollingsproces |
| verdediging ontduiking | T1562 | Aantasting van verdedigingen | T1562.001 | Hulpmiddelen uitschakelen of wijzigen |
| verdediging ontduiking | T1059 | Commando- en scriptinterpreter | T1059.001 | PowerShell |
| De reis van mijn leven | T1518 | Software ontdekken | T1518.001 | Detectie van beveiligingssoftware |
| De reis van mijn leven | T1082 | Ontdekking van systeeminformatie | - | - |
| De reis van mijn leven | T1012 | Query register | - | - |
| Toegang tot inloggegevens | T1555 | Inloggegevens van wachtwoordwinkels | T1555.003 | Inloggegevens van webbrowsers |
| Toegang tot inloggegevens | T1056 | Invoer vastleggen | T1056.001 | keylogging |
| Collectie | T1113 | Screen Capture | - | - |
| Collectie | T1115 | Klembordgegevens | - | - |
| Collectie | T1056 | Invoer vastleggen | T1056.001 | keylogging |
| Collectie | T1083 | Bestands- en directorydetectie | - | - |
| Command and Control | T1071 | Applicatielaagprotocol | T1071.001 | Webprotocollen |
| Command and Control | T1071 | Applicatielaagprotocol | T1071.002 | Bestandsoverdrachtprotocollen |
| Command and Control | T1071 | Applicatielaagprotocol | T1071.003 | Mailprotocollen |
| Command and Control | T1105 | Ingress-tooloverdracht | - | - |
| exfiltratie | T1041 | Exfiltratie via C2-kanaal | - | - |
| exfiltratie | T1567 | Exfiltratie via webservice | T1567.002 | Exfiltratie naar cloudopslag |
| exfiltratie | T1567 | Exfiltratie via webservice | T1567.001 | Exfiltratie naar coderepository |



