Python 使用netfilterqueue和scapy修改HTTP头
我想使用netfilterqueue(0.6-最新版本)和scapy用我的值更改“主机”头。这是我的iptables规则:Python 使用netfilterqueue和scapy修改HTTP头,python,http,tcp,scapy,Python,Http,Tcp,Scapy,我想使用netfilterqueue(0.6-最新版本)和scapy用我的值更改“主机”头。这是我的iptables规则: iptables -A OUTPUT -p tcp --dport 80 -j NFQUEUE --queue-num 0 我有我的密码: from netfilterqueue import * from scapy.all import * def change(pkt): scapy_pkt = IP(pkt.get_payload()) if s
iptables -A OUTPUT -p tcp --dport 80 -j NFQUEUE --queue-num 0
我有我的密码:
from netfilterqueue import *
from scapy.all import *
def change(pkt):
scapy_pkt = IP(pkt.get_payload())
if scapy_pkt.haslayer(TCP) and scapy_pkt.getlayer(TCP).dport == 80 and scapy_pkt.haslayer(Raw):
http_content = scapy_pkt.getlayer(Raw).load
list_of_headers = http_content.split("\r\n")
new_headers = []
for i in list_of_headers:
if "Host" in i:
new_headers.append("Host: google.pl")
else:
new_headers.append(i)
pkt.set_payload("\r\n".join(new_headers))
pkt.accept()
nfqueue = NetfilterQueue()
nfqueue.bind(0, change)
try:
nfqueue.run()
except KeyboardInterrupt:
print
但是它不起作用。。我也不知道为什么。。
我在更改前后打印标题,唯一的更改是“主机”标题。苏。。为什么它不起作用?有人有什么想法吗?:)
我使用CURL进行测试,使用wireshark进行调试。请求未发送。我在wireshark里找不到
编辑:
我试图解决这个问题,我将代码更改为:
from netfilterqueue import *
from scapy.all import *
def change(pkt):
scapy_pkt = IP(pkt.get_payload())
print dir(pkt);
if scapy_pkt.haslayer(TCP) and scapy_pkt.getlayer(TCP).dport == 80 and scapy_pkt.haslayer(Raw):
#http_content = scapy_pkt.getlayer(Raw).load
#list_of_headers = http_content.split("\r\n")
#new_headers = []
#for i in list_of_headers:
# if "Host" in i:
# new_headers.append("Host: google.pl")
# else:
# new_headers.append(i)
scapy_pkt.dst = 'google.pl'
del scapy_pkt[IP].chksum
del scapy_pkt[TCP].chksum
pkt.set_payload(str(scapy_pkt))
pkt.accept()
nfqueue = NetfilterQueue()
nfqueue.bind(0, change)
try:
nfqueue.run()
except KeyboardInterrupt:
print
但它仍然不起作用。在wireshark中,我通过HTTP进行过滤。但当我通过TCP和destport==80进行过滤时,我可以看到包,但目标是从传递给CURL的参数到IP,而不是我在上面的代码中注入到包中的IP
谢谢你的提醒:)你这里有几个问题 [更新:PyPI的最新版本0.3已经过时,正如评论中指出的那样。0.6版确实实现了
.set\u payload()
]首先,您要使用的库似乎没有实现.set\u payload()
来更改数据包(请参阅)。您可能希望使用
首先(与您的第一次尝试相关),如果您必须更改数据的长度(这里就是这种情况,因为您尝试添加HTTP头),那么更改TCP有效负载是很困难的,因为您必须更改同一连接中其他数据包的序列号和确认号
要实现这一点,您有两个选项:
- 使用透明HTTP代理,该代理将修改或添加所需的头,并将要篡改的连接重定向到代理
- 确保所做的更改将保留数据的大小(例如,用另一个标题替换标题,并注意长度)
scapy_pkt.dst='google.pl'
设置IP层的目标(并且不更改数据),类似地,IP目标NAT也会设置。这是非常不同的,应该更容易做到(这里没有顺序/确认号混乱),但您必须在以下方面进行相同的修改:
- 接收到的不包含数据的数据包(您的代码仅更改具有TCP负载的数据包,因此保留SYN+ACK,例如,未修改的数据包)
- 您收到的数据包(还需要输入iptables规则)
内容长度
HTTP头的值(如果更改HTTP数据长度而不是HTTP头,则需要此值),但仍然存在TCP序列号/确认号问题,此数据包之后会出错。我认为答案中列出了更简单的选项(要么保留TCP数据长度,要么使用透明HTTP代理)。。。序列号是TCP会话中数据包的编号。当我改变一个包的顺序时,我应该在这个“谈话”中修改另一个包吗?什么是阿克?这是一个很长的答案。大概