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

Posted

技术标签:

【中文标题】Python-Scapy 之类的-如何在数据包级别创建 HTTP GET 请求【英文标题】:Python-Scapy or the like-How can I create an HTTP GET request at the packet level 【发布时间】:2011-06-12 15:44:12 【问题描述】:

我是一个普通的程序员,刚接触网络编程。

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

感谢您提供的任何帮助!

特里米尔特

【问题讨论】:

我建议使用比 Python 更底层的语言,比如 C/C++。 @nightcracker:我强烈反对。 Scapy 让您可以非常轻松地构建和发送数据包,而无需担心 C 或 C++ 程序员需要的任何东西。如果您对网络的工作方式感兴趣,Scapy 是您的最佳选择。如果您想编写一个实际的服务器,那么可能另一种语言更合适。我是以为网络设备编写 C 代码为生的人这么说的。 @OP:听听 nmichaels 怎么说。我只有 16 岁,对所有事情都有(没有根据的)意见。 【参考方案1】:

如果您想进行完整的三次握手,则必须手动进行。

从你的 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)

【讨论】:

非常感谢!到目前为止,我见过的最好的信息。是的,我确实计划自己做三向摇晃,但这和我所做的一样多。谢谢! 有没有办法使用嗅探捕获http数据包,然后将http标头插入其中? @fayyazkl:这应该是它自己的问题。 如何打印这个 get 请求的 anwser?我这样做有困难! 请注意,当您从服务器获取 SYN/ACK 时,您的内核的 TCP/IP 堆栈可能会在恶意连接和 RST 连接上崩溃。您可能需要阻止 RST。 ***.com/questions/9058052/…【参考方案2】:

自 Scapy 2.4.3 起,FTR 实现了对 HTTP 数据包的解析,其中一个名为“TCP_client”的实用程序自动进行 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()

【讨论】:

【参考方案3】:

你看过the tutorial吗?只是复制和粘贴,这看起来像是要组装一个 HTTP 请求:

>>>  a=Ether()/IP(dst="www.slashdot.org")/TCP()/"GET /index.html HTTP/1.0 \n\n"

【讨论】:

是的,我做到了。但是像这样发送它似乎不起作用,并且没有让我知道它在数据包级别是如何工作的。 对我也不起作用。只是试图永远接收。 问题询问如何在数据包级别创建 http get 请求,这个答案澄清了这一点。假设您需要进行 tcp 握手这一事实。不要认为回复有什么问题。不过,不了解tcp握手的人一定要参考正确答案。

以上是关于Python-Scapy 之类的-如何在数据包级别创建 HTTP GET 请求的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate学习之类级别注解

如何通过路由器抓包提取手机数据

Pandas:有没有办法使用“droplevel”之类的东西,并且在处理过程中,使用删除的级别标签作为前缀/后缀重命名另一个级别?

关于Ec2的Tcp级别信息

如何添加包级别注释或编辑 package-info.java?

如何使用 Log4j 更改包的日志级别?