AD CS Certificate Theft

ゼロからヒーローまでAWSハッキングを学ぶ htARTE(HackTricks AWS Red Team Expert)

HackTricks をサポートする他の方法:

これは、https://www.specterops.io/assets/resources/Certified_Pre-Owned.pdf からの素晴らしいリサーチの盗難章の小さな要約です

証明書で何ができるか

証明書を盗む方法を確認する前に、証明書がどのように役立つかについての情報があります:

# Powershell
$CertPath = "C:\path\to\cert.pfx"
$CertPass = "P@ssw0rd"
$Cert = New-Object
System.Security.Cryptography.X509Certificates.X509Certificate2 @($CertPath, $CertPass)
$Cert.EnhancedKeyUsageList

# cmd
certutil.exe -dump -v cert.pfx

Crypto APIを使用した証明書のエクスポート – THEFT1

インタラクティブなデスクトップセッションにおいて、ユーザーまたはマシン証明書とそれに関連する秘密鍵を抽出することは、特に秘密鍵がエクスポート可能である場合、簡単に行うことができます。これは、certmgr.mscで証明書に移動し、右クリックしてすべてのタスク → エクスポートを選択して、パスワードで保護された.pfxファイルを生成することで達成できます。

プログラマティックなアプローチでは、PowerShellのExportPfxCertificateコマンドレットやTheWoverのCertStealer C#プロジェクトなどのツールが利用可能です。これらは、Microsoft CryptoAPI(CAPI)またはCryptography API: Next Generation(CNG)を使用して証明書ストアとやり取りします。これらのAPIは、証明書の保存と認証に必要な暗号化サービスを提供します。

ただし、秘密鍵がエクスポート不可能に設定されている場合、CAPIとCNGの両方は通常、そのような証明書の抽出をブロックします。この制限をバイパスするために、Mimikatzなどのツールを使用することができます。Mimikatzは、該当するAPIをパッチするcrypto::capiおよびcrypto::cngコマンドを提供し、秘密鍵のエクスポートを可能にします。具体的には、crypto::capiは現在のプロセス内のCAPIをパッチし、crypto::cnglsass.exeのメモリを対象にパッチします。

DPAPIを介したユーザー証明書の盗難 – THEFT2

DPAPIに関する詳細情報は以下を参照:

pageDPAPI - Extracting Passwords

Windowsでは、証明書の秘密鍵はDPAPIによって保護されています。ユーザーおよびマシンの秘密鍵の保存場所が異なり、ファイル構造もオペレーティングシステムが利用する暗号化APIによって異なります。SharpDPAPIは、DPAPIブロブを復号化する際にこれらの違いを自動的に認識できるツールです。

ユーザー証明書は主にレジストリ内のHKEY_CURRENT_USER\SOFTWARE\Microsoft\SystemCertificatesに格納されていますが、一部は%APPDATA%\Microsoft\SystemCertificates\My\Certificatesディレクトリにも見つかることがあります。これらの証明書に対応する秘密鍵は、CAPIキーの場合は通常%APPDATA%\Microsoft\Crypto\RSA\User SID\に、CNGキーの場合は%APPDATA%\Microsoft\Crypto\Keys\に保存されます。

証明書とそれに関連する秘密鍵を抽出するためのプロセスは次のとおりです:

  1. ユーザーのストアからターゲット証明書を選択し、そのキーストア名を取得します。

  2. 対応する秘密鍵を復号化するために必要なDPAPIマスターキーを特定します。

  3. 平文のDPAPIマスターキーを利用して、秘密鍵を復号化します。

平文のDPAPIマスターキーを取得するためには、以下のアプローチが使用されます:

# With mimikatz, when running in the user's context
dpapi::masterkey /in:"C:\PATH\TO\KEY" /rpc

# With mimikatz, if the user's password is known
dpapi::masterkey /in:"C:\PATH\TO\KEY" /sid:accountSid /password:PASS

To streamline the decryption of masterkey files and private key files, the certificates command from SharpDPAPI proves beneficial. It accepts /pvk, /mkfile, /password, or {GUID}:KEY as arguments to decrypt the private keys and linked certificates, subsequently generating a .pem file.

# Decrypting using SharpDPAPI
SharpDPAPI.exe certificates /mkfile:C:\temp\mkeys.txt

# Converting .pem to .pfx
openssl pkcs12 -in cert.pem -keyex -CSP "Microsoft Enhanced Cryptographic Provider v1.0" -export -out cert.pfx

DPAPIを介したマシン証明書の盗難 – THEFT3

Windowsによってレジストリ内のHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\SystemCertificatesに保存されているマシン証明書と、それに関連するプライベートキーは、CAPIの場合は%ALLUSERSPROFILE%\Application Data\Microsoft\Crypto\RSA\MachineKeys、CNGの場合は%ALLUSERSPROFILE%\Application Data\Microsoft\Crypto\Keysにある。これらは、マシンのDPAPIマスターキーを使用して暗号化されている。これらのキーは、ドメインのDPAPIバックアップキーでは復号できず、代わりにSYSTEMユーザーのみがアクセスできるDPAPI_SYSTEM LSAシークレットが必要となる。

手動で復号化するには、Mimikatzlsadump::secretsコマンドを実行してDPAPI_SYSTEM LSAシークレットを抽出し、その後、このキーを使用してマシンのマスターキーを復号化する。また、以前に説明したようにCAPI/CNGをパッチした後に、Mimikatzのcrypto::certificates /export /systemstore:LOCAL_MACHINEコマンドを使用することもできる。

SharpDPAPIは、そのcertificatesコマンドを使用することでより自動化されたアプローチを提供する。/machineフラグを昇格権限で使用すると、SYSTEMにエスカレートし、DPAPI_SYSTEM LSAシークレットをダンプし、これを使用してマシンのDPAPIマスターキーを復号化し、その後これらの平文キーをルックアップテーブルとして使用して任意のマシン証明書のプライベートキーを復号化する。

証明書ファイルの検索 – THEFT4

証明書は、ファイル共有やダウンロードフォルダなどのファイルシステム内に直接見つかることがあります。Windows環境向けにターゲットとなる証明書ファイルの最も一般的なタイプは、.pfxおよび.p12ファイルです。頻度は低いですが、.pkcs12および.pemの拡張子を持つファイルも存在します。他にも注目すべき証明書関連のファイル拡張子には次のものがあります:

  • プライベートキー用の.key,

  • 証明書のみのための.crt/.cer,

  • 証明書やプライベートキーを含まない証明書署名リクエスト用の.csr,

  • Javaアプリケーションで使用される証明書とプライベートキーを保持する可能性のあるJava Keystores用の.jks/.keystore/.keys

これらのファイルは、上記の拡張子を検索することでPowerShellやコマンドプロンプトで検索できます。

PKCS#12証明書ファイルが見つかり、パスワードで保護されている場合、pfx2john.pyを使用してハッシュの抽出が可能です。これは、fossies.orgで入手できます。その後、JohnTheRipperを使用してパスワードの解読を試みることができます。

# Example command to search for certificate files in PowerShell
Get-ChildItem -Recurse -Path C:\Users\ -Include *.pfx, *.p12, *.pkcs12, *.pem, *.key, *.crt, *.cer, *.csr, *.jks, *.keystore, *.keys

# Example command to use pfx2john.py for extracting a hash from a PKCS#12 file
pfx2john.py certificate.pfx > hash.txt

# Command to crack the hash with JohnTheRipper
john --wordlist=passwords.txt hash.txt

NTLM資格情報のPKINIT経由での盗難 – THEFT5

与えられた内容は、PKINITを介したNTLM資格情報の盗難方法であるTHEFT5を通じて、NTLM資格情報の盗難方法を説明しています。以下は、受動態で再説明し、必要に応じて内容を匿名化および要約したものです:

KDCは、Kerberos認証を容易にしないアプリケーションのためにNTLM認証[MS-NLMP]をサポートするために、PKCAが利用される際に、特にPAC_CREDENTIAL_INFOバッファ内でユーザーのNTLMワンウェイ関数(OWF)を特権属性証明書(PAC)に返すように設計されています。したがって、アカウントがPKINITを介してチケット発行チケット(TGT)を認証および取得すると、現在のホストがTGTからNTLMハッシュを抽出するための仕組みが提供され、レガシー認証プロトコルを維持します。このプロセスには、NTLM平文のNDRシリアル化された表現であるPAC_CREDENTIAL_DATA構造の復号化が含まれます。

この特定のデータを含むTGTを要求することができるとされるユーティリティKekeoは、https://github.com/gentilkiwi/kekeoで利用可能であり、ユーザーのNTLMを取得することを容易にします。この目的で使用されるコマンドは次のとおりです:

tgt::pac /caname:generic-DC-CA /subject:genericUser /castore:current_user /domain:domain.local

さらに、Kekeoはスマートカードで保護された証明書を処理できることが指摘されています。これは、PINが取得できる場合に適用され、https://github.com/CCob/PinSwipeを参照しています。同様の機能は、Rubeusでもサポートされていることが示されており、https://github.com/GhostPack/Rubeusで入手できます。

この説明は、PKINITを介したNTLM資格情報の盗難に関わるプロセスとツール、PKINITを使用して取得したTGTを介してNTLMハッシュを取得し、このプロセスを容易にするユーティリティに焦点を当てています。

Last updated