Redis无密码被别人上了以后

Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。从2010年3月15日起,Redis的开发工作由VMware主持。从2013年5月开始,Redis的开发由Pivotal赞助。

Redis因配置不当可以未授权访问。攻击者无需认证访问到内部数据,可导致敏感信息泄露,也可以恶意执行flushall来清空所有数据。
攻击者可通过EVAL执行lua代码,或通过数据备份功能往磁盘写入后门文件。

如果Redis以root身份运行,可以给root账户写入SSH公钥文件,直接通过SSH登录受害服务器。

起源

故事是这样的。。。

我在补充渗透搜索引擎的时候顺手去fofa搜索了一个redis

第一位受害者

这里看到第一台是有授权的(也就是设置了密码)

image-20210809103004564

第二台连接成功

image-20210809101355741

redis版本比较新,不排除是测试使用的,系统应该就是centos7了。

本来想要利用一下看看能不能ssh上去的,发现里面已经有4个key了。

我这边看了里面的内容都是一样的。

image-20210809101055442

key的内容,脚本地址http://194.87.139.103/cleanfda/init.sh,脚本肯定是一个人写的然后所有人都在用。

image-20210809101148315

门罗币挖矿木马

脚本分析查看→挖矿木马简单分析

第二位受害者

redis版本和上一个一样,处理系统内核有点区别。

image-20210809103302413

里面的key大同小异

image-20210809103213763

key的内容,还是定时任务下载挖矿木马。

image-20210809103807892

脚本内容和上一个略有差异,但一样是门罗币挖矿木马

image-20210809103755753

还有一个Windows服务器受害者

image-20210809104524668

疑似挖矿木马,不过脚本404看不到了。

image-20210809104627907

还有写入公钥

image-20210809104431130

什么是Redis未授权访问漏洞?

Redis在默认情况下,会绑定在0.0.0.0:6379。如果没有采取相关的安全策略,比如添加防火墙规则、避免其他非信任来源IP访问等,这样会使Redis服务完全暴露在公网上。如果在没有设置密码认证(一般为空)的情况下,会导致任意用户在访问目标服务器时,可以在未授权的情况下访问Redis以及读取Redis的数据。攻击者在未授权访问Redis的情况下,利用Redis自身的提供的config命令,可以进行文件的读写等操作。攻击者可以成功地将自己的ssh公钥写入到目标服务器的 /root/.ssh文件夹下的authotrized_keys文件中,进而可以使用对应地私钥直接使用ssh服务登录目标服务器。

简单来讲,我们可以将漏洞的产生归结为两点:

  • redis绑定在 0.0.0.0:6379,且没有进行添加防火墙规则、避免其他非信任来源IP访问等相关安全策略,直接暴露在公网上
  • 没有设置密码认证(一般为空),可以免密码远程登录redis服务

img

漏洞可能产生的危害:

  • 攻击者无需认证访问到内部数据,可能导致敏感信息泄露,黑客也可以通过恶意执行flushall来清空所有数据
  • 攻击者可通过EVAL执行lua代码,或通过数据备份功能往磁盘写入后门文件
  • 如果Redis以root身份运行,黑客可以给root账户写入SSH公钥文件,直接通过SSH登录受害者服务器

防护

Redis在网络上被黑的案例不少,Redis本身的安全性并不高,所以大家在使用Redis的时候一定要做好安全措施。

为Redis添加密码验证

我们可以通过修改redis.conf文件来为Redis添加密码验证

1
requirepass mypassword

禁止外网访问 Redis

我们可以通过修改redis.conf文件来使得Redis服务只在当前主机可用

1
bind 127.0.0.1

还可以通过防火墙等进行配置,如果是云服务器安全组也可以进行配置。

禁止使用Root权限启动

使用Root权限去运行网络服务是比较有风险的,所以不建议使用Root权限启动Redis。加固建议如下:

1
2
useradd -s /sbin/nolog -M redis 
sudo -u redis /<redis-server-path>/redis-server /<configpath>/redis.conf

修改默认的监听端口

Redis默认监听的端口为6379,为了更好地隐藏服务,我们可以在redis.conf中修改Redis的监听端口。找到包含port的行,将默认的6379改为其他自定义的端口号,然后重启Redis。

1
port 6379