如何用 scapy 更改数据包数据?
我尝试使用sniff()
然后send()
编辑的数据包,但它不会工作,因为原始数据包已经到达它的目的地。
“但它不会起作用,因为原始数据包已经到达它的目的地。”
因此,首先您需要设置一些中间人解决方案,以便两端之间的所有通信都穿过您的设备,并让您修改数据包数据。
用于此功能 /attack 的一些众所周知的软件包是 ettercap 和 cain/abel。
iTayb,
似乎您对使用 scapy 代理某种服务感兴趣?如果有,是哪一个?
首要任务是数据包如何通过运行 scapy 的盒子。通过在远程机器上设置网关以匹配 scapy 框来做到这一点。如果这是为了某种渗透测试,您将需要欺骗一些 MAC 地址。您可以使用 scapy 使用 arpcachepoison 方法或使用第三方程序(如 ettercap)来执行此操作。
完成此操作后,您使用 sniff() 和 send() 的方法应该会更好一些,只需确保在到达发送部分之前更改数据包;) 这是一个小例子,说明如何做到这一点.. .这里我只是更改 IP 标头目标地址,但您可以更改任何您想要的。
from scapy import *
def chgSend(x):
x[IP].dst = '192.168.1.1'
send(x)
while 1:
sniff(prn=chgSend)
直流
我有同样的问题,
我认为问题在于您启用了 ip_forward,因此在 scapy 发送修改后的数据包之前,原始数据包被转发到原始目的地。
从理论上讲,解决方案是在 iptables 中创建一个规则,将您想要修改的数据包转发到另一个端口(这或多或少是 Ettercap 内部所做的),
i.e = iptables -t nat -A PREROUTING -p tcp --destination-port "YourInterestingPort" -j REDIRECT --to-port 1234
然后在 scapy 中监听那个端口,修改数据包并将数据包发送到原始端口。
由于过滤,此解决方案难以实施,您必须仅重定向和修改您想要的数据包并排除 syn ack arp 等......
如果要修改服务器的响应,一种更简单的方法是,而不是即时修改数据包,而是充当中介。
打开一个套接字,接收数据包,打开一个连接并将其发送到原始目的地(假装你是客户端)。然后,从原目的地接收答案,修改答案,返回给原查询者。
while True:
c, addr = s_mb.accept() # Establish connection with client.
query = c.recv(BUFFER_SIZE)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((IP, PORT))
s.send(PACKET)
response = s.recv(1024)
if response = "THIS IS THE RESPONSE THAT I WANT TO MODIFY":
if(real_simulation):
fakeresponse = "MODIFIED RESPONSE"
#print "The packet has beeb modified"
else:
fakeresponse = response
s.close()
c.send(fakeresponse)
(对不起,脏代码)
如果您使用 scapy send() 函数,那么它将创建一个新数据包,但使用 MITMf 您不需要任何发送函数,只需更改数据包字段,如 scapy 语法,不使用发送函数或需要创建新数据包......
这是 MITMf
的一个很好的 github 存储库,这个存储
库就像 scapy 一样,从头开始编写,具有完全适合您的目标的能力。
示例代码:
if packet.haslayer(ICMP):
log.info('Got an ICMP packet!')
packet.dst = '192.168.1.0'