scapy:发送数据包时操作不允许

10 投票
5 回答
26161 浏览
提问于 2025-04-17 22:25

我正在尝试用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 个回答

0

我还没自己试过,但我觉得这可能是一个选择(这个内容来自“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")))
0

要运行一个临时的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上改编过来的。

5

一种不太安全的方法:直接给Python程序赋予CAP_NET_RAW的权限。

sudo setcap cap_net_raw=eip $(readlink -f $(which python))
8

要用 cap_net_raw 权限来运行 Scapy,下面是我知道的最安全、最简单的方法,步骤如下:

  1. 先复制一份 Python 程序:

    $ sudo cp /usr/bin/python2.7 ~/python_netraw

  2. 把这份复制的程序归你所有:

    $ sudo chown 你的用户名 ~/python_netraw

  3. 不让其他人使用它:

    $ chmod -x,u+x ~/python_netraw

  4. 给它添加 cap_net_raw 权限:

    $ sudo setcap cap_net_raw=eip /usr/bin/python_netraw

  5. 用它来运行 Scapy:

    $ ~/python_netraw -O /usr/bin/scapy

(或者每次需要用原始权限运行 Scapy 时,可以使用 sudo 命令。)

12

Scapy需要管理员权限才能创建原始套接字,因为它使用了Python的套接字库。根据Linux的相关文档,原始套接字只能在有效用户ID为0(也就是管理员)或者具备CAP_NET_RAW能力的情况下使用。

我找不到关于如何设置CAP_NET_RAW能力的可靠文档,但如果你想在不使用管理员权限的情况下运行使用原始套接字的Scapy脚本,你需要了解这些内容。

撰写回答