detection d'attaques

detection d'attaques - réseaux et sécurité - Linux et OS Alternatifs

Marsh Posté le 28-02-2005 à 14:03:48    

Salut,je suis en train de faire un detecteur d'attaque de FLOOD Syn,
j'ai utiliser une librairie LibCap ,mais le probleme cest que jarrive pas a filter les packets.J'arrive seulement a lire les packets,ie lentete du packet.
voila mais comment fair epour filtrer les packets?
voila la source
 
#include <stdio.h>
#include <pcap.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <netinet/tcp.h>
#include <netinet/ether.h>
#include <net/ethernet.h>
 
#define IP_LEN 17
 
void callback (u_char *args , const struct pcap_pkthdr *header , const u_char *packet) {
 int type;
 
 char adresse_source[IP_LEN];
 char adresse_destination[IP_LEN];
 
 unsigned short int port_source;
 unsigned short int port_destination;
 
 unsigned int numero_seq;
 unsigned int numero_ack_seq;
 
 const struct ether_header *eth;
 const struct iphdr *ip;
 const struct tcphdr *tcp;
 
 int size_ethernet = sizeof(struct ether_header);
 int size_ip = sizeof(struct iphdr);
 int size_tcp = sizeof(struct tcphdr);
 
 eth = (struct ether_header*) (packet);
 ip = (struct iphdr*) (packet + size_ethernet);
 tcp = (struct tcphdr*) (packet + size_ethernet + size_ip);
 
 type = ntohs(eth->ether_type);
 
 if (type != ETHERTYPE_IP)
  return;
 
 strncpy(adresse_source,(char *)inet_ntoa(ip->saddr),IP_LEN);
 strncpy(adresse_destination,(char *)inet_ntoa(ip->daddr),IP_LEN);
 
 int off;
 off = ntohs(ip->frag_off);
 if (!(off & 0x1fff) && (ip->protocol==IPPROTO_TCP)) {
  int syn = tcp->syn;
  int ack = tcp->ack;
   
  if ((syn) && (!ack)) {
   port_source = ntohs(tcp->source);
   port_destination = ntohs(tcp->dest);
   
        numero_seq = ntohl(tcp->seq);
   numero_ack_seq = ntohl(tcp->ack_seq);
 
   printf("Paquet TCP SYN
    Adresse IP src : %s  
    Adresse IP dest : %s  
    Port Source : %d  
    Port Destination : %d
    SEQ : %lu
    ACK : %lu\n\n"
   ,adresse_source,adresse_destination,port_source,port_destination,
   numero_seq,numero_ack_seq,tcp->syn,tcp->ack);
  }
 }
}
 
int main() {
 char *dev, errbuf[PCAP_ERRBUF_SIZE];
 dev = pcap_lookupdev(errbuf);
 printf("Device : %s\n" , dev);
 pcap_t *handle;
 handle = pcap_open_live(dev , BUFSIZ , 0  , 0 , errbuf);
 u_char *packet;
 pcap_loop (handle,-1,callback,NULL);
 pcap_close(handle);
}
 
 

Reply

Marsh Posté le 28-02-2005 à 14:03:48   

Reply

Marsh Posté le 28-02-2005 à 14:24:32    

bah faut faire ça dans le noyau!

Reply

Marsh Posté le 28-02-2005 à 14:32:31    

cets a dire?

Reply

Marsh Posté le 28-02-2005 à 14:38:20    

C'est à dire que c'a serait plutot un module pour netfilter qu'il faudrait que tu codes

Reply

Marsh Posté le 28-02-2005 à 14:52:10    

et là attention aux conneries :D


---------------
:: Light is Right ::
Reply

Marsh Posté le 28-02-2005 à 14:54:02    

uoi...en fait ya pas une ligne de code qui permet au moins  
que si je toruve un flood qui provient dune ip  fixe,je puisse  fermer toute connexion provenant de cette adresse ip.?                                                         ,

Reply

Marsh Posté le 28-02-2005 à 14:57:10    

iptables -s adresse -j DROP


---------------
uptime is for lousy system administrators what Viagra is for impotent people - mes unixeries - github me
Reply

Marsh Posté le 28-02-2005 à 14:57:13    

nohack a écrit :

uoi...en fait ya pas une ligne de code qui permet au moins  
que si je toruve un flood qui provient dune ip  fixe,je puisse  fermer toute connexion provenant de cette adresse ip.?                                                         ,


effectivement ça c'est faisable (à coups de iptables et de DROP/REJECT), mais autant le faire en shell


---------------
:: Light is Right ::
Reply

Marsh Posté le 28-02-2005 à 15:47:17    

nan mais un module pour faire ça c'est vite fait...
init_module() ton init, aprés tu pleugue ton callback (qui fait return NF_DROP; ou  return NF_ACCEPT; ) dans netfilter avec nf_register_hook, tu bidouilles ton skbuff et pis cleanup_module() pour finir.


Message édité par xouille38 le 28-02-2005 à 15:48:12
Reply

Marsh Posté le 28-02-2005 à 15:49:15    

xouille38 a écrit :

nan mais un module pour faire ça c'est vite fait...
init_module() ton init, aprés tu pleugue ton callback (qui fait return NF_DROP; ou  return NF_ACCEPT; ) dans netfilter avec nf_register_hook, tu bidouilles ton skbuff et pis cleanup_module() pour finir.


et là t'as un buffer overflow car t'as fait une connerie, et c'est la fête ...
 
alors qu'en shell ce sera bcp plus souple et robuste


---------------
:: Light is Right ::
Reply

Marsh Posté le 28-02-2005 à 15:49:15   

Reply

Marsh Posté le 28-02-2005 à 15:58:00    

Tomate a écrit :

et là t'as un buffer overflow car t'as fait une connerie, et c'est la fête ...
 
alors qu'en shell ce sera bcp plus souple et robuste


 
Bah y'a qu'un pauvre compteur de syn à implémenter... :p  
D'un autre coté il pourrait trés bien le faire avec "seulement" iptables...
 
Et puis c'est rigolo et un minimum formateur de faire un fois dans sa vie un module noyo!!  :)

Reply

Marsh Posté le 28-02-2005 à 16:03:24    

xouille38 a écrit :

Bah y'a qu'un pauvre compteur de syn à implémenter... :p  
D'un autre coté il pourrait trés bien le faire avec "seulement" iptables...
 
Et puis c'est rigolo et un minimum formateur de faire un fois dans sa vie un module noyo!!  :)


pour en avoir fais quelques uns je peux t'assurer que c'est "bien" pédagogiquement :D


---------------
:: Light is Right ::
Reply

Marsh Posté le 28-02-2005 à 16:08:39    

Tomate a écrit :

pour en avoir fais quelques uns je peux t'assurer que c'est "bien" pédagogiquement :D


 vi c'est vrai :)  
je dirais aussi : c'est "sympa" professionnellement!

Reply

Marsh Posté le 28-02-2005 à 16:16:09    

moue :D


---------------
:: Light is Right ::
Reply

Marsh Posté le 28-02-2005 à 16:49:44    


Ah sisi j'te jure...  :)  
rien qu'expliquer à ton chef qu'on peut pas allouer 512Mo contigües comme ça, c'est "sympa" :D

Reply

Marsh Posté le 28-02-2005 à 16:51:00    

xouille38 a écrit :

Ah sisi j'te jure...  :)  
rien qu'expliquer à ton chef qu'on peut pas allouer 512Mo contigües comme ça, c'est "sympa" :D


et lui : "ah beh bien sûr" (mais qu'est ce qu'il dit lui [:mlc])
 
:D


---------------
:: Light is Right ::
Reply

Marsh Posté le 28-02-2005 à 22:33:50    

pour faire le compteur ca a lair facile mais je suis bloquer,jai essayer de faire avec une liste mais ca marche pas;jai essayer avec une liste chaine mais marhce pas

Reply

Marsh Posté le 01-03-2005 à 11:32:47    

nohack a écrit :

pour faire le compteur ca a lair facile mais je suis bloquer,jai essayer de faire avec une liste mais ca marche pas;jai essayer avec une liste chaine mais marhce pas


tu fais un module, du coup?

Reply

Marsh Posté le 01-03-2005 à 16:47:11    

xouille38 a écrit :

nan mais un module pour faire ça c'est vite fait...
init_module() ton init, aprés tu pleugue ton callback (qui fait return NF_DROP; ou  return NF_ACCEPT; ) dans netfilter avec nf_register_hook, tu bidouilles ton skbuff et pis cleanup_module() pour finir.


 
Voilà, quoi, finger in the noze, mouaaaahhahahaha  :lol:  :lol:  
Je suis le seul à avoir rit devant autant de débauches techniques? :D

Reply

Marsh Posté le 01-03-2005 à 17:21:49    

lukefab a écrit :

Voilà, quoi, finger in the noze, mouaaaahhahahaha  :lol:  :lol:  
Je suis le seul à avoir rit devant autant de débauches techniques? :D


 
pas gentil ça! :(
 
Tu le prends comme tu veux, mais c'est plutôt plus simple techniquement de faire un kernel module qu'une appli en userspace. T'as déjà pas à t'emmerder à te farcir la doc de 25 libs, ce que t'as le droit d'utiliser c'est dans les .h de /usr/src/linux/include point barre. Nivo déboguage ca va bien avec une vm...
 
Pis bon "débauches techniques" si c'est parce que j'écris trois noms de fonctions et deux #define... t'as peut être jamais rien codé de ta vie??? :??:


Message édité par xouille38 le 01-03-2005 à 17:29:26
Reply

Marsh Posté le 06-03-2005 à 17:03:09    

Bon,jai reussit a faire le code qui "detecte" une attaque,
L'algorithme va consister a enregistrer les adresse ip ainsi que la date de reception des paquets arrivant sur la carte reseaux dans un tableau de structure.
Ce tableau sera gérée commme une file circulaire.
 
A chaque nouveau paquet(donc a chaque nouvelle ip),on execute une procedure qui va rechercher le nombre d'adresse ip identique a celle nouvellement recus,et si le nombre ces adresse ip est superieur a un certain nbre, de plus,si et ce si l'intervalle de temps entre le dernier paquet recus  
et le paquet en cours est inferieur a un certain nombre,alors on considere qu'il y a une attaque.
 
 
voila,mais si le paquet est spoofer,comment faire?
Est quil faut verifier la validite de l'adresse ip du client,et apres decider?(mais on aura jamais le temps de verfier).

Reply

Marsh Posté le 06-03-2005 à 17:33:13    

nohack a écrit :

Bon,jai reussit a faire le code qui "detecte" une attaque,
L'algorithme va consister a enregistrer les adresse ip ainsi que la date de reception des paquets arrivant sur la carte reseaux dans un tableau de structure.
Ce tableau sera gérée commme une file circulaire.
 
A chaque nouveau paquet(donc a chaque nouvelle ip),on execute une procedure qui va rechercher le nombre d'adresse ip identique a celle nouvellement recus,et si le nombre ces adresse ip est superieur a un certain nbre, de plus,si et ce si l'intervalle de temps entre le dernier paquet recus  
et le paquet en cours est inferieur a un certain nombre,alors on considere qu'il y a une attaque.
 
 
voila,mais si le paquet est spoofer,comment faire?
Est quil faut verifier la validite de l'adresse ip du client,et apres decider?(mais on aura jamais le temps de verfier).

le spoof sur le net tu peux oublier ;)


---------------
:: Light is Right ::
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed