AD CS Certificate Theft

Support HackTricks

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

What can I do with a certificate

証明書を盗む方法を確認する前に、証明書が何に役立つかを見つけるための情報があります:

# 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

Exporting Certificates Using the Crypto APIs – 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のメモリをターゲットにしてパッチを適用します。

User Certificate Theft via DPAPI – THEFT2

DPAPIに関する詳細情報は以下を参照してください:

DPAPI - 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

マスタキーファイルとプライベートキーファイルの復号化を効率化するために、SharpDPAPIcertificates コマンドが有益です。このコマンドは、プライベートキーと関連する証明書を復号化するために、/pvk/mkfile/password、または {GUID}:KEY を引数として受け取り、その後 .pem ファイルを生成します。

# 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

Machine Certificate Theft via DPAPI – THEFT3

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

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

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

Finding Certificate Files – THEFT4

証明書は、ファイル共有やダウンロードフォルダなど、ファイルシステム内に直接見つかることがあります。Windows環境を対象とした最も一般的に遭遇する証明書ファイルの種類は、.pfxおよび.p12ファイルです。頻度は低いですが、.pkcs12および.pem拡張子のファイルも現れます。その他の注目すべき証明書関連のファイル拡張子には以下が含まれます:

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

  • 証明書のみの.crt/.cer

  • 証明書やプライベートキーを含まない証明書署名要求用の.csr

  • Javaアプリケーションで使用される証明書とプライベートキーを保持する可能性のあるJavaキーストア用の.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 Credential Theft via PKINIT – THEFT5

与えられた内容は、PKINITを介したNTLM資格情報の盗難の方法、特にTHEFT5とラベル付けされた盗難方法について説明しています。以下は、受動態での再説明であり、内容は匿名化され、適用可能な場合は要約されています。

Kerberos認証をサポートしないアプリケーションのためにNTLM認証[MS-NLMP]を提供するために、KDCはPKCAが利用されるときに、特にPAC_CREDENTIAL_INFOバッファ内の特権属性証明書(PAC)内にユーザーのNTLM一方向関数(OWF)を返すように設計されています。したがって、アカウントがPKINITを介して認証し、チケット授与チケット(TGT)を取得すると、現在のホストがTGTからNTLMハッシュを抽出してレガシー認証プロトコルを維持するためのメカニズムが本質的に提供されます。このプロセスは、NTLMプレーンテキストのNDRシリアライズされた表現であるPAC_CREDENTIAL_DATA構造の復号化を含みます。

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

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

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

この説明は、PKINITを介したNTLM資格情報の窃取に関与するプロセスとツールを要約しており、PKINITを使用して取得したTGTを通じてNTLMハッシュを取得することに焦点を当て、これを容易にするユーティリティについて説明しています。

Support HackTricks

Last updated