網站埠查詢「埠掃描工具有哪些」

這是一個埠掃描器。理論上它可以在 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 gcc
git clone https://github.com/robertdavidgraham/masscan
cd masscan
make

二進位在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 支持以下協議的橫幅檢查:

  • FTP
  • HTTP
  • IMAP4
  • memcached
  • POP3
  • SMTP
  • SSH
  • SSL
  • SMBv1
  • SMBv2
  • Telnet
  • RDP
  • VNC

問題是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.conf

Windows 不響應 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

傳輸速率(重要!!)

這個程序非常快地發出數據包。在 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/16
10.0.0.0/8
172.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 沒有「互斥鎖」。現代互斥體(又名 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 test
bin/masscan --selftest
selftest: 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 上長期慢操作。現代 CPU 已將執行此計算的速度提高了一倍,從而使masscan速度更快。

原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/207490.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
投稿專員的頭像投稿專員
上一篇 2024-12-08 14:33
下一篇 2024-12-08 14:34

相關推薦

發表回復

登錄後才能評論