嗅探與偽造原理
嗅探
程式接收數據包的過程:
1.數據包在傳播介質中流動時,網路中的每個網卡都能收到所有的數據幀,這些數據幀會被複制到網卡的記憶體中,然後檢查目的MAC地址,是否為自己的MAC地址,是,則會通過直接存儲器(DMA)的方式被複制到作業系統內核的快取中,否則拒絕接收。然後網卡會以中斷的方式告訴CPU,接收到了新數據,CPU會將這些數據從快取複製到一個隊列中(鏈路層驅動),為新數據的到來騰出空間。
2.然後通過協議棧,檢查網路層頭部,目的IP地址,目的IP地址不是自己的IP,會進行丟棄,在檢查傳輸層的目的埠,交給相應的程式。會依次去掉各層的頭部,交給程式的是數據部分。
如下圖:
Q: Sniffer程式位於用戶空間部分,想觀察到完整的(包含首部資訊)、未經處理的、沒有進行丟棄的數據包,怎麼辦?
A: OS內核 為嗅探程式 提供了 一個Raw Socket API ,當數據包到達鏈路層驅動位置,會進行複製,通過raw socket 交給嗅探程式,如果有多個嗅探程式,會複製多份,分別交付。如下圖:
Sniffer程式並不需要獲得所有的報文,可能只需要獲得其中的一小部分報文,比如UDP報文,這裡就需要進行過濾,UNIX系統添加了一個BSD 數據包過濾器(BSD packet filter,BPF),如下圖:
Q:為什麼不在Sniffer程式處過濾,而在OS內核裡面進行過濾?
A: 可以節省資源,在數據包複製之前進行過濾,之後進行複製的數據包相應大大減少。
注意:Sniffer程式,嗅探的是收包的過程。(站在攻擊者的角度)
偽造
正常的應用程式 僅僅向OS 內核提供數據,目的IP地址,目的埠等資訊,其他構造數據包的過程都交給OS內核去完成,而不能隨意的去構造各個包頭。與嗅探一樣,這列也可用raw socket API,進行數據包的構造,然後交給下層,發送出去。如下圖:
注意:該圖是簡化的圖,大體理解一下過程,沒有具體提及OS內核中的鏈路層操作。
另外,進行偽造,一般是發包的過程。(站在攻擊者的角度)
之後會提供相應python、c程式碼。