Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用netfilterqueue和scapy修改HTTP头_Python_Http_Tcp_Scapy - Fatal编程技术网

Python 使用netfilterqueue和scapy修改HTTP头

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

我想使用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 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规则)

您好,感谢您的回复。苏。。我使用的这个库实现了set_payload()-我使用的是0.6版本,您提供了0.3版本的链接。哼所以这并不是我想的那么简单。。你能看看我输入的数据修改吗-?我已经更新了你评论第一部分的答案。pastebin上的代码尝试修复
内容长度
HTTP头的值(如果更改HTTP数据长度而不是HTTP头,则需要此值),但仍然存在TCP序列号/确认号问题,此数据包之后会出错。我认为答案中列出了更简单的选项(要么保留TCP数据长度,要么使用透明HTTP代理)。。。序列号是TCP会话中数据包的编号。当我改变一个包的顺序时,我应该在这个“谈话”中修改另一个包吗?什么是阿克?这是一个很长的答案。大概