安全矩阵

 找回密码
 立即注册
搜索
查看: 2526|回复: 0

Apache Log4j 远程代码执行漏洞复现+代码审计分析+POC+EXP

[复制链接]

855

主题

862

帖子

2940

积分

金牌会员

Rank: 6Rank: 6

积分
2940
发表于 2021-12-10 16:07:04 | 显示全部楼层 |阅读模式
原文链接:Apache Log4j 远程代码执行漏洞复现+代码审计分析+POC+EXP

0x01 漏洞描述
Apache Log4j 是 Apache 的一个开源项目,Apache Log4j2是一个基于Java的日志记录工具。该工具重写了Log4j框架,并且引入了大量丰富的特性。我们可以控制日志信息输送的目的地为控制台、文件、GUI组件等,通过定义每一条日志信息的级别,能够更加细致地控制日志的生成过程。该日志框架被大量用于业务系统开发,用来记录日志信息。

2021年12月9日,该漏洞正在被广泛利用 。漏洞编号:暂无,漏洞威胁等级:严重。
Log4j-2中存在JNDI注入漏洞,当程序将用户输入的数据被日志记录时,即可触发此漏洞,成功利用此漏洞可以在目标服务器上执行任意代码。鉴于此漏洞危害较大,建议客户尽快采取措施防护此漏洞。
经分析,log4j2是全球使用广泛的java日志框架,同时该漏洞还影响很多全球使用量的Top序列的通用开源组件,攻击者可直接构造恶意请求,触发远程代码执行漏洞。漏洞利用无需特殊配置,Apache Struts2、Apache Solr、Apache Druid、Apache Flink等均受影响
0x02 危害等级
严重
0x03 漏洞复现
2021年12月9日,已第一时间复现上述漏洞,演示如下:

0x04 影响版本
Apache Log4j 2.x <= 2.14.1
0x05 修复建议
1、厂商已发布升级修复漏洞,用户请尽快更新至安全版本:log4j-2.15.0-rc1
下载链接:https://github.com/apache/loggin ... ag/log4j-2.15.0-rc1
2、升级已知受影响的应用及组件,如srping-boot-strater-log4j2/Apache Solr/Apache Flink/Apache Druid
与此同时,请做好资产自查以及预防工作,以免遭受黑客攻击。
0x06 审计分析
详细代码如下

从上面代码中可以看到,不管什么级别的日志下都可以出发lookup。那么问题来了?为什么有些级别的日志下却不可以触发呢?那是因为你的日志级别设置的太高,导致log4j根本就没打印日志内容。
代码org.apache.logging.log4j.core.pattern.MessagePatternConverter#format中,代码会按字符检测每条日志,如果一旦发现某条日志中包含$ {,就会触发替换机制,也就是将表达式内的内容替换成真实的内容,其中config.getStrSubstitutor().replace(event, value)执行下一步替换操作,其中关键代码如图

org.apache.logging.log4j.core.lookup.StrSubstitutor#substitute(org.apache.logging.log4j.core.LogEvent, java.lang.StringBuilder, int, int, java.util.List<java.lang.String>)其实就是一个简单的字符串提取,然后找到lookup的内容并替换。函数的文档如下

学过数据结构的都会,不详细介绍了。在函数的这个地方,执行变量解析,如图

在此执行查找,根据变量的协议,关键代码如下
剩下就是一个简单的字符串查找函数,从字符串中提取类似于url的结构去解析,

值得注意的是,log4j2支持很多协议,例如通过ldap查找变量,通过docker查找变量,详细参考这里https://www.docs4dev.com/docs/zh ... manual-lookups.html

由以上类层次结构图可以看出
1、log4j2提供不下十种获取所运行环境配置信息的方式,基本能满足实际运行环境中获取各类配置信息的需求。
2、我们在自定义lookup时,可以根据自身需求自由选择继承自StrLookup,AbstractLookup,AbstractConfigurationAwareLookup等等来简化我们的代码。以上默认提供的各类lookup,其取值来源看官可以通过下面给出的引用链接中的第二个进行详细的瞭解,我就不再在这里赘述一遍了。
接下来我们来探索一些稍微深入的内容,以及一些细节性的内容。
1、作爲lookup对外门面的Interpolator是通过 log4j2中负责解析节点的PropertiesPlugin类来併入执行流程中的。具体源码可以参见PropertiesPlugin.configureSubstitutor方法。其中注意的是,我们在中提供的属性是以default的优先级提供给外界的。
2、作爲lookup对外门面的Interpolator,在其构造函数中载入了所有category值爲StrLookup.CATEGORY的plugin【即包括log4j2内置的(“org.apache.logging.log4j.core” package下的),也包括用户自定义的(log4j2.xml文件中的 Configuration.packages 属性值指示的package下的)】。
3、Interpolator可以单独使用,但某些值可能取不到。
4、获取MDC中的内容,log4j2提供了两种方式:$${ctx:user}或%X{user}。
0x07 POC+EXP获取
后台回复:
Log4j
  •         专注于信息安全方面分享,非营利性组织,不接商业广告
  •         关注不迷路,点赞!关注!转发!评论!!
  •         要投稿的后台留言即可,会第一时间回复,谢谢!



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2025-4-23 04:21 , Processed in 0.013865 second(s), 18 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表