Palo Alto防火牆遠程代碼執行漏洞分析
近期,Palo Alto Networks多個防火牆產品被曝存在未授權遠程代碼執行漏洞(CVE-2017-15944 ),該漏洞基於其它三個單獨漏洞的綜合利用,可以通過Web管理端對Palo Alto Networks防火牆實現root身份的未授權遠程代碼執行攻擊。本文中,我們來簡單分析一下該漏洞的具體成因。
該漏洞影響範圍
受影響的Palo Alto 防火牆版本如下:
目前,Palo Alto Networks已經修復了該漏洞,請及時到Palo Alto 官網下載PAN-OS6.1.19、PAN-OS 7.0.19 PAN-OS 7.1.14、PAN-OS 8.0.6 的更新版本。Palo Alto Networks建議客戶採取隔離或其它安全措施,限制Web管理介面網路訪問許可權,避免攻擊者通過Project Sonar 或 Shodan探測到防火牆WAN埠實施攻擊。
漏洞分析
漏洞 #1:部分授權驗證功能可繞過
文件`/etc/appweb3/conf/common.conf`中包含了Web管理控制介面的配置內容,它針對大多子目錄利用以下方式設置了一個驗證過濾器:
也就是說,所有對/php/*相關目錄的請求都會被檢查其中的授權會話cookie,具體檢查動作由`libpanApiWgetFilter.so`庫文件執行。
其中,函數`openAuthFilter()` 將對PHPSESSID cookie執行檢查,然後調用會話文件中的`readSessionVarsFromFile()`函數以提取其中的 `dloc`和 `user`值。問題在於`readSessionVarsFromFile()`函數並不是使用正式的PHP功能去讀取序列化的會話數據,而是使用了內置存在運行問題的`strtok()`方法解析器來讀取。
`readSessionVarsFromFile()`嘗試解析的PHP會話格式看起來像這樣的字元串值:
ocale|s:2:」en」;
語法注釋:
var_name|s:str_length:」string value」; var_name|s:str_length:」another string」;…
如果我們向包含`」;`字元的會話文件中注入一個數值,就能截斷解析器從而執行我們自己設置的 `user`變數值。另外,文件`panmodule.so`會把`dloc` GET參數用」:」進行分割,並把`dloc` 和 `loc`會話變數賦第二個值,因此,我們可以通過調用不需任何驗證授權的腳本`/esp/cms_changeDeviceContext.esp` ,然後利用它去請求文件`panmodule.so`中的 `panUserSetDeviceLocation()函數。
我們由此可利用以下請求方式來混淆破壞會話文件:
`/esp/cms_changeDeviceContext.esp?device=aaaaa:a%27″;user|s.」1337″;`
之後,它會在 `/tmp/sess_`中產生以下內容:
`dloc|s:20:」8:a』」;user|s.」1337″;」;loc|s:27:」16:a』」;user|s.」1337″;:vsys1″;`
當`readSessionVarsFromFile()`對其進行解析時,會把`16:a』`當成`user`變數值處理。由於這種方式會被後端XML請求應用去檢查用戶是否被驗證授權,但在檢查過程中會產生一個XML注入,從而導致一種無效的XML文件,如:
額外的單引號字元被注入到cookie值中後,由於解析錯誤會引起請求失敗,然後有意思的是,文件`libpanApiWgetFilter.so`中的`panCheckSessionExpired()`函數卻不會發現這種狀態,並錯誤地認為驗證授權已成功通過。由此,我們可以控制會話cookie對panAuthCheck指令保護的任意PHP文件實現訪問控制,POC:
需要注意的是,這樣之後我們並未獲取到一個有效可登錄的會話session,而且大多PHP腳本請求也會失敗,但卻能繞過Web伺服器端的驗證授權功能。
漏洞 #2:任意目錄創建
`/php/utils/router.php`文件負責對Web管理介面的後端通信API請求進行處理,在該文件中泄露了多個PHP類,這些類中包含了利用HTTP POST/JSON方式請求Web管理介面的一種簡單遠程調用。
`/php/device/Administrator.php`文件聲明了`Administrator`類,其中還包含了名為`get`且可從`router.php`中調用的方法函數。在該`get`方法對`Direct::getConfigByXpath`的調用中,存在一處XML注入,即附加到請求中的參數 `jsonArgs->id`不會被執行任何過濾檢查,這就能使我們對發送到後端的XML請求進行操縱控制。
正常請求是這樣的:
在此基礎上,我們能向 `obj` 屬性注入我們自設的數值, 從而實現控制其它所有的XML請求。
另外,文件`libpanmp_mp.so` 中的`pan_cfg_req_ctxt_construct()` 函數負責對後端的XML請求進行解析,如果我們發送一個具有`async-mode =』yes』`屬性集的請求標籤,後端會在請求輸出的文件`/opt/pancfg/session/pan/user_tmp//.xml`中,創建一個臨時文件和父目錄。由此,我們可以控制創建部分目錄結構的 ``值, 結合目錄遍歷攻擊在系統中任意地方創建任意名稱目錄。
例如,通過發送以下特定的POST請求來創建目錄:
當伺服器後端接收到以下XML請求後,就會執行`/tmp/hacked`目錄創建操作:
漏洞 #3:Cron腳本中的命令注入
文件`/usr/local/bin/genindex_batch.sh`為每隔15分鐘定時執行的Cron腳本,該腳本功能為轉而執行`/usr/local/bin/genindex.sh`,生成對資料庫文件 `/opt/pancfg/mgmt/logdb/`的索引。在該腳本執行文件名稱的處理過程中,存在一處命令注入漏洞:
由於我們能在 `$PAN_BASE_DIR/logdb/$dir/1`中創建目錄,所以能更改第一次 `find`命令的輸出內容,該輸出內容會作為第二次 `find`命令執行時的一個參數,但卻沒有閉合引號,因此,我們可以在該調用中注入任意參數,在`-exec`選項值傳遞到`find`命令中時,可以在其中執行任意系統命令。
Exploit執行示例
我的exploit創建目錄為:
`* -print -exec python -c exec(「[base64 code..]「.decode(「base64″)) ;`
其中,base64編碼的python代碼會被以root許可權執行,在`/var/appweb/htdocs/api/c.php`中創建一個小馬,同時能在『usr/bin/x』目錄下以root許可權隱蔽執行。
※Linux下惡意文件大規模共性分析探討
※後滲透工具Koadic:你真的了解我嗎?
TAG:瘋貓網路 |