我正在尝试用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套接字吗?如果是这样,有解决方案吗?
Scapy需要root权限才能创建原始套接字,因为它使用Python套接字库.根据Linux原始页面,只允许原始套接字使用"有效用户ID为0或CAP_NET_RAW功能" .
我无法找到关于设置CAP_NET_RAW功能的可靠文档,但是如果您正在寻找运行Scapy脚本的用户原始套接字而不需要root,那么您就需要这样做.
用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
(或者sudo每次需要使用原始权限运行Scapy时使用.)
小智 5
一种肮脏的方法,可能不安全:直接为 Python 提供 CAP_NET_RAW 功能:
sudo setcap cap_net_raw=eip $(readlink -f $(which python))
Run Code Online (Sandbox Code Playgroud)