Python-Scapy之类的 - 如何在数据包级别创建HTTP GET请求

Tri*_*ert 24 python networking get http scapy

我是一名温和的程序员,只是进入网络编程.

为了提高我对网络的理解,我试图从数据包级别执行几个基本的HTTP操作.我的问题是:我如何使用SCAPY等库来构建HTTP GET请求和数据包级别的相关项目?我意识到这可能听起来很奇怪,但我似乎无法找到详细说明的任何信息,而我自己对PAROS和Ethereal的尝试已经......不尽如人意.

感谢您提供的任何帮助!

Trimiert

nmi*_*els 34

如果您想进行完全三次握手,则必须手动完成.

从您的SYN数据包开始:

>>> syn = IP(dst='www.google.com') / TCP(dport=80, flags='S')
>>> syn
<IP  frag=0 proto=tcp dst=Net('www.google.com') |<TCP  dport=www flags=S |>>
Run Code Online (Sandbox Code Playgroud)

然后从服务器接收SYN-ACK数据包,sr1工作.然后发送您的HTTP GET请求:

>>> syn_ack = sr1(syn)
Begin emission:
Finished to send 1 packets.
*
Received 1 packets, got 1 answers, remaining 0 packets

>>> syn_ack
<IP  version=4L ihl=5L tos=0x0 len=44 id=424 flags= frag=0L ttl=55 proto=tcp chksum=0x2caa src=74.125.226.148 dst=10.20.30.40 options=[] |<TCP  sport=www dport=ftp_data seq=3833491143 ack=1 dataofs=6L reserved=0L flags=SA window=5720 chksum=0xd8b6 urgptr=0 options=[('MSS', 1430)] |<Padding  load='\x00\x00' |>>>
Run Code Online (Sandbox Code Playgroud)

然后设置TCP序列和确认号码并发送GET:

getStr = 'GET / HTTP/1.1\r\nHost: www.google.com\r\n\r\n'
request = IP(dst='www.google.com') / TCP(dport=80, sport=syn_ack[TCP].dport,
             seq=syn_ack[TCP].ack, ack=syn_ack[TCP].seq + 1, flags='A') / getStr
reply = sr1(request)
Run Code Online (Sandbox Code Playgroud)

  • @fayyazkl:那应该是它自己的问题. (3认同)
  • 如何打印这个 get 请求的 anwser?我这样做有困难! (2认同)
  • 请注意,当您从服务器返回SYN/ACK时,内核的TCP/IP堆栈可能会在恶意连接和RST连接中发现.您可能需要阻止RST./sf/ask/634063671/ (2认同)

Cuk*_*c0d 5

FTR,从 Scapy 2.4.3 开始,在名为“TCP_client”的实用程序中实现了 HTTP 数据包的解析,以自动进行 3 次握手。

虽然它不像上面的答案那么有教学意义,但看看也没什么坏处:https://scapy.readthedocs.io/en/latest/layers/http.html#use-scapy-to-send-receive- http-1-x

load_layer("http")
req = HTTP()/HTTPRequest(
    Accept_Encoding=b'gzip, deflate',
    Cache_Control=b'no-cache',
    Connection=b'keep-alive',
    Host=b'www.secdev.org',
    Pragma=b'no-cache'
)
a = TCP_client.tcplink(HTTP, "www.secdev.org", 80)
answser = a.sr1(req)
a.close()
Run Code Online (Sandbox Code Playgroud)