FavoriteLoading
0

彈性邊界:如何利用環境變量進行提權

簡介
盡管進程都設置了環境變量,它們往往被用戶,開發者甚至是系統本身所忽略。對于一個像樣的系統來說,環境變量就是其最根本,這里的系統包括但不僅限于Unix (Linux, BSD), Windows以及OS X。在微軟系統的世界中,環境變量在其第一個版本DOS時期就已經出現,且一直沿用至今。環境變量得到重視還得從2014年9月份爆發的ShellShock漏洞說起。
關于ShellShock可參考
《ShellShock(破殼)漏洞余威不減:新ShellShock蠕蟲掃描大量脆弱主機展開攻擊》
《SEED實驗系列:ShellShock攻擊實驗》
《破殼(ShellShock)漏洞樣本分析報告》
該漏洞在Unxi系統中通過環境變量注入,進而執行命令。
進程的環境
簡言之,環境就是一個可用于進程或者用戶讀取寫入的變量的集合。變量可由用戶,程序或者是系統進行設置,用于提升運行進程時的靈活性。比如文件系統中的路徑,用戶名和控制執行流程的標志。
Windows下的環境
Windows下的環境變量可以使用DOS命令設置進行讀取和寫入:讀取:
set
寫入:
set variable>=value>
在命令行單獨鍵入“set”會顯示所有當前可用的變量。注意本文中說描述的“當前可用”意思是非常相似的進程可用 —— 用戶運行命令解析器這里也可以用編程的方式調用API函數代替set命令:
Kernel32!SetEnvironmentVariable
產生的結果都是一樣的。只有在當前進程及其子進程中改變這些值才會產生效果。只要條件允許,系統將替換所有%VARIABLE%的值。這個替換過程被稱作“擴展”(expansion)。例如我們在命令行下鍵入:
echo %username%
輸出的結果應該為擴展之后變量的值,與鍵入用戶名的結果是一樣的。
環境波動
正如前面所說的,環境變量已經通過一個進程設置。Windows稱這種類型的環境為“不穩定的環境”。當進程正在運行時它保持該變量,當結束進程不會留下任何痕跡。在Windows中還有另外一種類型的環境變量集合,其覆蓋整個系統范圍,在啟動過程依然持續。管理員用戶可以在系統屬性頁面下進行設置,通過使用setx命令影響所有用戶,或者直接通過設置注冊表值:
HKEY_CURRENT_USER\Environment

注冊表值中的擴展
Windows注冊表支持REG_EXPAND_SZ類型的值,一個字符串類型的注冊表值,其命令讀取進程以擴展其內的所有變量,擴展進程在程序使用該值之前執行。這個過程保證了需要依賴注冊表中值的程序能正常運行,開發者不必再跟蹤環境變量值。
Windows程序下的擴展
通過注冊表進行搜索,很顯然其中使用了一個擴展過的路徑引用了許多程序,函數庫,對象。即反過來依賴于環境。最常見的變量為“SystemRoot”,在正常情況下,其指向Windows安裝路徑,一般為“C:\Windows”。
簡單總結
我們擁有可用于Windows進程的環境變量,且能自動擴展以及可以由用戶設置。通過這些路徑可以引用部分Windows函數庫。以下為基于環境變量擴展的攻擊場景
場景1:”DLL注入”
假設:
如果通過一個擴展了的環境字符串加載DLL文件,攻擊者通過改變環境變量可獲得一個進程來加載該文件,但需在創建之前提供給這個進程。
換句話說,任何一個在攻擊者控制下的進程,攻擊者都可以對它進行環境設置。
可能性:
加載的DLL文件,不管是被復制,修改,完全替換,對于加載它的進程來說權限都是一樣的。“注射”一個DLL到不同的進程中而不使用任何注射技術。
應用:
最簡單粗暴的方法便是使用命令行。大概流程如下:
在C:\Wherever中創建C:\Windows副本
設置環境變量set SystemRoot=C:\Wherever
結束并重啟explorer.exe進程taskkill /F /IM explorer.exe?? C:\Windows\explorer.exe
資源管理器將會啟動并從攻擊者目錄加載相當多的DLL。攻擊者可以替換它們并改變執行流程。
場景2:遠程加載DLL
除了需要添加到等式這個因素以外,基本與上一個場景一樣。在Windows,API在請求一個文件或是目錄路徑時通常會接收一個指向遠程機器的UNC路徑。這個過程將會使用SMB協議嘗試訪問指定的路徑。
假設:
如果攻擊者將%SystemRoot%擴充到一個UNC網絡路徑,Windows將使用SMB協議嘗試從遠程路徑加載該圖片
可能性:
從一個被攻擊者控制的服務器上遠程加載DLL,同時也泄漏了受害者機器的IP地址。
之后將嘗試使用已登錄用戶的憑證對遠程服務器進行身份驗證,為攻擊者提供更多的參考信息。
應用:
與場景1類似,但是需要使用遠程路徑。例如我們可以使用本地機器上共享的C盤:
set SystemRoot=\\127.0.0.1\c$\Windows

場景3:啟動時加載DLL
就目前而言,此攻擊還算不上持久性攻擊。這也意味著重啟系統,或者是重啟進程,我們之前的努力都白費了。
假設:
攻擊者可以設置永久性(non-volatile)環境變量,將影響到系統控制流程而不論是否進行重啟。
可能性:
在系統啟動期間或在滿足特定條件時遠程加載DLL
應用:
與場景1類似,但是攻擊者可以使用setx命令來代替set命令:
setx SystemRoot C:\ Wherever
重啟系統,開始從攻擊者的目錄下將DLL加載到各種進程中。
場景4:提升權限 #1
到目前為止,我們討論了攻擊者控制下可能對其他進程有影響的環境變量。 這些其他進程都屬于首先執行命令的用戶,并且以中等完整性級別運行。

分頁閱讀: 1 2
【聲明】:8090安全小組門戶(http://www.jvwkvg.tw)登載此文出于傳遞更多信息之目的,并不代表本站贊同其觀點和對其真實性負責,僅適于網絡安全技術愛好者學習研究使用,學習中請遵循國家相關法律法規。如有問題請聯系我們,聯系郵箱[email protected],我們會在最短的時間內進行處理。