|
|
|
Bonjour!
Je travaille sur une application de reaction face aux intrusions en parallele avec un IDS et j'ai quelques problemes à rendre efficace mes paquets rst (flag = 0x4)
J'utilise libpcap, libnet 1.1 et snort
J'ai teste mon programme (que vous pouvez voir en bas du mail) avec un script qui execute une boucle infinie de rlogins, mount, rpcinfo sur une machine distante. En fait, je veux pouvoir envoyer des packets tcp rst pour que mon script soit bloque (pas arrete mais que l'on recoive un message du genre "Connection reset by peer")
J'ai pu voir que mon programme marchait juste au niveau des rlogins (je peux voir le message "Connection reset by peer" seulement quand le script essaie de faire un rlogin.
De plus, ne parlant que des rlogins en question, ca marche seulement 90% du temps et je ne sais vraiment pas pourquoi. Generalement quand je lance ma reaction, si la 1ere fois ca passe apres c'est bon mais parfois ca n'a aucun effet sur le script la 1ere fois et apres ca ne marche pas non plus .
J'ai alors regarde Couic
(http://michel.arboi.free.fr/UKUSA/couic.html) et j'ai vu que ca marchait tres bien sur mon script.celui ci est bloque a chaque commande (pas seulement les rlogins)par mes paquets tcp rst et ca fonctionne a chaque fois.
Comme couic est ecrit avec libnet1.0.2 j'ai essayer de le modifier en utilisant libnet 1.1 car je suis oblige de l'utiliser mais il y a pas mal de differences entre les 2 versions et pour l'instant j'ai laisse tomber.
J'ai modifie mon code pour le rendre similaire a couic (notamment au niveau des parametres) mais ca ne marche pas.
Voila les parties interessantes de mon code par rapport a mon probleme
---------------------------------------------------------------------------
case 6: /* Ici je decide d'envoyer des paquets TCP RST */
for (d=0;d<numOfPackets;d++){
while (test== 0) {
pcap_loop(descr, 1, got_packet, NULL);
if (!tsyn & !trst){
test = 1;
for (i =1;i<4;i++){
/* Paquet TCP RST : victim --> attacker */
if (TCPRST(d_add.s_addr,s_add.s_addr,
ntohs(d_port),ntohs(s_port),
ntohl(ack)+i,
ntohl(seq)+i)<0)
{
NOTICE2("TCPACK %s %s KO\n",inet_ntoa
(d_add),inet_ntoa(s_add));
exit(1);
}
NOTICE21("Sent TCP RST from %s:%d to",inet_ntoa
(d_add),ntohs(d_port));
NOTICE21("%s:%d\n",inet_ntoa(s_add),ntohs
(s_port));
/* Paquet TCP RST : attacker --> victim */
if TCPRST(s_add.s_addr,d_add.s_addr,
ntohs(s_port),ntohs(d_port),
nohl(seq)+i,ntohl(ack)+i)<0)
{
NOTICE2("TCPACK %s %s KO\n",inet_ntoa
(s_add),inet_ntoa(d_add));
exit(1);
}
NOTICE21("Sent TCP RST from %s:%d to
",inet_ntoa(s_add),ntohs(s_port));
NOTICE21("%s:%d\n",inet_ntoa(d_add),ntohs
(d_port));
}
}
}
}
break;
---------------------------------------------------------------------------
et enfin le code de ma fonction TCPRST :
je ne sais pas trop quoi utiliser comme mode (LIBNET_LINK ou LIBNET_RAW4). Vu que je lance mon appli de reaction depuis un autre poste via ssh le mode LIBNET_LINK ne marche pas.
---------------------------------------------------------------------------
//Tcp reset function ******************************************
static int TCPRST(u_long saddr, u_long daddr, u_short sport, u_short
dport, int t_seq, int t_ack)
{
int c;
libnet_t *l;
libnet_ptag_t ip_tag, tcp_tag,eth_tag;
fprintf(stderr, "seq : %x, ack : %x ", t_seq, t_ack);
l = libnet_init(LIBNET_LINK,dev,errlbuf);
if (l == NULL)
{
fprintf(stderr, "libnet_init failed: %s\n", errlbuf);
exit(EXIT_FAILURE);
}
tcp_tag = libnet_build_tcp(sport,dport,t_seq,t_ack,0x14,5555,0,
0,LIBNET_TCP_H,NULL,0,l,0);
if (tcp_tag == -1)
{
fprintf(stderr,"libnet_build_tcp failed: %s\n", libnet_geterror
(l));
goto bad;
}
//fprintf(stderr,"build_tcp ok\n");
ip_tag = libnet_build_ipv4(LIBNET_IPV4_H + LIBNET_TCP_H,
0xF4/*IPTOS_LOWDELAY*/,
rand() & 0xFFFF,
0,64,IPPROTO_TCP,0,saddr,daddr,NULL,0,l,0);
if (ip_tag == -1)
{
fprintf(stderr,"libnet_build_ipv4 failed: %s\n",
libnet_geterror(l));
goto bad;
}
//fprintf(stderr,"build_ipv4 ok\n");
eth_tag =
libnet_build_ethernet(ether_dest,ether_src,htons(t),NULL,0,l,0);
if (eth_tag == -1)
{
fprintf(stderr,"libnet_build_ethernet failed: %s\n",
libnet_geterror(l));
goto bad;
}
//fprintf(stderr,"build_ethernet ok\n");
c = libnet_write(l);
if (c == -1)
{
fprintf(stderr,"libnet_write failed: %s\n",libnet_geterror(l));
goto bad;
}
else fprintf(stderr,"Wrote %d byte(s) TCP packet; check the
wire.\n",c);
libnet_destroy(l);
return (EXIT_SUCCESS);
bad:
libnet_destroy(l);
return(EXIT_FAILURE);
}
---------------------------------------------------------------------------
voila merci d'avance, au moins pour avoir eu le courage de lire jusqu'ici.
|
|