ntopng 权限绕过漏洞(CVE-2021-28073)深度分析与复现指南
1. 漏洞初探ntopng权限绕过漏洞CVE-2021-28073到底是什么如果你负责维护公司的网络或者对流量监控工具感兴趣那你很可能听说过ntopng。它是一款非常流行的开源网络流量监控与分析工具提供了一个直观的Web界面让你能像看仪表盘一样实时查看谁在访问什么、流量有多大、有没有异常连接。简单说它就是网络管理员的“眼睛”。但就在2021年这双“眼睛”被发现了一个严重的“视力缺陷”——CVE-2021-28073一个权限绕过漏洞。这个漏洞的严重性在于攻击者不需要知道管理员密码就能直接“看”到所有本应受保护的监控数据甚至可能进行进一步操作。我打个比方这就像你家装了智能门锁和监控摄像头ntopng只有家人授权用户通过密码或指纹才能登录手机App查看实时画面。但这个漏洞的存在相当于有人在门外发现了一种特殊的敲门节奏特定的URL构造方式只要按照这个节奏敲门门锁系统就会误以为是家人在屋内操作直接把所有监控画面的访问权限交出来而敲门的人根本不需要知道密码。更危险的是这个漏洞影响的是4.2及之前的所有版本这意味着大量在用的、未及时升级的系统都暴露在风险之下。那么这个漏洞的核心问题出在哪呢它不是传统的密码爆破也不是SQL注入而是一个路径遍历和权限校验逻辑缺陷的结合体。ntopng的Web界面有很多以.lua结尾的脚本文件来处理数据这些脚本本应检查访问者是否已经登录。但是在验证逻辑上存在一个绕过的可能。攻击者可以通过构造一个特殊的URL在这个URL中插入大量的../或其URL编码形式%2e%2f使得最终服务器在处理这个请求时错误地跳过了登录检查直接执行了目标脚本。这就好比你要去公司保密仓库受保护的Lua脚本正常需要在前台登录检查点刷卡验证。但这个漏洞让你找到了一条后巷你通过在后巷里绕了很多圈添加大量../让系统以为你是从公司内部另一个公共区域无需验证的区域走过来的从而骗过了前台的检查直接进入了仓库。理解这个漏洞不仅对安全研究人员分析漏洞模式有帮助对于运维人员来说更是敲响了警钟即使是成熟的开源监控工具也需定期更新和进行安全评估。接下来我们就一起深入这个漏洞的“心脏”看看它到底是怎么运作的并亲手把它复现出来。2. 漏洞原理深度拆解路径遍历如何骗过权限校验要真正理解CVE-2021-28073我们不能停留在“有个漏洞”的层面得钻进去看看代码或者说逻辑到底哪里“短路”了。虽然我们不一定有真实的源代码但通过漏洞披露信息和复现过程可以清晰地还原其原理。这个漏洞的本质是路径标准化处理与权限检查的顺序错位或者说权限检查发生在了一个“错误”的路径上。ntopng的Web接口访问流程大致是这样的当你访问http://目标地址:3000/lua/get_flows_data.lua时Web服务器通常是nginx配合一个Lua处理器会接收到这个请求。服务器端逻辑大概会做两件事第一检查当前请求是否访问的是需要认证的资源比如.lua脚本第二如果需要认证则检查用户的会话Session是否有效无效则重定向到登录页面。问题就出在第一步的“检查”所依据的“路径”上。攻击者构造的恶意URL长这个样子http://目标地址:3000/lua/大量%2e%2fget_flows_data.lua.css。这里有几个关键点大量%2e%2f这是URL编码后的../意思是“向上级目录跳转”。在文件路径中../../这样的字符串会被操作系统或Web服务器“标准化”为真实的路径。攻击者就是利用了这一点。末尾的.css这是一个重要的“障眼法”。它让请求看起来像是在访问一个静态CSS文件而静态文件通常是不需要登录验证的。这可能会影响服务器前期的路由判断。现在我们模拟一下有漏洞的ntopng处理这个请求的过程步骤A初始路径判断服务器收到请求看到路径是/lua/大量%2e%2fget_flows_data.lua.css。它可能先根据后缀.css初步将其归类为静态资源请求或者至少没有立即触发严格的Lua脚本认证流程。步骤B路径标准化在真正将请求交给对应的处理器比如Lua解释器之前Web服务器或应用框架会对路径进行“标准化”Normalization处理。这个过程会解析并消除路径中的..。例如如果基础路径是/usr/local/ntopng/www/lua/那么/lua/../../get_flows_data.lua标准化后就会变成/get_flows_data.lua。在这个漏洞中由于插入了海量的../标准化后的路径可能会“回退”到Web根目录之外或者回退到一个非常短的、预期之外的路径。步骤C权限校验关键来了有漏洞的版本似乎在路径标准化之后才用标准化前的路径或者一个中间状态的路径去匹配“哪些路径需要认证”的规则。它可能仍然看着那个带着.css的原始URL或者一个被部分处理但尚未完成标准化的路径认为“哦这是个CSS文件请求或者这个路径不在需要认证的列表里”于是放行了。步骤D请求处理请求被放行后最终交给Lua处理器执行。此时处理器拿到的是标准化之后的、正确的路径/get_flows_data.lua并成功执行了这个本应受保护的脚本返回了敏感的流量数据。简单总结就是检查锁权限校验的时候看的是伪装后的门畸形路径而真正开门处理请求的时候却打开了真正的宝库目标Lua脚本。这种“表里不一”的处理顺序就是权限被绕过的根本原因。这种漏洞在Web安全中有一个经典的名称路径遍历认证绕过。它提醒我们安全校验必须基于最终、最规范化的资源标识来进行任何中间状态的判断都可能被攻击者利用。3. 环境搭建与准备打造你的漏洞复现实验室光说不练假把式咱们得亲手把这个漏洞“造”出来再把它“挖”出来理解才会深刻。别担心整个过程我会一步步带着你走就像我当时第一次复现时一样。我们首先需要一个存在漏洞的ntopng环境。最安全、最方便的方法就是在虚拟机里用Docker搭建。3.1 基础环境准备你需要一台安装好Docker和Docker Compose的Linux机器我个人用的是Ubuntu 22.04Windows和macOS用户也可以使用Docker Desktop。确保你的网络通畅能拉取Docker镜像。打开终端我们先创建一个专门的工作目录mkdir -p ~/cve-2021-28073-lab cd ~/cve-2021-28073-lab3.2 拉取漏洞版本镜像ntopng的官方Docker镜像在Docker Hub上。我们需要拉取一个受影响的版本比如4.2。在终端执行docker pull ntop/ntopng:4.2这个镜像大概有几百MB下载速度取决于你的网络。拉取完成后你可以用docker images命令确认一下镜像是否存在。3.3 编写Docker Compose配置文件直接运行docker命令参数比较多我们用docker-compose.yml来管理这样更清晰也方便以后重现。在工作目录下创建一个名为docker-compose.yml的文件version: 3.8 services: ntopng-vulnerable: image: ntop/ntopng:4.2 container_name: ntopng_cve_2021_28073 ports: - 3000:3000 # 将容器的3000端口映射到主机的3000端口 environment: - GLOBAL_INSTALLATION_PREFIX/usr/local/ntopng - LOCAL_INSTALLATION_PREFIX/usr/local/ntopng volumes: - ./ntopng-data:/var/lib/ntopng # 持久化数据避免容器重启后数据丢失 - ./ntopng-logs:/var/log/ntopng restart: unless-stopped networks: - ntopng-net networks: ntopng-net: driver: bridge这个配置做了几件事指定了镜像版本、设置了容器名称、映射了Web访问端口3000、设置了一些环境变量模拟常见安装路径并挂载了数据卷以便数据持久化。GLOBAL_INSTALLATION_PREFIX这个环境变量很重要它会影响ntopng内部认为的安装基础路径长度而这个长度值正是我们后续利用漏洞时需要计算的关键参数。3.4 启动漏洞环境保存好docker-compose.yml文件后在同一个目录下运行docker-compose up -d-d参数表示在后台运行。用docker-compose ps可以查看容器状态显示为“Up”就说明启动成功了。现在你可以在浏览器里访问http://你的虚拟机IP:3000了。第一次访问可能会让你设置管理员密码我们这里就按最常见的默认设置用户名admin密码admin。登录后你就能看到ntopng的监控界面了。如果还没数据可以尝试在服务器上生成一些网络流量比如ping几个外网地址或者用curl下载点东西这样界面上就会有图表显示。至此一个鲜活的、带有CVE-2021-28073漏洞的ntopng 4.2环境就准备就绪了。它就像我们为研究病毒而培养的“毒株”完全在可控的隔离环境中可以放心地进行接下来的漏洞复现操作。4. 漏洞复现实战一步步触发权限绕过环境准备好了现在我们化身“攻击者”尝试在不登录的情况下拿到本应受保护的数据。我们将严格按照发现者公开的PoC概念验证思路来操作并解释每一步背后的含义。你需要准备一个可以运行Python的环境并安装好requests库pip install requests。4.1 理解PoC脚本的核心逻辑网上公开的PoC脚本就是我们输入信息里那个看起来有点复杂但其实它主要干三件事探测目标检查指定的URL是不是一个ntopng服务。计算关键长度计算出目标ntopng安装的“基础路径长度”。这个长度值因安装方式Docker、源码编译、包管理安装和路径不同而不同是构造有效攻击URL的前提。生成绕过URL利用计算出的长度构造出那个包含大量%2e%2f的特殊URL。我们把脚本保存下来我给它起个名叫做ntopng_bypass.py并稍微调整一下格式以便理解。核心函数get_base_length的原理是它不断尝试增加%2e%2f的数量去访问一个已知存在的、但不需要认证的静态文件比如as_stats.lua.css的假请求直到请求成功状态码不是3xx重定向。成功的那一刻意味着我们添加的..数量刚好让标准化后的路径“落”在了某个不需要认证的目录或文件上结合固定的路径长度限制PoC中假设是255字节反推出基础安装路径的长度。4.2 第一步计算基础路径长度假设我们漏洞环境的地址是http://localhost:3000。打开终端进入保存脚本的目录运行python3 ntopng_bypass.py --url http://localhost:3000 baselength如果一切正常脚本会输出一个数字比如36。这个数字就是base_length代表了从Web根目录到ntopng的Lua脚本目录的“距离”在路径字符串中的长度。这个值至关重要因为我们要构造的URL总长度经过某种计算后需要满足一个特定的条件才能触发漏洞。你可以把这个过程想象成配一把万能钥匙必须先量准锁芯的深度基础路径长度才能锉出正确的齿形../的数量。4.3 第二步生成绕过特定接口的URL拿到base_length例如36后我们就可以针对我们想未授权访问的接口生成攻击URL了。比如我们想访问那个获取流数据的接口get_flows_data.lua。运行命令python3 ntopng_bypass.py --url http://localhost:3000 generate -l 36 -p get_flows_data.lua脚本会输出一个长长的URL格式类似于http://localhost:3000/lua/%2e%2f%2e%2f...%2e%2fget_flows_data.lua.css中间的部分是数十个重复的%2e%2f。4.4 第三步验证漏洞最关键的一步来了。请打开一个全新的浏览器窗口或者使用无痕/隐私模式确保你没有登录ntopng的会话。然后直接将上一步生成的完整URL粘贴到地址栏回车访问。如果漏洞存在你会看到什么你不会被重定向到登录页面而是会直接看到get_flows_data.lua这个接口返回的数据通常是JSON格式的网络流信息。这意味着你完全绕过了登录认证你可以尝试将-p参数换成其他Lua接口比如get_macs_data.lua获取MAC地址数据、get_host_data.lua获取主机数据等来验证对其他受保护接口的未授权访问能力。这个过程我当初复现的时候看到浏览器里直接吐出JSON数据心里还是咯噔一下的。这种漏洞的直观感受非常强因为它跳过了所有图形化的登录界面直接与后台API对话对于攻击者来说自动化批量窃取数据就变得非常容易。5. 漏洞利用延伸从信息泄露到更深层的风险成功复现了未授权访问数据接口这已经证明了漏洞的严重性。但作为一个深度分析我们不妨再往前想一步攻击者利用这个漏洞还能做什么仅仅看到流量数据可能就是最终目标吗很多时候信息泄露是更深入攻击的跳板。5.1 敏感信息收集与网络测绘get_flows_data.lua这样的接口会返回详细的网络连接信息包括源IP、目的IP、端口、协议、流量大小等。攻击者可以利用这些信息绘制内部网络拓扑了解目标组织内部有哪些活跃的主机它们之间如何通信。识别关键资产发现数据库服务器、文件服务器、管理后台等高价值目标的IP地址。了解业务模式通过分析流量特征推测目标组织使用的应用和服务。这些信息对于后续可能发生的针对性攻击如漏洞利用、密码爆破极具价值。攻击者甚至不需要动用复杂的扫描工具直接通过这个“后门”就能安静地获取高质量情报。5.2 探索潜在的代码执行与文件包含原始的漏洞公告和部分分析指出CVE-2021-28073在某些条件下可能与路径遍历结合导致本地文件包含LFI。虽然我们复现的PoC主要关注权限绕过但攻击思路可以扩展。如果攻击者能够通过这个漏洞让ntopng去包含include服务器上的其他文件比如/etc/passwd那么风险等级就更高了。查看PoC脚本你会发现它还有一个include子命令。其原理是尝试构造路径让最终标准化后的路径指向一个系统文件。例如通过精心计算../的数量让请求某个恶意路径.css最终被解释为/etc/passwd。如果ntopng在处理时以某种方式比如错误日志、模板渲染包含了这个文件的内容就会导致敏感文件泄露。在实际测试中这需要更精确的环境和路径计算但它揭示了权限绕过漏洞可能演变成更严重问题的通道。5.3 结合其他漏洞形成攻击链在真实攻击中攻击者很少只用一个漏洞。CVE-2021-28073提供的未授权访问能力可以与其他漏洞结合。例如结合CSRF跨站请求伪造如果ntopng的某些管理接口存在CSRF缺陷且未授权访问后这些接口可操作攻击者可以诱导已登录的管理员浏览器访问恶意页面从而间接通过管理员权限执行操作。作为内网渗透的支点攻击者在外网发现一个暴露的、存在漏洞的ntopng通过它获取内网其他服务器的IP和流量信息为横向移动提供导航。干扰监控掩盖行踪理论上如果能找到写入或控制数据的接口攻击者或许可以篡改或清除流量日志掩盖其入侵痕迹。虽然ntopng的Lua接口多以只读为主但在复杂的攻击场景下任何可能性都不应被忽视。理解这些延伸风险能让我们在修复漏洞时不仅仅停留在“堵上这个洞”而是从整体安全架构上思考比如加强网络隔离、对所有API接口实施严格的权限控制、部署Web应用防火墙WAF规则等。6. 修复方案与防御建议亡羊补牢为时未晚分析漏洞是为了最终修复它并避免类似问题。对于使用ntopng的运维人员和安全团队来说当务之急是采取行动。6.1 官方修复与升级这是最根本、最有效的解决方案。ntopng开发团队在漏洞披露后发布了修复版本。如果你正在运行ntopng 4.2或更早版本请立即升级到最新的稳定版。你可以通过以下方式升级Docker用户修改你的docker-compose.yml或docker run命令将镜像标签改为最新版如ntop/ntopng:latest或具体的稳定版号如5.0以上然后重新拉取并启动容器。源码编译/包管理安装用户请访问ntopng的官方GitHub仓库或官网按照指引进行升级。升级前务必备份你的配置和数据通常位于/var/lib/ntopng和/etc/ntopng目录下。官方修复的核心逻辑是调整了路径处理和权限检查的顺序确保在任何资源被访问前都基于标准化后的、最终的路径进行严格的会话验证。6.2 临时缓解措施如果因为某些原因无法立即升级可以考虑以下临时加固方案网络访问控制严格限制ntopng Web界面默认3000端口的访问来源。只允许特定的管理IP地址或通过VPN访问绝对不要将其暴露在公网上。这是最立竿见影的防护措施。反向代理加固如果你使用Nginx或Apache作为ntopng的反向代理可以尝试在代理层增加一些防护规则。例如在Nginx配置中添加规则来拦截包含过多..或%2e%2f序列的请求。但这属于“黑名单”机制可能存在被绕过风险不能替代升级。# 示例Nginx规则可能不完整需根据实际情况调整 location /lua/ { if ($request_uri ~* \.\./) { return 403; } if ($request_uri ~* %2e%2f) { return 403; } # ... 其他代理设置 }修改默认密码虽然这个漏洞绕过了登录但强化认证总是一个好习惯。确保管理员账户使用了强密码。6.3 长期安全建设思考从这个漏洞中我们可以汲取一些更普适的安全开发与运维经验安全开发规范在Web开发中对于用户输入的路径参数必须进行严格的标准化和规范化并且所有权限检查必须基于规范化之后的结果。这应该成为代码审查中的一项重点。最小权限原则ntopng的Web服务进程应该以非root、低权限的用户身份运行即使被攻破也能限制攻击者造成的损害范围。纵深防御不要依赖单一的安全边界。结合网络防火墙、主机防火墙、入侵检测系统IDS和Web应用防火墙WAF构建多层防御体系。即使一个漏洞被利用其他层也能提供告警和阻断。主动监控与漏洞管理订阅你所用关键组件的安全公告如CVE列表。建立定期的漏洞扫描和补丁更新流程。对于像ntopng这样的监控工具本身也需要被另一套独立的系统所监控确保其自身运行状态和安全状态的可观测性。修复漏洞不仅仅是打补丁更是一次审视自身安全态势的机会。每次安全事件过后问问自己我们的资产清单是否完整暴露面是否最小化补丁管理流程是否顺畅安全团队的响应速度如何把这些问题的答案落实到行动中才能让我们的网络环境越来越稳固。