原文:brokenbrowser
原作者:Manuel Caballero
譯:Holic (知道創宇404安全實驗室)
攻擊者喜歡收集受害者的指紋特征。我們之前已經見識了兩種技術,壞人可以通過檢測特定文件(來逃避分析人員),甚至可以獲取特定關聯應用的名稱。Microsoft 修補了諸如此類的特性,而今天我們會看到如何在 Edge 上檢測安裝的瀏覽器擴展程序。

另外,如此精彩的研究和 PoC 來自于 Inria Privatics, Gábor Gulyás 和 Nataliia Bielova。
安裝擴展程序
我在擴展應用商店隨意選了 AdGuard 廣告屏蔽插件。兩次點擊之后,它已經安裝并自動打開感謝頁面,而且在開始研究之前給了我靈感。下面一探究竟。

這一切從 URL 開始。如果我們可以在 iframe 中加載之,并檢測其存在 (onload/onreadystatechange/不勝枚舉),即區分出它與默認的 Edge 404 頁面, 我們基本就完成任務了。但很不幸,iframe 拒絕加載 ms-browser-extension: 協議。
<iframe src="ms-browser-extension://EdgeExtension_AdguardAdguardAdBlocker_m055xr0c82818/pages/thankyou.html"></iframe>

OK。那么用 window.open 又如何?至少可以用腳本打開這些 URL 吧?試一下便知!
win = window.open("ms-browser-extension://EdgeExtension_AdguardAdguardAdBlocker_m055xr0c82818/pages/thankyou.html");
// returns null when the URL is ms-browser-extension: (not useful for us)

打開了!但是對我們并不重要,因為不管安沒安裝插件, window.open() 返回的都是 null 而不是 window 對象。換而言之,我們試圖使用擴展程序協議 ms-browser-extension 打開新窗口時:它總是返回 null 的。所以即使能打開新窗口(這是個很丑的解決方案),我們也不能檢驗內容是否得以加載。
來自擴展程序的圖片呢?或許圖像暴露在主頁的時候,使用 onload/onerror 事件,我們可以檢測到擴展程序是否安裝。我們先看看擴展文件在我們文件系統中的位置。
查找擴展程序相關文件
啟動 Process Monitor,過濾 MicrosoftEdgeCP.exe。關閉 Edge,并通過復制到地址欄的方法打開 AdGuard 感謝頁面,Bang!我們馬上就能在 Process Monitor 中看到文件所在的位置。記住,我們的目標是從這個擴展程序中找出一個圖像,看看能否加載它,并通過 onload/onerror 檢測其存在。

看來擴展程序文件在這里:
C:\Program Files\WindowsApps\Adguard.AdguardAdBlocker_2.5.18.0_neutral__m055xr0c82818\Extension\Pages
轉到上層(父)文件夾,我們可以看到,就像 Chrome 和 Firefox,其中有個 manifest.json,允許某些資源被任何網站加載。
"web_accessible_resources": [
"elemhidehit.png",
"lib/content-script/assistant/css/assistant.css",
"lib/content-script/assistant/i/close.svg",
"lib/content-script/assistant/i/logo.svg", // Let's use this one!
"lib/content-script/assistant/i/logo-white.svg"
]
其中大多是圖像,我們用腳本試著加載 logo.svg。如果 onload 得以觸發,說明擴展程序已安裝,否則說明用戶沒有該擴展名。
var img = new Image();
img.onload = function(){alert("Extension Detected")}
img.onerror = function(){alert("Extension NOT Detected")}
img.src = "ms-browser-extension://EdgeExtension_AdguardAdguardAdBlocker_m055xr0c82818/lib/content-script/assistant/i/logo.svg";

而我并不為之所動。我們基本上沒有用到什么新的東西,就像其他檢測方法一樣(對應 Chrome/FF),我們依賴于特定擴展程序的配合,使資源得以加載。如果一個擴展程序在 manifest 中沒有 web 可訪問資源 的話,我們如何檢測呢?
插件檢測的通用方法
在各種技巧玩了幾分鐘,試著加載不可訪問的資源后,我決定廠商用類似于 Soroush 的 IE DTD 技巧。試著使用 Microsoft XMLDOM 對象加載資源,并根據錯誤號就能知道文件是否存在。在 Edge 上沒有 XMLDOM 對象,但是我們可以做一些就像常規 XMLHTTPRequest 做的事情。
如果嘗試打開資源而且擴展程序存在的話,它會拋出拒絕訪問的錯誤,否則是文件找不到的錯誤。實際上,為了紀念 Soroush 的神奇發現,我們盡量做的和他一樣優雅,并使用接受到的錯誤號進行判斷。一段代碼值千言,請看下面:
var extension = "ms-browser-extension://EdgeExtension_AdguardAdguardAdBlocker_m055xr0c82818";
try
{
var xhr = new XMLHttpRequest();
xhr.open("GET", extension, false);
xhr.send(null);
}
catch(e)
{
if (e.number == -2147024891) alert("Exists");
else alert("Does not exist");
}

現在看起來不錯了,感謝 Soroush 的精彩思路!
另外,你有沒有注意到我們使用的URL甚至沒有指向特定資源?這個 xml技巧與目錄名有關,甚至不需要指向擴展程序的特定資源,所以現在有插件的 ID 就足以進行檢測了。如果要構建一個通用探針來查找已經安裝的擴展程序,就像我們在 Chrome 和 Firefox 中見過的這種,首先要再 Edge 上安裝所以的擴展程序,并記下所有的 ID。這頗為簡單,只需要安裝擴展程序,加載空白頁,按下 F12,就足以展現插件的 ID。我已經安裝的其中的幾個,在下方清晰可見。

有了這些名稱,現在可以為 Microsoft Edge 創建一個通用擴展檢測器了。只有已禁用的擴展程序才不會在開發人員工具中加載,不過我們仍可以在注冊表中找到它們。
HKEY_CLASSES_ROOT\Local Settings\Software\Microsoft\Windows\CurrentVersion\AppContainer\Storage\microsoft.microsoftedge_8wekyb3d8bbwe\MicrosoftEdge\Extensions
有一點值得注意,即使用戶已經禁用擴展程序,我們的檢測方法依然有效。以下便是用上述方法檢測20個擴展的PoC。

[ PoC – Edge Detect Installed Extensions ]
Have a nice day! ?
本文由 Seebug Paper 發布,如需轉載請注明來源。本文地址:http://www.bjnorthway.com/266/
暫無評論