是否可以通过scapy创建HTTP响应



我想通过scapy向目标系统发送HTTP响应。我知道scapy使用分层实现来创建像IP/TCP/ETHER这样的数据包。要发送一个简单的TCP数据包,我们可以使用下面的scapy脚本。

#!/usr/bin/python
from scapy.all import *
ip=IP(src="10.10.1.207", dst="10.10.1.60")
payload="Hello World"
PUSH=TCP(sport=80, dport=3389, flags="F")
send(ip/PUSH/payload)

有什么方法可以用它连接HTTP层吗?然而,每次我在目标机器上收到TCP数据包而不是HTTP响应数据包时,我都尝试了很多方法。

编辑:这已经过时了。由于Scapy 2.4.3,您可以使用http层

Scapy没有本地HTTP层解析器,但是,您可以很容易地发送HTTP请求/响应,因为它是一个文本协议:

RESP  = "HTTP/1.1 200 OKrn"
RESP += "Server: exampleServerrn"
RESP += "Content-Length: 6rn"
RESP += "rn"
RESP += "A body"
IP(src="10.10.1.207", dst="10.10.1.60")/TCP(sport=80, dport=3389, flags="A", seq=ACK.ack, ack=ACK.seq)/RESP

ACK是先前进行的3路握手(SYN、SYN-ACK、ACK)的第三段,因为这在通过TCP发送数据之前是必要的。

尽管Scapy不支持HTTP层,但有一个python模块可用于扩展Scapy的功能以支持HTTP层。模块名称为"scapyhttp",可以在github上的invernizzi/scapyhttp找到

您可以使用pip安装它:

sudo-pip安装scapy http

以下是github存储库中的示例代码:

#/usr/bin/env python尝试:将scapy.all导入为scapy除了ImportError:进口货物尝试:#此导入在项目目录中工作导入scape_http.http除了ImportError:#如果你通过pip安装了这个软件包,你只需要执行从scape.layers导入httppackets=scapy.rdpcap('example_network_traffic.pcap')对于数据包中的p:打印'='*78p.show()

使用此模块,您可以生成HTTP数据包,而无需发送自己的文本数据。

正如Jeff Bencteux的回答所提到的,http层现在可以在scapy上使用。这可以很容易地做到,这里有一个例子:

>>>import scapy.all as S
>>>S.load_layer("http") # without this, http might not be loaded as default
>>> pkg = S.IP() / S.TCP() / HTTP() / HTTPResponse(Server="exampleServer") / "<html></html>"

最后一行末尾的刺痛是原始数据。回声pkg你会得到:

>>> pkg
<IP  frag=0 proto=tcp |<TCP  sport=http dport=http |<HTTP  |<HTTPResponse  Server='exampleServer' |<Raw  load='<html></html>' |>>>>>

您应该阅读文档,也许可以探查一些http响应,以了解需要修改的字段

最新更新