如何通过netfilter队列和scapy更改TCP有效负载和长度

问题描述 投票:0回答:1

使用Netfilter Queue和scapy更改TCP有效负载,测试客户端向测试服务器发送一个msg:

测试服务器中的iptables规则:iptables -A OUTPUT -p TCP -d [test client ip] -j NFQUEUE --queue-num 1

更改TCP有效负载后,如果更改后长度相同,只需替换字符串,则所有行为都正确。

但如果长度不同,则程序异常:

如果有效负载长度较短:客户端可以接收修改后的有效负载,但是套接字无法正常关闭,客户端发送RST连接到服务器

如果有效负载长度较长:客户端也可以接收修改后的有效负载,但服务器反复发送数据包多次,套接字无法正常关闭,服务器套接字为'CLOSING',客户端套接字为'FIN_WAIT1'或'TIME_WAIT '系统队列最后是14,正常是6:

cat / proc / net / netfilter / nfnetlink_queue

1   7888     0 2  4016     0     0       14  1

从tcpdump显示,有很多“tcp转发”

来人帮帮我?谢谢,下面是测试代码:

from netfilterqueue import NetfilterQueue
from scapy.layers.inet import IP,TCP
from scapy.packet import Packet,Raw

def print_and_accept(pkt):
msg = IP(pkt.get_payload())
try:
    if msg.haslayer(TCP) and msg.haslayer(Raw):
        print msg[IP].show()
        _Data = 'for the hook test'
        msg[TCP].remove_payload()
        msg[TCP].add_payload(_Data)
        #msg[Raw].load = _Data
        msg[IP].len = len(msg)
        del msg[IP].chksum
        del msg[TCP].chksum
        msg = msg.__class__(str(msg))
        pkt.set_payload(str(msg))
        #new_msg = IP(pkt.get_payload())
        #print new_msg[TCP].payload
        #print new_msg[IP].show()
        print msg[IP].show()
        print 'End!!!'
        pkt.accept()
    else:
        pkt.accept()
except Exception, err:
    print err
    pkt.accept()

nfqueue = NetfilterQueue()
nfqueue.bind(1, print_and_accept)
try:
    nfqueue.run()
except KeyboardInterrupt:
    print('')
python iptables scapy payload netfilter
1个回答
0
投票

长度改变了,所以seq,ack num是不同的,它在关闭socket时引起异常,我还是不知道如何解决这个问题,但是它不影响有效载荷的传输

© www.soinside.com 2019 - 2024. All rights reserved.