漏洞介绍
Apache Log4j2 是 Apache 的一个基于Java的日志记录工具,该工具可以控制日志信息输送的目的地为控制台、文件、GUI组件等,并通过定义每一条日志信息的级别,使其能更加细致地控制日志的生成过程。
由于Apache Log4j2中存在JNDI注入漏洞,攻击者可设计一个数据请求发送给使用 Apache Log4j2工具的服务器,当该请求被打印成日志时就会触发远程代码执行。
漏洞原理
Log4j2支持${prefix:name}语法的查询方法,即通过prefix的处理器去处理name。
Log4j2对日志消息进行格式化时会判断是否存在“{”,并通过{prefix:name}语法解析${}内的变量获取prefix和name。在支持的prefix中只有jndi能够进行注入,所以当日志消息中存在
时,会调用JndiLookup的lookup方法处理ldap://x.x.x.x/exp,从而使用ldap加载远程服务器上的恶意class,造成jndi注入。
绕过手法总结
1·利用lower和upper两个lookup方法分割原始payload
Log4j2支持的prefix中有lower和upper。lower转换成小写,upper转换成大写,{}支持嵌套的特性可以构造出
,所以循环解析后变为
,从而绕过安全设备对原始payload的检测。
2·利用substitute解析方法分割原始payload
substitute方法在解析{}”以及里面的变量会替换为截取之后的字符串。处理{{::-j}}时,取出的prefix无法命中strLookupMap中的strLookup对象,所以lookup返回了null,最后处理{{::-j}}的结果为j。
然后利用该特性进行拼接可构造出
,循环解析后得到
。
图 lookup返回null
图 字符串替换结果
同理可在${}内填充任意字符也可达到上述效果。即可构造出
解析后为
,从而绕过原始payload的检测。
3·编码绕过
在java中,unicode和字符串效果是一样的,所以还可以用unicode编码的方式绕过字符串形式的payload的检测。
如果使用了json库,例如fastjson,还可以使用十六进制的形式进行绕过检测。
绕过手法检测
整理清楚漏洞原理后,检测思路自然就出来了。因为只有jndi可注入,所以如果要利用该漏洞RCE的话,必然要使用jndi,不管什么绕过手法,最终解析后的prefix都是jndi。
原始payload: 可检测jndi处理rmi、ldap加载远程class的行为
lower/upper绕过: 可检测${prefix:name}语法中使用lower、upper的方式
substitute解析方法绕过 :可检测${prefix:name}语法中使用非Log4j2中封装的strLookup对象且包含“-:”分割jndi的方式。
睿眼攻击溯源系统已支持该漏洞目前所有绕过手法的检测
使用睿眼攻击溯源系统的用户可登录更新平台http://update.zorelworld.com:8888/输入机器码获取最新规则升级包进行检测。
图 睿眼攻击溯源系统检测Apache Log4j2各种绕过手法
来源:蓝鸟安全
历史文章推荐:
查看更多精彩内容,还请关注 橘猫学安全 :
每日坚持学习与分享,麻烦各位师傅文章底部给点个“
再看
”,感激不尽
