當前位置:
首頁 > 最新 > Palo Alto防火牆遠程代碼執行漏洞分析

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:瘋貓網路 |