scapy:发送数据包时操作不允许
我正在尝试用scapy学习一些数据包生成的知识。这个工具看起来很不错。根据一些文档,我在做这个:
l3=IP(dst="192.168.0.1", src="192.168.0.2", tos=(46 << 2))
但是我只得到了这个错误信息:
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
以管理员身份运行scapy解决了这个问题。但这不是我想要的。是因为普通用户不能创建原始套接字吗?如果是这样,有没有解决办法?
5 个回答
我还没自己试过,但我觉得这可能是一个选择(这个内容来自“15分钟学会Scapy”的教程):
另外,Scapy可以使用操作系统的套接字来发送和接收数据包。下面这个例子把一个UDP套接字分配给Scapy的StreamSocket,然后用它来查询www.example.com的IPv4地址。与其他Scapy套接字不同,StreamSockets不需要管理员权限。
import socket
sck = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # create an UDP socket
sck.connect(("8.8.8.8", 53)) # connect to 8.8.8.8 on 53/UDP
# Create the StreamSocket and gives the class used to decode the answer
ssck = StreamSocket(sck)
ssck.basecls = DNS
# Send the DNS query
ssck.sr1(DNS(rd=1, qd=DNSQR(qname="www.example.com")))
要运行一个临时的Python环境(比如用来做scapy的),并且需要cap_net_raw这个权限,我发现这样做是有效的:
sudo -E capsh --caps="cap_setpcap,cap_setuid,cap_setgid+ep cap_net_raw+eip" --keep=1 --user="$USER" --addamb="cap_net_raw" -- -c /usr/bin/python3
这个方法是从Arch Wiki上改编过来的。
一种不太安全的方法:直接给Python程序赋予CAP_NET_RAW的权限。
sudo setcap cap_net_raw=eip $(readlink -f $(which python))
要用 cap_net_raw
权限来运行 Scapy,下面是我知道的最安全、最简单的方法,步骤如下:
先复制一份 Python 程序:
$ sudo cp /usr/bin/python2.7 ~/python_netraw
把这份复制的程序归你所有:
$ sudo chown
你的用户名
~/python_netraw不让其他人使用它:
$ chmod -x,u+x ~/python_netraw
给它添加
cap_net_raw
权限:$ sudo setcap cap_net_raw=eip /usr/bin/python_netraw
用它来运行 Scapy:
$ ~/python_netraw -O /usr/bin/scapy
(或者每次需要用原始权限运行 Scapy 时,可以使用 sudo
命令。)
Scapy需要管理员权限才能创建原始套接字,因为它使用了Python的套接字库。根据Linux的相关文档,原始套接字只能在有效用户ID为0(也就是管理员)或者具备CAP_NET_RAW能力的情况下使用。
我找不到关于如何设置CAP_NET_RAW
能力的可靠文档,但如果你想在不使用管理员权限的情况下运行使用原始套接字的Scapy脚本,你需要了解这些内容。