怎麼檢測Edge瀏覽器中已安裝的擴充套件應用


一、前言


對攻擊者來說,如果能夠收集受害者的指紋資訊是最好不過的事情。在前面的文章中,我們已經知道攻擊者可以利用漏洞來檢測特定檔案的存在(以規避安全分析人員的檢測),也可以將mimeTypes與應用程式相關聯。微軟及時修復了這兩個漏洞,也封堵了與之相關的其他漏洞。今天,我們將向讀者展示如何檢測Edge瀏覽器中已安裝的擴充套件應用。

4月5日,Nataliia Bielova釋出了一條推文,介紹了某個網站如何檢測多個瀏覽器上已安裝的擴充套件應用,但微軟的Edge並不包括在內。

如果讀者希望進一步瞭解如何檢測Firefox和Chrome瀏覽器的擴充套件應用,可以參考這篇文章以獲取更多知識。本文我們將在Edge瀏覽器上完成同樣任務。

二、安裝擴充套件


在Edge瀏覽器的擴充套件商店中,我隨機選擇一款名為AdGuard blocker的擴充套件應用。兩次滑鼠點選後,擴充套件已安裝完畢,自動開啟了一個感謝頁面。正是這個頁面給了我研究的靈感,如下圖所示:

我們可以利用上面的URL資訊開始研究。如果我們能夠在一個iframe內部中載入該URL,通過onload或onreadystatechange事件(或者其他事件),判斷獲取的是Edge瀏覽器的標準404頁面(即擴充套件未安裝)還是該擴充套件的thankyou.html頁面,那麼我們基本上就可以判斷該擴充套件是否存在。不幸的是,iframe拒絕載入該擴充套件的URL。

1

   

如果使用windows.open方法,結果如何呢?我們可以嘗試在指令碼中開啟擴充套件的URL:

1. 2

win = window.open("ms-browser-extension://EdgeExtension_AdguardAdguardAdBlocker_m055xr0c82818/pages/thankyou.html");    
// win returns null when the URL is ms-browser-extension    

頁面開啟成功!不過對我們來說這個結果用處不大,因為不管擴充套件是否安裝,windows物件返回值始終為空(null)。換句話說,當我們試圖使用ms-browser-extension擴充套件協議開啟一個新建視窗時,返回結果始終為null。因此即使我們的確能夠開啟瀏覽器視窗(當然這是個醜陋的解決方案),我們也無法判斷獲取的結果是否準確。

我們是否可以利用擴充套件中的圖片來判斷呢?擴充套件中的圖片有可能會暴露在主頁面中,我們可以使用onload或onerror事件檢測擴充套件是否安裝。首先,我們需要找出擴充套件檔案存放在檔案系統中具體位置。

三、定位擴充套件檔案


執行Process Monitor,將MicrosoftEdgeCP.exe新增到過濾規則中。開啟Edge瀏覽器,在位址列中輸入AdGuard擴充套件的URL,載入擴充套件的感謝頁面。在Process Monitor中,我們很快就可以定位到擴充套件檔案所處的具體位置。記住我們的目標是找出擴充套件中的圖片,判斷是否可以通過onload或onerror事件檢測圖片的存在。

看起來擴充套件檔案存放在如下位置:

訪問上一層目錄,我們可以看到其中存在一個manifest.json檔案,定義了某些資源可以被任何網站載入,與Chrome或Firefox瀏覽器類似。

這些資源大多數都是圖片資源,我們可以嘗試使用下面這個指令碼載入logo.svg圖片,如果觸發onload事件,則表明該擴充套件已安裝,否則表明使用者並沒有安裝該擴充套件。

這種方法並沒有讓我眼前一亮,因為我們還是重複以前檢測的老套路(與Chrome和FireFox瀏覽器上的方法類似),我們過度依賴於擴充套件的積極配合,允許我們載入其內部資源。如果某個擴充套件在manifest檔案中不存在Web可以訪問的資源,這種情況下我們如何檢測它的存在呢?

四、檢測擴充套件的通用方法


經過了短暫的嘗試後,我決定借鑑Soroush提出的IE DTD技巧,這類技巧嘗試使用微軟的XMLDOM物件載入資源,通過錯誤號來判斷資原始檔的存在與否。在Edge瀏覽器上,我們沒有XMLDOM物件,但我們可以使用與之類似的XMLHttpRequest物件。

使用XMLHttpRequest物件開啟資源時,如果擴充套件存在,它會丟擲拒絕訪問異常,否則會丟擲未指定錯誤異常。為了表示對Soroush成果的尊重,我們同樣採用異常錯誤號來判斷所丟擲的異常類別。程式碼如下所示:

結果非常不錯,感謝Soroush的偉大發現。

順便提一下,你是否注意到我們使用的URL並沒有指向任何一個資原始檔?這涉及到XML的一些技巧。對XML來說,使用目錄名就已足夠,我們不需要指向某個特定資源,只需要掌握擴充套件的ID資訊就足以檢測擴充套件是否存在。如果我們希望實現一個通用的檢測工具,查詢所有的擴充套件資訊,我們首先需要在自己的Edge瀏覽器上安裝所有的擴充套件,記錄這些擴充套件的ID。我們只需要在安裝擴充套件後,開啟一個空白頁面,按下F12,就可以找到擴充套件的ID資訊。如下圖所示:

我們現在可以利用這些資訊為Edge瀏覽器建立一個通用的擴充套件檢測工具。已禁用的擴充套件不會在開發者工具中載入,但我們還是可以在登錄檔中找到它們。

即使使用者禁用了擴充套件,我們的檢測方法仍然行之有效。我們利用PoC檢測出來的20個已安裝的擴充套件資訊,如下圖所示。

檢測已安裝擴充套件的PoC可以在這裡找到。