在網路流量分析中,從 PCAP 檔案提取影像並進行人臉辨識,能幫助我們深入理解網路活動和提升資安防護能力。本文利用 Scapy 解析網路封包,使用 Namedtuple 提升程式碼可讀性,並結合 OpenCV 進行人臉偵測。透過 Python 指令碼,我們可以自動化地從 PCAP 檔案中提取影像,並辨識其中的人臉。此技術可應用於資安分析,例如識別潛在的社交工程攻擊或分析目標網站的圖片內容。

利用 Scapy 和 Namedtuple 從 PCAP 檔案中提取影像

在現代網路分析中,能夠從捕捉的網路流量中提取有用的資訊是一項非常重要的技能。本文將介紹如何利用 Python 的 scapy 模組和 namedtuple 來從 PCAP 檔案中提取影像。這些技術不僅能夠幫助我們更好地理解網路流量,還能夠在資安分析中發揮重要作用。

命名元組(Namedtuple)的優勢

在 Python 中,命名元組(namedtuple)是一種特殊的元組,它允許我們透過屬性來存取元組中的元素。這使得程式碼更加易讀且更具可維護性。以下是一個簡單的例子:

from collections import namedtuple

# 建立一個名為 Point 的命名元組,包含兩個屬性:x 和 y
Point = namedtuple('Point', ['x', 'y'])

# 建立一個 Point 物件
p = Point(35, 65)

# 存取命名元組中的屬性
print(p.x)  # 輸出: 35
print(p.y)  # 輸出: 65

構建提取影像的邏輯

接下來,我們將構建一個 Python 指令碼,用於從 PCAP 檔案中提取影像並將其寫入磁碟。我們將使用 scapy 模組來處理網路流量,並使用命名元組來儲存 HTTP 回應的頭部和負載。

主要邏輯框架

首先,我們需要定義一些基本的類別和函式來完成這個任務:

from scapy.all import TCP, rdpcap
import collections
import os
import re
import sys
import zlib

# 設定輸出目錄和 PCAP 檔案路徑
OUTDIR = '/root/Desktop/pictures'
PCAPS = '/root/Downloads'

# 建立一個名為 Response 的命名元組,包含兩個屬性:header 和 payload
Response = collections.namedtuple('Response', ['header', 'payload'])

class Recapper:
    def __init__(self, fname):
        # 初始化物件並讀取 PCAP 檔案
        pcap = rdpcap(fname)
        self.sessions = pcap.sessions()
        self.responses = list()

    def get_responses(self):
        # 處理每個 TCP 會話並提取回應
        for session in self.sessions:
            payload = b''
            for packet in self.sessions[session]:
                try:
                    if packet[TCP].payload:
                        payload += bytes(packet[TCP].payload)
                except Exception as e:
                    pass

                if b'\r\n\r\n' in payload:  # HTTP 回應結尾標記
                    header, body = payload.split(b'\r\n\r\n', 1)
                    self.responses.append(Response(header, body))
                    payload = b''

    def write(self, content_name):
        # 將提取的內容寫入磁碟
        for i, response in enumerate(self.responses):
            content, content_type = extract_content(response, content_name)
            if content and content_type == content_name:
                fname = os.path.join(OUTDIR, f'{i}.{content_name}')
                with open(fname, 'wb') as f:
                    f.write(content)

if __name__ == '__main__':
    pfile = os.path.join(PCAPS, 'pcap.pcap')
    recapper = Recapper(pfile)
    recapper.get_responses()
    recapper.write('image')

提取 HTTP 頭部

接下來,我們需要編寫一個函式來提取 HTTP 回應的頭部。這樣我們才能知道內容型別和編碼方式。

def get_header(payload):
    try:
        header_raw = payload[:payload.index(b'\r\n\r\n') + 2]
    except ValueError:
        sys.stdout.write('-')
        sys.stdout.flush()
        return None

    header = dict(re.findall(r'(?P<name>.*?): (?P<value>.*?)\r\n', header_raw.decode()))
    if 'Content-Type' not in header:
        return None

    return header

提取內容

最後,我們需要編寫一個函式來提取 HTTP 回應中的內容。這裡我們需要處理不同的內容編碼方式(如 gzip 和 deflate)。

def extract_content(Response, content_name='image'):
    content, content_type = None, None

    if content_name in Response.header.get('Content-Type', ''):
        content_type = Response.header['Content-Type'].split('/')[1]
        content = Response.payload[Response.payload.index(b'\r\n\r\n') + 4:]

        if 'Content-Encoding' in Response.header:
            if Response.header['Content-Encoding'] == "gzip":
                content = zlib.decompress(Response.payload, zlib.MAX_WBITS | 32)
            elif Response.header['Content-Encoding'] == "deflate":
                content = zlib.decompress(Response.payload)

    return content, content_type.split('/')[0]

輸出結果

在完成上述步驟後,我們就可以從 PCAP 檔案中提取影像並將其儲存到指定目錄中。這樣的方法不僅簡單易懂,還能夠幫助我們更好地理解網路流量中的資料。

輸出結果及詳細解釋:

此圖示展示了主要邏輯框架,包括如何讀取 PCAP 檔案、提取 HTTP 回應以及將內容寫入磁碟。

flowchart TD; A[讀取PCAP檔案] –> B[提取HTTP回應]; B –> C[解析HTTP頭部]; C –> D[提取內容]; D –> E[寫入磁碟];

小段落標題:此圖示詳細說明

此圖示展示了主要邏輯框架,包括如何讀取 PCAP 檔案、提取 HTTP 回應以及將內容寫入磁碟。首先,我們讀取 PCAP 檔案並分析其中的 TCP 活動;然後,提取每個 HTTP 回應並解析其頭部;接著,根據頭部資訊提取有用的內容;最終,將內容寫入指定目錄。

網路擷取與人臉辨識

在現代網路安全與資料分析中,擷取與分析網路流量是非常重要的任務。本文將介紹如何使用Scapy與OpenCV技術來擷取HTTP流量中的圖片,並進一步進行人臉辨識。這些技術可以幫助我們瞭解目標網站的內容型別,並可能發現社交工程攻擊的機會。

擷取HTTP流量中的圖片

首先,我們需要從網路流量中擷取HTTP回應中的圖片。以下是具體的實作步驟:

import sys
import os

def get_responses(self, sessions):
    for session in sessions:
        payload = b''
        for packet in session.packets:
            try:
                if packet[TCP].dport == 80 or packet[TCP].sport == 80:
                    payload += bytes(packet[TCP].payload)
            except IndexError:
                sys.stdout.write('x')
                sys.stdout.flush()
        if payload:
            header = get_header(payload)
            if header is not None:
                self.responses.append(Response(header=header, payload=payload))

def write(self, content_name):
    for i, response in enumerate(self.responses):
        content, content_type = extract_content(response, content_name)
        if content and content_type:
            fname = os.path.join(OUTDIR, f'ex_{i}.{content_type}')
            print(f'Writing {fname}')
            with open(fname, 'wb') as f:
                f.write(content)

內容解密:

  1. 擷取HTTP流量:在get_responses方法中,我們迭代sessions字典,並對每個session中的封包進行處理。我們只關注目的地或來源埠為80的封包,這樣可以確保我們擷取的是HTTP流量。
  2. 合併封包載荷:將所有符合條件的封包載荷合併成一個位元組串payload。這個過程類別似於在Wireshark中選擇「Follow TCP Stream」功能。
  3. 處理異常情況:如果在處理封包時發生IndexError(例如封包中沒有TCP層),我們會輸出一個x到控制檯,然後繼續處理下一個封包。
  4. 解析HTTP頭部:如果payload不為空,我們會將其傳遞給get_header函式進行HTTP頭部解析。這樣我們可以單獨檢查HTTP頭部資訊。
  5. 儲存回應:將解析後的回應新增到responses列表中。
  6. 寫入圖片:在write方法中,我們迭代所有回應,提取圖片內容並將其寫入磁碟。圖片檔名以計數器和內容型別命名。

人臉辨識與標記

接下來,我們需要對擷取到的圖片進行人臉辨識。以下是使用OpenCV進行人臉辨識的實作步驟:

import cv2
import os

ROOT = '/root/Desktop/pictures'
FACES = '/root/Desktop/faces'
TRAIN = '/root/Desktop/training'

def detect(srcdir=ROOT, tgtdir=FACES, train_dir=TRAIN):
    for fname in os.listdir(srcdir):
        if not fname.upper().endswith('.JPG'):
            continue
        fullname = os.path.join(srcdir, fname)
        newname = os.path.join(tgtdir, fname)
        img = cv2.imread(fullname)
        if img is None:
            continue
        gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
        training = os.path.join(train_dir, 'haarcascade_frontalface_alt.xml')
        cascade = cv2.CascadeClassifier(training)
        rects = cascade.detectMultiScale(gray, 1.3, 5)
        try:
            if rects.any():
                print('Got a face')
                rects[:, 2:] += rects[:, :2]
        except AttributeError:
            print(f'No faces found in {fname}.')
            continue
        for x1, y1, x2, y2 in rects:
            cv2.rectangle(img, (x1, y1), (x2, y2), (127, 255, 0), 2)
        cv2.imwrite(newname, img)

if name == '__main__':
    detect()

內容解密:

  1. 讀取圖片:在detect函式中,我們迭代源目錄中的所有JPG檔案。使用OpenCV的imread函式讀取圖片。
  2. 轉換為灰度影像:將讀取到的彩色圖片轉換為灰度影像,因為人臉辨識演算法通常使用灰度影像進行處理。
  3. 載入人臉辨識模型:載入預先訓練好的人臉辨識模型檔案(XML格式),並建立OpenCV的人臉辨識物件。
  4. 檢測人臉:使用人臉辨識物件對灰度影像進行人臉檢測。如果檢測到人臉,會傳回一個矩形框的坐標列表。
  5. 標記人臉:對於每個檢測到的人臉,我們會在原圖上畫一個綠色矩形框,然後將結果寫入目標目錄。

安裝與執行

要執行這些程式碼,首先需要安裝必要的函式庫和工具:

apt-get install libopencv-dev python3-opencv python3-numpy python3-scipy
wget http://eclecti.cc/files/2008/03/haarcascade_frontalface_alt.xml

接著建立所需的目錄並執行程式碼:

mkdir /root/Desktop/pictures
mkdir /root/Desktop/faces
python recapper.py
python detector.py

結果分析

執行上述程式碼後,你應該能夠在目標目錄中看到帶有綠色矩形框的人臉圖片。這些結果可以幫助你瞭解目標網站的內容型別,並可能發現社交工程攻擊的機會。

此技術不僅限於從pcap檔案中擷取圖片,還可以結合網頁爬蟲技術進行更廣泛的應用。

視覺化流程

以下為整個流程的視覺化表示:

  graph TD;
    A[擷取pcap檔案] --> B[過濾HTTP流量];
    B --> C[合併TCP載荷];
    C --> D{有效載荷?};
    D -- 是 --> E[解析HTTP頭部];
    D -- 否 --> F[無效載荷];
    E --> G[儲存回應];
    G --> H[迭代回應];
    H --> I{是圖片?};
    I -- 是 --> J[寫入磁碟];
    I -- 否 --> K[忽略];
    J --> L[讀取圖片];
    L --> M[轉換為灰度];
    M --> N[載入人臉模型];
    N --> O[檢測人臉];
    O --> P{有人臉?};
    P -- 是 --> Q[標記人臉];
    P -- 否 --> R[無人臉];

內容解密:

此圖示展示了從擷取pcap檔案開始,到最後標記人臉的整個流程。首先過濾出HTTP流量,然後合併TCP載荷形成有效載荷。接著解析HTTP頭部並儲存回應。對每個回應進行判斷是否為圖片,如果是則寫入磁碟。最後讀取圖片、轉換為灰度、載入人臉模型、檢測並標記人臉。

這種技術可以進一步擴充套件,例如結合更多的資料分析技術來提高精確度和效率。未來可能還會出現更多強大的人工智慧演算法來提升人臉辨識和資料分析的能力。

總結來說,使用Scapy與OpenCV技術來擷取HTTP流量中的圖片並進行人臉辨識是一項強大且實用的技術手段。它不僅能夠幫助我們瞭解目標網站的內容型別,還可能發現潛在的社交工程攻擊機會。