启动 Ettercap 给我一个错误

启动 Ettercap 给我一个错误

在过去的 5 天里,我一直在网上寻找这个问题,而且找不到答案,每次我启动 ettercap 并选择我的接口为 wlan0 时,都会出现错误,就像这样

ERROR: 9, Bad file descriptor
[/build/ettercap-jPFHOw/ettercap-08.2/src/ec_network.c:source_init:245]
libnet_init: unknown physical layer type 0x323

我什至没有 ec_network.c 文件或 libnet 文件(如果与此问题相关),如果我需要下载它,我可以从哪里下载它?

谢谢

答案1

您可能已经发现了内核错误。也许我不应该将其命名为错误,因为可能只是对卡的特定标识符的支持从未添加到内核代码中。

处理物理层的ettercap代码如下:

 switch (ifr.ifr_hwaddr.sa_family)
 {
     case ARPHRD_ETHER:
     case ARPHRD_METRICOM:
#ifdef ARPHRD_LOOPBACK
     case ARPHRD_LOOPBACK:   
#endif
         l->link_type = DLT_EN10MB;
         l->link_offset = 0xe;
         break;
     case ARPHRD_SLIP:
     case ARPHRD_CSLIP:
     case ARPHRD_SLIP6:
     case ARPHRD_CSLIP6:
     case ARPHRD_PPP:
         l->link_type = DLT_RAW;
         break;
     case ARPHRD_FDDI:
         l->link_type   = DLT_FDDI;
         l->link_offset = 0x15;
         break;
     /* Token Ring */
     case ARPHRD_IEEE802:
     case ARPHRD_IEEE802_TR:
     case ARPHRD_PRONET:
         l->link_type   = DLT_PRONET;
         l->link_offset = 0x16;
         break;

     default:
         snprintf(l->err_buf, LIBNET_ERRBUF_SIZE,
             "unknown physical layer type 0x%x",
             ifr.ifr_hwaddr.sa_family);
     goto bad;
 }

您可以检查里面所有这些定义的值/usr/include/net/if_arp.h。是的,0x323 结果不是其中任何一个。此外,0x323 不是任何已知的设备net/if_arp.h

这里有一个测试程序填充ifr.ifr_hwaddr.sa_family并打印它:

#include <errno.h>
#include <stdio.h>
#include <string.h>
#include <arpa/inet.h>
#include <sys/ioctl.h>
#include <stropts.h>

#include <net/if.h>
#include <netinet/if_ether.h>
#include <net/if_arp.h>

int
main(int argc, char** argv)
{
    struct ifreq ifr;
    int fd = -1;
    char *iface = argv[1];

    fd = socket(PF_INET, SOCK_PACKET, htons(ETH_P_ALL));
    if (fd == -1)
    {
        if (errno == EPERM) {
            printf("UID/EUID 0 or capability CAP_NET_RAW required\n");

        } else {
            printf("socket: %s\n", strerror(errno));
        }
        return 1;
    }

    memset(&ifr, 0, sizeof (ifr));
    strncpy(ifr.ifr_name, iface, sizeof (ifr.ifr_name) -1);
    ifr.ifr_name[strlen(iface)] = '\0';

    if (ioctl(fd, SIOCGIFHWADDR, &ifr) < 0 )
    {
        printf("SIOCGIFHWADDR: %s\n", strerror(errno));
        return 1;
    }

    printf( "IFR: [%08x] sa_family [%02x]\n"
          , ifr.ifr_hwaddr, ifr.ifr_hwaddr.sa_family);
    return 0;
}

其中一半是简单地从ettercap的代码中复制的。无论如何,编译应该是微不足道的gcc -o prog prog.c(假设源被命名prog.c)并且您必须使用接口名称作为其第一个参数来运行它。例如

[root@haps ~]# /home/grochmal/tmp/libnet/test enp3s0
IFR: [24240001] sa_family [00]
[root@haps ~]# /home/grochmal/tmp/libnet/test wlp2s0
IFR: [22000001] sa_family [00]

(这是在我的机器上)


我们可以看到sa_family由以下内容填充:

ioctl(fd, SIOCGIFHWADDR, &ifr)

哪个运行这个:

  struct net_device *dev = dev_get_by_name_rcu(net, ifr->ifr_name);

  ...

  case SIOCGIFHWADDR:
          if (!dev->addr_len)
                  memset(ifr->ifr_hwaddr.sa_data, 0,
                         sizeof(ifr->ifr_hwaddr.sa_data));
          else
                  memcpy(ifr->ifr_hwaddr.sa_data, dev->dev_addr,
                         min(sizeof(ifr->ifr_hwaddr.sa_data),
                             (size_t)dev->addr_len));
          ifr->ifr_hwaddr.sa_family = dev->type;
          return 0;

填充.dev_get_by_name_rcustruct net_device因为我们也有ifr->ifr_hwaddr.sa_family = dev->type;人口sa_family


我找到了一个Kali Linux 页面上的错误报告关于这一点sa_family,但是kali不使用最新的内核。

因此,我将运行上面的测试程序以确保它打印:

IFR: [********] sa_family [323]

测试程序需要以 root 身份运行,因为它使用原始套接字。

然后我会尝试更新的内核版本来检查该错误是否已在 4.x 内核分支(例如 gentoo 或 arch)中修复。例如,运行带有gcc.测试程序没有库要求,因此可以轻松地在 Live CD 上编译。

这就是我能深入了解内核代码的程度了。究竟sa_family是如何确定的设备哈希,超出了我的范围。

相关内容