0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
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 文件。
其相关代码如下:
charpath[255] ={ 0}, uri[2048];
structstatbuf;
boolfound;
...
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=newLuaEngine(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
查看容器,启动成功
docker ps
4.访问登录页面
http://192.168.141.131:3000
输入账号密码 admin/admin 进行登录,进去重置一下密码
得到如下界面,即搭建成功
0x04 漏洞复现
1.使用poc进行验证
计算出ntopng lua目录的长度
python3 poc.py --urlhttp://192.168.141.131:3000/ baselength
浏览我们想要未经授权访问的页面或界面,如/lua/find_prefs.lua
,会被重定向到登录页面。
python3 poc.py --urlhttp://192.168.141.131:3000/ generate -l36-pfind_prefs.lua
直接访问回显的 url 即可未经授权进行访问
0x05 防护建议
1)将ntopng更新至相关commit记录之后
https://github.com/ntop/ntopng/commit/e8b9721479f401f595c5c7bb151819aceb03ad71
2)若无需求,将其功能设置为仅对可信地址开放
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)