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

lan*_*ng2 8 scapy

我正在尝试用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套接字吗?如果是这样,有解决方案吗?

RyP*_*eck 8

Scapy需要root权限才能创建原始套接字,因为它使用Python套接字库.根据Linux原始页面,只允许原始套接字使用"有效用户ID为0或CAP_NET_RAW功能" .

我无法找到关于设置CAP_NET_RAW功能的可靠文档,但是如果您正在寻找运行Scapy脚本的用户原始套接字而不需要root,那么您就需要这样做.


gat*_*ich 7

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

(或者sudo每次需要使用原始权限运行Scapy时使用.)


小智 5

一种肮脏的方法,可能不安全:直接为 Python 提供 CAP_NET_RAW 功能:

sudo setcap cap_net_raw=eip $(readlink -f $(which python))
Run Code Online (Sandbox Code Playgroud)