戰(zhàn)指南)
說到瀏覽器取證很多做 DFIR 的朋友第一個會想到的就是 hindsight。這個由 Ryan Benson 維護(hù)的開源項(xiàng)目專門用來解析 Google Chrome / Chromium 以及各類基于 Chromium 內(nèi)核的瀏覽器Edge、Brave 都算的本地?cái)?shù)據(jù)。簡單說只要給它一個瀏覽器的用戶配置目錄它就能把歷史記錄、下載記錄、Cookie、Local Storage、登錄信息等多種痕跡整理成一條清晰的時間線而且默認(rèn)輸出格式可以直接進(jìn) Excel、SQLite 或者 HTML 報告。更狠的是你甚至可以丟一個內(nèi)存鏡像給它它能從物理內(nèi)存的碎片里把瀏覽器數(shù)據(jù)撈一部分出來。這篇文章就從實(shí)戰(zhàn)使用者的角度把 hindsight 的定位、原理、用法和踩坑經(jīng)驗(yàn)完整梳理一遍給正在做事件響應(yīng)、內(nèi)部調(diào)查或合規(guī)審計(jì)的同行一份可以直接照著操作的清單。1. 項(xiàng)目定位hindsight 究竟是干什么的1.1 一個讓你“事后看清現(xiàn)場”的瀏覽器取證工具h(yuǎn)indsight 這名字起得很貼切就是“事后回看”的意思。事件發(fā)生之后調(diào)查人員最想知道的就是這臺機(jī)器上的用戶到底去了哪些網(wǎng)站、下載過什么文件、搜過什么關(guān)鍵詞、登錄過哪些賬號。瀏覽器幾乎是現(xiàn)代人上網(wǎng)行為的唯一記錄者而 Chrome 由于其市場占有率成了取證里繞不開的重頭戲。在沒有專門工具的時代處理 Chrome 痕跡需要手動打開 SQLite 數(shù)據(jù)庫、查表結(jié)構(gòu)、自己轉(zhuǎn)時間戳一套流程下來大半天就沒了。hindsight 做的事情就是把這套流程自動化輸入一個用戶配置目錄Profile Directory輸出一份統(tǒng)一格式的時間線覆蓋 URL 訪問、下載、搜索詞、Cookie、表單填充、本地存儲等幾十種痕跡。這個項(xiàng)目我也記不清在多少個案子里幫過忙了尤其是時間緊迫的應(yīng)急響應(yīng)場景它的價值不在“能不能解析”而在“能多快讓人看懂現(xiàn)場”。1.2 它到底能解析出什么要理解 hindsight先得知道 Chrome 的數(shù)據(jù)分散在哪些文件里。它不像大多數(shù)軟件那樣一個數(shù)據(jù)庫裝完所有東西而是按用途拆成了多個文件hindsight 做的就是把這些不同格式的數(shù)據(jù)統(tǒng)一吃進(jìn)來。痕跡類型對應(yīng)文件數(shù)據(jù)格式hindsight 能提取到的核心信息歷史記錄HistorySQLiteURL、標(biāo)題、訪問時間、跳轉(zhuǎn)來源、訪問次數(shù)下載記錄History 中的 downloads 表SQLite下載鏈接、保存路徑、開始/結(jié)束時間搜索詞History 中的 keyword_search_terms 表SQLite在搜索引擎里敲過的關(guān)鍵詞CookieCookiesSQLitehost、name、value、創(chuàng)建/過期時間可嘗試解密登錄憑據(jù)Login DataSQLite保存的賬號密碼加密存儲表單自動填充Web DataSQLite姓名、郵箱、電話等表單字段本地存儲Local StorageLevelDB網(wǎng)站保存在本地的鍵值數(shù)據(jù)會話/標(biāo)簽頁Current Session / Current TabsSNSS瀏覽器關(guān)閉前打開的標(biāo)簽頁和會話恢復(fù)數(shù)據(jù)緩存Cache 目錄Cache 格式訪問過的資源 URL、大小、最后訪問時間這里注意不同版本對“能解析多少”會有差異但上面這些是 hindsight 長期以來的核心覆蓋范圍。它還有一個很實(shí)用的特性把跨文件的數(shù)據(jù)統(tǒng)一成一條時間線。這樣你不用自己去關(guān)聯(lián)不同數(shù)據(jù)庫里的時間字段直接看一條按時間排序的流水就能大致還原用戶行為。1.3 誰適合用什么場景能發(fā)揮最大價值我接觸下來最需要 hindsight 的三類人第一類是事件響應(yīng)IR人員。機(jī)器已經(jīng)因?yàn)獒烎~、惡意軟件或者內(nèi)網(wǎng)滲透中招了你的第一反應(yīng)是查用戶訪問過什么惡意地址、下載過什么可疑文件。Chrome 歷史往往直接給出答案省去大量端到端的流量回溯。第二類是內(nèi)部調(diào)查和違規(guī)審計(jì)。員工是否訪問了不該訪問的站點(diǎn)、是否在敏感時間內(nèi)下載過數(shù)據(jù)這類問題用 hindsight 拉一條時間線比翻日志快得多。第三類是數(shù)字取證 / 司法鑒定人員。需要把瀏覽器痕跡以規(guī)范形式導(dǎo)出、記錄工具版本、形成報告hindsight 的 SQLite 和 HTML 輸出格式就很適合存檔。如果你是普通用戶想看看瀏覽器到底記錄了你多少信息它也能跑只是主要設(shè)計(jì)目標(biāo)還是面向調(diào)查場景。2. 前置知識Chrome 到底把痕跡藏在哪里2.1 先搞清楚 Profile 目錄在哪別找錯地方hindsight 的輸入不是整個安裝目錄而是“用戶配置目錄”。Chrome 的安裝文件和用戶數(shù)據(jù)是完全分開的安裝目錄里沒有歷史記錄千萬別搞混。不同操作系統(tǒng)下默認(rèn)的配置目錄位置如下操作系統(tǒng)Chrome 配置目錄路徑Windows%LOCALAPPDATA%\Google\Chrome\User Data\DefaultmacOS~/Library/Application Support/Google/Chrome/DefaultLinux~/.config/google-chrome/default這里有一個特別容易踩的坑User Data這個目錄下面通常有多個子目錄Default只是一個默認(rèn)的 Profile。如果用戶自己創(chuàng)建過多重配置文件還會出現(xiàn)Profile 1、Profile 2之類的目錄。hindsight 的最小輸入粒度是單個 Profile 目錄不是整個User Data。你如果把User Data整個丟給它往往會得到空結(jié)果或者解析失敗因?yàn)樗谕谳斎肽夸浝镏苯诱业紿istory、Cookies這些文件。Edge 和 Brave 也有類似結(jié)構(gòu)只是路徑不同Edge 在%LOCALAPPDATA%\Microsoft\Edge\User Data\DefaultBrave 在%LOCALAPPDATA%\BraveSoftware\Brave-Browser\User Data\Default。hindsight 用-b參數(shù)指定瀏覽器類型基本就是換了個路徑前綴內(nèi)部邏輯幾乎通用。2.2 SQLite、LevelDB、Cache三種數(shù)據(jù)的脾氣不一樣Chrome 的歷史記錄、Cookie、登錄數(shù)據(jù)基本都是 SQLite 數(shù)據(jù)庫。SQLite 的文件結(jié)構(gòu)化很強(qiáng)數(shù)據(jù)在表里躺著只要表結(jié)構(gòu)認(rèn)識解析就相對簡單。但 SQLite 搭配了 WALWrite-Ahead Logging模式很多關(guān)鍵數(shù)據(jù)在History-wal、Cookies-wal這類附屬文件里如果只拿走主文件你會丟失最近一段時間的數(shù)據(jù)。hindsight 在處理的時候會把 WAL 一并考慮你在取證時也應(yīng)該把整個 Profile 目錄完整復(fù)制別只挑主文件。LevelDB 是另一類存儲格式用在 Local Storage 這類鍵值數(shù)據(jù)上。它沒有 SQL 表結(jié)構(gòu)數(shù)據(jù)分散在多個.ldb、.log文件里底層是類似 LSM-Tree 的結(jié)構(gòu)。用類比來說SQLite 是一本賬本LevelDB 是一堆寫滿字、順序混亂的便利貼想從里面找出某個網(wǎng)站存了什么值需要專門的遍歷邏輯。hindsight 對 LevelDB 的支持雖然不能說覆蓋所有版本但主流 Chrome 版本上表現(xiàn)都還算穩(wěn)定。Cache 目錄則是第三種脾氣。Chrome 的磁盤緩存在Profile\Cache和Profile\Code Cache下文件以f_XXXXXX這類編號命名真正的 URL 映射關(guān)系記錄在index和邏輯上關(guān)聯(lián)的入口文件里。hindsight 可以讀取緩存索引提取資源 URL 和部分元數(shù)據(jù)但不保證能把緩存文件內(nèi)容完整還原成原始文件。做取證的時候緩存的價值往往是“證明某個資源確實(shí)被加載過”這個維度它已經(jīng)能覆蓋。2.3 最容易掉進(jìn)去的兩個坑時間戳和加密先說時間戳。Chrome 的 SQLite 數(shù)據(jù)庫里存的時間不是 Unix 時間戳而是 WebKit 時間戳從 1601 年 1 月 1 日 0 時UTC開始計(jì)的微秒數(shù)。如果你拿通用 SQLite 工具直接打開 History 文件看到13848412567283123這樣的數(shù)字直接換算 Unix 時間是會出錯的。hindsight 在輸出時間線的時候會幫你轉(zhuǎn)換成可讀的 UTC 時間但如果你要自己寫 SQL 查數(shù)據(jù)庫必須用SELECT url, visit_time, datetime(visit_time / 1000000 - 11644473600, unixepoch) AS visit_time_utc FROM visits;其中11644473600是 1601-01-01 到 1970-01-01 之間的秒數(shù)差。macOS 上如果發(fā)現(xiàn)時間多了或者少了整小時優(yōu)先懷疑時區(qū)設(shè)置取證里記錄 UTC 和本地時區(qū)是基本習(xí)慣。再說加密。Chrome 的 Cookie 和 Login Data 里真正敏感的值是加密后落盤的。Windows 上用 DPAPI 加密DPAPI 的密鑰綁定用戶賬戶和機(jī)器你在取證機(jī)上直接解密幾乎不可能成功macOS 上則依賴 KeychainLinux 上不同發(fā)行版情況更雜不少環(huán)境里 Cookie 甚至是明文。hindsight 提供了解密嘗試比如 Windows 上如果能在目標(biāo)系統(tǒng)上下文中運(yùn)行或者通過其他手段拿到 DPAPI Master Key它就能把 Cookie 里的值還原出來。關(guān)于這一步我后面的常見問題部分會專門說。3. 實(shí)操從拿到一個鏡像到產(chǎn)出時間線3.1 環(huán)境準(zhǔn)備和輸入數(shù)據(jù)怎么弄hindsight 是純 Python 項(xiàng)目Python 3.6 以上的環(huán)境基本都能跑。我一般推薦兩種裝法一是直接從項(xiàng)目源碼跑python hindsight.py方便跟進(jìn)最新版本二是用作者打包好的二進(jìn)制適合在取證工作站上不裝 Python 的情況。依賴項(xiàng)裝一下 requirements 就行核心其實(shí)就那幾個常用庫沒有什么特別重的環(huán)境負(fù)擔(dān)。取證的輸入數(shù)據(jù)來源通常有三種第一種是在線獲取。機(jī)器還開著你要在系統(tǒng)層面做內(nèi)存鏡像或者復(fù)制文件。復(fù)制 Chrome Profile 的時候注意有個坑Chrome 正在運(yùn)行時會對數(shù)據(jù)庫文件加鎖直接復(fù)制可能拿到不完整數(shù)據(jù)。Windows 下最好用卷影復(fù)制VSS或者先讓用戶退出 Chrome再拷貝macOS 和 Linux 上也要避免在 Chrome 活躍寫庫的時候直接 cp。第二種是離線鏡像。拿到磁盤鏡像之后把它掛載成只讀設(shè)備然后從里面把User Data目錄整體取出來。我的建議是“整體取出”因?yàn)?Chrome 的 WAL 文件和 LevelDB 碎片文件都是相互依賴的少一個文件解析結(jié)果就可能不完整。第三種也是 hindsight 區(qū)別于很多同類工具的地方直接把物理內(nèi)存鏡像raw memory dump作為輸入。因?yàn)闉g覽器進(jìn)程運(yùn)行時URL、Cookie、SQLite 頁面這些數(shù)據(jù)會殘留在堆和共享內(nèi)存里hindsight 可以用特征掃描的方式把這些碎片撈出來。實(shí)測下來內(nèi)存鏡像的解析結(jié)果不如完整 Profile 目錄干凈但很多案件里你根本沒有完整磁盤鏡像的機(jī)會這時它就是救命稻草。3.2 命令行基本用法一頁紙講清楚hindsight 的接口不算復(fù)雜。最典型的用法是這樣# 解析一個離線復(fù)制出來的 Chrome 默認(rèn) Profile python hindsight.py -i /cases/case001/profile/Default \ -o /cases/case001/output \ -b chrome \ --timeline timeline.csv \ --sqlite result.sqlite \ --html report.html常用的參數(shù)我列一下參數(shù)作用我的建議-i INPUT輸入路徑可以是 Profile 目錄、磁盤鏡像掛載目錄或內(nèi)存鏡像文件必填先確認(rèn)路徑層級正確-o OUTPUT輸出目錄所有產(chǎn)物寫在這里建議每次案件獨(dú)立建目錄-b BROWSER瀏覽器類型chrome / chromium / brave / edge默認(rèn) chrome用對應(yīng)瀏覽器時才改--timeline FILE輸出統(tǒng)一的 CSV 時間線最常用直接進(jìn) Excel 或后續(xù)工具--sqlite FILE導(dǎo)出結(jié)構(gòu)化 SQLite 結(jié)果適合做 SQL 查詢和二次分析--html FILE生成 HTML 報告需要給別人快速瀏覽的時候很有用--decrypt嘗試對 Cookie、登錄信息解密Windows 上配合密鑰材料才有意義這里要提醒一句不同年份的版本參數(shù)細(xì)節(jié)會有變化我在新環(huán)境上從來都是先跑一遍python hindsight.py --help確認(rèn)當(dāng)前版本的參數(shù)名再開始正式解析。這個習(xí)慣幫我避免過不少“命令跑了沒反應(yīng)”的尷尬。3.3 三種輸出怎么配合用才算真的會看結(jié)果CSV 時間線是我最先看的產(chǎn)物。它的好處是平鋪直敘每一行是一條具有時間屬性的行為記錄文件名、來源類型、URL、描述都在。拿到手之后我會先按時間排序圈定案發(fā)窗口然后只篩這個時間段內(nèi)的記錄效率最高。如果案件涉及時間跨度很長CSV 配合 Excel 透視表可以很快做出訪問頻次排序。SQLite 輸出適合做精確查詢。比如你想知道用戶是否訪問過某個特定域名直接在這個庫里跑一句SELECT url, title, visit_time_utc FROM urls WHERE url LIKE %example.com% ORDER BY visit_time_utc;比在 CSV 里翻字符串高效得多。而且 SQLite 輸出保留了相對規(guī)范的結(jié)構(gòu)化字段寫報告的時候引用也方便。HTML 報告是給“非技術(shù)觀眾”看的。調(diào)查結(jié)論往往要讓領(lǐng)導(dǎo)、法務(wù)或者外部審計(jì)人員理解HTML 界面里可以按時間、按類型篩選展示出來的效果比 CSV 說服力強(qiáng)很多。我自己的習(xí)慣是先用 CSV 自己把案情摸清楚再生成 HTML 作為存檔和交付物SQLite 作為原始附證備用。3.4 內(nèi)存鏡像解析到底怎么玩把內(nèi)存鏡像作為輸入是這樣用的python hindsight.py -i /cases/case001/memory.raw -o /cases/case001/mem_output -b chrome --timeline mem_timeline.csv原理上hindsight 會在內(nèi)存數(shù)據(jù)里搜索 Chrome 配置文件的特征結(jié)構(gòu)比如 SQLite 的頁頭標(biāo)志、已知表結(jié)構(gòu)命中之后再把能恢復(fù)的記錄解析出來。由于物理內(nèi)存里的數(shù)據(jù)是碎片化的結(jié)果會有遺漏比如只有部分訪問記錄、部分 Cookie。我的經(jīng)驗(yàn)是內(nèi)存解析結(jié)果不要單獨(dú)作為定案依據(jù)但可以用來“指認(rèn)”某臺機(jī)器上確實(shí)存在過相關(guān)瀏覽器活動結(jié)合其他證據(jù)形成證據(jù)鏈。內(nèi)存鏡像解析比較慢尤其是鏡像體積大的時候我建議設(shè)置一個足夠充裕的時間窗口再跑別在應(yīng)急現(xiàn)場傻等可以先跑磁盤 Profile 的解析。4. 常見問題與排查技巧實(shí)錄4.1 輸出為空或者只有登錄信息找不到歷史這個問題十有八九是輸入路徑給錯了。很多人把整個User Data目錄傳給 hindsight它找不到預(yù)期文件自然返回空結(jié)果。正確做法是給到User Data\Default這一層。另外也要檢查 Profile 目錄里History文件是否為 0 字節(jié)如果用戶在瀏覽器設(shè)置里開了自動清除歷史記錄或者機(jī)器上裝了隱私清理工具History 可能被清理壓縮過體積會變得很小內(nèi)容也很有限。還有一個經(jīng)常被忽略的點(diǎn)歷史記錄文件存在不代表里面有“很多”記錄。如果用戶只是把 Chrome 當(dāng)短暫工具用比如偶爾查個資料就關(guān)那么可能只有一個空庫hindsight 解析結(jié)果自然寥寥無幾。此時不要硬說“用戶沒有上網(wǎng)”建議把系統(tǒng)事件日志、DNS 日志、代理日志綜合起來看。4.2 Chrome 版本更新導(dǎo)致兼容問題瀏覽器取證領(lǐng)域最煩人的問題就是“版本一升級工具就失靈”。Chrome 會不定期調(diào)整數(shù)據(jù)庫表結(jié)構(gòu)甚至新增加密機(jī)制。比如前幾年 Chrome 第 127 版本開始在 Windows 上引入 App-Bound Encryption對 Cookie 的保護(hù)方式發(fā)生重大變化不少取證工具的自動解密鏈路當(dāng)場失效。hindsight 這類開源工具的優(yōu)勢在于迭代快社區(qū)追著新版去適配但你的工作環(huán)境里如果有老舊版本還在跑就要特別注意。我的應(yīng)對方法是每個案件記錄 Chrome 版本號在User Data目錄里的Local State文件或者chrome://version里能看到然后保持 hindsight 更新到最新。上真實(shí)鏡像之前先用一個已知瀏覽記錄的 Chrome 版本跑一遍確認(rèn)輸出正常再繼續(xù)。這個“先驗(yàn)證再上案場”的習(xí)慣救過我很多次。4.3 Cookie 解密失敗怎么辦Cookie 解不開是最常見的求助話題。Windows 上 Chrome 的 Cookie 值由 DPAPI 加密DPAPI 的 Master Key 和用戶登錄密碼、機(jī)器 SID 綁定。在離線鏡像上如果想解密需要拿到目標(biāo)用戶的 NTUSER.DAT、DPAPI 相關(guān)的 Master Key 文件并且配合用戶密碼或域環(huán)境信息。hindsight 提供了解密嘗試但前提是你把密鑰材料準(zhǔn)備好或者是在能模擬目標(biāo)用戶上下文的環(huán)境里執(zhí)行。我的實(shí)操建議是分三步走第一步在目標(biāo)機(jī)器還在線、且能以該用戶身份登錄時優(yōu)先在這個上下文里跑 hindsight讓系統(tǒng) API 自動完成 DPAPI 解密第二步如果已經(jīng)拿到鏡像嘗試提取 DPAPI Master Key 并單獨(dú)解密測試第三步實(shí)在不行就在報告里如實(shí)寫“Cookie 值因加密無法還原”同時基于 Cookie 的元數(shù)據(jù)域名、創(chuàng)建時間、大小繼續(xù)分析這些信息不解密也能看見。取證里“誠實(shí)記錄局限”遠(yuǎn)比“編一個完整故事”重要。還有一個 Linux/macOS 的細(xì)節(jié)如果目標(biāo)機(jī)器上的 Chrome 是用系統(tǒng)鑰匙串或 kwallet 加密的 Cookie那么你還得拿到對應(yīng)的鑰匙串文件。很多 Linux 發(fā)行版默認(rèn)并不啟用這些加密反而容易出現(xiàn)“明文 Cookie”所以在 Linux 案件里碰到可閱讀的 Cookie 值不要驚訝這是環(huán)境差異造成的不是工具出錯。4.4 時間線太亂數(shù)據(jù)太多從哪看起跑完 hindsight 之后最常遇到的不是“沒數(shù)據(jù)”而是“數(shù)據(jù)太多”。一個用了半年的 Chrome Profile時間線 CSV 可能有幾十萬行。直接打開看會眼花繚亂。我的處理套路是這樣先看keyword_search_terms搜索詞是最濃縮的行為意圖一下子能知道用戶在找什么??磀ownloads下載行為往往是惡意軟件落地、數(shù)據(jù)外泄的關(guān)鍵節(jié)點(diǎn)。只看“直接輸入 URL 訪問”的記錄過濾大量重定向和資源加載噪聲。圈定案發(fā)時間窗口比如攻擊者橫向移動的那幾個小時把窗口外的記錄全部折疊。配合 SQL 查詢和 Excel 透視表幾分鐘就能把粗糙的時間線變成一個“行為敘事”這個整理后的敘事才是寫報告的基礎(chǔ)材料。5. 把 hindsight 集成進(jìn)自己的取證工作流5.1 和其他 DFIR 工具怎么銜接hindsight 不是孤立工作的。業(yè)界比較常見的做法是把它的時間線輸出丟給 dftimewolf 之類的編排工具和系統(tǒng)日志、文件系統(tǒng)時間線、進(jìn)程執(zhí)行記錄一起做關(guān)聯(lián)分析。我自己不做特別重的編排但至少會讓 hindsight 的 CSV 時間線和以下證據(jù)互相對照Windows 事件日志里的 4624/4625 登錄事件、主機(jī)上的文件創(chuàng)建時間來自 USN Journal 或 $MFT、網(wǎng)絡(luò)代理訪問日志。瀏覽器記錄告訴你“用戶想干嘛”文件系統(tǒng)時間線告訴你“機(jī)器上實(shí)際發(fā)生了什么”兩條線一對很多事情就閉環(huán)了。5.2 報告里怎么寫才不會被人挑刺寫報告時至少記錄這些信息hindsight 版本號、輸入路徑哪個 Profile、瀏覽器類型和版本盡量、操作系統(tǒng)類型、解析時間、輸出產(chǎn)物 hash、解析的是歷史記錄還是包含解密 Cookie、解密是否成功。表格形式我會這樣列項(xiàng)目記錄內(nèi)容工具h(yuǎn)indsight v2024.06輸入/cases/case001/profile/Default瀏覽器Chrome 125.0.6422.60 (Windows)輸出產(chǎn)物timeline.csv (SHA256: ...)Cookie 解密未解密元數(shù)據(jù)已提取時區(qū)UTC8 / 已轉(zhuǎn)換為 UTC規(guī)范的記錄不是給自己看的是讓后來者甚至法庭上的人能重復(fù)你的步驟。這行做得越久越明白“可復(fù)現(xiàn)”比“結(jié)論精彩”重要。5.3 個人經(jīng)驗(yàn)先驗(yàn)證再上案場最后說點(diǎn)我個人最深的體會。Chrome 版本變動頻繁hindsight 再怎么跟進(jìn)也會有滯后。我在日常案件里最常做的一件事就是準(zhǔn)備一臺“標(biāo)準(zhǔn)測試機(jī)”上面固定裝一個已知版本的 Chrome提前瀏覽固定的幾個網(wǎng)站存幾條明顯的訪問記錄。每次接到新案件、或者發(fā)現(xiàn) hindsight 有更新時先用這臺測試機(jī)跑一遍確認(rèn)解析結(jié)果完整、時間戳轉(zhuǎn)換正確再把同一個工具版本用于真實(shí)鏡像。這個習(xí)慣看起來多花了幾分鐘但實(shí)際幫我避開過好幾次“工具升級后時間戳整體多出八小時”之類的坑。瀏覽器取證本來就是從細(xì)節(jié)里摳真相的事情工具會變、瀏覽器會變、加密機(jī)制會變但“先驗(yàn)證、再上案場”這個流程不會過時。如果你剛開始接觸 hindsight我建議也給自己建一個這樣的標(biāo)準(zhǔn)測試環(huán)境它會讓你在真正的案件里少走很多彎路。