PDA

Visualizza la versione completa : [C] Implementazione Sniffer


sparpazeo
15-03-2009, 13:28
Salve a tutti, ho iniziato a giocare un po con le socket di sistema e volevo provare a realizzare uno sniffer. Leggendo i vari documenti e copiando alcune funzioni e parti di codice, ho scritto questo:



#include <stdio.h>
#include <stdlib.h> //per chiamare la funzione exit()
#include <string.h> //per usare la funzione strncpy()
#include <netinet/in.h> //utilizza la funzione socket()
#include <sys/ioctl.h> //utilizza la funzione ioctl()
#include <net/if.h> //contiene la struttura ifreq
#include <linux/if_ether.h> //contiene la macro ETH_P_IP

struct sockaddr sorgente;
struct ifreq interfaccia;

int apertura_socket = 0;
char buffer[1500]; //massima lunghezza utile
int lunghezza_pacchetto = 0;
unsigned char *contenuto_header;

int main (int argc,char *argv[]) {

//APRO IL SOCKET PER UTILIZZARE IN MODO DA COMUNICARE DIRETTAMENTE CON LA SCHEDA DI RETE
//la funzione restituirà un valore maggiore di 0 che indica il canale di comunicazione

if ( (apertura_socket = socket(PF_PACKET, SOCK_RAW, ETH_P_IP)) < 0)

{
printf ("Errore socket");
exit(1);
}
//ABILITAZIONE DELLA SCHEDA DI RETE IN MODALITA' PROMISCUA
strncpy( interfaccia.ifr_name, argv[1], IFNAMSIZ );
ioctl( apertura_socket, SIOCGIFFLAGS, &interfaccia );
interfaccia.ifr_flags |= IFF_PROMISC;
ioctl( apertura_socket , SIOCSIFFLAGS, &interfaccia );
//__________________________________________________ ______

strncpy(sorgente.sa_data, argv[1], sizeof(sorgente.sa_data));
while (1)
{
recvfrom( apertura_socket, buffer, sizeof(buffer), 1500,
(struct sockaddr *)&sorgente, &lunghezza_pacchetto );

contenuto_header = (unsigned char *)buffer;
printf ("%02x", contenuto_header[0]);
printf ("%s \n %d \n %s \n", buffer, sorgente.sa_family, sorgente.sa_data);
printf ("%s \n", lunghezza_pacchetto);

}
}


I printf alla fine li ho messi per provare a stampare alcuni dati, mentre il while infinito l'ho fatto per stampare sempre i dati in modo da vedere se venivano aggiornati durante la navigazione, ma non è cosi...
Quale può essere il problema? grazie

billiejoex
15-03-2009, 14:42
Per fare questo genere di cose è molto più semplice utilizzare libpcap/winpcap.
Utilizzare i socket raw per fare questo genere di cose è in genere molto complesso e sopratutto limitante, dato che certe cose semplicemente non puoi farle.

sparpazeo
15-03-2009, 16:48
bhe da molte parti ho visto proprio l'implementazione di sniffer funzionanti in modalità raw senza l'utilizzo delle pcap, per questo ho deciso di fare cosi, anche perchè inizialmente mi ero dedicato alle pcap ma sn stato sconsigliato. Inoltre avrei bisogno di usare la raw perchè dovrei proprio lavorare a basso livello...Ho visto esempi di sniffer funzionanti senza pcap con poche righe di codice ma non capisco perchè il mio non funzioni ;)

billiejoex
15-03-2009, 17:16
Le pcap hanno svariati vantaggi rispetto a socket raw.
Sono più veloci in quanto implementate come driver di sistema e sono sopratutto molto più semplici da usare (ad esempio puoi impostare filtri a livello di protocollo).
Credo, inoltre, che determinate cose con socket raw non puoi proprio farle.
Non so perchè te le abbiano scansigliate ma per fare sniffing le pcap sono lo standard de facto.
Software come tcpdump o wireshark utilizzano pcap e non socket raw.

sparpazeo
15-03-2009, 17:53
si infatti avevo visto che wireshark e programmi simili utilizzano le pcap, ma sinceramente ho notato qualchè difficoltà in più ad implementare un programmino con quelle librerie...forse me le hanno sconsigliate perchè dopo aver realizzato lo sniffer, dovrei effettuare un programmino che esegue una sorta di attacco ddos o cmq un ping o qualcosa che butti giu un determinato pc nella rete e questo si deve fare ricostruendo il pacchetto...ho visto che con le raw si possono usare delle strutture gia pronte che ti permettono di fare ciò. forse mi è stato consigliato cosi in modo da imparare solo le raw...boh...
in ogni caso qualcuno sa dirmi perchè quel codice che ho scritto non funzioni?

Gnix
15-03-2009, 19:22
Ciao. Premesso che non è una buona partenza l'idea di voler fare un attacco DDos. Ecco alcuni programmini che ho scritto con i raw socket e che magari possono tornarti utili.

Sniffer: http://www.ptrace.net/content/sources/sniffer.c

e Injector: http://www.ptrace.net/content/sources/injector.c

Per quanto riguarda la scelta tra libnet/libpcap e raw socket. Va precisata una cosa; non vero che con libpcap puoi fare cose che con i raw socket non puoi fare. Semplicemente per il fatto che libpcap è una libreria di programmazione che utilizza i raw socket. D'altronde i raw socket sono il "punto d'accesso" più vicino alla scheda di rete che il kernel mette a disposizione.

In ogni caso, se libnet/libpcap sono state sviluppate un motivo (e anche più di uno) c'è. L'implementazione dei raw socket tra i vari sistemi non è standard e pertanto un programma che va in Linux non andrà in Windows. Usando libpcap e il porting per windows WinPcap, potrai scrivere un programma che non sia più legato ad una particolare implementazione dei raw socket. Inoltre questa potente libreria fornisce una funzionalità molto interessante, la possibilità di filtrare certi pacchetti secondo regole che impostiamo noi.

Per maggiori info ti consiglio una veloce ricerca con google. ;)

gnix

sparpazeo
15-03-2009, 19:52
come mai non è una buona idea effettuare un DDOS? dici per via del traffico che si creerebbe all'interno della rete? ci sarebbero altre soluzioni, ma alcune impallerebbero gli switch della rete e altre invece verrebbero bloccate dai firewall, quindi ho considerato l'attacco DDOS come la più attuabile.
Per quanto riguarda i due link grazie mille, ho dato un'occhiata rapida, a me servirebbe uno sniffer molto semplice che mi controlli solo ip, mac senza ulteriori informazioni, per questo avevo scritto quelle poche righe di codice. Inoltre pensavo che utilizzando il raw socket, avrei maggiore portabilità visto ke lavoro direttamente con la scheda. Ma diciamo che comunque non è un mio problema perchè poi questo sniffer andrebbe installato su una macchina linux che fa da server.
Per quanto riguarda google, penso ke in questo momento mi odierà perchè ho fatto un quantitativo enorme di ricerche ma partendo da zero ed essendo alla prima esperienza di programmazione ho molte difficoltà :p

MItaly
16-03-2009, 00:11
Originariamente inviato da sparpazeo
come mai non è una buona idea effettuare un DDOS?
Credo che stia parlando da un punto di vista "etico"... e in effetti ci sono modi più costruttivi per imparare ad usare i socket...

alka
16-03-2009, 09:35
La realizzazione di attacchi DoS non è senz'altro un argomento trattabile su questo forum. :nonono:

sparpazeo
16-03-2009, 18:19
Sicuramente, però quello dell'attacco DOS è una cosa che mi servirebbe dopo e magari non tratterò cosi pubblicamente, ma al momento sono ancora fermo con lo sniffer...qualcuno sa darmi qualche altro suggerimento? Qualcuno che abbiamo provato il codice che ho implementato e mi sappia dire come mai non va...

Loading