Art*_*ais 13 python ip networking tcp scapy
我正在努力将scapy与扭曲整合,但我遇到了OSX上这个非常奇怪的错误,我似乎无法弄明白.
基本上我无法通过原始套接字发送有效的TCP数据包(包括IP头).这就是我在做的事情:
import socket
from scapy.all import IP, TCP
pkt = IP(src='0.0.0.0', dst='127.0.0.1')/TCP()
spkt1 = str(pkt)
outs = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_RAW)
outs.setsockopt(socket.SOL_IP, socket.IP_HDRINCL, 1)
outs.sendto(spkt1, ('127.0.0.1', 0))
Run Code Online (Sandbox Code Playgroud)
当我运行这个时,我收到以下错误:
outs.sendto(spkt1, ('127.0.0.1', 0))
socket.error: [Errno 22] Invalid argument
如果您没有scapy on不想使用它,这是数据包base64编码:
import base64
spkt1 = base64.b64decode("RQAAKAABAABABvvOAAAAAH8AAAEAFABQAAAAAAAAAABQAiAAEH4AAA==")
Run Code Online (Sandbox Code Playgroud)
非常奇怪的是,几乎相同的数据包似乎正确发送:
spkt2 = base64.b64decode("RQBAAAWwAAACBgAAAAAAAH8AAAEAyAOEAAAAAAAAAACwAgDIAHsAAAIEBbQBAwMBAQEICk3PUjMAAAAABAIAAA==")
Run Code Online (Sandbox Code Playgroud)
这是两个数据包的样子:
SPKT1
0000 45 00 00 28 00 01 00 00 40 06 FB CE 00 00 00 00 E..(....@.......
0010 7F 00 00 01 00 14 00 50 00 00 00 00 00 00 00 00 .......P........
0020 50 02 20 00 10 7E 00 00 P. ..~..
SPKT2
0000 45 00 40 00 05 B0 00 00 02 06 00 00 00 00 00 00 E.@.............
0010 7F 00 00 01 00 C8 03 84 00 00 00 00 00 00 00 00 ................
0020 B0 02 00 C8 00 7B 00 00 02 04 05 B4 01 03 03 01 .....{..........
0030 01 01 08 0A 4D CF 52 33 00 00 00 00 04 02 00 00 ....M.R3........
Run Code Online (Sandbox Code Playgroud)
通过在wireshark中检查它们,它们仅在TCP部分中有所不同.
我做了很多不同的实验,最后我通过设置某些特定的TCP选项来获取数据包,但是这样的数据包不起作用是没有意义的.
有没有人知道为什么会这样?
编辑:
这个数据包确实有效:
pkt = IP(len=16384, src='0.0.0.0', dst='127.0.0.1',
id=RandShort(), ttl=2)/TCP(sport=255,
dport=900, flags="S", window=200,
options=[('MSS', 1460), ('WScale', 2)])
spkt = bytes(pkt)
spkt += '\x00'*20
Run Code Online (Sandbox Code Playgroud)
如果您不添加零,则它不起作用.
我最终决定原始套接字只是为了使用而被窃听。特别是由于该软件需要跨平台,OSX 的怪癖可能不适用于其他操作系统。
目前我只是简单地封装了 scapy 提供的“套接字”。将来我将编写一些仅依赖于 libdnet 的东西(因为这就是 scapy 编写原始帧的方法)。
您可以在这里找到它的实现:
https://github.com/hellais/txscapy
| 归档时间: |
|
| 查看次数: |
7317 次 |
| 最近记录: |