使用nfqueue/scapy更改TCP Payload

aDo*_*DoN 5 python netfilter scapy tcp-ip packet-injection

您好我使用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()
Run Code Online (Sandbox Code Playgroud)

我已将此规则设置为端口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
Run Code Online (Sandbox Code Playgroud)

现在,如果我这样做,ABC / HTTP/1.1我没有得到答案!我的telnet卡住了.

我也试过HTTP网站浏览器浏览一些东西,检查wireshark我的TTL是如何真正改为40,然后,浏览字符串"ABC",我的浏览器再次卡住.我嗅到改变为GET的请求,但我没有得到答案.

感谢让我头疼,如果有经验的人能够以正确的方式引导我,我将非常感激.先感谢您.

aDo*_*DoN 8

我添加了用于重新计算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
Run Code Online (Sandbox Code Playgroud)

我知道我必须更改更多字段,因为有时候,如果你需要添加足够的有效负载以便分段到新数据包中,你必须更改更多字段.

目前我不知道如何有效地实现这一点,但一点一点.希望有人找到我的解决方案来改变有效载荷.


Pie*_*rre 5

在第二种情况下,您将篡改TCP层和IP层。

您要让Scapy修复IP校验和,而不是TCP校验和。更改del pkt[IP].chksumdel pkt[IP].chksum pkt[TCP].chksum您的代码。