0x01 前言
通達OA作為國內最主流的三大OA之一,經常參攻防演練的小夥伴一定非常喜歡這套系統的漏洞。歷史上通達OA報出過很多高危漏洞,也曾經被人吐槽安全水平不高。但是經過這麼多年的沉澱,現在通達OA的安全水平已經有了顯著的提高。
本文以曾經研究過的通達OA11.9版本為例,闡述在高版本通達中如何利用通達自身的特性來getshell。文中涉及的所有漏洞都是筆者自研和首發,大多數已在最新版的通達OA12.0中修復,本文只是分享一下挖掘這些漏洞的思路和過程。很多時候我們想拿到權限,不一定非要通過某個牛逼的漏洞,組合利用一些特性也能帶來意想不到的效果。
0x02 獲取普通用戶權限
歷史很多通達OA的漏洞都是未授權或者越權,包括高危的SQL注入或者文件上傳。目前較新版本的通達對于越權的問題處理的比較好,絕大多數文件都是需要登陸之後才能訪問的。所以我們不再局限於尋找未授權訪問的文件,而是尋找方便的用戶口令爆破方式。
第一個很重要的tips是,通達OA安裝之後的默認密碼是空,這一點尤其重要。實戰環境中能遇到的通達OA的很多弱口令都是空。如果用戶要修改口令,則必須滿足「8-20位,必須同時包含字母和數字」(低版本的通達OA沒有複雜度限制),如圖2.1所示。

圖2.1 通達OA修改口令的要求
直接從通達OA的登陸口來爆破雖然沒有驗證碼,但是卻是有登陸次數錯誤的限制,而且有前端的RSA加密。但是這兩個限制都是可以繞過的。
1)通達OA11.9在登錄處默認使用了RSA的加密傳輸,但是修改參數encode_type=0,就可以明文傳輸密碼了;
2)通達OA11.8默認10分鐘只能輸出3次密碼,但是由於獲取的IP是從X-Forwarded-For中獲取的,所以可以通過該字段無限制爆破。
另外,為了更好的提高爆破密碼的效率,配合另一個找回密碼的接口,可以用於探測用戶名是否存在。如圖2.2所示。

圖2.2 通過找回密碼的接口判斷用戶名是否存在
為了更好的利用整個弱口令爆破的過程,編寫了一個自動化的爆破腳本,具有下面的功能。文末附腳本下載方式,使用方式如圖2.3所示。
▶自動發現系統存在的用戶名
▶指定進程數,對用戶名進行密碼爆破
▶指定用戶名,只對指定的用戶名進行爆破
▶支持對中文用戶名進行爆破
▶支持基於存在用戶名的相關密碼爆破,比如用戶名張三,則密碼為zhangsan123

圖2.3 通達OA自動爆破腳本
0x03普通用戶提權
通過上面的弱口令爆破的思路,我們大概率已經獲取目標相關的一個普通用戶權限。普通用戶可以登陸系統,但是還是不能拿到服務器權限,我們需要對普通用戶進行提權。
未授權的SQL注入漏洞很少,但是登陸之後的SQL注入漏洞就很多了。在通達OA11.9版本中存在很多後台的SQL注入漏洞,但是我們需要首先繞過通達的全局的安全過濾,如圖3.1所示。

圖3.1 通達OA的全局SQL注入防禦
這個SQL注入其實就是原來的80sec,很多其他的CMS也使用過,網上也有關於80sec的繞過方式,基本的思路就是通過特殊的方式引入單引號來進行繞過,如下所示。
但是在11.9版本的通達中已經對響應的繞過方式進行了修復,修復代碼如圖3.2所示。首先會把所有轉移之後的引號替換為空,然後再把反引號中的引號替換為空。這樣我們就沒辦法再用上面的方式來繞過WAF了。

圖3.2 通達OA修復80sec的漏洞
那麼現在的情況下,還能不能利用通達OA的SQL注入漏洞呢?答案是肯定的。仔細閱讀閱讀通達OA的全局注入防護函數sql_injection,函數會禁止SQL語句中使用注釋,禁止使用聯合查詢,禁止使用常見的注入關鍵字。但是不會禁止使用bool盲注,如圖3.3所示。

通達OA11.9版本在普通用戶權限下,還是有很多SQL注入的漏洞。這裡給出一個示例,其他的注入讀者可以自己再去找。定位到漏洞文件/module/appbuilder/user_select/query.php,如圖3.4所示。

圖3.4 因為通達OA全局變量的特性導致SQL注入漏洞
因為這裡的注入有諸多限制,所以用SQLMAP跑不出來,我自己寫了一個腳本來跑這種注入(文末附腳本下載方式)。運行如圖3.5所示。

圖3.5 使用注入腳本注出數據
這樣我們可以拿到admin對應的hash值,但是並不是所有admin的hash都可以解密。還有哪些用戶是可以幫助我們拿到服務器權限的呢?要能拿到服務器權限,用戶需要有硬盤管理的權限,具體到數據庫中需要滿足下面的條件。
在上面的自動化腳本中我已經實現了指定注出具有「硬盤管理」權限用戶的功能,稍微改一點就可以直接用了。
0x04獲取服務器權限
登錄一個剛才獲取用戶。來到知識管理 - 網絡硬盤設置,如圖4.1所示。

圖4.1 網絡硬盤設置
最開始這裡面是空的,新建一個共享目錄。由於通達OA11.9增加了策略,不允許設置的目錄中包含wwwroot所在的目錄。定位文件
/general/system/netdisk/new/submit.php,如圖4.2所示。

圖4.2 網絡硬盤設置限制
我們不能添加帶wwwroot的目錄,但是我們可以添加wwwroot對應的根目錄,默認情況下通達OA WEB根目錄是安裝在D:/myoa/wwwroot/。所以我們可以添加D:/的網絡硬盤,我本地是裝在C盤,所以添加對應C盤的網絡硬盤,如圖4.3所示。

圖4.3 添加C:///的網絡硬盤
配置這個共享目錄的權限,主要是自己要能上傳文件,查看目錄結構 權限設置 - 批量權限設置。在授權人員中加上自己。

圖4.4 為新增加的網絡硬盤配置權限
現在就可以瀏覽C:/的根目錄了。

圖4.5 網絡硬盤配置中找到網站根目錄
找到網站根目錄,對應的wwwroot目錄下面。點擊單個上傳。抓包。

圖4.6 通過網絡硬盤上傳文件
但是上傳的時候還是會報錯。

圖4.7 網絡硬盤上傳文件報錯
這主要是由於inc/utility_file.php文件中,對上傳文件的路徑做了限制。如果上傳路徑中包含了wwwroot,然後又沒有attachment,就不允許上傳,如圖4.8所示。

圖4.8 上傳文件要求上傳文件必須在attachment目錄
繞過方式就是,我們自己在某個字目錄下面創建一個attachment目錄。比如在inc下面創建目錄attachment。
然後再到這個目錄上傳文件,如圖4.9所示。

圖4.9 在自建的attachment目錄上傳文件
這是後上傳抓包,直接上傳1.png是可以的了。但是上傳php還是不可以。修改上傳的後綴為 1.php .(0x88對應的ascii)。直接在hex裡面修改就可以了,如圖4.10所示。

圖4.10 通過在文件名末尾增加0x88對應的ascii可以繞過上傳黑名單檢測
現在我們的目錄文件1.php就在下面的路徑了/inc/attachment/1.php
但是通達11.9版本修復了Wscript.Shell執行命令的方式,怎麼執行命令是另一個問題了。這是通達11.9版本disable_functions的函數列表disable_functions = exec,shell_exec,system,passthru,proc_open,show_source,phpinfo,popen,dl,eval,proc_terminate,touch,escapeshellcmd,escapeshellarg
這裡和以前第一個不同的點是沒有禁用assert了,所以,我們可以構造一個一句話木馬,但是這個一句話有很大的缺陷,我們並不能通過這個一句話來執行系統命令。如何執行系統命令呢?肯定是有辦法的,留給大家思考一下。
0x05總結
通達OA的代碼量很大,很亂,甚至一套系統竟然是用了多個不同的開發框架,雖然最近系統修復了很多的漏洞,但是仔細分析還是有一些利用思路。一鍵getshell是很難的,但是組合拳getshell還是有一定的可能性。
公眾號回復」oa」獲取文中腳本下載鏈接。
加個好友
歡迎在看丨留言丨分享至朋友圈三連
好文推薦
2022HW必備|最全應急響應思維導圖
乾貨|後滲透及內網初體驗的總結
發現內網存活主機的各種姿勢
實戰|某次攻防演練中的分析溯源
實戰|後台getshell+提權一把梭
紅隊快速打點工具
實戰|記一次艱難的外網打點
實戰|記一次文件上傳繞過
常見漏洞安全攻防知識庫
紅隊信息搜集工具(附下載地址)
實戰—某醫院管理系統Getshell
CobaltStrike上線Linux