mirror of
https://github.com/pentoo/pentoo-overlay
synced 2026-05-07 12:01:54 +02:00
cowpatty: fixups for gcc15
This commit is contained in:
parent
108d7c72b8
commit
2839489692
6 changed files with 49 additions and 583 deletions
|
|
@ -1,4 +1,4 @@
|
|||
# Copyright 1999-2023 Gentoo Foundation
|
||||
# Copyright 1999-2026 Gentoo Foundation
|
||||
# Distributed under the terms of the GNU General Public License v2
|
||||
|
||||
EAPI=8
|
||||
|
|
@ -9,22 +9,22 @@ HOMEPAGE="http://www.willhackforsushi.com/?page_id=50"
|
|||
HASH_COMMIT="0a274975040960d85cd68550facf801fc3a9d7df"
|
||||
SRC_URI="https://github.com/joswr1ght/cowpatty/archive/${HASH_COMMIT}.tar.gz -> ${P}.tar.gz"
|
||||
|
||||
S="${WORKDIR}/${PN}-${HASH_COMMIT}"
|
||||
LICENSE="BSD"
|
||||
SLOT="0"
|
||||
KEYWORDS="amd64 x86"
|
||||
IUSE=""
|
||||
|
||||
DEPEND="dev-libs/openssl:=
|
||||
net-libs/libpcap"
|
||||
RDEPEND="${DEPEND}"
|
||||
|
||||
S="${WORKDIR}/${PN}-${HASH_COMMIT}"
|
||||
PATCHES=( "${FILESDIR}"/incompatible-pointer-types.patch )
|
||||
|
||||
src_prepare() {
|
||||
sed -i 's|clang|gcc|' Makefile || die
|
||||
sed -i "s#-O2#${CFLAGS} ${LDFLAGS}#" Makefile || die
|
||||
sed -i 's#-pipe -Wall##' Makefile || die
|
||||
eapply_user
|
||||
default
|
||||
}
|
||||
|
||||
src_install() {
|
||||
|
|
@ -1,221 +0,0 @@
|
|||
diff -uNr cowpatty-4.3/cowpatty.c cowpatty-4.3-fixup2/cowpatty.c
|
||||
--- cowpatty-4.3/cowpatty.c 2008-03-20 09:49:38.000000000 -0700
|
||||
+++ cowpatty-4.3-fixup2/cowpatty.c 2009-05-21 23:38:17.970291072 -0700
|
||||
@@ -71,7 +71,7 @@
|
||||
void cleanup();
|
||||
void parseopts(struct user_opt *opt, int argc, char **argv);
|
||||
void closepcap(struct capture_data *capdata);
|
||||
-void handle_dot1x(struct crack_data *cdata, struct capture_data *capdata);
|
||||
+void handle_dot1x(struct crack_data *cdata, struct capture_data *capdata, struct user_opt *opt);
|
||||
void dump_all_fields(struct crack_data cdata);
|
||||
void printstats(struct timeval start, struct timeval end,
|
||||
unsigned long int wordcount);
|
||||
@@ -389,7 +389,7 @@
|
||||
return (ret);
|
||||
}
|
||||
|
||||
-void handle_dot1x(struct crack_data *cdata, struct capture_data *capdata)
|
||||
+void handle_dot1x(struct crack_data *cdata, struct capture_data *capdata, struct user_opt *opt)
|
||||
{
|
||||
struct ieee8021x *dot1xhdr;
|
||||
struct wpa_eapol_key *eapolkeyhdr;
|
||||
@@ -415,8 +415,8 @@
|
||||
cdata->ver = key_info & WPA_KEY_INFO_TYPE_MASK;
|
||||
index = key_info & WPA_KEY_INFO_KEY_INDEX_MASK;
|
||||
|
||||
- /* Check for EAPOL version 1, type EAPOL-Key */
|
||||
- if (dot1xhdr->version != 1 || dot1xhdr->type != 3) {
|
||||
+ /* Check for type EAPOL-Key */
|
||||
+ if (dot1xhdr->type != 3) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -427,59 +427,78 @@
|
||||
|
||||
if (cdata->ver == WPA_KEY_INFO_TYPE_HMAC_MD5_RC4) {
|
||||
/* Check for WPA key, and pairwise key type */
|
||||
- if (eapolkeyhdr->type != 254 ||
|
||||
+ if ((eapolkeyhdr->type != 2 && eapolkeyhdr->type != 254) ||
|
||||
(key_info & WPA_KEY_INFO_KEY_TYPE) == 0) {
|
||||
return;
|
||||
}
|
||||
} else if (cdata->ver == WPA_KEY_INFO_TYPE_HMAC_SHA1_AES) {
|
||||
- if (eapolkeyhdr->type != 2 ||
|
||||
+ if ((eapolkeyhdr->type != 2 && eapolkeyhdr->type != 254) ||
|
||||
(key_info & WPA_KEY_INFO_KEY_TYPE) == 0) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
+ if (opt->verbose > 2) {
|
||||
+ printf ("WPA_KEY_INFO_TYPE_HMAC_MD5_RC4: %d\n", WPA_KEY_INFO_TYPE_HMAC_MD5_RC4);
|
||||
+ printf ("WPA_KEY_INFO_TYPE_HMAC_SHA1_AES: %d\n", WPA_KEY_INFO_TYPE_HMAC_SHA1_AES);
|
||||
+ printf ("key version: %d\n", cdata->ver);
|
||||
+ printf ("eapol key header type: %d\n", eapolkeyhdr->type);
|
||||
+ }
|
||||
+
|
||||
+ /* Check for frame 1 of the 4-way handshake */
|
||||
+ if ((key_info & WPA_KEY_INFO_MIC) == 0
|
||||
+ && (key_info & WPA_KEY_INFO_ACK)
|
||||
+ && (key_info & WPA_KEY_INFO_INSTALL) == 0 ) {
|
||||
+ /* All we need from this frame is the authenticator nonce */
|
||||
+ memcpy(cdata->anonce, eapolkeyhdr->key_nonce,
|
||||
+ sizeof(cdata->anonce));
|
||||
+ cdata->anonceset = 1;
|
||||
+
|
||||
/* Check for frame 2 of the 4-way handshake */
|
||||
- if ((key_info & WPA_KEY_INFO_MIC) && (key_info & WPA_KEY_INFO_ACK) == 0
|
||||
- && (key_info & WPA_KEY_INFO_INSTALL) == 0
|
||||
- && eapolkeyhdr->key_data_length > 0) {
|
||||
- /* All we need from this frame is the authenticator nonce */
|
||||
- memcpy(cdata->snonce, eapolkeyhdr->key_nonce,
|
||||
- sizeof(cdata->snonce));
|
||||
- cdata->snonceset = 1;
|
||||
+ } else if ((key_info & WPA_KEY_INFO_MIC)
|
||||
+ && (key_info & WPA_KEY_INFO_INSTALL) == 0
|
||||
+ && (key_info & WPA_KEY_INFO_ACK) == 0
|
||||
+ && eapolkeyhdr->key_data_length > 0) {
|
||||
|
||||
- } else if ( /* Check for frame 3 of the 4-way handshake */
|
||||
- (key_info & WPA_KEY_INFO_MIC)
|
||||
- && (key_info & WPA_KEY_INFO_INSTALL)
|
||||
- && (key_info & WPA_KEY_INFO_ACK)) {
|
||||
+ cdata->eapolframe_size = ( packet[capdata->dot1x_offset + 2] << 8 )
|
||||
+ + packet[capdata->dot1x_offset + 3] + 4;
|
||||
|
||||
memcpy(cdata->spa, &packet[capdata->dstmac_offset],
|
||||
- sizeof(cdata->spa));
|
||||
- memcpy(cdata->aa, &packet[capdata->srcmac_offset],
|
||||
- sizeof(cdata->aa));
|
||||
- memcpy(cdata->anonce, eapolkeyhdr->key_nonce,
|
||||
- sizeof(cdata->anonce));
|
||||
- cdata->aaset = 1;
|
||||
- cdata->spaset = 1;
|
||||
- cdata->anonceset = 1;
|
||||
- /* We save the replay counter value in the 3rd frame to match
|
||||
- against the 4th frame of the four-way handshake */
|
||||
- memcpy(cdata->replay_counter, eapolkeyhdr->replay_counter, 8);
|
||||
-
|
||||
- } else if ( /* Check for frame 4 of the four-way handshake */
|
||||
- (key_info & WPA_KEY_INFO_MIC)
|
||||
- && (key_info & WPA_KEY_INFO_ACK) == 0
|
||||
- && (key_info & WPA_KEY_INFO_INSTALL) == 0
|
||||
- &&
|
||||
- (memcmp
|
||||
- (cdata->replay_counter, eapolkeyhdr->replay_counter,
|
||||
- 8) == 0)) {
|
||||
+ sizeof(cdata->spa));
|
||||
+ memcpy(cdata->aa, &packet[capdata->srcmac_offset],
|
||||
+ sizeof(cdata->aa));
|
||||
+ memcpy(cdata->snonce, eapolkeyhdr->key_nonce,
|
||||
+ sizeof(cdata->snonce));
|
||||
+ cdata->aaset = 1;
|
||||
+ cdata->spaset = 1;
|
||||
+ cdata->snonceset = 1;
|
||||
|
||||
memcpy(cdata->keymic, eapolkeyhdr->key_mic,
|
||||
- sizeof(cdata->keymic));
|
||||
+ sizeof(cdata->keymic));
|
||||
memcpy(cdata->eapolframe, &packet[capdata->dot1x_offset],
|
||||
- sizeof(cdata->eapolframe));
|
||||
+ cdata->eapolframe_size);
|
||||
+
|
||||
cdata->keymicset = 1;
|
||||
cdata->eapolframeset = 1;
|
||||
+
|
||||
+ /* Check for frame 3 of the 4-way handshake */
|
||||
+ } else if ((key_info & WPA_KEY_INFO_MIC)
|
||||
+ && (key_info & WPA_KEY_INFO_ACK)
|
||||
+ && (key_info & WPA_KEY_INFO_INSTALL)) {
|
||||
+ /* All we need from this frame is the authenticator nonce */
|
||||
+ memcpy(cdata->anonce, eapolkeyhdr->key_nonce,
|
||||
+ sizeof(cdata->anonce));
|
||||
+ cdata->anonceset = 1;
|
||||
+
|
||||
+ }
|
||||
+
|
||||
+ if (opt->verbose > 2) {
|
||||
+ printf("aaset: %d\n",cdata->aaset);
|
||||
+ printf("spaset: %d\n",cdata->spaset);
|
||||
+ printf("snonceset: %d\n",cdata->snonceset);
|
||||
+ printf("keymicset: %d\n",cdata->keymicset);
|
||||
+ printf("eapolframeset: %d\n",cdata->eapolframeset);
|
||||
+ printf("anonceset: %d\n", cdata->anonceset);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -507,8 +526,7 @@
|
||||
printf("\n");
|
||||
|
||||
printf("eapolframe is:");
|
||||
- lamont_hdump(cdata.eapolframe, 99); /* Bug in lamont_hdump makes this look
|
||||
- wrong, only shows 98 bytes */
|
||||
+ lamont_hdump(cdata.eapolframe, cdata.eapolframe_size);
|
||||
printf("\n");
|
||||
|
||||
}
|
||||
@@ -706,7 +724,7 @@
|
||||
}
|
||||
|
||||
hmac_hash(cdata->ver, ptkset->mic_key, 16, cdata->eapolframe,
|
||||
- sizeof(cdata->eapolframe), keymic);
|
||||
+ cdata->eapolframe_size, keymic);
|
||||
|
||||
if (opt->verbose > 2) {
|
||||
printf("Calculated MIC with \"%s\" is", passphrase);
|
||||
@@ -815,7 +833,7 @@
|
||||
}
|
||||
|
||||
hmac_hash(cdata->ver, ptkset->mic_key, 16, cdata->eapolframe,
|
||||
- sizeof(cdata->eapolframe), keymic);
|
||||
+ cdata->eapolframe_size, keymic);
|
||||
|
||||
if (opt->verbose > 2) {
|
||||
printf("Calculated MIC with \"%s\" is", passphrase);
|
||||
@@ -874,7 +892,7 @@
|
||||
0 && (h->len >
|
||||
capdata.l2type_offset + sizeof(struct wpa_eapol_key))) {
|
||||
/* It's a dot1x frame, process it */
|
||||
- handle_dot1x(&cdata, &capdata);
|
||||
+ handle_dot1x(&cdata, &capdata, &opt);
|
||||
if (cdata.aaset && cdata.spaset && cdata.snonceset &&
|
||||
cdata.anonceset && cdata.keymicset
|
||||
&& cdata.eapolframeset) {
|
||||
@@ -909,7 +927,6 @@
|
||||
eapkeypacket =
|
||||
(struct wpa_eapol_key *)&cdata.eapolframe[EAPDOT1XOFFSET];
|
||||
memset(&eapkeypacket->key_mic, 0, sizeof(eapkeypacket->key_mic));
|
||||
- eapkeypacket->key_data_length = 0;
|
||||
|
||||
printf("Starting dictionary attack. Please be patient.\n");
|
||||
fflush(stdout);
|
||||
diff -uNr cowpatty-4.3/cowpatty.h cowpatty-4.3-fixup2/cowpatty.h
|
||||
--- cowpatty-4.3/cowpatty.h 2008-03-20 09:49:38.000000000 -0700
|
||||
+++ cowpatty-4.3-fixup2/cowpatty.h 2009-05-21 23:37:52.533281370 -0700
|
||||
@@ -94,7 +94,7 @@
|
||||
u16 length;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
-#define MAXPASSLEN 63
|
||||
+#define MAXPASSLEN 64
|
||||
#define MEMORY_DICT 0
|
||||
#define STDIN_DICT 1
|
||||
#define EAPDOT1XOFFSET 4
|
||||
@@ -166,7 +166,8 @@
|
||||
u8 spa[6];
|
||||
u8 snonce[32];
|
||||
u8 anonce[32];
|
||||
- u8 eapolframe[99]; /* Length the same for all packets? */
|
||||
+ u8 eapolframe[99];
|
||||
+ u8 eapolframe2[125];
|
||||
u8 keymic[16];
|
||||
u8 aaset;
|
||||
u8 spaset;
|
||||
@@ -177,6 +178,7 @@
|
||||
u8 replay_counter[8];
|
||||
|
||||
int ver; /* Hashing algo, MD5 or AES-CBC-MAC */
|
||||
+ int eapolframe_size;
|
||||
};
|
||||
|
||||
struct hashdb_head {
|
||||
|
|
@ -1,12 +0,0 @@
|
|||
diff -uNr cowpatty-4.3/cowpatty.c cowpatty-4.3-hashfix/cowpatty.c
|
||||
--- cowpatty-4.3/cowpatty.c 2008-03-20 09:49:38.000000000 -0700
|
||||
+++ cowpatty-4.3-hashfix/cowpatty.c 2008-10-19 23:29:22.000000000 -0700
|
||||
@@ -202,7 +202,7 @@
|
||||
}
|
||||
|
||||
/* Test that the files specified exist and are greater than 0 bytes */
|
||||
- if (!IsBlank(opt->hashfile)) {
|
||||
+ if (!IsBlank(opt->hashfile) && strncmp(opt->hashfile, "-", 1) != 0) {
|
||||
if (stat(opt->hashfile, &teststat)) {
|
||||
usage("Could not stat hashfile. Check file path.");
|
||||
exit(-1);
|
||||
|
|
@ -1,346 +0,0 @@
|
|||
diff -uNr cowpatty-4.6/cowpatty.c cowpatty-4.6-fixup14/cowpatty.c
|
||||
--- cowpatty-4.6/cowpatty.c 2009-07-03 08:15:50.000000000 -0700
|
||||
+++ cowpatty-4.6-fixup14/cowpatty.c 2009-07-17 19:16:21.792816008 -0700
|
||||
@@ -94,8 +94,7 @@
|
||||
"\t-d \tHash file (genpmk)\n"
|
||||
"\t-r \tPacket capture file\n"
|
||||
"\t-s \tNetwork SSID (enclose in quotes if SSID includes spaces)\n"
|
||||
- "\t-2 \tUse frames 1 and 2 or 2 and 3 for key attack (nonstrict mode)\n"
|
||||
- "\t-c \tCheck for valid 4-way frames, does not crack\n"
|
||||
+ "\t-c \tCheck for valid 4-way frames, does not crack\n"
|
||||
"\t-h \tPrint this help information and exit\n"
|
||||
"\t-v \tPrint verbose information (more -v for more verbosity)\n"
|
||||
"\t-V \tPrint program version and exit\n" "\n");
|
||||
@@ -151,7 +150,7 @@
|
||||
|
||||
int c;
|
||||
|
||||
- while ((c = getopt(argc, argv, "f:r:s:d:c2nhvV")) != EOF) {
|
||||
+ while ((c = getopt(argc, argv, "f:r:s:d:cnhvV")) != EOF) {
|
||||
switch (c) {
|
||||
case 'f':
|
||||
strncpy(opt->dictfile, optarg, sizeof(opt->dictfile));
|
||||
@@ -166,9 +165,6 @@
|
||||
strncpy(opt->hashfile, optarg, sizeof(opt->hashfile));
|
||||
break;
|
||||
case 'n':
|
||||
- case '2':
|
||||
- opt->nonstrict++;
|
||||
- break;
|
||||
case 'c':
|
||||
opt->checkonly++;
|
||||
break;
|
||||
@@ -435,21 +431,11 @@
|
||||
cdata->ver = key_info & WPA_KEY_INFO_TYPE_MASK;
|
||||
index = key_info & WPA_KEY_INFO_KEY_INDEX_MASK;
|
||||
|
||||
- if (opt->nonstrict == 0) {
|
||||
-
|
||||
- /* Check for EAPOL version 1, type EAPOL-Key */
|
||||
- if (dot1xhdr->version != 1 || dot1xhdr->type != 3) {
|
||||
- return;
|
||||
- }
|
||||
-
|
||||
- } else {
|
||||
-
|
||||
- /* Check for type EAPOL-Key */
|
||||
- if (dot1xhdr->type != 3) {
|
||||
- return;
|
||||
- }
|
||||
-
|
||||
+ /* Check for type EAPOL-Key */
|
||||
+ if (dot1xhdr->type != 3) {
|
||||
+ return;
|
||||
}
|
||||
+
|
||||
if (cdata->ver != WPA_KEY_INFO_TYPE_HMAC_MD5_RC4 &&
|
||||
cdata->ver != WPA_KEY_INFO_TYPE_HMAC_SHA1_AES) {
|
||||
return;
|
||||
@@ -457,12 +443,12 @@
|
||||
|
||||
if (cdata->ver == WPA_KEY_INFO_TYPE_HMAC_MD5_RC4) {
|
||||
/* Check for WPA key, and pairwise key type */
|
||||
- if (eapolkeyhdr->type != 254 ||
|
||||
+ if ((eapolkeyhdr->type != 2 && eapolkeyhdr->type != 254) ||
|
||||
(key_info & WPA_KEY_INFO_KEY_TYPE) == 0) {
|
||||
return;
|
||||
}
|
||||
} else if (cdata->ver == WPA_KEY_INFO_TYPE_HMAC_SHA1_AES) {
|
||||
- if (eapolkeyhdr->type != 2 ||
|
||||
+ if ((eapolkeyhdr->type != 2 && eapolkeyhdr->type != 254) ||
|
||||
(key_info & WPA_KEY_INFO_KEY_TYPE) == 0) {
|
||||
return;
|
||||
}
|
||||
@@ -472,19 +458,22 @@
|
||||
|
||||
/* Check for frame 2 of the 4-way handshake */
|
||||
if ((key_info & WPA_KEY_INFO_MIC)
|
||||
- && (key_info & WPA_KEY_INFO_ACK) == 0
|
||||
- && (key_info & WPA_KEY_INFO_INSTALL) == 0
|
||||
- && eapolkeyhdr->key_data_length > 0) {
|
||||
+ && (key_info & WPA_KEY_INFO_ACK) == 0
|
||||
+ && (key_info & WPA_KEY_INFO_INSTALL) == 0
|
||||
+ && eapolkeyhdr->key_data_length > 0) {
|
||||
|
||||
/* All we need from this frame is the authenticator nonce */
|
||||
memcpy(cdata->snonce, eapolkeyhdr->key_nonce,
|
||||
sizeof(cdata->snonce));
|
||||
cdata->snonceset = 1;
|
||||
+ memcpy(cdata->replay_counter1,
|
||||
+ eapolkeyhdr->replay_counter, 8);
|
||||
+ cdata->replay_counter1[7] = cdata->replay_counter1[7] + 1;
|
||||
|
||||
/* Check for frame 3 of the 4-way handshake */
|
||||
} else if ((key_info & WPA_KEY_INFO_MIC)
|
||||
- && (key_info & WPA_KEY_INFO_INSTALL)
|
||||
- && (key_info & WPA_KEY_INFO_ACK)) {
|
||||
+ && (key_info & WPA_KEY_INFO_INSTALL)
|
||||
+ && (key_info & WPA_KEY_INFO_ACK)) {
|
||||
|
||||
memcpy(cdata->spa, &packet[capdata->dstmac_offset],
|
||||
sizeof(cdata->spa));
|
||||
@@ -497,15 +486,17 @@
|
||||
cdata->anonceset = 1;
|
||||
/* We save the replay counter value in the 3rd frame to match
|
||||
against the 4th frame of the four-way handshake */
|
||||
- memcpy(cdata->replay_counter,
|
||||
+ memcpy(cdata->replay_counter2,
|
||||
eapolkeyhdr->replay_counter, 8);
|
||||
|
||||
/* Check for frame 4 of the four-way handshake */
|
||||
} else if ((key_info & WPA_KEY_INFO_MIC)
|
||||
- && (key_info & WPA_KEY_INFO_ACK) == 0
|
||||
- && (key_info & WPA_KEY_INFO_INSTALL) == 0
|
||||
- && (memcmp (cdata->replay_counter,
|
||||
- eapolkeyhdr->replay_counter, 8) == 0)) {
|
||||
+ && (key_info & WPA_KEY_INFO_ACK) == 0
|
||||
+ && (key_info & WPA_KEY_INFO_INSTALL) == 0
|
||||
+ && (memcmp (cdata->replay_counter1,
|
||||
+ cdata->replay_counter2, 8) == 0)
|
||||
+ && (memcmp (cdata->replay_counter2,
|
||||
+ eapolkeyhdr->replay_counter, 8) == 0)) {
|
||||
|
||||
memcpy(cdata->keymic, eapolkeyhdr->key_mic,
|
||||
sizeof(cdata->keymic));
|
||||
@@ -513,57 +504,76 @@
|
||||
sizeof(cdata->eapolframe));
|
||||
cdata->keymicset = 1;
|
||||
cdata->eapolframeset = 1;
|
||||
+ cdata->counters = 1;
|
||||
}
|
||||
- } else {
|
||||
-
|
||||
- /* Check for frame 1 of the 4-way handshake */
|
||||
- if ((key_info & WPA_KEY_INFO_MIC) == 0
|
||||
- && (key_info & WPA_KEY_INFO_ACK)
|
||||
- && (key_info & WPA_KEY_INFO_INSTALL) == 0 ) {
|
||||
- /* All we need from this frame is the authenticator nonce */
|
||||
- memcpy(cdata->anonce, eapolkeyhdr->key_nonce,
|
||||
- sizeof(cdata->anonce));
|
||||
- cdata->anonceset = 1;
|
||||
-
|
||||
- /* Check for frame 2 of the 4-way handshake */
|
||||
- } else if ((key_info & WPA_KEY_INFO_MIC)
|
||||
- && (key_info & WPA_KEY_INFO_INSTALL) == 0
|
||||
- && (key_info & WPA_KEY_INFO_ACK) == 0
|
||||
- && eapolkeyhdr->key_data_length > 0) {
|
||||
|
||||
- cdata->eapolframe_size = ( packet[capdata->dot1x_offset + 2] << 8 )
|
||||
- + packet[capdata->dot1x_offset + 3] + 4;
|
||||
-
|
||||
- memcpy(cdata->spa, &packet[capdata->dstmac_offset],
|
||||
- sizeof(cdata->spa));
|
||||
- cdata->spaset = 1;
|
||||
-
|
||||
- memcpy(cdata->aa, &packet[capdata->srcmac_offset],
|
||||
- sizeof(cdata->aa));
|
||||
- cdata->aaset = 1;
|
||||
-
|
||||
- memcpy(cdata->snonce, eapolkeyhdr->key_nonce,
|
||||
- sizeof(cdata->snonce));
|
||||
- cdata->snonceset = 1;
|
||||
+ } else {
|
||||
|
||||
- memcpy(cdata->keymic, eapolkeyhdr->key_mic,
|
||||
- sizeof(cdata->keymic));
|
||||
- cdata->keymicset = 1;
|
||||
+ /* Check for frame 1 of the 4-way handshake */
|
||||
+ if ((key_info & WPA_KEY_INFO_MIC) == 0
|
||||
+ && (key_info & WPA_KEY_INFO_ACK)
|
||||
+ && (key_info & WPA_KEY_INFO_INSTALL) == 0 ) {
|
||||
+
|
||||
+ /* All we need from this frame is the authenticator nonce */
|
||||
+ memcpy(cdata->anonce, eapolkeyhdr->key_nonce,
|
||||
+ sizeof(cdata->anonce));
|
||||
+ cdata->anonceset = 1;
|
||||
+
|
||||
+ memcpy(cdata->replay_counter1,
|
||||
+ eapolkeyhdr->replay_counter, 8);
|
||||
+ cdata->replay_counter1[7] = cdata->replay_counter1[7] + 1;
|
||||
+
|
||||
+ /* Check for frame 2 or 4 of the 4-way handshake */
|
||||
+ } else if ((key_info & WPA_KEY_INFO_MIC)
|
||||
+ && (key_info & WPA_KEY_INFO_INSTALL) == 0
|
||||
+ && (key_info & WPA_KEY_INFO_ACK) == 0) {
|
||||
+
|
||||
+ cdata->eapolframe_size = ( packet[capdata->dot1x_offset + 2] << 8 )
|
||||
+ + packet[capdata->dot1x_offset + 3] + 4;
|
||||
+
|
||||
+ memcpy(cdata->spa, &packet[capdata->dstmac_offset],
|
||||
+ sizeof(cdata->spa));
|
||||
+ cdata->spaset = 1;
|
||||
+
|
||||
+ memcpy(cdata->aa, &packet[capdata->srcmac_offset],
|
||||
+ sizeof(cdata->aa));
|
||||
+ cdata->aaset = 1;
|
||||
+
|
||||
+ memcpy(cdata->snonce, eapolkeyhdr->key_nonce,
|
||||
+ sizeof(cdata->snonce));
|
||||
+ cdata->snonceset = 1;
|
||||
+
|
||||
+ memcpy(cdata->keymic, eapolkeyhdr->key_mic,
|
||||
+ sizeof(cdata->keymic));
|
||||
+ cdata->keymicset = 1;
|
||||
+
|
||||
+ memcpy(cdata->eapolframe, &packet[capdata->dot1x_offset],
|
||||
+ cdata->eapolframe_size);
|
||||
+ cdata->eapolframeset = 1;
|
||||
|
||||
- memcpy(cdata->eapolframe, &packet[capdata->dot1x_offset],
|
||||
- cdata->eapolframe_size);
|
||||
- cdata->eapolframeset = 1;
|
||||
+ memcpy(cdata->replay_counter2,
|
||||
+ eapolkeyhdr->replay_counter, 8);
|
||||
+ cdata->replay_counter2[7] = cdata->replay_counter2[7] + 1;
|
||||
+ memcpy(cdata->replay_counter3,
|
||||
+ eapolkeyhdr->replay_counter, 8);
|
||||
+ cdata->replay_counter3[7] = cdata->replay_counter3[7] + 2;
|
||||
+
|
||||
+ /* Check for frame 3 of the 4-way handshake */
|
||||
+ } else if ((key_info & WPA_KEY_INFO_MIC)
|
||||
+ && (key_info & WPA_KEY_INFO_ACK)
|
||||
+ && (key_info & WPA_KEY_INFO_INSTALL)) {
|
||||
+
|
||||
+ /* All we need from this frame is the authenticator nonce */
|
||||
+ memcpy(cdata->anonce, eapolkeyhdr->key_nonce,
|
||||
+ sizeof(cdata->anonce));
|
||||
+ cdata->anonceset = 1;
|
||||
+
|
||||
+ memcpy(cdata->replay_counter4,
|
||||
+ eapolkeyhdr->replay_counter, 8);
|
||||
+ cdata->replay_counter4[7] = cdata->replay_counter4[7] + 1;
|
||||
|
||||
+ }
|
||||
|
||||
- /* Check for frame 3 of the 4-way handshake */
|
||||
- } else if ((key_info & WPA_KEY_INFO_MIC)
|
||||
- && (key_info & WPA_KEY_INFO_ACK)
|
||||
- && (key_info & WPA_KEY_INFO_INSTALL)) {
|
||||
- /* All we need from this frame is the authenticator nonce */
|
||||
- memcpy(cdata->anonce, eapolkeyhdr->key_nonce,
|
||||
- sizeof(cdata->anonce));
|
||||
- cdata->anonceset = 1;
|
||||
- }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -982,10 +992,82 @@
|
||||
}
|
||||
}
|
||||
|
||||
+ if (!(cdata.aaset && cdata.spaset && cdata.snonceset &&
|
||||
+ cdata.anonceset && cdata.keymicset && cdata.eapolframeset)) {
|
||||
+
|
||||
+ cdata.aaset = 0;
|
||||
+ cdata.spaset = 0;
|
||||
+ cdata.snonceset = 0;
|
||||
+ cdata.anonceset = 0;
|
||||
+ cdata.keymicset = 0;
|
||||
+ cdata.eapolframeset = 0;
|
||||
+
|
||||
+ opt.nonstrict = 1;
|
||||
+
|
||||
+ memset(&capdata, 0, sizeof(struct capture_data));
|
||||
+ memset(&cdata, 0, sizeof(struct crack_data));
|
||||
+ memset(&eapolkey_nomic, 0, sizeof(eapolkey_nomic));
|
||||
+
|
||||
+ /* Populate capdata struct */
|
||||
+ strncpy(capdata.pcapfilename, opt.pcapfile,
|
||||
+ sizeof(capdata.pcapfilename));
|
||||
+ if (openpcap(&capdata) != 0) {
|
||||
+ printf("Unsupported or unrecognized pcap file.\n");
|
||||
+ exit(-1);
|
||||
+ }
|
||||
+
|
||||
+ /* populates global *packet */
|
||||
+ while (getpacket(&capdata) > 0) {
|
||||
+ if (opt.verbose > 2) {
|
||||
+ lamont_hdump(packet, h->len);
|
||||
+ }
|
||||
+ /* test packet for data that we are looking for */
|
||||
+ if (memcmp(&packet[capdata.l2type_offset], DOT1X_LLCTYPE, 2) ==
|
||||
+ 0 && (h->len >capdata.l2type_offset + sizeof(struct wpa_eapol_key))) {
|
||||
+ /* It's a dot1x frame, process it */
|
||||
+ handle_dot1x(&cdata, &capdata, &opt);
|
||||
+
|
||||
+ if (cdata.aaset && cdata.spaset && cdata.snonceset
|
||||
+ && cdata.anonceset && cdata.keymicset
|
||||
+ && cdata.eapolframeset) {
|
||||
+
|
||||
+ if (cdata.replay_counter1 != 0
|
||||
+ && cdata.replay_counter2 != 0) {
|
||||
+
|
||||
+ if (memcmp (cdata.replay_counter1,
|
||||
+ cdata.replay_counter2, 8) == 0) {
|
||||
+
|
||||
+ cdata.counters = 1;
|
||||
+ /* We've collected everything we need. */
|
||||
+ break;
|
||||
+
|
||||
+ }
|
||||
+
|
||||
+ }
|
||||
+
|
||||
+ if (cdata.replay_counter3 != 0
|
||||
+ && cdata.replay_counter4 != 0) {
|
||||
+
|
||||
+ if (memcmp (cdata.replay_counter3,
|
||||
+ cdata.replay_counter4, 8) == 0) {
|
||||
+
|
||||
+ cdata.counters = 1;
|
||||
+ /* We've collected everything we need. */
|
||||
+ break;
|
||||
+
|
||||
+ }
|
||||
+
|
||||
+ }
|
||||
+
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
closepcap(&capdata);
|
||||
|
||||
if (!(cdata.aaset && cdata.spaset && cdata.snonceset &&
|
||||
- cdata.anonceset && cdata.keymicset && cdata.eapolframeset)) {
|
||||
+ cdata.anonceset && cdata.keymicset && cdata.eapolframeset && cdata.counters)) {
|
||||
printf("End of pcap capture file, incomplete four-way handshake "
|
||||
"exchange. Try using a\ndifferent capture.\n");
|
||||
exit(-1);
|
||||
diff -uNr cowpatty-4.6/cowpatty.h cowpatty-4.6-fixup14/cowpatty.h
|
||||
--- cowpatty-4.6/cowpatty.h 2009-06-04 06:24:16.000000000 -0700
|
||||
+++ cowpatty-4.6-fixup14/cowpatty.h 2009-07-17 16:16:58.043152023 -0700
|
||||
@@ -178,7 +178,11 @@
|
||||
u8 anonceset;
|
||||
u8 keymicset;
|
||||
u8 eapolframeset;
|
||||
- u8 replay_counter[8];
|
||||
+ u8 replay_counter1[8];
|
||||
+ u8 replay_counter2[8];
|
||||
+ u8 replay_counter3[8];
|
||||
+ u8 replay_counter4[8];
|
||||
+ u8 counters;
|
||||
|
||||
int ver; /* Hashing algo, MD5 or AES-CBC-MAC */
|
||||
int eapolframe_size;
|
||||
38
net-wireless/cowpatty/files/incompatible-pointer-types.patch
Normal file
38
net-wireless/cowpatty/files/incompatible-pointer-types.patch
Normal file
|
|
@ -0,0 +1,38 @@
|
|||
Description: Fix FTBFS with GCC-15 (Closes: #1096465).
|
||||
Author: Sven Geuer <sge@debian.org>
|
||||
Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1096465
|
||||
Forwarded: no
|
||||
Last-Update: 2025-09-26
|
||||
---
|
||||
This patch header follows DEP-3: http://dep.debian.net/deps/dep3/
|
||||
--- a/cowpatty.c
|
||||
+++ b/cowpatty.c
|
||||
@@ -61,7 +61,7 @@
|
||||
void hexdump(unsigned char *data, int len);
|
||||
void usage(char *message);
|
||||
void testopts(struct user_opt *opt);
|
||||
-void cleanup();
|
||||
+void cleanup(int unused);
|
||||
void parseopts(struct user_opt *opt, int argc, char **argv);
|
||||
void closepcap(struct capture_data *capdata);
|
||||
void handle_dot1x(struct crack_data *cdata, struct capture_data *capdata,
|
||||
@@ -91,7 +91,7 @@
|
||||
"\t-V \tPrint program version and exit\n" "\n");
|
||||
}
|
||||
|
||||
-void cleanup()
|
||||
+void cleanup(int unused)
|
||||
{
|
||||
/* lame-o-meter++ */
|
||||
sig = 1;
|
||||
--- a/genpmk.c
|
||||
+++ b/genpmk.c
|
||||
@@ -53,7 +53,7 @@
|
||||
"argument.\n");
|
||||
}
|
||||
|
||||
-void cleanup()
|
||||
+void cleanup(int unused)
|
||||
{
|
||||
/* lame-o-meter++ */
|
||||
sig = 1;
|
||||
7
net-wireless/cowpatty/metadata.xml
Normal file
7
net-wireless/cowpatty/metadata.xml
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE pkgmetadata SYSTEM "https://www.gentoo.org/dtd/metadata.dtd">
|
||||
<pkgmetadata>
|
||||
<upstream>
|
||||
<remote-id type="github">joswr1ght/cowpatty</remote-id>
|
||||
</upstream>
|
||||
</pkgmetadata>
|
||||
Loading…
Reference in a new issue