Newsgroup: it.comp.lang.c
Titolo: esempi programmazione con socket (PF_PACKET)

Salve a tutti,
sto cercando di inviare diversi frammenti di un pacchetto IP, ma non ci
riesco perchè il kernel si intromette e allora vorrei provare ad usare
la chiamata socket(PF_PACKET,..........) per aggirare lo stack TCP/IP,
soltanto che non sono molto esperto e non riesco a trovare degli esempi
comprensibili per me. Se qualcuno può darmi una mano mi farebbe un
enorme piacere!!!
Grazie!!!!!!!!!
Marco

Ciao Marco,
ti consiglio le libnet, davvero semplici da usare.
http://www.pluto.it/files/journal/pj0601/libnet.html
Salut.

aspinall ha scritto:

Ciao aspinall,
ho letto il tuo articolo, molto interessante, sull'utilizzo della
libreria libnet, ma ho dei dubbi. Ti premetto il mio problema: devo
scrivere un programma che sia in grado di aggirare un NIDS. (Lo faccio
perchè così mi è stato richiesto dal corso di sicurezza informatica
dell'università di Roma di Tor Vergata. Ci tengo a fare questa
precisazione perchè più volte mi sono visto sbattere la porta in
faccia non appena provavo a spiegare il mio problema!!!). Ho
implementato una eventuale soluzione che ho visto funzionare solo in
locale, sulla stessa macchina ho installato NIDS, Web server e la mia
applicazione. Come ho provato a utilizzare due macchine ho visto,
attraverso ethereal, che il primo frammento veniva spedito
regolarmente, mentre i successivi venivano prima riassemblati sulla mia
macchina e poi spediti all'host attaccato su cui risiedono Web server e
NIDS. Tra le varie ipotesi ho pensato che fosse un problema legato allo
stack TCP/IP e per questo sto cercando di aggirarlo attraverso socket
raw oppure libnet. In quest'ultimo caso ho letto che è necessario
anche con questa soluzione evitare lo stack TCP/IP e, data la poca
documentazione che ho trovato sulle libnet, ho ripiegato sulle socket,
ma nonostante tutto mi trovo in un vicolo cieco da cui non riesco ad
uscire.....
Dal tuo profilo ho visto che sei un appassionato di network security e
allora mi domandavo se potessi darmi qualche aiuto.
Qualsiasi suggerimento, anche il più semplice, potrebbe essermi di
aiuto. Grazie!
Saluti.
Marco.
ho letto da qualche parte sulla rete che anche utilizzando la libnet
devo

Ciao Marco,
sinceramente se non ti spieghi meglio, non sono in grado di aiutarti.
Se vuoi puoi contattarmi in privato.
Salut.

aspinall ha scritto:

Ciao aspinall,
scusa se non sono stato molto chiaro, proverò a spiegarmi meglio.
Devo scrivere un programma che sia in grado di aggirare un NIDS. Per
fare ciò ho scelto di utilizzare una tecnica basata su fragmentation
reassembly timeout, così come indicato in
http://www.securityfocus.com/infocus/1852
. Per applicare questa tecnica
devo poter frammentare una richiesta in diversi frammenti, diciamo
quattro diversi frammenti, che una volta riassemblati costituiscono una
singola richiesta, così come verrebbe effettuata da un qualsiasi
browser GET /risorsa.html HTTP/1.1 ...............
Per poter implementare tale soluzione ho scelto le SOCK_RAW , ma ho
avuto dei problemi. Mi spiego. Sulla stessa macchina ho installato NIDS
(Snort), Web server  (Lighttp) e la mia applicazione e tramite Ethereal
controllo quello che avviene: dopo l'instaurazione della connessione
invio i vari frammenti che vengono ricevuti dal server così come sono
stati creati e tutto va a buon fine. Quando però ho deciso di
installare NIDS e Web server su una macchina diversa da quella su cui
risiede la mia applicazione ho avuto dei problemi di cui non riesco a
capire la causa e quindi neanche una via da seguire per poterli
risolvere. Il problema è questo: dopo l'instaurazione della
connessione invio i quattro frammenti in cui ho frammentato la mia
richiesta e vedo che il primo pacchetto viene ricevuto dal Web server
così come è stato da me creato e fin qui tutto ok, quando però vado
a visionare l'output di Ethereal relativo al secondo frammento vedo che
il Web server ha ricevuto il primo e il secondo pacchetto come un unico
pacchetto riassemblato. Tale comportamento è la causa dei miei
problemi dal momento che non riesco a capire chi e  perchè  si occupa
di tale operazione. Inoltre il Web server si pone in attesa del secondo
frammento in quanto ignora quello che gli ho inviato (quello
riassemblato con il primo). Il primo pacchetto che invio ha il bit MF=1
e fragment offset =0, mentre il secondo ha MF=1 e fragment offset=24,
in quanto il primo frammento che invio ha un  payload di 24 byte.
Utilizzo tcp nel cui campo payload sono contenute le richieste http che
utilizzo per comunicare con il Web server.
Spero di essere stato un pò più chiaro e di non averti fatto perdere
altro tempo.
Grazie per l'attenzione.
Saluti.
Marco.