TwoMillion
Lab 連結:Hack The Box - TwoMillion
我的 IP:10.10.11.221
任務 1
有多少 TCP Port 是開啟的?
使用 nmap
掃描目標,發現開啟的 Port 有:
22
(SSH)80
(HTTP)
答案:2(個)
任務 2
/invite
頁面載入的與邀請碼有關的 JavaScript 檔案的名稱是什麼?
如果嘗試直接使用 IP 去連線的話會被轉址,所以我們需要到 /etc/hosts
最後新增以下內容就能正常連線。
1 | 10.10.11.221 2million.htb |
再來進入到 /invite
並使用瀏覽器開發者工具的 Network 分析,找到相關的 JavaScript 檔案:
相關的 JavaScript 檔案為 inviteapi.min.js
任務 3
邀請頁面上的哪個 JavaScript 函數傳回如何取得邀請碼的第一個提示?答案中不要包含()。
分析 inviteapi.min.js
,可在程式碼中發現 function makeInviteCode 是用來生成邀請碼的 function。
1 | eval(function(p, a, c, k, e, d) { |
發現在最後 return 其中一個項目為 makeInviteCode
答案:makeInviteCode
任務 4
makeInviteCode
中的端點傳回加密資料。該訊息提供了另一個查詢端點。此端點傳回一個使用非常常見的二進位到文字編碼格式編碼的 code。該編碼的名稱是什麼?
在瀏覽器 Console 執行 makeInviteCode()
,回傳資訊包含 enctype: "ROT13"
。
進行 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 |
1 | {"0":200,"success":1,"data":{"code":"SVJRUUEtRlJUS0stVFVaNzQtU0E3WkI=","format":"encoded"}} |
在回傳的訊息中,又提示到 “format”:”encoded”,我們需要再將 code 做解碼,而這串 code 的特徵是後方的等號(=),可以直接推測是透過 base64 編碼而成,因此我們需透過 base64 解碼。
該編碼格式為 Base64,經解碼後獲得邀請碼:
1 | IRQQA-FRTKK-TUZ74-SA7ZB |
同時也得知這題的答案為 base64
任務 5
當使用者點擊「Connection Pack」時,頁面使用的端點路徑是什麼?
在任務 4 時,我們已經有邀請碼了,可以先透過邀請碼進行註冊。
進入首頁後,點選在左方的側邊欄中的 Labs > Access
使用 Burp Suite 攔截請求,發現頁面發送了一個 GET 請求至:
1 | GET /api/v1/user/vpn/generate |
答案:/api/v1/user/vpn/generate
任務 6
/api/v1/admin
下有多少個 API 端點?
根據上一題的 API 使用,我們知道 API 路徑為 /api/v1/
,因此我們能直接查看該 API 底下有哪些功能
1 | { |
檢查 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
我們將目標鎖定在 /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 | { |
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 | { |
確定接收到 shell 後,就可以讀取 admin 家目錄的 flag 了
任務 11
發送給 admin 的電子郵件的寄件者的電子郵件地址是什麼?
mail 會被存放在 /var/mail/cat /var/mail/admin
內容為
1 | From: ch4p <[email protected]> |
我們從 From 得知是由 [email protected]
寄送的
任務 12
2023 年有關允許攻擊者在 Overlay 檔案系統中移動檔案,同時保留元數據(例如擁有者和 SetUID 位)的漏洞的 CVE ID 是什麼?
查詢後得知 CVE-2023-0386
任務 13
提交 root 使用者家目錄中的 flag
我們知道有該 CVE 可以使用後,上網搜尋 CVE-2023-0386 exploit
,並將檔案放到把機上
在把機上執行 exploit 取得 root 權限
透過 root 權限輸出 root 家目錄的 flag 為 b992fe6eec81e0d0915629fe90495b38
任務 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 來取得權限