少俠你在接下來進行的全内網端口探測的過程中,可能會遇到以下棘手的情況:
①需要對巨量的ip進行全端口探測;(nmap耗時太長,等的讓你懷疑人生的那種)
② 高速度與低誤報二者不可兼得;(魚與熊掌不可兼得)
③有些伺服器有着嚴格的防火牆政策;(tcp頭改啥标志位怕也是不好混進去)
關于以上問題本文提出了恰當的解決方案,全文充滿了作者獨到的見解,不可不看呀;
資産統計中你拿到巨多的ip,需要為每個ip統計詳細到每個端口的資訊時,你有沒有經曆過漫長的等待,看着nmap緩慢的百分比進度,簡直想解除安裝了nmap。
nmap的優勢不在于進行如此大範圍的資産探測;
而是對于少量ip進行細緻的探測。
masscan和zmap則是此類擅長者。
關于nmap、zmap、masscan對比,此處不做贅述,請看下面這位老哥的文章;
https://www.freebuf.com/sectool/119340.html
簡言之,zmap與masscan皆采用異步傳輸;
而且,在對任意位址端口的組合的探測時,masscan表現的更加靈活和出色;
但是,masscan和zmap都有一個無法忍受的誤報率。
影響masscan誤報率的因素有很多,主要有這麼三個方面:發包速度、網絡性能、tcp/ip堆棧沖突;
不同網絡環境中網絡的性能不同,且網絡性能涉及到的因素很多,丢包率、抖動率、時延、包轉發率等等,且網絡性能這項是我們無法改變的,是以我們先把網絡性能作為一個常量;
但是發包速度和tcp/ip堆棧沖突是我們能改變的。
理論上:
a、解決了堆棧沖突誤報率會變低;
b、發包速度越慢誤報率越低;
但是發包速度和誤報率之間并不是嚴格的正比關系,并且發包速度太低masscan就沒有了使用意義。
是以,需要先來探究一下,怎樣的網絡性能下配置多少的發包速度可以兼顧速度與準确率。
我在本地網絡做了一個關于masscan的小實驗:
1、先測試一下本地網絡最大能支援的包轉發率,如下圖所示

結果:表示包轉發率的rate值一直在170-kpps~210kpps之間波動
2、測試一下rate為210kpps的情況下掃描内網中24個ip的全端口,探測到的存活端口數量是多少。如下圖所示
結果:探測的開放端口數量為38個
3、測試一下rate為170kpps的情況下掃描内網中24個ip的全端口,探測到的存活端口數量是多少。如下圖所示
結果:探測到開放端口數量為48個
4、測試一下rate為110kpps的情況下掃描内網中24個ip的全端口,探測到的存活端口數量是多少。如下圖所示
結果:探測到開放端口數量為52個
5、測試一下rate為100kpps的情況下掃描内網中24個ip的全端口,探測到的存活端口數量是多少。如下圖所示
結果:探測到開放端口數量為52個
6、測試一下rate為80kpps的情況下掃描内網中24個ip的全端口,探測到的存活端口數量是多少。如下圖所示
結果:探測到開放端口數量為53
7、測試一下rate為50kpps的情況下掃描内網中24個ip的全端口,探測到的存活端口數量是多少。如下圖所示
結果:探測到開放端口數量為53個
8、測試一下rate為10kpps的情況下掃描内網中24個ip的全端口,探測到的存活端口數量是多少。如下圖所示
結果:探測到開放端口數量為53個
9、測試一下rate為1kpps的情況下掃描内網中24個ip的全端口,探測到的存活端口數量是多少。如下圖所示
結果:探測到開放端口數量為53個
測試速度低于1kpps,就太慢了,就算結果更準确卻沒有意義了,是以低于1kpps的就不做測試了。
統計一下以上測試的結果:
轉發率(kpps) | 210 | 170 | 110 | 100 | 80 | 50 | 10 | 1 |
---|---|---|---|---|---|---|---|---|
探測到的開放端口個數 | 38 | 48 | 52 | 53 | 53 | 53 | 53 | 53 |
我們可以發現在我目前的網絡環境中,轉發率為100kpps時是最合适的速度大小,可能在不同網絡中會有一些差異。
以上是測試結果,我們每一次使用masscan總不可能都這麼測吧,确實如此。
我分享一下我的經驗:最合适的速度一般是在網絡最大轉發率的50%左右。
看完了速度與誤報率的關系後,我們來看一下masscan的tcp/ip堆棧沖突。
其實呀,masscan是擁有獨立的TCP/IP堆棧的;
在平時使用中,我發現當為masscan配置單獨的ip時;
它的性能才能被充分發揮!!!誤報率顯著降低。
我們來看一下,當配置獨立ip,轉發率為100kpps時,其他情況完全不變,masscan的掃描結果如何?如下圖所示
結果:探測到開放的的端口數量為157個
這與剛才的100kpps時發現的53個相比,幾乎三倍!!!
在這種情況下我估算了一下它的速度:10分鐘掃描1000個ip的全端口。
這是nmap速度的一千多倍,而且在準确度上幾乎沒有差别。
在獲得ip的全端口探測結果之後,你并不能确定端口對應的服務是什麼?
這時候就可以使用nmap了,nmap有着豐富的指紋庫,可以為我們确定端口對應的服務版本。
先調用masscan庫掃描,再調用nmap庫掃描,如果ip端口數量過多,可以配合多線程;後面會完善一下代碼再放在github上,這裡先放出簡略版。
以上代碼實作如下:
還有開篇提到的最後一個問題,有些伺服器有着嚴格的防火牆政策怎麼辦?
有防火牆,需要對其進行各種騷姿勢的繞過時,masscan就顯得很無力了。
這時還是nmap更為适合,配合python的多線程,速度也過的去。
過防火牆姿勢有很多,感興趣的可以去看《nmap滲透測試》這本書,這裡隻講我平時常用的兩種。
1、資料包分片
有些防火牆為了減少資料包壓力,不會對資料包進行組合之後再檢查,而是對單個資料包直接檢查。
如下圖所示
2、指定源端口
防火牆的存在往往會影響一些業務的工作,管理者很有可能會放行來自特定端口的資料包,比如說源端口53的dns服務。
如下圖所示
參考文檔:
《nmap滲透測試指南》
https://yq.aliyun.com/articles/99743?spm=a2c4e.11163080.searchblog.22.264e2ec1iwqogV
https://github.com/robertdavidgraham/masscan
來自FreeBuf.COM