3

如何用 scapy 更改数据包数据?

我尝试使用sniff()然后send()编辑的数据包,但它不会工作,因为原始数据包已经到达它的目的地。

4

4 回答 4

4

“但它不会起作用,因为原始数据包已经到达它的目的地。”

因此,首先您需要设置一些中间人解决方案,以便两端之间的所有通信都穿过您的设备,并让您修改数据包数据。

用于此功能 /attack 的一些众所周知的软件包是 ettercap 和 cain/abel。

于 2012-04-14T20:56:13.257 回答
4

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)

直流

于 2012-04-19T10:50:20.330 回答
2

我有同样的问题,

我认为问题在于您启用了 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 等......

如果要修改服务器的响应,一种更简单的方法是,而不是即时修改数据包,而是充当中介。

  • ARP欺骗
  • iptables
  • 打开一个套接字,接收数据包,打开一个连接并将其发送到原始目的地(假装你是客户端)。然后,从原目的地接收答案,修改答案,返回给原查询者。

    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)
    

(对不起,脏代码)

于 2014-10-08T09:12:51.960 回答
0

如果您使用 scapy send() 函数,那么它将创建一个新数据包,但使用 MITMf 您不需要任何发送函数,只需更改数据包字段,如 scapy 语法,不使用发送函数或需要创建新数据包......

这是 MITMf
的一个很好的 github 存储库,这个存储 库就像 scapy 一样,从头开始编写,具有完全适合您的目标的能力。
示例代码:

if packet.haslayer(ICMP):
   log.info('Got an ICMP packet!')
   packet.dst = '192.168.1.0'
于 2021-05-18T19:57:19.073 回答