使用scapy作为MITM动态更改数据包

时间:2016-09-29 08:24:47

标签: python linux iptables scapy man-in-the-middle

假设我设法处于客户端和服务器之间的通信中间(让我们说我打开了一个热点并导致客户端只通过我的机器连接到服务器)。

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

我认为实现这一目标的正确方向是使用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

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

1 个答案:

答案 0 :(得分:3)

您可以使用NFQUEUEpython bindings

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,告诉它它应该接受该数据包 - 即允许它继续沿着它在内核中的正常路由。要修改数据包,而不是accept,您需要复制它,返回drop判决,最后使用包含的修改重新发送。