DataMuseum.dk

Presents historical artifacts from the history of:

DKUUG/EUUG Conference tapes

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about DKUUG/EUUG Conference tapes

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download
Index: T r

⟦05d16604b⟧ TextFile

    Length: 30990 (0x790e)
    Types: TextFile
    Names: »readme.txt«

Derivation

└─⟦4f9d7c866⟧ Bits:30007245 EUUGD6: Sikkerheds distributionen
    └─⟦this⟧ »./crack/Docs/readme.txt« 

TextFile










                    "Crack Version 4.1"
            A Sensible Password Checker for Unix


                     Alec D.E. Muffett

                   Unix Software Engineer
                   Aberystwyth, Wales, UK
      (aem@aber.ac.uk or alec_muffett@hicom.lut.ac.uk)


                          ABSTRACT

          Crack is a freely available program  designed
     to   find   standard   Unix   eight-character  DES
     encrypted passwords  by  standard  guessing  tech-
     niques outlined below.  It is written to be flexi-
     ble, configurable and fast, and to be able to make
     use  of  several  networked hosts via the Berkeley
     rsh program (or similar), where possible.



1.  Statement of Intent

This package is meant as a proving device to  aid  the  con-
struction  of  secure  computer systems.  Users of Crack are
advised that they may get severly hassled  by  authoritarian
type sysadmin dudes if they run Crack without proper author-
isation.

2.  Introduction to Version 4.0

Crack is now into it's fourth version, and has been reworked
extensively  to provide extra functionality, and the purpose
of this release is to consolidate as much of this new  func-
tionality into as small a package as possible.  To this end,
Crack may appear to be less configurable: it has been  writ-
ten on the assumption that you run a fairly modern Unix, one
with BSD functionality, and then patched in order to run  on
other systems.

This, surprisingly enough, has led to neater code,  and  has
made  possible the introduction of greater flexibility which
supercedes many of the options that could be  configured  in
earlier  versions  of  Crack.  In the same vein, some of the
older options are now mandatory.  These,  such  as  feedback
mode  and  CRACK_PRINTOUT are no longer supported as options
and probably never will be again.  There is just  a  lot  of
wastage  in not running with them, and too many dependencies
in other functions to bother programming around them.



                       March 3, 1992





                           - 2 -


The user interface is basically identical  to  the  previous
versions,  although  some  people have asked about providing
X-windows GUI's to Crack, I think it would  be  a  waste  of
time to do so. Crack has far less options than your ordinary
version of /bin/ls.

3.  Introduction to Version 4.1

Version 4.1 of the Crack program is an attempt to extend the
features  introduced  in v4.0 and provide hooks for external
libraries such  as  Michael  Glad's  wonderful  UFC  crypt()
implementation,  which (on some platforms) can outperform my
fcrypt() by a factor of 3.  I have also been  burdened  with
the  task of making Crack's memory handling bombproof (hah!)
in the vague hope that it will survive running out of memory
on small machines.[1]

The extensions that I mention above regard the  addition  of
extra primitives to the dictionary processing language which
permit the production of more concise dictionaries  contain-
ing  words,  more  of which are likely to be passwords.  The
idea is to gain efficiency by removing  some  of  the  dross
from the generated dictionaries.

Crack should (generally) be more  disk-space  efficient  now
that  the  program  can  spot  dictionaries  which have been
compressed using compress or pack and will  uncompress  them
on  the  fly  as  necessary  (using  zcat  or  pcat  respec-
tively).[2]

4.  Crack Methodology - Part 1: Internals

Crack takes as its input a  series  of  password  files  and
source  dictionaries.  It merges the dictionaries, turns the
password files into a sorted list, and  generates  lists  of
possible passwords from the merged dictionary or from infor-
mation gleaned about users from the password file.  It  does
_________________________
  [1] - or even on large ones. Brian Tompsett  at  Hull
tweaked  Crack  v3.3  until  it could run to completion
after filling the swapspace on each  of  a  network  of
SparcStation2's.  Due  to restructuring work on v4.0, I
have had to  write  my  own  sorting  algorithm  &  re-
implement  all of his tweaks from scratch, and can only
hope that I have emulated  the  bombproofness  of  this
desirable (?) functionality.
  [2] Note to people who are short on memory  or  swap:
do  remember  that to do this Crack will have to fork()
(via popen()) and might not be able to create  the  un-
compressing  process.  Hence, if you intend to swaplock
your machine, don't compress the  dictionaries.  Switch
this off by editing the Crack shellscript.




                       March 3, 1992





                           - 3 -


not attempt to remedy the problem of allowing users to  have
guessable  passwords,  and it should NOT be used in place of
getting a really good, secure passwd program replacement.[3]

The above paragraphs define the purpose of Crack, and embody
a  great  deal of hard work, screams of Eureka!, drunkeness,
and a fair amount of swearing too.  There is a lot of think-
ing, philosophy, and empirical guesswork behind the way that
Crack attacks password files, and although it  is  not  per-
fect,  I  certainly hope that Crack will out-do most of it's
competitors.

Crack works by making many individual passes over the  pass-
word  entries  that  you  supply to it.  Each pass generates
password guesses based upon a sequence of rules, supplied to
the  program  by  the  user.  The  rules  are specified in a
simplistic   language   in   the   files   gecos.rules   and
dicts.rules, to be found in the Scripts directory.  The dis-
tinction between these two files will be made clear later.

The rules are written as a simple string of characters, with
one  rule  to a line.  Blank lines, and comment lines begin-
ning with a hash character #  are  ignored.   Trailing  whi-
tespace  is  also ignored.  The instructions in the rule are
followed from left to right, and are applied to the diction-
ary  words one by one, as the words are loaded.  Some simple
pattern matching primitives are provided for selection  pur-
poses,  so  that  if  the dictionary word does not match the
pattern, it is ignored.  This  saves  on  time  and  memory.
Before  carrying  on,  I  suggest  that  you  browse through
Scripts/dicts.rules, take a look at the  rules  supplied  as
defaults, and try to work out what they do.

The rules are stored in two different  files  for  two  dif-
ferent  purposes.   Rules in Scripts/gecos.rules are applied
to data generated by Crack from the  pw_gecos  and  pw_gecos
entries  of  the user's password entry.  The data fed to the
gecos rules for the user aem, who  is  Alec  David  Muffett,
Systems  would be: aem, Alec, David, Muffett, Systems, and a
series of permutations of those  words,  either  re-ordering
the  words  and  joining them together (eg: AlecMuffett), or
making up new words based on initial  letters  of  one  word
taken with the rest of another (eg: AMuffett).[4]

The entire set of rules in gecos.rules is applied to each of
_________________________
  [3] See the end of ths document for more  information
about passwd replacements.
  [4] - and ASystems and DSystems, and MSystems, etc...
because  Crack  does  not  differentiate.  Hence,  care
should be taken to check for redundancy when adding new
rules, so as not to waste time during the gecos pass.




                       March 3, 1992





                           - 4 -


these words, which creates many more permutations and combi-
nations,  all  of which are tested.  Hence testing the pass-
word gecos information under Crack v4.0  and  upwards  takes
somewhat   longer  than  previously,  but  it  is  far  more
thorough.


After a pass has been made over  the  data  based  on  gecos
information,  Crack  makes  further passes over the password
data using successive rules from the Scripts/dicts.rules  by
loading  the  whole  of Dicts/bigdict file into memory, with
the rule being applied to each word from  that  file.   This
generates a resident dictionary, which is sorted and uniqued
so as to prevent wasting time on repetition. After each pass
is  completed, the memory used by the resident dictionary is
freed up, and (hopefully) re-used when the  next  dictionary
is loaded.

The Dicts/bigdict dictionary is created by Crack by merging,
sorting,  and uniq'ing the source dictionaries, which are to
be found in the directory DictSrc  and  which  may  also  be
named  in  the Crack shellscript, via the $STDDICT variable.
(The default value of $STDDICT is /usr/dict/words).

The file DictSrc/bad_pws.dat is a dictionary which is  meant
to  provide  many  of  those common but non-dictionary pass-
words, such as 12345678 or qwerty.

If you wish to provide a dictionary of your own,  just  copy
it  into  the  DictSrc  directory (use compress on it if you
wish to save space; Crack will unpack it  whilst  generating
the  big  dictionary)  and  then  delete the contents of the
Dicts directory by running Scripts/spotless.  Your new  dic-
tionary will be merged in on the next run. For more informa-
tion on dictionary attacks, see the excellent  paper  called
"Foiling  the  Cracker:  A  Survey  of, and Improvements to,
Password  Security"  by   Daniel   Klein,   available   from
ftp.sei.cmu.edu  in  ~/pub/dvk/passwd.*.   Also, please read
the APPENDIX file supplied with this distribution.[5]

Having described the method of cracking, perhaps  we  should
now  investigate  the algorithm used to overlay the cracking
mechanism.



_________________________
  [5] Extra dictionaries (those detailed in Dan Klein's
paper)   can   be   obtained  via  anonymous  FTP  from
ftp.uu.net (137.39.1.9) as ~/pub/dictionaries.tar.Z; or
check  an Archie database for other possible sources of
dictionaries.




                       March 3, 1992





                           - 5 -


5.  Crack Methodology - Part 2: Feedback Filters

As is stated above, Crack permutes  and  loads  dictionaries
directly   into  memory,  sorts  and  uniques  them,  before
attempting to use each of the words  as  a  guess  for  each
users'  password.  If Crack correctly guesses a password, it
marks the user as done and does not waste  further  time  on
trying to break that users password.

Once Crack has finished a dictionary  pass,  it  sweeps  the
list  of  users looking for the passwords it has cracked. It
stores the cracked passwords in both plaintext and encrypted
forms in a feedback file in the directory Runtime.  Feedback
files have names of the form Runtime/F*.

The purpose of this is so that, when Crack is next  invoked,
it  may recognise passwords that it has successfully cracked
before, and filter them  from  the  input  to  the  password
cracker.  This  provides  an instant list of crackable users
who have not changed their passwords  since  the  last  time
Crack was run. This list appears in a file with name out* in
the $CRACK_OUT directory, or on stdout, if  foreground  mode
is invoked (see Options, below).

In a similar vein, when a Crack run terminates normally,  it
writes out to the feedback file all encrypted passwords that
it has NOT succeeded in cracking.  Crack  will  then  ignore
all of these passwords next time you run it.

Obviously, this is not desirable if  you  frequently  change
your  dictionaries  or  rules, and so there is a script pro-
vided,  Scripts/mrgfbk  which  sorts  your  feedback  files,
merges  them  into one, and optionally removes all traces of
'uncrackable' passwords, so that your  next  Crack  run  can
have  a  go  at  passwords  it has not succeeded in breaking
before.

Mrgfbk is invoked automatically if you run Scripts/spotless.

6.  Crack Methodology - Part 3: Execution and Networking

Each time Crack is invoked, whether  networked  or  not,  it
generates  a diefile with a name of the form Runtime/D* (for
network cracks, this file is generated by RCrack, and is  of
the  form  Runtime/DR* which points to a real diefile, named
Runtime/RD* - see below for details).

These diefiles contain debugging information about the  job,
and are generated so that all the jobs on the entire network
can be called quickly by invoking Scripts/plaster.  Diefiles
delete themselves after they have been run.

As you will read in the sections below, Crack has a -network
option:   This   is  designed  to  be  a  simple  method  of



                       March 3, 1992





                           - 6 -


automatically spreading the load of  password  cracking  out
over  several  machines on a network, preferably if they are
connected by some form of networked filestore.

When Crack -network is invoked, it filters its input in  the
ordinary  way,  and  then splits its load up amongst several
machines    which    are    specified    in     the     file
Scripts/network.conf.

This file contains a series  of  hostnames,  power  ratings,
flags,  etc,  relevant  to  the  running  of  Crack  on each
machine.  Crack then calls Scripts/RCrack  to  use  the  rsh
command  (or  similar)  to  invoke Crack on the other hosts.
See the RCrack script, and the example network.conf file for
details.

7.  Installation

Crack is one of those most  unusual  of  beasties,  a  self-
installing  program.  Some people have complained about this
apparent weirdness, but it has  grown  up  with  Crack  ever
since  the  earliest  network  version,  when I could not be
bothered to log into several different machines with several
different   architectures,   just  in  order  to  build  the
binaries. Once the necessary configuration options have been
set,  the  executables  are  created via make by running the
Crack shellscript .

Crack's configuration lies in two  files,  the  Crack  shell
script,  which contains all the installation specific confi-
guration data, and the file Sources/conf.h,  which  contains
configuration options specific to various binary platforms.

In  the  Crack  shellscript,  you  will  have  to  edit  the
CRACK_HOME  variable  to  the  correct value.  This variable
should be set to an absolute path name  (names  relative  to
~username  are  OK,  so  long  as you have some sort of csh)
through which the directory containing Crack may be accessed
on  ALL  the  machines that Crack will be run on. There is a
similar  variable  CRACK_OUT  which  specifies  where  Crack
should  put  its output files - by default, this is the same
as $CRACK_HOME.

You will also have to edit the file Sources/conf.h and  work
out which switches to enable.  Each #define has a small note
explaining its purpose.  Where I have been  in  doubt  about
the portability of certain library functions, usually I have
re-written it, so you should be OK.  Let  me  know  of  your
problems, if you have any.

If you will be using Crack -network you will  then  have  to
generate  a  Scripts/network.conf file. This contains a list
of hostnames to rsh to, what their binary  type  is  (useful
when   running   a   network   Crack  on  several  different



                       March 3, 1992





                           - 7 -


architectures), a guesstimate of their relative power  (take
your  slowest machine as unary, and measure all others rela-
tive to it), and a list of per-host flags to  add  to  those
specified on the Crack command line, when calling that host.
There is an example of such a file provided in  the  Scripts
directory - take a look at it.

If ever you wish to specify a more precise figure as to  the
relative  power  of  your  machines,  or you are simply at a
loss, play with the command make tests in  the  source  code
directory.    This  can  provide  you  with  the  number  of
fcrypt()s that your machine can do per second,  which  is  a
number that you can plug into your network.conf as a measure
of your machines' power (after  rounding  the  value  to  an
integer).

8.  Usage

Okay, so, let's assume  that  you  have  edited  your  Crack
script,  and  your Sources/conf.h file, where do you go from
here ?


Crack [options] [bindir] /etc/passwd [...other passwd files]

Crack -network [options] /etc/passwd [...other passwd files]


Where bindir is the optional name of the directory where you
want  the binaries installed.  This is useful where you want
to be able to run versions of  Crack  on  several  different
architectures.  If  bindir does not exist, a warning will be
issued, and the directory created.

     Note: bindir defaults to the name generic  if  not
     supplied.


Notes for  Yellow  Pages  (NIS)  Users:  I  have  occasional
queries  about  how  to get Crack running from a YP password
file.  There are several methods, but by far the simplest is
to generate a passwd format file by running:-

                  ypcat passwd > passwd.yp

and then running Crack on this file.

9.  Options

-f   Runs Crack in foreground mode, ie: the password cracker
     is  not backgrounded, and messages appear on stdout and
     stderr as you would expect.  This option is only really
     useful  for very small password files, or when you want
     to put a wrapper script around Crack.



                       March 3, 1992





                           - 8 -


     Foreground mode is disabled if you  try  running  Crack
     -network  -f on the command line, because of the insen-
     sibility of rshing to several machines in turn, waiting
     for  each  one  to finish before calling the next. How-
     ever, please read the section  about  Network  Cracking
     without NFS/RFS, below.

-v   Sets verbose mode, whereby Crack will print every guess
     it is trying on a per-user basis.  This is a very quick
     way of flooding your filestore, but useful if you think
     something is going wrong.

-m   Sends mail to any user  whose  password  you  crack  by
     invoking  Scripts/nastygram  with  their username as an
     argument.  The reason for using the script is so that a
     degree of flexibility in the format of the mail message
     is supplied; ie: you don't have to  recompile  code  in
     order to change the message.[6]

-nvalue
     Sets the process to be nice()ed to value, so, for exam-
     ple,  the  switch -n19 sets the Crack process to run at
     the lowest priority.

-network
     Throws Crack into network mode, in which it  reads  the
     Scripts/network.conf file, splits its input into chunks
     which are sized according to the power  of  the  target
     machine,  and  calls  rsh to run Crack on that machine.
     Options for Crack running on the target machine may  be
     supplied  on  the  command line (eg: verbose or recover
     mode), or in the network.conf file if they  pertain  to
     specific hosts (eg: nice() values).

-r<pointfile>
     This is only for use  when  running  in  recover  mode.
     When  a  running  Crack  starts pass 2, it periodically
     saves its state in a pointfile, with a name of the form
     Runtime/P.*  This file can be used to recover where you
     were should a  host  crash.   Simply  invoke  Crack  in
     exactly  the  same  manner  as  the last time, with the
     addition of the -r switch,  (eg:  -rRuntime/Pfred12345)
_________________________
  [6] I'm uncertain about the wisdom of mailing someone
like this.  If someone browses your cracked user's mail
somehow, it's like a great big neon  sign  pointing  at
the  user  saying "This Is A Crackable Account - Go For
It!".  Not to mention the false sense  of  security  it
engenders  in  the  System Manager that he's "informed"
the user to change his  password.   What  if  the  user
doesn't  log  on  for 3 months? However, so many people
have wired it into their own versions of Crack, I  sup-
pose it must be provided... AEM
<1b>9


                       March 3, 1992





                           - 9 -


     switch.  Crack will startup and read the file, and jump
     to  roughly  where  it left off.  If you are cracking a
     very large password file, this can save oodles of  time
     after a crash.

     If you were running a network Crack, then the jobs will
     again  be spawned onto all the machines of the original
     Crack.  The program will then check that the host it is
     running   on  is  the  same  as  is  mentioned  in  the
     pointfile.  If it is not, it will quietly  die.   Thus,
     assuming that you supply the same input data and do not
     change your network.conf file,  Crack  should  pick  up
     where  it  left off.  This is a bit inelegant, but it's
     better than nothing at the moment.

     The method of  error  recovery  outlined  above  causes
     headaches  for  users who want to do multiprocessing on
     parallel architectures.  Crack is in no  way  parallel,
     and  because  of the way it's structured (reading stdin
     from shellscript frontends) it is a pain to divide  the
     work amongst several processes via fork()ing.

     The hack solution to get several copies of  Crack  run-
     ning  on one machine with n processors at the moment is
     to insert n copies  of  the  entry  for  your  parallel
     machine  into the Scripts/network.conf file. If you use
     the -r option in these circumstances however, you  will
     get n copies of the recovered process running, only one
     of them will have the correct input data.

     The old solution to this problem (see old documentation
     if  you  are interested) has been negated by the intro-
     duction of feedback mode, so the best bet in this  par-
     ticular  situation  is to wait until the other jobs are
     done (and have written out lists of  uncrackable  pass-
     words),  and then re-start the jobs from scratch.  Any-
     one whose password was not cracked  on  the  first  run
     will be ignored on the second, if they have not changed
     it since.  This is inelegant, but it's the best  I  can
     do in the limited time available.

10.  Support Scripts

The Scripts directory contains a small number of support and
utility  scripts,  some  of which are designed to help Crack
users check their progress.  Briefly, the most  useful  ones
are:-

Scripts/shadmrg
     This is a small (but  hopefully  readable)  script  for
     merging  /etc/passwd  and /etc/shadow on System V style
     shadow password systems.  It produces the  merged  data
     to stdout, and will need redirecting into a file before
     Crack can work on it.  The script is meant to be fairly



                       March 3, 1992





                           - 10 -


     lucid,  on the grounds that I worry that there are many
     shadowing schemes out there, and perhaps not  all  have
     the same data format.

     I have not wired this facility into the  Crack  command
     itself because the world does NOT revolve around System
     V yet, regardless of what some  people  would  have  me
     believe,  and I believe that the lack of direct support
     for NIS outlined above, sets a  precedent.   There  are
     just  too  many  incompatibilities  in  shadow password
     schemes for me to hardwire anything.

Scripts/plaster
     which is named after a dumb joke, but is a simple fron-
     tend  to  the Runtime/D* diefiles that each copy of the
     password cracker  generates.  Invoking  Scripts/plaster
     will  kill  off  all copies of the password cracker you
     are running, over the network or otherwise.

Scripts/status
     This script rshes to  each  machine  mentioned  in  the
     Scripts/network.conf  file,  and provides some informa-
     tion about processes and uptime on that machine.   This
     is  useful when you want to find out just how well your
     password crackers are getting on during a  Crack  -net-
     work.

Scripts/{clean,spotless}
     These are really just frontends to a makefile. Invoking
     Scripts/clean  tidies  up the Crack home directory, and
     removes probably unwanted files, but  leaves  the  pre-
     processed  dictionary bigdict intact.  Scripts/spotless
     does the same as Scripts/clean but obliterates  bigdict
     and  old  output files too, and compresses the feedback
     files into one.

Scripts/nastygram
     This is the shellscript that is invoked by the password
     cracker  to send mail to users who have guessable pass-
     words, if the -m option is used. Edit it at  your  lei-
     sure to suit your system.

Scripts/guess2fbk
     This script takes your  out*  files  as  arguments  and
     reformats  the  'Guessed'  lines  into a slightly messy
     feedback file, suitable for storing with the others.

     An occasion where this might be  useful  is  when  your
     cracker  has  guessed  many peoples passwords, and then
     died for some reason (a crash?) before writing out  the
     guesses to a feedback file.  Running

             Scripts/guess2fbk out* >> Runtime/F.new




                       March 3, 1992





                           - 11 -


     will save the work that has been done.

11.  Network Cracking without NFS/RFS

For those users who have some form of rsh  command,  but  do
not  have  a  a  networked  filestore running between hosts,
there is now a solution which will allow you to do networked
cracking, proposed to me by Brian Tompsett at Hull.  Person-
ally, I consider the idea to be potty, but it fills in miss-
ing functionality in a wonderfully tacky manner.

From the documentation above, you will note that Crack  will
undo  the -f (output in foreground) option, if it is invoked
with the -network switch at the same time (see  the  Options
section  above).  This is true, but it does not apply if you
specify -f option in the network.conf file.

The practical upshot of doing this is that remote copies  of
Crack  can  be  made  to read from stdin and write to stdout
over a network link, and thus remote  processing  is  accom-
plished.   I  have  tweaked  Crack in such a way, therefore,
that if the -f option is specified amongst  the  crack-flags
of  a  host  in  the network.conf, rather than backgrounding
itself on the remote host, the rsh command on the server  is
backgrounded, and output is written directly to the files on
the server's filestore.

There are restrictions upon this  method,  mostly  involving
the number of processes that a user may run on the server at
any one time, and that you will  have  to  collect  feedback
output  together  manually  (dropping  it  into  the Runtime
directory on the server).  However, it works. Also,  if  you
try  to use rsh as another user, you will suffer problems if
rsh insists on reading something from your terminal  (eg:  a
password  for  the  remote account).  Also, recovering using
checkpointing goes out the window  unless  you  specify  the
name of the pointfile as it is named on the remote machine.

12.  UFC Support and notes on fast crypt() implementations

The stdlib version of the crypt() subroutine  is  incredibly
slow.   It is a massive bottleneck to the execution of Crack
and on typical platforms that you get at universities, it is
rare to find a machine which will achieve more than 50 stan-
dard crypt() s per second.   On  low-end  diskless  worksta-
tions,  you may expect 2 or 3 per second.  It was this slow-
ness of the crypt() algorithm which originally supplied much
of the security Unix needed.[7]

_________________________
  [7] See: "Password Security, A Case History"  by  Bob
Morris & Ken Thomson, in the Unix Programmer Docs.




                       March 3, 1992





                           - 12 -


There are now many implementations  of  faster  versions  of
crypt()  to  be found on the network.  The one supplied with
Crack v3.2 and upwards is called fcrypt().   It  was  origi-
nally written in May 1986 by Robert Baldwin at MIT, and is a
good version of the crypt() subroutine.  I received  a  copy
from Icarus Sparry at Bath University, who had made a couple
of portability enhancements to the code.

I rewrote most of the tables and the KeySchedule  generating
algorithm  in  the original fdes-init.c to knock 40% off the
execution overhead of fcrypt()  in  the  form  that  it  was
shipped  to  me.   I inlined a bunch of stuff, put it into a
single file, got  some  advice  from  Matt  Bishop  and  Bob
Baldwin  [both  of whom I am greatly indebted to] about what
to do to the xform() routine  and  to  the  fcrypt  function
itself,  and  tidied  up some algorithms.  I have also added
more lookup tables and reduced several  formula  for  faster
use.   Fcrypt() is now barely recognisable as being based on
its former incarnation, and it is 3x faster.

On a DecStation 5000/200, fcrypt() is about 16 times  faster
than  the  standard  crypt (your mileage may vary with other
architectures and compilers).  This speed puts fcrypt() into
the "moderately fast" league of crypt implementations.

Amongst other crypt  implementations  available  is  UFC  by
Michael  Glad.   UFC-crypt is a version of the crypt subrou-
tine which  is  optimised  for  machines  with  32-bit  long
integers  and  generally outperforms my fcrypt() by a factor
of between 1 and 3, for a tradeoff of  large  memory  usage,
and memory-cache unfriendliness.  Hooks for even more optim-
ised assembler versions of crypt()  are  also  provided  for
some  platforms  (Sun,  HP, ...).  Getting UFC to work on 16
bit architectures is nearly impossible.

However, on most architectures,  UFC  generates  a  stunning
increase  in  the power of Crack, and so, from v4.1 onwards,
Crack is written to automatically make use of UFC if it  can
find  it.   All  that you have to do is to obtain a suitable
copy of UFC (preferably a version which mentions that it  is
compatible  with  Crack v4.1, and unpack it into a directory
called ufc-crypt in $CRACK_HOME, and then  delete  your  old
binaries.   UFC  will then be detected, compiled, tested and
used in preference to fcrypt() by the Crack  program,  wher-
ever possible.

13.  Conclusions

What can be done about brute force attacks on your  password
file ?

You must get  a  drop-in  replacement  for  the  passwd  and
yppasswd  commands; one which will stop people from choosing
bad  passwords  in  the  first  place.   There  are  several



                       March 3, 1992





                           - 13 -


programs  to  do  this;  Matt  Bishop's  passwd+  and  Clyde
Hoover's npasswd program are good examples which are  freely
available.   Consult  an Archie database for more details on
where you can get them from.

It would be nice if an organisation (such as CERT?) could be
persuaded  to  supply  skeletons of sensible passwd commands
for the public good, as  well  as  an  archive  of  security
related utilities[8] on top of the excellent COPS.  However,
for Unix security to improve on a global scale, we will also
require pressure on the vendors, so that programs are  writ-
ten correctly from the beginning.





































_________________________
  [8] COPS  is  available  for   anonymous   FTP   from
cert.sei.cmu.edu (128.237.253.5) in ~/cops




                       March 3, 1992