Attack PHP Website By Shiro 密级: 【C-1】 | 时间:2024-02-06 | 目录:博客文章 | 编辑本文 上一版本 | 版本差异 | 文章距今已发表三个月,请自行判断文中技术方法、代码的有效性:) ## 背景 1、如何让php网站收到shiro探测的请求后让工具或脚本认为这是一个具有shiro框架的网站? 2、如何收到密钥爆破检测请求的时候,通过请求的字段值来与后端密钥做匹配,更加逼真的还原密钥爆破的场景,从而让脚本小子信以为真? ## 框架指纹 shiro框架常见的指纹是通过对请求包设置cookie中一个值,为RememberMe=xxx,返回包会出现相应的Set-Cookie: rememberMe=deleteMe。 这里我拿j1anfen的shiro测试工具来测试。通过检测原理,我们可以自己给网站base文件或者中间件写这样的代码: ![](https://img.meituan.net/imgupload/7414952b582b05ca1c449c66609cfafe59267.png) php用$_COOKIE函数取值会使+号变成空格,这里通过headers遍历重新取值可以解决这个问题。于是我们用工具探测一下: ![](https://img.meituan.net/imgupload/7a59f7f23ae15149689553438b431bab117710.png) 发现已经可以让大多数工具认为我的网站是shiro框架了。 ## 密钥爆破原理 1、能否实现,使用php网站后台指定一个密钥,当攻击者爆破密钥的时候必须和我php后台配置的密钥一致,才设置相应的检测回显呢? 参考 l1nk3r发表于雷神众测的文章: ![](https://img.meituan.net/imgupload/819b6be69001ee584ab79522c471a059771258.png) 构造一个继承 PrincipalCollection 的序列化对象,key正确情况下不返回 deleteMe ,key错误情况下返回 deleteMe 的方式来判断key是否正确。 那么,当服务器取cookie取到一个由密钥kPH+bIxk5D2deZiIxcaaaA==加密而来的字符串,服务器后端配置的密钥也是kPH+bIxk5D2deZiIxcaaaA==,服务器应该怎么做呢? 首先,老版本的shiro是aes-cbc加密,padding是Pkcs7。上面key探测的方法用到了反序列化,那么解密出来的数据一定会存在反序列化的特征aced0005。 所以可以给后台写一下php对于aes-cbc-pkcs7的解密,因为cbc模式下是有偏移量的,但我们并没有偏移量,但iv只和最后一个分组有关,只要明文大于一组,这就不会影响我们的特征。 ## 代码逻辑 1、php网站收到请求cookie的rememberMe字段值 2、后台存在一个假定的key,并使用aes-cbc解密,如果密钥匹配正确,那么解密出来的hex字符串的32-40位的字符串应该是aced0005 3、如果解密出来的数据是aced0005,那么我们就不设置deleteme的头部字段。 4、其他情况下如果存在rememberme的请求cookie,就设置。 ![](https://img.meituan.net/imgupload/f4e4b60715fa8a0e794525bfd6b9cdc963499.png) 解密脚本如下 ![](https://img.meituan.net/imgupload/63dd9fc2d9d594ed05605a73c1f65c3d106259.png) 最终效果如下 ![](https://img.meituan.net/imgupload/1196206554fd94e780d0a3a3da00316d130506.png) ![](https://img.meituan.net/imgupload/2d825b9c9bda739a1cadb0eba0e33cb9179723.png) ## 工具检测效果 ![](https://img.meituan.net/imgupload/416b1c369209247535ddd6e84e4b4a6e250323.png) 如果还有其他的伪造,其实可以用伪静态设置后缀为jsp,亦或者修改phpsession,改成jsessionid。 ![](https://img.meituan.net/imgupload/1479940940534c3f6f913658e6d9218321271.png) ## 进阶 前文我们已经实现了让php网站拥有被shiro扫描器探测的特征。以及模拟一个虚假密钥给漏洞测试工具识别出来的结果。这使得攻击者会对一个非java网站实现漏洞的前两步探测结果,浪费攻击者时间。 ![](https://img.meituan.net/imgupload/621a15cc8c14ecfaa02f88c9b656711f29870.png) 但是到这里就无法做下去了,原因就是一般的工具爆破shiro密钥,都是使用l1nk3r的探测方法,但是当到爆破利用链的时候就不一样了。 feihong的shiro探测工具,发送的内容通过字节码反编译的代码如下: ![](https://img.meituan.net/imgupload/56899b236dda5581b14362941925502d69928.png) 而j1anfen的工具的代码如下: ![](https://img.meituan.net/imgupload/13ddb4fe1f5be5af6d20d3e3e095aa06195852.png) 第一种是发送流量到特征平台,如果能够收到流量代表这个链子可以打通。 第二种是获取请求包的特定header参数值,服务器接收这个参数值后,给响应包加一个这个参数以及值。如果相应包存在,说明可以执行代码,漏洞链和方式可用。 针对第一种情况,我们可以解密payload,匹配获取到dnslog平台,由我们服务器平台发送流量,使得工具认为代码被执行,所以链子可用。此时对一般的红队人员的正反馈极高,可能会继续探测尝试。 第二种方法,因为设定的参数值是不一样的。比如j1anfen的工具为techo,而summersec的工具为host。而且我们还得知道代码的检测逻辑,是返回包有这个参数,并且值相同呢,还是只要存在这个值就可以呢? 我们可以反编译看一下两款工具的代码,发现j1anfen这个方法定义了检测逻辑。需要header一致。为:f25a2fc72690b780b2a14e140ef6a9e0 ![](https://img.meituan.net/imgupload/1a4f27370339dcc352954097b222e20450127.png) summersec的是需要存在host: ![](https://img.meituan.net/imgupload/bcf6e36e448b752096327ffabf8a9b8754759.png) ## 总结 我们需要理解,我们不需要配合所有的链子都产生效果。只需要挑选工具的一个切面即可,这也就是为什么我们只做简单的aes-cbc的shiro版本伪造,而不去兼容高版。 目的是尽可能适配大众的攻击方式,找到最短路径,干扰红队人员正常的渗透测试活动。 此时我们针对常用的两个工具的攻击链伪造已经写完了,第一种方法就是匹配到dnslog地址,或者任意url,我们都用php模拟发送一个请求。 第二个,像j1anfen、summersec这样的工具,尽可能收集特征。根据payload去设置响应header头。 综上,希望能对乙方厂商的蜜罐开发起到一定的帮助。 评论列表 5440e72a 2024/02/20 师傅牛逼! 写评论 您的IP:3.15.188.239,临时用户名:926fa1ba评论已接入DepyWAF审计与流量系统,请勿频繁操作导致IP拉黑 提交评论 © 版权声明:非标注『转载』情况下本文为原创文章,版权归 Depy's docs 所有,转载请联系博主获得授权。
师傅牛逼!