【问题标题】:scapy: Operation not permitted when sending packetsscapy:发送数据包时不允许操作
【发布时间】:2014-04-20 16:56:27
【问题描述】:

我正在尝试使用 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

以 root 身份运行 scapy 解决了这个问题。但这不是我想要的。是因为普通用户无法创建 RAW 套接字吗?如果有,有解决办法吗?

【问题讨论】:

    标签: python scapy


    【解决方案1】:

    Scapy 需要 root 权限才能创建原始套接字,因为它使用 Python 套接字库。根据Linux raw man pages.

    ,仅允许使用“有效用户 ID 为 0 或 CAP_NET_RAW 能力”的原始套接字

    我找不到关于设置CAP_NET_RAW 功能的可靠文档,但如果您正在寻找一种解决方法来运行 Scapy 脚本,该脚本使用没有 root 的原始套接字,这就是您需要做的。

    【讨论】:

    • 如果您使用CAP_NET_RAW 功能成功地做到了这一点,请告诉我。
    【解决方案2】:

    仅使用cap_net_raw 权限运行 Scapy...

    我所知道的最安全且不太复杂的方法是,按顺序:

    1. 制作 Python 二进制文件的个人副本:

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

    2. 拥有它:

      $ sudo chown your user name ~/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。)

    【讨论】:

      【解决方案3】:

      一种肮脏的方法,可能不安全:直接将 CAP_NET_RAW 功能赋予 Python:

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

      【讨论】:

      • 感谢您的回答,但其他答案也建议设置 CAP_NET_RAW。
      • 是的,这是真的。但我建议为全局可执行文件执行此操作。但是,这使每个用户脚本都能够创建原始套接字。
      • 另外:不能再直接包含共享库,因为 LD_LIBRARY_PATH 被禁用。见stackoverflow.com/questions/9843178/…
      【解决方案4】:

      要使用 cap_net_raw 运行临时 python 环境(如 scapy),我发现这可行:

      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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-12-09
        • 2020-03-24
        • 2021-03-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-02
        • 1970-01-01
        相关资源
        最近更新 更多