【Hack The Box】Headless【WriteUp】

# 初めに
本記事は ___Hack The Box___(以下リンク参照) の「___Headless___」にチャレンジした際の ___WriteUp___ になります。
※以前までのツールの使い方など詳細を書いたものではないのでご了承ください。

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

https://www.hackthebox.com/

# 初期探索
## ポートスキャン
```bash
┌──(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にアクセスしてみると以下のサイトが見える。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/4d97212d-828a-81db-6a79-383b1d8122fe.png)
Pythonで作られてる。
## サイト探索
### ディレクトリ探索
```bash
┌──(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`は以下のようにアクセス出来なかった。
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/d0a052c2-a3ce-19eb-a2d1-a142efc35fa7.png)
Burpで確認するとCookieの`is_admin`で判断してるのかな？
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/6ce4cbb5-0db5-723a-3bac-5cf10412ea34.png)
そうっぽい
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/b024b24a-5851-c8c4-050c-f968c4cd4aa2.png)
`"admin"`のBase64で飛ばしても500 Errorが帰ってくる。
認証系のエラーじゃなくて500番台なので何かデコードエラーになってそう。
一旦置いておいて別の`/support`ページを探ります。

色々Payloadを送っていると以下のページに飛ばされる。
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/56dc1856-121d-f39c-a2de-ac9c535e5217.png)
お、Header表示される！ならデータやクエリじゃなくてHeaderにPayloadを差し込み方針で！

# イニシャルアクセス
## SSTI
とりあえず王道のSSTIで
![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/db371c4b-0e5b-99ed-995b-e102894953d9.png)
User-Agentに叩き込んでもダメだった。
## XSS
`Hacking Attempt Detected`で`administrator`に送って調査しますとか言ってるので、もしかしたらクライアント側への攻撃刺さるのかな？とエスパーします。
ならXSS...ほぼHTBで見かけたことなかったこの脆弱性を使う。HTBよりリアルワールドでみる脆弱性です。
ブラウザで発火するか見たいのでBurpのインターセプト機能を使ってUser-Agentを改ざんする。
![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/17b54eda-ef4c-7ca5-d741-9c9577479bd2.png)
書き換えたらForwardします。
![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/9911a006-2f88-10c7-65ff-f46c644c9992.png)
入った！
後はPayloadを送信しまくります。
![9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/e1ba08f5-fa0e-b4d9-a706-46c76a920862.png)
とか
![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/ce6a349f-b5f7-2845-e955-50f67be14291.png)
とか。受け側は以下で用意しておきます。
```bash
┌──(root㉿kali)-[~/work]
└─# python3 -m http.server 80
```
![11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/3718ed9b-c2da-1e44-3ac9-6a69d6d86682.png)
何回か試していたらきました！これでadminとして色々できそう。
とりあえず401だった階層にいってみます。
Cookie-Editorで簡易に設定して...
![12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/f092926f-d070-6cbb-fca5-ed54f5db20f4.png)
![13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/25edb8c5-9540-43e1-0466-d5e05c1ee402.png)
入ることができました！
# Foothold
## RCE
Generate Reportのリクエストをインターセプトからキャッチします。
その後飛ばしてみます。
![14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/2b1db4a6-b64e-6f36-5c00-d6ddcb52313a.png)
右下見ると大体0.2秒くらいですね。
とりあえず`;`入れて`sleep 5`挟みます。
![15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/abd780fc-30ea-7fd3-4f03-0997068b1798.png)
5.2秒くらいで帰ってきてるのでRCEが刺さりそうですね。
pingも刺してみます。
以下で受け側を用意しておきます。
```bash
┌──(root㉿kali)-[~/work]
└─# tcpdump -i tun0 icmp
```
![16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/4566a0c3-2476-3148-1fd8-ede194488a6f.png)
通りました！
## Revshell
以下の御用達のサイトでPayloadを作成します。

https://www.revshells.com/

![17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/5870b1dc-c1fa-6e63-9fca-f4487b383ac0.png)
そのままこれを叩き込みます。
![18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/ac263b0e-deaa-f8e8-ea33-02a225075963.png)
来ました！！！
これでUserフラグゲットです！！！
## interactive shell
一応Shellを安定させます。
```bash
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
初手と言えばこれでしょう！
```bash
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ぽいので中身を確認します。
```bash
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を用意します。先ほどのサイトで作成できます。
![19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/f2eeddb1-7cc5-8b7c-d9ed-df7400b4bb37.png)
以下HTTPサーバを用意して`wget`して転送をします。
```bash
┌──(root㉿kali)-[~/work]
└─# python3 -m http.server 80
```
あとは実行権限を付けた後に回すだけ。
![20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/66b9c455-73a7-72be-49e6-bdc8568a3d25.png)
![21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/c0609605-5a2a-e31d-379a-9e60295db35b.png)
Rootきました！勝った！！！

# まとめ
![22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/057b1882-e3b9-cf07-d7a5-b1880a4b227c.png)
これで特権昇格に成功し、Root権限奪取に成功しました。
今回のBoxは初手さえクリアすれば後はスラスラ解けると思います。
XSS全然触ってなかったのでPayloadチラ見したです。

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