如何将http标头添加到使用scapy嗅探的数据包中

时间:2012-10-22 18:50:35

标签: python http network-programming packet-sniffers scapy

我正在尝试使用scapy嗅出一个输出的http数据包,在其中添加一些新的http标头并将其发送出去。这里的目的是仅在保持数据包完整的同时插入新标头。在最大任何校验和时,如果需要,应该重新计算。

几乎所有关于SO的问题都已完成,但并没有完全找到解决方案。

以下就是我所做的。

def parse(pkt):

    if pkt.haslayer(TCP) and pkt.getlayer(TCP).dport == 80 and pkt.haslayer(Raw):
        pkt = pkt / "New Header:value\r\n\r\n"

        # OR i tried this
        #pkt = pkt.getlayer(Raw).load / Raw.load(load="New Header:value\r\n\r\n")

        #pkt.getlayer(Raw).load("New Header:value\r\n\r\n")
        pkt.show()
        #del pkt[IP].chksum
        send(pkt)
#end parse function

# start sniffing
a=sniff(filter="tcp and ( port 80 )", prn=parse)

问题是上面的代码插入了一个新的原始有效负载部分,而不是添加一个普通的头。已有双重换行符\ r \ n \ r \ n根据HTTP标准指示标头终止。

为了解决这个问题,我尝试通过以下方式删除最后一个\ r \ n

   #pkt = pkt.getlayer(Raw).load[-2:] / Raw.load(load="New Header:value\r\n\r\n")

但是这会删除所有以前存在的标题,只剩下“新标题”。

我在Linux mint上试过这个。

更新: 我正在尝试创建一个新的http有效载荷,它将包含以前的标题,我将添加一些。有人可以帮助解决如何删除现有图层

1 个答案:

答案 0 :(得分:3)

如果我理解正确,您遇到的问题是您希望使用新标头更新现有HTTP请求。你想要的是更新一个字符串,Python不能直接做(字符串是不可变的)。

所以你应该做的是采用HTTP标头:

old_hdr = pkt[Raw]old_hdr = pkt[TCP].payload

并像字符串一样操纵它:

new_hdr = 'New Header: value'
hdr = old_hdr.split('\r\n') # This is a crappy hack. Parsing HTTP headers
hdr.insert(new_hdr, 2)      # is a [solved problem][1].
send_hdr = '\r\n'.join(hdr)
pkt[TCP].payload = send_hdr

如果发现校验和没有更新,请在发送数据包之前将其删除:

del pkt[TCP].chksum

并且Scapy将为您提供正确的价值。

编辑:我刚注意到我的链接失败了。 Here是解析HTTP标头的方法。