Python-Scapy等-如何在数据包级别创建HTTP GET请求
我是一名中等水平的程序员,刚开始接触网络编程。
为了更好地理解网络,我正在尝试从数据包的角度执行一些基本的HTTP操作。我的问题是:我该如何使用像SCAPY这样的库来构建一个HTTP GET请求以及相关的数据包?我知道这听起来有点奇怪,但我找不到任何详细的信息,而且我自己用PAROS和Ethereal的尝试也不太成功。
谢谢大家的帮助!
Trimiert
3 个回答
0
你有没有看过这个教程?光是复制粘贴,看起来这个代码是用来组装一个HTTP请求的:
>>> a=Ether()/IP(dst="www.slashdot.org")/TCP()/"GET /index.html HTTP/1.0 \n\n"
5
顺便提一下,从Scapy 2.4.3版本开始,HTTP数据包的解析功能已经实现,并且增加了一个叫“TCP_client”的工具,可以自动完成三次握手。
虽然这段内容没有上面的回答那么详细,但看看也没坏处: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()
41
如果你想要完成一个完整的三次握手过程,你需要手动来做。
首先,你要发送一个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 |>>
接着,你会收到服务器发来的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' |>>>
最后,设置你的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)