你好,我正在使用nfqueue和scapy,我的目标是在nfqueue接收数据包,更改负载并重新发送它们。
我可以改变像TTL这样的字段,没有任何问题,但是当涉及到改变负载时,我遇到了问题。
当我改变有效负载时,我用wireshark嗅探数据包,显然我发送的数据包修改了有效负载,但服务器没有应答。
这是我的代码:
#!/usr/bin/env python
import nfqueue
from scapy.all import *
def callback(payload):
data = payload.get_data()
pkt = IP(data)
pkt[TCP].payload = str(pkt[TCP].payload).replace("ABC","GET")
pkt[IP].ttl = 40
print 'Data: '+ str(pkt[TCP].payload)
print 'TTL: ' + str(pkt[IP].ttl)
del pkt[IP].chksum
payload.set_verdict_modified(nfqueue.NF_ACCEPT, str(pkt), len(pkt))
def main():
q = nfqueue.queue()
q.open()
q.bind(socket.AF_INET)
q.set_callback(callback)
q.create_queue(0)
try:
q.try_run() # Main loop
except keyboardInterrupt:
q.unbind(socket.AF_INET)
q.close()
main()
我为端口80的传出流量设置了此规则:iptables -I OUTPUT -s 192.168.1.10 -p tcp --dport 80 -j NFQUEUE
而且,要测试它,例如我打开telnet到google端口80,执行一个GET / HTTP/1.1
,这就是我看到的:
TTL: 40
DATA: GET / HTTP/1.1
现在,如果我这样做了ABC / HTTP/1.1
我就不会得到任何答案!我的电话网被卡住了。
我也试过在HTTP网站上浏览一些东西,查看wireshark我的TTL是如何真正地改变到40,然后,浏览字符串“ABC”和我的浏览器再次陷入困境。 我嗅到请求已更改为获取,但没有收到响应。
谢谢让我头疼,如果有经验的人能把我引向正确的方向,我会非常感激的。提前谢谢你。
在第二种情况下,您正在篡改TCP层和IP层。
你让Scapy修改IP校验和,而不是TCP校验和。将代码中的
del pkt[IP].chksum
更改为del pkt[IP].chksum pkt[TCP].chksum
。我添加了用于重新计算TCP校验和的行,这很有用。
只有当我改变有效载荷时,这才有效,我不改变有效载荷的长度,否则,我需要改变IP报头的字段长度,然后回答我自己,也许还有其他人正在寻找这个答案,我通过这样做来实现:
我知道我必须更改更多的字段,因为有时,如果您添加了足够的负载,以便需要将其分段到一个新包中,那么您必须更改更多的字段。
目前我不知道如何有效地实现这一点,但一点一点。希望有人找到我的解决方案,改变有效载荷有用。
相关问题 更多 >
编程相关推荐