前言
之前总结过的内容被自己的windows defender杀掉了,现哭着再总结一次。起因源于之前参加hvv遇到此洞,故而作此总结。
0x01 概述
用ANSI C写的redis作为非关系型内存数据库,是key-value存储系统,且支持主从服务器同步。redis漏洞产生的原因一般是:
- 直接暴露在公网:绑定在
0.0.0.0:6379
,且没有进行添加防火墙规则、避免其他非信任来源IP访问等相关安全策略 - 没有设置密码认证(一般为空):可以免密远程登录redis服务
漏洞可能产生的危害:
攻击者无需认证访问到内部数据,可能导致敏感信息泄露,黑客也可以通过恶意执行flushall来清空所有数据
攻击者可通过EVAL执行lua代码,或通过数据备份功能往磁盘写入后门文件
如果Redis以root身份运行,黑客可以给root账户写入SSH公钥文件,直接通过SSH登录受害者服务器
下图为redis拿shell的三种方式及其条件:
0x02 环境搭建
靶机:Ubuntu 192.168.140.129
攻击机:kali 192.168.140.130
kali一键安装redis,sudo apt install redis
Ubuntu debian或其他环境安装指南:
安装:
1 | tar -xzvf redis-6.0.1.tar.gz |
配置:
1 | # 去掉仅对内网开放,加# |
当然,别忘了,ubuntu要启动redis-server服务。
为保证后面写入计划任务,此处以root权限启动redis
0x03 利用方式
1. 写webshell
条件:
存在web目录
晓得绝对路径
当然还要有写入权限
流程:
实际渗透过程中,这个方法通常需要搭配 phpinfo 等信息使用
1 | redis-cli -h 192.168.140.129 or 域名 |
最后用蚁剑连接即可:http://192.168.127.139/1.php
2. 写ssh公钥
原理:Redis 未授权访问通过写 /root/.ssh
下的authorized_keys 来拿权限
条件:
对外开启ssh服务
Redis 服务运行在 root 用户下(否则还要猜测用户)
流程:
生成本机ssh公私钥
为防止脏数据污染公钥,在公钥内容上下加空行。之后将公钥写入key.txt
shell的echo :
用于字符串输出,其注意事项如下图所示:
redis远程连接靶机,将公钥文件key.txt写入靶机
-x:read last argument from STDIN
cat key.txt | redis -h 192.168.140.129 -x set crack:
cat key.txt 输出 作为后面的输入
-x 读取标准输入
set crack 是将读取的输入作为crack此参数内容
相当于把参数crack参数和-x读的数据组了个命令执行
找到靶机redis备份路径:
更改redis备份路径为ssh公钥存放目录/home/glory/.ssh,默认情况为/root/.ssh。并设置上传公钥文件名为authorized_keys
config:可查看或设置配置项
dbfilename:备份文件
SSH远程登陆成功
3. 在crontab中写定时任务
条件:
有可写计划任务的权限,将文件写入到计划目录下执行
多见于CentOs使用
流程:
攻击机监听本机9999端口,接收之后的反弹shell
利用redis以root权限运行有可写计划任务的权限,写crontab
1./var/spool/cron目录存储每个用户生成的crontab文件
2.直接往当前用户的crontab中写反弹shell,必须要换行
3.* * * * * myCommand:1分钟执行一次myCommand
4.n个数大于2,否则文件内容里面的任务计划会出现乱码导致命令执行失败
观察到此时并无反弹shell。但是确实写入成功。
具体排查问题另起一篇博客说明。
0x02 如何防护
1.禁止远程使用一些高危命令
我们可以通过修改redis.conf文件来禁用远程修改DB文件地址
1 | rename-command FLUSHALL "" |
2.低权限运行Redis服务
为Redis服务创建单独的user
和home
目录,并且配置禁止登陆
1 | groupadd -r redis && useradd -r -g redis redis |
3.为Redis添加密码验证
我们可以通过修改redis.conf文件来为Redis添加密码验证
1 | requirepass mypassword |
4.禁止外网访问 Redis
我们可以通过修改redis.conf文件来使得Redis服务只在当前主机可用
1 | bind 127.0.0.1 |