File: c50-faq.html

package info (click to toggle)
crack 5.0a-19
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 9,248 kB
  • sloc: ansic: 7,445; perl: 1,375; sh: 1,066; makefile: 216
file content (582 lines) | stat: -rw-r--r-- 16,707 bytes parent folder | download | duplicates (9)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
<HTML>

<HEAD>
<TITLE>Crack Password Cracker FAQ</TITLE>
</HEAD>

<BODY BGCOLOR=#FFFFFF>

<HR>
<H1>FAQ for Crack v5.0a</H1>
<I>
Copyright (c) Alec Muffett, 1999, 2000, 2001 <BR>
Revised: Wed Mar 21 02:38:38 GMT 2001
</I>

<P>

<HR>
<H1>Download</H1>

<UL>
<LI><I>Where can I go to download Crack?</I>
<P>

Last time I checked: (12 June 2000) <BR>

<A HREF="ftp://ftp.cerias.purdue.edu/pub/tools/unix/pwdutils/crack">ftp://ftp.cerias.purdue.edu/pub/tools/unix/pwdutils/crack</A><BR>
<A HREF="ftp://ftp.cert.dfn.de/pub/tools/password/Crack/">ftp://ftp.cert.dfn.de/pub/tools/password/Crack/</A>
<P>

With more dictionaries/wordlists available at: <BR>

<A HREF="ftp://ftp.cerias.purdue.edu/pub/dict">ftp://ftp.cerias.purdue.edu/pub/dict</A><BR>
<A HREF="ftp://ftp.ox.ac.uk/pub/wordlists">ftp://ftp.ox.ac.uk/pub/wordlists</A>
<P>

A PGP signature to validate the contents of any download you might find, is
<A HREF="c50a.tgz.asc">available here</A>. My key is on the keyservers.

<P>

<LI><I>Can you send me the README for Crack?</I>

<P>

Better yet, there's a copy of it <A HREF="c50a.txt">right here</A>.  Read it yourself.

<P>

<LI><I>I can't download Crack!  Will you please e-mail it to me?</I>

<P>

Sorry, but no.  It's too big for me to be mailing it to people who
invariably then tell me that it's in the wrong format for them anyway,
or who want to use it on Microsoft Windows.  (see below)

<P>

</UL>

<HR>
<H1>Trolls <A HREF="crack-users.txt">[MORE]</A></H1>

<UL>
<LI><I>How can I run Crack on a Win98/WinNT/MS-DOS system?</I>

<P>

You can't.  Crack is Unix software, written for Unix systems and
running primarily <b>on</b> Unix systems, and if you don't know what
Unix is, then you don't need to know about Crack.

<P>

<LI><I>Can you hack this guy's account/password/computer for me?</I>

<P>

Probably, but I am not going to; now be a good little trog and run
along and report yourself to your local police authorities, please...

<P>

<LI><I>Can you give me a Crack for TombRaider/Carmageddon/FinalFantasy?</I>

<P>

Oh, go away and get a life, you horrible little oik.

<P>


<LI><I>H3Y D00D - WAr3 KaN 1 BuY CRACK?!?!!</I>

<P>

I am reliably informed that the answer to this is <I>"any
street-corner in Oakland"</I> - but being based in the UK I cannot
vouch for the accuracy of this statement.

<P>

</UL>

<HR>
<H1>Technical</H1>

<UL>

<LI><I>When I run Crack, it says "Done." and exits immediately, and
there are no results when I run the Reporter script; why is
this?</I>

<P>

<TT>Crack</TT> is an unusual Unix program - it runs the actual cracking process
in the "background"; when you type:

<P>

<PRE>
 Crack passwd.txt
</PRE>

<P>

...or whatever, the <TT>Crack</TT> wrapper-script launches a
background process called <TT>crack-pwc</TT>, and it is <I>this</I>
which guesses passwords.

<P>

It is <TT>crack-pwc</TT> that will run for a long time, and if you do:

<P>

<PRE>
 ps -auxww <I>...or...</I>
 ps -ef
</PRE>

<P>

...after running <TT>Crack</TT>, then you should see a copy of
<TT>crack-pwc</TT> running merrily in the background; ideally you
should only have 1 copy of <TT>crack-pwc</TT> running, for each CPU in
your machine.

<P>

<LI><I>How long does crack-pwc run for?</I>

<P>

Hard to say, since this will depend upon the number of passwords that
are being cracked, and the speed of your machines.

<P>

The short answer is: <I>at least hours, probably days, possibly weeks.</I>

<P>

The longest single continuous <TT>Crack</TT> run I have ever done, lasted a
little under seven months non-stop on a little-used Sun 4/330, back in
1991.  With faster CPUs available nowadays, things are less-bad.

<P>

<LI><I>How do I add a list of my own words to the Crack dictionaries?</I>

<P>

Move the file containing the list of words into the <TT>dicts/1</TT>
directory and do <TT>make rmdict</TT> in the <TT>Crack</TT> home
directory; the words will be merged, the next time you run
<TT>Crack</TT>.

<P>

That's all you have to do; you may choose to <I>compress</I> or
<I>gzip</I> your wordlist file, if you like - <TT>Crack</TT> will
automatically unpack it when it needs it - but it is not essential.

<P>

<LI><I>What are all the ".dwg" extensions on the Crack dictionary
files for?</I>

<P>

<TT>Crack</TT> has a custom, built-in dictionary compression tool
called DAWG (Directed Acyclic Word Graph) which preprocesses sorted
lists of words to remove redundancy and make tools like <I>gzip</I>
more effective.

<P>

Don't worry about it - it's not something that's likely to ever be
needed by you in normal <TT>Crack</TT> usage.

<P>

<LI><I>Where can I get more wordlists?</I>

<P>

Last time I checked: <BR>

<A href="ftp://ftp.ox.ac.uk/pub/wordlists/">ftp://ftp.ox.ac.uk/pub/wordlists/</A>

<P>

<LI><I>On RedHat-based Linux distributions, Crack doesn't run, and I
get messages like this:</I>

<P>

<PRE>
 ../../run/bin/linux-2-unknown/dictfilt dictfilt.c elcid.o
 .../../run/bin/linux-2-unknown/libc5.a
 cc: elcid.o : No such file or directory
 make[1]:***[../../run/bin/linux-2-unknown/dictfilt] Error 1
 make[1]: Leaving directory `/crack/c50a/src/util'
 make[1]:*** [utils] Error 1
</PRE>

<P>

It's a known problem: unfortunately the crypt() routine has now been
unbundled from <i>libc</i> in many operating systems, and linkers tend
to be more strict (or perhaps boneheaded?) than they used to be.

<P>

Here is a <A HREF="c50-linux-util-makefile.txt">replacement</A> for
<tt>src/util/Makefile</tt> which <i>should</i> alleviate the problem.
Like all Makefiles, it requires preservation of its TAB structure to
work properly, so if your "make" program complains about:

<P>

<tt> *** missing separator. Stop.</tt>

<P>

...or similar, please try <b>saving the file properly using your
browser function</b>, and not just cutting and pasting out of the
browser window.

<P>

<LI><I>I want to produce reports of crackable passwords which do not
actually contain the plaintext password itself.  How do I do
this?</I>

<P>

This is easily achieved by tweaking the "Reporter" script in Crack5.0;
a little examination of the code, and it should be obvious what to do.

<P>

<LI><I>I want to compose my own rulesets; where can I find documentation?</I>

<P>

Documentation on the rulesets is a bit scanty, but this
<A href="c50-rules.txt">file</A> should be of help.

<P>

<LI><I>I want to use Crack to check users' passwords when they are
changing them; can I do this?</I>

<P>

Yes, however you ought to be looking at my <TT>CrackLib</TT> software
which does this, and not <TT>Crack</TT> itself.

<P>

<LI> <I>Crack 4.x used to have this really neat feature where it would
store passwords that it had <B>not</B> managed to guess, and it would
not bother to attack them again next time.  Why doesn't 5.x do this?
I want this functionality back! </I>

<P>

I removed this functionality because many Crack users were not
bothering to clear out the history of so-called <I>"unguessable"</I>
passwords every few months; the point was that a password that was
<I>unguessable</I> one month, might become <I>guessable</I> the next
month, when other updates/additions might have been added to the
password map, providing more guessing material for Crack.

<P>

People who want to reduce Crack runtime by only running it against new
additions and changes to the password file, are encouraged to explore
the opportunities that are afforded by the Unix commands <TT>sort</TT>
and <TT>comm</TT>, which can enable equivalent functionality in a
matter of seconds.

<P>

Keeping a <TT>sort</TT>ed copy of the last password file you cracked,
and running <TT>comm</TT> against it and a <TT>sort</TT>ed copy of the
new password file, will print any differences.  Save these, and run
Crack on that data.

<P>

Users are still recommended to try Cracking the whole password file,
in one big chunk, changed or unchanged, at least occasionally.
<P>

</UL>

<HR>
<H1>Miscellany</H1>

<UL>

<LI><I>Is Crack supported?</I>

<P>

I fix bugs as/when I may, and occasonally post new revs to the net.
Given how stupid people generally are regarding computer security, I
can forsee doing this until the day I die.  I can usually be persuaded
to answer questions for beer.

<P>

<LI><I>Is Crack Y2K Compliant?</I>

<P>

Probably.  If it isn't, I am sure I'll find out eventually.

<P>

<LI><I>We'd like to use Crack for inclusion in a commercial product or
software distribution; is that OK?</I>

<P>

Please ensure that you have read the software LICENSE file, and
double-check with me via e-mail if necessary.

<P>

<LI><I>We'd like to license Crack for inclusion in a commercial
product; we'd like you to sign this disclaimer and contract and
mail/fax it back trans-atlantic to our legal department in California,
because it's obviously to your benefit that you do so.</I>

<P>

Thank you for the contract documents.  I shall frame them and put them
on the wall with the others in the toilet.  Now kindly go read the
LICENSE file, and e-mail me if you have any questions, although be
aware that your response may be delayed by my rolling on the floor in
hysterical laughter.

<P>



<LI> <I>Would you consider enhancing Crack to run {on a cluster, in an
SMP or threaded environment, using MPI, PVM, POSIX threads, or alike}?</I>
<P>

Ah, this old chestnut; there is a note in the Crack5 distribution
about this.  Basically: because of the nature of the data being
cracked, there is no real advantage in threading the code.  It's
easiest as one-process-per-CPU.
<P>

Consider: most of the point of threading and/or vector operations
and/or parallelisation is to take advantage of many/optimised CPUs to
do the same computational task in parallel/simultaneously/in one
operation.
<P>

The function of Crack is to try as efficiently as possible (ie: once
only) each of several million possible password guesses against the
distinct ciphertexts of several thousand users.
<P>

<B>ie:</b> to do several billion computationally *distinct* things.
<P>

It is (regrettably) in the nature of cryptography that generation of
each password hash (ie: call to <TT>crypt()</TT>) is of a
mostly-computationally-distinct nature, and that the only way to use
parallelization to speed this up would involve writing a highly
architecture-specific parallel-<TT>crypt()</TT> implementation, which
is not economically viable to create when compared to equivalent
serial password-cracking programs.
<P>

in short: if a one woman can make a baby in nine months, this does
*not* mean that nine women can make one baby in one month.
<P>

instead: nine women make nine babies in nine months, and all of those
nine babies arrive simultaneously at the *end* of the nine months.
<P>

of course, if we *could* parallelise baby-creation, we would get one
baby per month for nine months, but the problems of locking, surgery,
gene-splicing and baby-fragment-reassembly would drag down the time,
raise overheads and costs, and in the end yield exactly the same end-result as
the serial-baby-creation-method.  8-)
<P>


<LI> <I>Oh go on - surely there must be some way to parallelise
cracking operations? </I>
<P>

Well, it depends on what I/you mean by "making it parallel"; if by
that you mean "creating a password hashing algorithm that makes
effective use of multiple CPUs to speed the essentially linear
<TT>crypt()</TT> mechanism" - then no, I don't believe it'd be viable
(without specialist hardware) because the process of getting a
password from an un-hashed state (say: Utah) to a hashed one (say:
California) is most quickly achieved by dropping the data onto a
single CPU (say: a Porsche 911) and driving non-stop.
<P>

The only overhead here is (of course) in tuning your algorithm for
your specific CPU architecture, to most closely resemble a Porsche 911.
<P>

Nowadays, with locking overhead and synchronisation, using traditional
multi-cpu parallelisation and threading would be more akin to
hitch-hiking the length of the trip.
<P>

That said: there exists a technique called "bitslicing" which alas is
complicated to do unless you're a crypto geek, but which basically
involves packing as many people as feasible into your Porsche and
occasionally stopping in order to rotate their positions.
<P>

In other words: on a 32-bit architecture you use bit-1 of your
datapath to do encryption operations that are pertinent to one
encryption, and you use bit-2 in order to do a second, bit-3 in order
to do a third, and so forth, achieving parallelism of up to 32
crypt-calls this way...  on a 64-bit architecture, of course you do 64
at once.
<P>

<I>(This technique was first written up by Biham several years ago,
but I may have thought of the idea first, though I never managed to
finish implementing it.  I called the idea "polycrypt", conceived on a
bus trip returning from a bash in London with Paul Leyland, and it was
the main reason that I introduced the ELCID interface into Crack5; the
date on my code is mid-1994 but i don't know when the bitslicing paper
was conceived.  Either way, I never did anything with it - I got
swamped by what to do with S-boxes - so what the hell...)</I>
</I>
<P>

You may realise now why I got out of the business of binding a
specific crypt() algorithm into Crack as early as possible.
In-between this sort of bit manipulation and/or issues of pipelining,
branch-delay slots, and use/avoidance of bizzare multimedia CPU
instructions to do the hard work for you in hardware, I came to
conclude that hacking crypt() routines was a game for masochists.
<P>


<LI><I>How does the DAWG dictionary-compression algorithm work?</I>
<P>

Essentially it is a preprocessor for <TT>gzip</TT> that removes
redundancy from a sorted list of words, and typically shrinks an input
wordlist by some 50% without negatively impacting <TT>gzip</TT>'s
ability to further compress the file.
<P>

In the new version of the DAWG code - slightly improved over the
version that ships with Crack v5.0, but fundamentally the same -
all you need do is:
<P>

<OL>
<LI> sort the wordlist into normal Unix order.  (beware localization!)
<LI> for each word that the DAWG preprocessor reads...
<LI> count how many leading characters it shares with the previous word that was read...
<LI> encode that number as a character from the set <TT>[0-9A-Za-z]</TT> for values 0..61
     (if the value is >61 then stop there)
<LI> print said character (the encoded number) and the remaining stem of the word
<LI> end-for-loop
</OL>
<P>

eg:
<P>

<TABLE BORDER=1> <!-- cols=1 rows=6 -->
<TR ALIGN=LEFT VALIGN=MIDDLE> <!-- row 1 -->
<TD> <TT>foo</TT> </TD>
</TR>
<TR ALIGN=LEFT VALIGN=MIDDLE> <!-- row 2 -->
<TD> <TT>foot</TT> </TD>
</TR>
<TR ALIGN=LEFT VALIGN=MIDDLE> <!-- row 3 -->
<TD> <TT>footle</TT> </TD>
</TR>
<TR ALIGN=LEFT VALIGN=MIDDLE> <!-- row 4 -->
<TD> <TT>fubar</TT> </TD>
</TR>
<TR ALIGN=LEFT VALIGN=MIDDLE> <!-- row 5 -->
<TD> <TT>fub</TT> </TD>
</TR>
<TR ALIGN=LEFT VALIGN=MIDDLE> <!-- row 6 -->
<TD> <TT>grunt</TT> </TD>
</TR>
</TABLE>
<P>

compresses to:
<P>

<TABLE BORDER=1> <!-- cols=2 rows=7 -->
<TR ALIGN=CENTER VALIGN=MIDDLE> <!-- row 1 -->
<TD ALIGN=LEFT> <TT>#!xdawg</TT> </TD>
<TD> <i>magic header</i> </TD>
</TR>
<TR ALIGN=CENTER VALIGN=MIDDLE> <!-- row 2 -->
<TD ALIGN=LEFT> <TT>0foo</TT> </TD>
<TD> <i>first word has no letters in common with anything</i> </TD>
</TR>
<TR ALIGN=CENTER VALIGN=MIDDLE> <!-- row 3 -->
<TD ALIGN=LEFT> <TT>3t</TT> </TD>
<TD> <i>next has three letters in common, and a 't'</i> </TD>
</TR>
<TR ALIGN=CENTER VALIGN=MIDDLE> <!-- row 4 -->
<TD ALIGN=LEFT> <TT>4le</TT> </TD>
<TD> <i>"foot" + "le"</i> </TD>
</TR>
<TR ALIGN=CENTER VALIGN=MIDDLE> <!-- row 5 -->
<TD ALIGN=LEFT> <TT>1ubar</TT> </TD>
<TD> <i>"f" + "ubar"</i> </TD>
</TR>
<TR ALIGN=CENTER VALIGN=MIDDLE> <!-- row 6 -->
<TD ALIGN=LEFT> <TT>3</TT> </TD>
<TD> <i>"fub" + "" => truncation</i> </TD>
</TR>
<TR ALIGN=CENTER VALIGN=MIDDLE> <!-- row 7 -->
<TD ALIGN=LEFT> <TT>0grunt</TT> </TD>
<TD> <i>back to nothing in common</i> </TD>
</TR>
</TABLE>
<P>

Inspiration for using DAWG in Crack came from Paul Leyland back in the
early 1990s, who mentioned something similar being used to encode
dictionaries for crossword-puzzle solving programs; we continue to be
astonished at how effective DAWG is on sorted inputs without
materially impacting subsequent compression (ie: <TT>gzip</TT>); a
gzipped-DAWG file is <I>also</I> typically about 50% of the size of
the gzipped non-DAWGed file.
<P>

Just goes to prove that knowledge of the sort of input you'll be
dealing with, can beat a general-purpose program hands-down; there are
also interesting conclusions that can be drawn regarding the entropy
of human languages after sorting.
<P>

</UL>
<HR>
<IMG SRC="/cgi-bin/webcount?length=6">
</BODY>
</HTML>