主機發(fā)現(xiàn)指的是從網(wǎng)絡中尋找活躍主機的過程管呵。該過程的關注點不在于如何獲取目標的詳細信息,而是在盡量減少資源消耗的情況下哺窄,獲得目標們在邏輯上的分布捐下。
OSI 模型
OSI 模型(即 Open Systems Interconnection model 開放式系統(tǒng)互聯(lián)通信參考模型),由國際標準化組織(ISO)提出萌业,是一個試圖使各種網(wǎng)絡設備在世界范圍內(nèi)互聯(lián)通信的標準框架坷襟。該模型將計算機網(wǎng)絡體系結(jié)構(gòu)劃分為7層,如下圖所示:
本文涉及到的主機探測方法生年,主要利用了定義在 Layer 2婴程,3 和 4 上的網(wǎng)絡協(xié)議。
1. Layer 2(ARP)
- 優(yōu)勢
- 非潮瘢快速
- 高可信度
- 劣勢
- 不能探測遠程系統(tǒng)(ARP 屬于不可路由協(xié)議)
ARP(Address Resolution Protocol 地址解析協(xié)議)是通過解析網(wǎng)路層(Layer 3)地址來找尋數(shù)據(jù)鏈路層(Layer 2)地址的一個重要的網(wǎng)絡傳輸協(xié)議阳啥,即將 Layer 3 中邏輯性的 IP 地址翻譯成 Layer 2 中物理性的 MAC 地址嚼沿。
發(fā)起查詢的主機先在本地網(wǎng)絡中廣播一條 ARP 請求旦袋,符合該查詢的主機則直接返回一條包含其 MAC 地址的 ARP 回復霸饲,收到回復后的主機會更新保存在本地的 ARP 緩存并開啟兩者間的網(wǎng)絡通信。該過程不使用任何形式的身份驗證和授權(quán)患亿。
命令示例
# nmap -sn 10.1.87.0-255
# nmap -sn 10.1.87.0/24
# nmap -iL iplist.txt -sn
-sn 選項同 -sP传蹈,即關閉默認的端口掃描,只執(zhí)行 Ping 掃描步藕,這在主機發(fā)現(xiàn)時可以節(jié)省很多時間惦界。從表面上看,執(zhí)行的 Ping 掃描屬于 Layer 3 上的協(xié)議漱抓。這里 nmap 會根據(jù)提供的 IP 地址自動判定是否為本地子網(wǎng)表锻,對本地子網(wǎng)發(fā)送 ARP 請求恕齐,對遠程網(wǎng)絡則執(zhí)行 Ping 掃描乞娄。如下圖(本地子網(wǎng)):
輸出內(nèi)容包括活躍主機的 IP 地址、網(wǎng)絡延遲显歧、MAC 地址及對應的硬件廠商仪或。
WireShark 捕獲到的流量信息:
當探測的 IP 地址不屬于本地子網(wǎng)時,則執(zhí)行 Ping 掃描(輸出信息無 MAC 地址)士骤,輸出如下:
WireShark 捕獲到的流量信息:
2. Layer 3(ICMP)
- 優(yōu)勢
- 可探測遠程系統(tǒng)(可路由協(xié)議)
- 相對較快
- 劣勢
- 比 ARP 慢
- 可能被防火墻攔截
Layer 3 上的 ICMP 探測是最為人熟知的掃描手段(ping 命令總用過的吧)范删。ICMP 代表 Internet Control Message Protocol(互聯(lián)網(wǎng)控制消息協(xié)議),它的功能之一拷肌,就是通過向目標主機發(fā)送 ICMP echo 請求到旦,看是否收到 echo 響應旨巷,來確定其是否處于活躍狀態(tài)。如 Ping 命令的輸出:
返回結(jié)果中包括信號往返時間和(信息)包丟失情況的統(tǒng)計信息添忘。
前面已經(jīng)提到過采呐,nmap 的 Ping 掃描可以根據(jù) IP 地址自行在 ARP 和 ICMP 協(xié)議間切換,不需要額外的選項搁骑。
3. Layer 4(TCP)
- 優(yōu)勢
- 可探測遠程系統(tǒng)
- 比 ICMP 更可靠
- 劣勢
- 有時防火墻會導致異常結(jié)果
- 全局掃描會非常耗時
TCP 掃描的原理在于斧吐,一條單獨的 TCP Finish(FIN) 包或者 Acknowledge(ACK) 包通常會觸發(fā)遠程主機的 Reset(RST) 響應,而發(fā)送至遠程主機的 Synchronize(SYN) 包通常會觸發(fā) SYN+ACK 或者 RST 響應(取決于被掃描端口的開放情況)仲器。重點在于煤率,來自指定主機的任何響應都可以確定該主機處于存活狀態(tài)。
當目標主機所有的 TCP 服務都被防火墻隔離時乏冀,UDP 掃描有時就顯得極為有效蝶糯。但有些 UDP 服務回復的是 ICMP 端口不可達響應,而這類響應會被高防護的防火墻阻止辆沦。另一些 UDP 服務則只對特定的請求作出響應裳涛,使得有效的 UDP 掃描需要針對不同的服務采用針對性的技術(shù)。
命令示例
- UDP 掃描
# nmap 10.1.87.0-255 -PU53 -sn
- TCP 掃描(發(fā)送 ACK 包)
# nmap 10.1.87.0/24 -PA80 -sn
附:
1. TCP & UDP
在 OSI 模型中众辨,IP 協(xié)議位于網(wǎng)路層(Layer 3)端三,它可以提供尋址、數(shù)據(jù)報路由及其他功能鹃彻,將一臺設備連接至另外一臺設備郊闯。TCP 協(xié)議位于傳輸層(Layer 4),負責管理連接以及各設備間數(shù)據(jù)的穩(wěn)定傳輸蛛株。
TCP 是一種連接導向(connection-oriented)的協(xié)議团赁。在 TCP 傳輸數(shù)據(jù)之前,客戶端和服務端之間需要通過一種三步握手的機制來創(chuàng)建連接谨履。過程如下:
- 客戶端通過向服務端發(fā)送一個包含 SYN(synchronize)標志的數(shù)據(jù)包來初始化連接欢摄,在 SYN 字段中包含了一個隨機的初始序列號(ISN)。
- 接著服務端向客戶端同樣回復一個 SYN 包(其中有它自己的 ISN)笋粟。同時服務端發(fā)送一個 ACK(acknowledge)包來告訴客戶端自己收到了前面的信息怀挠。該 ACK 報文中包含了客戶端的 ISN+1 的值。
- 客戶端發(fā)送一個 ACK 包(包含 服務端的 ISN+1)來告知服務端害捕,自己已收到消息绿淋。此時,兩者之間才開始交換數(shù)據(jù)尝盼。
當連接關閉時:
- 客戶端發(fā)送一個包含 FIN(finish)標志的數(shù)據(jù)包吞滞。
- 服務端發(fā)送 ACK 包表示自己已收到。
- 當服務端準備好關閉時盾沫,它會發(fā)送一個 FIN 包裁赠。
-
客戶端發(fā)送 ACK 包表示自己已收到殿漠。
開啟連接的過程可參考下圖:
TCP handshake
TCP 是一種強調(diào)數(shù)據(jù)完整性的協(xié)議。通過上述機制佩捞,在傳輸過程中若有一個包丟失凸舵,TCP 會自動重新傳輸(直到接收者發(fā)出 ACK 包)。如果數(shù)據(jù)包到達時次序錯誤失尖,TCP 會對它們進行重排啊奄,之后才交給應用程序。
所以傳輸文件或者重要數(shù)據(jù)如 HTTP 和 FTP 都是用的 TCP 協(xié)議掀潮。
UDP 屬于非連接導向(connectionless)的協(xié)議菇夸。在傳輸數(shù)據(jù)之前,他不需要先創(chuàng)建一個 UDP 連接仪吧。如果發(fā)生丟包庄新,UDP 也不會重復發(fā)送(丟失包的重發(fā)根據(jù)情況由應用程序來完成)。
所以像視頻流等可以承受丟包損失的多媒體應用常通過 UDP 傳輸薯鼠。常見的使用 UDP 的應用:DNS择诈、DHCP、SNMP 等出皇。
2. TCP表頭格式
參考書籍及文章:
Kali Linux Network Scanning Cookbook by Justin Hutchens
TCP 三向交握 (Three-way Handshake)