python非特权ICMP

2024-05-15 00:29:39 发布

您现在位置:Python中文网/ 问答频道 /正文

在试图找出从python ping(ICMP)某些内容的最佳方法时,我遇到了以下问题:

答案通常归结为“使用具有根权限的第三方模块”或“使用系统的ping命令并解析输出”。在本机方法中,icmplibM. Cowles and J. Diemer's ping.py显式地提到了对根权限的需要,就像scapymanual一样。

因此,从这方面来说,在没有特殊权限的情况下本机发送ICMP ping似乎是不可能的。system ping命令确实可以管理,但是它的手册页并没有说明如何管理。另一方面,man page for icmp似乎说这是可能的:

Non-privileged ICMP
     ICMP sockets can be opened with the SOCK_DGRAM socket type without
     requiring root privileges. The synopsis is the following:

     socket(AF_INET, SOCK_DGRAM, IPPROTO_ICMP)

     Datagram oriented ICMP sockets offer a subset of the functionality avail-
     able to raw ICMP sockets. Only IMCP request messages of the following
     types can be sent: ICMP_ECHO, ICMP_TSTAMP or ICMP_MASKREQ.

所以看起来,至少根据icmp,这是允许的。那么为什么所有的python工具都不能做到这一点呢?python工具是否过于通用,并期望对特权套接字的任何工作都是特权的?是否可以用C编写一个ping函数,该函数可以在没有根权限的情况下ping,并用它扩展python?有人这样做过吗?我是不是误解了这个问题?


Tags: orthe方法in命令权限is情况
3条回答

现代Linuxes ping使用libcap并要求libcap执行此操作。此操作检查(capget/set函数)和管理权限:

linux@jacax:~/WORK$ ldd /bin/ping  
    linux-gate.so.1 =>  (0xb77b6000)  
    libcap.so.2 => /lib/i386-linux-gnu/libcap.so.2 (0xb7796000)  
    libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb75e7000)  
    /lib/ld-linux.so.2 (0xb77b7000)   

假设你有一个“myping”程序:

linux@jacax:~/WORK$ getcap ./myping    
linux@jacax:~/WORK$   (-> nothing! )  
linux@jacax:~/WORK$ setcap cap_net_raw=ep ./myping  
unable to set CAP_SETFCAP effective capability: Operation not permitted  
linux@jacax:~/WORK$ sudo setcap cap_net_raw=ep ./myping  

现在做:

linux@jacax:~/WORK$ getcap ./myping  
./ping = cap_net_raw+ep

现在,你的“myping”将在没有根的情况下工作。也就是说,只要myping实际上是一个二进制程序。如果是脚本,则必须在脚本解释器上设置此功能。

下面是/sbin/ping如何“以某种方式管理”(在大多数Unix-y系统上):

$ ls -l /sbin/ping
-r-sr-xr-x  1 root  wheel  68448 Jan 26 10:00 /sbin/ping

看到了吗?它由root拥有,并且在权限中有关键的s位——setuserid。因此,无论哪个用户在运行它,ping都以根用户的身份运行。

如果您使用的是带有新的“非特权ICMP套接字”的BSD内核,那么看看需要什么来使用该功能从Python ping(当然,这对不太高级的内核上的任何用户都没有帮助)。

ping程序已安装setuid root。这允许任何用户使用该程序,并且仍然能够打开原始套接字。

在打开原始套接字之后,它通常会删除根特权。

通常需要原始套接字才能正确执行ICMP,并且原始套接字通常是受限制的。所以这根本不是python的错。

关于上面提到的ICMP,显然很多实现并不真正支持这些标志的组合。因此,很可能大多数实现只是使用它们“知道”在大多数/所有架构上工作的方式。

相关问题 更多 >

    热门问题