home *** CD-ROM | disk | FTP | other *** search
/ Power Hacker 2003 / Power_Hacker_2003.iso / Exploit and vulnerability / s0ftpj / icmp_tunnel.h < prev    next >
Encoding:
C/C++ Source or Header  |  2000-12-17  |  4.6 KB  |  220 lines

  1. /*
  2.  
  3. Covert Tunnelling in ICMP 0x00 ECHO REPLY messages
  4.  
  5.   Many thanks to FuSyS and Richard Stevens ^_^
  6.  
  7. Dark Schneider X1999
  8.  
  9. */
  10.  
  11. #include <winsock2.h>
  12. #include <ws2tcpip.h>
  13. #include <stdio.h>
  14.  
  15. #define ICMP_ECHOREPLY    0
  16. #define ICMP_ECHO    8
  17.  
  18. // definizione di alcune costanti 
  19.  
  20. #define IP_HDR    20
  21. #define ICMP_HDR 8
  22. #define ICMP_MINLEN    8
  23. #define MAXMESG    4096
  24. #define MAXPACKET 5004
  25. #define LAST    1
  26. #define REPLY    1
  27. #define ECHO_TAG    0xF001
  28. #define ECHO_LAST    0xF002
  29.  
  30. // Strutture e Variabili
  31. // Lancio un doveroso Porko D*io liberatorio... dopo ore ho trovato come fare
  32. // a togliermi dalle palle la fottuta icmp.dll (winsock maledette)
  33.  
  34. // IP Header
  35. struct ip
  36. {
  37.     unsigned char    Hlen:4;         
  38.     unsigned char    Version:4;       
  39.     unsigned char    Tos;            
  40.     unsigned short    LungTot;    
  41.     unsigned short    Id;         
  42.     unsigned short    Flags;
  43.     unsigned char    Ttl; 
  44.     unsigned char    Proto;           
  45.     unsigned short    Checksum;       
  46.     unsigned int    SourceIP;
  47.     unsigned int    DestIP;
  48.  
  49. };
  50.  
  51. // ICMP Header
  52. struct icmp {
  53.             BYTE        Type;
  54.             BYTE        Code; 
  55.             USHORT        CheckSum;
  56.             USHORT        Id;
  57.             USHORT        Seq;
  58.             ULONG        Dati;
  59.             };
  60.  
  61. SOCKET                sockfd;
  62. u_int                icmp_init =1;
  63. struct sockaddr_in    clisrc;
  64.  
  65. // Funzione di checksum 
  66.  
  67. USHORT checksum(USHORT *buffer, int size)
  68. {
  69.  
  70.   unsigned long cksum=0;
  71.  
  72.   while(size >1)
  73.   {
  74.     cksum+=*buffer++;
  75.     size -=sizeof(USHORT);
  76.   }
  77.   
  78.   if(size )
  79.   {
  80.     cksum += *(UCHAR*)buffer;
  81.   }
  82.  
  83.   cksum = (cksum >> 16) + (cksum & 0xffff);
  84.   cksum += (cksum >>16);
  85.   return (USHORT)(~cksum);
  86. }
  87.  
  88. // Reimplemento bcopy e bzero... Ma perche' cavolo windows non le
  89. // rende disponibili?
  90.  
  91. void bzero(char *pnt, int dim_pnt )
  92. {
  93.     memset((char *)&pnt, 0, dim_pnt);
  94. };
  95.  
  96. void bcopy(char *src, char *dest, int dim_src)
  97. {
  98.     memmove((char *)&dest, (char *)&src, dim_src);
  99. };
  100.  
  101. // Micro$oft Sucks
  102. // Funzioni di gestione dei pacchetti ICMP
  103. // Fankulo a quegli stronzi maledetti che si sono inventati la icmp.dll
  104. // Brutti bastardi pezzi di merda, la compatibilita' ve la siete ficcata su
  105. // per il culo?
  106. // Micro$oft Sucks
  107.  
  108. void ICMP_init(void)
  109.     {
  110.     if(icmp_init)
  111.         {
  112.         if((sockfd = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP)) == INVALID_SOCKET)
  113.             {
  114.             fprintf(stderr, "impossibile creare raw ICMP socket");
  115.             exit(0);
  116.             }
  117.         }
  118.     icmp_init = 0;
  119.     };
  120.  
  121. void ICMP_reset(void)
  122.     {
  123.     closesocket(sockfd);
  124.     icmp_init = 1;
  125.     };
  126.  
  127. int ICMP_send(char *send_mesg, size_t mesglen, ULONG dest_ip, int echo, int last)
  128.     {
  129.     int                        sparato;
  130.     struct tunnel
  131.         {
  132.         struct icmp         icmp;
  133.         UCHAR             data[MAXMESG];
  134.         } icmp_pk;
  135.     int                        icmplen    = sizeof(struct icmp);
  136.     int                        pack_dim;
  137.     struct sockaddr_in        dest;
  138.     int                        destlen;
  139.  
  140.     if(mesglen > MAXMESG) return(-1);
  141.     
  142.     if(icmp_init) ICMP_init();
  143.  
  144.     destlen                        = sizeof(dest);
  145.     bzero((char *)&dest, destlen);
  146.     dest.sin_family                = AF_INET;
  147.     dest.sin_addr.s_addr        = dest_ip;
  148.     pack_dim                    = mesglen + sizeof(struct icmp);
  149.     memset(&icmp_pk, 0, pack_dim);
  150.     icmp_pk.icmp.Type            = ICMP_ECHOREPLY;
  151.     bcopy(send_mesg, (char *)&icmp_pk.icmp.Dati, mesglen);
  152.     icmp_pk.icmp.CheckSum        = checksum((USHORT *) &icmp_pk.icmp, (sizeof(struct icmp) + mesglen));
  153.     if(echo) icmp_pk.icmp.Seq    = ECHO_TAG;
  154.     if(last) icmp_pk.icmp.Seq    = ECHO_LAST;
  155.  
  156.     if(sparato = sendto(sockfd, (char *)&icmp_pk, pack_dim, 0, (struct sockaddr *)&dest, destlen) < 0)
  157.         {
  158.         perror("RAW ICMP SendTo: ");
  159.         return(-1);
  160.         } 
  161.         else if(sparato != pack_dim)
  162.         {
  163.         perror("dimensioni pacchetto IP errate: ");
  164.         return(-1);
  165.         }
  166.         return(sparato);
  167.     };
  168.  
  169. int ICMP_recv(char *recv_mesg, size_t mesglen, int echo)
  170.     {
  171.     struct recv
  172.         {
  173.         struct ip    ip;
  174.         struct icmp icmp;
  175.         char        data[MAXMESG];
  176.         } rcv_pk;
  177.     int                pack_dim;
  178.     int                accolto;
  179.     int                iphdrlen;
  180.     int                clilen = sizeof(clisrc);
  181.  
  182.     if(icmp_init) ICMP_init();
  183.     while(1)
  184.         {
  185.         pack_dim = mesglen + sizeof(struct ip) + sizeof(struct icmp);
  186.         memset(&rcv_pk, 0, pack_dim);
  187.         if((accolto = recvfrom(sockfd, (char *)&rcv_pk, pack_dim, 0, (struct sockaddr *) &clisrc, &clilen)) < 0) continue;
  188.  
  189.         iphdrlen = rcv_pk.ip.Hlen << 2;
  190.         if(accolto < (iphdrlen + ICMP_MINLEN)) continue;
  191.         accolto -= iphdrlen;
  192.  
  193.         if(!echo)
  194.             {
  195.             if(!rcv_pk.icmp.Id && !rcv_pk.icmp.Code && rcv_pk.icmp.Type == ICMP_ECHOREPLY && rcv_pk.icmp.Seq != ECHO_TAG && rcv_pk.icmp.Seq != ECHO_LAST) break;
  196.             }
  197.         if(echo)
  198.             {
  199.             if(!rcv_pk.icmp.Id && !rcv_pk.icmp.Code && rcv_pk.icmp.Type == ICMP_ECHOREPLY && (rcv_pk.icmp.Seq == ECHO_TAG || rcv_pk.icmp.Seq == ECHO_LAST)) break;
  200.             }
  201.         }
  202.         if(!echo)
  203.             {
  204.             accolto -= ICMP_HDR;
  205.             bcopy((char *)&rcv_pk.icmp.Dati, recv_mesg, accolto);
  206.             return(accolto);
  207.             }
  208.         if(echo)
  209.             {
  210.             if(rcv_pk.icmp.Seq == ECHO_TAG)
  211.                 {
  212.                 accolto -= ICMP_HDR;
  213.                 bzero(recv_mesg, sizeof(recv_mesg));
  214.                 bcopy((char *)&rcv_pk.icmp.Dati, recv_mesg, accolto);
  215.                 return(accolto);
  216.                 }
  217.             return(-666);
  218.             }
  219.     };
  220.