您好我正在使用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到谷歌端口80,做一个GET / HTTP/1.1
这就是我所看到的:
TTL: 40
DATA: GET / HTTP/1.1
现在,如果我ABC / HTTP/1.1
我没有得到答案!我的telnet卡住了。
我也试过在HTTP网站浏览器上浏览一些东西,检查wireshark我的TTL是如何真正改为40,然后,浏览字符串“ABC”,我的浏览器再次卡住了。 我嗅到改变为GET的请求,但我没有得到答案。
感谢让我头疼,如果有更多经验的人能够以正确的方式引导我,我将非常感激。提前谢谢。
答案 0 :(得分:6)
我添加了重新计算TCP校验和的行,这很有用。
只有在我改变有效载荷时才有效,但我不需要改变它的长度,否则,我需要改变IP头的字段长度,回答自己,也许还有其他正在寻找它的人回答,我只是这样做:
payload_before = len(pkt[TCP].payload)
pkt[TCP].payload = str(pkt[TCP].payload).replace("Heading","Other string")
payload_after = len(pkt[TCP].payload)
payload_dif = payload_after - payload_before
pkt[IP].len = pkt[IP].len + payload_dif
我知道我必须更改更多字段,因为有时候,如果您需要添加足够的有效负载以便分段到新数据包中,则必须更改更多字段。
目前,我不知道如何有效地实现这一目标,但一点一点。希望有人找到我的解决方案来改变有效载荷。
答案 1 :(得分:4)
在第二种情况下,您正在篡改TCP层以及IP层。
你让Scapy修复了IP校验和,而不是TCP校验和。在代码中将del pkt[IP].chksum
更改为del pkt[IP].chksum pkt[TCP].chksum
。