5

您好,我正在使用 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 但我没有收到任何答复。

谢谢有点让我头疼,如果有更多经验的人能引导我走向正确的道路,我将不胜感激。先感谢您。

4

2 回答 2

9

我添加了重新计算 TCP 校验和的行,这很有用。

仅当我更改有效负载时才有效只需这样做:

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

我知道我必须更改更多字段,因为有时,如果您添加足够的有效负载以需要分段成新数据包,则必须更改更多字段。

目前我不知道如何有效地实现这一目标,但一点一点。希望有人发现我的改变有效载荷的解决方案很有用。

于 2014-12-09T13:06:45.037 回答
5

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

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

于 2014-12-05T07:20:44.773 回答