我正在尝试用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套接字吗?如果有,是否有解决方案?
答案 0 :(得分:8)
Scapy需要root权限才能创建原始套接字,因为它使用Python套接字库。原始套接字仅允许使用&#34;有效用户ID为0或CAP_NET_RAW功能&#34;根据{{3}}
我无法找到关于设置CAP_NET_RAW
功能的可靠文档,但是如果您正在寻找一个解决方案来运行没有root用户原始套接字的Scapy脚本,那就是你需要做的。
答案 1 :(得分:6)
使用cap_net_raw
权限运行Scapy ...
我所知道的最安全,最简单的方法是:
制作python二进制文件的个人副本:
$ sudo cp /usr/bin/python2.7~/ python_netraw
拥有它:
$ sudo chown your user name
〜/ 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
。)
答案 2 :(得分:0)
要使用 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