如何使用scapy更改数据包数据?
我尝试使用sniff()
然后使用send()
编辑的数据包,但由于原始数据包已经到达目的地,因此无效。
答案 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等...
如果要修改服务器的响应,更简单的方法是,而不是动态修改数据包,充当中介。
打开套接字,接收数据包,打开连接并将其发送到原始目的地(假装您是客户端)。然后,从原始目的地接收答案,修改答案,并将其返回原始查询器。
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'