Kali Linux 網(wǎng)絡(luò)掃描秘籍 第三章 端口掃描(一)

第三章 端口掃描(一)

作者:Justin Hutchens

譯者:飛龍

協(xié)議:CC BY-NC-SA 4.0

3.1 UDP端口掃描

由于 TCP 是更加常用的傳輸層協(xié)議,使用 UDP 的服務(wù)常常被人遺忘。雖然 UDP 服務(wù)本質(zhì)上擁有被忽視的趨勢,這些服務(wù)可以枚舉,用來完全理解任何給定目標的工具面,這相當(dāng)關(guān)鍵。UDP 掃描通常由挑戰(zhàn)性,麻煩,并且消耗時間。這一章的前三個秘籍會涉及如何在 Kali 中使用不同工具執(zhí)行 UDP 掃描。理解 UDP 掃描可以用兩種不同的方式執(zhí)行相當(dāng)重要。一種技巧會在第一個秘籍中強調(diào),它僅僅依賴于 ICMP 端口不可達響應(yīng)。這類型的掃描依賴于任何沒有綁定某個服務(wù)的 UDP 端口都會返回 ICP 端口不可達響應(yīng)的假設(shè)。所以不返回這種響應(yīng)就代表擁有服務(wù)。雖然這種方法在某些情況下十分高效,在主機不生成端口不可達響應(yīng),或者端口不可達響應(yīng)存在速率限制或被防火墻過濾的情況下,它也會返回不精確的結(jié)果。一種替代方式會在第二個和第三個秘籍中講解,是使用服務(wù)特定的探針來嘗試請求響應(yīng),以表明所預(yù)期的服務(wù)運行在目標端口上。這個方法非常高效,也非常消耗時間。

3.2 TCP 掃描

這一章中,會提及幾個不同的 TCP 掃描方式。這些技巧包含隱秘掃描、連接掃描和僵尸掃描。為了理解這些掃描技巧的原理,理解 TCP 如何建立以及維護連接十分重要。TCP 是面向連接的協(xié)議,只有連接在兩個系統(tǒng)之間建立之后,數(shù)據(jù)才可以通過 TCP 傳輸。這個和建立 TCP 連接的過程通常使用三次握手指代。這個內(nèi)容暗指連接過程涉及的三個步驟。下圖展示了這個過程:

TCP SYN 封包從想要建立連接的設(shè)備發(fā)送,并帶有想要連接的設(shè)備端口。如果和接收端口關(guān)聯(lián)的服務(wù)接收了這個連接,它會向請求系統(tǒng)返回 TCP 封包,其中 SYN 和 ACK 位都是激活的。連接僅僅在請求系統(tǒng)發(fā)送 TCP ACK 響應(yīng)的情況下建立。這個三步過程在兩個系統(tǒng)之間建立了 TCP 會話。所有 TCP 端口掃描機制都會執(zhí)行這個過程的不同變種,來識別遠程主機上的活動服務(wù)。

連接掃描和隱秘掃描都非常易于理解。連接掃描會為每個掃描端口建立完整的 TCP 連接。這就是說,對于每個掃描的端口,會完成三次握手。如果連接成功建立,端口可以判斷為打開的。作為替代,隱秘掃描不建立完整的連接。隱秘掃描也指代 SYN 掃描或半開放掃描。對于每個掃描的端口,指向目標端口發(fā)送單個 SYN 封包,所有回復(fù) SYN+ACK 封包的端口假設(shè)為運行活動服務(wù)。由于初始系統(tǒng)沒有發(fā)送最后的 ACK,連接只開啟了左半邊。這用于指代隱秘掃描,是因為日志系統(tǒng)只會記錄建立的鏈接,不會記錄任何這種掃描的痕跡。

這一章要討論的最后一種 TCP 掃描技術(shù)叫做僵尸掃描。僵尸掃描的目的是映射遠程系統(tǒng)上的所有開放端口,而不會產(chǎn)生任何和系統(tǒng)交互過的痕跡。僵尸掃描背后的工作原理十分復(fù)雜。執(zhí)行僵尸掃描過程需要遵循以下步驟:

  1. 將某個遠程系統(tǒng)看做你的僵尸。這個系統(tǒng)應(yīng)該擁有如下特征:

    • 這個系統(tǒng)是限制的,并且和網(wǎng)絡(luò)上其它系統(tǒng)沒有通信。
    • 這個系統(tǒng)使用遞增的 IPID 序列。
  2. 給僵尸主機發(fā)送 SYN+ACK 封包并記錄初始 IPID 值。

  3. 將封包的 IP 源地址偽造成僵尸主機的 IP 地址,并將其發(fā)送給目標系統(tǒng)。

  4. 取決于掃描目標的端口狀態(tài),會發(fā)生下列事情之一:

    • 如果端口開放,掃描目標會向僵尸主機返回 SYN+ACK 封包,它相信僵尸主機發(fā)送了之前的 SYN 請求。這里,僵尸主機會以 RST 封包回復(fù)這個帶路不明的 SYN+ACK 封包,并且將 IPID 值增加 1。
    • 如果端口關(guān)閉,掃描目標會將 RST 響應(yīng)返回給僵尸主機, 它相信僵尸主機發(fā)送了之前的 SYN 請求。如果這個值增加了 1,那么之后掃描目標上的端口關(guān)閉,。如果這個值增加了 2,那么掃描目標的端口開放。
  5. 向僵尸主機發(fā)送另一個 SYN+ACK 封包,并求出所返回的 RST 響應(yīng)中的最后的 IPID 值。如果這個值增加了 1,那么掃描目標上的端口關(guān)閉。如果增加了 2,那么掃描目標上的端口開放。

下面的圖展示了當(dāng)僵尸主機用于掃描開放端口時,所產(chǎn)生的交互。

為了執(zhí)行僵尸掃描,初始的 SYN+SCK 請求應(yīng)該發(fā)給僵尸系統(tǒng)來判斷返回 RST 封包中的當(dāng)前 IPID 值。之后,將偽造的 SYN 封包發(fā)往目標咪表,帶有僵尸主機的源 IP 地址。如果端口開放,掃描目標會將 SYN+ACK 響應(yīng)發(fā)回僵尸主機。由于將是主機并沒有實際發(fā)送之前的 SYN 請求,它會將 SYN+ACK 響應(yīng)看做來路不明,并將 RST 請求發(fā)送回目標主機,因此 IPID 會增加 1。最后,應(yīng)該向僵尸主機發(fā)送另一個 SYN+ACK 封包,這會返回 RST 封包并再次增加 IPID。增加 2 的 IPID 表示所有這些事件都發(fā)生了,目標端口是開放的。反之,如果掃描目標的端口是關(guān)閉的,會發(fā)生一系列不同的事件,這會導(dǎo)致 RST 響應(yīng)的 IPID 僅僅增加 1。

下面的圖展示了當(dāng)僵尸主機用于掃描關(guān)閉端口時,所產(chǎn)生的交互。

如果目標端口關(guān)閉,發(fā)往僵尸系統(tǒng)的 RST 封包是之前偽造的 SYN 封包的響應(yīng)。由于 RST 封包沒有手造恢復(fù),僵尸系統(tǒng)的 IPID 值不會增加。因此,返回給掃描系統(tǒng)的最后的 RST 封包的 IPID 值只會增加 1。這個過程可以對每個想要掃描的端口執(zhí)行,它可以用于映射遠程系統(tǒng)的開放端口,而不需要留下掃描系統(tǒng)執(zhí)行了掃描的痕跡。

3.3 Scapy UDP 掃描

Scapy 可以用于向網(wǎng)絡(luò)構(gòu)造和注入自定義封包。在這個秘籍中,Scapy 會用于掃描活動的 UDP 服務(wù)。這可以通過發(fā)送空的 UDP 封包給目標端口,之后識別沒有回復(fù) ICMP 不可達響應(yīng)的端口來實現(xiàn)。

準備

為了使用 Scapy 執(zhí)行 UDP 掃描,你需要一個運行 UDP 網(wǎng)絡(luò)服務(wù)的遠程服務(wù)器。這個例子中我們使用 Metasploitable2 實例來執(zhí)行任務(wù)。配置 Metasploitable2 的更多信息請參考第一章中的“安裝 Metasploitable2”秘籍。

此外,這一節(jié)也需要編寫腳本的更多信息,請參考第一章中的“使用文本編輯器*VIM 和 Nano)。

操作步驟

使用 Scapy,我們就可以快速理解 UDP 掃描原理背后的底層規(guī)則。為了確認任何給定端口上是否存在 UDP 服務(wù),我們需要讓服務(wù)器產(chǎn)生響應(yīng)。這個證明十分困難,因為許多 UDP 服務(wù)都只回復(fù)服務(wù)特定的請求。任何特定服務(wù)的知識都會使正面識別該服務(wù)變得容易。但是,有一些通常技巧可以用于判斷服務(wù)是否運行于給定的 UDP 端口,并且準確率還不錯。我們將要使用 Scapy 操作的這種技巧是識別關(guān)閉的端口的 ICMP 不可達響應(yīng)。為了向任何給定端口發(fā)送 UDP 請求,我們首先需要構(gòu)建這個請求的一些層面,我們需要構(gòu)建的第一層就是 IP 層。

root@KaliLinux:~# scapy 
Welcome to Scapy (2.2.0) 
>>> i = IP() 
>>> i.display() 
###[ IP ]###  
    version= 4  
    ihl= None  
    tos= 0x0  
    len= None  
    id= 1  
    flags=   
    frag= 0  
    ttl= 64  
    proto= ip  
    chksum= None  
    src= 127.0.0.1  
    dst= 127.0.0.1  
    \options\ 
>>> i.dst = "172.16.36.135" 
>>> i.display()
###[ IP ]###  
    version= 4  
    ihl= None  
    tos= 0x0  
    len= None  
    id= 1
    flags=   
    frag= 0  
    ttl= 64  
    proto= ip  
    chksum= None  
    src= 172.16.36.180  
    dst= 172.16.36.135  
    \options\ 

為了構(gòu)建請求的 IP 層,我們需要將IP對象賦給變量i。通過調(diào)用display函數(shù),我們可以確定對象的屬性配置。通常,發(fā)送和接受地址都設(shè)為回送地址,127.0.0.1。這些值可以通過修改目標地址來修改,也就是設(shè)置i.dst為想要掃描的地址的字符串值。通過再次調(diào)用dislay函數(shù),我們看到不僅僅更新的目標地址,也自動更新了和默認接口相關(guān)的源 IP 地址。現(xiàn)在我們構(gòu)建了請求的 IP 層,我們可以構(gòu)建 UDP 層了。

>>> u = UDP() 
>>> u.display() 
###[ UDP ]###  
    sport= domain  
    dport= domain  
    len= None  
    chksum= None 
>>> u.dport 
53 

為了構(gòu)建請求的 UDP 層,我們使用和 IP 層相同的技巧。在這個立即中,UDP對象賦給了u變量。像之前提到的那樣,默認的配置可以通過調(diào)用display函數(shù)來確定。這里,我們可以看到來源和目標端口的默認值都是domain。你可能已經(jīng)猜到了,它表示和端口 53 相關(guān)的 DNS 服務(wù)。DNS 是個常見服務(wù),通常能在網(wǎng)絡(luò)系統(tǒng)上發(fā)現(xiàn)。為了確認它,我們可以通過引用變量名稱和數(shù)量直接調(diào)用該值。之后,可以通過將屬性設(shè)置為新的目標端口值來修改。

>>> u.dport = 123 
>>> u.display() 
###[ UDP ]###
    sport= domain  
    dport= ntp  
    len= None  
    chksum= None 

在上面的例子中,目標端口設(shè)為123,這是 NTP 的端口。既然我們創(chuàng)建了 IP 和 UDP 層,我們需要通過疊放這些層來構(gòu)造請求。

>>> request = (i/u) 
>>> request.display() 
###[ IP ]###  
    version= 4  
    ihl= None  
    tos= 0x0  
    len= None  
    id= 1  
    flags=   
    frag= 0  
    ttl= 64  
    proto= udp  
    chksum= None  
    src= 172.16.36.180  
    dst= 172.16.36.135  
    \options\ 
###[ UDP ]###     
    sport= domain     
    dport= ntp     
    len= None     
    chksum= None

我們可以通過以斜杠分離變量來疊放 IP 和 UDP 層。這些層面之后賦給了新的變量,它代表整個請求。我們之后可以調(diào)用dispaly函數(shù)來查看請求的配置。一旦構(gòu)建了請求,可以將其傳遞給sr1函數(shù)來分析響應(yīng):

>>> response = sr1(request) 
Begin emission: 
......Finished to send 1 packets. 
....*
Received 11 packets, got 1 answers, remaining 0 packets 
>>> response.display() 
###[ IP ]###  
    version= 4L  
    ihl= 5L  
    tos= 0xc0  
    len= 56  
    id= 63687  
    flags=   
    frag= 0L  
    ttl= 64  
    proto= icmp  
    chksum= 0xdfe1  
    src= 172.16.36.135  
    dst= 172.16.36.180  
    \options\ 
###[ ICMP ]###     
    type= dest-unreach     
    code= port-unreachable     
    chksum= 0x9e72     
    unused= 0 
###[ IP in ICMP ]###        
    version= 4L        
    ihl= 5L        
    tos= 0x0        
    len= 28        
    id= 1        
    flags=         
    frag= 0L        
    ttl= 64        
    proto= udp        
    chksum= 0xd974        
    src= 172.16.36.180        
    dst= 172.16.36.135        
    \options\
###[ UDP in ICMP ]###           
    sport= domain           
    dport= ntp           
    len= 8           
    chksum= 0x5dd2 

相同的請求可以不通過構(gòu)建和堆疊每一層來執(zhí)行。反之,我們使用單獨的一條命令,通過直接調(diào)用函數(shù)并傳遞合適的參數(shù):

>>> sr1(IP(dst="172.16.36.135")/UDP(dport=123)) 
..Begin emission: 
...*Finished to send 1 packets.

Received 6 packets, got 1 answers, remaining 0 packets 
<IP  version=4L ihl=5L tos=0xc0 len=56 id=63689 flags= frag=0L ttl=64 proto=icmp chksum=0xdfdf src=172.16.36.135 dst=172.16.36.180 options=[] |<ICMP  type=dest-unreach code=port-unreachable chksum=0x9e72 unused=0 |<IPerror  version=4L ihl=5L tos=0x0 len=28 id=1 flags= frag=0L ttl=64 proto=udp chksum=0xd974 src=172.16.36.180 dst=172.16.36.135 options=[] |<UDPerror  sport=domain dport=ntp len=8 chksum=0x5dd2 |>>>>

要注意這些請求的響應(yīng)包括 ICMP 封包,它的type表示主機不可達,它的code表示端口不可達。這個響應(yīng)通常在 UDP 端口關(guān)閉時返回。現(xiàn)在,我們應(yīng)該嘗試修改請求,使其發(fā)送到對應(yīng)遠程系統(tǒng)上的真正服務(wù)的目標端口。為了實現(xiàn)它,我們將目標端口修改會53,之后再次發(fā)送請求,像這樣:

>>> response = sr1(IP(dst="172.16.36.135")/UDP(dport=53),timeout=1,verbo se=1) 
Begin emission: 
Finished to send 1 packets.

Received 8 packets, got 0 answers, remaining 1 packets

當(dāng)相同請求發(fā)送到真正的服務(wù)時,沒有收到回復(fù)。這是因為 DNS 服務(wù)運行在系統(tǒng)的 UDP 端口 53 上,僅僅響應(yīng)服務(wù)特定的請求。這一差異可以用于掃描 ICMP 不可達響應(yīng),我們可以通過掃描無響應(yīng)的端口來確定潛在的服務(wù):

#!/usr/bin/python

import logging
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)

from scapy.all import * 
import time 
import sys

if len(sys.argv) != 4:   
    print "Usage - ./udp_scan.py [Target-IP] [First Port] [Last Port]"   
    print "Example - ./udp_scan.py 10.0.0.5 1 100"   
    print "Example will UDP port scan ports 1 through 100 on 10.0.0.5" 
sys.exit()

ip = sys.argv[1] 
start = int(sys.argv[2]) 
end = int(sys.argv[3])

for port in range(start,end):   
    ans = sr1(IP(dst=ip)/UDP(dport=port),timeout=5,verbose=0)   
    time.sleep(1)   
    if ans == None:      
        print port   
    else:      
        pass 

上面的 Python 腳本向序列中前一百個端口中的每個端口發(fā)送 UDP 請求。這里沒有接受到任何響應(yīng),端口可以認為是開放的。通過運行這個腳本,我們可以識別所有不返回 ICMP 不可達響應(yīng)的端口:

root@KaliLinux:~# chmod 777 udp_scan.py 
root@KaliLinux:~# ./udp_scan.py 
Usage - ./udp_scan.py [Target-IP] [First Port] [Last Port] 
Example - ./udp_scan.py 10.0.0.5 1 100 
Example will UDP port scan ports 1 through 100 on 10.0.0.5 
root@KaliLinux:~ # ./udp_scan.py 172.16.36.135 1 100 
53 
68 
69

超時為5秒用于接受受到 ICMP 不可達速率限制的響應(yīng)。即使擁有了更大的響應(yīng)接收窗口,這種方式的掃描仍然有時不可靠。這就是 UDP 探測掃描是更加高效的替代方案的原因。

工作原理

這個秘籍中,UDP 掃描通過識別不回復(fù) ICMP 端口不可達響應(yīng)的端口來識別。這個過程非常耗費時間,因為 ICMP 端口不可達響應(yīng)通常有速率限制。有時候,對于不生成這種響應(yīng)的系統(tǒng),這種方式會不可靠,并且 ICMP 通常會被防火墻過濾。替代方式就是使用服務(wù)特定的探針來請求正面的響應(yīng)。這個技巧會在下面的兩個秘籍中展示。

3.4 Nmap UDP 掃描

Nmap 擁有可以執(zhí)行遠程系統(tǒng)上的 UDP 掃描的選項。Nmap 的 UDP 掃描方式更加復(fù)雜,它通過注入服務(wù)特定的譚澤請求,來請求正面的響應(yīng),用于確認指定服務(wù)的存在,來識別活動服務(wù)。這個秘籍演示了如何使用 Nmap UDP 掃描來掃描單一端口,多個端口,甚至多個系統(tǒng)。

準備

為了使用 Nmap 執(zhí)行 UDP 掃描,你需要一個運行 UDP 網(wǎng)絡(luò)服務(wù)的遠程服務(wù)器。這個例子中我們使用 Metasploitable2 實例來執(zhí)行任務(wù)。配置 Metasploitable2 的更多信息請參考第一章中的“安裝 Metasploitable2”秘籍。

操作步驟

UDP 掃描通常由挑戰(zhàn)性,消耗時間,非常麻煩。許多系統(tǒng)會限制 ICMp 主機不可達響應(yīng),并且增加掃描大量端口或系統(tǒng)所需的時間總數(shù)。幸運的是,Nmap 的開發(fā)者擁有更加復(fù)雜和高效的工具來識別遠程系統(tǒng)上的 UDP 服務(wù)。為了使用 Nmap 執(zhí)行 UDP 掃描,需要使用-sU選項,并帶上需要掃描的主機 IP 地址。

root@KaliLinux:~# nmap -sU 172.16.36.135

Starting Nmap 6.25 ( http://nmap.org ) at 2013-12-17 21:04 EST
Nmap scan report for 172.16.36.135 
Host is up (0.0016s latency). 
Not shown: 993 closed ports 
PORT     STATE         SERVICE 
53/udp   open          domain
68/udp   open|filtered dhcpc 
69/udp   open|filtered tftp 
111/udp  open          rpcbind 
137/udp  open          netbios-ns 
138/udp  open|filtered netbios-dgm 
2049/udp open          nfs 
MAC Address: 00:0C:29:3D:84:32 (VMware)

Nmap done: 1 IP address (1 host up) scanned in 1043.91 seconds

雖然 Nmap 使用針對多種服務(wù)的自定義載荷來請求 UDP 端口的響應(yīng)。在沒有使用其它參數(shù)來指定目標端口時,它仍舊需要大量時間來掃描默認的 1000 個端口。你可以從掃描元數(shù)據(jù)中看到,默認的掃描需要將近 20 分鐘來完成。作為替代,我們可以縮短所需的掃描時間,通過使用下列名Ingles執(zhí)行針對性掃描:

root@KaliLinux:~# nmap 172.16.36.135 -sU -p 53


Starting Nmap 6.25 ( http://nmap.org ) at 2013-12-17 21:05 EST 
Nmap scan report for 172.16.36.135 
Host is up (0.0010s latency). 
PORT   STATE SERVICE 53/udp open  
domain MAC Address: 00:0C:29:3D:84:32 (VMware)

Nmap done: 1 IP address (1 host up) scanned in 13.09 seconds 

如果我們指定了需要掃描的特定端口,執(zhí)行 UDP 掃描所需的的時間總量可以極大江少。這可以通過執(zhí)行 UDP 掃描并且使用-p選項指定端口來實現(xiàn)。在下面的例子中,我們僅僅在53端口上執(zhí)行掃描,來嘗試識別 DNS 服務(wù)。也可以在多個指定的端口上指定掃描,像這樣:

root@KaliLinux:~# nmap 172.16.36.135 -sU -p 1-100

Starting Nmap 6.25 ( http://nmap.org ) at 2013-12-17 21:06 EST 
Nmap scan report for 172.16.36.135 
Host is up (0.00054s latency). 
Not shown: 85 open|filtered ports
PORT   STATE  SERVICE 
8/udp  closed unknown 
15/udp closed unknown 
28/udp closed unknown 
37/udp closed time 
45/udp closed mpm 
49/udp closed tacacs 
53/udp open   domain 
56/udp closed xns-auth 
70/udp closed gopher 
71/udp closed netrjs-1 
74/udp closed netrjs-4 
89/udp closed su-mit-tg 
90/udp closed dnsix 
95/udp closed supdup 
96/udp closed dixie 
MAC Address: 00:0C:29:3D:84:32 (VMware)

Nmap done: 1 IP address (1 host up) scanned in 23.56 seconds 

在這個例子中,掃描在前 100 個端口上執(zhí)行。這通過使用破折號符號,并指定要掃描的第一個和最后一個端口來完成。Nmap 之后啟動多個進程,會同時掃描這兩個值之間的多有端口。在一些情況下,UDP 分析需要在多個系統(tǒng)上執(zhí)行。可以使用破折號符號,并且定義最后一個 IP 段的值的范圍,來掃描范圍內(nèi)的主機。

root@KaliLinux:~# nmap 172.16.36.0-255 -sU -p 53

Starting Nmap 6.25 ( http://nmap.org ) at 2013-12-17 21:08 EST 
Nmap scan report for 172.16.36.1 
Host is up (0.00020s latency). 
PORT   STATE  SERVICE 
53/udp closed domain 
MAC Address: 00:50:56:C0:00:08 (VMware)

Nmap scan report for 172.16.36.2 
Host is up (0.039s latency).
PORT   STATE  SERVICE 
53/udp closed domain 
MAC Address: 00:50:56:FF:2A:8E (VMware)

Nmap scan report for 172.16.36.132 
Host is up (0.00065s latency). 
PORT   STATE  SERVICE 
53/udp closed domain 
MAC Address: 00:0C:29:65:FC:D2 (VMware)

Nmap scan report for 172.16.36.135 
Host is up (0.00028s latency). 
PORT   STATE SERVICE 
53/udp open  domain 
MAC Address: 00:0C:29:3D:84:32 (VMware)

Nmap done: 256 IP addresses (6 hosts up) scanned in 42.81 seconds

這個例子中,掃描對172.16.36.0/24中所有活動主機執(zhí)行。每個主機都被掃描來識別是否在 53 端口上運行了 DNS 服務(wù)。另一個用于掃描多個主機替代選項,就是使用 IP 地址輸入列表。為了這樣做,使用-iL選項,并且應(yīng)該傳入相同目錄下的文件名稱,或者單獨目錄下的完成文件路徑。前者的例子如下:

root@KaliLinux:~# nmap -iL iplist.txt -sU -p 123

Starting Nmap 6.25 ( http://nmap.org ) at 2013-12-17 21:16 EST 
Nmap scan report for 172.16.36.1 
Host is up (0.00017s latency). 
PORT    STATE SERVICE 
123/udp open  ntp 
MAC Address: 00:50:56:C0:00:08 (VMware)

Nmap scan report for 172.16.36.2 
Host is up (0.00025s latency). 
PORT    STATE         SERVICE 
123/udp open|filtered ntp
MAC Address: 00:50:56:FF:2A:8E (VMware)

Nmap scan report for 172.16.36.132 
Host is up (0.00040s latency). 
PORT    STATE  SERVICE 
123/udp closed ntp 
MAC Address: 00:0C:29:65:FC:D2 (VMware)

Nmap scan report for 172.16.36.135 
Host is up (0.00031s latency). 
PORT    STATE  SERVICE 
123/udp closed ntp 
MAC Address: 00:0C:29:3D:84:32 (VMware)

Nmap done: 4 IP addresses (4 hosts up) scanned in 13.27 seconds

這個例子中,執(zhí)行了掃描來判斷 NTP 服務(wù)是否運行在當(dāng)前執(zhí)行目錄中的iplist.txt文件內(nèi)的任何系統(tǒng)的 123 端口上。

工作原理

雖然 Nmap 仍然含有許多和 UDP 掃描相關(guān)的相同挑戰(zhàn),它仍舊是個極其高效的解決方案,因為它使用最高效和快速的技巧組合來識別活動服務(wù)。

3.5 Metasploit UDP 掃描

Metasploit 擁有一個輔助模塊,可以用于掃描特定的常用 UDP 端口。這個秘籍展示了如何使用這個輔助模塊來掃描運行 UDP 服務(wù)的單個系統(tǒng)或多個系統(tǒng)。

準備

為了使用 Metasploit 執(zhí)行 UDP 掃描,你需要一個運行 UDP 網(wǎng)絡(luò)服務(wù)的遠程服務(wù)器。這個例子中我們使用 Metasploitable2 實例來執(zhí)行任務(wù)。配置 Metasploitable2 的更多信息請參考第一章中的“安裝 Metasploitable2”秘籍。

操作步驟

在定義所運行的模塊之前,需要打開 Metasploit。為了在 Kali 中打開它,我們在終端會話中執(zhí)行msfconsole命令。

root@KaliLinux:~# msfconsole 
# cowsay++
 ____________
 < metasploit >
 -----------
        \   ,__,       
         \  (oo)____           
            (__)    )\           
               ||--|| *

Large pentest? List, sort, group, tag and search your hosts and services in Metasploit Pro -- type 'go_pro' to launch it now.
       
       =[ metasploit v4.6.0-dev [core:4.6 api:1.0] 
+ -- --=[ 1053 exploits - 590 auxiliary - 174 post 
+ -- --=[ 275 payloads - 28 encoders - 8 nops

msf > use auxiliary/scanner/discovery/udp_sweep 
msf  auxiliary(udp_sweep) > show options

Module options (auxiliary/scanner/discovery/udp_sweep):
   
    Name       Current Setting  Required  Description   
    ----       ---------------  --------  ----------   
    BATCHSIZE  256              yes       The number of hosts to probe in each set   
    CHOST                       no        The local client address   
    RHOSTS                      yes       The target address range or CIDR identifier   
    THREADS    1                yes       The number of concurrent threads

為了在 Metasploit 中運行 UDP 掃描模塊,我們以模塊的相對路徑調(diào)用use命令。一旦選擇了模塊,可以使用show options命令來確認或更改掃描配置。這個命令會展示四個列的表格,包括namecurrent settingsrequireddescriptionname列標出了每個可配置變量的名稱。current settings列列出了任何給定變量的現(xiàn)有配置。required列標出對于任何給定變量,值是否是必須的。description列描述了每個變量的功能。任何給定變量的值可以使用set命令,并且將新的值作為參數(shù)來修改。

msf  auxiliary(udp_sweep) > set RHOSTS 172.16.36.135 
RHOSTS => 172.16.36.135 
msf  auxiliary(udp_sweep) > set THREADS 20 
THREADS => 20 
msf  auxiliary(udp_sweep) > show options

Module options (auxiliary/scanner/discovery/udp_sweep):

    Name       Current Setting  Required  Description   
    ----       ---------------  --------  ----------   
    BATCHSIZE  256              yes       The number of hosts to probe in each set   
    CHOST                       no        The local client address   
    RHOSTS     172.16.36.135    yes       The target address range or CIDR identifier   
    THREADS    20               yes       The number of concurrent threads

在上面的例子中,RHOSTS值修改為我們打算掃描的遠程系統(tǒng)的 IP 地址。地外,線程數(shù)量修改為 20。THREADS的值定位了在后臺執(zhí)行的當(dāng)前任務(wù)數(shù)量。確定線程數(shù)量涉及到尋找一個平衡,既能提升任務(wù)速度,又不會過度消耗系統(tǒng)資源。對于多數(shù)系統(tǒng),20 個線程可以足夠快,并且相當(dāng)合理。修改了必要的變量之后,可以再次使用show options命令來驗證。一旦所需配置驗證完畢,就可以執(zhí)行掃描了。

msf  auxiliary(udp_sweep) > run

[*] Sending 12 probes to 172.16.36.135->172.16.36.135 (1 hosts) 
[*] Discovered Portmap on 172.16.36.135:111 (100000 v2 TCP(111), 100000 v2 UDP(111), 100024 v1 UDP(36429), 100024 v1 TCP(56375), 100003 v2 UDP(2049), 100003 v3 UDP(2049), 100003 v4 UDP(2049), 100021 v1 UDP(34241), 100021 v3 UDP(34241), 100021 v4 UDP(34241), 100003 v2 TCP(2049), 100003 v3 TCP(2049), 100003 v4 TCP(2049), 100021 v1 TCP(50333), 100021 v3 TCP(50333), 100021 v4 TCP(50333), 100005 v1 UDP(47083), 100005 v1 TCP(57385), 100005 v2 UDP(47083), 100005 v2 TCP(57385), 100005 v3 UDP(47083), 100005 v3 TCP(57385)) 
[*] Discovered NetBIOS on 172.16.36.135:137 (METASPLOITABLE:<00>:U :METASPLOITABLE:<03>:U :METASPLOITABLE:<20>:U :__MSBROWSE__:<01>:G :WORKGROUP:<00>:G :WORKGROUP:<1d>:U :WORKGROUP:<1e>:G :00:00:00:00:00:00) 
[*] Discovered DNS on 172.16.36.135:53 (BIND 9.4.2) 
[*] Scanned 1 of 1 hosts (100% complete) 
[*] Auxiliary module execution completed

Metasploit 中所使用的run命令用于執(zhí)行所選的輔助模塊。在上面的例子中,run命令對指定的 IP 地址執(zhí)行 UDP 掃描。udp_sweep模塊也可以使用破折號符號,對地址序列執(zhí)行掃描。

msf  auxiliary(udp_sweep) > set RHOSTS 172.16.36.1-10 
RHOSTS => 172.16.36.1-10 
msf  auxiliary(udp_sweep) > show options

Module options (auxiliary/scanner/discovery/udp_sweep):

    Name       Current Setting  Required  Description   
    ----       ---------------  --------  ----------   
    BATCHSIZE  256              yes       The number of hosts to probe in each set   
    CHOST                       no        The local client address   
    RHOSTS     172.16.36.1-10   yes       The target address range or CIDR identifier   
    THREADS    20               yes       The number of concurrent threads

msf  auxiliary(udp_sweep) > run

[*] Sending 12 probes to 172.16.36.1->172.16.36.10 (10 hosts) 
[*] Discovered NetBIOS on 172.16.36.1:137 (MACBOOKPRO-3E0F:<00>:U :00:50:56:c0:00:08) 
[*] Discovered NTP on 172.16.36.1:123 (NTP v4 (unsynchronized)) 
[*] Discovered DNS on 172.16.36.2:53 (BIND 9.3.6-P1-RedHat-9.3.6-20. P1.el5_8.6)
[*] Scanned 10 of 10 hosts (100% complete) 
[*] Auxiliary module execution completed

在上面的例子中,UDP 掃描對 10 個主機地址執(zhí)行,它們由RHOSTS變量指定。與之相似,RHOSTS可以使用CIDR記法來定義網(wǎng)絡(luò)范圍,像這樣:

msf  auxiliary(udp_sweep) > set RHOSTS 172.16.36.0/24 
RHOSTS => 172.16.36.0/24 
msf  auxiliary(udp_sweep) > show options

Module options (auxiliary/scanner/discovery/udp_sweep):

   Name       Current Setting  Required  Description   
   ----       ---------------  --------  ----------   
   BATCHSIZE  256              yes       The number of hosts to probe in each set   
   CHOST                       no        The local client address   
   RHOSTS     172.16.36.0/24   yes       The target address range or CIDR identifier   
   THREADS    20               yes       The number of concurrent threads

msf  auxiliary(udp_sweep) > run

[*] Sending 12 probes to 172.16.36.0->172.16.36.255 (256 hosts) 
[*] Discovered Portmap on 172.16.36.135:111 (100000 v2 TCP(111), 100000 v2 UDP(111), 100024 v1 UDP(36429), 100024 v1 TCP(56375), 100003 v2 UDP(2049), 100003 v3 UDP(2049), 100003 v4 UDP(2049), 100021 v1 UDP(34241), 100021 v3 UDP(34241), 100021 v4 UDP(34241), 100003 v2 TCP(2049), 100003 v3 TCP(2049), 100003 v4 TCP(2049), 100021 v1 TCP(50333), 100021 v3 TCP(50333), 100021 v4 TCP(50333), 100005 v1 UDP(47083), 100005 v1 TCP(57385), 100005 v2 UDP(47083), 100005 v2 TCP(57385), 100005 v3 UDP(47083), 100005 v3 TCP(57385)) 
[*] Discovered NetBIOS on 172.16.36.135:137 (METASPLOITABLE:<00>:U :METASPLOITABLE:<03>:U :METASPLOITABLE:<20>:U :__MSBROWSE__:<01>:G :WORKGROUP:<00>:G :WORKGROUP:<1d>:U :WORKGROUP:<1e>:G :00:00:00:00:00:00) 
[*] Discovered NTP on 172.16.36.1:123 (NTP v4 (unsynchronized)) 
[*] Discovered NetBIOS on 172.16.36.1:137 (MACBOOKPRO-3E0F:<00>:U :00:50:56:c0:00:08) [*] Discovered DNS on 172.16.36.0:53 (BIND 9.3.6-P1-RedHat-9.3.6-20. P1.el5_8.6)

[*] Discovered DNS on 172.16.36.2:53 (BIND 9.3.6-P1-RedHat-9.3.6-20. P1.el5_8.6) 
[*] Discovered DNS on 172.16.36.135:53 (BIND 9.4.2) 
[*] Discovered DNS on 172.16.36.255:53 (BIND 9.3.6-P1-RedHat-9.3.6-20. P1.el5_8.6) 
[*] Scanned 256 of 256 hosts (100% complete) 
[*] Auxiliary module execution completed

工作原理

Metasploit 輔助模塊中的 UDP 掃描比起 Nmap 更加簡單。它僅僅針對有限的服務(wù)數(shù)量,但是在識別端口上的活動服務(wù)方面更加高效,并且比其它可用的 UDP 掃描器更快。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,030評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,310評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,951評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,796評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 71,566評論 6 407
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,055評論 1 322
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,142評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,303評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,799評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,683評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,899評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,409評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,135評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,520評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,757評論 1 282
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,528評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 47,844評論 2 372

推薦閱讀更多精彩內(nèi)容