通達OA RCE遠程代碼執行漏洞分析(含EXP&POC)

前記

    在上個月,通達OA爆出了任意文件上傳及任意文件包含漏洞,影響版本非常廣,這兩個漏洞結合可以獲取shell權限,爲什麼在漏洞爆出一個月後我才寫這篇文章呢,因爲我也是最近纔看到的。所以我也趕忙的寫完EXP和POC就發了這篇文章,下面我會從代碼層進行審計,分析漏洞。希望對大家有所幫助!

0x02 影響版本
tongdaOA V11
tangdaOA 2017
tangdaOA 2016
tangdaOA 2015
tangdaOA 2013 增強版
tangdaOA 2013

任意文件上傳分析

    該文件上傳漏洞的產生位置就是在upload.php文件中,因爲其未對用戶身份進行嚴格認證導致任意文件上傳漏洞,下面我們來看一下吧。

    源碼採用了zend加密,解密後才能正常閱讀代碼,從下圖中我們可以看到代碼對變量P進行了判斷,如果變量P被設置並且不爲空則獲取session否則進行身份驗證(從文件名不難判斷)。這裏值得吐槽的一點是既然使用了isset函數進行判斷,爲什麼又要在後面檢查P是否爲空,這樣不是多此一舉嗎?
在這裏插入圖片描述
繼續向下看,要求$DEST_UID不爲空,後面調用了方法td_verify_ids是說這個參數需要是0-9開頭的值。
在這裏插入圖片描述

下圖框內代碼的意思是如果DEST_UID的值爲0那麼UPLOAD_MODE的值必須是2否則返回接收方ID無效。
在這裏插入圖片描述
繼續向下看,判斷是否有文件進行上傳,然後對UPLOAD_MODE的值進行判斷,如果不爲1則進行調用upload函數,否則會進入if語句中進行判斷上傳的名url解碼後與解碼前是否一致。upload函數位於inc/utility_file.php中,所以我們繼續跟進該文件。
在這裏插入圖片描述
我們進入inc/utility_file.php中發現其中調用了is_uploadable()函數對文件嗎進行驗證。如果文件後綴名爲php則返回false,返回false的結果自然就是禁止上傳,這裏要注意。
在這裏插入圖片描述
從上面的審計中我們得知了一些必須提交的參數,好在這些參數都是我們可控,所以我需要構建一個數據包。如下圖提交相應參數,P、UPLOAD_MODE、DEST_UID這三個參數是必須提交的,其中上面有說到的一些判斷條件也需要注意。
在這裏插入圖片描述
現在通過返回值我們得到上傳後文件名及路徑信息。
在這裏插入圖片描述

我們發現已經成功上傳,但是上傳後的路徑並不在web目錄下,並沒有辦法直接訪問,所以我們就需要結合另一個文件包含漏洞了。

任意文件包含漏洞

    在上面我們講到了任意文件上傳,但是並沒有辦法去作爲php代碼利用,所以我們需要利用另一個任意文件包含漏洞,該漏洞產生於gateway.php文件中,下面我們來看一下吧!

    該文件代碼較少,箭頭處的意思是接收的json的key值如果是url則會給url變量賦值他的value值,方框中判斷接收的url值中是否含有general/、ispirit/、module/任意一個,如果有則直接進行包含url。
在這裏插入圖片描述
所以我們可以傳遞一個json值,他的key爲url,value值包含general/通過…/跳出訪問我們之前上傳的那個文件。
在這裏插入圖片描述
構建語句http://192.168.52.133:81/ispirit/interface/gateway.php?json={“url”:"/general/…/…/attach/im/2004/1426921525.jpg"}&cmd=ipconfig
已經成功執行命令,這裏需要注意的是通達OA會對一些木馬文件進行過濾,比如上傳常規的一句話木馬是無法執行命令,親測通過上面調用cmd的方式可以執行且權限爲system。
這裏有一個筆誤,之前上傳的木馬接收的是POST的值,爲了方便展示我改成接收GET了。

奇淫巧技

    既然上面已經有了文件包含漏洞那麼自然我們也可以通過一些其他方法進行利用。比如日誌包含來進行代碼執行,下面我們來看一下吧。

    在GET請求處寫入一段php代碼,注意一定要抓包後寫,如果直接在瀏覽器進行構建語句,則會被url編碼,寫進日誌自然無法執行代碼語句。
在這裏插入圖片描述
下面我們進行包含日誌文件吧。
在這裏插入圖片描述
可以看到代碼已經成功執行,同理oa.error.log也可以進行文件包含。但是需要注意的是構建php語句時不要輸入雙引號,會被日誌進行轉碼,從而無法通過日誌getshell。要使用單引號

再就是文件上傳中的一點奇淫巧技。
在構建上傳數據包時,將文件名後加一個.利用windows的特性會自動忽略.達到繞過上傳文件限制,但是因爲上傳後的路徑不在web目錄下,所以仍然需要與文件包含結合利用。
在這裏插入圖片描述
這裏看到上傳後確爲php文件。
在這裏插入圖片描述

官方修復補丁

    在官方的修復補丁中,對文件上傳進行了刪除else判斷,如下圖,因爲我不想打補丁所以就從網上找了一張對比圖。
在這裏插入圖片描述
可以看到原先是進行驗證變量P,如果符合要求就不會進入auth文件中,修復後無論如何都會進入auth.php文件中進行身份驗證。
在這裏插入圖片描述
而文件包含處則對…進行了過濾,不允許url中包含…從而禁止目錄穿越。

修復方案:
官方已經發布了修復補丁,可以通過安裝補丁解決。

POC&EXP利用

    有一說一,我覺得自己寫的這個EXP是真的很好用,很適合在測試中使用,比較簡便。下面就由我來介紹一下它們的使用方法吧。

POC使用方法
在這裏插入圖片描述
POC的使用方法比較簡單,只需要指定域名即可自動檢測是否存在該漏洞。

EXP使用方法
在這裏插入圖片描述
默認指定域名則會返回一個交互式命令執行終端,輸出exit退出交互。在這裏插入圖片描述
如果指定-file-shell參數則會自動生成並返回一個木馬連接路徑,訪問密碼是pass,通過冰蠍進行連接,注意菜刀這些都不能正常連接,要用冰蠍(如下圖)。在這裏插入圖片描述
目前EXP&POC已經上傳至github有興趣的小夥伴可以去下載,有不懂的可以聯繫我。

https://github.com/wikiZ/tongda-exp-poc

後記

    那麼通達OA的遠程代碼執行漏洞就講到這裏了,上文中從代碼層分析了漏洞的成因,對於網絡安全測試中,不能只會滲透而不會如何加固,只有從代碼層分析漏洞成因才能從根本上解決。希望看完文章的你能從中有所收穫。
    願有心人皆有所成,所想之事皆能如意吧

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章