第二章 探索掃描(二)
作者:Justin Hutchens
譯者:飛龍
協(xié)議:CC BY-NC-SA 4.0
2.7 使用 Scapy 發(fā)現(xiàn)第三層
Scapy 是一種工具去件,允許用戶制作并向網(wǎng)絡(luò)中注入自定義數(shù)據(jù)包收苏。 此工具可以用于構(gòu)建 ICMP 協(xié)議請求,并將它們注入網(wǎng)絡(luò)來分析響應(yīng)。 這個特定的秘籍演示了如何使用 Scapy 在遠(yuǎn)程主機(jī)上執(zhí)行第3層發(fā)現(xiàn)啥容。
準(zhǔn)備
使用 Scapy 執(zhí)行第三層發(fā)現(xiàn)不需要實(shí)驗(yàn)環(huán)境,因?yàn)?Internet 上的許多系統(tǒng)都將回復(fù) ICMP 回顯請求。但是,強(qiáng)烈建議你只在您自己的實(shí)驗(yàn)環(huán)境中執(zhí)行任何類型的網(wǎng)絡(luò)掃描代芜,除非你完全熟悉您受到任何管理機(jī)構(gòu)施加的法律法規(guī)。如果你希望在實(shí)驗(yàn)環(huán)境中執(zhí)行此技術(shù)浓利,你需要至少有一個響應(yīng) ICMP 請求的系統(tǒng)挤庇。在提供的示例中,使用 Linux 和 Windows 系統(tǒng)的組合贷掖。有關(guān)在本地實(shí)驗(yàn)環(huán)境中設(shè)置系統(tǒng)的更多信息嫡秕,請參閱第一章中的“安裝 Metasploitable2”和“安裝 Windows Server”秘籍。此外苹威,本節(jié)還需要使用文本編輯器(如 VIM 或 Nano)將腳本寫入文件系統(tǒng)昆咽。有關(guān)編寫腳本的更多信息,請參閱第一章中的“使用文本編輯器(VIM 和 Nano)”秘籍牙甫。
操作步驟
為了使用 Scapy 發(fā)送 ICMP 回顯請求掷酗,我們需要開始堆疊層級來發(fā)送請求。 堆疊數(shù)據(jù)包時的一個好的經(jīng)驗(yàn)法則是,通過 OSI 按照的各層進(jìn)行處理窟哺。 你可以通過使用斜杠分隔每個層級來堆疊多個層級泻轰。 為了生成 ICMP 回顯請求,IP 層需要與 ICMP 請求堆疊且轨。 為了開始浮声,請使用scapy
命令打開 Scapy 交互式控制臺,然后將IP
對象賦給變量:
root@KaliLinux:~# scapy Welcome to Scapy (2.2.0)
>>> ip = IP()
>>> ip.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\
將新值賦給目標(biāo)地址屬性后旋奢,可以通過再次調(diào)用display()
函數(shù)來驗(yàn)證更改泳挥。 請注意,當(dāng)目標(biāo) IP 地址值更改為任何其他值時至朗,源地址也會從回送地址自動更新為與默認(rèn)接口關(guān)聯(lián)的 IP 地址屉符。 現(xiàn)在 IP
對象的屬性已經(jīng)適當(dāng)修改了,我們將需要在我們的封包棧中創(chuàng)建第二層爽丹。 要添加到棧的下一個層是 ICMP 層筑煮,我們將其賦給單獨(dú)的變量:
>>> ping = ICMP()
>>> ping.display()
###[ ICMP ]###
type= echo-request
code= 0
chksum= None
id= 0x0
seq= 0x0
在所提供的示例中,ICMP 對象使用ping
變量名稱初始化粤蝎。 然后可以調(diào)用display()
函數(shù)來顯示 ICMP 屬性的默認(rèn)配置真仲。 為了執(zhí)行 ICMP 回顯請求,默認(rèn)配置就足夠了初澎。 現(xiàn)在兩個層都已正確配置秸应,它們可以堆疊來準(zhǔn)備發(fā)送虑凛。 在 Scapy 中,可以通過使用斜杠分隔每個層級來堆疊層級软啼。 看看下面的命令集:
>>> ping_request = (ip/ping)
>>> ping_request.display()
###[ IP ]###
version= 4
ihl= None
tos= 0x0
len= None
id= 1
flags=
frag= 0
ttl= 64
proto= icmp
chksum= None
src= 172.16.36.180
dst= 172.16.36.135
\options\
###[ ICMP ]###
type= echo-request
code= 0
chksum= None
id= 0x0
seq= 0x0
一旦堆疊層級被賦給一個變量桑谍,display()
函數(shù)可以顯示整個棧。 以這種方式堆疊層的過程通常被稱為數(shù)據(jù)報(bào)封裝祸挪。 現(xiàn)在已經(jīng)堆疊了層級锣披,并已經(jīng)準(zhǔn)備好發(fā)送請求。 這可以使用 Scapy 中的sr1()
函數(shù)來完成:
>>> ping_reply = sr1(ping_request)
..Begin emission:
.........
Finished to send 1 packets.
...*
Received 15 packets, got 1 answers, remaining 0 packets
>>> ping_reply.display()
###[ IP ]###
version= 4L
ihl= 5L
tos= 0x0
len= 28
id= 62577
flags=
frag= 0L
ttl= 64
proto= icmp
chksum= 0xe513
src= 172.16.36.135
dst= 172.16.36.180
\options\
###[ ICMP ]###
type= echo-reply
code= 0
chksum= 0xffff
id= 0x0
seq= 0x0
###[ Padding ]###
load= '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ x00\x00\x00\x00'
在提供的示例中贿条,sr1()
函數(shù)賦給了ping_reply
變量雹仿。 這將執(zhí)行該函數(shù),然后將結(jié)果傳遞給此變量整以。 在接收到響應(yīng)后胧辽,在ping_reply
變量上調(diào)用display()
函數(shù)來查看響應(yīng)的內(nèi)容。請注意公黑,此數(shù)據(jù)包是從我們發(fā)送初始請求的主機(jī)發(fā)送的邑商,目標(biāo)地址是 Kali 系統(tǒng)的 IP 地址。 另外凡蚜,注意響應(yīng)的 ICMP 類型是回應(yīng)應(yīng)答人断。 基于此示例,使用 Scapy 發(fā)送和接收 ICMP 的過程看起來很有用番刊,但如果你嘗試對非響應(yīng)的目標(biāo)地址使用相同的步驟含鳞,你會很快注意到問題:
>>> ip.dst = "172.16.36.136"
>>> ping_request = (ip/ping)
>>> ping_reply = sr1(ping_request)
.Begin emission:
......................................................................... ......................................................................... ...........
Finished to send 1 packets
.................................. ....................................................................
*** {TRUNCATED} ***
示例輸出被截?cái)啵溯敵鰬?yīng)該無限繼續(xù)芹务,直到你使用Ctrl + C
強(qiáng)制關(guān)閉。不向函數(shù)提供超時值鸭廷,sr1()
函數(shù)會繼續(xù)監(jiān)聽枣抱,直到接收到響應(yīng)。 如果主機(jī)不是活動的辆床,或者如果 IP 地址沒有與任何主機(jī)關(guān)聯(lián)佳晶,則不會發(fā)送響應(yīng),并且該功能也不會退出讼载。 為了在腳本中有效使用此函數(shù)轿秧,應(yīng)定義超時值:
>>> ping_reply = sr1(ping_request, timeout=1)
.Begin emission:
....................................................................... .......................................................................
Finished to send 1 packets.
....................................
Received 3982 packets, got 0 answers, remaining 1 packets
通過提供超時值作為傳遞給sr1()
函數(shù)的第二個參數(shù),如果在指定的秒數(shù)內(nèi)沒有收到響應(yīng)咨堤,進(jìn)程將退出菇篡。 在所提供的示例中,sr1()
函數(shù)用于將 ICMP 請求發(fā)送到無響應(yīng)地址一喘,因?yàn)槲词盏巾憫?yīng)驱还,會在 1 秒后退出。 到目前為止提供的示例中,我們將函數(shù)賦值給變量议蟆,來創(chuàng)建持久化和可操作的對象闷沥。 但是,這些函數(shù)不必復(fù)制給變量咐容,也可以通過直接調(diào)用函數(shù)生成舆逃。
>>> answer = sr1(IP(dst="172.16.36.135")/ICMP(),timeout=1)
.Begin emission:
...*
Finished to send 1 packets.
Received 5 packets, got 1 answers, remaining 0 packets
>>> response.display()
###[ IP ]###
version= 4L
ihl= 5L
tos= 0x0
len= 28
id= 62578
flags=
frag= 0L
ttl= 64
proto= icmp
chksum= 0xe512
src= 172.16.36.135
dst= 172.16.36.180
\options\
###[ ICMP ]###
type= echo-reply
code= 0
chksum= 0xffff
id= 0x0
seq= 0x0
###[ Padding ]###
load= '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ x00\x00\x00\x00'
在這里提供的示例中,之前使用四個單獨(dú)的命令完成的所有工作戳粒,實(shí)際上可以通過直接調(diào)用函數(shù)的單個命令來完成颖侄。 請注意,如果在超時值指定的時間范圍內(nèi)享郊, ICMP 請求沒有收到 IP 地址的回復(fù)览祖,調(diào)用對象會產(chǎn)生異常。 由于未收到響應(yīng)炊琉,因此此示例中賦值為響應(yīng)的應(yīng)答變量不會初始化:
>>> answer = sr1(IP(dst="83.166.169.231")/ICMP(),timeout=1)
Begin emission:
..........................................
Finished to send 1 packets.
......................................................................... ..........................
Received 1180 packets, got 0 answers, remaining 1 packets
>>> answer.display()
Traceback (most recent call last): File "<console>", line 1, in <module> AttributeError: 'NoneType' object has no attribute 'display'
有關(guān)這些不同響應(yīng)的知識展蒂,可以用于生成在多個 IP 地址上按順序執(zhí)行 ICMP 請求的腳本。 腳本會循環(huán)遍歷目標(biāo) IP 地址中最后一個八位字節(jié)的所有可能值苔咪,并為每個值發(fā)送一個 ICMP 請求锰悼。 當(dāng)從每個sr1()
函數(shù)返回時,將評估響應(yīng)來確定是否接收到應(yīng)答的響應(yīng):
#!/usr/bin/python
import logging
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
from scapy.all import *
if len(sys.argv) != 2:
print "Usage - ./pinger.py [/24 network address]"
print "Example - ./pinger.py 172.16.36.0"
print "Example will perform an ICMP scan of the 172.16.36.0/24 range"
sys.exit()
address = str(sys.argv[1])
prefix = address.split('.')[0] + '.' + address.split('.')[1] + '.' + address.split('.')[2] + '.'
for addr in range(1,254):
answer=sr1(ARP(pdst=prefix+str(addr)),timeout=1,verbose=0)
if answer == None:
pass
else:
print prefix+str(addr)
腳本的第一行標(biāo)識了 Python 解釋器所在的位置团赏,以便腳本可以在不傳遞到解釋器的情況下執(zhí)行箕般。 然后腳本導(dǎo)入所有 Scapy 函數(shù),并定義 Scapy 日志記錄級別舔清,以消除腳本中不必要的輸出丝里。 還導(dǎo)入了子過程庫,以便于從系統(tǒng)調(diào)用中提取信息体谒。 第二個代碼塊是條件測試杯聚,用于評估是否向腳本提供了所需的參數(shù)。 如果在執(zhí)行時未提供所需的參數(shù)抒痒,則腳本將輸出使用情況的說明幌绍。 該說明包括工具的用法,示例和所執(zhí)行任務(wù)的解釋故响。
在這個代碼塊之后傀广,有一個單獨(dú)的代碼行將所提供的參數(shù)賦值給interface
變量。下一個代碼塊使用check_output()
子進(jìn)程函數(shù)執(zhí)行ifconfig
系統(tǒng)調(diào)用彩届,該調(diào)用也使用grep
和cut
從作為參數(shù)提供的本地接口提取 IP 地址伪冰。然后將此輸出賦給ip
變量。然后使用split
函數(shù)從 IP 地址字符串中提取/ 24
網(wǎng)絡(luò)前綴惨缆。例如糜值,如果ip
變量包含192.168.11.4
字符串丰捷,則值為192.168.11
。它將賦給prefix
變量寂汇。
最后一個代碼塊是一個用于執(zhí)行實(shí)際掃描的for
循環(huán)病往。 for
循環(huán)遍歷介于 0 和 254 之間的所有值,并且對于每次迭代骄瓣,該值隨后附加到網(wǎng)絡(luò)前綴后面停巷。在早先提供的示例的中,將針對192.168.11.0
和192.168.11.254
之間的每個 IP 地址發(fā)送 ICMP 回顯請求榕栏。然后對于每個回復(fù)的活動主機(jī)畔勤,將相應(yīng)的 IP 地址打印到屏幕上,以表明主機(jī)在 LAN 上活動扒磁。一旦腳本被寫入本地目錄庆揪,你可以在終端中使用句號和斜杠,然后是可執(zhí)行腳本的名稱來執(zhí)行它妨托「组唬看看以下用于執(zhí)行腳本的命令:
root@KaliLinux:~# ./pinger.py
Usage - ./pinger.py [/24 network address]
Example - ./pinger.py 172.16.36.0
Example will perform an ICMP scan of the 172.16.36.0/24 range
root@KaliLinux:~# ./pinger.py
172.16.36.0
172.16.36.2
172.16.36.1
172.16.36.132
172.16.36.135
如果在沒有提供任何參數(shù)的情況下執(zhí)行腳本,則會將使用方法輸出到屏幕兰伤。 使用方法輸出表明内颗,此腳本需要用于定義要掃描的/ 24
網(wǎng)絡(luò)的單個參數(shù)。 提供的示例使用172.16.36.0
網(wǎng)絡(luò)地址來執(zhí)行腳本敦腔。 該腳本然后輸出在/ 24
網(wǎng)絡(luò)范圍上的活動 IP 地址的列表均澳。 此輸出也可以使用尖括號重定向到輸出文本文件,后跟輸出文件名符衔。 一個例子如下:
root@KaliLinux:~# ./pinger.py 172.16.36.0 > output.txt
root@KaliLinux:~# ls output.txt
output.txt
root@KaliLinux:~# cat output.txt
172.16.36.1
172.16.36.2
172.16.36.132
172.16.36.135
然后可以使用ls
命令來驗(yàn)證輸出文件是否已寫入文件系統(tǒng)找前,或者可以使用cat
命令查看其內(nèi)容。 也可以修改此腳本柏腻,來接受 IP 地址列表作為輸入纸厉。 為此,必須更改for
循環(huán)來循環(huán)遍歷從指定的文本文件讀取的行五嫂。 一個例子如下:
#!/usr/bin/python
import logging
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
from scapy.all import *
if len(sys.argv) != 2:
print "Usage - ./pinger.py [filename]"
print "Example - ./pinger.py iplist.txt"
print "Example will perform an ICMP ping scan of the IP addresses listed in iplist.txt"
sys.exit()
filename = str(sys.argv[1])
file = open(filename,'r')
for addr in file:
ans=sr1(IP(dst=addr.strip())/ICMP(),timeout=1,verbose=0)
if ans == None:
pass
else:
print addr.strip()
與之前的腳本唯一的主要區(qū)別是,它接受一個輸入文件名作為參數(shù)肯尺,然后循環(huán)遍歷此文件中列出的每個 IP 地址進(jìn)行掃描沃缘。 與其他腳本類似,生成的輸出包括響應(yīng) ICMP 回顯請求的系統(tǒng)的相關(guān) IP 地址的簡單列表则吟,其中包含 ICMP 回顯響應(yīng):
root@KaliLinux:~# ./pinger.py
Usage - ./pinger.py [filename]
Example - ./pinger.py iplist.txt
Example will perform an
ICMP ping scan of the IP addresses listed in iplist.txt
root@KaliLinux:~# ./pinger.py iplist.txt
172.16.36.1
172.16.36.2
172.16.36.132
172.16.36.135
此腳本的輸出可以以相同的方式重定向到輸出文件槐臀。 使用作為參數(shù)提供的輸入文件來執(zhí)行腳本,然后使用尖括號重定向輸出氓仲,后跟輸出文本文件的名稱水慨。 一個例子如下:
root@KaliLinux:~# ./pinger.py iplist.txt > output.txt
root@KaliLinux:~# ls output.txt
output.txt
root@KaliLinux:~# cat output.txt
172.16.36.1
172.16.36.2
172.16.36.132
172.16.36.135
工作原理
此處使用 Scapy 通過構(gòu)造包括 IP 層和附加的 ICMP 請求的請求來執(zhí)行 ICMP 第三層發(fā)現(xiàn)得糜。 IP 層能夠?qū)⒎獍酚傻奖镜鼐W(wǎng)絡(luò)之外,并且 ICMP 請求用于從遠(yuǎn)程系統(tǒng)請求響應(yīng)晰洒。 在 Python 腳本中使用此技術(shù)朝抖,可以按順序執(zhí)行此任務(wù),來掃描多個系統(tǒng)或整個網(wǎng)絡(luò)范圍谍珊。
2.8 使用 Nmap 發(fā)現(xiàn)第三層
Nmap 是 Kali Linux 中最強(qiáng)大和最通用的掃描工具之一治宣。 因此,毫不奇怪砌滞,Nmap 也支持 ICMP 發(fā)現(xiàn)掃描侮邀。 該秘籍演示了如何使用 Nmap 在遠(yuǎn)程主機(jī)上執(zhí)行第三層發(fā)現(xiàn)。
準(zhǔn)備
使用 Nmap 執(zhí)行第三層發(fā)現(xiàn)不需要實(shí)驗(yàn)環(huán)境贝润,因?yàn)?Internet 上的許多系統(tǒng)都將回復(fù) ICMP 回顯請求绊茧。但是,強(qiáng)烈建議你只在您自己的實(shí)驗(yàn)環(huán)境中執(zhí)行任何類型的網(wǎng)絡(luò)掃描打掘,除非你完全熟悉您受到任何管理機(jī)構(gòu)施加的法律法規(guī)华畏。如果你希望在實(shí)驗(yàn)環(huán)境中執(zhí)行此技術(shù),你需要至少有一個響應(yīng) ICMP 請求的系統(tǒng)胧卤。在提供的示例中唯绍,使用 Linux 和 Windows 系統(tǒng)的組合。有關(guān)在本地實(shí)驗(yàn)環(huán)境中設(shè)置系統(tǒng)的更多信息枝誊,請參閱第一章中的“安裝 Metasploitable2”和“安裝 Windows Server”秘籍况芒。此外,本節(jié)還需要使用文本編輯器(如 VIM 或 Nano)將腳本寫入文件系統(tǒng)叶撒。有關(guān)編寫腳本的更多信息绝骚,請參閱第一章中的“使用文本編輯器(VIM 和 Nano)”秘籍。
操作步驟
Nmap是一種自適應(yīng)工具祠够,它可以按需自動調(diào)整压汪,并執(zhí)行第2層,第3層或第4層發(fā)現(xiàn)古瓤。 如果-sn
選項(xiàng)在 Nmap 中用于掃描本地網(wǎng)段上不存在的 IP 地址止剖,則 ICMP 回顯請求將用于確定主機(jī)是否處于活動狀態(tài)和是否響應(yīng)。 為了對單個目標(biāo)執(zhí)行 ICMP 掃描落君,請使用帶有-sn
選項(xiàng)的Nmap穿香,并傳遞要掃描的 IP 地址作為參數(shù):
root@KaliLinux:~# nmap -sn 74.125.228.1
Starting Nmap 6.25 ( http://nmap.org ) at 2013-12-16 23:05 EST
Nmap scan report for iad23s05-in-f1.1e100.net (74.125.228.1)
Host is up (0.00013s latency).
Nmap done: 1 IP address (1 host up) scanned in 0.02 seconds
此命令的輸出表明了設(shè)備是否已啟動,還會提供有關(guān)所執(zhí)行掃描的詳細(xì)信息绎速。 此外請注意皮获,系統(tǒng)名稱也已確定。 Nmap 還執(zhí)行 DNS 解析來在掃描輸出中提供此信息纹冤。 它還可以用于使用破折號符號掃描 IP 地址連續(xù)范圍洒宝。 Nmap 默認(rèn)情況下是多線程的购公,并且并行運(yùn)行多個進(jìn)程。 因此雁歌,Nmap 在返回掃描結(jié)果時非澈旰疲快。 看看下面的命令:
root@KaliLinux:~# nmap -sn 74.125.228.1-255
Starting Nmap 6.25 ( http://nmap.org ) at 2013-12-16 23:14 EST
Nmap scan report for iad23s05-in-f1.1e100.net (74.125.228.1)
Host is up (0.00012s latency).
Nmap scan report for iad23s05-in-f2.1e100.net (74.125.228.2)
Host is up (0.0064s latency).
Nmap scan report for iad23s05-in-f3.1e100.net (74.125.228.3)
Host is up (0.0070s latency).
Nmap scan report for iad23s05-in-f4.1e100.net (74.125.228.4)
Host is up (0.00015s latency).
Nmap scan report for iad23s05-in-f5.1e100.net (74.125.228.5)
Host is up (0.00013s latency).
Nmap scan report for iad23s05-in-f6.1e100.net (74.125.228.6)
Host is up (0.00012s latency).
Nmap scan report for iad23s05-in-f7.1e100.net (74.125.228.7)
Host is up (0.00012s latency).
Nmap scan report for iad23s05-in-f8.1e100.net (74.125.228.8)
Host is up (0.00012s latency).
*** {TRUNCATED} ***
在提供的示例中将宪,Nmap 用于掃描整個/ 24
網(wǎng)絡(luò)范圍绘闷。 為了方便查看,此命令的輸出被截?cái)唷?通過使用 Wireshark 分析通過接口的流量较坛,你可能會注意到這些地址沒有按順序掃描印蔗。 這可以在以下屏幕截圖中看到。 這是 Nmap 的多線程特性的進(jìn)一步證據(jù)丑勤,并展示了當(dāng)其他進(jìn)程完成時华嘹,如何從隊(duì)列中的地址啟動進(jìn)程:
或者,Nmap 也可用于掃描輸入文本文件中的 IP 地址法竞。 這可以使用-iL
選項(xiàng)耙厚,后跟文件或文件路徑的名稱來完成:
root@KaliLinux:~# cat iplist.txt
74.125.228.13 74.125.228.28
74.125.228.47 74.125.228.144
74.125.228.162 74.125.228.211
root@KaliLinux:~# nmap -iL iplist.txt -sn
Starting Nmap 6.25 ( http://nmap.org ) at 2013-12-16 23:14 EST
Nmap scan report for iad23s05-in-f13.1e100.net (74.125.228.13)
Host is up (0.00010s latency).
Nmap scan report for iad23s05-in-f28.1e100.net (74.125.228.28)
Host is up (0.0069s latency).
Nmap scan report for iad23s06-in-f15.1e100.net (74.125.228.47)
Host is up (0.0068s latency).
Nmap scan report for iad23s17-in-f16.1e100.net (74.125.228.144)
Host is up (0.00010s latency).
Nmap scan report for iad23s18-in-f2.1e100.net (74.125.228.162)
Host is up (0.0077s latency).
Nmap scan report for 74.125.228.211
Host is up (0.00022s latency).
Nmap done: 6 IP addresses (6 hosts up) scanned in 0.04 seconds
在提供的示例中,執(zhí)行目錄中存在六個 IP 地址的列表岔霸。 然后將此列表輸入到 Nmap 中薛躬,并掃描每個列出的地址來嘗試識別活動主機(jī)。
工作原理
Nmap 通過對提供的范圍或文本文件中的每個 IP 地址發(fā)出 ICMP 回顯請求呆细,來執(zhí)行第3層掃描型宝。 由于 Nmap 是一個多線程工具,所以它會并行發(fā)送多個請求絮爷,結(jié)果會很快返回給用戶趴酣。 由于 Nmap 的發(fā)現(xiàn)功能是自適應(yīng)的,它只會使用 ICMP 發(fā)現(xiàn)坑夯,如果 ARP 發(fā)現(xiàn)無法有效定位本地子網(wǎng)上的主機(jī)岖寞。 或者,如果 ARP 發(fā)現(xiàn)或 ICMP 發(fā)現(xiàn)都不能有效識別給定 IP 地址上的活動主機(jī)時柜蜈,那么將采第四層發(fā)現(xiàn)技術(shù)仗谆。
2.9 使用 fping 探索第三層
fping
工具費(fèi)長類似于著名的ping
工具。 但是淑履,它也內(nèi)建了在ping
中不存在的許多附加功能胸私。 這些附加功能讓fping
能夠用作功能掃描工具,無需額外修改鳖谈。 該秘籍演示了如何使用fping
在遠(yuǎn)程主機(jī)上執(zhí)行第3層發(fā)現(xiàn)。
準(zhǔn)備
使用fping
執(zhí)行第三層發(fā)現(xiàn)不需要實(shí)驗(yàn)環(huán)境阔涉,因?yàn)?Internet 上的許多系統(tǒng)都將回復(fù) ICMP 回顯請求缆娃。但是捷绒,強(qiáng)烈建議你只在您自己的實(shí)驗(yàn)環(huán)境中執(zhí)行任何類型的網(wǎng)絡(luò)掃描,除非你完全熟悉您受到任何管理機(jī)構(gòu)施加的法律法規(guī)贯要。如果你希望在實(shí)驗(yàn)環(huán)境中執(zhí)行此技術(shù)暖侨,你需要至少有一個響應(yīng) ICMP 請求的系統(tǒng)。在提供的示例中崇渗,使用 Linux 和 Windows 系統(tǒng)的組合字逗。有關(guān)在本地實(shí)驗(yàn)環(huán)境中設(shè)置系統(tǒng)的更多信息,請參閱第一章中的“安裝 Metasploitable2”和“安裝 Windows Server”秘籍宅广。
操作步驟
fping
非常類似于添加了一些額外功能的ping
工具葫掉。 它可以以ping
的相同方式,向單個目標(biāo)發(fā)送 ICMP 回顯請求跟狱,以確定它是否活動俭厚。 這通過將 IP 地址作為參數(shù)傳遞給fping
實(shí)用程序來完成:
root@KaliLinux:~# fping 172.16.36.135
172.16.36.135 is alive
與標(biāo)準(zhǔn)ping
工具不同,fping
會在收到單個應(yīng)答后停止發(fā)送 ICMP 回顯請求驶臊。 在接收到回復(fù)時挪挤,它將顯示對應(yīng)該地址的主機(jī)是活動的。 或者关翎,如果未從地址接收到響應(yīng)扛门,則在確定主機(jī)不可達(dá)之前,fping
通常嘗試聯(lián)系系統(tǒng)四次:
root@KaliLinux:~# fping 172.16.36.136
ICMP Host Unreachable from 172.16.36.180 for ICMP Echo sent to 172.16.36.136
ICMP Host Unreachable from 172.16.36.180 for ICMP Echo sent to 172.16.36.136
ICMP Host Unreachable from 172.16.36.180 for ICMP Echo sent to 172.16.36.136
ICMP Host Unreachable from 172.16.36.180 for ICMP Echo sent to
172.16.36.136 172.16.36.136 is unreachable
可以使用-c count
選項(xiàng)修改此默認(rèn)連接嘗試次數(shù)纵寝,并向其提供一個定義嘗試次數(shù)的整數(shù)值:
root@KaliLinux:~# fping 172.16.36.135 -c 1
172.16.36.135 : [0], 84 bytes, 0.67 ms (0.67 avg, 0% loss)
172.16.36.135 : xmt/rcv/%loss = 1/1/0%, min/avg/max = 0.67/0.67/0.67
root@KaliLinux:~# fping 172.16.36.136 -c 1
172.16.36.136 : xmt/rcv/%loss = 1/0/100%
當(dāng)以這種方式執(zhí)行時论寨,輸出更加隱蔽一些,但可以通過仔細(xì)分析來理解店雅。 任何主機(jī)的輸出包括 IP 地址政基,嘗試次數(shù)(xmt
),接收的回復(fù)數(shù)(rcv
)和丟失百分比(%loss
)闹啦。 在提供的示例中沮明,fping
發(fā)現(xiàn)第一個地址處于聯(lián)機(jī)狀態(tài)。 這可以由接收的字節(jié)數(shù)和應(yīng)答的等待時間都被返回的事實(shí)來證明窍奋。 你還可以通過檢查百分比損失荐健,來輕松確定是否存在與提供的 IP 地址關(guān)聯(lián)的活動主機(jī)。 如果百分比損失為 100琳袄,則未收到回復(fù)江场。
與ping
(最常用作故障排除工具)不同,fping
內(nèi)建了集成功能窖逗,可掃描多個主機(jī)址否。 可以使用fping
掃描主機(jī)序列,使用-g
選項(xiàng)動態(tài)生成 IP 地址列表碎紊。 要指定掃描范圍佑附,請使用該參數(shù)傳遞所需序列范圍中的第一個和最后一個 IP 地址:
root@KaliLinux:~# fping -g 172.16.36.1 172.16.36.4
172.16.36.1 is alive
172.16.36.2 is alive
ICMP Host Unreachable from 172.16.36.180 for ICMP Echo sent to 172.16.36.3
ICMP Host Unreachable from 172.16.36.180 for ICMP Echo sent to 172.16.36.3
ICMP Host Unreachable from 172.16.36.180 for ICMP Echo sent to 172.16.36.3
ICMP Host Unreachable from 172.16.36.180 for ICMP Echo sent to 172.16.36.3
ICMP Host Unreachable from 172.16.36.180 for ICMP Echo sent to 172.16.36.4
ICMP Host Unreachable from 172.16.36.180 for ICMP Echo sent to 172.16.36.4
ICMP Host Unreachable from 172.16.36.180 for ICMP Echo sent to 172.16.36.4
ICMP Host Unreachable from 172.16.36.180 for ICMP Echo sent to 172.16.36.4 172.16.36.3 is unreachable
172.16.36.4 is unreachable
生成列表選項(xiàng)也可用于基于 CIDR 范圍符號生成列表樊诺。 以相同的方式,fping
將循環(huán)遍歷這個動態(tài)生成的列表并掃描每個地址:
root@KaliLinux:~# fping -g 172.16.36.0/24
172.16.36.1 is alive
172.16.36.2 is alive
ICMP Host Unreachable from 172.16.36.180 for ICMP Echo sent to 172.16.36.3
ICMP Host Unreachable from 172.16.36.180 for ICMP Echo sent to 172.16.36.4
ICMP Host Unreachable from 172.16.36.180 for ICMP Echo sent to 172.16.36.5
ICMP Host Unreachable from 172.16.36.180 for ICMP Echo sent to 172.16.36.6
ICMP Host Unreachable from 172.16.36.180 for ICMP Echo sent to 172.16.36.7
ICMP Host Unreachable from 172.16.36.180 for ICMP Echo sent to 172.16.36.8
ICMP Host Unreachable from 172.16.36.180 for ICMP Echo sent to 172.16.36.9
*** {TRUNCATED} ***
最后音同,fping
還可以用于掃描由輸入文本文件的內(nèi)容指定的一系列地址词爬。 要使用輸入文件,請使用-f
文件選項(xiàng)权均,然后提供輸入文件的文件名或路徑:
root@KaliLinux:~# fping -f iplist.txt 172.16.36.2 is alive 172.16.36.1 is alive 172.16.36.132 is alive 172.16.36.135 is alive 172.16.36.180 is alive
ICMP Host Unreachable from 172.16.36.180 for ICMP Echo sent to 172.16.36.203
ICMP Host Unreachable from 172.16.36.180 for ICMP Echo sent to 172.16.36.203
ICMP Host Unreachable from 172.16.36.180 for ICMP Echo sent to 172.16.36.203
ICMP Host Unreachable from 172.16.36.180 for ICMP Echo sent to 172.16.36.203
ICMP Host Unreachable from 172.16.36.180 for ICMP Echo sent to 172.16.36.205
ICMP Host Unreachable from 172.16.36.180 for ICMP Echo sent to 172.16.36.205
ICMP Host Unreachable from 172.16.36.180 for ICMP Echo sent to 172.16.36.205
ICMP Host Unreachable from 172.16.36.180 for ICMP Echo sent to 172.16.36.205
172.16.36.203 is unreachable
172.16.36.205 is unreachable
172.16.36.254 is unreachable
工作原理
fping
工具執(zhí)行ICMP發(fā)現(xiàn)的方式與我們之前討論的其他工具相同顿膨。 對于每個 IP 地址,fping
發(fā)送一個或多個 ICMP 回顯請求叽赊,然后評估所接收的響應(yīng)以識別活動主機(jī)恋沃。 fping
還可以用于通過提供適當(dāng)?shù)膮?shù),來掃描一系列系統(tǒng)或 IP 地址的輸入列表蛇尚。 因此芽唇,我們不必使用bash
腳本來操作工具,就像使用ping
操作一樣取劫,使其成為有效的掃描工具匆笤。
2.10 使用 hping3 探索第三層
hping3
可以用于以多種不同方式執(zhí)行主機(jī)發(fā)現(xiàn)的更多功能。 它比fping
更強(qiáng)大谱邪,因?yàn)樗梢詧?zhí)行多種不同類型的發(fā)現(xiàn)技術(shù)炮捧,但作為掃描工具不太有用,因?yàn)樗荒苡糜诙ㄎ粏蝹€主機(jī)惦银。 然而咆课,這個缺點(diǎn)可以使用 bash 腳本克服。 該秘籍演示了如何使用hping3
在遠(yuǎn)程主機(jī)上執(zhí)行第3層發(fā)現(xiàn)扯俱。
準(zhǔn)備
使用hping3
執(zhí)行第三層發(fā)現(xiàn)不需要實(shí)驗(yàn)環(huán)境书蚪,因?yàn)?Internet 上的許多系統(tǒng)都將回復(fù) ICMP 回顯請求。但是迅栅,強(qiáng)烈建議你只在您自己的實(shí)驗(yàn)環(huán)境中執(zhí)行任何類型的網(wǎng)絡(luò)掃描殊校,除非你完全熟悉您受到任何管理機(jī)構(gòu)施加的法律法規(guī)。如果你希望在實(shí)驗(yàn)環(huán)境中執(zhí)行此技術(shù)读存,你需要至少有一個響應(yīng) ICMP 請求的系統(tǒng)为流。在提供的示例中,使用 Linux 和 Windows 系統(tǒng)的組合让簿。有關(guān)在本地實(shí)驗(yàn)環(huán)境中設(shè)置系統(tǒng)的更多信息敬察,請參閱第一章中的“安裝 Metasploitable2”和“安裝 Windows Server”秘籍。
hping3
是一個非常強(qiáng)大的發(fā)現(xiàn)工具尔当,具有大量可操作的選項(xiàng)和模式莲祸。它能夠在第3層和第4層上執(zhí)行發(fā)現(xiàn)。為了使用hping3
對單個主機(jī)地址執(zhí)行基本的 ICMP 發(fā)現(xiàn), 只需要將要測試的 IP 地址和所需的 ICMP 掃描模式傳遞給它:
root@KaliLinux:~# hping3 172.16.36.1 --icmp
HPING 172.16.36.1 (eth1 172.16.36.1): icmp mode set, 28 headers + 0 data bytes
len=46 ip=172.16.36.1 ttl=64 id=41835 icmp_seq=0 rtt=0.3 ms
len=46 ip=172.16.36.1 ttl=64 id=5039 icmp_seq=1 rtt=0.3 ms
len=46 ip=172.16.36.1 ttl=64 id=54056 icmp_seq=2 rtt=0.6 ms
len=46 ip=172.16.36.1 ttl=64 id=50519 icmp_seq=3 rtt=0.5 ms
len=46 ip=172.16.36.1 ttl=64 id=47642 icmp_seq=4 rtt=0.4 ms
^C
--- 172.16.36.1 hping statistic --5 packets transmitted,
5 packets received, 0% packet loss
round-trip min/avg/max = 0.3/0.4/0.6 ms
提供的演示使用Ctrl + C
停止進(jìn)程虫给。與標(biāo)準(zhǔn)ping
工具類似藤抡,hping3
ICMP 模式將無限繼續(xù),除非在初始命令中指定了特定數(shù)量的數(shù)據(jù)包抹估。 為了定義要發(fā)送的嘗試次數(shù),應(yīng)包含-c
選項(xiàng)和一個表示所需嘗試次數(shù)的整數(shù)值:
root@KaliLinux:~# hping3 172.16.36.1 --icmp -c 2
HPING 172.16.36.1 (eth1 172.16.36.1): icmp mode set, 28 headers + 0 data bytes
len=46 ip=172.16.36.1 ttl=64 id=40746 icmp_seq=0 rtt=0.3 ms
len=46 ip=172.16.36.1 ttl=64 id=12231 icmp_seq=1 rtt=0.5 ms
---
172.16.36.1 hping statistic --
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.3/0.4/0.5 ms
雖然hping3
默認(rèn)情況下不支持掃描多個系統(tǒng)弄兜,但可以使用 bash 腳本輕易編寫腳本药蜻。 為了做到這一點(diǎn),我們必須首先確定與活動地址相關(guān)聯(lián)的輸出替饿,以及與非響應(yīng)地址相關(guān)聯(lián)的輸出之間的區(qū)別语泽。 為此,我們應(yīng)該在未分配主機(jī)的 IP 地址上使用相同的命令:
root@KaliLinux:~# hping3 172.16.36.4 --icmp -c 2
HPING 172.16.36.4 (eth1 172.16.36.4): icmp mode set, 28 headers + 0 data bytes
---
172.16.36.4 hping statistic --
2 packets transmitted, 0 packets received, 100% packet loss
round-trip min/avg/max = 0.0/0.0/0.0 ms
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 0.2/0.2/0.2 ms
--- 172.16.36.4 hping statistic --
1 packets transmitted, 0 packets received, 100% packet loss
round-trip min/avg/max = 0.0/0.0/0.0 ms
盡管產(chǎn)生了期望的結(jié)果视卢,在這種情況下踱卵,grep
函數(shù)似乎不能有效用于輸出。 由于hping3
中的輸出顯示處理据过,它難以通過管道傳遞到grep
函數(shù)惋砂,并只提取所需的行,我們可以嘗試通過其他方式解決這個問題绳锅。 具體來說西饵,我們將嘗試確定輸出是否可以重定向到一個文件,然后我們可以直接從文件中grep
鳞芙。 為此眷柔,我們嘗試將先前使用的兩個命令的輸出傳遞給handle.txt
文件:
root@KaliLinux:~# hping3 172.16.36.1 --icmp -c 1 >> handle.txt
--- 172.16.36.1 hping statistic --
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 0.4/0.4/0.4 ms
root@KaliLinux:~# hping3 172.16.36.4 --icmp -c 1 >> handle.txt
--- 172.16.36.4 hping statistic --
1 packets transmitted, 0 packets received, 100% packet loss
round-trip min/avg/max = 0.0/0.0/0.0 ms
root@KaliLinux:~# cat handle.txt
HPING 172.16.36.1 (eth1 172.16.36.1): icmp mode set, 28 headers + 0 data bytes
len=46 ip=172.16.36.1 ttl=64 id=56022 icmp_seq=0 rtt=0.4 ms
HPING 172.16.36.4 (eth1 172.16.36.4): icmp mode set, 28 headers + 0 data bytes
雖然這種嘗試并不完全成功,因?yàn)檩敵鰶]有完全重定向到文件溉仑,我們可以看到通過讀取文件中的輸出弓叛,足以創(chuàng)建一個有效的腳本义郑。 具體來說,我們能夠重定向一個唯一的行鞠评,該行只與成功的ping
嘗試相關(guān)聯(lián),并且包含該行中相應(yīng)的 IP 地址丙笋。 要驗(yàn)證此解決方法是否可行谢澈,我們需要嘗試循環(huán)訪問/ 24
范圍中的每個地址,然后將結(jié)果傳遞到handle.txt
文件:
root@KaliLinux:~# for addr in $(seq 1 254); do hping3 172.16.36.$addr --icmp -c 1 >> handle.txt & done
--- 172.16.36.2 hping statistic --
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 6.6/6.6/6.6 ms
--- 172.16.36.1 hping statistic --
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 55.2/55.2/55.2 ms
--- 172.16.36.8 hping statistic --
1 packets transmitted, 0 packets received, 100% packet loss
round-trip min/avg/max = 0.0/0.0/0.0 ms
*** {TRUNCATED} ***
通過這樣做御板,仍然有大量的輸出(提供的輸出為了方便而被截?cái)啵┌粗囟ㄏ虻轿募妮敵觥?但是锥忿,以下腳本的成功不取決于初始循環(huán)的過多輸出,而是取決于從輸出文件中提取必要信息的能力:
root@KaliLinux:~# ls
Desktop handle.txt pinger.sh
root@KaliLinux:~# grep len handle.txt
len=46 ip=172.16.36.2 ttl=128 id=7537 icmp_seq=0 rtt=6.6 ms
len=46 ip=172.16.36.1 ttl=64 id=56312 icmp_seq=0 rtt=55.2 ms
len=46 ip=172.16.36.132 ttl=64 id=47801 icmp_seq=0 rtt=27.3 ms
len=46 ip=172.16.36.135 ttl=64 id=62601 icmp_seq=0 rtt=77.9 ms
root@KaliLinux:~# grep len handle.txt | cut -d " " -f 2
ip=172.16.36.2
ip=172.16.36.1
ip=172.16.36.132
ip=172.16.36.135
root@KaliLinux:~# grep len handle.txt | cut -d " " -f 2 | cut -d "=" -f 2
172.16.36.2
172.16.36.1
172.16.36.132
172.16.36.135
通過將輸出使用管道連接到一系列cut
函數(shù)怠肋,我們可以從輸出中提取 IP 地址敬鬓。 現(xiàn)在我們已經(jīng)成功地確定了一種方法,來掃描多個主機(jī)并輕易識別結(jié)果,我們應(yīng)該將其集成到一個腳本中钉答。 將所有這些操作組合在一起的功能腳本的示例如下:
#!/bin/bash
if [ "$#" -ne 1 ]; then
echo "Usage - ./ping_sweep.sh [/24 network address]"
echo "Example - ./ping_sweep.sh 172.16.36.0"
echo "Example will perform an ICMP ping sweep of the 172.16.36.0/24 network and output to an output.txt file"
exit
fi
prefix=$(echo $1 | cut -d '.' -f 1-3)
for addr in $(seq 1 254); do
hping3 $prefix.$addr --icmp -c 1 >> handle.txt;
done
grep len handle.txt | cut -d " " -f 2 | cut -d "=" -f 2 >> output.txt
rm handle.txt
在提供的 bash 腳本中础芍,第一行定義了 bash 解釋器的位置。 接下來的代碼塊執(zhí)行測試來確定是否提供了預(yù)期的一個參數(shù)数尿。 這通過評估提供的參數(shù)的數(shù)量是否不等于 1 來確定仑性。如果未提供預(yù)期參數(shù),則輸出腳本的用法右蹦,并且退出腳本诊杆。 用法輸出表明,腳本需要接受/ 24
網(wǎng)絡(luò)地址作為參數(shù)何陆。 下一行代碼從提供的網(wǎng)絡(luò)地址中提取網(wǎng)絡(luò)前綴晨汹。 例如,如果提供的網(wǎng)絡(luò)地址是192.168.11.0
贷盲,則前綴變量將被賦值為192.168.11
淘这。 然后對/ 24
范圍內(nèi)的每個地址執(zhí)行hping3
操作,并將每個任務(wù)的結(jié)果輸出放入handle.txt
文件中巩剖。
一旦完成铝穷,grep
用于從handle
文件中提取與活動主機(jī)響應(yīng)相關(guān)聯(lián)的行,然后從這些行中提取 IP 地址球及。 然后將生成的 IP 地址傳遞到output.txt
文件氧骤,并從目錄中刪除handle.txt
臨時文件。 此腳本可以使用句號和斜杠吃引,后跟可執(zhí)行腳本的名稱執(zhí)行:
root@KaliLinux:~# ./ping_sweep.sh
Usage - ./ping_sweep.sh [/24 network address]
Example - ./ping_sweep.sh 172.16.36.0
Example will perform an ICMP ping sweep of the 172.16.36.0/24 network and output to an output.txt file
root@KaliLinux:~# ./ping_sweep.sh 172.16.36.0
--- 172.16.36.1 hping statistic --
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 0.4/0.4/0.4 ms
--- 172.16.36.2 hping statistic --
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 0.5/0.5/0.5 ms
--- 172.16.36.3 hping statistic --
1 packets transmitted, 0 packets received, 100% packet loss
round-trip min/avg/max = 0.0/0.0/0.0 ms
*** {TRUNCATED} ***
一旦完成筹陵,腳本應(yīng)該返回一個output.txt
文件到執(zhí)行目錄。 這可以使用ls
驗(yàn)證镊尺,并且cat
命令可以用于查看此文件的內(nèi)容:
root@KaliLinux:~# ls output.txt
output.txt
root@KaliLinux:~# cat output.txt
172.16.36.1
172.16.36.2
172.16.36.132
172.16.36.135
172.16.36.253
當(dāng)腳本運(yùn)行時朦佩,你仍然會看到在初始循環(huán)任務(wù)時看到的大量輸出。 幸運(yùn)的是庐氮,你發(fā)現(xiàn)的主機(jī)列表不會在此輸出中消失语稠,因?yàn)樗看味紩懭肽愕妮敵鑫募?/p>
工作原理
我們需要進(jìn)行一些調(diào)整,才能使用hping3
對多個主機(jī)或地址范圍執(zhí)行主機(jī)發(fā)現(xiàn)弄砍。 提供的秘籍使用 bash 腳本順序執(zhí)行 ICMP 回應(yīng)請求仙畦。 這是可性的,因?yàn)槌晒筒怀晒Φ恼埱竽軌蛏晌ㄒ豁憫?yīng)音婶。 通過將函數(shù)傳遞給一個循環(huán)慨畸,并將唯一響應(yīng)傳遞給grep
,我們可以高效開發(fā)出一個腳本衣式,對多個系統(tǒng)依次執(zhí)行 ICMP 發(fā)現(xiàn)寸士,然后輸出活動主機(jī)列表檐什。
2.11 使用 Scapy 探索第四層
多種不同方式可以用于在第四層執(zhí)行目標(biāo)發(fā)現(xiàn)∪蹩ǎ可以使用用戶數(shù)據(jù)報(bào)協(xié)議(UDP)或傳輸控制協(xié)議(TCP)來執(zhí)行掃描乃正。 Scapy 可以用于使用這兩種傳輸協(xié)議來制作自定義請求,并且可以與 Python 腳本結(jié)合使用以開發(fā)實(shí)用的發(fā)現(xiàn)工具婶博。 此秘籍演示了如何使用 Scapy 執(zhí)行 TCP 和 UDP 的第四層發(fā)現(xiàn)瓮具。
準(zhǔn)備
使用 Scapy 執(zhí)行第四層發(fā)現(xiàn)不需要實(shí)驗(yàn)環(huán)境,因?yàn)?Internet 上的許多系統(tǒng)都將回復(fù) TCP 和 UDP 請求凡蜻。但是搭综,強(qiáng)烈建議你只在您自己的實(shí)驗(yàn)環(huán)境中執(zhí)行任何類型的網(wǎng)絡(luò)掃描,除非你完全熟悉您受到任何管理機(jī)構(gòu)施加的法律法規(guī)划栓。如果你希望在實(shí)驗(yàn)環(huán)境中執(zhí)行此技術(shù),你需要至少有一個響應(yīng) TCP/UDP 請求的系統(tǒng)条获。在提供的示例中忠荞,使用 Linux 和 Windows 系統(tǒng)的組合。有關(guān)在本地實(shí)驗(yàn)環(huán)境中設(shè)置系統(tǒng)的更多信息帅掘,請參閱第一章中的“安裝 Metasploitable2”和“安裝 Windows Server”秘籍委煤。此外,本節(jié)還需要使用文本編輯器(如 VIM 或 Nano)將腳本寫入文件系統(tǒng)修档。有關(guān)編寫腳本的更多信息碧绞,請參閱第一章中的“使用文本編輯器(VIM 和 Nano)”秘籍。
操作步驟
為了驗(yàn)證從活動主機(jī)接收到的 RST 響應(yīng)吱窝,我們可以使用 Scapy 向已知的活動主機(jī)發(fā)送 TCP ACK 數(shù)據(jù)包讥邻。 在提供的示例中,ACK 數(shù)據(jù)包將發(fā)送到 TCP 目標(biāo)端口 80院峡。此端口通常用于運(yùn)行 HTTP Web 服務(wù)兴使。 演示中使用的主機(jī)當(dāng)前擁有在此端口上運(yùn)行的 Apache 服務(wù)。 為此照激,我們需要構(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\
這里俩垃,我們將i
變量初始化為IP
對象励幼,然后重新配置標(biāo)準(zhǔn)配置,將目標(biāo)地址設(shè)置為目標(biāo)服務(wù)器的 IP 地址口柳。 請注意苹粟,當(dāng)為目標(biāo)地址提供除回送地址之外的任何 IP 地址時,源 IP 地址會自動更新啄清。 我們需要構(gòu)建的下一層是我們的 TCP 層六水。 這可以在以下命令中看到:
>>> t = TCP()
>>> t.display()
###[ TCP ]###
sport= ftp_data
dport= http
seq= 0
ack= 0
dataofs= None
reserved= 0
flags= S
window= 8192
chksum= None
urgptr= 0
options= {}
>>> t.flags='A'
>>> t.display()
###[ TCP ]###
sport= ftp_data
dport= http
seq= 0
ack= 0
dataofs= None
reserved= 0
flags= A
window= 8192
chksum= None
urgptr= 0
options= {}
這里俺孙,我們將t
變量初始化為TCP
對象。 注意掷贾,對象的默認(rèn)配置已經(jīng)將目標(biāo)端口設(shè)置為 HTTP 或端口 80睛榄。這里,我們只需要將 TCP 標(biāo)志從S
(SYN)更改為A
(ACK)想帅。 現(xiàn)在场靴,可以通過使用斜杠分隔每個層級來構(gòu)建棧,如以下命令中所示:
>>> request = (i/t)
>>> request.display()
###[ IP ]###
version= 4
ihl= None
tos= 0x0
len= None
id= 1
flags=
frag= 0
ttl= 64
proto= tcp
chksum= None
src= 172.16.36.180
dst= 172.16.36.135
\options\
###[ TCP ]###
sport= ftp_data
dport= http
seq= 0
ack= 0
dataofs= None
reserved= 0
flags= A
window= 8192
chksum= None
urgptr= 0
options= {}
這里港准,我們將整個請求棧賦給request
變量旨剥。 現(xiàn)在,可以使用send
和recieve
函數(shù)跨線路發(fā)送請求浅缸,然后可以評估響應(yīng)來確定目標(biāo)地址的狀態(tài):
>>> response = sr1(request)
Begin emission:
.......Finished to send 1 packets.
....*
Received 12 packets, got 1 answers, remaining 0 packets
>>> response.display()
###[ IP ]###
version= 4L
ihl= 5L
tos= 0x0
len= 40
id= 0
flags= DF
frag= 0L
ttl= 64
proto= tcp
chksum= 0x9974
src= 172.16.36.135
dst= 172.16.36.180
\options\
###[ TCP ]###
sport= http
dport= ftp_data
seq= 0
ack= 0
dataofs= 5L
reserved= 0L
flags= R
window= 0
chksum= 0xe21
urgptr= 0
options= {}
###[ Padding ]###
load= '\x00\x00\x00\x00\x00\x00'
請注意轨帜,遠(yuǎn)程系統(tǒng)使用設(shè)置了 RST 標(biāo)志的 TCP 數(shù)據(jù)包進(jìn)行響應(yīng)。 這由分配給flags
屬性的R
值表示衩椒。 通過直接調(diào)用函數(shù)蚌父,可以將堆疊請求和發(fā)送和接收響應(yīng)的整個過程壓縮為單個命令:
>>> response = sr1(IP(dst="172.16.36.135")/TCP(flags='A'))
.Begin emission:
................
Finished to send 1 packets.
....*
Received 22 packets, got 1 answers, remaining 0 packets
>>> response.display()
###[ IP ]###
version= 4L
ihl= 5L
tos= 0x0
len= 40
id= 0
flags= DF
frag= 0L
ttl= 64
proto= tcp
chksum= 0x9974
src= 172.16.36.135
dst= 172.16.36.180
\options\
###[ TCP ]###
sport= http
dport= ftp_data
seq= 0
ack= 0
dataofs= 5L
reserved= 0L
flags= R
window= 0
chksum= 0xe21
urgptr= 0
options= {}
###[ Padding ]###
load= '\x00\x00\x00\x00\x00\x00'
現(xiàn)在我們已經(jīng)確定了與發(fā)送到活動主機(jī)上的打開端口的 ACK 數(shù)據(jù)包相關(guān)聯(lián)的響應(yīng),讓我們嘗試向活動系統(tǒng)上的已關(guān)閉端口發(fā)送類似的請求毛萌,并確定響應(yīng)是否有任何變化:
>>> response = sr1(IP(dst="172.16.36.135")/TCP(dport=1111,flags='A'))
.Begin emission:
.........
Finished to send 1 packets.
....*
Received 15 packets, got 1 answers, remaining 0 packets
>>> response.display()
###[ IP ]###
version= 4L
ihl= 5L
tos= 0x0
len= 40
id= 0
flags= DF
frag= 0L
ttl= 64
proto= tcp
chksum= 0x9974
src= 172.16.36.135
dst= 172.16.36.180
\options\
###[ TCP ]###
sport= 1111
dport= ftp_data
seq= 0
ack= 0
dataofs= 5L
reserved= 0L
flags= R
window= 0
chksum= 0xa1a
urgptr= 0
options= {}
###[ Padding ]###
load= '\x00\x00\x00\x00\x00\x00'
在此請求中苟弛,目標(biāo) TCP 端口已從默認(rèn)端口 80 更改為端口 1111(未在其上運(yùn)行服務(wù)的端口)。 請注意阁将,從活動系統(tǒng)上的打開端口和關(guān)閉端口返回的響應(yīng)是相同的膏秫。 無論這是否是在掃描端口上主動運(yùn)行的服務(wù),活動系統(tǒng)都會返回 RST 響應(yīng)做盅。 另外缤削,應(yīng)當(dāng)注意,如果將類似的掃描發(fā)送到與活動系統(tǒng)無關(guān)的 IP 地址言蛇,則不會返回響應(yīng)僻他。 這可以通過將請求中的目標(biāo) IP 地址修改為與實(shí)際系統(tǒng)無關(guān)的 IP 地址來驗(yàn)證:
>>> response = sr1(IP(dst="172.16.36.136")/TCP(dport=80,flags='A'),timeo ut=1)
Begin emission:
......................................................................... ......................................................................... ......
Finished to send 1 packets.
.....................
Received 3559 packets, got 0 answers, remaining 1 packets
因此,通過查看腊尚,我們發(fā)現(xiàn)對于發(fā)送到活動主機(jī)任何端口的 ACK 數(shù)據(jù)包吨拗,無論端口狀態(tài)如何,都將返回 RST 數(shù)據(jù)包婿斥,但如果沒有活動主機(jī)與之相關(guān)劝篷,則不會從 IP 接收到響應(yīng)。 這是一個好消息民宿,因?yàn)樗馕吨考耍覀兛梢酝ㄟ^只與每個系統(tǒng)上的單個端口進(jìn)行交互,在大量系統(tǒng)上執(zhí)行發(fā)現(xiàn)掃描活鹰。 將 Scapy 與 Python 結(jié)合使用哈恰,我們可以快速循環(huán)訪問/ 24
網(wǎng)絡(luò)范圍中的所有地址只估,并向每個系統(tǒng)上的僅一個 TCP 端口發(fā)送單個 ACK 數(shù)據(jù)包。 通過評估每個主機(jī)返回的響應(yīng)着绷,我們可以輕易輸出活動 IP 地址列表蛔钙。
#!/usr/bin/python
import logging
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
from scapy.all import *
if len(sys.argv) != 2:
print "Usage - ./ACK_Ping.py [/24 network address]"
print "Example - ./ACK_Ping.py 172.16.36.0"
print "Example will perform a TCP ACK ping scan of the 172.16.36.0/24 range"
sys.exit()
address = str(sys.argv[1])
prefix = address.split('.')[0] + '.' + address.split('.')[1] + '.' + address.split('.')[2] + '.'
for addr in range(1,254):
response = sr1(IP(dst=prefix+str(addr))/TCP(dport=80,flags='A'), timeout=1,verbose=0)
try:
if int(response[TCP].flags) == 4:
print "172.16.36."+str(addr)
except:
pass
提供的示例腳本相當(dāng)簡單。 當(dāng)循環(huán)遍歷 IP 地址中的最后一個八位字節(jié)的每個可能值時荠医,ACK 封包被發(fā)送到 TCP 端口 80吁脱,并且評估響應(yīng)來確定響應(yīng)中的 TCP 標(biāo)志的整數(shù)轉(zhuǎn)換是否具有值4
(與單獨(dú) RST 標(biāo)志相關(guān)的值)。 如果數(shù)據(jù)包具有 RST 標(biāo)志彬向,則腳本將輸出返回響應(yīng)的系統(tǒng)的 IP 地址兼贡。 如果沒有收到響應(yīng),Python 無法測試響應(yīng)變量的值娃胆,因?yàn)闆]有為其賦任何值遍希。 因此,如果沒有返回響應(yīng)里烦,將發(fā)生異常孵班。 如果返回異常,腳本將會跳過招驴。 生成的輸出是活動目標(biāo) IP 地址的列表。 此腳本可以使用句號和斜杠枷畏,后跟可執(zhí)行腳本的名稱執(zhí)行:
root@KaliLinux:~# ./ACK_Ping.py
Usage - ./ACK_Ping.py [/24 network address]
Example - ./ACK_Ping.py 172.16.36.0
Example will perform a TCP ACK ping scan of the 172.16.36.0/24 range
root@KaliLinux:~# ./ACK_Ping.py
172.16.36.1
172.16.36.2
172.16.36.132
172.16.36.135
類似的發(fā)現(xiàn)方法可以用于使用 UDP 協(xié)議來執(zhí)行第四層發(fā)現(xiàn)别厘。 為了確定我們是否可以使用 UDP 協(xié)議發(fā)現(xiàn)主機(jī),我們需要確定如何從任何運(yùn)行 UDP 的活動主機(jī)觸發(fā)響應(yīng)拥诡,而不管系統(tǒng)是否有在 UDP 端口上運(yùn)行服務(wù)触趴。 為了嘗試這個,我們將首先在 Scapy 中構(gòu)建我們的請求棧:
root@KaliLinux:~# scapy Welcome to Scapy (2.2.0)
>>> i = IP()
>>> i.dst = "172.16.36.135"
>>> u = UDP()
>>> 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= domain
len= None
chksum= None
注意渴肉,UDP對象的默認(rèn)源和目標(biāo)端口是域名系統(tǒng)(DNS)冗懦。 這是一種常用的服務(wù),可用于將域名解析為 IP 地址仇祭。 發(fā)送請求是因?yàn)樗怯兄谂袛嗯叮琁P 地址是否與活動主機(jī)相關(guān)聯(lián)。 發(fā)送此請求的示例可以在以下命令中看到:
>>> reply = sr1(request,timeout=1,verbose=1)
Begin emission:
Finished to send 1 packets.
Received 7 packets, got 0 answers, remaining 1 packets
盡管與目標(biāo) IP 地址相關(guān)的主機(jī)是活動的乌奇,但我們沒有收到響應(yīng)没讲。 諷刺的是,缺乏響應(yīng)實(shí)際上是由于 DNS 服務(wù)正在目標(biāo)系統(tǒng)上使用礁苗。這是因?yàn)榛顒臃?wù)通常配置為僅響應(yīng)包含特定內(nèi)容的請求爬凑。 你可能會自然想到,有時可以嘗試通過探測未運(yùn)行服務(wù)的 UDP 端口來高效識別主機(jī)试伙,假設(shè) ICMP 流量未被防火墻阻止嘁信。 現(xiàn)在于样,我們嘗試將同一請求發(fā)送到不在使用的不同 UDP 端口:
>>> u.dport = 123
>>> request = (i/u)
>>> reply = sr1(request,timeout=1,verbose=1)
Begin emission: Finished to send 1 packets.
Received 5 packets, got 1 answers, remaining 0 packets
>>> reply.display()
###[ IP ]###
version= 4L
ihl= 5L
tos= 0xc0
len= 56
id= 62614
flags=
frag= 0L
ttl= 64
proto= icmp
chksum= 0xe412
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
通過將請求目標(biāo)更改為端口 123,然后重新發(fā)送它潘靖,我們現(xiàn)在會收到一個響應(yīng)穿剖,表明目標(biāo)端口不可達(dá)。如果檢查此響應(yīng)的源 IP 地址秘豹,你可以看到它是從發(fā)送原始請求的主機(jī)發(fā)送的携御。此響應(yīng)隨后表明原始目標(biāo) IP 地址處的主機(jī)處于活動狀態(tài)。不幸的是既绕,在這些情況下并不總是返回響應(yīng)啄刹。這種技術(shù)的效率在很大程度上取決于你正在探測的系統(tǒng)及其配置。正因?yàn)槿绱似喾罚琔DP 發(fā)現(xiàn)通常比 TCP 發(fā)現(xiàn)更難執(zhí)行誓军。它從來不會像發(fā)送帶有單個標(biāo)志的 TCP 數(shù)據(jù)包那么簡單。在服務(wù)確實(shí)存在的情況下疲扎,通常需要服務(wù)特定的探測昵时。幸運(yùn)的是,有各種相當(dāng)復(fù)雜的 UDP 掃描工具椒丧,可以使用各種 UDP 請求和服務(wù)特定的探針壹甥,來確定活動主機(jī)是否關(guān)聯(lián)了任何給定的IP地址。
工作原理
這里提供的示例使用 UDP 和 TCP 發(fā)現(xiàn)方式壶熏。 我們能夠使用 Scapy 來制作自定義請求句柠,來使用這些協(xié)議識別活動主機(jī)。 在 TCP 的情況下棒假,我們構(gòu)造了自定義的 ACK 封包并將其發(fā)送到每個目標(biāo)系統(tǒng)上的任意端口溯职。 在接收到 RST 應(yīng)答的情況下,系統(tǒng)被識別為活動的帽哑。 或者谜酒,空的 UDP 請求被發(fā)送到任意端口,來嘗試請求 ICMP 端口不可達(dá)響應(yīng)妻枕。 響應(yīng)可用作活動系統(tǒng)的標(biāo)識僻族。 然后這些技術(shù)中的每一個都可以在 Python 腳本中使用,來對多個主機(jī)或地址范圍執(zhí)行發(fā)現(xiàn)佳头。
2.12 使用 Nmap 探索第四層
除了集成到 Nmap 工具中的許多其他掃描功能鹰贵,還有一個選項(xiàng)用于執(zhí)行第四層發(fā)現(xiàn)。 這個具體的秘籍演示了如何使用 Nmap 執(zhí)行 TCP 和 UDP 協(xié)議的第4層發(fā)現(xiàn)康嘉。
準(zhǔn)備
使用 Nmap 執(zhí)行第四層發(fā)現(xiàn)不需要實(shí)驗(yàn)環(huán)境碉输,因?yàn)?Internet 上的許多系統(tǒng)都將回復(fù) TCP 和 UDP 請求。但是亭珍,強(qiáng)烈建議你只在您自己的實(shí)驗(yàn)環(huán)境中執(zhí)行任何類型的網(wǎng)絡(luò)掃描敷钾,除非你完全熟悉您受到任何管理機(jī)構(gòu)施加的法律法規(guī)枝哄。如果你希望在實(shí)驗(yàn)環(huán)境中執(zhí)行此技術(shù),你需要至少有一個響應(yīng) TCP/UDP 請求的系統(tǒng)阻荒。在提供的示例中挠锥,使用 Linux 和 Windows 系統(tǒng)的組合。有關(guān)在本地實(shí)驗(yàn)環(huán)境中設(shè)置系統(tǒng)的更多信息侨赡,請參閱第一章中的“安裝 Metasploitable2”和“安裝 Windows Server”秘籍蓖租。此外,本節(jié)還需要使用文本編輯器(如 VIM 或 Nano)將腳本寫入文件系統(tǒng)羊壹。有關(guān)編寫腳本的更多信息蓖宦,請參閱第一章中的“使用文本編輯器(VIM 和 Nano)”秘籍。
操作步驟
在 Nmap 中有一些選項(xiàng)用于發(fā)現(xiàn)運(yùn)行 TCP 和 UDP 的主機(jī)油猫。 Nmap 的 UDP 發(fā)現(xiàn)已配置為稠茂,使用必需的唯一載荷來觸發(fā)無響應(yīng)的服務(wù)。 為了使用 UDP 執(zhí)行發(fā)現(xiàn)掃描情妖,請使用-PU
選項(xiàng)和端口來測試:
root@KaliLinux:~# nmap 172.16.36.135 -PU53 -sn
Starting Nmap 6.25 ( http://nmap.org ) at 2013-12-11 20:11 EST
Nmap scan report for 172.16.36.135 Host is up (0.00042s latency).
MAC Address: 00:0C:29:3D:84:32 (VMware)
Nmap done: 1 IP address (1 host up) scanned in 0.13 seconds
This UDP discovery scan can also be modified to perform a scan of a sequential range by using dash notation. In the example provided, we will scan the entire 172.16.36.0/24 address range:
root@KaliLinux:~# nmap 172.16.36.0-255 -PU53 -sn
Starting Nmap 6.25 ( http://nmap.org ) at 2013-12-17 06:33 EST
Nmap scan report for 172.16.36.1
Host is up (0.00020s latency).
MAC Address: 00:50:56:C0:00:08 (VMware)
Nmap scan report for 172.16.36.2
Host is up (0.00018s latency).
MAC Address: 00:50:56:FF:2A:8E (VMware)
Nmap scan report for 172.16.36.132
Host is up (0.00037s latency).
MAC Address: 00:0C:29:65:FC:D2 (VMware)
Nmap scan report for 172.16.36.135
Host is up (0.00041s latency).
MAC Address: 00:0C:29:3D:84:32 (VMware)
Nmap scan report for 172.16.36.180
Host is up.
Nmap scan report for 172.16.36.254
Host is up (0.00015s latency).
MAC Address: 00:50:56:EB:E1:8A (VMware)
Nmap done: 256 IP addresses (6 hosts up) scanned in 3.91 seconds
與之類似睬关,也可以對輸入列表所定義的一系列 IP 地址執(zhí)行 Nmap UDP ping 請求。 在提供的示例中毡证,我們使用同一目錄中的iplist.txt
文件來掃描以下列出的每個主機(jī):
root@KaliLinux:~# nmap -iL iplist.txt -sn -PU53
Starting Nmap 6.25 ( http://nmap.org ) at 2013-12-17 06:36 EST
Nmap scan report for 172.16.36.2
Host is up (0.00015s latency).
MAC Address: 00:50:56:FF:2A:8E (VMware)
Nmap scan report for 172.16.36.1
Host is up (0.00024s latency).
MAC Address: 00:50:56:C0:00:08 (VMware)
Nmap scan report for 172.16.36.135
Host is up (0.00029s latency).
MAC Address: 00:0C:29:3D:84:32 (VMware)
Nmap scan report for 172.16.36.132
Host is up (0.00030s latency).
MAC Address: 00:0C:29:65:FC:D2 (VMware)
Nmap scan report for 172.16.36.180
Host is up.
Nmap scan report for 172.16.36.254
Host is up (0.00021s latency).
MAC Address: 00:50:56:EB:E1:8A (VMware)
Nmap done: 6 IP addresses (6 hosts up) scanned in 0.31 seconds
盡管來自這些示例中的每一個的輸出表明發(fā)現(xiàn)了六個主機(jī)电爹,但是這不一定標(biāo)識六個主機(jī)都通過 UDP 發(fā)現(xiàn)方法被發(fā)現(xiàn)。 除了在 UDP 端口 53 上執(zhí)行的探測之外料睛,Nmap 還將利用任何其它發(fā)現(xiàn)技術(shù)藐不,來發(fā)現(xiàn)在指定范圍內(nèi)或在輸入列表內(nèi)的主機(jī)。 雖然-sn
選項(xiàng)有效防止了 Nmap 執(zhí)行 TCP 端口掃描秦效,但它不會完全隔離我們的 UDP ping 請求。 雖然沒有有效的方法來隔離這個任務(wù)涎嚼,你可以通過分析 Wireshark 或 TCPdump 中的流量阱州,來確定通過 UDP 請求發(fā)現(xiàn)的主機(jī)。 或者法梯,Nmap 也可以用于以 Scapy 的相同方式苔货,來執(zhí)行 TCP ACK ping。 為了使用 ACK 數(shù)據(jù)包識別活動主機(jī)立哑,請結(jié)合你要使用的端口使用-PA
選項(xiàng):
root@KaliLinux:~# nmap 172.16.36.135 -PA80 -sn
Starting Nmap 6.25 ( http://nmap.org ) at 2013-12-11 20:09 EST
Nmap scan report for 172.16.36.135
Host is up (0.00057s latency).
MAC Address: 00:0C:29:3D:84:32 (VMware)
Nmap done: 1 IP address (1 host up) scanned in 0.21 seconds
TCP ACK ping 發(fā)現(xiàn)方法還可以使用破折號符號在一定范圍的主機(jī)上執(zhí)行夜惭,或者可以基于輸入列表在指定的主機(jī)地址上執(zhí)行:
root@KaliLinux:~# nmap 172.16.36.0-255 -PA80 -sn
Starting Nmap 6.25 ( http://nmap.org ) at 2013-12-17 06:46 EST
Nmap scan report for 172.16.36.132
Host is up (0.00033s latency).
MAC Address: 00:0C:29:65:FC:D2 (VMware)
Nmap scan report for 172.16.36.135
Host is up (0.00013s latency).
MAC Address: 00:0C:29:3D:84:32 (VMware)
Nmap scan report for 172.16.36.180
Host is up.
Nmap done: 256 IP addresses (3 hosts up) scanned in 3.43 seconds
root@KaliLinux:~# nmap -iL iplist.txt -PA80 -sn
Starting Nmap 6.25 ( http://nmap.org ) at 2013-12-17 06:47 EST
Nmap scan report for 172.16.36.135
Host is up (0.00033s latency).
MAC Address: 00:0C:29:3D:84:32 (VMware)
Nmap scan report for 172.16.36.132
Host is up (0.00029s latency).
MAC Address: 00:0C:29:65:FC:D2 (VMware)
Nmap scan report for 172.16.36.180
Host is up.
Nmap done: 3 IP addresses (3 hosts up) scanned in 0.31 seconds
工作原理
Nmap 用于執(zhí)行 TCP 發(fā)現(xiàn)的技術(shù)的基本原理,與 Scapy 用于執(zhí)行 TCP 發(fā)現(xiàn)的技術(shù)相同铛绰。 Nmap 向目標(biāo)系統(tǒng)上的任意端口發(fā)送一系列 TCP ACK 數(shù)據(jù)包诈茧,并嘗試請求 RST 響應(yīng)作為活動系統(tǒng)的標(biāo)識。 然而捂掰,Nmap 用于執(zhí)行 UDP 發(fā)現(xiàn)的技術(shù)有點(diǎn)不同于 Scapy 的技術(shù)敢会。 Nmap 不僅僅依賴于可能不一致或阻塞的 ICMP 主機(jī)不可達(dá)響應(yīng)曾沈,而且通過向目標(biāo)端口發(fā)送服務(wù)特定請求,嘗試請求響應(yīng)鸥昏,來執(zhí)行主機(jī)發(fā)現(xiàn)塞俱。
2.13 使用 hping3 來探索第四層
我們之前討論過,使用hping3
來執(zhí)行第3層 ICMP 發(fā)現(xiàn)吏垮。 除了此功能障涯,hping3
還可以用于執(zhí)行 UDP 和 TCP 主機(jī)發(fā)現(xiàn)。 然而膳汪,如前所述唯蝶,hping3
被開發(fā)用于執(zhí)行定向請求,并且需要一些腳本來將其用作有效的掃描工具旅敷。 這個秘籍演示了如何使用hping3
來執(zhí)行 TCP 和 UDP 協(xié)議的第4層發(fā)現(xiàn)生棍。
準(zhǔn)備
使用hping3
執(zhí)行第四層發(fā)現(xiàn)不需要實(shí)驗(yàn)環(huán)境,因?yàn)?Internet 上的許多系統(tǒng)都將回復(fù) TCP 和 UDP 請求媳谁。但是涂滴,強(qiáng)烈建議你只在您自己的實(shí)驗(yàn)環(huán)境中執(zhí)行任何類型的網(wǎng)絡(luò)掃描,除非你完全熟悉您受到任何管理機(jī)構(gòu)施加的法律法規(guī)晴音。如果你希望在實(shí)驗(yàn)環(huán)境中執(zhí)行此技術(shù)柔纵,你需要至少有一個響應(yīng) TCP/UDP 請求的系統(tǒng)。在提供的示例中锤躁,使用 Linux 和 Windows 系統(tǒng)的組合搁料。有關(guān)在本地實(shí)驗(yàn)環(huán)境中設(shè)置系統(tǒng)的更多信息,請參閱第一章中的“安裝 Metasploitable2”和“安裝 Windows Server”秘籍系羞。此外郭计,本節(jié)還需要使用文本編輯器(如 VIM 或 Nano)將腳本寫入文件系統(tǒng)。有關(guān)編寫腳本的更多信息椒振,請參閱第一章中的“使用文本編輯器(VIM 和 Nano)”秘籍昭伸。
操作步驟
與 Nmap 不同,hping3
通過隔離任務(wù)澎迎,能夠輕易識別能夠使用 UDP 探針發(fā)現(xiàn)的主機(jī)庐杨。 通過使用--udp
選項(xiàng)指定 UDP 模式,可以傳輸 UDP 探針來嘗試觸發(fā)活動主機(jī)的回復(fù):
root@KaliLinux:~# hping3 --udp 172.16.36.132
HPING 172.16.36.132 (eth1 172.16.36.132): udp mode set, 28 headers + 0 data bytes
ICMP Port Unreachable from ip=172.16.36.132 name=UNKNOWN status=0 port=2792 seq=0
ICMP Port Unreachable from ip=172.16.36.132 name=UNKNOWN status=0 port=2793 seq=1
ICMP Port Unreachable from ip=172.16.36.132 name=UNKNOWN status=0 port=2794 seq=2 ^F
ICMP Port Unreachable from ip=172.16.36.132 name=UNKNOWN status=0 port=2795 seq=3
^C
--- 172.16.36.132 hping statistic --
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max = 1.8/29.9/113.4 ms
在提供的演示中夹供,Ctrl + C
用于停止進(jìn)程灵份。在 UDP 模式下使用hping3
時,除非在初始命令中定義了特定數(shù)量的數(shù)據(jù)包哮洽,否則將無限繼續(xù)發(fā)現(xiàn)填渠。 為了定義要發(fā)送的嘗試次數(shù),應(yīng)包含-c
選項(xiàng)和一個表示所需嘗試次數(shù)的整數(shù)值:
root@KaliLinux:~# hping3 --udp 172.16.36.132 -c 1
HPING 172.16.36.132 (eth1 172.16.36.132): udp mode set, 28 headers + 0 data bytes
ICMP Port Unreachable from ip=172.16.36.132 name=UNKNOWN status=0 port=2422 seq=0
--- 172.16.36.132 hping statistic --
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 104.8/104.8/104.8 ms
雖然hping3
默認(rèn)情況下不支持掃描多個系統(tǒng),但可以使用 bash 腳本輕易編寫腳本揭蜒。 為了做到這一點(diǎn)横浑,我們必須首先確定與活動地址相關(guān)的輸出,以及與非響應(yīng)地址相關(guān)的輸出之間的區(qū)別屉更。 為此徙融,我們應(yīng)該在未分配主機(jī)的 IP 地址上使用相同的命令:
root@KaliLinux:~# hping3 --udp 172.16.36.131 -c 1
HPING 172.16.36.131 (eth1 172.16.36.131): udp mode set, 28 headers + 0 data bytes
--- 172.16.36.131 hping statistic
--1 packets transmitted, 0 packets received, 100% packet loss
round-trip min/avg/max = 0.0/0.0/0.0 ms
通過識別這些請求中的每一個的相關(guān)響應(yīng),我們可以確定出我們可以grep
的唯一字符串; 此字符串能夠隔離成功的發(fā)現(xiàn)嘗試與失敗的發(fā)現(xiàn)嘗試瑰谜。 在以前的請求中欺冀,你可能已經(jīng)注意到,“ICMP 端口不可達(dá)”的短語僅在返回響應(yīng)的情況下顯示萨脑。 基于此隐轩,我們可以通過對Unreachable
進(jìn)行grep
來提取成功的嘗試。 為了確定此方法在腳本中的有效性渤早,我們應(yīng)該嘗試連接兩個先前的命令职车,然后將輸出傳遞給我們的grep
函數(shù)。 假設(shè)我們選擇的字符串對于成功的嘗試是唯一的鹊杖,我們應(yīng)該只看到與活動主機(jī)相關(guān)的輸出:
root@KaliLiniux:~# hping3 --udp 172.16.36.132 -c 1; hping3 --udp 172.16.36.131 -c 1 | grep "Unreachable"HPING 172.16.36.132 (eth1 172.16.36.132): udp mode set, 28 headers + 0 data bytes
ICMP Port Unreachable from ip=172.16.36.132 name=UNKNOWN status=0 port=2836 seq=0
--- 172.16.36.132 hping statistic --
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 115.2/115.2/115.2 ms
--- 172.16.36.131 hping statistic --
1 packets transmitted, 0 packets received, 100% packet loss
round-trip min/avg/max = 0.0/0.0/0.0 ms
盡管產(chǎn)生了期望的結(jié)果悴灵,在這種情況下,grep
函數(shù)似乎不能有效用于輸出骂蓖。 由于hping3
中的輸出顯示處理积瞒,它難以通過管道傳遞到grep
函數(shù),并只提取所需的行登下,我們可以嘗試通過其他方式解決這個問題茫孔。 具體來說,我們將嘗試確定輸出是否可以重定向到一個文件被芳,然后我們可以直接從文件中grep
缰贝。 為此,我們嘗試將先前使用的兩個命令的輸出傳遞給handle.txt
文件:
root@KaliLinux:~# hping3 --udp 172.16.36.132 -c 1 >> handle.txt
--- 172.16.36.132 hping statistic --
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 28.6/28.6/28.6 ms
root@KaliLinux:~# hping3 --udp 172.16.36.131 -c 1 >> handle.txt
--- 172.16.36.131 hping statistic --
1 packets transmitted, 0 packets received, 100% packet loss
round-trip min/avg/max = 0.0/0.0/0.0 ms
root@KaliLinux:~# ls Desktop handle.txt
root@KaliLinux:~# cat handle.txt
HPING 172.16.36.132 (eth1 172.16.36.132): udp mode set, 28 headers + 0 data bytes
ICMP Port Unreachable from ip=172.16.36.132 name=UNKNOWN status=0 port=2121 seq=0
HPING 172.16.36.131 (eth1 172.16.36.131): udp mode set, 28 headers + 0 data bytes
雖然這種嘗試并不完全成功畔濒,因?yàn)檩敵鰶]有完全重定向到文件揩瞪,我們可以看到通過讀取文件中的輸出,足以創(chuàng)建一個有效的腳本篓冲。 具體來說,我們能夠重定向一個唯一的行宠哄,該行只與成功的ping
嘗試相關(guān)聯(lián)壹将,并且包含該行中相應(yīng)的 IP 地址。 要驗(yàn)證此解決方法是否可行毛嫉,我們需要嘗試循環(huán)訪問/ 24
范圍中的每個地址诽俯,然后將結(jié)果傳遞到handle.txt
文件:
root@KaliLinux:~# for addr in $(seq 1 254); do hping3 --udp 172.16.36.$addr -c 1 >> handle.txt; done
--- 172.16.36.1 hping statistic --
1 packets transmitted, 0 packets received, 100% packet loss
round-trip min/avg/max = 0.0/0.0/0.0 ms
--- 172.16.36.2 hping statistic --
1 packets transmitted, 0 packets received, 100% packet loss
round-trip min/avg/max = 0.0/0.0/0.0 ms
--- 172.16.36.3 hping statistic --
1 packets transmitted, 0 packets received, 100% packet loss
round-trip min/avg/max = 0.0/0.0/0.0 ms
通過這樣做,仍然有大量的輸出(提供的輸出為了方便而被截?cái)啵┌粗囟ㄏ虻轿募妮敵觥?但是,以下腳本的成功不取決于初始循環(huán)的過多輸出暴区,而是取決于從輸出文件中提取必要信息的能力:
root@KaliLinux:~# ls
Desktop handle.txt
root@KaliLinux:~# grep Unreachable handle.txt
ICMP Port Unreachable from ip=172.16.36.132 HPING 172.16.36.133 (eth1 172.16.36.133): udp mode set, 28 headers + 0 data bytes
ICMP Port Unreachable from ip=172.16.36.135 HPING 172.16.36.136 (eth1 172.16.36.136): udp mode set, 28 headers + 0 data bytes
完成掃描循環(huán)后闯团,可以使用ls
命令在當(dāng)前目錄中確定輸出文件,然后可以直接從此文件中對Unreachable
的唯一字符串進(jìn)行grep
仙粱,如下一個命令所示房交。 在輸出中,我們可以看到伐割,列出了通過 UDP 探測發(fā)現(xiàn)的每個活動主機(jī)候味。 此時,剩下的唯一任務(wù)是從此輸出中提取 IP 地址隔心,然后將此整個過程重新創(chuàng)建為單個功能腳本:
root@KaliLinux:~# grep Unreachable handle.txt
ICMP Port Unreachable from ip=172.16.36.132
HPING 172.16.36.133 (eth1 172.16.36.133): udp mode set, 28 headers + 0 data bytes
ICMP Port Unreachable from ip=172.16.36.135
HPING 172.16.36.136 (eth1 172.16.36.136): udp mode set, 28 headers + 0 data bytes
root@KaliLinux:~# grep Unreachable handle.txt | cut -d " " -f 5 ip=172.16.36.132 ip=172.16.36.135
root@KaliLinux:~# grep Unreachable handle.txt | cut -d " " -f 5 | cut -d "=" -f 2 172.16.36.132 172.16.36.135
通過將輸出使用管道連接到一系列cut
函數(shù)白群,我們可以從輸出中提取 IP 地址。 現(xiàn)在我們已經(jīng)成功地確定了一種方法硬霍,來掃描多個主機(jī)并輕易識別結(jié)果帜慢,我們應(yīng)該將其集成到一個腳本中。 將所有這些操作組合在一起的功能腳本的示例如下:
#!/bin/bash
if [ "$#" -ne 1 ]; then
echo "Usage - ./udp_sweep.sh [/24 network address]"
echo "Example - ./udp_sweep.sh 172.16.36.0"
echo "Example will perform a UDP ping sweep of the 172.16.36.0/24 network and output to an output.txt file"
exit
fi
prefix=$(echo $1 | cut -d '.' -f 1-3)
for addr in $(seq 1 254); do
hping3 $prefix.$addr --udp -c 1 >> handle.txt;
done
grep Unreachable handle.txt | cut -d " " -f 5 | cut -d "=" -f 2 >> output.txt
rm handle.txt
在提供的 bash 腳本中唯卖,第一行定義了 bash 解釋器的位置粱玲。 接下來的代碼塊執(zhí)行測試來確定是否提供了預(yù)期的一個參數(shù)。 這通過評估提供的參數(shù)的數(shù)量是否不等于 1 來確定耐床。如果未提供預(yù)期參數(shù)密幔,則輸出腳本的用法,并且退出腳本撩轰。 用法輸出表明胯甩,腳本需要接受/ 24
網(wǎng)絡(luò)地址作為參數(shù)。 下一行代碼從提供的網(wǎng)絡(luò)地址中提取網(wǎng)絡(luò)前綴堪嫂。 例如偎箫,如果提供的網(wǎng)絡(luò)地址是192.168.11.0
,則前綴變量將被賦值為192.168.11
皆串。 然后對/ 24
范圍內(nèi)的每個地址執(zhí)行hping3
操作淹办,并將每個任務(wù)的結(jié)果輸出放入handle.txt
文件中。
root@KaliLinux:~# ./udp_sweep.sh
Usage - ./udp_sweep.sh [/24 network address]
Example - ./udp_sweep.sh 172.16.36.0
Example will perform a UDP ping sweep of the 172.16.36.0/24 network and output to an output.txt file
root@KaliLinux:~# ./udp_sweep.sh 172.16.36.0
--- 172.16.36.1 hping statistic --
1 packets transmitted, 0 packets received, 100% packet loss
round-trip min/avg/max = 0.0/0.0/0.0 ms
--- 172.16.36.2 hping statistic --
1 packets transmitted, 0 packets received, 100% packet loss
round-trip min/avg/max = 0.0/0.0/0.0 ms
--- 172.16.36.3 hping statistic --
1 packets transmitted, 0 packets received, 100% packet loss
round-trip min/avg/max = 0.0/0.0/0.0 ms
*** {TRUNCATED} ***
root@KaliLinux:~# ls output.txt
output.txt
root@KaliLinux:~# cat output.txt
172.16.36.132
172.16.36.135
172.16.36.253
當(dāng)腳本運(yùn)行時恶复,你仍然會看到在初始循環(huán)任務(wù)時看到的大量輸出怜森。 幸運(yùn)的是,你發(fā)現(xiàn)的主機(jī)列表不會在此輸出中消失谤牡,因?yàn)樗看味紩懭肽愕妮敵鑫募?/p>
你還可以使用hping3
執(zhí)行 TCP 發(fā)現(xiàn)副硅。 TCP 模式實(shí)際上是hping3
使用的默認(rèn)發(fā)現(xiàn)模式,并且可以通過將要掃描的 IP 地址傳遞到hping3
來使用此模式:
root@KaliLinux:~# hping3 172.16.36.132
HPING 172.16.36.132 (eth1 172.16.36.132): NO FLAGS are set, 40 headers + 0 data bytes
len=46 ip=172.16.36.132 ttl=64 DF id=0 sport=0 flags=RA seq=0 win=0 rtt=3.7 ms
len=46 ip=172.16.36.132 ttl=64 DF id=0 sport=0 flags=RA seq=1 win=0 rtt=0.7 ms
len=46 ip=172.16.36.132 ttl=64 DF id=0 sport=0 flags=RA seq=2 win=0 rtt=2.6 ms
^C
--- 172.16.36.132 hping statistic --
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.7/2.3/3.7 ms
我們之前創(chuàng)建一個bash腳本循環(huán)訪問/ 24
網(wǎng)絡(luò)并使用hping3
執(zhí)行 UDP 發(fā)現(xiàn)翅萤,與之相似恐疲,我們可以為 TCP 發(fā)現(xiàn)創(chuàng)建一個類似的腳本。 首先,必須確定唯一短語培己,它存在于活動主機(jī)的相關(guān)輸出中碳蛋,但不在非響應(yīng)主機(jī)的相關(guān)輸出中。 為此省咨,我們必須評估每個響應(yīng):
root@KaliLinux:~# hping3 172.16.36.132 -c 1
HPING 172.16.36.132 (eth1 172.16.36.132): NO FLAGS are set, 40 headers + 0 data bytes
len=46 ip=172.16.36.132 ttl=64 DF id=0 sport=0 flags=RA seq=0 win=0 rtt=3.4 ms
--- 172.16.36.132 hping statistic --
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 3.4/3.4/3.4 ms
root@KaliLinux:~# hping3 172.16.36.131 -c 1
HPING 172.16.36.131 (eth1 172.16.36.131): NO FLAGS are set, 40 headers + 0 data bytes
--- 172.16.36.131 hping statistic --
1 packets transmitted, 0 packets received, 100% packet loss
round-trip min/avg/max = 0.0/0.0/0.0 ms
在這種情況下肃弟,長度值僅存在于活動主機(jī)的相關(guān)輸出中。 再一次茸炒,我們可以開發(fā)一個腳本愕乎,將輸出重定向到臨時handle
文件,然后grep
此文件的輸出來確定活動主機(jī):
#!/bin/bash
if [ "$#" -ne 1 ]; then
echo "Usage - ./tcp_sweep.sh [/24 network address]"
echo "Example - ./tcp_sweep.sh 172.16.36.0"
echo "Example will perform a TCP ping sweep of the 172.16.36.0/24 network and output to an output.txt file"
exit
fi
prefix=$(echo $1 | cut -d '.' -f 1-3)
for addr in $(seq 1 254); do
hping3 $prefix.$addr -c 1 >> handle.txt;
done
grep len handle.txt | cut -d " " -f 2 | cut -d "=" -f 2 >> output.txt
rm handle.txt
此腳本的執(zhí)行方式類似于 UDP 發(fā)現(xiàn)腳本壁公。 唯一的區(qū)別是在循環(huán)序列中執(zhí)行的命令感论,grep
值和提取 IP 地址的過程。 執(zhí)行后紊册,此腳本將生成一個output.txt
文件比肄,其中將包含使用 TCP 發(fā)現(xiàn)方式來發(fā)現(xiàn)的主機(jī)的相關(guān) IP 地址列表。
root@KaliLinux:~# ./tcp_sweep.sh
Usage - ./tcp_sweep.sh [/24 network address]
Example - ./tcp_sweep.sh 172.16.36.0
Example will perform a TCP ping sweep of the 172.16.36.0/24 network and output to an output.txt file
root@KaliLinux:~# ./tcp_sweep.sh 172.16.36.0
--- 172.16.36.1 hping statistic --
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 0.4/0.4/0.4 ms
--- 172.16.36.2 hping statistic --
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 0.6/0.6/0.6 ms
--- 172.16.36.3 hping statistic --
1 packets transmitted, 0 packets received, 100% packet loss
round-trip min/avg/max = 0.0/0.0/0.0 ms
*** {TRUNCATED} ***
你可以使用ls
命令確認(rèn)輸出文件是否已寫入執(zhí)行目錄囊陡,并使用cat
命令讀取其內(nèi)容芳绩。 這可以在以下示例中看到:
root@KaliLinux:~# ls output.txt
output.txt
root@KaliLinux:~# cat output.txt
172.16.36.1
172.16.36.2
172.16.36.132
172.16.36.135
172.16.36.253
工作原理
在提供的示例中,hping3
使用 ICMP 主機(jī)不可達(dá)響應(yīng)撞反,來標(biāo)識具有 UDP 請求的活動主機(jī)妥色,并使用空標(biāo)志掃描來標(biāo)識具有 TCP 請求的活動主機(jī)。 對于 UDP 發(fā)現(xiàn)遏片,一系列空 UDP 請求被發(fā)送到任意目標(biāo)端口嘹害,來試圖請求響應(yīng)。 對于 TCP 發(fā)現(xiàn)吮便,一系列 TCP 請求被發(fā)送到目的端口 0笔呀,并沒有激活標(biāo)志位。 所提供的示例請求激活了 ACK + RST 標(biāo)志的響應(yīng)髓需。 這些任務(wù)中的每一個都傳遞給了 bash 中的循環(huán)许师,來在多個主機(jī)或一系列地址上執(zhí)行掃描。