Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 以scapy为MITM在飞行中更改数据包 假设我是在客户机和服务器之间的通信中间(比如说我打开了一个热点,并使客户机只通过我的机器连接到服务器)。_Python_Linux_Iptables_Scapy_Man In The Middle - Fatal编程技术网

Python 以scapy为MITM在飞行中更改数据包 假设我是在客户机和服务器之间的通信中间(比如说我打开了一个热点,并使客户机只通过我的机器连接到服务器)。

Python 以scapy为MITM在飞行中更改数据包 假设我是在客户机和服务器之间的通信中间(比如说我打开了一个热点,并使客户机只通过我的机器连接到服务器)。,python,linux,iptables,scapy,man-in-the-middle,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 iptab

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

我认为实现这一点的正确方向是使用
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
如何完成重定向客户端发送和即将接收的每个数据包?

您可以使用已发送的数据包

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

iptables-I输入-d192.168.0.0/24-jnfqueue--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返回一个消息,告诉它应该接受该数据包,即允许它在内核中沿着其正常路径继续。要修改数据包,您需要复制它,返回一个
drop
结论,然后在包含修改的情况下重新发送它,而不是
接受它。

似乎有效。但我如何识别哪些数据包来自设备,哪些来自我的机器?你可以使用iptables或你的应用程序来识别。1.使用IP表,您可以按数据包的源筛选数据包,并仅将相关数据包发送到nfqueue(或根据源将它们发送到两个单独的nfqueue)。2.由于您的应用程序从NFQUEUE接收整个数据包,您可以简单地检查您接收的每个数据包的IP地址。但它不是在以后的阶段确定的吗?我的意思是,来自某个本地地址的数据包,我想是可以确定的,而且很容易确定,但是发送到该设备IP地址的数据包呢?他们到达我的外部IP,这样的壮举行得通吗?@JonSnow我不明白。如果您知道自己的IP地址,您可以查看每个数据包的目标IP地址并与您的IP地址进行比较。如果网络接口位于NAT后面,则接口的IP和数据包中的IP都是专用的。我的计算机作为我的MITM攻击的热点,正在从接口进行路由(
wlan0
eth0
,反之亦然)。当一个包被取出时,我可以嗅探并查看哪个包是,例如,来自
10.0.0.2
。但是当我得到响应时,我会得到目标IP作为我的外部IP,不是吗?