hacktricks/windows-hardening/active-directory-methodology/ad-certificates/certificate-theft.md
2023-07-07 23:42:27 +00:00

13 KiB
Raw Blame History

AD CS 証明書の盗難

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

証明書で何ができるか

証明書を盗む方法を確認する前に、証明書がどのように役立つかについての情報をいくつか紹介します。

# 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 CryptoAPICAPIまたはより新しいCryptography API: Next GenerationCNGを使用しています。これらのAPIは、証明書の保存と認証に必要なさまざまな暗号化サービスを提供します他の用途も含まれます

もし秘密鍵がエクスポート不可能であれば、CAPIとCNGはエクスポート不可能な証明書の抽出を許可しません。Mimikatzcrypto::capiおよびcrypto::cngコマンドを使用すると、CAPIとCNGをパッチして秘密鍵のエクスポートを許可することができます。crypto::capiは現在のプロセスでCAPIをパッチしますが、crypto::cnglsass.exeのメモリをパッチする必要があります。

DPAPIを使用したユーザー証明書の盗難 - THEFT2

DPAPIについての詳細は次の場所で確認できます

{% content-ref url="../../windows-local-privilege-escalation/dpapi-extracting-passwords.md" %} dpapi-extracting-passwords.md {% endcontent-ref %}

Windowsは、証明書の秘密鍵をDPAPIを使用して保存します。Microsoftは、ユーザーとマシンの秘密鍵の保存場所を分けています。暗号化されたDPAPIのブロブを手動で復号化する場合、開発者はOSが使用した暗号化APIを理解する必要があります。なぜなら、秘密鍵ファイルの構造は2つのAPI間で異なるからです。SharpDPAPIを使用すると、これらのファイル形式の違いを自動的に考慮します。

Windowsは、ユーザー証明書を一般的にはレジストリの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
## Running in a process in the users context
dpapi::masterkey /in:"C:\PATH\TO\KEY" /rpc

# with mimikatz
## knowing the users password
dpapi::masterkey /in:"C:\PATH\TO\KEY" /sid:accountSid /password:PASS

マスターキーファイルとプライベートキーファイルの復号を簡素化するために、SharpDPAPIcertificatesコマンドを使用できます。/pvk/mkfile/password、または{GUID}:KEY引数を使用して、プライベートキーと関連する証明書を復号し、.pemテキストファイルを出力します。

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

# Transfor .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 に保存し、プライベートキーはアカウントによって異なる場所に保存します。
SharpDPAPIはこれらの場所すべてを検索しますが、最も興味深い結果は %ALLUSERSPROFILE%\Application Data\Microsoft\Crypto\RSA\MachineKeysCAPIおよび %ALLUSERSPROFILE%\Application Data\Microsoft\Crypto\KeysCNGから得られます。これらのプライベートキーマシン証明書ストアに関連付けられており、WindowsはこれらをマシンのDPAPIマスターキーで暗号化します。
これらのキーはドメインのDPAPIバックアップキーを使用して復号することはできませんが、代わりにシステムのDPAPI_SYSTEM LSAシークレットを使用する必要があります。このシークレットはSYSTEMユーザーのみがアクセスできます

Mimikatzの**lsadump::secretsコマンドを使用してこれを手動で行い、抽出したキーを使用してマシンマスターキー復号化することができます。
また、CAPI/CNGを以前と同じようにパッチし、Mimikatzcrypto::certificates /export /systemstore:LOCAL_MACHINEコマンドを使用することもできます。
SharpDPAPIのcertificatesコマンドには
/machineフラグがあります(昇格している場合)、これにより自動的にSYSTEMに昇格**し、DPAPI_SYSTEM LSAシークレットをダンプし、これを使用してマシンのDPAPIマスターキーを復号化し、キーの平文をルックアップテーブルとして使用してマシン証明書のプライベートキーを復号化します。

証明書ファイルの検索 THEFT4

時には証明書がファイルシステムにあることがあります。たとえば、ファイル共有やダウンロードフォルダにあります。
私たちがよく見るWindowsに焦点を当てた証明書ファイルの一般的なタイプは、.pfx.p12 ファイルです。.pkcs12.pem も時々現れますが、頻度は低いです。
他にも興味深い証明書関連のファイル拡張子には、.key(プライベートキー)、.crt/.cer(証明書のみ)、.csr(証明書署名要求、証明書やプライベートキーは含まれていません)、.jks/.keystore/.keysJavaキーストア。Javaアプリケーションで使用される証明書とプライベートキーが含まれる場合がありますがあります。

これらの拡張子を使用して、PowerShellまたはコマンドプロンプトで検索すれば、これらのファイルを見つけることができます。

もしPKCS#12証明書ファイルを見つけ、それがパスワードで保護されている場合、pfx2john.pyを使用してハッシュを抽出し、JohnTheRipperを使用してクラックすることができます。

PKINITを介したNTLM資格情報の盗難 THEFT5

NTLM認証をサポートするために、Kerberos認証をサポートしないネットワークサービスに接続するアプリケーションに対して、PKCAが使用される場合、KDCは特権属性証明書PACの**PAC_CREDENTIAL_INFO**バッファにユーザーのNTLMワンウェイ関数OWFを返します。

したがって、アカウントが認証され、PKINITを介してTGTを取得した場合、現在のホストはTGTからNTLMハッシュを取得するための組み込みの「failsafe」があります。これには、NTLM平文の**PAC_CREDENTIAL_DATA構造を復号化**することが含まれます。この構造は、NTLM平文のネットワークデータ表現NDRシリアル化表現です。

Kekeoを使用して、この情報を含むTGTを要求し、ユーザーのNTLMハッシュを取得することができます。

tgt::pac /caname:thename-DC-CA /subject:harmj0y /castore:current_user /domain:domain.local

Kekeoの実装は、PINを回復**することができれば、現在接続されているスマートカードで保護された証明書でも動作します。**また、Rubeusでもサポートされます。

参考文献

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥