5

有没有办法在没有 root 权限的情况下获取当前的无线 SSID?

iwconfig 告诉我 ESSID,但前提是我以 root 身份运行它。

4

1 回答 1

6

如果您查看iwconfig( wireless_tools ) 的源代码,您会看到这一行:

iwconfig.c:639: if(iw_get_ext(skfd, ifname, SIOCGIWESSID, &wrq) < 0)

该行负责获取 ESSID ( wireless.h )。而且我认为只有root才有权限(开箱即用)来执行此操作,因此调用的函数iw_get_extiwlib.hwireless_tools包中定义)ioctl将返回EPERMOperation not permitted)。

/*------------------------------------------------------------------*/
/*
 * Wrapper to extract some Wireless Parameter out of the driver
 */
static inline int
iw_get_ext(int                  skfd,           /* Socket to the kernel */
           const char *         ifname,         /* Device name */
           int                  request,        /* WE ID */
           struct iwreq *       pwrq)           /* Fixed part of the request */
{
  /* Set device name */
  strncpy(pwrq->ifr_name, ifname, IFNAMSIZ);
  /* Do the request */
  return(ioctl(skfd, request, pwrq));
}

您有 2 个解决方案:

  1. 使用setuid允许用户使用iwconfig命令:

    sudo chmod u+s /sbin/iwconfig

  2. 您还可以尝试使用CAP_NET_ADMIN允许特定用户使用某些特定功能的功能进行一些黑客攻击。这里有一些关于CAP_NET_ADMIN

http://packetlife.net/blog/2010/mar/19/sniffing-wireshark-non-root-user/

http://peternixon.net/news/2012/01/28/configure-tcpdump-work-non-root-user-opensuse-using-file-system-capabilities/

http://www.lids.org/lids-howto/node48.html

http://lwn.net/Articles/430462/

最后,您可以使用strace跟踪所有系统调用并确认ioctl调用对此负责:

这样root做:

#strace /sbin/iwconfig your_interface_name > strace_iwconfig_root.log

普通用户一样:

$strace /sbin/iwconfig your_interface_name > strace_iwconfig_normal.log

并比较结果。

于 2012-09-02T03:16:48.167 回答