Python Scapy嗅探没有根

时间:2016-03-25 06:36:12

标签: python-2.7 scapy sniffing linux-capabilities

我想知道是否有可能让Scapy嗅到(......)'没有根权。

它用于捕获某些包的应用程序中。但我不想以root权限运行整个应用程序,也不想在scapy itselfe上更改任何内容。

提前致谢!

修改

为了测试,我使用以下代码:

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能力也无济于事。

2 个答案:

答案 0 :(得分:8)

如果您希望能够以./test.py执行脚本,则需要设置运行脚本i-e的二进制文件的功能:python和tcpdump:

setcap cap_net_raw=eip /usr/bin/pythonX.X
setcap cap_net_raw=eip /usr/bin/tcpdump

其中X.X是您用来运行脚本的python版本。

(请注意,系统上的路径可能不同)

请注意,这允许任何人在您的系统上打开原始套接字。

答案 1 :(得分:2)

虽然@Jeff提供的解决方案在技术上是正确的,但是由于直接在/ 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)