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)若无需求,将其功能设置为仅对可信地址开放