第三章 端口掃描(一)
作者:Justin Hutchens
譯者:飛龍
協(xié)議:CC BY-NC-SA 4.0
3.1 UDP端口掃描
由于 TCP 是更加常用的傳輸層協(xié)議崭添,使用 UDP 的服務(wù)常常被人遺忘要糊。雖然 UDP 服務(wù)本質(zhì)上擁有被忽視的趨勢童社,這些服務(wù)可以枚舉拱雏,用來完全理解任何給定目標(biāo)的工具面隅要,這相當(dāng)關(guān)鍵昧识。UDP 掃描通常由挑戰(zhàn)性疮丛,麻煩轰传,并且消耗時間驴党。這一章的前三個秘籍會涉及如何在 Kali 中使用不同工具執(zhí)行 UDP 掃描。理解 UDP 掃描可以用兩種不同的方式執(zhí)行相當(dāng)重要获茬。一種技巧會在第一個秘籍中強(qiáng)調(diào)港庄,它僅僅依賴于 ICMP 端口不可達(dá)響應(yīng)。這類型的掃描依賴于任何沒有綁定某個服務(wù)的 UDP 端口都會返回 ICP 端口不可達(dá)響應(yīng)的假設(shè)恕曲。所以不返回這種響應(yīng)就代表擁有服務(wù)鹏氧。雖然這種方法在某些情況下十分高效,在主機(jī)不生成端口不可達(dá)響應(yīng)佩谣,或者端口不可達(dá)響應(yīng)存在速率限制或被防火墻過濾的情況下把还,它也會返回不精確的結(jié)果。一種替代方式會在第二個和第三個秘籍中講解茸俭,是使用服務(wù)特定的探針來嘗試請求響應(yīng)吊履,以表明所預(yù)期的服務(wù)運行在目標(biāo)端口上。這個方法非常高效调鬓,也非常消耗時間艇炎。
3.2 TCP 掃描
這一章中,會提及幾個不同的 TCP 掃描方式腾窝。這些技巧包含隱秘掃描缀踪、連接掃描和僵尸掃描。為了理解這些掃描技巧的原理虹脯,理解 TCP 如何建立以及維護(hù)連接十分重要驴娃。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 端口掃描機(jī)制都會執(zhí)行這個過程的不同變種,來識別遠(yuǎn)程主機(jī)上的活動服務(wù)查吊。
連接掃描和隱秘掃描都非常易于理解谐区。連接掃描會為每個掃描端口建立完整的 TCP 連接。這就是說逻卖,對于每個掃描的端口宋列,會完成三次握手。如果連接成功建立评也,端口可以判斷為打開的炼杖。作為替代,隱秘掃描不建立完整的連接盗迟。隱秘掃描也指代 SYN 掃描或半開放掃描坤邪。對于每個掃描的端口,指向目標(biāo)端口發(fā)送單個 SYN 封包罚缕,所有回復(fù) SYN+ACK 封包的端口假設(shè)為運行活動服務(wù)艇纺。由于初始系統(tǒng)沒有發(fā)送最后的 ACK,連接只開啟了左半邊怕磨。這用于指代隱秘掃描喂饥,是因為日志系統(tǒng)只會記錄建立的鏈接,不會記錄任何這種掃描的痕跡肠鲫。
這一章要討論的最后一種 TCP 掃描技術(shù)叫做僵尸掃描员帮。僵尸掃描的目的是映射遠(yuǎn)程系統(tǒng)上的所有開放端口,而不會產(chǎn)生任何和系統(tǒng)交互過的痕跡导饲。僵尸掃描背后的工作原理十分復(fù)雜捞高。執(zhí)行僵尸掃描過程需要遵循以下步驟:
-
將某個遠(yuǎn)程系統(tǒng)看做你的僵尸。這個系統(tǒng)應(yīng)該擁有如下特征:
- 這個系統(tǒng)是限制的渣锦,并且和網(wǎng)絡(luò)上其它系統(tǒng)沒有通信硝岗。
- 這個系統(tǒng)使用遞增的 IPID 序列。
給僵尸主機(jī)發(fā)送 SYN+ACK 封包并記錄初始 IPID 值袋毙。
將封包的 IP 源地址偽造成僵尸主機(jī)的 IP 地址型檀,并將其發(fā)送給目標(biāo)系統(tǒng)。
-
取決于掃描目標(biāo)的端口狀態(tài)听盖,會發(fā)生下列事情之一:
- 如果端口開放胀溺,掃描目標(biāo)會向僵尸主機(jī)返回 SYN+ACK 封包裂七,它相信僵尸主機(jī)發(fā)送了之前的 SYN 請求。這里仓坞,僵尸主機(jī)會以 RST 封包回復(fù)這個帶路不明的 SYN+ACK 封包背零,并且將 IPID 值增加 1。
- 如果端口關(guān)閉无埃,掃描目標(biāo)會將 RST 響應(yīng)返回給僵尸主機(jī)徙瓶, 它相信僵尸主機(jī)發(fā)送了之前的 SYN 請求。如果這個值增加了 1嫉称,那么之后掃描目標(biāo)上的端口關(guān)閉侦镇,。如果這個值增加了 2澎埠,那么掃描目標(biāo)的端口開放虽缕。
向僵尸主機(jī)發(fā)送另一個 SYN+ACK 封包,并求出所返回的 RST 響應(yīng)中的最后的 IPID 值蒲稳。如果這個值增加了 1氮趋,那么掃描目標(biāo)上的端口關(guān)閉。如果增加了 2江耀,那么掃描目標(biāo)上的端口開放剩胁。
下面的圖展示了當(dāng)僵尸主機(jī)用于掃描開放端口時,所產(chǎn)生的交互祥国。
為了執(zhí)行僵尸掃描昵观,初始的 SYN+SCK 請求應(yīng)該發(fā)給僵尸系統(tǒng)來判斷返回 RST 封包中的當(dāng)前 IPID 值。之后舌稀,將偽造的 SYN 封包發(fā)往目標(biāo)咪表啊犬,帶有僵尸主機(jī)的源 IP 地址。如果端口開放壁查,掃描目標(biāo)會將 SYN+ACK 響應(yīng)發(fā)回僵尸主機(jī)觉至。由于將是主機(jī)并沒有實際發(fā)送之前的 SYN 請求,它會將 SYN+ACK 響應(yīng)看做來路不明睡腿,并將 RST 請求發(fā)送回目標(biāo)主機(jī)语御,因此 IPID 會增加 1。最后席怪,應(yīng)該向僵尸主機(jī)發(fā)送另一個 SYN+ACK 封包应闯,這會返回 RST 封包并再次增加 IPID。增加 2 的 IPID 表示所有這些事件都發(fā)生了挂捻,目標(biāo)端口是開放的碉纺。反之,如果掃描目標(biāo)的端口是關(guān)閉的,會發(fā)生一系列不同的事件骨田,這會導(dǎo)致 RST 響應(yīng)的 IPID 僅僅增加 1唬涧。
下面的圖展示了當(dāng)僵尸主機(jī)用于掃描關(guān)閉端口時,所產(chǎn)生的交互盛撑。
如果目標(biāo)端口關(guān)閉,發(fā)往僵尸系統(tǒng)的 RST 封包是之前偽造的 SYN 封包的響應(yīng)捧搞。由于 RST 封包沒有手造恢復(fù)抵卫,僵尸系統(tǒng)的 IPID 值不會增加。因此胎撇,返回給掃描系統(tǒng)的最后的 RST 封包的 IPID 值只會增加 1介粘。這個過程可以對每個想要掃描的端口執(zhí)行,它可以用于映射遠(yuǎn)程系統(tǒng)的開放端口晚树,而不需要留下掃描系統(tǒng)執(zhí)行了掃描的痕跡姻采。
3.3 Scapy UDP 掃描
Scapy 可以用于向網(wǎng)絡(luò)構(gòu)造和注入自定義封包。在這個秘籍中爵憎,Scapy 會用于掃描活動的 UDP 服務(wù)慨亲。這可以通過發(fā)送空的 UDP 封包給目標(biāo)端口,之后識別沒有回復(fù) ICMP 不可達(dá)響應(yīng)的端口來實現(xiàn)宝鼓。
準(zhǔn)備
為了使用 Scapy 執(zhí)行 UDP 掃描刑棵,你需要一個運行 UDP 網(wǎng)絡(luò)服務(wù)的遠(yuǎn)程服務(wù)器。這個例子中我們使用 Metasploitable2 實例來執(zhí)行任務(wù)愚铡。配置 Metasploitable2 的更多信息請參考第一章中的“安裝 Metasploitable2”秘籍蛉签。
此外,這一節(jié)也需要編寫腳本的更多信息沥寥,請參考第一章中的“使用文本編輯器*VIM 和 Nano)碍舍。
操作步驟
使用 Scapy,我們就可以快速理解 UDP 掃描原理背后的底層規(guī)則邑雅。為了確認(rèn)任何給定端口上是否存在 UDP 服務(wù)片橡,我們需要讓服務(wù)器產(chǎn)生響應(yīng)。這個證明十分困難蒂阱,因為許多 UDP 服務(wù)都只回復(fù)服務(wù)特定的請求锻全。任何特定服務(wù)的知識都會使正面識別該服務(wù)變得容易。但是录煤,有一些通常技巧可以用于判斷服務(wù)是否運行于給定的 UDP 端口鳄厌,并且準(zhǔn)確率還不錯。我們將要使用 Scapy 操作的這種技巧是識別關(guān)閉的端口的 ICMP 不可達(dá)響應(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
伶氢。這些值可以通過修改目標(biāo)地址來修改趟径,也就是設(shè)置i.dst
為想要掃描的地址的字符串值。通過再次調(diào)用dislay
函數(shù)癣防,我們看到不僅僅更新的目標(biāo)地址蜗巧,也自動更新了和默認(rèn)接口相關(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
變量。像之前提到的那樣挫鸽,默認(rèn)的配置可以通過調(diào)用display
函數(shù)來確定靠娱。這里,我們可以看到來源和目標(biāo)端口的默認(rèn)值都是domain
掠兄。你可能已經(jīng)猜到了像云,它表示和端口 53 相關(guān)的 DNS 服務(wù)。DNS 是個常見服務(wù)蚂夕,通常能在網(wǎng)絡(luò)系統(tǒng)上發(fā)現(xiàn)迅诬。為了確認(rèn)它,我們可以通過引用變量名稱和數(shù)量直接調(diào)用該值婿牍。之后侈贷,可以通過將屬性設(shè)置為新的目標(biāo)端口值來修改。
>>> u.dport = 123
>>> u.display()
###[ UDP ]###
sport= domain
dport= ntp
len= None
chksum= None
在上面的例子中等脂,目標(biāo)端口設(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
表示主機(jī)不可達(dá)继蜡,它的code
表示端口不可達(dá)。這個響應(yīng)通常在 UDP 端口關(guān)閉時返回」渫龋現(xiàn)在壹瘟,我們應(yīng)該嘗試修改請求,使其發(fā)送到對應(yīng)遠(yuǎn)程系統(tǒng)上的真正服務(wù)的目標(biāo)端口鳄逾。為了實現(xiàn)它,我們將目標(biāo)端口修改會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 不可達(dá)響應(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),端口可以認(rèn)為是開放的苦锨。通過運行這個腳本逼泣,我們可以識別所有不返回 ICMP 不可達(dá)響應(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 不可達(dá)速率限制的響應(yīng)。即使擁有了更大的響應(yīng)接收窗口舟舒,這種方式的掃描仍然有時不可靠拉庶。這就是 UDP 探測掃描是更加高效的替代方案的原因。
工作原理
這個秘籍中秃励,UDP 掃描通過識別不回復(fù) ICMP 端口不可達(dá)響應(yīng)的端口來識別氏仗。這個過程非常耗費時間,因為 ICMP 端口不可達(dá)響應(yīng)通常有速率限制夺鲜。有時候皆尔,對于不生成這種響應(yīng)的系統(tǒng),這種方式會不可靠币励,并且 ICMP 通常會被防火墻過濾慷蠕。替代方式就是使用服務(wù)特定的探針來請求正面的響應(yīng)。這個技巧會在下面的兩個秘籍中展示食呻。
3.4 Nmap UDP 掃描
Nmap 擁有可以執(zhí)行遠(yuǎn)程系統(tǒng)上的 UDP 掃描的選項。Nmap 的 UDP 掃描方式更加復(fù)雜浪感,它通過注入服務(wù)特定的譚澤請求影兽,來請求正面的響應(yīng),用于確認(rèn)指定服務(wù)的存在讹开,來識別活動服務(wù)旦万。這個秘籍演示了如何使用 Nmap UDP 掃描來掃描單一端口镶蹋,多個端口贺归,甚至多個系統(tǒng)。
準(zhǔn)備
為了使用 Nmap 執(zhí)行 UDP 掃描秋冰,你需要一個運行 UDP 網(wǎng)絡(luò)服務(wù)的遠(yuǎn)程服務(wù)器婶熬。這個例子中我們使用 Metasploitable2 實例來執(zhí)行任務(wù)赵颅。配置 Metasploitable2 的更多信息請參考第一章中的“安裝 Metasploitable2”秘籍。
操作步驟
UDP 掃描通常由挑戰(zhàn)性洲赵,消耗時間叠萍,非常麻煩绪商。許多系統(tǒng)會限制 ICMp 主機(jī)不可達(dá)響應(yīng)格郁,并且增加掃描大量端口或系統(tǒng)所需的時間總數(shù)独悴。幸運的是刻炒,Nmap 的開發(fā)者擁有更加復(fù)雜和高效的工具來識別遠(yuǎn)程系統(tǒng)上的 UDP 服務(wù)自沧。為了使用 Nmap 執(zhí)行 UDP 掃描拇厢,需要使用-sU
選項,并帶上需要掃描的主機(jī) 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ù)來指定目標(biāo)端口時,它仍舊需要大量時間來掃描默認(rèn)的 1000 個端口废赞。你可以從掃描元數(shù)據(jù)中看到唉地,默認(rèn)的掃描需要將近 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 之后啟動多個進(jìn)程,會同時掃描這兩個值之間的多有端口誉碴。在一些情況下黔帕,UDP 分析需要在多個系統(tǒng)上執(zhí)行成黄】可以使用破折號符號弧腥,并且定義最后一個 IP 段的值的范圍管搪,來掃描范圍內(nèi)的主機(jī)。
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
中所有活動主機(jī)執(zhí)行景埃。每個主機(jī)都被掃描來識別是否在 53 端口上運行了 DNS 服務(wù)谷徙。另一個用于掃描多個主機(jī)替代選項完慧,就是使用 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)槽奕。
準(zhǔn)備
為了使用 Metasploit 執(zhí)行 UDP 掃描粤攒,你需要一個運行 UDP 網(wǎng)絡(luò)服務(wù)的遠(yuǎn)程服務(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
命令來確認(rèn)或更改掃描配置京办。這個命令會展示四個列的表格惭婿,包括name
财饥、current settings
沾瓦、required
和description
贯莺。name
列標(biāo)出了每個可配置變量的名稱缕探。current settings
列列出了任何給定變量的現(xiàn)有配置。required
列標(biāo)出對于任何給定變量潭兽,值是否是必須的。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
值修改為我們打算掃描的遠(yuǎn)程系統(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 個主機(jī)地址執(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 掃描器更快。