如何透過組合手段大批次探測CVE-2024-38077

蚁景网安实验室發表於2024-09-10

背景

近期正值多事之秋,hvv中有CVE-2024-38077專項漏洞演習,上級police也需要檢查轄區記憶體在漏洞的資產,自己單位領導也收到了情報,在三方共振下這個大活兒落到了我的頭上。Windows Server RDL的這個漏洞原理就不過多介紹,本文重點關注如何滿足大批次探測的需求。

問題

CVE-2024-38077自披露以來流傳過幾個poc工具,但使用過後留下的只有某某服的exe版本。可能出於保密原因,這個工具不支援的功能太多,本文就不一一列舉,採用排除法自行腦補。支援的引數是指定某個IP或者某個IP段進行掃描,然後沒了,就像這樣:

如何透過組合手段大批次探測CVE-2024-38077

但是這樣掃來掃去無法滿足需求,遇到的幾個典型問題就是:

  • 掃的為什麼很慢?

  • 從外部匯入IP怎麼辦?

  • 如何從大批次資產中篩選出有漏洞的?

空間測繪

探測轄區內或者某一地區的資產當然離不開空間測繪工具,fofa、鷹圖、shaodan、zoomeye等著名的自然要嘗試一遍,搜尋的關鍵詞首先是國內+3389和135埠+windows server作業系統,協議的話可以組合RDP/RDL,這樣一來搜出的資產會多達幾百萬條,百萬量級的資料處理起來對於我們這種小散戶而言屬於天方夜譚。況且這些空間測繪平臺中有的甚至不支援非會員大資料量查詢,像shaodan這樣能夠顯示出來已經是仁慈的了:

如何透過組合手段大批次探測CVE-2024-38077

結果雖然搜尋出來了,但是百萬級的資料是拿不到的。一是不支援多埠篩選,二是不支援匯出(非會員)。

這裡先解決第二個問題,如何匯出搜尋結果?突然想起了許久未用的空間測繪工具——kunyu(坤輿)。執行起來,進去執行搜尋是這樣:

如何透過組合手段大批次探測CVE-2024-38077

檢查了好多遍,語法沒問題。不明覺厲之際,聯絡了kunyu的作者@風起。詢問才知道ZoomEye的普通賬號許可權已經不支援kunyu了。唉,只能厚著臉皮借來賬號一用。

然後就是重新初始化、配置輸出目錄、配置查詢頁數......這次匯出的關鍵就在page引數上。kunyu預設的page是1,每次顯示10條,即輸出的Excel中有10條資料。如果設定為1000,則會顯示10000條資料,匯出的資料也就是10000條,但是這樣一來查詢效率會大大降低。經過測試,將page設定為100是較為合適的,也就是每次顯示1000條。另外配合時間引數after、before以及區域引數city、subvisions將單次搜尋總量控制在1000條以內,這樣就可以不漏掉資產。

如何透過組合手段大批次探測CVE-2024-38077

最後經過一番折騰,搜尋了60多次,合併多個檔案後,終於生成了一份5萬條左右的Excel......既然有了一堆IP,接下來該進行的就是如何把這些IP匯入工具開掃。但此時的poc工具是不支援外部IP匯入的,並且對於“Can Not Reach Host.”之類的資產掃描進度會很慢,所以要考慮如何兼顧效率和準確性的問題。

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

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

Nmap

由於之前經過測試,對於確實存在漏洞的資產,poc的響應是很快的。CVE-2024-38077的利用條件之一是同時開放135和3389埠,而空間測繪工具搜尋的結果是未驗證135的,所以接下來的思路是使用Nmap對5萬個資產探測一下兩個埠的開放情況,然後根據輸出結果篩選出兩個埠均為open狀態的IP,最後嘗試將篩選出的IP匯入poc工具掃描。

這個階段也嘗試過fscan等其他工具,但是比較下來Nmap的輸出是最整齊的(前提是控制輸入引數),方便後續處理:

如何透過組合手段大批次探測CVE-2024-38077

從輸出檔案可以看出,除了第一行是註釋,下面的內容都很有規律,每六行是對一個IP的描述,包含135和3389兩個埠,而且格式都固定。由於需求要的是開放兩個埠的所有IP,現成的工具沒有能夠滿足的,只能自己寫,又一次掏出了idea......

膠水程式碼

從Nmap的輸出結果不難分析,如果要寫程式碼處理的話,每六行可以看成是一個Nmap類,而這個類裡面只需要3個屬性,IP、port-135、port-3389。直接上程式碼:

//讀取外部檔案
BufferedReader reader = new BufferedReader(new FileReader(file));
​
MNmap nmap = null;
ArrayList<MNmap> list = new ArrayList();
int count = 0;
String line;
​
//迴圈讀取每一行
while ((line = reader.readLine()) != null) {
​
    //ip
    if (line.startsWith("Nmap")) {
        nmap = new MNmap();
        nmap.ip = TNmap.findIp(line);
    }
    //135
    if (line.startsWith("135") && nmap != null) {
        nmap.p135 = TNmap.findP135(line);
    }
    //3389
    if (line.startsWith("3389") && nmap != null) {
        nmap.p3389 = TNmap.findP3389(line);
        //將每一個nmap物件加入list
        list.add(nmap);
    }
}

到這裡整個任務已經完成了一半,精準的資產已經篩選出來了,大概2400多個。接下來就是使用poc工具掃描了,畢竟兩千多條資料,總不能手動設定兩千多次吧,所以還是要寫程式碼:

//迴圈執行exe工具,引數是nmap的IP,並逐個獲取執行結果
for (int i = 0; i < list.size();i++) {
    MNmap nmap1 = list.get(i);
    if ("open".equals(nmap1.p135) && "open".equals(nmap1.p3389)) {
​
        try {
            // 指定要執行的exe檔案及其引數
            ProcessBuilder processBuilder = new ProcessBuilder(exeFile, nmap1.ip);
            // 啟動程序
            Process process = processBuilder.start();
            // 讀取標準輸出
            BufferedReader r = new BufferedReader(new InputStreamReader(process.getInputStream()));
            String l;
            while ((l = r.readLine()) != null) {
                if (l.contains("Vulnerability"))
                    System.out.println(l);
            }
​
            // 讀取標準錯誤(如果需要)
            BufferedReader errorReader = new BufferedReader(new InputStreamReader(process.getErrorStream()));
            String errorLine;
            while ((errorLine = errorReader.readLine()) != null) {
                System.out.println("Standard Error: " + errorLine);
            }
​
            // 等待外部程式執行完成
            int exitCode = process.waitFor();
            if (exitCode == 0) {
                System.out.println("程式執行完成");
            } else {
                System.out.println("程式執行出錯,退出碼:" + exitCode);
            }
​
        } catch (IOException | InterruptedException e) {
            e.printStackTrace();
        }
        //計數
        count++;
    }
}
System.out.println("total: " + count);

這裡貼出的只是關鍵的兩段程式碼,完整專案見文末連結。最後將專案打成jar包,與CVE-2024-38077.exe和Nmap輸出檔案放在同一目錄下:

如何透過組合手段大批次探測CVE-2024-38077

開啟powershell執行jar包,設定poc引數為CVE-2024-38077,同時指定輸入IP的檔案路徑和輸出檔案路徑,等待掃描完後得到存在漏洞的資產列表。

如何透過組合手段大批次探測CVE-2024-38077

總結

CVE-2024-38077漏洞的探測難點在於一是沒有成型的工具,二是空間測繪出來的大批次資產如何匯出與二次篩選。本文的思路只是臨時方案,相信後面會有大神公開其exp,最終出現像MS17010一樣的工具。

需要此專案加V:dctintin,發地址。

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

相關文章