我绝不是网络专家,所以我可能会遗漏一些明显的东西。我试图在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()
我在这里缺少什么吗?因为我正在更改数据库查询,所以需要以不同的方式处理数据包吗?
答案 0 :(得分:1)
如果更改TCP数据包的长度,则必须修复以下序列和确认号...这很难。
如果你需要篡改TCP连接的内容,我建议你只是DNAT与你编写的TCP代理的连接(一个简单的TCP服务器,建立与原始服务器的连接,并在之间转发数据)两个端点)。这样,您就可以让主机的网络堆栈处理TCP序列和确认号码。