python-用scapy作为MITM即时更改数据包

假设我设法处于客户端和服务器之间的通信中间(假设我打开了一个热点,并使客户端仅通过我的计算机连接到服务器).

如何在不中断自己与其他服务的通信的情况下更改客户端发送和接收的数据包?必须有一种方法可以通过我的脚本路由客户端既发送又要接收的所有数据包(在转发给他之前).

我认为使用iptables是实现此目标的正确方向,但不确定究竟是什么参数才适合完成这项工作.我已经有以下简单的脚本:

hotspotd start #a script that runs dnsmasq as both a DNS and DHCP server, configures and starts a hotspot
iptables -P FORWARD ACCEPT
iptables --append FORWARD --in-interface wlan0 -j ACCEPT
iptables --table nat --append POSTROUTING --out-interface eth0 -j MASQUERADE 
#wlan0 is the interface on which the hotspot is.
#eth0 is the interface that is connected to the internet

现在,这对于被动的MITM来说非常完美-我可以看到客户端发送和接收的所有内容.但是现在我想加强它并重定向他通过我发送和接收的每条消息.

我最终的目的是要达到一个可以执行以下脚本的级别:

from scapy.all import *
from scapy_http.http import *

def callback(pkt):
   #Process the packet here, see source and destination addresses, ports, data
   send(pkt)

sniff(filter='port 666', prn=callback) #Assuming all relevant packets are redirected to port 666

如何完成重定向客户端发送和即将接收的每个数据包?

解决方法:

您可以使用具有python bindingsNFQUEUE.

NFQUEUE是一个用户空间队列,是有效的iptables目标.您可以将一些流量重定向到NFQUQUE:

iptables -I INPUT -d 192.168.0.0/24 -j NFQUEUE –queue-num 1

然后从您的代码访问数据包:

from netfilterqueue import NetfilterQueue

def print_and_accept(pkt):
    print(pkt)
    pkt.accept()

nfqueue = NetfilterQueue()
nfqueue.bind(1, print_and_accept)
try:
    nfqueue.run()
except KeyboardInterrupt:
    print('')

nfqueue.unbind()

请注意pkt.accept()调用.这会向nfqueue返回verdict,告诉它应该接受该数据包-即允许其沿内核中的正常路径继续.要修改数据包,而不是接受它,您需要复制它,返回一个断言,最后以包含的修改重新发送它.

上一篇:python-向scapy添加新协议(类似于ARP)


下一篇:python-Scapy TCP RST攻击