當前位置:
首頁 > 新聞 > 如何利用Mozilla Firefox的合法功能執行操作系統命令

如何利用Mozilla Firefox的合法功能執行操作系統命令

在軟體環境中,用戶只能執行有限數量的任務,通常使用Kiosk應用程序來減少用戶與系統交互的機會。在許多環境中,只有少數預定義的應用程序發布給用戶,比如web瀏覽器或POS軟體,這取決於用戶需要做什麼。

攻擊這種受限環境的攻擊者通常試圖找到一種繞過已發布應用程序邊界的方法,以便在底層操作系統上執行命令。攻擊者的總體目標通常是在系統上建立一個立足點,再感染與之相連的其他系統。根據被攻擊系統的目的不同,操作和財務損失(包括敏感數據的丟失)也可能有所不同。

在Windows中,攻擊者有許多眾所周知的方法來創建互動式shell,例如粘滯鍵、「打開文件」對話框、在地址欄輸入命令、幫助菜單等。在Linux環境中,這個過程更複雜,不是只在瀏覽器的地址欄中輸入命令即可。

本文我會給大家介紹一種技術,通過在Mozilla Firefox中包含一個用於基於智能卡的身份驗證(PKCS11)的定製模塊,可以在底層操作系統上執行代碼。本文主要關注Linux環境,但是當底層操作系統是Microsoft Windows時,本文所講的操作方法也一樣適用。

目標偵察

在執行安全評估時,第一步便是偵察,以便儘可能多的發現目標系統。如果Firefox是唯一可用的應用程序,那麼偵察將更加困難,但並非不可能。「文件打開」對話框有助於確定文件系統的結構。在某些情況下,可以鎖定文件打開或文件保存的對話框,使目錄和文件都隱藏起來。但是,Firefox允許任何用戶通過使用「file:」協議處理程序來遍歷文件系統。下面的屏幕截圖顯示了調用file:///之後底層操作系統的根目錄

我們感興趣的目錄的是/etc目錄,它可以包含關於系統配置的有價值的信息,或可以全局寫入的/ tmp目錄,攻擊者可以利用這個目錄在系統上刪除文件。我們不僅可以瀏覽目錄,還可以瀏覽當前用戶可讀的/etc/os-release等文件。

收集一些關於操作系統的信息對於後續操作都很重要,通過「幫助」菜單和「關於Firefox」視圖進行的進一步搜索,可以發現Firefox是作為一個32位進程運行的。這個信息很有用,因為模塊的目標架構必須與流程的架構相匹配。

使用自定義PKCS11模塊

生成互動式shell的選項是有限的,但是Mozilla Firefox中的「安全設備」功能允許載入本地存儲的* .so或* .dll文件。此功能主要用於設置基於智能卡的身份驗證,例如,當web伺服器需要客戶端證書時。該實現會基於PKCS11標準,該標準還定義了與智能卡通信的API。

現在我們已經確定了要下載文件的架構和位置,創建一個功能PKCS11庫需要以下三個步驟,它會生成一個shell並與Mozilla Firefox兼容:

1.找到一個合適的PKCS11庫;

2.編譯PKCS11庫;

3.調整生成的庫的動態依賴關係;

找到一個合適的PKCS11庫

這樣一個模塊的基礎是開源中間件「OpenSC」,可以在Github上找到。

能夠與PKCS11 API實現通信的庫需要實現以下功能:

C_Initialize()

C_GetInfo()

C_GetSlotList()

C_GetTokenInfo()

C_OpenSession()

C_GetMechanismList()

從頭實現這樣一個模塊將非常耗時,但是可以利用現有的OpenSC代碼庫進行必要的自定義改編。

編譯PKCS11庫

為了理解代碼流,首先找到某種類型的「入口點」是很重要的。特別有趣的是src/pkcs11/pkcs11-global.c文件:

CK_RV C_Initialize(CK_VOID_PTR pInitArgs)

{

CK_RV rv;

#if !defined(_WIN32)

pid_t current_pid = getpid();

#endifint rc;

unsigned int i;

sc_context_param_t ctx_opts;

上面的代碼段顯示了瀏覽器載入PKCS11模塊後自動調用的函數C_Initialize,對於一些生成的額外的代碼行來說,這是一個好的開始。

CK_RV C_Initialize(CK_VOID_PTR pInitArgs)

{

int res = system("/usr/bin/xterm");

printf("%d", res);

CK_RV rv;

#if !defined(_WIN32)pid_t current_pid = getpid();

#endif

int rc;

unsigned int i;

sc_context_param_t ctx_opts;

插入了對system()命令的調用,,該命令調用外部應用程序(本文為/usr/bin/xterm)來生成互動式終端。請注意,代碼中的「system()」調用會阻止Firefox進程的主線程,並在xterm關閉之前保持停止響應。然而,對於我們的這次概念證明來說已經足夠了。

對於簡單的概念驗證,這種修改就足夠了。OpenSC項目現在需要為32位架構進行編譯,因為Firefox實例是作為32位進程啟動的。編譯項目之後,Firefox可以打開的共享庫以「opensc-pkcs11」的名稱創建,可以在src/pkcs11/.libs/中找到。在可訪問的web伺服器上託管文件後,需要將其下載到目標系統,例如使用瀏覽器的「Save link as」功能。將這個文件載入到Firefox中後,通常初始載入會失敗,並顯示錯誤消息「模塊載入失敗」。這與一個opensc-pkcs11依賴的庫(不過該庫已經刪除)有關,且意味著需要調整動態依賴關係。

調整結果庫的動態依賴關係

要找出哪些庫已經被刪除,可以使用「ldd」命令:

root@debian:~/OpenSC/src/pkcs11/.libs# ldd opensc-pkcs11.so

linux-gate.so.1 (0xb774b000)

libopensc.so.6 => /root/OpenSC/src/libopensc/.libs/libopensc.so.6 (0xb75a4000)

libdl.so.2 => /lib/i386-linux-gnu/libdl.so.2 (0xb758c000)

libpthread.so.0 => /lib/i386-linux-gnu/libpthread.so.0 (0xb756d000)

libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb73b6000)

/lib/ld-linux.so.2 (0xb774d000)

如上所示,編譯後的模塊opensc-pkcs11.so依賴於一個名為「libopensc.so.6」的庫,存儲在/root/OpenSC/src/libopensc/.libs/libopensc.so.6中。到目前為止,只有opensc-pkcs11.so被下載到目標系統,並且庫找不到libopensc.so.6,從而導致錯誤。

工具「patchelf」可用於調整載入libopensc.so.6的位置,要將搜索路徑從/root/OpenSC/src/libopensc/.libs/更改為/ tmp /,可以使用以下命令:

patchelf --set-rpath /tmp opensc-pkcs11.so

上面的命令會將「rpath」更改為/tmp,要檢查修改是否成功,可以再次調用ldd命令。

root@debian:~/OpenSC/src/pkcs11/.libs# ldd opensc-pkcs11.so

linux-gate.so.1 (0xb774b000)

libopensc.so.6 => /tmp/libopensc.so.6 (0xb75a4000)

libdl.so.2 => /lib/i386-linux-gnu/libdl.so.2 (0xb758c000)

libpthread.so.0 => /lib/i386-linux-gnu/libpthread.so.0 (0xb756d000)

libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb73b6000)

/lib/ld-linux.so.2 (0xb774d000)

修改共享對象後,就要準備生成所有有效載荷了。要生成shell,需要執行以下操作:

1. 將修改後的libopensc.so.6下載到/ tmp /;

2. 將opensc-pkcs11.so的修改版本下載到任意位置;

3. 添加opensc-pkcs11.so,將其作為Firefox中的安全設備;

指定共享對象的路徑後,Firefox將載入PKCS11模塊並執行以下代碼。

上面的屏幕截圖顯示,xterm已經成功生成。

總結

當需要執行代碼並且將Firefox作為單個Kiosk應用程序運行時,可以使用以上所描述的技術。

雖然使用這個方法之前,需要提前創建一個執行自定義代碼的共享對象,但它是跨平台的,而且一旦庫被下載到目標系統,調用它就非常容易。

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 嘶吼RoarTalk 的精彩文章:

BackSwap銀行木馬進化分析
萬豪國際泄露事件後續——簡單調查分析與建議

TAG:嘶吼RoarTalk |