Python 如何通过netfilter队列和scapy更改TCP负载和长度
使用Netfilter队列并通过更改TCP负载,测试客户端向测试服务器发送消息: 测试服务器中的iptables规则: iptables-A输出-p TCP-d[测试客户端ip]-j NFQUEUE--队列编号1 更改TCP负载后,如果更改后的长度相同,并且仅替换字符串,则所有行为都正确 但如果长度不同,则程序异常: 如果有效负载长度较短: 客户端可以接收修改后的负载,但套接字无法正常关闭,客户端向服务器发送RST连接 如果有效负载长度较长: 客户端也可以接收修改后的负载,但服务器多次重复发送数据包,套接字无法正常关闭,服务器套接字为“关闭”,客户端套接字为“FIN_WAIT1”或“TIME_WAIT” 系统队列最后为14,正常为6: cat/proc/net/netfilter/nfnetlink\u队列Python 如何通过netfilter队列和scapy更改TCP负载和长度,python,iptables,scapy,payload,netfilter,Python,Iptables,Scapy,Payload,Netfilter,使用Netfilter队列并通过更改TCP负载,测试客户端向测试服务器发送消息: 测试服务器中的iptables规则: iptables-A输出-p TCP-d[测试客户端ip]-j NFQUEUE--队列编号1 更改TCP负载后,如果更改后的长度相同,并且仅替换字符串,则所有行为都正确 但如果长度不同,则程序异常: 如果有效负载长度较短: 客户端可以接收修改后的负载,但套接字无法正常关闭,客户端向服务器发送RST连接 如果有效负载长度较长: 客户端也可以接收修改后的负载,但服务器多次重复发送数
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('')
长度改变了,所以seq,ack num不一样,这导致了在关闭套接字时出现异常,我仍然不知道如何解决这个问题,但不会影响有效负载传输