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_rcu 인구가 있으니까요 .struct net_deviceifr->ifr_hwaddr.sa_family = dev->type;sa_family


내가 하나 찾았어Kali Linux 페이지의 버그 보고이에 대해 sa_familyKali는 최신 커널을 사용하지 않습니다.

따라서 위의 테스트 프로그램을 실행하여 인쇄되는지 확인하겠습니다.

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

테스트 프로그램은 원시 소켓을 사용하므로 루트로 실행해야 합니다.

그런 다음 최신 커널 버전을 사용하여 4.x 커널 브랜치(예: gentoo 또는 Arch)에서 버그가 수정되었는지 확인합니다. 예를 들어 gcc.

이것이 내가 커널 코드에 들어갈 수 있는 정도이다. 어떻게 sa_family결정되나요?장치 해시, 내 범위를 벗어났습니다.

관련 정보