我正在尝试使用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负载,其中将包含以前的标头,我将添加一些。 有人可以帮忙删除现有图层吗
如果我理解正确,那么您遇到的问题是您想使用新的标头更新现有的HTTP请求。您想要的是就地更新一个字符串,Python无法直接这样做(字符串是不可变的)。
因此,您应该采取的是HTTP标头:
old_hdr = pkt[Raw] 要么 old_hdr = pkt[TCP].payload
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会以正确的价格将它们放回给您。