第三章 端口掃描(一)
作者: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í)行僵尸掃描過程需要遵循以下步驟:
-
將某個遠程系統(tǒng)看做你的僵尸。這個系統(tǒng)應(yīng)該擁有如下特征:
- 這個系統(tǒng)是限制的,并且和網(wǎng)絡(luò)上其它系統(tǒng)沒有通信。
- 這個系統(tǒng)使用遞增的 IPID 序列。
給僵尸主機發(fā)送 SYN+ACK 封包并記錄初始 IPID 值。
將封包的 IP 源地址偽造成僵尸主機的 IP 地址,并將其發(fā)送給目標系統(tǒng)。
-
取決于掃描目標的端口狀態(tài),會發(fā)生下列事情之一:
- 如果端口開放,掃描目標會向僵尸主機返回 SYN+ACK 封包,它相信僵尸主機發(fā)送了之前的 SYN 請求。這里,僵尸主機會以 RST 封包回復(fù)這個帶路不明的 SYN+ACK 封包,并且將 IPID 值增加 1。
- 如果端口關(guān)閉,掃描目標會將 RST 響應(yīng)返回給僵尸主機, 它相信僵尸主機發(fā)送了之前的 SYN 請求。如果這個值增加了 1,那么之后掃描目標上的端口關(guān)閉,。如果這個值增加了 2,那么掃描目標的端口開放。
向僵尸主機發(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
命令來確認或更改掃描配置。這個命令會展示四個列的表格,包括name
、current settings
、required
和description
。name
列標出了每個可配置變量的名稱。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 掃描器更快。