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:
Per compilare, sempre nella stessa maniera:
Ed un esempio (in cui ho azzerato il mio mac address, per non renderlo pubblico).
(Filtro: icmp. Intanto in un'altra tab stavo facendo un ping, così non si sono avuti errori.)
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:
bash:Text version
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).
bash:Text version
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.)