nessunonoNetworkManager
 |  0          it  #2
Ecco la versione 0.2 di noNetworkManager.

Aggiunta la possibilità di sniffare un pacchetto in transito su quell'interfaccia e di vederne la dimensioni in byte.
Semplicemente aggiungendo come secondo parametro "-sniff-one" e poi una di queste regole.
Inoltre, aggiunta la possiblità di vedere:
IP ADDRESS, NETMASK, NETWORK, DST ADDRESS, HW ADDRESS, MTU e MEMORY INFO.
Ecco il sorgente:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/ioctl.h> /* ioctl */
#include <net/if.h> /* interface, struct ifreq */
#include <sys/socket.h> /* socket */
#include <arpa/inet.h> /* inet_ntoa */
#include <netinet/in.h>
#include <netinet/ether.h>
#include <netinet/ip.h>
#include <pcap.h>

void die()
{
    exit(EXIT_FAILURE);
}

void get_mac(struct ifreq *hw,int *sock)
{
    if(ioctl(*sock,SIOCGIFHWADDR,hw) == -1)
    die(printf("[!] %s\n",strerror(errno)));
}

void get_mtu(struct ifreq *hw, int *sock)
{
    if(ioctl(*sock,SIOCGIFMTU,hw) == -1)
    die(printf("[!] %s\n",strerror(errno)));
}

void get_ifmap(struct ifreq *hw, int *sock)
{
    if(ioctl(*sock,SIOCGIFMAP,hw) == -1)
    die(printf("[!] %s\n",strerror(errno)));
}

struct in_addr get_ip(struct ifreq *hw, int *sock)
{
    struct sockaddr_in *sai;

    if(ioctl(*sock,SIOCGIFADDR,hw) == -1)
    die(printf("[!] %s\n",strerror(errno)));
    sai = (struct sockaddr_in *) &hw->ifr_addr;
    return sai->sin_addr;
}

struct in_addr get_dstaddr(struct ifreq *hw, int *sock)
{
    struct sockaddr_in *sai;
    
    if(ioctl(*sock,SIOCGIFDSTADDR,hw) == -1)
    die(printf("[!] %s\n",strerror(errno)));
    sai = (struct sockaddr_in *) &hw->ifr_dstaddr;
    return sai->sin_addr;
}

int main(int argc, char **argv)
{
    int sock,i,j,k;
    uid_t uid = 0;
    char errbuf[PCAP_ERRBUF_SIZE], *dev = NULL, filter_exp[500] = {0};
    bpf_u_int32 network, netmask;
    pcap_t *phandle;
    u_char pcap_packet;
    struct bpf_program pcap_program;
    struct pcap_pkthdr pcap_packet_h;
    struct in_addr netmask_ip, network_ip;
    struct ifreq hw;
    unsigned short int hif = 0;

    if(argc < 2)
    {
    uid = getuid();
    if(setuid(0) == -1)
        die(printf("[!] %s\n",strerror(errno)));
    if((dev = pcap_lookupdev(errbuf)) == NULL)
        die(printf("[!] %s\n",errbuf));
    printf("[+] No device passed as argument, using default device: %s\n",dev);
    }

    if(dev == NULL)
    {
    dev = strdup(argv[1]);
    hif = 1;
    }

    if(pcap_lookupnet(dev,&network,&netmask,errbuf) == -1) /* per avere netmask e network facilmente */
    die(printf("[!] %s\n",errbuf));

    if((sock = socket(AF_INET,SOCK_STREAM,0))<0) /*socket per comunicare con ioctl*/
    die(printf("[!] %s\n",strerror(errno)));

    memset(hw.ifr_name,0x00,IFNAMSIZ);
    memcpy(hw.ifr_name,dev,strlen(dev)); /*diamo il nome dell'interfaccia al campo ifr_name della struttura*/

    netmask_ip.s_addr = netmask; /* lo diamo in pasto ad una struct in_addr per la inet_ntoa successiva */
    network_ip.s_addr = network; /* ^ */

    printf("INTERFACE: %s\n\n",dev);
    printf(" IP ADDRESS: %s\n",inet_ntoa(get_ip(&hw,&sock)));
    printf("    NETMASK: %s\n",inet_ntoa(netmask_ip));
    printf("    NETWORK: %s\n",inet_ntoa(network_ip));
    printf("DST ADDRESS: %s\n\n",inet_ntoa(get_dstaddr(&hw,&sock)));

    get_mac(&hw,&sock);
    printf(" HW ADDRESS: %02X:%02X:%02X:%02X:%02X:%02X\n",
        (unsigned char) hw.ifr_hwaddr.sa_data[0],
        (unsigned char) hw.ifr_hwaddr.sa_data[1],      
        (unsigned char) hw.ifr_hwaddr.sa_data[2],
        (unsigned char) hw.ifr_hwaddr.sa_data[3],
        (unsigned char) hw.ifr_hwaddr.sa_data[4],
        (unsigned char) hw.ifr_hwaddr.sa_data[5]
        );

    get_mtu(&hw,&sock);
    printf("        MTU: %d\n\n",hw.ifr_mtu);

    get_ifmap(&hw,&sock);
    printf("MEMORY INFO:\n\n  Mem start: 0x%lX\n  Mem end: 0x%lX\n  Base addr: 0x%X\n  IRQ: 0x%X\n  DMA: 0x%X\n  Port: 0x%X\n\n",
        hw.ifr_map.mem_start,
        hw.ifr_map.mem_end,
        hw.ifr_map.base_addr,
        hw.ifr_map.irq,
        hw.ifr_map.dma,
        hw.ifr_map.port
        );
    close(sock);

    if(argc >=3)
    {
    puts("[+] Sniffing time...\n");
    if(!strncmp("-sniff-one",argv[2],10))
    {
        j=0;
        for(i=3;i<argc;i++)
        {
        for(k=0;k<(int)strlen(argv[i]);k++)
            filter_exp[j++] = argv[i][k];
        filter_exp[j++] = ' ';
        }
        if(j>0)
        printf("[+] Filter: %s\n",filter_exp);
        else 
        die(puts("[!] Filter not set\n[!] Exit!"));
    }
    else die(puts("[!] Filter not set\n[!] Exit!"));

    i=0;
    if((phandle = pcap_open_live(dev,1024,1,1000,errbuf)) == NULL)
        die(printf("[!] %s\n",errbuf));

    if(pcap_compile(phandle,&pcap_program,filter_exp,0,network) == -1)
        die(printf("[!] %s\n",pcap_geterr(phandle)));

    if(pcap_setfilter(phandle,&pcap_program) == -1)
        die(printf("[!] %s\n",pcap_geterr(phandle)));

    if((pcap_packet = pcap_next(phandle,&pcap_packet_h) == NULL))
        die(printf("[!] %s\n",pcap_geterr(phandle)));

    printf("Packet len: %d\n",pcap_packet_h.len);

    pcap_close(phandle);
    }
    if(hif)
    free(dev);
    if(uid)
    setuid(uid);
    return EXIT_SUCCESS;
}


Per compilare, sempre nella stessa maniera:
gcc noNetManager.c -o noNetManager -Wall -Wextra -lpcap -g -pedantic


Ed un esempio (in cui ho azzerato il mio mac address, per non renderlo pubblico).
sudo ./noNetManager eth1 -sniff-one icmp
INTERFACE: eth1

 IP ADDRESS: 192.168.1.4
    NETMASK: 255.255.255.0
    NETWORK: 192.168.1.0
DST ADDRESS: 192.168.1.4

 HW ADDRESS: 00:00:00:00:00:00
        MTU: 1500

MEMORY INFO:

  Mem start: 0x0
  Mem end: 0x0
  Base addr: 0x0
  IRQ: 0x13
  DMA: 0x0
  Port: 0x0

[+] Sniffing time...

[+] Filter: icmp 
Packet len: 98


(Filtro: icmp. Intanto in un'altra tab stavo facendo un ping, così non si sono avuti errori.)


This website uses cookies, even third part cookies: clicking on OK, continuing the navigation or interacting with the page you consented to the use of cookies. Information OK