web安全學習筆記(十一)如何隱藏地掃描端口?

之前的文章重點記錄的是一些應用層的漏洞,由於以後的工作原因,也着手複習和記錄以下偏底層的協議和攻擊手段。

一般黑客在攻擊一個網站前,會進行信息的收集和分析,端口掃描是收集信息的一個重要途徑。
很多人會使用nmap進行端口掃描,然而,在掃描的過程中,會暴露自己的IP地址,有些服務器也會設置IP黑名單,如果掃描次數過多,會導致自己的IP地址被ban。在這種情況下,即使已經掃描出了開發的漏洞,也無法繼續下去了。
那麼爲何端口掃描的過程中會導致IP被ban?如何做到隱藏自己的IP進行端口掃描?需要先從協議入手。
端口是運輸層的概念,而運輸層最常用的協議是TCP和UDP。
我們來看看TCP協議的報頭:
在這裏插入圖片描述
有網絡基礎的人對TCP協議都是相對比較瞭解的,這裏就不再贅述了,重點說一下這裏的標誌位,SYN標誌位代表建立TCP鏈接的發起,ACK代表確認收到了發來的數據包,並且使Acknowledgment 字段有意義。RST代表復位TCP鏈接。那麼在端口掃描的過程中發生了什麼呢?
現在假設需要掃描家裏局域網下的另一臺主機(我的NAS),ip地址是192.168.1.7,而我的主機的ip是192.168.1.9。
這裏測試過程中,使用python 和scapy包進行測試。
scapy包需要進行下載:

pip install scapy

編寫一段python的程序:

from scapy.all import *

ip = IP(dst="192.168.1.7")
tcp = TCP(dport=80)
tcp.flags = "S"
sr1(ip/tcp)

這裏程序的含義是,發送一個SYN包,目的地址是192.168.1.7,端口是80端口(我的NAS上80端口是開放的)
打開wireshark進行抓包,並執行程序,發送SYN。
在這裏插入圖片描述
可以看到,首先,本機(192.168.1.9)向NAS(192.168.1.7)發送了一個SYN包,SYN標記爲1,代表請求建立TCP連接(TCP握手的第一步)
在這裏插入圖片描述
當NAS收到這個數據包時,會返回(SYN,ACK),代表收到了之前的數據包,並且請求建立連接。
在這裏插入圖片描述
上述是當一個端口開放時,TCP連接建立的情況,那麼如果請求的端口沒有開放呢?
修改程序,請求的端口爲65533:

from scapy.all import *

ip = IP(dst="192.168.1.7")
tcp = TCP(dport=65533)
tcp.flags = "S"
sr1(ip/tcp)

打開wireshark進行監聽,並且運行程序。
在這裏插入圖片描述
可以看到,如果一個端口沒有開放的話,服務器會返回一個一個(RST,ACK)數據包
在這裏插入圖片描述
其中,標誌位被設置成了1。所以在端口掃描的過程中,可以對TCP返回數據包的標誌位進行檢查,來判斷是否開放了某個端口。但是,正如之前所說的,在這個過程中,我們自己的源IP已經被記錄在了數據包中,這樣容易導致IP被ban,如果直接修改數據包中的源IP,那麼服務器就不會把第二次握手的數據包發送回來了,那麼要如何進行“隱藏地”端口掃描呢?

假設我們有一臺肉雞,可以實現這樣的功能:

  • 肉雞可以向不同的IP地址發送數據包
  • 肉雞會記錄發送的數據包編號(ID)
  • 每發送一個數據包(無論發送到哪個IP地址),數據包編號+1
    基於這樣一臺肉雞,就可以實現隱藏地端口掃描了,原理如圖所示:
    在這裏插入圖片描述
    執行隱藏端口掃描地過程如下:
  1. 本地主機不斷地發送特殊地數據包給肉雞,肉雞每收到這樣特殊地數據包,會返回一個數據包,並且ID不斷增加,3.4.5。
  2. 本地主機向目標主機發送一個SYN的數據包,並且將數據包中的源地址設置爲肉雞的IP地址。
  3. 如果端口是關閉的,目標主機會回覆一個(RST,ACK)數據包,(收到RST數據包並不會發生三次握手!),此時肉雞不會給目標主機發送數據包。本地主機再給肉雞發送一個特殊數據包,發現返回ID爲6(上一個收到的數據包ID爲5),說明剛纔掃描的端口是關閉的。
  4. 如果端口是打開的,目標主機會回覆一個(SYN,AKC)數據包,由於肉雞沒有這個TCP連接的狀態,那麼會回覆一個(RST)數據包,並且使ID+1,(ID=8)。此時本地主機再發送一個特殊數據包,發現返回的ID爲9(上一個收到的數據包ID爲7),說明掃描的這個端口是打開的。

通過這種方式,本地主機既掃描了目標主機的端口,又沒有暴露自己的IP地址,完成了隱藏地端口掃描!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章