0x00 簡介
ntopng是原始ntop的下一代版本,它是一種監視網絡使用情況的網絡流量探測器。ntopng是基于libpcapa的,它是以一種可移植的方式編寫的,以便在每個Unix平台、MacOSX和Windows上都能運作,它提供了一個直覺、加密的web使用者界面,用于探索實時和曆史交通資訊。
0x01 漏洞概述
Ntopng對外提供web頁面,其4.2及其以前版本web接口的權限認證繞過,導緻攻擊者可以在未授權的情況下請求符合漏洞利用條件的接口,并最終利用伺服器端請求僞造和高危服務實作遠端代碼執行。ntopng 的 Web 界面由 Lua 開發,對于 HTTP 請求的處理、認證相關的邏輯由後端 C++ 負責,檔案為 HTTPswever.cpp。
對于一個 HTTP 請求來說,ntopng 的主要處理邏輯代碼都在 handle_lua_request函數中,ntopng 調用 snprintf 将使用者請求的 URI 寫入到 path 數組中,而 snprintf 會在字元串結尾添加\0。由于 path 數組長度有限,即使使用者傳入超過 255 個字元的路徑,也隻會寫入前 254 個字元,我們可以通過填充 ./來構造一個長度超過 255 但是合法的路徑,并利用長度限制來截斷後面的 .css.lua,即可繞過 ntopng 的認證以通路部分 Lua 檔案。
其相關代碼如下:
char path[255] = { 0 }, uri[2048];
struct stat buf;
bool found;
...
if(strlen(path) > 4 && strncmp(&path[strlen(path) - 4], ".lua", 4))
snprintf(&path[strlen(path)], sizeof(path) - strlen(path) - 1, "%s",
(char*)".lua");
ntop->fixPath(path);
found = ((stat(path, &buf) == 0) && (S_ISREG(buf.st_mode))) ? true : false;
if(found) {
...
l = new LuaEngine(NULL);
...
l->handle_script_request(conn, request_info, path, &attack_attempt, username,
group, csrf, localuser);
0x02 影響範圍
ntopng commit < e8b9721479f401f595c5c7bb151819aceb03ad71
0x03 環境搭建
1.安裝虛拟機應用程式(本次測試使用的是VMware Workstation Pro16.1版本)
虛拟機的擷取和安裝可自行上網搜尋相關教程
2.通過 vulhub 搭建 ntopng 環境
https://github.com/vulhub/vulhub/tree/master/ntopng/CVE-2021-28073
3.啟動容器
docker-compose up -d
檢視容器,啟動成功
4.通路登入頁面
http://192.168.141.131:3000
輸入賬号密碼 admin/admin 進行登入,進去重置一下密碼
得到如下界面,即搭建成功
0x04 漏洞複現
1.使用poc進行驗證
計算出ntopng lua目錄的長度
python3 poc.py --url http://192.168.141.131:3000/ baselength
浏覽我們想要未經授權通路的頁面或界面,如
/lua/find_prefs.lua
,會被重定向到登入頁面。
python3 poc.py --url http://192.168.141.131:3000/ generate -l 36 -p find_prefs.lua
直接通路回顯的 url 即可未經授權進行通路
0x05 防護建議
1)将ntopng更新至相關commit記錄之後
https://github.com/ntop/ntopng/commit/e8b9721479f401f595c5c7bb151819aceb03ad71
2)若無需求,将其功能設定為僅對可信位址開放