Black Hat USA 2002 - Syscall Proxying
三句話摘要
CISOL Proxin 系統:透過系統呼叫代理,讓程序在不修改源代碼的情況下實現遠端執行與權限隔離。 Proxin 透過最小化伺服器實現,在系統呼叫層級提供透明遠端執行與權限隔離,使渗透測試工具擁有交互式環境適應能力,大幅簡化跨環境攻擊的複雜度。 系統呼叫層級的代理原理:Unix 系統約有 300 個系統呼叫(如 OpenBSD),Windows 超過 1000 個。Proxin 在用戶進程與內核之間插入客戶端-伺服器層,客戶端負責將參數編排成伺服器期望的格式,伺服器則直接對應作業系統呼叫約定調用系統呼叫,完全不需中間通用格式的轉換,相比 RPC 更高效。
重點整理
重點- 1
系統呼叫層級的代理原理:Unix 系統約有 300 個系統呼叫(如 OpenBSD),Windows 超過 1000 個。Proxin 在用戶進程與內核之間插入客戶端-伺服器層,客戶端負責將參數編排成伺服器期望的格式,伺服器則直接對應作業系統呼叫約定調用系統呼叫,完全不需中間通用格式的轉換,相比 RPC 更高效。
- 2
胖客戶端、瘦伺服器設計:為了最小化伺服器體積,所有平台相關邏輯移到客戶端。請求必須精確模擬進程堆疊中呼叫系統呼叫前的內存狀態,指標則相對於伺服器發送的堆疊指標計算,使伺服器只需簡單複製請求到堆疊、調用系統呼叫、返回結果。
- 3
渗透測試中的實際優勢:入侵後通常遇到環境不一致問題(目標系統版本、架構與攻擊工具不符),傳統 shellcode 必須為多種配置預編譯。Proxin 伺服器部署後,所有工具立即可用且無需修改,支援交互式操作應對動態環境(如 chroot 監獄、權限降低),避免預製 shellcode 的僵化。
- 4
跨作業系統適配:Linux 伺服器直接利用軟體中斷呼叫系統呼叫,Windows 伺服器動態載入 DLL 並取得函式位址,允許客戶端遠端調用任何已載入的函式,提供了統一的遠端程式呼叫框架。
實用技巧與重點
乾貨- 系統呼叫數量與機制
- OpenBSD 系統呼叫數:約 300 個
- Windows 系統呼叫數:超過 1000 個(封裝了 132 個 API 呼叫)
- Linux 軟體中斷號:INT 0x80
- Open 系統呼叫編號(Linux):3
- 實現規格
- Linux Proxin 伺服器程式碼:約 100 位元組
- 客戶端-伺服器通訊初始化:伺服器發送堆疊指標 (ESP) 予客戶端,客戶端據此計算相對指標
- 請求格式:精確複製進程堆疊狀態、整數參數按值傳遞、指標參數重定位至請求緩衝區內部
- 具體範例操作
- Open 呼叫參數:檔案名稱(指標)、開啟標誌(整數)、模式(整數)
- Read 呼叫:客戶端傳遞輸出緩衝區,伺服器呼叫讀取後填充該緩衝區,連同回應傳回客戶端
- Get UID、Get EUID、Get Current Working Directory 等身份與環境查詢呼叫
- 應用場景
- 代碼注入漏洞利用:緩衝區溢位、格式化字串
- Chroot 監獄逃逸:在遠端交互環境中調用 setuid 等系統呼叫
- 權限提升:利用受害者進程權限存取本地受限資源
結論
結論“Proxin 透過最小化伺服器實現,在系統呼叫層級提供透明遠端執行與權限隔離,使渗透測試工具擁有交互式環境適應能力,大幅簡化跨環境攻擊的複雜度。”
完整解析
詳細系統呼叫是進程與作業系統內核溝通的最底層機制。每個進程存取磁碟、螢幕、網路等資源都透過系統呼叫完成。Unix 與 Windows 系統的呼叫設計截然不同:Unix 系統呼叫數量受控(OpenBSD 約 300 個),各呼叫與 libc 包裝器一一對應;Windows 則超過 1000 個,且 32-bit API 多為非公開介面,不受微軟支援。傳統遠端執行通常透過 RPC(遠端程序呼叫)實現,但 RPC 需要將參數轉換為通用格式再傳輸,當客戶端與伺服器在同一平台時這種通用性轉換就顯得多餘。
Proxin 的創新之處在於採用「胖客戶端、瘦伺服器」設計。客戶端負責理解平台特性,將系統呼叫參數直接編排成伺服器期望的格式,無須經過通用中間層。伺服器則極其簡潔:接收客戶端請求後,直接將整個請求複製到進程堆疊,調用相應系統呼叫,回傳結果。Linux 伺服器實現僅需 100 位元組代碼。Windows 伺服器稍複雜因其 DLL 呼叫約定,但仍可動態載入函式庫、取得函式位址、調用任意已載入函式。
實現的關鍵細節在於指標處理。客戶端與伺服器各自執行於不同進程空間,客戶端傳遞的記憶體位址在伺服器端無效。解決方案是客戶端將指標指向的資料複製進請求緩衝區,並建立相對於伺服器堆疊指標的虛擬指標。伺服器連接時會發送自身堆疊指標,客戶端據此建立相對位址計算。以 open 呼叫為例,檔案名稱作為字串指標會被複製至請求內部,指標則調整為相對位址。
在渗透測試應用上,Proxin 解決了傳統 shellcode 面臨的難題。攻擊者得到目標系統 shell 後,往往發現已有工具與目標系統不相容(版本差異、架構不同、缺少編譯器)。傳統做法需準備多套針對不同環境的 shellcode,甚至針對特定配置(需要提升權限、逃逸 chroot、改變路由等)分別編譯。部署 Proxin 伺服器後,所有工具立即可用無需修改,攻擊者可透過遠端客戶端交互式調用任何系統呼叫,動態應對環境限制。演講示範中展示了在 chroot 監獄與降低權限環境中,透過遠端調用 setuid、chroot 等系統呼叫成功逃逸。
關鍵時刻
Pipeline v2帶時間戳的重點,會在逐字稿層級分析上線後產生。目前請先透過原始影片觀看。
事實查核
Pipeline v2說法查證是下一次管線升級的一部分。KeyFrame 只會顯示它真正能驗證的內容。

