AD CS 証明書の盗難

Reading time: 13 minutes

tip

AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを学び、実践する:HackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポートする

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

証明書で何ができるか

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

bash
# 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

証明書のエクスポート – 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に関する詳細は以下を参照してください:

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マスタキーを取得するために、以下のアプローチを使用できます:

bash
# 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 ファイルを生成します。

bash
# 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

マシン証明書の窃盗 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マスタキーを復号化し、これらの平文キーをルックアップテーブルとして使用して任意のマシン証明書の秘密鍵を復号化します。

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

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

  • 秘密鍵用の .key
  • 証明書のみのための .crt/.cer
  • 証明書や秘密鍵を含まない証明書署名要求用の .csr
  • Javaアプリケーションで使用される証明書と秘密鍵を保持する可能性のある Javaキーストア用の .jks/.keystore/.keys

これらのファイルは、PowerShellやコマンドプロンプトを使用して、前述の拡張子を探すことで検索できます。

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

bash
# 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 (UnPAC the hash)

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

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

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

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

Rubeus は、オプション asktgt [...] /getcredentials を使用してこの情報を取得することもできます。

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

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

tip

AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを学び、実践する:HackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポートする