我正在尝试使用 scapy 嗅探一个传出的 http 数据包,在其中添加一些新的 http header 并向前发送。这里的目的是仅插入新的 header ,同时保持数据包完好无损。如果需要,最多应重新计算任何校验和。
已经解决了几乎所有关于 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)
问题是上面的代码插入了一个新的原始负载部分,而不是添加一个普通的 header 。根据 HTTP 标准,已经有一个双换行符\r\n\r\n 来指示 header 终止。
为了克服这个问题,我尝试通过如下方式删除最后一个\r\n
#pkt = pkt.getlayer(Raw).load[-2:] / Raw.load(load="New Header:value\r\n\r\n")
但这会删除所有以前存在的 header ,只保留“新 header ”。
我已经在 Linux mint 上试过了。
更新: 我正在尝试创建一个新的 http 有效负载,其中包含以前的 header ,我将添加一些。有人可以帮助解决如何删除现有图层的问题吗
最佳答案
如果我没理解错的话,你遇到的问题是你想用新的 header 更新现有的 HTTP 请求。您想要的是就地更新字符串,而 Python 无法直接执行此操作(字符串是不可变的)。
所以你应该做的是获取 HTTP header :
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 header 。
关于python - 如何将http header 添加到使用scapy嗅探的数据包中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13017797/