|
|
* Author: Alain Girardet/Dominik Blunk | * Author: Alain Girardet/Dominik Blunk |
* Last Modified: 2002-10-24 | * Last Modified: 2002-10-24 |
* | * |
|
* Send me any suggestions about the patch to kirano_1@hotmail.com |
|
* |
* Description: Read guessed passwords from stdin and applies RC4 | * Description: Read guessed passwords from stdin and applies RC4 |
* on sniffed encrypted 802.11 DATA packets | * on sniffed encrypted 802.11 DATA packets |
* | * |
|
|
// default mode (all modes sequential) | // default mode (all modes sequential) |
static unsigned char use_modes = 0x01; | static unsigned char use_modes = 0x01; |
| |
|
// to check bssid |
|
char* BSSID=NULL; |
|
wlan_packet_list* bssids_list=NULL; |
|
int is_bssid_set = 0; |
|
|
void clean_up(); | void clean_up(); |
| |
// | // |
|
|
// | // |
void load_packets(char *infile, int network) { | void load_packets(char *infile, int network) { |
| |
int network_count = 0; |
int network_count = 0; |
|
wlan_packet_list* aux; |
|
wlan_packet_list* aux_2; |
|
wlan_packet_list* aux3; |
|
char bssid_aux[18],bssid_aux2[13],bssid_aux3[18],bssid_aux4[13]; |
| |
// load networks from file | // load networks from file |
list_packet_to_crack = get_packets(infile); | list_packet_to_crack = get_packets(infile); |
|
|
| |
current_packet = list_packet_to_crack; | current_packet = list_packet_to_crack; |
| |
// list all available networks |
//Make another list with provided bssid |
printf("\n\nFounded BSSID:"); |
if (is_bssid_set){ |
while (current_packet->next != NULL) { |
for (aux=current_packet; aux!=NULL;aux=aux->next){ |
network_count++; |
sprintf(bssid_aux,"%.2X:%.2X:%.2X:%.2X:%.2X:%.2X",aux->frame.bssid[0],aux->frame.bssid[1],aux->frame.bssid[2],aux->frame.bssid[3],aux->frame.bssid[4],aux->frame.bssid[5]); |
printf("\n%d) ", network_count); |
sprintf(bssid_aux2,"%.2X%.2X%.2X%.2X%.2X%.2X",aux->frame.bssid[0],aux->frame.bssid[1],aux->frame.bssid[2],aux->frame.bssid[3],aux->frame.bssid[4],aux->frame.bssid[5]); |
print_hex_array(stdout, current_packet->frame.bssid, 6); |
sprintf(bssid_aux3,"%.2x:%.2x:%.2x:%.2x:%.2x:%.2x",aux->frame.bssid[0],aux->frame.bssid[1],aux->frame.bssid[2],aux->frame.bssid[3],aux->frame.bssid[4],aux->frame.bssid[5]); |
printf("/ Key %d", current_packet->frame.key); |
sprintf(bssid_aux4,"%.2x%.2x%.2x%.2x%.2x%.2x",aux->frame.bssid[0],aux->frame.bssid[1],aux->frame.bssid[2],aux->frame.bssid[3],aux->frame.bssid[4],aux->frame.bssid[5]); |
current_packet = current_packet->next; |
if ((strncmp(bssid_aux,BSSID,17) == 0) || (strncmp(bssid_aux2,BSSID,12) == 0) || (strncmp(bssid_aux3,BSSID,17) == 0) || (strncmp(bssid_aux4,BSSID,12) == 0)){ |
|
aux_2 = malloc(sizeof(wlan_packet_list)); |
|
memcpy(&aux_2->frame.frameControl, aux->frame.frameControl, 2); |
|
memcpy(&aux_2->frame.duration, aux->frame.duration, 2); |
|
memcpy(&aux_2->frame.srcAddress, aux->frame.srcAddress, 6); |
|
memcpy(&aux_2->frame.dstAddress, aux->frame.dstAddress, 6); |
|
memcpy(&aux_2->frame.bssid, aux->frame.bssid, 6); |
|
if(aux->frame.address4 > 0) { |
|
memcpy(&aux_2->frame.address4, aux->frame.address4, 6); |
|
} |
|
memcpy(&aux_2->frame.sequenceControl, aux->frame.sequenceControl, 2); |
|
memcpy(&aux_2->frame.iv, &aux->frame.iv, 3); |
|
aux_2->frame.key=aux->frame.key; |
|
memcpy(&aux_2->frame.payload, aux->frame.payload, (aux->framesize)- (aux->frame.limits_payload)); |
|
if (bssids_list == NULL){ |
|
aux3 = malloc(sizeof(wlan_packet_list)); |
|
aux3->next = NULL; |
|
bssids_list = aux3; |
|
} |
|
aux_2->framesize = aux->framesize; |
|
aux_2->next = bssids_list; |
|
bssids_list = aux_2; |
|
} |
|
} |
|
if (bssids_list != NULL){ |
|
//we must free the old list |
|
delete_list(list_packet_to_crack); |
|
list_packet_to_crack = bssids_list; |
|
current_packet = list_packet_to_crack; |
|
} |
|
else printf("\n\nProvided BSSID not found. Cracking all networks"); |
} | } |
|
|
|
// list all available networks |
|
printf("\n\nFounded BSSID:"); |
|
while (current_packet->next != NULL) { |
|
network_count++; |
|
printf("\n%d) ", network_count); |
|
print_hex_array(stdout, current_packet->frame.bssid, 6); |
|
printf("/ Key %d", current_packet->frame.key); |
|
current_packet = current_packet->next; |
|
} |
| |
if (network > network_count) |
if (network >= network_count) |
network = 0; | network = 0; |
| |
// if only one should be attacked, remove the others from the list | // if only one should be attacked, remove the others from the list |
|
|
network_count++; | network_count++; |
current_packet = current_packet->next; | current_packet = current_packet->next; |
} | } |
|
|
// extract one packet from list | // extract one packet from list |
list_packet_to_crack = get_one_packet(list_packet_to_crack, | list_packet_to_crack = get_one_packet(list_packet_to_crack, |
current_packet->frame.bssid, current_packet->frame.key); | current_packet->frame.bssid, current_packet->frame.key); |
network_count = 1; | network_count = 1; |
} | } |
|
|
printf("\n%d network%s loaded...\n", network_count, network_count>1?"s":""); | printf("\n%d network%s loaded...\n", network_count, network_count>1?"s":""); |
| |
} | } |
|
|
| |
// process command line options | // process command line options |
// program will terminate, if invalid options are passed | // program will terminate, if invalid options are passed |
while((op = getopt(argc, argv, "n:m:f:w:?")) != -1) { |
while((op = getopt(argc, argv, "n:b:m:f:w:?")) != -1) { |
switch(op) { | switch(op) { |
case 'n': | case 'n': |
network_arg = atoi(optarg); | network_arg = atoi(optarg); |
break; | break; |
|
case 'b': |
|
BSSID = optarg; |
|
is_bssid_set = 1; |
|
printf("BSSID: %s\n", BSSID); |
|
break; |
// arg for packet file to read from | // arg for packet file to read from |
case 'f': | case 'f': |
packet_file = optarg; | packet_file = optarg; |
|
printf("FILE: %s\n", optarg); |
pf = fopen(packet_file,"r"); | pf = fopen(packet_file,"r"); |
if (!pf) { | if (!pf) { |
printf("Dumpfile error: No such file or directory!\n\n"); | printf("Dumpfile error: No such file or directory!\n\n"); |
|
|
word_count++; | word_count++; |
| |
// main loop to process key in modes on every packet | // main loop to process key in modes on every packet |
loop_packets(key); |
loop_packets(key); |
} | } |
| |
clean_up(); | clean_up(); |
| |
} | } |
|
|