初めに
本記事は Hack The Box(以下リンク参照) の「Headless」にチャレンジした際の WriteUp になります。
※以前までのツールの使い方など詳細を書いたものではないのでご了承ください。
※悪用するのはやめてください。あくまで社会への貢献のためにこれらの技術を使用してください。法に触れるので。
初期探索
ポートスキャン
┌──(root㉿kali)-[~/work]
└─# rustscan -a 10.10.11.8 --top --ulimit 5000
.----. .-. .-. .----..---. .----. .---. .--. .-. .-.
| {} }| { } |{ {__ {_ _}{ {__ / ___} / {} \ | `| |
| .-. \| {_} |.-._} } | | .-._} }\ }/ /\ \| |\ |
`-' `-'`-----'`----' `-' `----' `---' `-' `-'`-' `-'
The Modern Day Port Scanner.
________________________________________
: https://discord.gg/GFrQsGy :
: https://github.com/RustScan/RustScan :
--------------------------------------
Real hackers hack time ⌛
[~] The config file is expected to be at "/root/.rustscan.toml"
[~] Automatically increasing ulimit value to 5000.
Open 10.10.11.8:22
Open 10.10.11.8:5000
[~] Starting Script(s)
[>] Script to be run Some("nmap -vvv -p {{port}} {{ip}}")
[~] Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-04-01 09:14 EDT
Initiating Ping Scan at 09:14
Scanning 10.10.11.8 [4 ports]
Completed Ping Scan at 09:14, 0.24s elapsed (1 total hosts)
Initiating Parallel DNS resolution of 1 host. at 09:14
Completed Parallel DNS resolution of 1 host. at 09:14, 0.01s elapsed
DNS resolution of 1 IPs took 0.01s. Mode: Async [#: 1, OK: 0, NX: 1, DR: 0, SF: 0, TR: 1, CN: 0]
Initiating SYN Stealth Scan at 09:14
Scanning 10.10.11.8 [2 ports]
Discovered open port 22/tcp on 10.10.11.8
Discovered open port 5000/tcp on 10.10.11.8
Completed SYN Stealth Scan at 09:14, 0.22s elapsed (2 total ports)
Nmap scan report for 10.10.11.8
Host is up, received reset ttl 63 (0.19s latency).
Scanned at 2024-04-01 09:14:15 EDT for 0s
PORT STATE SERVICE REASON
22/tcp open ssh syn-ack ttl 63
5000/tcp open upnp syn-ack ttl 63
Read data files from: /usr/bin/../share/nmap
Nmap done: 1 IP address (1 host up) scanned in 0.55 seconds
Raw packets sent: 6 (240B) | Rcvd: 3 (128B)
22と5000番Portが公開されている。
一旦ブラウザで5000にアクセスしてみると以下のサイトが見える。

Pythonで作られてる。
サイト探索
ディレクトリ探索
┌──(root㉿kali)-[~/work]
└─# dirsearch -u http://10.10.11.8:5000/
/usr/lib/python3/dist-packages/dirsearch/dirsearch.py:23: DeprecationWarning: pkg_resources is deprecated as an API. See https://setuptools.pypa.io/en/latest/pkg_resources.html
from pkg_resources import DistributionNotFound, VersionConflict
_|. _ _ _ _ _ _|_ v0.4.3
(_||| _) (/_(_|| (_| )
Extensions: php, aspx, jsp, html, js | HTTP method: GET | Threads: 25 | Wordlist size: 11460
Output File: /root/work/reports/http_10.10.11.8_5000/__24-04-01_09-14-38.txt
Target: http://10.10.11.8:5000/
[09:14:38] Starting:
[09:16:16] 401 - 317B - /dashboard
[09:17:32] 200 - 2KB - /support
Task Completed
ブラウジング
/supportは何やらコンタクトフォームっぽい。
/dashboardは以下のようにアクセス出来なかった。

Burpで確認するとCookieのis_adminで判断してるのかな?

そうっぽい

"admin"のBase64で飛ばしても500 Errorが帰ってくる。
認証系のエラーじゃなくて500番台なので何かデコードエラーになってそう。
一旦置いておいて別の/supportページを探ります。
色々Payloadを送っていると以下のページに飛ばされる。

お、Header表示される!ならデータやクエリじゃなくてHeaderにPayloadを差し込み方針で!
イニシャルアクセス
SSTI
とりあえず王道のSSTIで

User-Agentに叩き込んでもダメだった。
XSS
Hacking Attempt Detectedでadministratorに送って調査しますとか言ってるので、もしかしたらクライアント側への攻撃刺さるのかな?とエスパーします。
ならXSS...ほぼHTBで見かけたことなかったこの脆弱性を使う。HTBよりリアルワールドでみる脆弱性です。
ブラウザで発火するか見たいのでBurpのインターセプト機能を使ってUser-Agentを改ざんする。

書き換えたらForwardします。

入った!
後はPayloadを送信しまくります。

とか

とか。受け側は以下で用意しておきます。
┌──(root㉿kali)-[~/work]
└─# python3 -m http.server 80

何回か試していたらきました!これでadminとして色々できそう。
とりあえず401だった階層にいってみます。
Cookie-Editorで簡易に設定して...


入ることができました!
Foothold
RCE
Generate Reportのリクエストをインターセプトからキャッチします。
その後飛ばしてみます。

右下見ると大体0.2秒くらいですね。
とりあえず;入れてsleep 5挟みます。

5.2秒くらいで帰ってきてるのでRCEが刺さりそうですね。
pingも刺してみます。
以下で受け側を用意しておきます。
┌──(root㉿kali)-[~/work]
└─# tcpdump -i tun0 icmp
Revshell
以下の御用達のサイトでPayloadを作成します。

そのままこれを叩き込みます。

来ました!!!
これでUserフラグゲットです!!!
interactive shell
一応Shellを安定させます。
dvir@headless:~/app$
zsh: suspended nc -lnvp 4444
┌──(root💀kali)-[~]
└─# stty raw -echo; fg
[1] + continued nc -lnvp 4444
export TERM=xterm
dvir@headless:~/app$ export SHELL=bash
dvir@headless:~/app$ reset
これで矢印キーやTab補完が効きます。
権限昇格
sudo -l
初手と言えばこれでしょう!
dvir@headless:~/app$ sudo -l
Matching Defaults entries for dvir on headless:
env_reset, mail_badpass,
secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin,
use_pty
User dvir may run the following commands on headless:
(ALL) NOPASSWD: /usr/bin/syscheck
dvir@headless:~/app$
ほう?何やらshellぽいので中身を確認します。
dvir@headless:~$ cat /usr/bin/syscheck
#!/bin/bash
if [ "$EUID" -ne 0 ]; then
exit 1
fi
last_modified_time=$(/usr/bin/find /boot -name 'vmlinuz*' -exec stat -c %Y {} + | /usr/bin/sort -n | /usr/bin/tail -n 1)
formatted_time=$(/usr/bin/date -d "@$last_modified_time" +"%d/%m/%Y %H:%M")
/usr/bin/echo "Last Kernel Modification Time: $formatted_time"
disk_space=$(/usr/bin/df -h / | /usr/bin/awk 'NR==2 {print $4}')
/usr/bin/echo "Available disk space: $disk_space"
load_average=$(/usr/bin/uptime | /usr/bin/awk -F'load average:' '{print $2}')
/usr/bin/echo "System load average: $load_average"
if ! /usr/bin/pgrep -x "initdb.sh" &>/dev/null; then
/usr/bin/echo "Database service is not running. Starting it..."
./initdb.sh 2>/dev/null
else
/usr/bin/echo "Database service is running."
fi
exit 0
dvir@headless:~$
./initdb.shに悪性コードを叩き込めそうですね。
malicious shell
悪性Shellを用意します。先ほどのサイトで作成できます。

以下HTTPサーバを用意してwgetして転送をします。
┌──(root㉿kali)-[~/work]
└─# python3 -m http.server 80
あとは実行権限を付けた後に回すだけ。


Rootきました!勝った!!!
まとめ

これで特権昇格に成功し、Root権限奪取に成功しました。
今回のBoxは初手さえクリアすれば後はスラスラ解けると思います。
XSS全然触ってなかったのでPayloadチラ見したです。
今回もセキュリティエンジニアの皆さんの助けになればなと思います。
