我想通过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响应数据包时,我尝试了很多方法。
答案 0 :(得分:2)
Scapy没有本机HTTP层解析器,但是,您可以轻松发送HTTP请求/响应,因为它是一个文本协议:
Execute
RESP = "HTTP/1.1 200 OK\r\n"
RESP += "Server: exampleServer\r\n"
RESP += "Content-Length: 6\r\n"
RESP += "\r\n"
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
是先前进行的3次握手(SYN,SYN-ACK,ACK)的第三段,因为在通过TCP发送数据之前这是必要的。
答案 1 :(得分:1)
虽然,Scapy没有对HTTP Layer的原生支持,但有一个python模块可用于扩展Scapy的功能以支持HTTP层。模块名称为“scapy-http”,可以在invernizzi/scapy-http的github上找到。
您可以使用pip安装它:
sudo pip install scapy-http
以下是github存储库的示例代码:
#!/usr/bin/env python try: import scapy.all as scapy except ImportError: import scapy try: # This import works from the project directory import scapy_http.http except ImportError: # If you installed this package via pip, you just need to execute this from scapy.layers import http packets = scapy.rdpcap('example_network_traffic.pcap') for p in packets: print '=' * 78 p.show()
使用此模块,您可以生成HTTP数据包而无需发送自己的文本数据。
答案 2 :(得分:0)
正如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>' |>>>>>
您应该read the doc ,并可能嗅探一些http响应以了解您需要修改哪些字段