簡體   English   中英

嗅探接口上的流量時,托管到主機的Python socket.bind()不會顯示帶有SIO_RCVALL的傳入數據包

[英]Python socket.bind() to host does not show incoming packets with SIO_RCVALL while sniffing for traffic on an interface

我正在嘗試通過主機上的接口讀取正在處理的項目的傳入/傳出TCP數據包。 我真的希望使用套接字而不是像scapy或pypcap這樣的庫來完成此操作。 更好地了解正在發生的事情,並更好地控制正在發生的事情。 這是在Windows10系統上。

import socket
import threading
from PacketParse import PacketParse

host = socket.gethostbyname(socket.gethostname())

sniff = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_IP) 
sniff.bind((host, 0))

#include ip headers - IP PROTOCOL, IP HEADER INCLUDE
sniff.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1)

#receive all packages - INPUT OUTPUT CONTROL
sniff.ioctl(socket.SIO_RCVALL, socket.RCVALL_ON)

def start_sniffing():
    while True:
        raw_packet = sniff.recvfrom(2000)
        packet = PacketParse(raw_packet)
        if packet:
            print(packet.src_addr + ":" + str(packet.src_port) + " --> " + packet.dst_addr + ":" + str(packet.dst_port) + " Protocol: " + packet.ip_prot + "(" + str(packet.ip_prot_raw) + ")")
            print("Data(" + str(packet.data_size) + "): " + str(packet.data))
            #file.write(packet.src_addr + ":" + str(packet.src_port) + " --> " + packet.dst_addr + ":" + str(packet.dst_port) + " Protocol: " + packet.ip_prot + "(" + str(packet.ip_prot_raw) + ")")
            #file.write("Data(" + str(packet.data_size) + "): " + str(packet.data))'''

file = open("dump.txt", "a")
t = threading.Thread(target=start_sniffing)
t.start()
t.join()

file.close()
sniff.ioctl(socket.SIO_RCVALL, socket.RCVALL_OFF)

PacketParse是我用來“解包”數據包的類。 我一直在使用Python文檔編寫大多數腳本和教程,以監聽來自許多來源的數據包。

from struct import unpack

class PacketParse:
    def __init__(self, packet):
        self.extract(packet)

    def extract(self, packet):
        # extract ip header
        packet = packet[0]
        self.packet_raw = packet
        '''
        eth_raw = packet[:14]
        eth_hdr = unpack('!6s6sH', eth_raw)
        self.eth_prot = socket.ntohs(eth_hdr[2])
        self.src_mac = 
        '''
        ip_raw = packet[0:20]
        ip_hdr = unpack('!BBHHHBBH4s4s', ip_raw)
        #self.ip_length = ip_hdr[5]
        self.ip_prot_raw = ip_hdr[6]
        self.ip_prot = self.ip_prot_parse(ip_hdr[6])
        self.src_addr = socket.inet_ntoa(ip_hdr[8])
        self.dst_addr = socket.inet_ntoa(ip_hdr[9])
        version = ip_hdr[0] >> 4
        ihl_length = version & 0xF
        iph_len = ihl_length * 4

        tcp_raw = packet[20:40]
        tcp_hdr = unpack('!HHLLBBHHH', tcp_raw)
        self.src_port = tcp_hdr[0]
        self.dst_port = tcp_hdr[1]
        self.seq_num = tcp_hdr[2]
        self.ack_num = tcp_hdr[3]
        doff_reserved = tcp_hdr[4]
        tcp_length = doff_reserved >> 4

        header_size = (iph_len) + (tcp_length * 4)
        self.data_size = len(packet) - header_size

        self.data = packet[header_size:]

    def ip_prot_parse(self, num):
        return {
        1: 'ICMP',
        6: 'TCP',
        17: 'UDP',
        }.get(num, "Unknown")

問題是這僅顯示從此主機發送的數據包。 不顯示傳入的數據包。 我嘗試使用scapy的其他腳本也能夠顯示傳入的數據包。 為什么會這樣呢? SIO_RCVALL應該允許看到接口觸摸的所有數據包。 我沒有嘗試過與該腳本等效的Linux系統...所以我不知道問題是否在Windows上特定。 我發現的大多數TCP讀取腳本都是特定於Linux的。

好吧...看來問題出在我的防火牆上。 當我關閉它時,我可以看到所有傳入的數據包都很好。 那有點煩人。 我相信這里有一個Python庫,可讓您編輯防火牆設置。

https://github.com/austin-taylor/bluewall

我還沒有玩過它……可能很有趣。 我還沒有讀足夠的東西來理解這是否是看起來。 我相信它只會為您提供Windows上的配置,而無需更改任何內容。 在Linux系統上可能會很有趣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM