我试图弄清楚如何使用 scapy 库读取 IP 标志(而不是 TCP)。我知道它存储在“flags”中,并且是 FlagsField 类型。根据IP协议规范,有3个标志R、MF和DF。我搜索了又搜索,但找不到任何有关如何读取这些标志的信息。有任何想法吗?
谢谢大家的意见。
我将 ICMP“需要分段,设置 DF 位”注入服务器,理想情况下服务器应开始发送 ICMP 中“下一跳 MTU”字段中提到的大小的数据包。但这是行不通的。
这是服务器代码:
#!/usr/bin/env python
import socket # Import socket module
import time
import os
range= [1,2,3,4,5,6,7,8,9]
s = socket.socket() # Create a socket object
host = '192.168.0.17' # Get local machine name
port = 12349 # Reserve a port for your service.
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind((host, port)) # Bind to the port
rand_string = os.urandom(1600)
s.listen(5) # Now wait for client connection.
while True:
c, addr = s.accept() # Establish connection with client.
print …Run Code Online (Sandbox Code Playgroud) 我正在使用 python 的 scapy 库做一个小网络项目。我的项目涉及嗅探数据包,并在第 3 层和第 4 层之间填充一个新层。
使用本指南,http://www.secdev.org/projects/scapy/doc/build_dissect.html
我能够创建一个新的数据包层。我可以通过执行以下操作轻松地将图层添加到现有数据包的顶部,
packet = newlayer()/packet
Run Code Online (Sandbox Code Playgroud)
而 newlayer() 层将被放置在 IP 层之下。但是,我想将这个新层夹在第 3 层和第 4 层之间(而不是就在 IP 之下)。但我似乎无法找到一种简单的方法来实现这一点。
我知道我可以创建一个新数据包并执行类似的操作,
packet = Ether()/IP()/newlayer()/TCP()
Run Code Online (Sandbox Code Playgroud)
但是,因为我想将该层插入到我已经嗅探过的数据包中,所以我想简单地修改原始数据包,而不是从头开始创建一个新数据包。
任何帮助,将不胜感激!
我试图Scapy从一开始就使用Python来分析数据包.在最近的搜索中,我发现python中有另一个名为的模块dpkt.使用此模块,我可以解析数据包的各个层,创建数据包,读取.pcap文件并写入.pcap文件.我发现他们之间的区别是:
缺少实时数据包嗅探器 dpkt
某些字段需要使用struct.unpackin 解压缩dpkt.
我还缺少其他差异吗?
我试图用 Scapy 编写 TCP RST 攻击,但我的代码不起作用。请帮助我解决我的问题。
from scapy.all import *
def poison(packet):
packet[TCP].flags='RST'
sendp(packet)
sniff(filter='tcp',prn=poison)
Run Code Online (Sandbox Code Playgroud)
有问题flags,我想。有一个错误:
回溯(最近一次调用):
文件“Univer.py”,第 6 行,在 sniff(filter='tcp',prn=poison)
文件“/usr/lib/pymodules/python2.6/scapy/sendrecv.py”中,第 559 行,嗅探 r =
prn (p)文件“Univer.py”,第 3 行,毒包[TCP].flags='RST'
文件“/usr/lib/pymodules/python2.6/scapy/packet .py”,第 186 行,在 setattr self.setfieldval(attr,val)
文件“/usr/lib/pymodules/python2.6/scapy/packet.py”,第 175 行,在 setfieldval self.fields[attr] = any2i (self, val)
文件“/usr/lib/pymodules/python2.6/scapy/fields.py”,第 785 行,在 any2i y |= 1 << self.names.index(i)值错误:未找到子字符串
我在localhost上运行apache2,我想截取并修改来自localhost的http请求.通过修改我想将标题的Accept-Encoding属性更改为'identity'.使用Burp-Suite,它工作得很好.但是,使用我的scapy脚本似乎已经发送了数据包,因为http响应仍然是编码的.
scapy脚本:
from scapy.all import *
def intercept(pkt):
if pkt.haslayer(Raw):
http_content = pkt.getlayer(Raw).load
http_content = http_content.replace("Accept-Encoding: gzip, deflate", "Accept-Encoding: identity")
pkt[Raw].load = http_content
print pkt.show()
send(pkt)
def main():
sniff(iface='lo', filter='tcp port 80', prn=intercept)
if __name__ == '__main__':
main()
Run Code Online (Sandbox Code Playgroud)
这就是我作为回应得到的回复:
<skipped>
###[ Raw ]###
load = 'HTTP/1.1 200 OK\r\nDate: Thu, 11 Aug 2016 09:34:38 GMT\r\nServer: Apache/2.4.23 (Debian)\r\nLast-Modified: Thu, 11 Aug 2016 09:34:25 GMT\r\nETag: "7d-539c878b8f8fd-gzip"\r\nAccept-Ranges: bytes\r\nVary: Accept-Encoding\r\nContent-Encoding: gzip\r\nContent-Length: 103\r\nConnection: close\r\nContent-Type: text/html\r\n\r\n\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x03\xb3\xc9(\xc9\xcd\xb1\xe3\xb2\xc9HML\xb1\xe3RPP\xb0)\xc9,\xc9I\xb5\xf3H\xcd\xc9\xc9W\x08\xcf/\xcaI\xb1\xd1\x87\x08q\xd9\xe8CT\xd9$\xe5\xa7TB\x14g\x18!\xabT\x04\xaa0\x82H\x14@\xc5\x13\xd3\x133\xf3\xf4\xf4\xf4l\xf4\x0b@\x06@t\x02\x95\x81m\x05\x00\x1c\x95F\x1d}\x00\x00\x00'
Run Code Online (Sandbox Code Playgroud)
这是编码的.
有人可以帮忙吗?
我正在搜索可以扫描WiFi网络并打印所有SSID的程序.我尝试用scapy,但我失败了.我正在使用pyCharm编辑器.
我试过这段代码:
from scapy.all import *
from scapy.layers.dot11 import Dot11
def packet_handler(pkt):
if pkt.haslayer(Dot11) and pkt.type == 2:
print(pkt.show())
scapy.sniff(iface="mon0", prn=packet_handler)
Run Code Online (Sandbox Code Playgroud) 我正在PyCharm的一个项目,我需要调试代码的某些部分.
当我尝试调试时,调试器只是"跳过"断点而不停止它们.在网上进行了很多无用的尝试之后,我发现当我导入Scapy模块时,调试器不起作用,并且当没有导入Scapy时,一切都运行起来很精细.
顺便说一句 - 我在Ubuntu OS上工作.
有任何想法吗??
我正在尝试改用 Scapy 而不是 Wireshark,但是在解码我获得的数据时遇到了问题。在 Wireshark 中,我可以很容易地看到标记为“分布式交互式模拟”的过滤数据包的最后一层,但在 Scapy 中,最后一层是“原始”。我正在尝试以相同的人类可读格式从该层获取数据。到目前为止,我已经得到:
# Capture with Scapy
from scapy.all import sniff
capture = sniff(filter="dst 10.6.255.255 and port 3000", count=5)
packet = capture[0]
raw = pkt.lastlayer()
print(raw)
<Raw load='\x068\x14\x05L\x88nK\x00x\x00\x00\x00\x94\x08\x88\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x9f\x00\x00\x02 \x00\x01sj\x9b\xf4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04p\x00\x08\x00\x00\x00\x00\x00\x00d\xe9Y<\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x8c\x00\x00\x113\x00\x00\x00\x01\x00\x02\x0c\x00\x00\x00\x01\x02\x00\x00\x00\x041187\x00\x00\x00\x00\x00' |>
Run Code Online (Sandbox Code Playgroud)
有人可以告诉我如何使这个人类可读吗?
我正在尝试从 pcap 文件中的每个数据包中提取特定字节。所有数据包都是ICMP。
在数据部分,有一个字节会改变每个数据包。每个人都处于相同的位置。我想提取那个字节。
使用 scapy:
pkts = rdpcap('test.pcap')
pl = PacketList([p for p in pkts])
bytes(pl[12].payload)
Run Code Online (Sandbox Code Playgroud)
返回以下内容:
b'E\x00\x00T]\xa7\x00\x00***J***\x01!A\xc0\xa88\x01\xc0\xa88o\x08\x004\xe9\xbf2\x00\x00^"\x87\xbe\x00\x0c2\xf4\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !"#$%&\'()*+,-./01234567'
我已将要提取的字节包含在三颗星内。但是,如果我打印出每个数据包的字节,我想提取的字节将处于不同的偏移量中。
如果我为每个数据包运行一个 hexdump,如下所示:
hexdump(bytes(pl[12].payload))
Run Code Online (Sandbox Code Playgroud)
我要提取的特定字节总是在相同的位置,但我不知道如何提取它。
如何使用 scapy 从 pcap 中提取特定字节?
按照这里的答案:从 pcap 文件中获取有效负载中的特定字节
如果我执行相同的命令,它不会做任何有用的事情:
>>> hexdump(pkts[14][2].load[8])
0000 00 00 00 00 00 00 00 00 ........
>>>
Run Code Online (Sandbox Code Playgroud)