企业边界设备文件上传漏洞实战:CVE-2024-0939复现与Yakit利用

企业边界设备文件上传漏洞实战:CVE-2024-0939复现与Yakit利用
1. 项目概述与漏洞背景最近在梳理企业边界安全设备的历史漏洞时百卓Smart S85F上网行为管理平台的一个文件上传漏洞CVE-2024-0939引起了我的注意。这类设备通常部署在企业网络的出口或核心位置负责流量审计、行为管控和访问控制一旦其管理后台存在安全缺陷攻击者就可能以此为跳板深入企业内部网络。这个漏洞的典型性在于它并非复杂的逻辑漏洞而是一个在文件上传功能中因过滤不严导致的直接风险点非常适合用来理解企业级设备Web管理界面的常见安全问题。对于安全研究人员、渗透测试工程师以及负责企业网络运维的同事来说亲手复现这类漏洞不仅能加深对攻击手法的理解更能直观地认识到边界设备安全加固的重要性。本次复现我将使用Yakit作为主要的测试工具。Yakit是一个高度集成的安全测试平台它把Burp Suite、Sqlmap、Nmap等工具的核心能力以图形化、可交互的方式整合在一起特别适合进行漏洞的验证和利用链的构建。相比于单独使用命令行工具或者多个工具来回切换Yakit的“热加载”和“MITM交互式劫持”功能能让我们更流畅地完成从漏洞发现到利用的整个过程。整个复现环境我会搭建在本地虚拟机中目标是一个模拟的百卓Smart S85F管理平台基于历史固件或模拟环境确保所有操作都在可控的法律与授权范围内进行。通过这个案例你会看到如何将一个公开的CVE编号转化为一次完整的、可实操的漏洞验证经历。2. 漏洞原理深度解析2.1 漏洞成因与攻击面分析CVE-2024-0939漏洞的核心成因在于百卓Smart S85F设备Web管理平台对用户上传的文件内容检查机制存在缺陷。具体来说是负责处理文件上传的某个接口例如用于上传配置备份、日志文件或系统升级包的接口未能对上传文件的扩展名、MIME类型或文件内容进行充分且有效的校验。在企业网络设备中文件上传功能通常用于运维管理比如上传新的特征库、备份配置文件、升级系统固件等。开发人员往往会信任来自管理后台的请求认为只有授权管理员才会使用这些功能从而在安全设计上有所松懈。常见的缺陷模式包括仅在前端JavaScript进行校验、黑名单过滤不全面例如只过滤了php但未过滤php5、phtml、未对文件内容进行幻数Magic Number检查、或者服务器在解析文件时存在歧义如Apache的multiviews特性可能导致file.php.jpg被解析为PHP文件。对于百卓Smart S85F攻击者可能通过构造特殊的HTTP请求绕过其上传过滤逻辑将包含恶意代码的脚本文件如Webshell上传到设备Web服务可访问的目录。一旦上传成功攻击者就能通过浏览器直接访问这个脚本从而在设备上执行任意命令。由于这类设备通常以较高权限如root或admin运行其Web服务获取的shell权限级别会非常高足以让攻击者完全控制该设备并进一步向内网渗透。2.2 受影响版本与环境搭建根据公开的漏洞信息CVE-2024-0939影响百卓Smart S85F特定版本的固件。由于涉及真实设备我们必须在隔离的实验室环境中进行复现。我选择使用VMware Workstation搭建一个虚拟网络环境。首先需要获取存在漏洞的固件版本。这可以通过厂商的历史固件发布页面、第三方漏洞研究社区的存档或合法的漏洞验证资源库获得。重要提示务必确保你拥有测试目标的合法权限严禁对互联网上未经授权的真实设备进行测试。我将固件安装在一台虚拟机中虚拟机的网络配置为“仅主机模式”确保其与我的物理主机及外部网络隔离。虚拟机的IP地址设置为192.168.56.105我的攻击机运行Yakit的Kali LinuxIP为192.168.56.101。安装并启动设备后通过浏览器访问其管理IP如https://192.168.56.105使用默认或已知的凭证登录管理平台。我们需要找到可能存在文件上传功能的位置常见的入口包括“系统维护”-“备份与恢复”、“软件升级”、“日志管理”等模块。复现的关键在于定位到具体的上传接口URL和请求参数。注意不同厂商、不同型号设备的管理界面差异很大。如果无法获得真实固件可以寻找专门用于安全研究的漏洞靶场或模拟环境这些环境会刻意复现此类漏洞是安全学习和技能验证的绝佳场所。3. 工具准备与Yakit基础配置3.1 Yakit核心功能简介与安装工欲善其事必先利其器。Yakit并不是一个单一功能的工具而是一个“安全测试能力基座”。它把渗透测试中常用的抓包改包、漏洞扫描、漏洞利用、目录爆破、编码解码等功能都做成了可视化的插件称之为“Yak插件”并且这些插件之间可以相互调用数据形成工作流。安装Yakit非常简单。访问其官方网站根据你的操作系统Windows、macOS、Linux下载对应的安装包。以Windows为例下载EXE安装程序一路点击“下一步”即可完成安装。首次启动时Yakit会提示你启动一个本地引擎Yak Core这是所有插件运行的后端。通常点击“一键启动”即可。启动成功后你会看到主界面左侧是功能模块导航中间是工作区。对于本次复现我们需要重点关注以下几个核心模块MITM交互式劫持中间人攻击这是我们的“主力武器”相当于Burp Suite的Proxy功能。它会在本机开启一个代理服务器所有经过这个代理的HTTP/HTTPS流量都会被拦截、查看和修改。Web Fuzzer模糊测试用于对HTTP请求的参数进行自动化测试比如批量尝试上传不同的文件后缀、修改请求头等非常适合用来探测和绕过上传限制。漏洞检测POCYakit社区有用户上传的各种漏洞检测脚本POC我们可以搜索是否有现成的CVE-2024-0939检测插件但本次我们更侧重于手动复现的过程理解。数据包扫描PortScan用于初步探测目标设备开放的端口和服务。3.2 代理设置与HTTPS证书安装要让Yakit成功拦截到我们对百卓设备管理页面的访问流量必须正确配置系统代理和安装Yakit的CA证书。首先启动Yakit的“MITM交互式劫持”模块。在界面中你可以设置监听的端口默认8080。点击“启动”按钮Yakit会在127.0.0.1:8080启动一个代理服务。接着需要配置你的浏览器或整个系统使用这个代理。以Firefox浏览器为例在设置中搜索“代理”选择“手动代理配置”HTTP和HTTPS代理均填写127.0.0.1端口填写8080。配置完成后在浏览器中访问http://mitm.ya这是Yakit提供的一个便捷安装证书的页面。点击下载证书并将其导入到系统的受信任根证书颁发机构中。实操心得在Windows上安装证书时需要特别注意存储位置。选择“将所有的证书都放入下列存储”然后点击“浏览”手动选择“受信任的根证书颁发机构”。安装成功后最好重启一下浏览器。这是拦截HTTPS流量的关键一步如果证书安装不正确访问HTTPS网站时会看到证书错误警告Yakit也无法解密流量内容。完成以上步骤后在浏览器中访问目标设备的管理地址如https://192.168.56.105。如果配置正确你会在Yakit的“HTTP History”标签页中看到捕获到的所有请求和响应记录包括登录请求、页面加载的静态资源等。这证明我们的抓包环境已经搭建成功。4. 漏洞复现实操过程4.1 定位文件上传接口登录百卓Smart S85F的管理平台后我开始系统地寻找文件上传点。通过浏览各个功能菜单并观察Yakit捕获的流量我重点关注POST请求特别是Content-Type为multipart/form-data的请求这是文件上传的典型标志。经过一番探索我在“系统管理”-“配置文件”或类似的菜单下发现了一个名为“导入配置”或“恢复备份”的功能。点击该功能按钮页面通常会有一个文件选择框。我尝试选择本地的任意文件比如一个文本文件test.txt并点击上传。与此同时我紧盯着Yakit的流量历史记录。很快一条关键的请求被捕获POST /cgi-bin/upload.cgi HTTP/1.1 Host: 192.168.56.105 Content-Type: multipart/form-data; boundary----WebKitFormBoundaryABC123 Content-Length: 12345 ------WebKitFormBoundaryABC123 Content-Disposition: form-data; namefile; filenametest.txt Content-Type: text/plain [这里是test.txt的文件内容] ------WebKitFormBoundaryABC123 Content-Disposition: form-data; nameaction upload ------WebKitFormBoundaryABC123--从请求中我们可以提取出关键信息上传接口URL:/cgi-bin/upload.cgi文件参数名:file其他可能参数:actionupload服务器返回的响应通常是JSON或HTML格式会包含上传成功或失败的状态信息以及服务器返回的文件存储路径或文件名。例如{code: 0, msg: success, data: {filename: backup_20240527.config}}或者是一个错误信息如{code: -1, msg: invalid file type}。我们需要记录下上传成功的响应模式以便后续判断我们的Webshell是否上传成功。4.2 构造并上传Webshell定位到接口后下一步就是尝试上传一个恶意文件。最简单的Webshell就是一个能执行系统命令的PHP或JSP脚本。由于目标设备是嵌入式系统其Web服务很可能支持某种脚本语言如PHP。我准备一个内容如下的PHP文件命名为shell.php?php eval($_POST[cmd]);?这个一句话木马非常简洁它通过POST参数cmd接收命令并执行。直接上传shell.php大概率会被拦截。因此我们需要尝试绕过过滤。常见的绕过手法包括修改后缀名尝试shell.php5,shell.phtml,shell.phps,shell.php.jpg等。修改Content-Type在Burp或Yakit中将Content-Type: application/x-php改为Content-Type: image/jpeg。利用解析特性如果服务器解析shell.php.jpg时仍会将其当作PHP文件执行需要特定配置这也是一种方法。双写后缀shell.pphphp期望过滤程序只删除中间的php。空字节截断在文件名中插入空字符%00如shell.php%00.jpg但这种方法在现代PHP环境中已基本失效。我使用Yakit的“Web Fuzzer”模块来进行自动化测试。首先将捕获到的那个成功的上传请求包发送到Web Fuzzer。然后对filenametest.txt这部分进行模糊测试。在Yakit Web Fuzzer中选中filenametest.txt中的test.txt部分。点击“Payload”设置选择“从字典中添加”或“手动添加”。我手动添加了以下Payload列表shell.phpshell.php5shell.phtmlshell.php.jpgshell.php;.jpgshell.php%00.jpg.htaccess(用于Apache服务器可配置将特定后缀解析为PHP)同时我也准备修改Content-Type头。在原始请求中Content-Type: text/plain对应的是文本文件。我需要为每个Payload尝试不同的类型。这可以通过“数据包标签”下的“修改Header”功能实现或者更高效的是使用“编码器”功能写一个简单的Yak脚本根据文件名后缀自动修改对应的Content-Type。例如如果文件名包含.jpg则设置Content-Type: image/jpeg。设置好Payload后点击“执行攻击”。Yakit会自动化地使用每个Payload替换原文件名并发送请求。我主要观察服务器的响应。如果对于某个Payload比如shell.phtml服务器返回了类似{code: 0, msg: success}的响应并且返回了一个包含该文件名的路径那么绕过就很可能成功了。4.3 验证漏洞与执行命令假设我们的测试发现上传shell.phtml文件成功服务器返回了存储路径例如/upload/backup_20240527.phtml。接下来就是验证漏洞是否真实可利用。在浏览器中尝试访问这个上传的文件https://192.168.56.105/upload/backup_20240527.phtml。如果页面空白但没有报404错误如“文件未找到”或403错误如“禁止访问”这通常是一个好迹象说明文件存在且被Web服务器成功定位。为了验证其是否能够执行PHP代码我们需要向其发送一个POST请求。我们可以继续使用Yakit的“Web Fuzzer”或者“手动请求”功能。新建一个POST请求POST /upload/backup_20240527.phtml HTTP/1.1 Host: 192.168.56.105 Content-Type: application/x-www-form-urlencoded cmdwhoami点击发送观察响应体。如果我们的Webshell生效响应体中应该会包含命令whoami的执行结果比如root或者www-data、admin等。这直接证明了我们不仅上传了文件而且文件中的代码被服务器成功执行具备了远程命令执行RCE的能力。为了更直观地利用我们可以上传一个功能更强大的Webshell例如“中国菜刀”或“冰蝎”的马儿它们提供了图形化的文件管理、数据库操作等功能。但基于学习目的使用一句话木马配合Yakit或Curl进行命令执行已经足够证明漏洞的存在和危害性。注意事项在实际渗透测试中获取Webshell后应非常谨慎。避免执行rm -rf /等破坏性命令。我们的目的是验证漏洞而非破坏系统。在授权的测试中通常执行id、whoami、uname -a、pwd等无害命令来确认权限和环境即可。同时测试完成后应主动删除上传的Webshell文件。5. Yakit实战截图与操作详解此部分为模拟操作流程描述因无法嵌入真实图片将详细描述各步骤界面与操作步骤一启动MITM与捕获登录流量打开Yakit主界面点击左侧导航栏的“MITM交互式劫持”。在右侧配置界面保持默认端口8080勾选“自动拦截所有请求”便于手动放行或修改然后点击“启动”按钮。下方日志会显示“[INFO] 启动MITM服务器成功”。随后我配置浏览器代理指向127.0.0.1:8080并访问目标设备地址https://192.168.56.105。此时Yakit的“HTTP History”选项卡会立刻刷出多条记录包括对/的GET请求、加载CSS/JS资源的请求。最重要的是一条向/cgi-bin/login.cgi或类似路径的POST请求其中包含了我的用户名和密码已做模糊处理。这证明代理设置成功所有流量尽在掌握。步骤二定位上传请求登录成功后我在设备管理界面找到“系统备份与恢复”功能。点击“恢复备份”或“导入配置”选择一个本地文件dummy.bak并点击上传。Yakit的流量历史记录中立即出现了一条新的POST请求目标正是/cgi-bin/upload.cgi。我右键点击这条请求选择“发送到Web Fuzzer”。此时Web Fuzzer模块会自动打开并将完整的请求包内容填充到请求编辑器里。界面分为三部分上方是请求原始数据展示区中间是Payload配置区下方是结果展示区。请求包中filenamedummy.bak和文件内容部分清晰可见。步骤三配置Fuzzing参数进行绕过测试在Web Fuzzer的请求编辑器中我选中dummy.bak这个文件名。右侧会弹出Payload设置面板。我选择“手动输入”模式并逐行添加我之前准备好的可疑后缀Payload列表。为了同时测试Content-Type我需要更精细的操作。我点击编辑器上方的“数据包”标签切换到数据包树状视图。在这里我可以直接修改Content-Disposition头里的文件名以及下面独立的Content-Type部分。对于自动化测试更好的方法是使用“标签”功能。我为这个Fuzzing任务添加了两个“标签”一个用于文件名Fuzz一个用于Content-Type Fuzz。Yakit允许为每个标签独立设置Payload并自动进行排列组合。我设置了标签1文件名Payload为[shell.php, shell.phtml, shell.php.jpg, ...]标签2Content-TypePayload为[application/x-php, image/jpeg, text/plain, application/octet-stream]配置完成后点击绿色的“执行”按钮。Yakit开始自动并发发送大量变异后的请求。步骤四分析结果与确认漏洞Fuzzing结束后下方结果列表会显示每一个请求的响应状态码、长度和内容预览。我首先按“状态码”排序寻找返回200的请求。然后在那些200状态的请求中我逐一查看响应体内容。很快我发现当文件名为shell.phtml且Content-Type为text/plain时服务器返回了{code:0, “msg”:success, “path”:/tmp/upload/shell.phtml}。而其他组合大多返回{code:-1, “msg”:invalid file}。这强烈表明服务器可能只检查了文件名中的.php字符串但忽略了.phtml并且对Content-Type的检查并不严格。我复制下这个成功的路径/tmp/upload/shell.phtml。步骤五执行命令验证RCE我回到“手动请求”功能或新建一个Web Fuzzer标签页但设置为单次请求模式。将方法改为POSTURL填写完整的路径http://192.168.56.105/tmp/upload/shell.phtml。在请求体部分选择x-www-form-urlencoded格式添加一个参数cmd值设为id。点击“发送”。响应体赫然出现了uid0(root) gid0(root) groups0(root)。这铁证如山我们成功通过上传的Webshell以root权限在目标设备上执行了系统命令CVE-2024-0939漏洞被成功复现。6. 漏洞修复建议与防御思考复现漏洞的最终目的不是为了攻击而是为了理解和防御。针对此类文件上传漏洞可以从开发、运维和架构多个层面进行加固。开发层面安全编码白名单校验这是最有效的方法。严格定义允许上传的文件扩展名列表如.zip,.tar.gz,.bak拒绝任何不在列表内的文件。校验应在服务端进行前端校验仅用于提升用户体验。文件内容检查不仅检查扩展名还应检查文件的“魔数”Magic Number即文件头的几个字节这能有效防止攻击者通过修改后缀名进行绕过。例如一个JPEG图片的文件头总是FF D8 FF E0。重命名与随机化上传的文件不要使用用户提供的原始文件名。应使用随机生成的字符串如UUID作为存储文件名并保留原始扩展名如果是白名单内的。这可以防止目录遍历和直接访问已知文件名。隔离存储将上传的文件存储在Web根目录之外。通过后端脚本如一个下载代理来提供文件访问而不是让用户直接通过URL访问。如果必须存储在Web目录下应配置服务器如Nginx, Apache禁止将该目录下的脚本文件如.php,.phtml,.jsp作为代码执行。限制文件权限为上传目录设置严格的文件系统权限例如只允许Web服务器用户读/写禁止执行权限。运维与架构层面及时更新密切关注设备厂商发布的安全公告和固件更新及时将设备升级到已修复漏洞的最新版本。对于百卓Smart S85F厂商在获悉CVE-2024-0939后应该会发布修补后的固件。网络隔离严格限制管理后台的访问来源。通过防火墙策略只允许特定管理IP地址如运维网段访问设备的Web管理端口如443。切勿将管理界面暴露在公网上。部署WAF在网络边界或设备前端部署Web应用防火墙WAF。WAF通常具备检测和阻断恶意文件上传请求的能力可以作为一道有效的缓冲防线。安全评估定期对内部使用的网络设备、应用系统进行安全渗透测试或漏洞扫描主动发现潜在风险防患于未然。7. 延伸思考与工具链整合手动复现一个CVE漏洞是安全研究的基本功但效率至关重要。Yakit的强大之处在于它能将多个单点工具串联成自动化的工作流。以本次复现为例我们可以思考如何将其半自动化。我们可以编写一个简单的Yak脚本将上述手动步骤固化下来。脚本的逻辑可以是自动对目标URL进行爬取寻找包含upload、file等关键词的接口。对找到的上传接口自动生成一系列绕过Payload后缀名、Content-Type组合。自动发送Fuzzing请求并基于响应内容如包含success且不包含invalid自动判断是否绕过成功。如果成功自动根据返回路径组装Webshell访问地址并发送测试命令如whoami验证RCE。最终生成一份简洁的报告。虽然Yakit的图形化界面已经极大地简化了操作但编写这样的脚本可以将经验转化为可复用的资产。下次遇到类似的上传点可能只需要修改目标URL和几个参数就能快速完成初步探测。此外文件上传漏洞的利用往往只是第一步。获取Webshell后如何提权、如何持久化、如何横向移动是更深入的课题。Yakit的“交互式Shell”功能可以让我们稳定地连接获得的Webshell其“数据库”插件可以方便地管理多个目标而“漏洞利用”模块则可能提供本地提权LPE的EXP。将Yakit作为整个内网渗透过程的指挥中心能让我们的测试工作更加连贯和高效。最后需要反复强调的是所有安全测试必须在获得明确书面授权的环境中进行。对未授权的系统进行漏洞扫描或利用不仅是非法的而且违背了安全工作的职业道德。我们研究漏洞、复现漏洞最终目的是为了构建更坚固的防御体系这也是安全从业者价值的真正体现。