转载请注明来源:http://blog.csdn.net/imred/article/details/50248637
原文地址:http://packetlife.net/blog/2010/mar/19/sniffing-wireshark-non-root-user/
这篇文章是针对Linux和某些UNIX系统而写的,Windows用户可以参阅这里
许多网络工程师第一次在Linux机器上使用Wireshark时可能感到很奇怪,因为他们没有权限使用任何网络接口。因为在默认情况下,网络接口(比如说eth0)的原始操作权限(raw access)需要root权限。但是Wireshark会提示你直接以root身份运行Wireshark并不是一个好主意,你可能会收到下面这样的警告:

Wireshark包含超过一百五十万行代码。不要以root身份执行它们。

的确,Wireshark有数目众多且复杂的协议解析器,这使得它在处理一些畸形的网络流量(故意的或无意的)潜在被攻击的可能性,最终可能导致无法正常工作或者执行恶意代码。那么,如果我们不以root身份运行Wireshark,我们该如何抓包呢?
Wireshark的首席开发人员,Gerald Combs,指出某些Linux发行版已经开始实现网络原始操作权限的Linux权能(capabilities)(许多关于Linux基本使用方法的书籍里并没有提到过Linux的capabilities机制,它是一种关于权限的机制,下面会提到一些,具体可查阅capabilities的man page,关于其他的权限机制,可以参阅我的博客其他一些文章,译者注)。在这篇文章里,我将一步步的教你具体如何使用这种权能特性,以及这些系统命令的背后机理,我使用的是Ubuntu 9.10。

文件系统权能(Filesystem Capabilities)

什么是文件系统权能?下面是man page的部分内容:

为了实现执行权限检查的目的,传统的Unix将进程分为两类:特权进程(有效UID为0,指超级用户或root),非特权进程(有效UID非0)。特权进程可以绕开内核的任何权限检查,而非特权进程则会被内核根据进程的凭证信息(有效UID,有效GID,附属组列表)进行完全的权限检查。
从kernel 2.2开始,Linux将传统上关联于超级用户的各种特权分离到了独立的单元,即我们所知的权能,这使它们可被独立的开启或关闭。权能是每个线程的属性。

手册接着列出了二十几个独立的POSIX权能,它们可被单个的可执行文件获取。为了进行嗅探,我们需要特别注意其中的两项权能:

CAP_NET_ADMIN-允许各种和网络相关的操作(比如设置特权套接字选项(privileged socket options),开启多播,设置网络端口,修改路由表)。
CAP_NET_RAW-允许使用原始(RAW)套接字和数据包(PACKET)套接字

CAP_NET_ADMIN允许我们将端口设置为混杂模式(promiscuous mode),CAP_NET_RAW允许对网络接口的原始操作权限,这样我们就可以直接从网线中抓包了。我们要使用setcap工具来进行这些权能的赋予。

允许非root用户抓包(Enabling Non-root Capture)

第一步:安装setcap(Install setcap)

首先,如果系统中没有setcap工具的话,我们必须要安装它。我们要用它来赋予Wireshark中dumpcap程序粒度化(granular)的权能。setcap是libcap2-bin包的一部分。

stretch@Sandbox:~$ sudo apt-get install libcap2-bin
Reading package lists… Done
Building dependency tree
Reading state information… Done
Suggested packages:
libcap-dev
The following NEW packages will be installed:
libcap2-bin
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 17.7kB of archives.
After this operation, 135kB of additional disk space will be used.
Get:1 http://us.archive.ubuntu.com karmic/universe libcap2-bin 1:2.16-5ubuntu1 [17.7kB]
Fetched 17.7kB in 0s (36.7kB/s)
Selecting previously deselected package libcap2-bin.
(Reading database … 146486 files and directories currently installed.)
Unpacking libcap2-bin (from …/libcap2-bin_1%3a2.16-5ubuntu1_amd64.deb) …
Processing triggers for man-db …
Setting up libcap2-bin (1:2.16-5ubuntu1) …

第二步:创建Wireshark用户组(可选)(Create a Wireshark Group (Optional))

一个应用程序获得权能以后,它默认仍然可被所有用户执行,因此我们最好建立一个Wireshark用户组,将Wireshark及类似工具的可执行权限仅赋给这个用户组的用户。当然了,这并不是必需的。

root@Sandbox# groupadd wireshark
root@Sandbox# usermod -a -G wireshark stretch

把你自己的非root用户添加到这个用户组之后,这个用户需要登出再登入才能使用户组设置生效。或者,你可以执行newgrp命令来强制使这个新的用户组生效(你必须在这个相同的终端环境下进行第三步操作)。(需要事先使用gpasswd设置用户组密码才能使用newgrp命令,而且使用newgrp只是临时的得到了用户组权限,下次登录就会消失,当然本例并不会消失,因为已经设置了新用户组,关闭终端也会使权限消失。译者注)

stretch@Sandbox$ newgrp wireshark

我们把dumpcap程序的执行权限赋给这个用户组,而不是Wireshark本身,这是因为负责底层抓包操作的只有dumpcap这个程序。将它的权限设为750,这样只有在这个用户组的用户才能执行它了。

root@Sandbox# chgrp wireshark /usr/bin/dumpcap
root@Sandbox# chmod 750 /usr/bin/dumpcap

第三步 获取权能(Grant Capabilities)

使用setcap获取权能相当简单:

root@Sandbox# setcap cap_net_raw,cap_net_admin=eip /usr/bin/dumpcap

权能表后面的=eip分别在生效(effective),可继承(inheritable)和允许的(permitted)三个映射集合中设置了这些权能的有效位。想要获取更彻底的解释,可以参阅这个FAQ
可以使用getcap来确认一下配置是否生效。

root@Sandbox# getcap /usr/bin/dumpcap
/usr/bin/dumpcap = cap_net_admin,cap_net_raw+eip

现在,我们添加在第二步创建的wireshark用户组中的用户就可以正常的使用Wireshark了。你现在在可开始嗅探列表中应该能看到所有的网络端口了。(如果没有,请再次检查wireshark用户组是否出现在了groups命令的输出中,而且你可能需要登出再登入才能使用户组设置生效。)
转载请注明来源:http://blog.csdn.net/imred/article/details/50248637

Logo

更多推荐