作者:深信服千里目安全實驗室
原文鏈接:https://mp.weixin.qq.com/s/LIugWEiETPwYmmLwZLe7Ag

一、組件介紹

1.1 基本信息

ZenTaoPMS(ZenTao Project Management System),中文名為禪道項目管理軟件。ZenTaoPMS是易軟天創公司為了解決眾多企業在管理過程中出現的混亂,無序的現象,開發出來的一套項目管理軟件。

禪道項目管理軟件的主要管理思想基于國際流行的敏捷項目管理方式——Scrum。scrum是一種注重實效的敏捷項目管理方式,但眾所周知,它只規定了核心的管理框架,但具體的細節還需要團隊自行擴充。禪道在遵循其管理方式基礎上,又融入了國內研發現狀的很多需求,比如bug管理,測試用例管理,發布管理,文檔管理等。因此禪道不僅僅是一款scrum敏捷項目管理工具,更是一款完備的項目管理軟件。基于scrum,又不局限于scrum。

禪道還首次創造性的將產品、項目、測試這三者的概念明確分開,產品人員、開發團隊、測試人員,這三者分立,互相配合,又互相制約,通過需求、任務、bug來進行交相互動,最終通過項目拿到合格的產品。

1.2 版本介紹

禪道項目管理軟件基于自主研發的PHP開發框架---禪道PHP框架開發而成,企業或者第三方的開發者可以通過這套框架,靈活的對禪道進行功能的修改或者擴展。經過逐年演化,禪道項目管理軟件發展成為四大系列、功能完善的項目管理軟件。禪道項目管理軟件發展至今其核心開發系列共有以下三個,即禪道企業版、禪道專業版、禪道集團版、禪道開源版。其中禪道開源版是基礎版本;而專業版、企業版是根據禪道開源版進行二次開發而成,其間僅存在功能性上的不同,所以專業版、企業版是兼容同級開源版的;而集團版僅為部署架構上的不同,核心還是企業版,具體如下:

(1)禪道開源版(2009-2020)是禪道項目管理軟件的基礎版本,屬于禪道項目的開發框架,其中僅開發了項目管理的基本模塊。

(2)禪道專業版(2012-2020)是在禪道開源版的基礎上增加增強功能。專業版推出的初衷是為IT企業或部門提供更完善的服務,專業版增強功能更加適合企業的內部流程化管理。同時專業版的增強功能都以收費插件的方式發布在禪道官網里,為用戶提供單獨下載使用的服務。

(3)禪道企業版(2017-2020),在禪道專業版功能的基礎上,增加了運維管理、OA辦公管理、反饋管理,以及文檔的版本管理及在線預覽等功能,可以為企業項目管理流程提供更全面的支撐。

(4)禪道集團版(2019-2020)主要包含主站平臺和子站點兩部分。集團版用戶可以通過主站平臺給旗下的 部門、 子公司或者第三方開發團隊分別開通一個獨立的子站點進行項目管理。集團版的子站點由禪道項目管理軟件企業版提供項目管理服務, 每個子站點的數據都是獨立且互不影響的。

版本細分如下圖所示: version

1.3 使用量及使用分布

根據全網數據統計,使用ZenTaoPMS的網站多達4萬余個,其中大部分集中在國內,約占使用量的75%以上。其中,廣東、浙江、北京、上海四省市使用量最高,由此可見,ZenTaoPMS在國內被廣泛應用。

二、高危漏洞介紹

通過對ZenTaoPMS漏洞的收集和整理,過濾出其中的高危漏洞,可以得出如下列表。

漏洞名稱 漏洞ID 影響版本 漏洞披露日期
禪道 8.2-9.2.1 SQL注入導致前臺Getshell 禪道開源版 8.2-9.2.1 2018
禪道 后臺代碼注入漏洞 禪道開源版 <= 11.6 2019
禪道 后臺任意文件刪除漏洞 禪道開源版 <= 11.6 2019
禪道 后臺任意文件讀取漏洞 禪道開源版 <= 11.6 2019
禪道 后臺文件包含漏洞 禪道開源版 <= 11.6 2019
禪道 后臺SQL注入漏洞 禪道開源版 <= 11.6 2019
禪道 任意文件上傳漏洞 CNVD-C-2020-121325 10.x < 禪道開源版 < 12.4.3 2020
禪道 Pro 8.8.2 命令注入漏洞 CVE-2020-7361 禪道Pro <=8.8.2 2020

從以上表可以看出,近年來禪道漏洞頻發,從2018年開始,每年都會爆出比較嚴重的高危漏洞,通過這些高危漏洞均可對服務器造成一定的影響,甚至獲取服務器的最高權限。

從漏洞分布的情況來看,禪道大部分的漏洞均屬于后臺漏洞,這源于禪道屬于項目管理軟件,均需要登錄授權后方可操作系統中的任意模塊,而系統中的未授權接口很少,在18年爆發一個未授權漏洞后,官方將對外開放的接口全部篩選修復后,就導致對外開發接口極少,切很難有漏洞利用點,故截止到現在,禪道所爆發的漏洞均需要后臺一定的權限賬戶方可執行。

我們可以看到2018年禪道爆發出多個漏洞,其實這些漏洞原理基本一致,均為越權調用getModel函數導致,后面我們會在詳細分析中講解該部分漏洞的原理。另外,我們發現禪道爆發的漏洞基本存在于開源版,但這不意味著這些漏洞僅存在于開源版,開源版是禪道其他系列的基礎框架版本,所以開源版的漏洞大概率也會在于對應兼容系列的對應版本中。且禪道具有可擴展性,所以大部分使用者均可采用開源版,在進行二次開發,適用到自己項目中。

三、漏洞利用鏈

基于ZenTaoPMS高危漏洞,我們可以得出幾種可以利用的高危利用鏈。

3.1 無需權限

chain1

ZenTaoPMS (8.2-9.2.1) - GetShell

  • 首先明確ZenTao框架系列版本,訪問該路徑可獲取版本信息:/zentao/index.php?mode=getconfig
  • 如果利用此漏洞,需要系統有文件寫入權限。

3.2 僅需低權限

chain1

ZenTaoPMS <11.6 - GetShell

  • 首先明確ZenTao框架系列版本,訪問該路徑可獲取版本信息:/zentao/index.php?mode=getconfig
  • 需要獲取到ZenTaoPMS的后臺用戶登錄賬號密碼或者cookie,執行以上漏洞生成shell,最終可getshell。

3.3 需要管理員權限

chain1

ZenTaoPMS < 12.4.3 - GetShell

  • 首先明確ZenTao框架系列版本,訪問該路徑可獲取版本信息:/zentao/index.php?mode=getconfig
  • 需要獲取到ZenTaoPMS的后臺管理員賬戶登錄賬號密碼或者cookie。
  • 漏洞只適用于Windows一鍵安裝版(未加安全限制)、Linux一鍵安裝版(未加安全限制)、安裝包版。Windows/Linux一鍵安裝版(加入安全限制)由于做過新上傳文件限制,無法執行上傳后的文件,導致漏洞無法利用。

ZenTaoPMS Pro <= 8.8.2 - GetShell

  • 需要獲取到ZenTaoPMS的后臺管理員賬戶登錄賬號密碼或者cookie。
  • 該漏洞命令執行無回顯,可通過certutil.exe下載安裝遠程可利用惡意軟件,最終getshell。

四、高可利用漏洞分析

4.0 技術背景:禪道項目管理系統路由模式

禪道有兩種路由模式PATH_INFO、GET方式,其中GET方式為常見的m=module&f=method形式傳遞模塊和方法名,而PATH_INFO則是通過路徑和分隔符的方式傳遞模塊和方法名,路由方式及分隔符定義在config/config.php中。

  • PATHINFO:user-login-L3plbnRhb3BtczEwLjMuMS93d3cv.html 以偽靜態形式在html名稱中傳參
  • GET:index.php?m=block&f=main&mode=getblockdata 類似于其他常規cms在get參數中傳參我們

我們從禪道的入口index.php文件來進行講解:

image

index.php文件,首先看到加載了一些framework中的框架類,然后聲明了一個路由$app,之后就做了一些系統的基本判斷,最重要的就在最下方的三句話,分別是三個功能:解析請求、檢測權限、加載模塊;

$app->parseRequest();
$common->checkPriv();
$app->loadModule();

即parseRequest()函數就是路由解析入口。進入到\framework\base\router.class.php文件中的parseRequest()函數:

image

parseRequest()函數首先用于解析判斷url是否采用了'GET'或者是'PATH_INFO'模式,其中有一個點就是isGetUrl()函數,該函數用于判斷url是否采用了GET模式,具體有以下三種模式:

image

我們回到parseRequest()函數中可以得出,如果系統的默認解析模式是PATH_INFO,而你的url采用的是GET模式,系統則會將此次訪問的路由解析模式配置修改GET,故當你的url模式與系統默認解析模式不同,系統也會解析,不會報錯。所以禪道系統的兩種路由解析模式可同時使用。

(1)路由解析中,GET模式屬于非默認模式,但是該種解析方式是PHP類CMS的常規解析模式,即m=block&f=main,m參數負責傳遞模塊名(module),f參數負責傳遞方法名(method),由此就可以定位到對應module中的control.php文件,以及該文件中對應的method。

image

(2)路由解析中,PATH_INFO模式屬于系統默認模式,我們在配置文件中可以看到系統默認模式以及對應的分隔符、參數含義:

image

我們可以看出PATH_INFO的默認分隔符是 -,然后我們進入到path_info模式下的setRouteByPathInfo()函數,通過分隔符將url分割后,第一個值為模塊名稱module,第二個值即為方法method:

image

總,兩種解析模式解析后獲取的最終module、method通過 $this->setControlFile();方法來尋找對應的文件:

image

自此路由解析結束,定位到對應的模塊方法后,就進行了權限驗證,即使用者身份是否可以調用該模塊與方法,$common->checkPriv();,文件module/common/model.php:

image

從此方法看出,除了isOpenMethod之外,均需要登錄后具有對應權限才可訪問,不需登錄的方法如下所示。

image

4.1 禪道 8.2-9.2.1 SQL注入漏洞導致Getshell

4.1.1 漏洞簡介

漏洞名稱:禪道8.2-9.2.1SQL注入前臺Getshell
漏洞編號:無
漏洞類型:SQL注入
CVSS評分:無
漏洞危害等級:高危

4.1.2 漏洞概述

禪道項目管理軟件集產品管理、項目管理、質量管理、文檔管理、組織管理和事務管理于一體,是一款功能完備的項目管理軟件。該漏洞影響版本為禪道8.2--9.2.1。漏洞出現在系統orm框架中,在拼接order by的語句過程的時候,未對limit部分過濾并直接拼接,導致攻擊者構造執行SQL語句。在mysql權限配置不當的情況下,攻擊者可利用該漏洞獲取webshell。

4.1.3 漏洞影響

禪道8.2 - 9.2.1

4.1.4 漏洞修復

1.建議受影響的用戶升級至ZenTao 9.2.1以上版本或打上對應補丁包,下載地址:https://www.zentao.net/download.html

4.1.5 漏洞利用過程

0x0:隨便訪問一個不存在的路徑,返回頁面會出現報錯,報錯回顯出文件的存放路徑為。

0x1:根據報錯回顯的路徑,構造SQL注入語句將木馬寫入系統的EXP。

0x2:將上述EXP進行ASCIIhex加密,得到加密后的字符串。

0x3:然后將加密后的字符串放入:

{"orderBy":"order limit 1;SET @SQL=0x(加密后字符串);PREPARE pord FROM @SQL;EXECUTE pord;-- -","num":"1,1","type":"openedbyme"}

0x4:然后將上述語句進行base64加密。

0x5:最終通過訪問以下語句執行漏洞

http://siteserver/zentao/index.php?m=block&f=main&mode=getblockdata&blockid=case&param=base64加密字符串

4.1.6 代碼分析

我們根據漏洞PoC來跟蹤漏洞執行流程,從技術背景中的路由解析我們可以定位到漏洞存在的模塊是block模塊中的main方法,在經過路由解析后,系統將通過loadModule()方法加載對應模塊,如下圖所示:

image

在處理完url路由后,就開始處理方法中的各種參數,通過setParamsByGET()函數將參數解析:

image

在參數解析后,就對各個參數進行過濾檢測,若沒有問題,最終將解析過濾后的參數進行保存:

image

在路由解析和參數解析過濾完之后,就需要通過call_user_func_array()函數來調用對應模塊的對應方法,然后就進入到block模塊中的control.php文件:

image

在module/blocak/control.php文件中的構造函數中,存在一個判斷,即需要存在referer,否則無法執行對應模塊的函數。

image

在進入到block模塊中的main函數中,通過mode參數進入到一下if分支,在該分支中,首先對params參數進行base64解碼

image

然后通過進一步的解析參數,獲取到執行getblocakdata操作的的函數為printCaseBlock()

image

然后進入到本文件中的printCaseBlock()函數中,通過解析params參數后,得到type屬性為openedbyme(可構造),進入到下面的elseif分支,我們可以看到參數要進入到orderby函數中進行處理,繼續跟入到orderby函數中:

image

在oderby函數,系統將oder參數進行解析,獲取到orders和limit參數值

image

接下來就進入到了漏洞產生的關鍵,即$order = join(',', $orders) . ' ' . $limit;

image

在該SQL語句中將$limit直接拼接到最后,導致limit 1;閉合了之前的SQL語句,而之后的攻擊PoC就可被執行,由此就造成了該漏洞的SQL注入,該SQL注入可以寫入文件,導致最終的getshell。

image

4.2 禪道 后臺代碼注入漏洞

4.2.1 漏洞簡介

漏洞名稱:禪道后臺代碼注入漏洞
漏洞編號:無
漏洞類型:代碼注入
CVSS評分:無
漏洞危害等級:高危

4.2.2 漏洞概述

禪道項目管理軟件集產品管理、項目管理、質量管理、文檔管理、組織管理和事務管理于一體,是一款功能完備的項目管理軟件。漏洞屬于一種越權調用,普通權限(用戶組為1-10)的攻擊者可通過module/api/control.php中getModel方法,越權調用module目錄下所有的model模塊和方法,從而實現SQL注入、任意文件讀取、遠程代碼執行、文件包含等攻擊。

4.2.3 漏洞影響

禪道開源版 < 11.6

4.2.4 漏洞修復

1.建議受影響的用戶升級至ZenTao 11.6以上版本,下載地址:https://www.zentao.net/download.html

4.2.5 漏洞利用過程

0x0:首先登陸獲取登陸cookie:zentaosid。

0x1:然后訪問api-getModel-editor-save-filePath后再api中生成shell。

0x2:最后訪問api-getModel-api-getMethod-filePath=,最后文件包含shell,執行PHP代碼。

4.2.6 代碼分析

我們根據漏洞PoC來跟蹤漏洞執行流程,從技術背景中的路由解析我們可以定位到漏洞存在的模塊是api模塊中的getModel方法,在經過路由解析后,系統將通過loadModule()方法加載對應模塊,如下圖所示:

image

進入到api的getModel()方法中,獲取到需要調用的三個參數module:editor,method:save,params:filePath。

image

然后通過回調函數call_user_func_array進入到editor模塊中:

image

進入到editor模塊中的model.php文件中的save()函數,通過save函數的file_put_contents將fileContent內容生成為一個文件,

image

最終將輸出結果后,進程結束。

image

然后通過訪問api-getModel-api-getMethod-filePath文件,解析出module為api,method為getModel(),在getmodel()函數中又調用了api模塊的getmethod()方法,

image

進入到getMethod方法中,進入到import方法:

image

在import()方法中,通過include()函數包含了filePath下的文件,最終執行PHP代碼

image

4.3 禪道 后臺文件上傳漏洞

4.3.1 漏洞簡介

漏洞名稱:禪道后臺代碼注入漏洞
漏洞編號:CNVD-C-2020-121325
漏洞類型:文件上傳
CVSS評分:無
漏洞危害等級:高危

4.3.2 漏洞概述

禪道官方發布了開源版12.4.3的更新公告,本次安全更新禪道官方修復了一個高危漏洞:禪道任意文件上傳漏洞,漏洞編號:CNVD-C-2020-121325。登錄后的任意攻擊者可通過fopen/fread/fwrite方法結合FTP、File等協議上傳或讀取任意文件,成功利用該漏洞可以執行任意代碼,最終獲取服務器最高權限。

4.3.3 漏洞影響

10.x < 禪道開源版 < 12.4.3

4.3.4 漏洞修復

1.建議受影響的用戶升級至ZenTao 12.4.3及以上版本,下載地址:https://www.zentao.net/download.html

4.3.5 漏洞利用過程

0x0:首先登陸獲取登陸cookie:zentaosid。

0x1:然后訪問client-download-[$version參數]-[base64加密后的惡意文件地址]-1.html后再下載遠程文件到服務器中

0x2:最后訪問data/cliten/1/文件,執行PHP代碼。

4.3.6 代碼分析

我們根據漏洞PoC來跟蹤漏洞執行流程,從技術背景中的路由解析我們可以定位到漏洞存在的模塊是client模塊中的download方法,在經過路由解析后,系統將通過loadModule()方法加載對應模塊:

進入到client的download()方法中,獲取到需要調用的2個參數link

image

然后跟進到download()重點中的downloadZipPackage()函數,全局中共有兩個downloadZipPackage函數,其中一個在module/client/ext/model/xuanxuan.php:進入到該函數中,我們發現該函數首先將version, $link);

image

接下來進入到module/client/model.php中的接下來進入到module/client/model.php:

image

在該方法中,我們可以看到version參數用于創建一個新的文件夾,即/data/client/${version},

然后將link參數值進行base64解碼,最終在新建文件夾下新建文件,然后將遠程文件寫入到該文件中,最終達到遠程文件上傳漏洞的目的。

image

4.4 禪道 Pro版本任意命令執行漏洞

4.4.1 漏洞簡介

漏洞名稱:禪道項目管理軟件Pro版本任意命令執行漏洞
漏洞編號:CVE-2020-7361
漏洞類型:命令執行
CVSS評分:CVSS 2.0:9.0; CVSS 3.x:8.8
漏洞危害等級:高危

4.4.2 漏洞概述

EasyCorp ZenTao Pro是中國自然易軟網絡技術(EasyCorp)公司的一套開源項目管理軟件。該軟件包括產品管理、項目管理、質量管理和文檔管理等功能。EasyCorp ZenTao Pro 8.8.2及之前版本中的/pro/repo-create.html文件存在操作系統命令注入漏洞。攻擊者可借助‘path’參數利用該漏洞以SYSTEM權限執行任意命令。

4.4.3 漏洞影響

禪道 Pro <= 8.8.2

4.4.4 漏洞修復

目前廠商已發布升級補丁以修復漏洞,補丁獲取鏈接:

1.建議受影響的用戶升級至ZenTao pro 8.8.2以上版本,下載地址:https://www.zentao.net/download.html

4.4.5 漏洞利用過程

0x0:首先登陸到管理員賬戶。

0x1:通過/repo-create.html(/index.php?m=repo&f=create)頁面下的client參數執行系統命令,將惡意軟件下載到服務器中。

SCM=Git&name=test2&path=C%3A%5CProgramData&encoding=utf-8&client=cmd1

0x2:通過repo-create.html頁面下的client參數執行系統命令,使用反彈shell,以達到getshell的目的。

SCM=Git&name=test2&path=C%3A%5CProgramData&encoding=utf-8&client=cmd2

4.4.6 代碼分析

我們根據漏洞PoC來跟蹤漏洞執行流程,從技術背景中的路由解析我們可以定位到漏洞存在的模塊是repo模塊中的create方法,在經過路由解析后,系統將通過loadModule()方法加載對應模塊,如下圖所示:

image

然后通過call_user_func_array()函數調用對應模塊以及對應方法:

image

在module/repo/control.php文件中的create()函數中,如果是post的數據,首先進入到$repoID = $this->repo->create();該處的create()方法是調用的model.php文件中的create()方法:

image

進入到module/repo/model.php方法中,首先進入到create()方法中,發現第一步需要執行checkConnection():

image

在checkConnection()函數中,首先獲取到對應參數值,由此發現參數在此未做過濾,繼續往下看:

image

如果SCM=git的話,則判斷path下的文件是否存在,如果不存在則返回false。

image

然后進入到本漏洞的觸發點了,command參數直接與tag 2>&1拼接,帶入到exec()函數執行:

image

五、漏洞利用

最后,通過深信服千里目實驗室漏洞利用工具Sniper進行最后的漏洞利用,具體操作如以下視頻所示:

5.1 禪道 8.2-9.2.1 SQL注入漏洞導致Getshell

相關視頻請轉至原文觀看

5.2 禪道 后臺代碼注入漏洞

相關視頻請轉至原文觀看

5.3 禪道 后臺文件上傳漏洞(CNVD-C-2020-121325)

相關視頻請轉至原文觀看


Paper 本文由 Seebug Paper 發布,如需轉載請注明來源。本文地址:http://www.bjnorthway.com/1435/