返回文章列表

Python 資安攻防實戰應用

本文探討 Python 在資安攻防中的實戰應用,涵蓋網路掃描、DNS 探索及防禦措施等導向。文章以 Scapy 和 dns.resolver 等函式庫為例,演示 SYN 掃描、DNS 查詢和網路流量監控的程式碼實作,並解析程式碼邏輯及防禦策略,提供網路安全技術的實務參考。

資安 Web 開發

Python 在資安領域應用廣泛,從網路掃描、DNS 探索到流量監控,都能藉由其豐富的函式庫和易學易用的特性提升效率。本文將著重於 Scapy 和 dns.resolver 函式庫的應用,示範如何進行 SYN 掃描、DNS 查詢和網路流量監控,並提供程式碼解析和防禦策略建議,協助讀者深入理解 Python 在資安攻防中的實戰技巧。

Python在資安攻防中的應用

前言

Python是一種功能強大的程式語言,廣泛應用於網路安全領域。無論是攻擊者還是防禦者,都可以利用Python實作各種目的。本篇文章將探討Python在資安攻防中的應用,涵蓋攻擊與防禦兩大導向。

使用Python進行網路掃描

使用Scapy進行SYN掃描

Scapy是一款強大的網路封包處理工具,可以用於網路掃描、監控等任務。以下是一個簡單的SYN掃描範例:

from scapy.all import *

def syn_scan(target_ip, target_port):
    # 建立SYN封包
    packet = IP(dst=target_ip)/TCP(dport=target_port, flags='S')
    # 傳送封包並接收回應
    response = sr1(packet, timeout=1, verbose=0)
    # 判斷回應是否為SYN-ACK
    if response and response.haslayer(TCP) and response.getlayer(TCP).flags == 0x12:
        print(f"Port {target_port} is open")
    else:
        print(f"Port {target_port} is closed")

# 設定目標IP和埠號
target_ip = "192.168.1.100"
target_port = 80
# 執行SYN掃描
syn_scan(target_ip, target_port)

內容解密:

  1. from scapy.all import *:匯入Scapy的所有模組,以便使用其功能。
  2. def syn_scan(target_ip, target_port):定義一個名為syn_scan的函式,接受目標IP和埠號作為引數。
  3. packet = IP(dst=target_ip)/TCP(dport=target_port, flags='S'):建立一個SYN封包,目標為指定的IP和埠號。
  4. response = sr1(packet, timeout=1, verbose=0):傳送封包並接收回應,設定逾時為1秒且不顯示詳細資訊。
  5. if response and response.haslayer(TCP) and response.getlayer(TCP).flags == 0x12:檢查回應是否為SYN-ACK封包,以判斷埠是否開啟。

使用Python進行DNS探索

進行DNS查詢

DNS(Domain Name System)是網際網路的基礎設施之一,用於將網域名稱解析為IP位址。以下是一個簡單的DNS查詢範例:

import dns.resolver

def dns_lookup(domain):
    try:
        answers = dns.resolver.resolve(domain, 'A')
        for rdata in answers:
            print(f"{domain} -> {rdata.address}")
    except dns.resolver.NoAnswer:
        print(f"No A record found for {domain}")

# 設定目標網域名稱
domain = "example.com"
# 執行DNS查詢
dns_lookup(domain)

內容解密:

  1. import dns.resolver:匯入dns.resolver模組,用於進行DNS查詢。
  2. def dns_lookup(domain):定義一個名為dns_lookup的函式,接受網域名稱作為引數。
  3. answers = dns.resolver.resolve(domain, 'A'):對指定的網域名稱進行A記錄查詢。
  4. for rdata in answers:遍歷查詢結果並列印出對應的IP位址。

防禦措施

監控網路流量

為了防禦潛在的攻擊,監控網路流量是至關重要的。可以使用Scapy來捕捉和分析網路封包:

from scapy.all import sniff

def packet_callback(packet):
    if packet.haslayer(TCP):
        print(f"TCP packet: {packet.summary()}")

# 開始監控網路流量
sniff(prn=packet_callback, count=10)

內容解密:

  1. from scapy.all import sniff:匯入sniff函式,用於捕捉網路封包。
  2. def packet_callback(packet):定義一個名為packet_callback的回撥函式,用於處理捕捉到的封包。
  3. if packet.haslayer(TCP):檢查封包是否為TCP型別。
  4. sniff(prn=packet_callback, count=10):開始監控網路流量,並呼叫回呼函式處理前10個封包。

建議練習

  1. 使用Scapy進行更複雜的網路掃描任務,如UDP掃描或OS偵測。
  2. 利用Python的DNS處理函式庫進行更深入的DNS探索,如查詢MX記錄或進行反向DNS查詢。
  3. 開發一個簡單的網路監控工具,用於即時監控網路流量並發出警示。

此圖示顯示了使用Python進行資安攻防的流程: 此圖示說明瞭從開始到結束的整個流程,包括使用Scapy進行網路掃描、進行DNS探索、監控網路流量以及分析結果並採取相應的行動。

資訊安全技術手冊目錄生成

內容簡介

本手冊旨在提供資訊安全領域的專業技術指導,涵蓋惡意任務排程、永續性攻擊、許可權提升、防禦閃避、憑證存取等主題。手冊內容包含攻擊技術解析、防禦策略建議以及實作程式碼範例。

目錄結構說明

第一部分:惡意任務排程與防禦

  1. 惡意任務排程技術

    • 排程惡意任務的實作方法
    • 檢查系統排程任務的技術細節
    • 防禦者如何查詢與識別可疑排程任務
  2. 程式碼實作與解析

    • 惡意任務排程式碼解析
    • 防禦者監控排程任務的程式碼實作

第二部分:永續性攻擊技術

  1. 開機自啟動技術

    • 利用Windows登入檔實作自啟動
    • Python修改自啟動登入檔的實作方法
    • 防禦者如何監控登入檔變更
  2. 流程劫持技術

    • 修改Windows系統路徑實作流程劫持
    • 存取與修改系統路徑的技術細節
    • 防禦者如何檢測路徑修改

第三部分:許可權提升與防禦

  1. 登入初始化指令碼利用

    • 建立惡意登入指令碼進行許可權提升
    • 搜尋與識別現有登入指令碼的方法
  2. 執行流程劫持

    • 注入惡意Python函式庫實作許可權提升
    • Python函式庫載入機制解析
    • 防禦者如何檢測可疑函式庫

第四部分:防禦閃避技術

  1. 破壞防禦機制

    • 停用防毒軟體的技術方法
    • 建立誘餌程式混淆防毒軟體偵測
  2. 隱藏痕跡技術

    • 利用替代資料流隱藏檔案
    • Python存取替代資料流的方法
    • 防禦者如何檢測替代資料流

第五部分:憑證存取與網路監聽

  1. 從密碼儲存器擷取憑證

    • 從網頁瀏覽器擷取儲存的憑證資訊
    • 存取Chrome主金鑰與解密密碼的方法
    • 防禦者如何監控Chrome密碼存取
  2. 網路流量監聽

    • 使用scapy進行網路流量監聽
    • 識別常見協定的密碼資訊
    • 建立誘餌網路連線混淆攻擊者視聽

第六部分:系統探測與橫向移動

  1. 帳戶探測技術

    • 收集系統使用者帳戶資訊
    • 識別管理員帳戶的方法
    • 監控帳戶登入行為的防禦策略
  2. 檔案與目錄探測

    • 識別重要檔案與資料夾
    • 使用正規表示式進行資料探測
    • 建立誘餌檔案進行監控

第七部分:遠端控制與資料收集

  1. 遠端服務利用

    • 利用Windows管理共用進行遠端存取
    • 執行遠端命令的技術細節
    • 防禦者如何監控管理共用存取
  2. 替代認證方法

    • 收集網頁工作階段Cookie資訊
    • 建立誘餌Cookie進行監控

第八部分:命令控制與資料外洩

  1. 加密通訊通道

    • 建立加密命令控制通道的方法
    • 偵測加密C2通道的技術細節
  2. 協定隧道技術

    • 利用協定隧道進行命令控制
    • 識別編碼資料的方法

第九部分:資料外洩與破壞

  1. 替代協定外洩

    • 利用替代協定進行資料外洩的方法
    • 偵測隱藏在正常流量中的資料
  2. 非應用層協定外洩

    • 利用非應用層協定進行資料外洩
    • 識別異常的協定欄位值

編寫規範與注意事項

程式碼呈現規範

  • 程式碼必須完整且具備連貫性,不得跨段落中斷
  • 每個程式碼範例後須附「#### 程式碼解析:」標題進行詳細說明
  • 程式碼說明須涵蓋邏輯解析、設計考量及潛在改進點

圖表使用規範

  • 建議使用Plantuml圖表呈現流程或架構關係
  • 圖表須具備清晰的邏輯結構,避免過度複雜
  • 圖表標題須使用中性指稱,避免特定技術名詞

語言風格規範

  • 使用專業且自然的敘述風格,避免機械式表達
  • 適度使用類別比或比喻提升可讀性
  • 確保術語使用的精確性與一致性

防禦策略重點

  • 提供具體的偵測與防禦方法
  • 包含程式碼層級的防禦實作範例
  • 重點關注常見攻擊手段的對應策略
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

title Python 資安攻防實戰應用

package "資料庫架構" {
    package "應用層" {
        component [連線池] as pool
        component [ORM 框架] as orm
    }

    package "資料庫引擎" {
        component [查詢解析器] as parser
        component [優化器] as optimizer
        component [執行引擎] as executor
    }

    package "儲存層" {
        database [主資料庫] as master
        database [讀取副本] as replica
        database [快取層] as cache
    }
}

pool --> orm : 管理連線
orm --> parser : SQL 查詢
parser --> optimizer : 解析樹
optimizer --> executor : 執行計畫
executor --> master : 寫入操作
executor --> replica : 讀取操作
cache --> executor : 快取命中

master --> replica : 資料同步

note right of cache
  Redis/Memcached
  減少資料庫負載
end note

@enduml

此圖示展示了攻擊者從初始攻擊到最終資料外洩的完整攻擊鏈。

圖表解析:

  1. 攻擊者首先利用惡意任務排程進入受害系統
  2. 透過永續性攻擊維持系統控制權
  3. 進行許可權提升以擴大控制範圍
  4. 使用防禦閃避技術避免被檢測
  5. 最終達成資料外洩的目的

重點練習建議

  1. 實作惡意任務排程並嘗試檢測
  2. 練習使用Python修改系統登入檔
  3. 研究不同作業系統的永續性攻擊方法
  4. 開發檢測替代資料流的工具程式

透過這些練習,讀者可以更深入理解資訊安全攻防的核心技術。

為何選擇Python進行資安防禦與攻擊?

在進入正題之前,我們先來探討為何Python在資安領域中扮演著重要的角色。對於已經在資安領域工作的人來說,自動化是提升工作效率的關鍵。試想,如果要教育非技術背景的朋友或親人避免安裝惡意軟體或避免網路釣魚郵件攻擊,已經是一件相當困難的事,更遑論要保護數百或數千人的網路安全。網路攻擊的成本可能高達數百萬美元,因此管理網路風險、預防惡意軟體感染、偵測並修復持續的攻擊,以及確保符合企業安全政策等,都是資安人員的重要任務。自動化可以幫助處理這些問題,因此在資安領域中,自動化是不可或缺的。

那麼,為什麼要使用Python來進行自動化呢?Python具有幾個特點,使其成為資安領域中的理想選擇:

  • 普及性:Python是一種非常流行的程式語言,你可能已經對它有一定的瞭解。學習新的應用方式遠比從零開始學習一門新的語言來得容易。根據TIOBE指數(https://www.tiobe.com/tiobe-index/),Python在2021年排名第二,正在迅速超越C語言。
  • 易學性:對於不熟悉Python的人來說,它非常容易學習。這對於快速學習和快速開發程式都非常有幫助。
  • 強大的功能:Python擁有許多強大的函式庫,可以輕鬆地匯入到你的程式碼中。例如,如果你想要處理網路流量,使用scapy函式庫遠比從頭開始實作來得容易。

本文的架構

本文的架構是根據MITRE ATT&CK框架。MITRE ATT&CK是一個由MITRE公司開發的工具,用於理解網路攻擊的生命週期。它將網路攻擊的生命週期分解為攻擊者可能需要實作的目標,並描述了實作這些目標的各種方法。

策略與技術

MITRE ATT&CK框架採用階層式的架構。在這個架構的最上層,是MITRE策略,用於描述攻擊者在網路攻擊過程中可能想要實作的目標。這些策略包括:

  • 偵察(Reconnaissance)
  • 資源開發(Resource Development)
  • 初始存取(Initial Access)
  • 執行(Execution)
  • 持久化(Persistence)
  • 許可權提升(Privilege Escalation)
  • 防禦逃避(Defense Evasion)
  • 憑證存取(Credential Access)
  • 探索(Discovery)
  • 橫向移動(Lateral Movement)
  • 收集(Collection)
  • 命令與控制(Command and Control)
  • 滲透(Exfiltration)
  • 影響(Impact)

對於每一個策略,MITRE ATT&CK都列出了多種技術和子技術,用於描述實作這些目標的具體方法。例如,攻擊者可以使用暴力破解(https://attack.mitre.org/techniques/T1110/)或網路嗅探(https://attack.mitre.org/techniques/T1040/)來實作憑證存取。每一個技術和子技術都有自己的頁面,描述了攻擊是如何進行的,如何被檢測到等。

本文就是按照MITRE ATT&CK框架來組織的。每一個策略都有自己的章節(除了前兩個策略被合併成MITRE Pre-ATT&CK)。每個章節探討了兩個來自該策略的技術,以及如何使用Python來實作它們。每個攻擊的部分都會與一個防禦的部分配對,展示如何使用Python來擊敗這些攻擊向量。

為什麼選擇MITRE ATT&CK?

本文的目標是展示如何使用Python來解決資安案例。為此,有一個清晰的框架來概述不同的攻擊和防禦資安任務是非常有幫助的。MITRE ATT&CK提供了這樣一個框架,它的階層式架構描述了網路攻擊的不同目標以及如何實作它們。本文從每個MITRE ATT&CK策略中抽取攻擊技術,並展示如何使用Python來實作它們和相應的防禦措施。

除了這個結構之外,MITRE ATT&CK還提供了豐富的額外資源和成長空間。每個技術都包含了深入的資訊,闡述了攻擊是如何運作的,以及如何防禦它。MITRE ATT&CK還描述了數百個未在本文中涵蓋的技術,為將Python應用於新的案例提供了眾多的機會。

你將需要的工具

本文旨在展示如何使用Python來解決各種案例。如果你沒有開啟Python並執行程式碼,那麼你做錯了。

設定Python

本文中的程式碼範例是為Python 3.9版本編寫的。如果你使用的是較早版本的Python,或者當你閱讀本文時,Python已經向前發展到破壞了向後相容性,那麼程式碼範例可能無法為你工作。

要下載最新版本的Python,我們建議存取https://www.python.org/downloads/。從那裡,你可以下載並安裝適合你係統的版本。同時,請安裝pip,並確保Python 3是系統上的預設Python,透過移除Python 2.X,安裝像python-is-python3這樣的套件,或者為python和pip命令建立別名。

內容解密:

這段文字主要講解了設定Python環境的基本步驟。首先,需要從官方網站下載最新版本的Python。接著,安裝pip套件管理器,以方便安裝和管理其他Python套件。同時,需要確保系統預設使用的是Python 3版本,可以透過移除舊版本、安裝特定套件或設定別名等方式來實作。這樣可以確保本文中的程式碼範例能夠正確執行。

使用Python進行前置攻擊框架(Pre-ATT&CK)的偵察工作

在網路安全領域中,Python是一種非常適合自動化任務的程式語言。本章節將探討如何利用Python實作MITRE Pre-ATT&CK框架中的偵察(Reconnaissance)工作。

前置攻擊框架(Pre-ATT&CK)的演變

最初,MITRE Pre-ATT&CK是MITRE ATT&CK框架中的一個獨立矩陣,用於描述攻擊者在嘗試取得目標環境初始存取許可權之前可能採取的各種步驟。2020年10月,MITRE重構了ATT&CK框架,將Pre-ATT&CK壓縮為ATT&CK矩陣中的兩個戰術:偵察(Reconnaissance)和資源開發(Resource Development)。

偵察工作的自動化

在本章中,我們將重點關注偵察戰術。偵察工作可以透過主動或被動方式進行。主動偵察涉及與目標環境互動,而被動偵察則可能涉及竊聽流量或利用公開可用的資訊來源。

主動掃描

主動掃描是偵察工作的一部分,涉及對目標進行埠或漏洞掃描,以確定哪些IP地址是活躍的、正在執行哪些服務、可能存在哪些漏洞等。

使用scapy進行網路掃描

Nmap是最常用的埠掃描工具。在本文中,我們將使用Python的scapy函式庫實作簡單的掃描:

  • SYN掃描:傳送TCP SYN封包到埠,並尋找SYN/ACK封包作為回應。
  • DNS掃描:測試目標系統上是否正在執行DNS伺服器。
PortScan.py 程式碼範例
from scapy.all import *
import ipaddress

# 定義要掃描的埠
ports = [25, 80, 53, 443, 445, 8080, 8443]

def SynScan(host):
    # 傳送SYN封包並等待回應
    ans, unans = sr(IP(dst=host)/TCP(sport=33333, dport=ports, flags="S"), timeout=2, verbose=0)
    print("Open ports at %s:" % host)
    for (s, r,) in ans:
        if s[TCP].dport == r[TCP].sport and r[TCP].flags == "SA":
            print(s[TCP].dport)

def DNSScan(host):
    # 傳送DNS查詢並等待回應
    ans, unans = sr(IP(dst=host)/UDP(dport=53)/DNS(rd=1, qd=DNSQR(qname="google.com")), timeout=2, verbose=0)
    if ans and ans[UDP]:
        print("DNS Server at %s" % host)

# 取得使用者輸入的IP地址
host = input("Enter IP Address: ")
try:
    ipaddress.ip_address(host)
except:
    print("Invalid address")
    exit(-1)

# 執行SYN掃描和DNS掃描
SynScan(host)
DNSScan(host)

#### 內容解密:

  1. 匯入必要的函式庫:使用from scapy.all import *匯入scapy的所有功能,以及import ipaddress來驗證IP地址的有效性。
  2. 定義要掃描的埠:在ports列表中定義了常見的網路服務埠。
  3. SynScan函式:實作SYN掃描,傳送TCP SYN封包到指定的IP地址和埠,根據回應判斷埠是否開放。
  4. DNSScan函式:實作DNS掃描,透過傳送DNS查詢到指定的IP地址,判斷該地址是否執行DNS伺服器。
  5. 驗證使用者輸入的IP地址:使用ipaddress.ip_address(host)檢查輸入的IP地址是否有效。
  6. 執行掃描:根據使用者輸入的IP地址,分別執行SYN掃描和DNS掃描。