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

时间:2012-04-05 17:39:20

标签: scapy

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

我尝试使用sniff()然后使用send()编辑的数据包,但由于原始数据包已经到达目的地,因此无效。

4 个答案:

答案 0 :(得分:3)

iTayb,

似乎您对使用scapy代理某种服务感兴趣?如果是哪一个?

第一项业务是如何通过运行scapy的盒子传递数据包。通过将远程计算机上的网关设置为与scapy框匹配来执行此操作。如果这是用于某种类型的测试,你需要欺骗一些mac地址。你可以使用arpcachepoison方法或者像ettercap这样的第三方程序使用scapy来做到这一点。

一旦完成,你使用sniff()和send()的方法应该会更好一些,只需确保在到达发送部分之前更改数据包;)这是一个小例子,你可以做什么那......我只是改变了IP头目的地址,但你可以改变你想要的任何东西。

from scapy import *

def chgSend(x):
    x[IP].dst = '192.168.1.1'
    send(x)
while 1:
    sniff(prn=chgSend)

直流

答案 1 :(得分:2)

“但由于原始数据包已经到达目的地,因此无法正常工作。”

首先,您需要设置一些MiTM解决方案,以便两端之间的所有通信 遍历您的设备,并让您修改数据包数据。

对于这种功能/攻击,一些已知的软件pacakages是ettercap和cain / abel。

答案 2 :(得分: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等...

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

  • arpspoof
  • 的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)
    

(抱歉脏代码)

答案 3 :(得分:0)

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

这是 MITMf
的一个很好的 github 存储库 这个 repo 就像 scapy 一样,从头开始编写,为您的目标提供完整的能力。
示例代码:

if packet.haslayer(ICMP):
   log.info('Got an ICMP packet!')
   packet.dst = '192.168.1.0'