在此示例中,是用于为Proberequests创建应答机的代码。结果是 AP正在设备上显示。以下是我的代码。为了使它正常工作,我不得不进行一些更改。
import sys
import os
import time
from scapy.all import *
os.sys.path.append('/usr/lib/python2.7/dist-packages')
conf.iface = "wlan0mon"
class ProbeRequest_am(AnsweringMachine):
function_name = "pram"
mac = "00:11:22:33:44:55"
def is_request(self, pkt):
return Dot11ProbeReq in pkt
def make_reply(self, req):
rep = RadioTap()
rep /= Dot11(addr1=req.addr2, addr2=self.mac, addr3=self.mac, ID = RandShort(), SC= RandShort())
rep /= Dot11ProbeResp(cap="ESS", timestamp=int(time.time()))
rep /= Dot11Elt(ID="SSID",info ="Scapy !")
rep /= Dot11Elt(ID="Rates", info=b'\x82\x84\x0b\x16\x96')
rep /= Dot11Elt(ID="DSset", info=chr(10))
return rep
ProbeRequest_am()()
Run Code Online (Sandbox Code Playgroud)
首先,AP在我拥有的任何设备上都不可见。但是输出与我的设备在家里寻找我的AP有关。AFAIK我的智能手机(iOS 12.2)不会将其实际的MAC用于Proberequest,并且该程序仅应对Proberequest作出反应。但这是运行脚本的输出(我的iPhone的实际MAC,但已更改为发布= d0:c5:f3:00:00:00):
RadioTap / 802.11 Management 4 d0:c5:f3:00:00:00 > ff:ff:ff:ff:ff:ff …Run Code Online (Sandbox Code Playgroud) 在阻止方式中,我可以这样做:
from scapy.all import *
sniff(filter"tcp and port 80", count=10, prn = labmda x:x.summary())
# Below code will be executed only after 10 packets have been received
do_stuff()
do_stuff2()
do_stuff3()
Run Code Online (Sandbox Code Playgroud)
我希望能够以非阻塞的方式用scapy嗅探数据包,如下所示:
def packet_recevied_event(p):
print "Packet received event!"
print p.summary()
# The "event_handler" parameter is my wishful thinking
sniff(filter"tcp and port 80", count=10, prn=labmda x:x.summary(),
event_handler=packet_received_event)
#I want this to be executed immediately
do_stuff()
do_stuff2()
do_stuff3()
Run Code Online (Sandbox Code Playgroud)
总结一下:我的问题非常清楚,我希望能够继续执行代码而不用阻止它的嗅探功能.一种选择是为此打开一个单独的线程,但我想避免它并尽可能使用scapy本机工具.
环境细节:
python:2.7
scapy:2.1.0
os:ubuntu 12.04 64bit
我正在尝试用scapy学习一些数据包生成.它看起来很酷.根据一些文档我正在这样做:
l3=IP(dst="192.168.0.1", src="192.168.0.2", tos=(46 << 2))
Run Code Online (Sandbox Code Playgroud)
但只是为了得到以下错误信息:
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/usr/lib/python2.7/dist-packages/scapy/sendrecv.py", line 251, in send
__gen_send(conf.L3socket(*args, **kargs), x, inter=inter, loop=loop, count=count,verbose=verbose, realtime=realtime)
File "/usr/lib/python2.7/dist-packages/scapy/arch/linux.py", line 307, in __init__
self.ins = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.htons(type))
File "/usr/lib/python2.7/socket.py", line 187, in __init__
_sock = _realsocket(family, type, proto)
error: [Errno 1] Operation not permitted
Run Code Online (Sandbox Code Playgroud)
以root身份运行scapy解决了这个问题.但这不是我想要的.是因为普通用户无法创建RAW套接字吗?如果是这样,有解决方案吗?
我在scthon中使用scapy作为会话,但我想在脚本中使用它.为什么这样?我希望能够用来sys.argv指定要使用的IP地址以及使用其他模块.如何实现这一目标?
我使用sniffscapy模块的功能.我filter和我的prn功能做得很好.但现在,我想提取Raw的TCP packet,并使用十六进制或二进制格式的处理.
以下是scapy中Packet Class 的文档.
我怎样才能做到这一点 ?
我试过print packet[Raw]但它似乎被转换为ASCII或类似的东西.我想用十六进制或二进制保存它.
对于我正在做的项目,它使用scapy和套接字,我需要能够以root身份进行调试.
我已经想出如何在没有系统请求许可的情况下以root身份启动解释器.我补充说:
user ALL=(root) NOPASSWD:/home/user/git/Project/bin/python2.7
Run Code Online (Sandbox Code Playgroud)
到/etc/sudoers.tmp.我使用的路径导致我正在为此项目使用的虚拟环境的python解释器.LiClipse项目也使用此路径.现在我只需要让LiClipse以root身份运行解释器,但我不想以root身份启动LiClipse.我只是希望它在调试时以root身份使用此解释器.我怎样才能做到这一点?
我正在研究一种基于scapy的工具,我需要根据协议和目的地的IP地址来嗅探数据包
我想知道如何使用sniff()函数中的filter选项.我尝试在文档中使用格式,但大多数时候它会导致这样的问题. scapy中的sniff函数过滤器无法正常工作.
我使用的是
a=sniff(filter="host 172.16.18.69 and tcp port 80",prn = comp_pkt,count = 1)
Run Code Online (Sandbox Code Playgroud)
提前致谢!
从Linux上的Python我想嗅探802.11管理'探测请求'帧.这可以从Scapy那样:
# -*- coding: utf-8 -*-
from scapy.all import *
def proc(p):
if ( p.haslayer(Dot11ProbeReq) ):
mac=re.sub(':','',p.addr2)
ssid=p[Dot11Elt].info
ssid=ssid.decode('utf-8','ignore')
if ssid == "":
ssid="<BROADCAST>"
print "%s:%s" %(mac,ssid)
sniff(iface="mon0",prn=proc)
Run Code Online (Sandbox Code Playgroud)
或者像这样的tshark:
tshark -n -i mon0 subtype probereq -R 'wlan.fc.type_subtype eq 4' -T fields -e wlan.sa -e wlan_mgt.ssid
Run Code Online (Sandbox Code Playgroud)
我们可以重定向来自tshark的输出,并用一些Python啜饮它(不是很漂亮,但它可以工作).
但是,这两个选项都有GPL许可,这使得潜在的商业项目变得棘手.因此,我正试图在Python中找出针对此特定问题的"较低级别"解决方案.来自Google我已经设法找出了两个可能的方向:
Pcap库:似乎有三个可用于Python的pcap库: pylibpcap,pypcap和pcapy.我不太确定如何将上述功能纳入这些功能.任何示例代码或解决方案都会很棒.
原始套接字:PF_PACKET:"数据包套接字用于在设备驱动程序(OSI第2层)级别接收或发送原始数据包.它们允许用户在物理层顶部的用户空间中实现协议模块."
听起来这可能是另一种选择,完全绕过pcap.我听说过这可能是一个更好的方法,消除了pcap库的开销.不过,我不知道从哪里开始解决这个问题.
任何帮助解决这个问题将不胜感激.
我试图在Scapy建立一个3路握手.使用以下代码,
#!/usr/local/bin/python
from scapy.all import *
sport = random.randint(1024,65535)
# SYN
ip=IP(src='172.16.120.5',dst='172.16.100.101')
SYN=TCP(sport=sport,dport=443,flags='S',seq=1000)
SYNACK=sr1(ip/SYN)
# ACK
my_ack = SYNACK.seq + 1
ACK=TCP(sport=sport, dport=443, flags='A', seq=1001, ack=my_ack)
send(ip/ACK)
Run Code Online (Sandbox Code Playgroud)
但是在服务器上,我只看到SYN_RECV,即使发送了返回SYN-ACK并且返回发送了ACK.这是服务器的捕获(172.16.100.101),
08:10:19.455038 IP 172.16.120.5.58972 > 172.16.100.101.https: S 1000:1000(0) win 8192
08:10:19.455343 IP 172.16.100.101.https > 172.16.120.5.58972: S 2541678705:2541678705(0) ack 1001 win 18484 <mss 1460>
08:10:19.545808 IP 172.16.120.5.58972 > 172.16.100.101.https: . ack 1 win 8192
08:10:24.015204 IP 172.16.100.101.https > 172.16.120.5.58972: S 2541678705:2541678705(0) ack 1001 win 18484 <mss 1460>
Run Code Online (Sandbox Code Playgroud)
正如您所看到的那样,SYN-ACK被发送两次,因此看起来服务器不喜欢最终的ACK.有任何想法吗 ?
编辑:
我也直接从python打印每个数据包的输出.请注意,这是针对不同的连接.
>>> SYN
<TCP …Run Code Online (Sandbox Code Playgroud) 我正在比较 scapy 和 dpkt 的速度。我有一个包含 pcap 文件的目录,我解析并计算每个文件中的 http 请求。这是 scapy 代码:
import time
from scapy.all import *
def parse(f):
x = 0
pcap = rdpcap(f)
for p in pcap:
try:
if p.haslayer(TCP) and p.getlayer(TCP).dport == 80 and p.haslayer(Raw):
x = x + 1
except:
continue
print x
if __name__ == '__main__':\
path = '/home/pcaps'
start = time.time()
for file in os.listdir(path):
current = os.path.join(path, file)
print current
f = open(current)
parse(f)
f.close()
end = time.time()
print (end - start)
Run Code Online (Sandbox Code Playgroud)
与 …