歡迎來到 黑吧安全網 聚焦網絡安全前沿資訊,精華內容,交流技術心得!

CVE-2019-19470:TinyWall防火墻本地提權漏洞分析

來源:本站整理 作者:佚名 時間:2020-01-19 TAG: 我要投稿

在本文中,我們介紹了TinyWall在2.1.13版本前存在的一個本地提權漏洞,本地用戶可以借助該漏洞提升至SYSTEM權限。除了命名管道(Named Pipe)通信中存在的.NET反序列化漏洞之外,我們也介紹了一個認證繞過缺陷。
 
0x01 背景
TinyWall是采用.NET開發的一款本地防火墻,由單個可執行文件構成。該可執行程序會以SYSTEM權限運行,也會運行在用戶上下文中,方便用戶進行配置。服務端在某個命名管道上監聽傳入消息,消息使用BinaryFormatter以序列化對象流的形式傳輸。然而這里存在一個身份認證檢查機制,需要進一步研究。在本文中我們將詳細分析這種機制,因為其他產品也有可能使用這種機制來防御未授權訪問風險。
為了簡單起見,下文中我們將使用“服務端”來表示接收消息的SYSTEM上下文進程,使用“客戶端”來表示位于已認證用戶上下文中的發送進程。需要注意的是,已認證用戶并不需要任何特殊權限(如SeDebugPrivilege)就能利用本文描述的該漏洞。
 
0x02 命名管道通信
許多(安全)產品會使用命名管道(Named Pipe)作為進程間通信的渠道(可以參考各種反病毒產品)。命名管道有一個優勢,服務端進程可以通過Windows的認證模型來獲取發送方的其他信息,比如原始進程ID、安全上下文等。從編程角度來看,我們可以通過Windows API來訪問命名管道,但也可以通過直接訪問文件系統來實現。我們可以通過命名管道的名稱,配合\\.\pipe\前綴來訪問命名管道文件系統(NPFS)。
如下圖所示,該產品用到了TinyWallController命名管道,并且任何已認證用戶可以訪問并寫入該管道。

 
0x03 SYSTEM進程
首先我們來看一下命名管道的創建及使用過程。當TinyWall啟動時,會調用PipeServerWorker方法完成命名管道創建操作。Windows提供了一個API:System.IO.Pipes.NamedPipeServerStream,其中某個構造函數以System.IO.Pipes.PipeSecurity作為參數,這樣用戶就能使用SecurityIdentifiers等類,通過System.IO.PipeAccessRule對象實現細粒度的訪問控制。此外,從上圖中我們可以觀察到,這里唯一的限制條件在于客戶端進程必須在已認證用戶上下文中運行,但這看上去似乎并不是一個硬性限制。

然而如上圖所示,實際上這里還存在其他一些檢查機制。該軟件實現了一個AuthAsServer()方法,會進一步檢查一些條件。我們需要到達調用ReadMsg()的代碼塊,該調用負責反序列化已收到的消息內容。

如果未能通過檢查,則代碼會拋出異常,內容為“Client authentication failed”(客戶端認證失。。跟蹤代碼流程后,我們找到了一個“認證檢查”代碼塊,代碼邏輯基于進程ID來檢查,判斷服務端與客戶端進程的MainModule.FileName是否一致。開發者之所以使用這種邏輯,可能是想確保相同的、可信的TinyWall程序能通過命名管道來發送和接收封裝好的消息。

我們可以在調試上下文中使用原始程序,這樣就不會破壞MainModule.FileName屬性,從而繞過該限制。接下來我們先使用調試器來驗證不可信的反序列化操作。
 
0x04 測試反序列化
因此,為了測試是否可以使用惡意對象來反序列化,我們可以使用如下方法。首先,我們通過調試器(比如dnSpy)啟動(而不是attach)TinyWall程序,在客戶端向管道寫入消息之前的位置上設置斷點,這樣我們就能修改序列化后的對象。在運行過程中,我們可以考慮在Windows System.Core.dll中的System.IO.PipeStream.writeCore()方法上設置斷點,以便完成修改操作。完成這些設置后,很快斷點就會被觸發。

現在,我們可以使用ysoserial.NET和James Forshaw的TypeConfuseDelegate gadget來創建惡意對象,彈出計算器。在調試器中,我們使用System.Convert.FromBase64String("...")表達式來替換當前值,并且相應地調整計數值。

釋放斷點后,我們就能得到以SYSTEM權限運行的計算器進程。由于反序列化操作會在顯式轉換前觸發,因為我們的確能完成該任務。如果大家不喜歡出現InvalidCastExceptions,那么可以將惡意對象放在TinyWall的PKSoft.Message對象參數成員中,這個練習留給大家來完成。
 
0x05 偽造MainModule.FileName
通過調試客戶端驗證反序列化缺陷后,接下來我們可以看一下是否能拋開調試器完成該任務。因此,我們必須繞過如下限制:

GetNamedPipeClientProcessId()這個Windows API用來獲取特定命名管道的客戶端進程標識符。在最終的PoC(Exploit.exe)中,我們的客戶端進程必須通過某種方式偽造MainModule.FileName屬性,以便匹配TinyWall的程序路徑。該屬性通過System.Diagnostics.ProcessModule的System.Diagnostics.ModuleInfo.FileName成員來獲取,后者通過psapi.dll的GetModuleFileNameEx()原生調用來設置。這些調動位于System.Diagnostics.NtProcessManager上下文中,用來將.NET環境轉換為Windows原生API環境。因此,我們需要研究一下是否可以控制該屬性。

[1] [2]  下一頁

【聲明】:黑吧安全網(http://www.zjtpzs.live)登載此文出于傳遞更多信息之目的,并不代表本站贊同其觀點和對其真實性負責,僅適于網絡安全技術愛好者學習研究使用,學習中請遵循國家相關法律法規。如有問題請聯系我們,聯系郵箱[email protected],我們會在最短的時間內進行處理。
  • 最新更新
    • 相關閱讀
      • 本類熱門
        • 最近下載
        神秘东方电子游艺 安徽福彩快三看走势图 老快3投注代购 今晚3d开奖预测号码 8月股票推荐 华东福彩15选5玩法 真实捕鱼游戏 心悦吉林辽源麻将安装 吉林快3跨度走势图带连线 上海11选5开奖号码一定牛 贵阳按摩店全身按摩 股票开收盘时间 体育彩票顶呱刮5元 至尊娱乐棋牌害死人 湖南快乐十分必中一球 双色球开奖结果今天 山西快乐十分