Перехват пакетов уровня 2 с использованием scapy и nfqueue - PullRequest
0 голосов
/ 02 февраля 2019

Я пытаюсь создать анализатор пакетов, который может изменять некоторые пакеты (используя Netfilter Queue и Scapy).

Во-первых, мой скрипт добавляет правило iptable iptables -t raw -A PREROUTING -j NFQUEUE --queue-num 1.

Во-вторых, я создаю очередьс пользовательским обработчиком

import netfilterqueue
from scapy.all import *
import socket

def handler(pkt):
    hexdump(pkt.get_payload())
    pkt.accept()

nfqueue = netfilterqueue.NetfilterQueue()
nfqueue.bind(1, handler)

s = socket.fromfd(nfqueue.get_fd(), socket.AF_PACKET, socket.SOCK_RAW)

try:
    nfqueue.run_socket(s)
except KeyboardInterrupt:
    pass

s.close()

nfqueue.unbind()

Но только то, что я могу получить от pkt.get_payload(), это IP-фреймы (без фреймов Ethernet).

Я в замешательстве, потому что sniff() функция из scapy может легко перехватывать пакеты Ethernet.

Например, sniff(prn=lambda pkt:pkt.show()) может возвращать

###[ Ethernet ]### 
  dst= 00:00:00:00:00:00
  src= 00:00:00:00:00:00
  type= 0x86dd
###[ IPv6 ]### 
     ...
###[ UDP ]### 
        ...
###[ Raw ]### 
           ...

Можно ли перехватить (и изменить) например исходный MAC-адрес с помощью nfqueue?Я пробовал с разными типами сокетов, но ничего не получалось.

...