SLEEPWALKER: Een passieve backdoor met een eigen opdrachttaal
Wat het de moeite waard maakt om over te schrijven, is wat dat pakket bevat: geen leesbaar commando, maar een kort programma geschreven in een opdrachttaal die door de backdoor zelf is ontworpen. De 23 instructies beslaan planning, verschillende manieren om gegevens te verplaatsen, gefaseerde bestandslevering en het direct uitvoeren van code in het geheugen. Het herstellen van de encryptiesleutel is niet voldoende om een van deze programma's te begrijpen; de interne opdrachttaal moet ook worden gereversed. Vanuit een reverse-engineering-perspectief heeft SLEEPWALKER een cool ontwerp, hoewel de implementatie enkele zwakheden vertoont en geen topniveau van malware-engineering is. Dit zou een vroege versie kunnen zijn; nieuwere en verbeterde builds zouden kunnen bestaan.
Dit artikel behandelt wat het bestand zelf onthult, hoe SLEEPWALKER wordt geladen, hoe het opstart, hoe het onzichtbaar blijft op het netwerk, hoe de commando's worden beschermd en hoe de interne opdrachttaal werkt. Het sluit af met een sectie met IOC's en een bijlage met een YARA-regel en een read-only scanner-script.
Executive Summary
SLEEPWALKER is een passieve backdoor met een eigen opdrachttaal. Het contacteert nooit een vast C2-adres. In plaats daarvan scant het het netwerk naar een covert trigger-pakket. Pas dan wordt het wakker om een door de aanvaller geleverd taakprogramma te ontsleutelen en uit te voeren. Het programma arriveert als bytecode die alleen door dit bestand kan worden geïnterpreteerd, niet als leesbare commando's.
Het bestand is een 64-bits Windows DLL die zich voordoet als Microsoft's dpapi.dll en beschikt over een vervalste resource-versie van de ESET Management Agent. Het is ontworpen om via side-loading in ERAAgent.exe te worden geladen, het Windows-uitvoerbare bestand voor de ESET Management Agent. ESET beschrijft de agent als een essentieel onderdeel van ESET PROTECT en ESET PROTECT On-Prem dat beheerde endpoints en servers verbindt met het managementplatform en beleid lokaal opslaat en afdwingt. SLEEPWALKER controleert alleen de naam van het hostproces, niet de signatuur of het pad, en blijft inactief tenzij die naam ERAAgent.exe is.
De volledige levenscyclus van de backdoor: Side-loading → Uitvoering: er draait niets totdat er één passend pakket arriveert.
De in het bestand ingebouwde configuratie ontsleutelt (met AES-256-CCM en een geverifieerde authenticatietag) naar één bootstrap-commando: luister onbeperkt op elke netwerkinterface naar dat trigger-pakket. Op zichzelf doet het bestand niets anders dan wachten. De backdoor bevat een compacte bytecode-interpreter met 23 instructies voor planning, gefaseerde payload-levering met SHA-256 verificatie en in-memory shellcode-uitvoering.
De netwerkmogelijkheden omvatten TCP, UDP, ICMP, SMB named pipes (met laterale beweging via verstrekte inloggegevens), het interne VMCI-kanaal van VMware tussen een gast en host, en raw-socket promiscuous sniffing. Een tweede trigger-kanaal kan commando's overbrengen via DNS-queries.
Om ongeauthentiseerde named-pipe toegang te faciliteren, verzwakt SLEEPWALKER de host actief: het schakelt anonieme SMB-toegang in en maakt named pipes aan met permissies verleend aan Everyone en Anonymous Logon. Alle encryptie wordt verzorgd door een statisch gekoppelde kopie van mbedTLS, een open-source cryptografiebibliotheek, in plaats van runtime-geladen libraries.
Deze combinatie maakt SLEEPWALKER moeilijk te detecteren via het netwerk: er is niets om te blokkeren totdat de operator dat ene geconstrueerde pakket verzendt, en dit kan arriveren binnen verkeer dat volledig normaal lijkt, inclusief een geconstrueerde DNS-query. Een passief implantaat dat op deze manier wordt getriggerd, gebruikmaakt van meerdere covert transports inclusief VMCI en wordt uitgerold via side-loading in een vertrouwde ESET-managementcomponent, maakt zeer waarschijnlijk deel uit van een gerichte aanval. Omdat de code onbekend is voor alles wat ik in het verleden heb gezien, kan ik deze malware niet toeschrijven aan een specifieke actor.
Belangrijkste punten
- Het bestand is ongesigneerd, kopieert de bestandsinformatie van ESET en wordt geladen via DLL side-loading.
- Het controleert alleen de naam van het hostproces en activeert wanneer die naam
ERAAgent.exeis. - Het contacteert niet zelfstandig een server; het wacht op één specifiek versleuteld netwerkpakket.
- Eenmaal getriggerd, voert het programma's uit in een kleine, aangepaste opdrachttaal (scheduling, netwerkmethode, gefaseerde bestandslevering, in-memory code).
- Het bestand bevat geen kant-en-klare kwaadaardige payload; alles na de startinstructie moet later via het netwerk arriveren.
- Het wijzigt lokale Windows-instellingen zodat ongeauthentiseerde netwerkverbindingen het kunnen bereiken.
Bestandskenmerken
Het sample is een ongesigneerde 64-bits DLL voor het Windows GUI-subsystem. Het is 59.904 bytes groot en heeft een compilatie-timestamp van 2024-06-10 09:18:27 UTC.
- SHA-256:
d347170752a28e2b8c4b8b9f3cab2e3a6541ba11682c94498d26eb9002779d60 - SHA-1:
2ec8aa9661a33bccc002150ce1ed02d90c3986ff - MD5:
2318327b29bb1c0e2d2b5f0211fc7fac - Imphash:
4e2dbfa7e3efd4cca2f3662797df9735
Om het te camoufleren, bevat het bestand een versie-resource gekopieerd van de echte Management Agent van ESET:
| Veld | Waarde |
|---|---|
| CompanyName | ESET |
| ProductName | ESET Management Agent |
| FileDescription | ESET Management Agent Module |
| InternalName | ERAAgent |
| OriginalFilename | dpapi.dll |
| File / Product version | 11.2.2076.0 |
| LegalCopyright | Copyright (c) ESET, spol. s r.o. 1992-2024. |
Het bestand exporteert dezelfde naam en dezelfde zeven functies als de echte dpapi.dll: CryptProtectDataNoUI, CryptProtectMemory, CryptResetMachineCredentials, CryptUnprotectDataNoUI, CryptUnprotectMemory, CryptUpdateProtectedState en iCryptIdentifyProtection. Elk van deze functies is een kleine stub die springt via een pointer-tabel, die aanvankelijk leeg is. De eerste keer dat een van deze zeven functies wordt aangeroepen, probeert een shared resolver een bestand genaamd dpapisvc.dll te laden met LoadLibraryW, om de echte functie daarin te vinden en het adres in de pointer-tabel te schrijven, zodat de aanroep kan worden doorgezet.
De naam dpapisvc.dll hoort bij geen enkel legitiem Windows-component. Wanneer het laden mislukt, beëindigt de resolver het gehele hostproces. Het is mogelijk dat een volledige versie van deze aanval een hernoemde kopie van de echte dpapi.dll onder deze naam naast het bestand plaatst.
Initialisatie en opstartvolgorde
Voordat de DLL actie onderneemt, controleert hij de naam van het proces dat hem heeft geladen. Als dat proces niet ERAAgent.exe heet, blijft de DLL inactief. Zodra die controle is geslaagd, brengt een korte reeks stappen de backdoor tot leven:
- Het start een nieuwe achtergrondthread, gescheiden van de code van ESET.
- Het reserveert een geheugenblok van 128 KB voor het assembleren van programma's die in verschillende delen arriveren.
- Het ontsleutelt de ene instructie die in het bestand is opgeslagen.
- Het bereidt Windows-netwerkvraagstukken voor en overhandigt de ontsleutelde instructie aan de interne interpreter.
Deze interpreter wordt niet slechts één keer gebruikt. Wanneer een trigger later een vervolgprogramma levert, voert precies dezelfde interpreter-functie dit uit.
Twee paden bereiken dezelfde opstartcode:
- Pad 1: DLL wordt geladen in
ERAAgent.exe(DllMain). - Pad 2: Eerste aanroep van een van de 7 doorgestuurde DPAPI-exports.
Beide paden voeren onafhankelijk van elkaar de controle op de procesnaam uit en starten de opstartsequentie (thread starten, buffer reserveren, bootstrap-instructie ontsleutelen, interpreter starten).
De string ERAAgent.exe wordt niet als leesbare tekst opgeslagen, maar wordt tijdens runtime opgebouwd uit een reeks getallen. Dezelfde truc wordt gebruikt voor drie functienamen die niet in de normale imports staan: VirtualProtect (voor shellcode), SetSecurityDescriptorDacl (voor pipe-permissies) en CryptGenRandom (voor willekeurige pauzes).
Geen autonome beaconing of vaste servers
De meeste backdoors contacteren direct na het opstarten een server. SLEEPWALKER doet dit niet. Er zijn geen domeinen, IP-adressen of URL's in het bestand gebouwd.
In plaats daarvan zet het de netwerkkaart in een modus die elk passerend pakket kan zien, ook pakketten die niet aan de host zijn geadresseerd (promiscuous mode). De backdoor controleert elk pakket op een specifiek patroon: een berekende checksum, een gecodeerde lengtewaarde en een blok versleutelde gegevens. Dit wordt een magic packet genoemd.
Stappen van de trigger-controle:
| Stap | Controle | Bij mislukking |
|---|---|---|
| 1 | Pakket is minstens 48 bytes lang | Genegeerd |
| 2 | XOR de laatste twee 16-bit waarden van het pakket, XOR resultaat met 0xAAAA → kandidaat lengte | N/A |
| 3 | Kandidaat lengte valt binnen een geldig bereik | Genegeerd |
| 4 | Byte-paar op positie (pakketlengte minus kandidaat lengte) is de som (niet de XOR) van de twee laatste waarden | Genegeerd |
| 5 | Het blok waar de kandidaat lengte naar wijst, doorloopt een CRC-32 check | Genegeerd |
| 6 | Ontsleutelen met AES-256-CCM en behandelen als commando | N/A |
De backdoor bewaakt maximaal acht netwerkinterfaces tegelijk, waarbij de loopback-interface wordt overgeslagen. Na een succesvolle trigger wacht het minstens drie seconden voordat het een volgende accepteert.
Authenticatie en encryptie van commando's
De pijplijn van een commando ziet er als volgt uit: Trigger pakket of DNS-query → Framing en checksum check → AES-256-CCM decrypt → Bytecode interpreter → Command handler.
Elk commando is versleuteld met AES-256-CCM. Commando's via de meeste kanalen gebruiken een layout bestaande uit een 12-byte nonce, een 16-byte check-waarde (tag) en de versleutelde data.
Herstelde sleutels:
- AES-256 key:
0x746531ff378dbb4bb51d2aa2b1d38d905350a959583186baf4c690f5f316b3ae - Config nonce:
0x3a6d357fb9bc51eacc8b8509
Bescherming per contenttype
| Content | Richting | Encryptie/Codering | Uitleg |
|---|---|---|---|
| Taakprogramma's (Raw, TCP, UDP, Pipes, VMCI) | Inbound | AES-256-CCM | Bytecode is versleuteld en geauthenticeerd. |
| Taakprogramma's via DNS | Inbound | Base32 over AES-256-CCM | Base32 maakt de envelope geschikt voor DNS-labels. |
Lokale scripts (RUNFILESCRIPT) | Lokaal | AES-256-CCM | Versleutelde taak-envelope in een bestand. |
Genestte programma's (CRON_SCHEDULE) | Intern | AES-256-CCM, daarna XOR | Blijft XOR-obfusceerd tussen uitvoeringen. |
Verzonden data (TCP_SEND, etc.) | Outbound | Geen automatische encryptie | Data wordt verzonden zoals geleverd door de operator. |
| Metadata (Headers, CRC, Nonce) | Begeleidend | Zichtbaar | Nodig voor transport en validatie. |
Bytecode-formaat
Een commando is geen tekst, maar een reeks raw bytes. Elke instructie begint met één byte (opcode) die bepaalt welk van de 23 soorten het is.
- Vaste waarden: (bijv. wachttijd) worden geschreven in een vast aantal bytes (Most Significant Byte first).
- Variabele waarden: (bijv. tekst of data) beginnen met een lengte-indicator, gevolgd door de bytes zelf.
Voorbeeld van de bootstrap-instructie in het bestand: 87 01 2A 00 00
87: OpcodeSNIFFMAGICPACKET01: Lengte van interface-filter (1 byte)2A: Data"*"(alle interfaces)00 00: Deadline in seconden (0 = geen limiet)
Genestte programma's en XOR-bescherming
Sommige instructies bevatten een tweede programma. De CRON_SCHEDULE instructie is hier een voorbeeld van. Het programma binnen de schedule wordt XOR-versleuteld met een sleutel. De code ontsleutelt het buffer tijdelijk, voert het uit, en versleutelt het daarna direct weer.
Referentie van de opdrachttaal
De backdoor beschikt over 23 instructies.
| Instructie | Functie | Parameters |
|---|---|---|
| Basiscontrole | ||
EXIT | Stopt alle programma's en de listener. | Geen |
SPAWNTHREADSCRIPT | Start een tweede programma in een eigen thread. | Nested program (blob) |
| Timing & Planning | ||
SLEEP_SECONDS | Pauzeert een vast aantal seconden. | Duration (u16) |
SLEEPRANDOMSECONDS | Pauzeert een willekeurig aantal seconden (jitter). | Upper limit (u16) |
CRON_SCHEDULE | Voert programma uit bij match van tijd/dag. | Minute, hour, day, weekday masks (u64/u32/u8), nested program (blob, encrypted) |
REPEAT_N | Voert programma $N$ keer uit. | Repeat count (u16), nested program (blob) |
LOOP_FOREVER | Voert programma oneindig uit. | Nested program (blob) |
| Data verzenden | ||
TCP_SEND | Verstuurt data via TCP. | Local addr/port, remote host/port, data (blob), deadline (u16) |
UDP_SEND | Verstuurt data via UDP. | Local addr/port, remote host/port, data (blob), deadline (u16) |
ICMP_SEND | Verstuurt data via ping requests. | Source addr, remote host, data (blob), deadline (u16) |
PIPE_SEND | Schrijft data naar een Windows named pipe. | Server, pipe name, user, pass, data (blob), deadline (u16) |
| Inbound receptie | ||
TCPCONNECTRECV | Verbindt uit en wacht op vervolgprogramma. | Local addr/port, remote host/port, deadline (u16) |
TCPLISTENRECV | Opent poort en wacht op vervolgprogramma. | Bind address, bind port, deadline (u16) |
UDPBINDRECV | Wacht op UDP-blok als vervolgprogramma. | Bind address, bind port, deadline (u16) |
PIPECLIENTRECV | Verbindt naar named pipe voor programma. | Server, pipe name, user, pass, deadline (u16) |
PIPESERVERRECV | Maakt lokale named pipe voor programma. | Pipe name, unused field, deadline (u16) |
| Programma's bouwen | ||
STAGE_WRITE | Kopieert deel van programma naar 128KB buffer. | Offset (u32), data (blob) |
STAGEVERIFYEXEC | Verifieert SHA-256 van buffer en voert uit. | Length (u32), SHA-256 fingerprint (blob) |
DECOMPRESS_RUN | Decomprimeert data en voert uit. | Unpacked size (u32), lzma_props, compressed data (blob) |
RUN_SHELLCODE | Voert raw machine code direct in memory uit. | Machine code (blob) |
RUNFILESCRIPT | Leest en voert versleuteld bestand van disk uit. | File path (string) |
| Trigger detectie | ||
SNIFFMAGICPACKET | Luistert naar raw trigger-pakket. | Interface (string), deadline (u16) |
SNIFFMAGICPACKET_DNS | Luistert naar raw én DNS trigger. | Interface (string), deadline (u16) |
Alternatieve trigger-kanalen en transporten
VMware VMCI
Vijf netwerkinstructies kunnen het prefix vm: gebruiken in het adresveld. In dat geval wordt VMware's interne VMCI-kanaal gebruikt. Dit staat communicatie toe tussen een gast-VM en de host (of tussen gasten op dezelfde host) zonder dat het verkeer over het fysieke netwerk gaat.
DNS Triggering
Er is een tweede methode om een trigger te leveren via DNS-lookups. Commando's worden Base32-gecodeerd en verdeeld over de labels van een domeinnaam.
- Validatie: Een label is geldig als het begint en eindigt met markers (tussen 'g' en 'v') die samen een CRC-8 checksum van de middelste tekst vormen.
- Voorbeeld: Een query naar
mqfoceywmw4etcjdp2nptitil.example.comzou door de backdoor worden herkend als een legitiem commando als de markers en checksum kloppen.
Overzicht Transporten
| Transport | Mechanisme | Notities |
|---|---|---|
| TCP | socket / connect / listen / accept | Client en server. |
| UDP | sendto / recvfrom | One-shot send en bind-and-receive. |
| ICMP | IcmpSendEcho | Data gesmokkeld in ping echo-request payloads. |
| SMB named pipe | CreateNamedPipeW / CreateFileW | Kan eerst remote share mounten met credentials. |
| VMware VMCI | \\.\VMCI device object | Covert guest-to-host kanaal; raakt netwerkadapter niet. |
| Raw / promiscuous | Raw socket (promiscuous mode) | Gebruikt voor het ontvangen van het magic packet. |
Netwerkbereikbaarheid en positionering
| Kanaal | Internet | Firewall / NAT | Intern Netwerk | Target Host |
|---|---|---|---|---|
| Raw trigger | Geblokkeerd | Geblokkeerd | Bereikt | Bereikt |
| DNS trigger | Bereikt | Bereikt | Bereikt | Bereikt |
| VMCI | N/A | N/A | N/A | Alleen binnen VMware host |
| Outbound transports | Bereikt | Bereikt | Bereikt | Bereikt |
| Inbound transports | Geblokkeerd | Geblokkeerd | Bereikt | Bereikt |
Het gebruik van de raw trigger suggereert dat de operator al een positie op het interne netwerk heeft, of gebruikmaakt van uitzonderingen (zoals een publiek IP of een machine die verkeer routeert/forwardt).
Systeemwijzigingen op de host
Om ongeauthentiseerde named-pipe toegang mogelijk te maken, wijzigt de backdoor twee registry-instellingen:
EveryoneIncludesAnonymouswordt op 1 gezet.- De eigen pipe-naam wordt toegevoegd aan
NullSessionPipes.
Dit vereist lokale administratorrechten. De backdoor voert geen privilege escalation uit, maar vertrouwt op de context van het hostproces (ERAAgent.exe). De enige persistentie-methode is de side-loading zelf.
Opmerking over AI-gebruik
SLEEPWALKER werd gebruikt om frontier AI-modellen te vergelijken voor reverse engineering. De initiële analyse gebeurde handmatig, waarna AI hielp bij gedetailleerde analyse en verificatie.
- Modellen: Claude Opus 5, Sonnet 5, en GPT-5.6-Sol.
- Bevindingen: Beide modelfamilies presteerden vergelijkbaar. GPT identificeerde het verschil tussen de raw trigger (
0x87) en de DNS trigger (0x88) sneller dan Claude. - Conclusie: AI is een krachtige tool voor versnelling, maar technische expertise blijft noodzakelijk voor verificatie.
Onbekende zaken
Omdat de analyse is gebaseerd op één binary zonder incident-records, blijven zaken onbekend:
- Slachtoffer: Geen specifieke organisatie of sector bekend.
- Initiële toegang: Hoe de DLL op het systeem is geplaatst.
- Begeleidende componenten: De trigger-generator en bytecode-builder bevinden zich buiten dit bestand.
- Uitgevoerde commando's: Zonder netwerkverkeer is onbekend welke taken daadwerkelijk zijn verzonden.
- Attributie: Geen herkenbare code die wijst op een specifieke actor.
Conclusie
SLEEPWALKER is een passieve backdoor die niet zelfstandig beaconed en is ontworpen om via side-loading in ERAAgent.exe te draaien. De combinatie van een passief implantaat, covert transports (inclusief VMCI) en side-loading in een vertrouwde ESET-component wijst op een gerichte, goed gefinancierde operatie.
Indicators of Compromise (IOC's)
- SHA-256:
d347170752a28e2b8c4b8b9f3cab2e3a6541ba11682c94498d26eb9002779d60 - Bestanden: Onverwachte
dpapi.dllofdpapisvc.dllnaastERAAgent.exe. - Registry:
EveryoneIncludesAnonymous= 1- Onverwachte entries in
NullSessionPipes
---
Bijlage
YARA detectieregel
import "pe"
rule sleepwalker_backdoor
{
meta:
author = "Dominik Reichel"
description = "Detects the SLEEPWALKER passive backdoor."
sha256 = "d347170752a28e2b8c4b8b9f3cab2e3a6541ba11682c94498d26eb9002779d60"
date = "2026-08-11"
strings:
$aes_key = { 74 65 31 FF 37 8D BB 4B B5 1D 2A A2 B1 D3 8D 90 53 50 A9 59 58 31 86 BA F4 C6 90 F5 F3 16 B3 AE }
$config_nonce = { 3A 6D 35 7F B9 BC 51 EA CC 8B 85 09 }
$magic_packet_algo = {
49 83 FC 30
0F 82 ?? ?? ?? ??
47 0F B7 44 25 FC
47 0F B7 4C 25 FE
B8 AA AA 00 00
41 0F B7 C8
66 41 33 C9
66 33 C8
66 83 F9 1C
}
$dpapi_svc = "dpapisvc.dll" wide
condition:
uint16(0) == 0x5A4D and
uint32(uint32(0x3C)) == 0x00004550 and
(
any of ($aes_key, $config_nonce, $magic_packet_algo)
or (
pe.version_info["OriginalFilename"] contains "dpapi.dll" and
(
pe.version_info["FileDescription"] contains "ESET Management Agent Module" or
$dpapi_svc
) and
pe.exports("CryptProtectDataNoUI") and
pe.exports("CryptProtectMemory") and
pe.exports("CryptResetMachineCredentials") and
pe.exports("CryptUnprotectDataNoUI") and
pe.exports("CryptUnprotectMemory") and
pe.exports("CryptUpdateProtectedState") and
pe.exports("iCryptIdentifyProtection")
)
)
}
PowerShell detectiescript
<#
.SYNOPSIS
Scans a Windows host for the SLEEPWALKER backdoor.
#>
[CmdletBinding()]
param(
[string[]] $SearchRoot,
[string[]] $Path,
[switch] $IncludeMetadata,
[switch] $AsJson
)
$ErrorActionPreference = 'Stop'
if (-not $SearchRoot) {
$programFilesX86 = [Environment]::GetEnvironmentVariable('ProgramFiles(x86)')
$SearchRoot = @($env:ProgramFiles, $programFilesX86) | Where-Object { $_ }
}
$KnownBadSha256 = 'D347170752A28E2B8C4B8B9F3CAB2E3A6541BA11682C94498D26EB9002779D60'
$KnownBadSize = 59904
$CompanionDllName = 'dpapisvc.dll'
$LsaKeyPath = 'HKLM:\SYSTEM\CurrentControlSet\Control\Lsa'
$LsaValueName = 'EveryoneIncludesAnonymous'
$LanmanParamsKeyPath = 'HKLM:\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters'
$NullSessionValueName = 'NullSessionPipes'
$InaccessiblePaths = @()
function Find-SideLoadedDpapiDll {
param([string[]] $Roots, [switch] $IncludeMetadata)
$agents = foreach ($root in $Roots) {
if (Test-Path -LiteralPath $root) {
Get-ChildItem -LiteralPath $root -Filter 'ERAAgent.exe' -Recurse -File -ErrorAction SilentlyContinue -ErrorVariable +script:InaccessiblePaths
}
}
foreach ($agent in $agents) {
$candidate = Join-Path $agent.DirectoryName 'dpapi.dll'
$companionPresent = Test-Path -LiteralPath (Join-Path $agent.DirectoryName $CompanionDllName)
if (-not (Test-Path -LiteralPath $candidate)) {
[PSCustomObject]@{ Status = if ($companionPresent) { 'AnomalousPresence' } else { 'Clean' }; AgentPath = $agent.FullName; DllPath = $candidate; CompanionDllFound = $companionPresent }
continue
}
try {
$sha256 = (Get-FileHash -LiteralPath $candidate -Algorithm SHA256).Hash
$isKnownBad = $sha256 -eq $KnownBadSha256
[PSCustomObject]@{ Status = if ($isKnownBad) { 'ConfirmedMatch' } else { 'AnomalousPresence' }; AgentPath = $agent.FullName; DllPath = $candidate; Sha256 = $sha256; CompanionDllFound = $companionPresent }
} catch {
[PSCustomObject]@{ Status = 'Error'; Message = $_.Exception.Message }
}
}
}
$findings = @(Find-SideLoadedDpapiDll -Roots $SearchRoot -IncludeMetadata:$IncludeMetadata)
$lsaValue = (Get-ItemProperty -LiteralPath $LsaKeyPath -Name $LsaValueName -ErrorAction SilentlyContinue).$LsaValueName
$nullSessionEntries = (Get-ItemProperty -LiteralPath $LanmanParamsKeyPath -Name $NullSessionValueName -ErrorAction SilentlyContinue).$NullSessionValueName
$registryState = [PSCustomObject]@{
EveryoneIncludesAnonymous = $lsaValue
IsAnonymousShareAccessOn = ($lsaValue -eq 1)
NullSessionPipes = $nullSessionEntries
}
if ($AsJson) {
[PSCustomObject]@{ Findings = $findings; Registry = $registryState } | ConvertTo-Json -Depth 5
} else {
Write-Host "SLEEPWALKER Scan Results" -ForegroundColor Cyan
$findings | Format-Table
Write-Host "Registry State: $($registryState.IsAnonymousShareAccessOn)" -ForegroundColor Yellow
}
Groetjes,