歡迎來到 黑吧安全網 聚焦網絡安全前沿資訊,精華內容,交流技術心得!

審計某系統從解密到GetShell

來源:本站整理 作者:佚名 時間:2019-06-18 TAG: 我要投稿

要對公司內部的某系統做測試審計,但是碰到了加密的PHP文件,因為是采購的第三方整套設備所以只能自己做解密啦。
加密形式如下圖:

收集信息
收集了一下PM9SCREW的信息,該使用的加密拓展名字叫PHP_Screw,這是一款免費的針對PHP源碼進行加密的PHP的擴展,可以自定義加密的key,加密后的文件運行效率還不會下降。原理是通過壓縮取反然后跟加密的key做異或加密的方式,在使用的時候通過.so文件的拓展文件進行解密然后再運行。并且找到了兩個前人寫好的工具,參考文章及工具鏈接如下:
https://www.skactor.tk/2018/03/26/php-screw%E7%9A%84%E5%8A%A0%E5%AF%86%E5%92%8C%E8%A7%A3%E5%AF%86%E6%8E%A2%E7%A9%B6%EF%BC%88%E4%BA%8C%EF%BC%89%E8%A7%A3%E5%AF%86%E7%AE%97%E6%B3%95%E4%B8%8Epython%E5%AE%9E%E7%8E%B0/
https://github.com/firebroo/screw_decode
解密過程
通過前文得知有加密密鑰存儲的.so拓展文件很關鍵,所以先尋找文件:

找到了之后發現也是二進制文件:

于是IDA搞起,先找到pm9screw相關函數:

然后追蹤相關變量:

找到加密的密鑰口令:

hex轉為十進制:

然后另一個函數中找到頭部變量(這里為默認值):

然后將找到的密鑰和頭部放入前文的工具中使用即可解密。
在這里感謝前人的工具,以及如果使用該拓展加密,記得改掉或者隱去頭部的字符不要留下線索,以及把.so文件隱藏好。
審計
接上篇blog解密php,該系統聽說是處于行業領導地位的運維管理系統,不少大廠也在使用,并且傳說該系統沒有高危安全漏洞,那我們就來挖掘看看吧。
系統結構

#index.php片段
@session_start();
$sid = session_id();
@session_destroy();
$CONFIG["img"] = true;
$CONFIG["nomaster"] = true;
$CONFIG["not_http_referer"] = true;1
require_once("include/common.php");
require_once("include/Validate.php");
require('include/integrity.php');
require_once("include/common.php");
check_perm("admin");
我們可以看到從上圖看出該系統因為歷史悠久,在架構上還是使用靜態php文件的路由方式,并沒有使用MVC的結構,整體的系統架構略顯臃腫。
從頭部引入可以發現,該系統是采用定義$CONFIG數組定義一些環境變量并包含common.php等文件的設置,利用check_perm方法做權限的限制與鑒定。其中具體結構的實現細節與本文無關,就不多聊結構問題。
第一個getshell漏洞
不得不說該系統其實對于安全還是處理的比較到位的,各種sql、xss等注入都過濾處理的比較好,也驗證了referer防止了csrf。這時候我想到堡壘機系統肯定需要與系統底層進行一些特殊的操作,譬如底層運維的信息的增刪改查要與php動態交互,而此系統采用的是調用python的方法來實現這些功能。那這里面會不會有些問題呢?要是有就是直接getshell的大漏洞了。
function python_exec($code) {
    $descs = array();
    $descs[0] = array("pipe", "r");
    $descs[1] = array("pipe", "w");
    $descs[2] = array("pipe", "w");
    if (is_array($code)) $code = join("\n", $code);
    $p = proc_open("/usr/bin/python2.6 -", $descs, $pipes);
    fputs($pipes[0], $code);
    fclose($pipes[0]);
    $stdout = stream_get_contents($pipes[1]);
    $stderr = stream_get_contents($pipes[2]);
    $result = proc_close($p);
    return array($result, $stdout, $stderr);
}
方法代碼如上,很普通的proc_open調用python的方法。

[1] [2]  下一頁

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