Python:使用nfqueue / scapy在TCP有效负载内重写查询

时间:2018-03-19 19:34:55

标签: python tcp scapy payload

我绝不是网络专家,所以我可能会遗漏一些明显的东西。我试图在TCP有效负载内重写数据库查询。我已经能够将这个用于单个场景,但对于其他场景,它不起作用,我不知道为什么。

必须工作

更改 - '从test1'中选择*要从test2'

中选择*

不起作用

更改 - '从test1'中选择*要从test50'

中选择*
  • 由于有效载荷大小的变化,这是否无效?

以下是我的代码示例:

import nfqueue
from scapy.all import *
import os
import sys

iptable_change = "iptables -A OUTPUT -p tcp --dport 8008 -j NFQUEUE"
os.system(iptable_change)


def callback(payload):
    data = payload.get_data()
    pkt = IP(data)
    if pkt.src == '127.0.0.1':
        if 'test1' in pkt[Raw].load:
            pkt[TCP].payload = str(pkt[TCP].payload).replace("test1", "test50")
            del pkt[IP].chksum
            del pkt[TCP].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()
    except KeyboardInterrupt:
        q.unbind(socket.AF_INET)
        q.close()


if __name__ == "__main__":
    main()

我在这里缺少什么吗?因为我正在更改数据库查询,所以需要以不同的方式处理数据包吗?

1 个答案:

答案 0 :(得分:1)

如果更改TCP数据包的长度,则必须修复以下序列和确认号...这很难。

如果你需要篡改TCP连接的内容,我建议你只是DNAT与你编写的TCP代理的连接(一个简单的TCP服务器,建立与原始服务器的连接,并在之间转发数据)两个端点)。这样,您就可以让主机的网络堆栈处理TCP序列和确认号码。