掃描端口的軟件 端口掃描軟件下載



文章插圖
掃描端口的軟件 端口掃描軟件下載

文章插圖
這是一個端口掃描器 。理論上它可以在 5 分鐘內掃描整個 Internet,從一臺機器每秒傳輸 1000 萬個數據包 。
它的用法(參數、輸出)類似于nmap端口掃描器 。支持對多臺機器進行廣泛掃描,但不支持對單臺機器進行深入掃描 。
在內部,它采用異步傳輸,像類似于端口掃描器 scanrand,unicornscan和ZMap 。它更靈活,允許任意端口和地址范圍 。
注意: masscan 使用它自己的ad hoc TCP/IP 堆棧 。除了簡單的端口掃描之外的任何其他操作都可能導致與本地 TCP/IP 堆棧發生沖突 。也就是說需要使用–src-ip從不同 IP 地址運行的選項,或用于–src-port配置 masscan 使用的源端口,然后還配置內部防火墻(如pf或iptables)以將這些端口與操作系統的其余部分隔開 。
安裝
除了 C 編譯器(例如gcc 或clang)之外,它實際上沒有任何依賴項 。
sudo apt-get --assume-yes install git make gccgit clone https://github.com/robertdavidgraham/masscancd masscanmake二進制在masscan/bin子目錄中 。
make install源代碼由許多小文件組成,因此使用多線程構建可以加快構建速度 。
make -j用法
用法類似于nmap. 要掃描某些端口的網段:
# masscan -p80,8000-8100 10.0.0.0/8 2603:3001:2d00:da00::/112這會:
掃描10.x.x.x子網和2603:3001:2d00:da00::x子網掃描兩個子網上的端口 80 和范圍 8000 到 8100,或總共 102 個端口<stdout>可以重定向到文件的打印輸出
要查看完整的選項列表,請使用該–echo功能 。這將轉儲當前配置并退出 。此輸出可用作返回到程序的輸入:
# masscan -p80,8000-8100 10.0.0.0/8 2603:3001:2d00:da00::/112 --echo > xxx.conf# masscan -c xxx.conf --rate 1000橫幅信息
Masscan 可以做的不僅僅是檢測端口是否打開 。它還可以在該端口完成與應用程序的 TCP 連接和交互,以獲取簡單的“橫幅”信息 。
Masscan 支持以下協議的橫幅檢查:
FTPHTTPIMAP4memcachedPOP3SMTPSSHSSLSMBv1SMBv2TelnetRDPVNC
問題是masscan 包含自己的 TCP/IP 堆棧,與系統分開 。當本地系統收到來自探測目標的 SYN-ACK 時,它會響應一個 RST 數據包,在 masscan 獲取橫幅之前終止連接 。
防止這種情況的最簡單方法是為 masscan 分配一個單獨的 IP 地址 。這將類似于以下示例之一:
# masscan 10.0.0.0/8 -p80 --banners --source-ip 192.168.1.200# masscan 2a00:1450:4007:810::/112 -p80 --banners --source-ip 2603:3001:2d00:da00:91d7:b54:b498:859d選擇的源地址必須位于本地子網上,否則不能被其他系統使用 。Masscan 會警告你你犯了一個錯誤,但你可能已經搞砸了另一臺機器的通信幾分鐘,所以要小心 。
在某些情況下,例如 WiFi,這是不可能的 。在這些情況下,可以對 masscan 使用的端口設置防火墻 。這可以防止本地 TCP/IP 堆??吹綌祿?masscan 仍然可以看到它,因為它繞過了本地堆棧 。對于 Linux,這看起來像:
# iptables -A INPUT -p tcp --dport 61000 -j DROP# masscan 10.0.0.0/8 -p80 --banners --source-port 61000您可能希望選擇與 Linux 可能為源端口選擇的端口不沖突的端口 。您可以查看 Linux 使用的范圍,并通過查看文件重新配置該范圍:
/proc/sys/net/ipv4/ip_local_port_range在最新版本的 Kali Linux(2018-8 月)上,該范圍是 32768 到 60999,因此您應該選擇低于 32768 或 61000 及以上的端口 。
設置iptables規則僅持續到下一次重新啟動 。您需要根據您的發行版查找如何保存配置,例如使用iptables-save 和/或iptables-persistent.
在 Mac OS X 和 BSD 上,有類似的步驟 。要找出要避免的范圍,請使用如下命令:
# sysctl net.inet.ip.portrange.first net.inet.ip.portrange.last在 FreeBSD 和較舊的 MacOS 上,使用ipfw命令:
# sudo ipfw add 1 deny tcp from any to any 40000 in# masscan 10.0.0.0/8 -p80 --banners --source-port 40000在較新的 MacOS 和 OpenBSD 上,使用pf包過濾實用程序 。編輯文件/etc/pf.conf以添加如下一行:
block in proto tcp from any to any port 40000然后要啟用防火墻,請運行以下命令:
# pfctrl -E如果防火墻已在運行,則使用以下命令重新啟動或重新加載規則:
# pfctl -f /etc/pf.confWindows 不響應 RST 數據包,因此這兩種技術都不是必需的 。然而,masscan 仍然被設計為使用它自己的 IP 地址最好地工作,所以你應該盡可能地以這種方式運行,即使它不是絕對必要的 。
其他檢查也需要同樣的事情,例如–heartbleed檢查,這只是橫幅檢查的一種形式 。
如何掃描整個互聯網
雖然對于較小的內部網絡很有用,但該程序的設計確實考慮到了整個 Internet 。它可能看起來像這樣:
# masscan 0.0.0.0/0 -p0-65535掃描整個互聯網是體驗糟糕的 。一方面,互聯網的某些部分對被掃描的反應很差 。另一方面,某些站點會跟蹤掃描并將您添加到禁止列表中,這將使您免受 Internet 有用部分的影響 。因此,您要排除很多范圍 。要將范圍列入黑名單或排除范圍,您需要使用以下語法:
# masscan 0.0.0.0/0 -p0-65535 --excludefile exclude.txt這只是將結果打印到命令行 。您可能希望將它們保存到文件中 。因此,您需要類似的東西:
# masscan 0.0.0.0/0 -p0-65535 -oX scan.xml【掃描端口的軟件 端口掃描軟件下載】這會將結果保存在 XML 文件中,讓您可以輕松地將結果轉儲到數據庫或其他內容中 。
但是,這僅以 100 個數據包/秒的默認速率進行,這將花費很長時間來掃描 Internet 。你需要加快速度:
# masscan 0.0.0.0/0 -p0-65535 --max-rate 100000這將速率提高到 100,000 個數據包/秒,這將在每個端口大約 10 小時(如果掃描所有端口則為 655,360 小時)內掃描整個 Internet(不包括) 。
與 Nmap 的比較
Masscan 是為多臺機器的大范圍掃描而設計的,而 nmap 是為單臺機器或小范圍的密集掃描而設計的 。
兩個重要的區別是:
沒有要掃描的默認端口,必須指定 -p <ports>目標主機是 IP 地址或簡單范圍,而不是 DNS 名稱,也不是nmap可以使用的時髦子網范圍(如10.0.0-255.0-255) 。
可以masscan將以下設置視為永久啟用:
-sS: 這僅做 SYN 掃描(目前,將來會改變)-Pn: 不首先 ping 主機,這是異步操作的基礎-n: 沒有發生 DNS 解析–randomize-hosts:掃描完全隨機,總是,你不能改變這個–send-eth: 使用 raw 發送 libpcap
如果您需要其他nmap兼容設置的列表,請使用以下命令:
# masscan --nmap傳輸速率(重要?。。?br /> 這個程序非??斓匕l出數據包 。在 Windows 或 VM 上,它可以每秒處理 300,000 個數據包 。在 Linux(無虛擬化)上,它將每秒處理 160 萬個數據包 。這速度足以融化大多數網絡 。
默認情況下,速率設置為 100 個數據包/秒 。要將速率提高到一百萬,請使用類似–rate 1000000.
掃描 IPv4 Internet 時,您將掃描大量子網,因此即使有很高的數據包出去率,每個目標子網也會收到少量傳入數據包 。
但是,通過 IPv6 掃描,您將傾向于關注具有數十億個地址的單個目標子網 。因此,您的默認行為將淹沒目標網絡 。網絡經常在 masscan 產生的負載下崩潰 。
怎么設計的代碼布局
文件main.c包含該main()函數 。它還包含transmit_thread()和receive_thread()功能 。這些函數已被故意扁平化并進行了大量注釋,以便您可以通過逐行逐行瀏覽每個函數來閱讀程序的設計 。
異步
這是一個異步設計 。它具有獨立的發送和接收線程,這些線程在很大程度上彼此獨立 。
因為它是異步的,所以它的運行速度與底層數據包傳輸允許的一樣快 。
隨機化
Masscan 與其他掃描儀的主要區別在于它隨機化目標的方式 。
基本原則是有一個從零開始的單個索引變量,每次探測都增加 1 。在 C 代碼中,這表示為:
for (i = 0; i < range; i++) {scan(i);}我們必須將索引轉換為 IP 地址 。假設您要掃描所有“私有”IP 地址 。那將是范圍表,例如:
192.168.0.0/1610.0.0.0/8172.16.0.0/12在此示例中,前 64k 索引附加到 192.168.xx 以形成目標地址 。然后,將接下來的 1600 萬附加到 10.xxx 范圍內的其余索引應用到 172.16.xx
在這個例子中,我們只有三個范圍 。在掃描整個 Internet 時,我們實際上有 100 多個范圍 。那是因為您必須將許多子范圍列入黑名單或排除在外 。這將所需的范圍切成數百個較小的范圍 。
這是代碼中最慢的部分之一 。我們每秒傳輸 1000 萬個數據包,并且必須為每個探測將索引變量轉換為 IP 地址 。我們通過在少量內存中進行“二分搜索”來解決這個問題 。在此數據包速率下,緩存效率開始超過算法效率 。理論上有很多更有效的技術,但它們都需要太多的內存,以至于在實踐中會變慢 。
我們將把索引轉換成 IP 地址的pick()函數 。在使用中,它看起來像:
for (i = 0; i < range; i++) {ip = pick(addresses, i);scan(ip);}Masscan 不僅支持 IP 地址范圍,還支持端口范圍 。這意味著我們需要從索引變量中選擇 IP 地址和端口 。這是相當簡單的:
range = ip_count * port_count;for (i = 0; i < range; i++) {ip= pick(addresses, i / port_count);port = pick(ports,i % port_count);scan(ip, port);}這導致代碼的另一個昂貴部分 。在 x86 CPU 上,除法/模數指令大約為 90 個時鐘周期或 30 納秒 。當以 1000 萬個數據包/秒的速率傳輸時,我們每個數據包只有 100 納秒 。我認為沒有辦法更好地優化它 。幸運的是,兩個這樣的操作可以同時執行,因此執行其中兩個操作(如上所示)并不比執行一個更昂貴 。
對于上面的性能問題其實有一些簡單的優化,但是都依賴于i++索引變量增加 。實際上,我們需要隨機化這個變量 。我們需要隨機化我們掃描的 IP 地址的順序 。我們需要將流量均勻地分布在目標上 。
隨機化的方式是簡單地加密索引變量 。根據定義,加密是隨機的,并在原始索引變量和輸出之間創建一對一的映射 。這意味著當我們線性地遍歷范圍時,輸出的 IP 地址是完全隨機的 。在代碼中,這看起來像:
range = ip_count * port_count;for (i = 0; i < range; i++) {x = encrypt(i);ip= pick(addresses, x / port_count);port = pick(ports,x % port_count);scan(ip, port);}這也有很大的成本 。由于范圍是不可預測的大小,而不是很好的 2 的偶次冪,因此我們不能使用廉價的二進制技術,如 AND (&) 和 XOR (^) 。相反,我們必須使用昂貴的操作,例如 MODULUS (%) 。在我當前的基準測試中,加密變量需要 40 納秒 。
這種架構允許許多很酷的功能 。例如,它支持“分片” 。您可以設置 5 臺機器,每臺機器執行五分之一的掃描或 range / shard_count. 分片可以是多臺機器,也可以是同一臺機器上的多個網絡適配器,甚至(如果需要)同一網絡適配器上的多個 IP 源地址 。
或者,您可以對加密函數使用“種子”或“密鑰”,以便每次掃描時獲得不同的順序,例如x = encrypt(seed, i).
我們還可以通過退出程序來暫停掃描,只需記住 的當前值i,稍后再重新啟動 。我在開發過程中經常這樣做 。我發現 Internet 掃描出現問題,所以我點擊停止掃描,然后在修復錯誤后重新啟動它 。
另一個功能是重傳/重試 。數據包有時會在 Internet 上丟失,因此您可以背靠背發送兩個數據包 。然而,丟棄一個數據包的東西可能會丟棄緊隨其后的數據包 。因此,您希望將副本發送間隔約 1 秒 。我們已經有一個“速率”變量,它是我們正在傳輸的每秒數據包數,因此重新傳輸函數只是i + rate 用作索引 。
C10 可擴展性
異步技術被稱為“c10k 問題”的解決方案 。Masscan 是為下一個級別的可擴展性而設計的,即“C10M 問題” 。
C10M 解決方案是繞過內核 。在 Masscan 中有三個主要的內核旁路:
自定義網絡驅動程序用戶模式 ?TCP 堆棧用戶模式同步
Masscan 可以使用 PF_RING DNA 驅動程序 。此驅動程序 DMA 將數據包直接從用戶模式內存發送到網絡驅動程序,而零內核參與 。這允許軟件,即使 CPU 速度較慢,也能以硬件允許的最大速率傳輸數據包 。如果將 8 個 10-gbps 網卡放入計算機,這意味著它可以以 1 億個數據包/秒的速度傳輸 。
Masscan 有自己的內置 TCP 堆棧,用于從 TCP 連接中抓取橫幅 。這意味著它可以輕松支持 1000 萬個并發 TCP 連接,當然前提是計算機有足夠的內存 。
Masscan 沒有“互斥鎖” ?,F代互斥體(又名 futexes)大多是用戶模式的,但它們有兩個問題 。第一個問題是它們導致緩存行在 CPU 之間快速來回反彈 。第二個是當存在爭用時,他們會對內核進行系統調用,這會降低性能 。程序快速路徑上的互斥鎖嚴重限制了可擴展性 。相反,Masscan 使用“環”來同步事物,例如當接收線程中的用戶模式 ??TCP 堆棧需要在不干擾傳輸線程的情況下傳輸數據包時 。
可移植性
代碼在 Linux、Windows 和 Mac OS X 上運行良好 。所有重要的部分都使用標準 C (C90)。因此,它在帶有 Microsoft 編譯器的 Visual Studio、Mac OS X 上的 Clang/LLVM 編譯器和 Linux 上的 GCC 上編譯 。
Windows 和 Mac 沒有針對數據包傳輸進行調整,每秒只能接收大約 300,000 個數據包,而 Linux 可以每秒處理 1,500,000 個數據包 。無論如何,這可能比您想要的要快 。
安全
該項目使用安全函數,strcpy_s()而不是像strcpy().
該項目具有自動單元回歸測試 ( make regress) 。
IPv6 和 IPv4 共存
Masscan 支持 IPv6,但沒有特殊模式,兩者同時支持 。
在任何使用 masscan 的示例中,只需將 IPv6 地址放在您看到 IPv4 地址的位置 。您可以在同一掃描中同時包含 IPv4 和 IPv6 地址 。輸出包括相同位置的適當地址,沒有特殊標記 。
IPv6 地址空間非常大 。您可能不想掃描大范圍,除了DHCPv6 分配的子網的前 64k 個地址 。
您可能希望掃描存儲在–include-file filename.txt從其他來源獲得的文件 ( )中的大量地址列表 。該文件可以包含 IPv4 和 IPv6 地址的列表 。使用的測試文件包含 800 萬個地址 。這種大小的文件在啟動時需要額外的幾秒鐘才能讀取(masscan 在掃描前對地址進行排序并刪除重復項) 。
請記住,masscan 包含自己的網絡堆棧 。因此,您運行 masscan 的本地機器不需要啟用 IPv6——但是本地網絡需要能夠路由 IPv6 數據包 。
PF_RING
要超過 200 萬個數據包/秒,您需要一個英特爾 10-gbps 以太網適配器和一個來自 ntop 的稱為“PF_RING ZC”的特殊驅動程序 。為了使用 PF_RING,不需要重建 Masscan 。要使用 PF_RING,需要構建以下組件:
libpfring.so (安裝在/usr/lib/libpfring.so)pf_ring.ko (他們的內核驅動程序)ixgbe.ko (他們的 Intel 10-gbps 以太網驅動程序版本)
當 Masscan 檢測到一個適配器被命名為類似zc:enp1s0而不是類似的名稱時enp1s0,它會自動切換到 PF_RING ZC 模式 。
回歸測試
該項目包含一個內置的單元測試:
$ make testbin/masscan --selftestselftest: success!這測試了代碼的許多棘手部分 。您應該在構建后執行此操作 。
性能測試
要測試性能,請對不用的地址運行以下類似操作,以避免本地路由器過載:
$ bin/masscan 0.0.0.0/4 -p80 --rate 100000000 --router-mac 66-55-44-33-22-11偽造者–router-mac將數據包保留在本地網段上,這樣它們就不會傳到 Internet 上 。
您還可以在“離線”模式下進行測試,這是程序在沒有傳輸開銷的情況下運行的速度:
$ bin/masscan 0.0.0.0/4 -p80 --rate 100000000 --offline第二個基準測試大致顯示了如果使用 PF_RING 時程序的運行速度,它的開銷接近于零 。
順便說一下,隨機化算法大量使用“整數算法”,這是 CPU 上長期慢操作 ?,F代 CPU 已將執行此計算的速度提高了一倍,從而使masscan速度更快 。