背景
近期正值多事之秋,hvv中有CVE-2024-38077專項漏洞演習,上級police也需要檢查轄區記憶體在漏洞的資產,自己單位領導也收到了情報,在三方共振下這個大活兒落到了我的頭上。Windows Server RDL的這個漏洞原理就不過多介紹,本文重點關注如何滿足大批次探測的需求。
問題
CVE-2024-38077自披露以來流傳過幾個poc工具,但使用過後留下的只有某某服的exe版本。可能出於保密原因,這個工具不支援的功能太多,本文就不一一列舉,採用排除法自行腦補。支援的引數是指定某個IP或者某個IP段進行掃描,然後沒了,就像這樣:
但是這樣掃來掃去無法滿足需求,遇到的幾個典型問題就是:
-
掃的為什麼很慢?
-
從外部匯入IP怎麼辦?
-
如何從大批次資產中篩選出有漏洞的?
空間測繪
探測轄區內或者某一地區的資產當然離不開空間測繪工具,fofa、鷹圖、shaodan、zoomeye等著名的自然要嘗試一遍,搜尋的關鍵詞首先是國內+3389和135埠+windows server作業系統,協議的話可以組合RDP/RDL,這樣一來搜出的資產會多達幾百萬條,百萬量級的資料處理起來對於我們這種小散戶而言屬於天方夜譚。況且這些空間測繪平臺中有的甚至不支援非會員大資料量查詢,像shaodan這樣能夠顯示出來已經是仁慈的了:
結果雖然搜尋出來了,但是百萬級的資料是拿不到的。一是不支援多埠篩選,二是不支援匯出(非會員)。
這裡先解決第二個問題,如何匯出搜尋結果?突然想起了許久未用的空間測繪工具——kunyu(坤輿)。執行起來,進去執行搜尋是這樣:
檢查了好多遍,語法沒問題。不明覺厲之際,聯絡了kunyu的作者@風起。詢問才知道ZoomEye的普通賬號許可權已經不支援kunyu了。唉,只能厚著臉皮借來賬號一用。
然後就是重新初始化、配置輸出目錄、配置查詢頁數......這次匯出的關鍵就在page引數上。kunyu預設的page是1,每次顯示10條,即輸出的Excel中有10條資料。如果設定為1000,則會顯示10000條資料,匯出的資料也就是10000條,但是這樣一來查詢效率會大大降低。經過測試,將page設定為100是較為合適的,也就是每次顯示1000條。另外配合時間引數after、before以及區域引數city、subvisions將單次搜尋總量控制在1000條以內,這樣就可以不漏掉資產。
最後經過一番折騰,搜尋了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的輸出是最整齊的(前提是控制輸入引數),方便後續處理:
從輸出檔案可以看出,除了第一行是註釋,下面的內容都很有規律,每六行是對一個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輸出檔案放在同一目錄下:
開啟powershell執行jar包,設定poc引數為CVE-2024-38077,同時指定輸入IP的檔案路徑和輸出檔案路徑,等待掃描完後得到存在漏洞的資產列表。
總結
CVE-2024-38077漏洞的探測難點在於一是沒有成型的工具,二是空間測繪出來的大批次資產如何匯出與二次篩選。本文的思路只是臨時方案,相信後面會有大神公開其exp,最終出現像MS17010一樣的工具。
需要此專案加V:dctintin,發地址。
更多網安技能的線上實操練習,請點選這裡>>