Python 没有根的 Scapy 嗅探
Python Scapy sniff without root
我想知道是否有可能 运行 Scapy 的 'sniff(...)' 没有 root 权限。
它用在应用程序中,其中捕获了某些包。但我不想 运行 整个应用程序具有 root 权限或更改 scapy 本身的任何内容。
提前致谢!
编辑:
我使用以下代码进行测试:
from scapy.all import *
def arp_monitor_callback(pkt):
if ARP in pkt and pkt[ARP].op in (1,2): #who-has or is-at
return pkt.sprintf("%ARP.hwsrc% %ARP.psrc%")
sniff(prn=arp_monitor_callback, filter="arp", store=0)
我只能使用 sudo 运行 它。
我尝试使用 sudo setcap 'cap_net_admin=+eip' test.py
设置功能。但它没有显示任何效果。即使 all
功能也无济于事。
您需要为二进制文件设置功能 运行 连接您的脚本,即:python 和 tcpdump 如果您希望能够以 ./test.py
的形式执行脚本:
setcap cap_net_raw=eip /usr/bin/pythonX.X
setcap cap_net_raw=eip /usr/bin/tcpdump
其中 X.X 是您用于 运行 脚本的 python 版本。
(请注意,您系统上的路径可能不同)
请注意,这允许任何人在您的系统上打开原始套接字。
虽然 提供的解决方案在技术上是正确的,但由于直接在 /usr/bin 中的二进制文件上设置文件功能,它有一个缺点,即允许系统中的任何人打开原始套接字。
实现预期结果的另一种方法 - 脚本 运行 只是 CAP_NET_RAW - 是使用环境功能。这可以通过利用一个小的辅助二进制文件来完成,该二进制文件将环境功能和 exec() 设置为 python 解释器。有关参考,请参阅 this gist。
使用参考实现,假设将正确的文件功能分配给 ./ambient
:
$ sudo setcap 'cap_net_raw=p' ambient
您的脚本将启动为:
$ ./ambient -c '13' /usr/bin/python ./test.py
请注意:
- 13 是 CAP_NET_RAW 根据 capability.h
的整数值
- 环境功能自内核 4.3 起可用
- 您可以使用 pscap 来验证进程是否在其有效集中启动时具有所需的功能
为什么这个方法有效?
环境能力在 exec() 调用中保留(因此传递给所有随后创建的子进程)并在它们的有效集合中提升,例如由 python 脚本调用的二进制文件或 tcpdump 调用的 python 解释器。这当然是一种简化,有关功能集之间转换的完整描述,请参阅 capabilities(7)
我想知道是否有可能 运行 Scapy 的 'sniff(...)' 没有 root 权限。
它用在应用程序中,其中捕获了某些包。但我不想 运行 整个应用程序具有 root 权限或更改 scapy 本身的任何内容。
提前致谢!
编辑:
我使用以下代码进行测试:
from scapy.all import *
def arp_monitor_callback(pkt):
if ARP in pkt and pkt[ARP].op in (1,2): #who-has or is-at
return pkt.sprintf("%ARP.hwsrc% %ARP.psrc%")
sniff(prn=arp_monitor_callback, filter="arp", store=0)
我只能使用 sudo 运行 它。
我尝试使用 sudo setcap 'cap_net_admin=+eip' test.py
设置功能。但它没有显示任何效果。即使 all
功能也无济于事。
您需要为二进制文件设置功能 运行 连接您的脚本,即:python 和 tcpdump 如果您希望能够以 ./test.py
的形式执行脚本:
setcap cap_net_raw=eip /usr/bin/pythonX.X
setcap cap_net_raw=eip /usr/bin/tcpdump
其中 X.X 是您用于 运行 脚本的 python 版本。
(请注意,您系统上的路径可能不同)
请注意,这允许任何人在您的系统上打开原始套接字。
虽然
实现预期结果的另一种方法 - 脚本 运行 只是 CAP_NET_RAW - 是使用环境功能。这可以通过利用一个小的辅助二进制文件来完成,该二进制文件将环境功能和 exec() 设置为 python 解释器。有关参考,请参阅 this gist。
使用参考实现,假设将正确的文件功能分配给 ./ambient
:
$ sudo setcap 'cap_net_raw=p' ambient
您的脚本将启动为:
$ ./ambient -c '13' /usr/bin/python ./test.py
请注意:
- 13 是 CAP_NET_RAW 根据 capability.h 的整数值
- 环境功能自内核 4.3 起可用
- 您可以使用 pscap 来验证进程是否在其有效集中启动时具有所需的功能
为什么这个方法有效?
环境能力在 exec() 调用中保留(因此传递给所有随后创建的子进程)并在它们的有效集合中提升,例如由 python 脚本调用的二进制文件或 tcpdump 调用的 python 解释器。这当然是一种简化,有关功能集之间转换的完整描述,请参阅 capabilities(7)