Модифицировать пакеты на лету с помощью Scapy?

Можно ли сделать это?

from scapy.all import *

def action(packet):
    print packet[0][1].src + "==>" + packet[0][1].dst
    print "Rerouting to localhost"
    packet[0][1].dst = '127.0.0.1'
    print packet[0][1].src + "==>" + packet[0][1].dst
    sendp(packet)

sniff(filter="dst host 203.105.78.163",prn=action)

Как-то так, но есть ли способ отправить пакет на локальный хост и отбросить отправляемый пакет на 203.105.78.163? (не используя iptables)

2 ответа

Решение

Нет никакого способа сделать это, потому что Scapy анализирует пакеты, не вмешиваясь в стек IP хоста.

Вы можете отправить другой пакет, основанный на прослушанном пакете, но вы не можете "отбросить пакет" с помощью Scapy.

Единственное решение, которое я могу придумать, под Linux, включает iptables + libnfqueue и его привязки Python + Scapy. Но очевидно, что если вы просто хотите перенаправить пакет, одного iptables достаточно и намного лучше.

В любой другой операционной системе вам в любом случае нужно иметь какое-то программное обеспечение брандмауэра для передачи пакета в пользовательскую программу (например, libnfqueue под Linux, здесь вы можете использовать магию Scapy) или для изменения самого пакета.

Может быть, вы могли бы взглянуть на программное обеспечение IPS (suricata?), Поскольку вмешательство в пакеты на основе некоторых критериев - это то, что делает IPS.

Нечто подобное должно работать, хотя и не самое красивое:

from scapy.all import *

def action(packet):
    if not "203.105.78.163" in packet[0][1].src and not "203.105.78.163" in packet[0][1].dst:
        print packet[0][1].src + "==>" + packet[0][1].dst
        print "Rerouting to localhost"
        packet[0][1].dst = '127.0.0.1'
        print packet[0][1].src + "==>" + packet[0][1].dst
        sendp(packet)
Другие вопросы по тегам