@@ -246,10 +246,25 @@ typedef struct
246246
247247#define EAPOL_TTL 2
248248
249- #define EXC_PKT_NUM_1 1
250- #define EXC_PKT_NUM_2 2
251- #define EXC_PKT_NUM_3 3
252- #define EXC_PKT_NUM_4 4
249+ typedef enum
250+ {
251+ EXC_PKT_NUM_1 = 1 ,
252+ EXC_PKT_NUM_2 = 2 ,
253+ EXC_PKT_NUM_3 = 3 ,
254+ EXC_PKT_NUM_4 = 4 ,
255+
256+ } exc_pkt_num_t ;
257+
258+ typedef enum
259+ {
260+ MESSAGE_PAIR_M12E2 = 0 ,
261+ MESSAGE_PAIR_M14E4 = 1 ,
262+ MESSAGE_PAIR_M32E2 = 2 ,
263+ MESSAGE_PAIR_M32E3 = 3 ,
264+ MESSAGE_PAIR_M34E3 = 4 ,
265+ MESSAGE_PAIR_M34E4 = 5 ,
266+
267+ } message_pair_t ;
253268
254269#define BROADCAST_MAC "\xff\xff\xff\xff\xff\xff"
255270
@@ -288,13 +303,14 @@ lsearch_cnt_t excpkts_cnt = 0;
288303
289304// output
290305
306+ #define HCCAPX_VERSION 4
291307#define HCCAPX_SIGNATURE 0x58504348 // HCPX
292308
293309struct hccapx
294310{
295311 u32 signature ;
296312 u32 version ;
297- u8 authenticated ;
313+ u8 message_pair ;
298314 u8 essid_len ;
299315 u8 essid [32 ];
300316 u8 keyver ;
@@ -445,49 +461,43 @@ static int handle_auth (const auth_packet_t *auth_packet, const int pkt_offset,
445461 }
446462 }
447463
448- // process packet based on handshake exchange number
464+ // we're only interested in packets carrying a nonce
449465
450- excpkt -> excpkt_num = excpkt_num ;
466+ char zero [32 ] = { 0 };
467+
468+ if (memcmp (auth_packet -> wpa_key_nonce , zero , 32 ) == 0 ) return -1 ;
469+
470+ // copy data
451471
452472 memcpy (excpkt -> nonce , auth_packet -> wpa_key_nonce , 32 );
453473
454474 excpkt -> replay_counter = ap_replay_counter ;
455475
456- if (excpkt_num == EXC_PKT_NUM_1 )
457- {
458- // nothing to do
459- }
460- else if (excpkt_num == EXC_PKT_NUM_2 )
461- {
462- excpkt -> eapol_len = sizeof (auth_packet_t ) + ap_wpa_key_data_length ;
476+ excpkt -> excpkt_num = excpkt_num ;
463477
464- if (( pkt_offset + excpkt -> eapol_len ) > pkt_size ) return -1 ;
478+ excpkt -> eapol_len = sizeof ( auth_packet_t ) + ap_wpa_key_data_length ;
465479
466- if ((sizeof ( auth_packet_t ) + ap_wpa_key_data_length ) > sizeof ( excpkt -> eapol ) ) return -1 ;
480+ if ((pkt_offset + excpkt -> eapol_len ) > pkt_size ) return -1 ;
467481
468- // we need to copy the auth_packet_t but have to clear the keymic
469- auth_packet_t auth_packet_orig ;
482+ if ((sizeof (auth_packet_t ) + ap_wpa_key_data_length ) > sizeof (excpkt -> eapol )) return -1 ;
470483
471- memcpy (& auth_packet_orig , auth_packet , sizeof (auth_packet_t ));
484+ // we need to copy the auth_packet_t but have to clear the keymic
485+ auth_packet_t auth_packet_orig ;
472486
473- memset ( auth_packet_orig . wpa_key_mic , 0 , 16 );
487+ memcpy ( & auth_packet_orig , auth_packet , sizeof ( auth_packet_t ) );
474488
475- memcpy (excpkt -> eapol , & auth_packet_orig , sizeof (auth_packet_t ));
476- memcpy (excpkt -> eapol + sizeof (auth_packet_t ), auth_packet + 1 , ap_wpa_key_data_length );
489+ memset (auth_packet_orig .wpa_key_mic , 0 , 16 );
477490
478- memcpy (excpkt -> keymic , auth_packet -> wpa_key_mic , 16 );
491+ memcpy (excpkt -> eapol , & auth_packet_orig , sizeof (auth_packet_t ));
492+ memcpy (excpkt -> eapol + sizeof (auth_packet_t ), auth_packet + 1 , ap_wpa_key_data_length );
479493
480- excpkt -> keyver = ap_key_information & WPA_KEY_INFO_TYPE_MASK ;
481- }
482- else if (excpkt_num == EXC_PKT_NUM_3 )
483- {
484- // reduce by one
494+ memcpy (excpkt -> keymic , auth_packet -> wpa_key_mic , 16 );
485495
486- excpkt -> replay_counter -- ;
487- }
488- else if (excpkt_num == EXC_PKT_NUM_4 )
496+ excpkt -> keyver = ap_key_information & WPA_KEY_INFO_TYPE_MASK ;
497+
498+ if (( excpkt_num == EXC_PKT_NUM_3 ) || ( excpkt_num == EXC_PKT_NUM_4 ) )
489499 {
490- return -1 ;
500+ excpkt -> replay_counter -- ;
491501 }
492502
493503 return 0 ;
@@ -676,7 +686,7 @@ static void process_packet (const u8 *packet, const pcap_pkthdr_t *header)
676686 {
677687 db_excpkt_add (& excpkt , header -> tv_sec , header -> tv_usec , ieee80211_hdr_3addr -> addr2 , ieee80211_hdr_3addr -> addr1 );
678688 }
679- else if (excpkt .excpkt_num == EXC_PKT_NUM_2 )
689+ else if (( excpkt .excpkt_num == EXC_PKT_NUM_2 ) || ( excpkt . excpkt_num == EXC_PKT_NUM_4 ) )
680690 {
681691 db_excpkt_add (& excpkt , header -> tv_sec , header -> tv_usec , ieee80211_hdr_3addr -> addr1 , ieee80211_hdr_3addr -> addr2 );
682692 }
@@ -908,14 +918,14 @@ int main (int argc, char *argv[])
908918 {
909919 const excpkt_t * excpkt_sta = excpkts + excpkt_sta_pos ;
910920
911- if (excpkt_sta -> excpkt_num != EXC_PKT_NUM_2 ) continue ;
921+ if (( excpkt_sta -> excpkt_num != EXC_PKT_NUM_2 ) && ( excpkt_sta -> excpkt_num != EXC_PKT_NUM_4 ) ) continue ;
912922
913923 if (memcmp (excpkt_ap -> mac_ap , excpkt_sta -> mac_ap , 6 ) != 0 ) continue ;
914924 if (memcmp (excpkt_ap -> mac_sta , excpkt_sta -> mac_sta , 6 ) != 0 ) continue ;
915925
916926 if (excpkt_ap -> replay_counter != excpkt_sta -> replay_counter ) continue ;
917927
918- if (excpkt_ap -> excpkt_num == EXC_PKT_NUM_1 )
928+ if (excpkt_ap -> excpkt_num < excpkt_sta -> excpkt_num )
919929 {
920930 if (excpkt_ap -> tv_sec > excpkt_sta -> tv_sec ) continue ;
921931
@@ -928,41 +938,109 @@ int main (int argc, char *argv[])
928938 if ((excpkt_sta -> tv_sec + EAPOL_TTL ) < excpkt_ap -> tv_sec ) continue ;
929939 }
930940
931- const u8 authenticated = ( excpkt_ap -> excpkt_num == EXC_PKT_NUM_3 ) ;
941+ u8 message_pair = 255 ;
932942
933- printf (" --> STA=%02x:%02x:%02x:%02x:%02x:%02x, Authenticated=%u, Replay Counter=%" PRIu64 "\n" ,
943+ if ((excpkt_ap -> excpkt_num == EXC_PKT_NUM_1 ) && (excpkt_sta -> excpkt_num == EXC_PKT_NUM_2 ))
944+ {
945+ if (excpkt_sta -> eapol_len > 0 )
946+ {
947+ message_pair = MESSAGE_PAIR_M12E2 ;
948+ }
949+ else
950+ {
951+ continue ;
952+ }
953+ }
954+ else if ((excpkt_ap -> excpkt_num == EXC_PKT_NUM_1 ) && (excpkt_sta -> excpkt_num == EXC_PKT_NUM_4 ))
955+ {
956+ if (excpkt_sta -> eapol_len > 0 )
957+ {
958+ message_pair = MESSAGE_PAIR_M14E4 ;
959+ }
960+ else
961+ {
962+ continue ;
963+ }
964+ }
965+ else if ((excpkt_ap -> excpkt_num == EXC_PKT_NUM_3 ) && (excpkt_sta -> excpkt_num == EXC_PKT_NUM_2 ))
966+ {
967+ if (excpkt_sta -> eapol_len > 0 )
968+ {
969+ message_pair = MESSAGE_PAIR_M32E2 ;
970+ }
971+ else if (excpkt_ap -> eapol_len > 0 )
972+ {
973+ message_pair = MESSAGE_PAIR_M32E3 ;
974+ }
975+ else
976+ {
977+ continue ;
978+ }
979+ }
980+ else if ((excpkt_ap -> excpkt_num == EXC_PKT_NUM_3 ) && (excpkt_sta -> excpkt_num == EXC_PKT_NUM_4 ))
981+ {
982+ if (excpkt_ap -> eapol_len > 0 )
983+ {
984+ message_pair = MESSAGE_PAIR_M34E3 ;
985+ }
986+ else if (excpkt_sta -> eapol_len > 0 )
987+ {
988+ message_pair = MESSAGE_PAIR_M34E4 ;
989+ }
990+ else
991+ {
992+ continue ;
993+ }
994+ }
995+ else
996+ {
997+ fprintf (stderr , "BUG!!! AP:%d STA:%d\n" , excpkt_ap -> excpkt_num , excpkt_sta -> excpkt_num );
998+ }
999+
1000+ printf (" --> STA=%02x:%02x:%02x:%02x:%02x:%02x, Message Pair=%u, Replay Counter=%" PRIu64 "\n" ,
9341001 excpkt_sta -> mac_sta [0 ],
9351002 excpkt_sta -> mac_sta [1 ],
9361003 excpkt_sta -> mac_sta [2 ],
9371004 excpkt_sta -> mac_sta [3 ],
9381005 excpkt_sta -> mac_sta [4 ],
9391006 excpkt_sta -> mac_sta [5 ],
940- authenticated ,
1007+ message_pair ,
9411008 excpkt_sta -> replay_counter );
9421009
9431010 // finally, write hccapx
9441011
9451012 hccapx_t hccapx ;
9461013
9471014 hccapx .signature = HCCAPX_SIGNATURE ;
948- hccapx .version = 3 ;
1015+ hccapx .version = HCCAPX_VERSION ;
9491016
950- hccapx .authenticated = authenticated ;
1017+ hccapx .message_pair = message_pair ;
9511018
9521019 hccapx .essid_len = essid -> essid_len ;
9531020 memcpy (& hccapx .essid , essid -> essid , 32 );
9541021
955- hccapx .keyver = excpkt_sta -> keyver ;
956- memcpy (& hccapx .keymic , excpkt_sta -> keymic , 16 );
957-
9581022 memcpy (& hccapx .mac_ap , excpkt_ap -> mac_ap , 6 );
9591023 memcpy (& hccapx .nonce_ap , excpkt_ap -> nonce , 32 );
9601024
9611025 memcpy (& hccapx .mac_sta , excpkt_sta -> mac_sta , 6 );
9621026 memcpy (& hccapx .nonce_sta , excpkt_sta -> nonce , 32 );
9631027
964- hccapx .eapol_len = excpkt_sta -> eapol_len ;
965- memcpy (& hccapx .eapol , excpkt_sta -> eapol , 256 );
1028+ if (excpkt_sta -> eapol_len > 0 )
1029+ {
1030+ hccapx .keyver = excpkt_sta -> keyver ;
1031+ memcpy (& hccapx .keymic , excpkt_sta -> keymic , 16 );
1032+
1033+ hccapx .eapol_len = excpkt_sta -> eapol_len ;
1034+ memcpy (& hccapx .eapol , excpkt_sta -> eapol , 256 );
1035+ }
1036+ else
1037+ {
1038+ hccapx .keyver = excpkt_ap -> keyver ;
1039+ memcpy (& hccapx .keymic , excpkt_ap -> keymic , 16 );
1040+
1041+ hccapx .eapol_len = excpkt_ap -> eapol_len ;
1042+ memcpy (& hccapx .eapol , excpkt_ap -> eapol , 256 );
1043+ }
9661044
9671045 fwrite (& hccapx , sizeof (hccapx_t ), 1 , fp );
9681046
0 commit comments