home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / unix / volume21 / cops / part05 < prev    next >
Encoding:
Internet Message Format  |  1990-03-21  |  21.2 KB

  1. Subject:  v21i027:  System ecurity analysis tool, Part05/05
  2. Newsgroups: comp.sources.unix
  3. Approved: rsalz@uunet.UU.NET
  4. X-Checksum-Snefru: ac9f5dab 17871498 6a1c8ba3 863825fe
  5.  
  6. Submitted-by: Dan Farmer <df@sei.cmu.edu>
  7. Posting-number: Volume 21, Issue 27
  8. Archive-name: cops/part05
  9.  
  10. #    This is a shell archive.
  11. #    Remove everything above and including the cut line.
  12. #    Then run the rest of the file through sh.
  13. #----cut here-----cut here-----cut here-----cut here----#
  14. #!/bin/sh
  15. mkdir cops 2>/dev/null
  16. mkdir cops/docs 2>/dev/null
  17. mkdir cops/src 2>/dev/null
  18. mkdir cops/extensions 2>/dev/null
  19. # shar:    Shell Archiver
  20. #    Run the following text with /bin/sh to create:
  21. #    cops/docs/pass
  22. #    cops/docs/passwd
  23. #    cops/docs/rc
  24. #    cops/docs/release.notes
  25. #    cops/docs/root
  26. #    cops/docs/suid.man
  27. #    cops/docs/tilde
  28. #    cops/docs/user
  29. #    cops/docs/warnings
  30. # This archive created: Tue Jan 30 23:27:14 1990
  31. # By:    dan (Purdue University)
  32. echo shar: extracting cops/docs/pass '(1289 characters)'
  33. cat << \SHAR_EOF > cops/docs/pass
  34. .TH PASS.CHK 1 "December 31, 1989"
  35. .UC 4
  36. .SH NAME
  37. pass.chk  \- Checks critical files for writability.
  38. .SH SYNOPSIS
  39. .B pass.chk
  40. [
  41. options
  42. ]
  43. .SH DESCRIPTION
  44. By default
  45. .I pass.chk
  46. only checks for accounts with passwords the same
  47. as the login name. The following options add more extensive checking. (The
  48. tradeoff is cpu time -- with all options enabled it can run into the 100's
  49. of MINUTES.) Any argument that does not begin with a "-" is assumed to be
  50. a file name. (A single '-' means stdin.) If no file name is given, /etc/passwd
  51. is used.
  52. .PP
  53. Options are:
  54. .TP
  55. .B \-v
  56. verbose -- list all guesses on stdout
  57. .TP
  58. .B \-u
  59. output the username on the line of the password file
  60. currently being checked. If the program stops
  61. abruptly you will then know how far it got.
  62. .TP
  63. .B \-w file
  64. use the list of words contained in "file" as likely
  65. passwords. Words in the file are one to a line.
  66. .TP
  67. .B \-b
  68. check all guesses backwards too
  69. .TP
  70. .B \-g
  71. use the Full Name portion of the gecos field to
  72. generate more guesses
  73. .TP
  74. .B \-s
  75. check the single letters a-z, A-Z, 0-9 as passwords
  76. .TP
  77. .B \-c
  78. with each guess, check for all lower case and
  79. all upper case versions too.
  80. .TP
  81. .B \-n
  82. complain about null passwords (default is to keep quiet)
  83. .TP
  84. .B \-p
  85. print the password when guessed
  86. .SH FILES
  87. .Ps
  88. /etc/passwd
  89. .Pe
  90. SHAR_EOF
  91. echo shar: extracting cops/docs/passwd '(781 characters)'
  92. cat << \SHAR_EOF > cops/docs/passwd
  93. .TH PASSWD.CHK 1 "December 31, 1989"
  94. .UC 4
  95. .SH NAME
  96. passwd.chk  \- Checks password file(s) for inconsistencies.
  97. .SH SYNOPSIS
  98. .B passwd.chk
  99. .SH DESCRIPTION
  100. .I passwd.chk
  101. checks the password files -- /etc/passwd and yppasswd if yellow pages are being
  102. used -- for incorrect number of fields, duplicate ids, non-alphanumeric
  103. login names, nonnumeric user ids', users with uid = 0 and not root, blank lines,
  104. accounts with no passwords, invalid login directories, and non-numeric password id's. 
  105. .SH FILES
  106. .Ps
  107. /etc/passwd
  108. passwd.chk uses the process id as a temporary file name for the ypchecking.
  109. .Pe
  110. .SH "SEE ALSO"
  111. .Ps
  112. passwd(5)
  113. .Pe
  114. Awk part based on _password_ from _The AWK Programming Language_, page 78.
  115. .SH BUGS
  116. It doesn't use the exact syntax of yellow pages to check for errors.
  117. SHAR_EOF
  118. echo shar: extracting cops/docs/rc '(775 characters)'
  119. cat << \SHAR_EOF > cops/docs/rc
  120. .TH RC.CHK 1 "December 31, 1989"
  121. .UC 4
  122. .SH NAME
  123. rc.chk  \- Checks contents of /etc/rc* file(s) for potential danger.
  124. .SH SYNOPSIS
  125. .B rc.chk
  126. .SH DESCRIPTION
  127. .I rc.chk
  128. This checks pathnames and files inside the shell script files /etc/rc*
  129. (e.g. /etc/rc, /etc/rc.local, etc.) for writability.
  130. It filters out all paths or files that have a /tmp, /dev/null,
  131. or /dev/*ty, plus everything after a ">"; e.g. if crontab is writing
  132. to a file it doesn't care.
  133. .SH FILES
  134. /etc/rc*
  135. .SH BUGS
  136. Awk runs out of room ("bails out") if too many files are found in the
  137. /etc/rc* files.
  138. .PP
  139. Spurious messages can occur --
  140. .I rc.chk
  141. only uses a approximation of which files should be checked.  Also, 
  142. Unless a file has a full pathname (i.e. begins with a "/", it will
  143. not be checked for writability.
  144. SHAR_EOF
  145. echo shar: extracting cops/docs/release.notes '(3580 characters)'
  146. cat << \SHAR_EOF > cops/docs/release.notes
  147.  
  148.   Brief Info-Capsule of COPS programs and files (release 1.0):
  149. -------------------------------------------------------------------------
  150.    Programs and some important files that are included in this release:
  151. -------------------------------------------------------------------------
  152.  
  153.    cops            A driving shell script for most of the programs
  154.             below.  It tosses output to /dev/null except
  155.             what it wants, and mails any pertinent output
  156.             to the users $SECURE_USER listed in the COPS file.
  157.             Usage: cops
  158.  
  159.    suid.chk        Checks the system for _changes_ in SUID status.
  160.             This is the one program that should be run as
  161.             superuser.  You must first run a find on all
  162.             SUID programs from the / directory, and then use
  163.             that as a "stop file" (see man page below.)
  164.    suid.man        Manual for COPS.suid
  165.    findsuid.stop    The database originally set up with "find".
  166.             Usage: suid.chk
  167.  
  168.  
  169.    makefile        A makefile for programs enclosed.
  170.             Type "make" to make 'em (see Makefile for more
  171.             information.)
  172.  
  173.    chk_strings        Checks for writable paths/files in a file.
  174.             Usage: chk_strings <file>
  175.  
  176.    cron.chk        Checks for writable paths/files in /usr/lib/crontab.
  177.             Usage: cron.chk
  178.  
  179.    dev.chk        Checks /dev/*mem and all devs listed by "/etc/fstab"
  180.                command for world read/writability (respectively.)
  181.             In addition, checks a small group of files for
  182.             non-world readability (/usr/adm/sulog, etc.)
  183.             Usage: dev.chk [-g]
  184.             (-g checks for group read/writability as well)
  185.  
  186.    dir.chk        Checks directories listed in "dirs.chklst"
  187.             for writability.
  188.    dir.chklst        List of directories for above.
  189.             Usage: dir.chk [-g]
  190.             (-g checks for group writability as well)
  191.  
  192.    file.chk        Checks files listed in "files.chklst"
  193.             for writability.
  194.    file.chklst        List of directories for above.
  195.             Usage: file.chk [-g]
  196.             (-g checks for group writability as well)
  197.  
  198.    group.chk        Checks /etc/group for non-unique groups, invalid
  199.             fields, non-numeric group ids, etc.
  200.             Usage: group.chk
  201.  
  202.    home.chk.c        Checks all users home-dirs listed in /etc/passwd
  203.             for bad modes (basically world write, strangeness).
  204.             Usage: home.chk
  205.  
  206.    rc.chk        Checks all commands and paths listed in /etc/rc*
  207.             for writability.
  208.             Usage: rc.chk
  209.  
  210.    reconfig        Changes the paths for the programs used in COPS.
  211.             Example: changes /bin/awk --> /usr/bin/awk
  212.    file.paths        Data file for reconfig (created by reconfig.)
  213.             Usage: reconfig
  214.  
  215.    is_readable        Checks a file/directory and determines readability
  216.             status; returns a "0" if is readable, a "1"
  217.             otherwise.
  218.             Usage: is_readable [-g] filename
  219.    
  220.    is_writable        Checks a file/directory and determines writability
  221.             status; returns a "0" if is writable, a "1"
  222.             otherwise.
  223.             Usage: is_writable [-g] filename
  224.    
  225.    kuang        The U-Kuang expert system.  Read the accompanying
  226.             instructions in kuang.man.  It basically checks
  227.             to see if a given user (by default root) is
  228.             compromisible, given that certain rules are true
  229.             (i.e. /etc/passwd writable gives root access, etc.)
  230.             Usage: kuang
  231.    init_kuang        Contains the targets for the kuang system.
  232.  
  233.    passwd.chk        Checks /etc/passwd for non-unique uids, invalid
  234.             fields, non-numeric user ids, etc.
  235.             Usage: passwd.chk
  236.  
  237.    pass.chk        Checks /etc/passwd for crummy passwords.
  238.    pass.words        Data file for pass.chk; use "pass -w pass.words"
  239.                to use them. Defaults to checking for the users' id.
  240.             Usage: pass.chk [-flags]
  241.  
  242.    user_chk.c        Checks all users listed in /etc/passwd; looks at
  243.             .login/.cshrc/.rhosts/.profile, etc., for bad 
  244.             modes (basically world write, strangeness).
  245.             Usage: user_chk
  246.  
  247. SHAR_EOF
  248. echo shar: extracting cops/docs/root '(414 characters)'
  249. cat << \SHAR_EOF > cops/docs/root
  250. .TH ROOT.CHK 1 "December 31, 1989"
  251. .UC 4
  252. .SH NAME
  253. root.chk  \- Checks contents of root owned startup files as well as
  254. a variety of miscellaneous potential dangers.
  255. .SH SYNOPSIS
  256. .B root.chk
  257. .SH DESCRIPTION
  258. .I root.chk
  259. This checks the paths inside root's startup files for the current directory
  260. being used as a valid path and for improper umask settings (world writable).
  261. .SH FILES
  262. .Ps
  263. /.login
  264. /.cshrc
  265. /.profile
  266. .Pe
  267. SHAR_EOF
  268. echo shar: extracting cops/docs/suid.man '(1065 characters)'
  269. cat << \SHAR_EOF > cops/docs/suid.man
  270. findsuid \- find changes in setuid and setgid files
  271. .sp
  272. SYNOPSIS
  273. .sp
  274. .ul
  275. findsuid
  276. .sp
  277. DESCRIPTION
  278. .PP
  279. Findsuid is a shell script intended to be run periodically by
  280. .ul
  281. cron (8)
  282. in order to spot changes in files with the suid or sgid bits set.
  283. .PP
  284. .ul
  285. Findsuid
  286. uses 
  287. .ul
  288. find (1)
  289. to search system directories for all files with the 4000 or 2000 permission
  290. bits set.  It then compares these files with the contents of a ``stop file''
  291. containing
  292. .ul
  293. \*Qls -lga\*U
  294. output for known setuid or setgid programs.
  295. Any additions or changes to this list represent potential security
  296. problems, so they are reported by mail to system administrators for further
  297. investigation.
  298. .sp
  299. FILES
  300. .sp
  301. .nf
  302. /usr/adm/findsuid.stop    the ``stop file''
  303. .fi
  304. .sp
  305. SEE ALSO
  306. .sp
  307. find(1), chmod(1), cron(8)
  308. .sp
  309. BUGS
  310. .sp
  311. The location of the stop file, the directories to be searched and the
  312. names of users to be informed of changes are all defined by shell variables
  313. in the source.
  314. .PP
  315. Keeping the stop files up to date with changes to all
  316. the suid files on more than a couple of hosts is a royal pain!
  317. SHAR_EOF
  318. echo shar: extracting cops/docs/tilde '(230 characters)'
  319. cat << \SHAR_EOF > cops/docs/tilde
  320. .TH TILDE 1 "December 31, 1989"
  321. .UC 4
  322. .SH NAME
  323. tilde  \- returns a user's home directory.
  324. .SH SYNOPSIS
  325. .B tilde 
  326. user
  327. .SH DESCRIPTION
  328. This merely prints a user's home directory, or "Error" if not found.
  329. Named for the Csh feature.
  330. SHAR_EOF
  331. echo shar: extracting cops/docs/user '(461 characters)'
  332. cat << \SHAR_EOF > cops/docs/user
  333. .TH USER.CHK 1 "December 31, 1989"
  334. .UC 4
  335. .SH NAME
  336. user.chk  \- Checks key files in user home directories for world writability.
  337. .SH SYNOPSIS
  338. .B user.chk
  339. .SH DESCRIPTION
  340. This checks the following files in all of the user home directories
  341. (it calls getpwent() to get user directories) for world writability:
  342. .Ps
  343. .rhost     .profile     .login
  344. .cshrc     .bashrc      .kshrc
  345. .tcshrc    .rhost       .netrc
  346. .forward   .dbxinit     .distfile
  347. .exrc      .emacsrc
  348. .Pe
  349. SHAR_EOF
  350. echo shar: extracting cops/docs/warnings '(10292 characters)'
  351. cat << \SHAR_EOF > cops/docs/warnings
  352.  
  353.    This file contains a list of most of the security warnings that you
  354. might see while using the COPS system.  Not included here are messages
  355. that you may receive from the Kuang system and the SUID checker.  For
  356. help on using those tools, read the appropriate documentation on each
  357. of those ("kuang.doc and suid.doc".)
  358.    First, I'll define some arbitrary terms which I'll use when describing
  359. any problems you may encounter, then I'll list the messages, what they may
  360. mean, and how you can change your system to eliminate any danger posed.
  361. Some almost identical warnings were eliminated from the list; however
  362. most warnings should have an analogous entry that is very close syntactically
  363. to it in this file.  All messages in COPS are prepended by "Warning!";
  364. this has been excluded here for brevity.
  365.    There may be more than one way to overcome any problem listed here.  If
  366. you are unsure about whether to change a problem, try looking at some of
  367. the references listed at the end of the technical report (cops.report) for
  368. more information on how an attacker may compromise your system.  Some of
  369. the more dangerous security holes include writable directories and key files
  370. (such as /etc/passwd), root owned SUID files writable to world or that give
  371. a root shell, null passwords, and writable files that are executed by root.
  372.    Don't take everything that COPS says as gospel!  What may be a serious
  373. security hole on one machine may not be on your own, and vice-versa.
  374. However, the more you value the information on your machine, the more you
  375. should be concerned about security. 
  376.  
  377.   Some terms I'll use:
  378. xyz           -- An arbitrary number.  Usually a line number in a file.
  379. foo_file      -- stands for a file you might see in your warning message.
  380. foo_file2     -- Same as "foo_file", stands for a different file than the
  381.                  first (used when two filenames are needed in one message.)
  382. foo_dir       -- a typical directory.
  383. Group file    -- /etc/group or the yellow pages group.  If the warning starts
  384.                  with "Group", it is the former, "YGroup" is the latter.
  385. foo_group     -- either /etc/group or ygroup.
  386. Password file -- /etc/passwd or the yellow pages password.  If the warning
  387.                  starts with "Password", it is the former, "YPassword" refers
  388.                  to the latter.
  389. foo_pass      -- either /etc/passwd or ypasswd.
  390. cron_file     -- will be either /usr/cron or
  391.                  /usr/spool/cron/crontabs/foo_file.  
  392. foo           -- anything that doesn't fit above.  Usually an arbitrary
  393.                  name, or group name, or whatever.
  394. bar           -- As "foo", if more than one name is needed in one message.
  395. foo_bar       -- As "foo", if more than two names are needed in one message.
  396.  
  397.  
  398.   WARNING MESSAGES
  399.   -----------------
  400.  
  401. 1)
  402. foo_file is _World_ writable!
  403. foo_file is group readable!
  404.  
  405.    This simply means that a file is world writable; e.g. Anyone can modify
  406. or delete this file.  This can be especially bad if the file can (even
  407. indirectly) give root access, such as the system password file, "/etc/passwd".
  408.    To fix, type:
  409.         chmod a-w foo_file
  410. This removes write access for group "all/world".
  411.  
  412. 2)
  413. foo_file (in cron_file) is World writable!"
  414. File foo_file (inside root executed file foo_file2) is _World_ writable!"
  415. File foo_file (in /etc/rc*) is _World_ writable!"
  416.  
  417.    Similar to the above messages, but potentially more serious.  Files
  418. in this group are being used by root, and either being utilized as input,
  419. output, or for execution.  Examine the file they are inside and see how
  420. it is being used.  Files being executed are the most dangerous because
  421. if they are changed, the new file gets executed with root privileges.  Input
  422. files are next, because changing them can alter what the executing program
  423. does and cause undesirable side affects.  Even output files can be dangerous,
  424. however, because they may be used as an output or even as a program file
  425. later on.
  426.    To fix, either delete the reference to foo_file inside the
  427. cron/rc*/foo_file2/whatever file, or type:
  428.         chmod a-w foo_file
  429. to remove write access for group "all/world".
  430.  
  431. 3)
  432. Directory foo_dir is _World_ writable!
  433.  
  434.    This simply means that a directory is world writable; e.g. Anyone can
  435. delete this directory, as well as mess with the files and subdirectories
  436. inside of it.  For instance, if /usr/spool is world writable, even if cron
  437. is not writable, this is a problem, because the cron directory can be
  438. replaced and new crontab files put in (which all run with root privileges.)
  439. As a general rule, if you wish to have a file or directory secure, all
  440. directories that are parent directories must be secure.
  441.    To fix, type:
  442.         chmod a-w foo_dir
  443. This removes write access for group "all/world".
  444.  
  445. 4)
  446. Duplicate Group(s) found in foo_group:"
  447.  
  448.    This means that one or more duplicate group names have been found.
  449. This is mostly a system accounting problem; when adding or deleting names
  450. from a group you will have problems.
  451.    To fix, remove all but one instance of each group in your /etc/group file.
  452.  
  453. 5)
  454. Group foo_bar has duplicate user(s):"
  455.  
  456.    Similar to (4), a group has the same user listed more than once.  If
  457. all instances of the user is not deleted, they probably will remain with
  458. their old privileges.
  459.    To fix, remove all but one instance of a user in each group of your
  460. /etc/group file.
  461.  
  462. 6)
  463. Group file, line xyz, non-numeric group id: foo
  464.  
  465.    Group id's must be numeric.  Testing a non-numeric id will give 
  466. unpredictable results.
  467.    To fix, change the old id to a valid group id.
  468.  
  469. 7)
  470. Group file, line xyz, is blank
  471.  
  472.    To fix, remove all blank lines.
  473.  
  474. 8)
  475. Group file, line xyz, does not have 4 fields: foo
  476.  
  477.    More trouble.  Testing of one or more of the groups will result
  478. in invalid results, depending which is the missing field(s).
  479.    To fix, ensure group has four valid fields. 
  480.  
  481. 9)
  482. Group file, line xyz, nonalphanumeric user id: foo
  483.    
  484.    As (6).
  485.    To fix, change the old id to a valid group id.
  486.  
  487. 10)
  488. Group file, line xyz, group has password: foo
  489.  
  490.    To fix, change the old password to an asterisk ("*").
  491.  
  492. 11)
  493. Password Problem: Guessed:    foo    shell: bar    passwd: foo_bar
  494.  
  495.    If an account has a guessed password, it is susceptible to other password
  496. guessing programs (the one in COPS is rather crude and slow).  Obviously, if
  497. the password is known, the account is compromised.
  498.    To fix, either have the user change her/his password or change it yourself.
  499.  
  500. 12)
  501. Password Problem: null passwd:    foo    shell: bar
  502. Password file, line xyz, no password:     foo
  503.  
  504.    If an account has no password, anyone can log into the account at will.
  505.    To fix, either have the user change her/his password or change it yourself.
  506.  
  507. 13)
  508. Duplicate uid(s) found in foo_passwd:"
  509.  
  510.    This is a problem, especially if the accounts have different permissions
  511. or privileges.  When the user's account is deleted, one or more accounts may
  512. remain active.
  513.    To fix, simply delete all but one occurrence of the users account.
  514.  
  515. 14)
  516. Password file, line xyz, user foo has uid = 0 and is not root    bar
  517.    
  518.    Ideally, no one but root should have uid = 0.  Anyone with uid=0 is
  519. superuser, for all purposes.  Occasionally, a maintenance account has
  520. uid=0, or perhaps a small group of administrators.  Be very careful!
  521.    To fix, change the uid from 0 to some other valid number.  If the
  522. account or person really needs root privileges, have them use the root
  523. account so you can keep track of who is using root.
  524.  
  525. 15)
  526. Password file, line xyz, nonalphanumeric login:     foo
  527.  
  528.    Another maintenance problem.  Someone's been messing with the password
  529. file, or you have some bugs in your software that fools around with it.
  530.    To fix, delete or change the login to a valid login.
  531.  
  532. 16)
  533. Password file, line xyz, invalid login directory:     foo
  534. User foo's home directory bar is not a directory!
  535.  
  536.    A user has a non-existent or invalid login directory listed in the password
  537. file.  Sometimes these are maintenance accounts, but it is discouraged.
  538. Examine the account to see if it should really exist.
  539.    To fix, either delete the account or put in a valid login directory.
  540.  
  541. 17)
  542. Password file, line xyz, nonnumeric group id:     foo
  543. Password file, line xyz, nonnumeric user id:     foo
  544.  
  545.    A user has a invalid user or group id.  Dangerous if, when checked, it
  546. translates to invalid number (who knows what would happen), or worse yet, 0.  
  547.    To fix, change the field to a legal, numeric value.
  548.  
  549. 18)
  550. Password file, line xyz, does not have 7 fields:     foo
  551.    Dangerous, because when a program checks for a field value it will come
  552. up with who knows what.
  553.    To fix, ensure all fields have legal values.
  554.  
  555. 19)
  556. Password file, line xyz, is blank
  557.    To fix, delete all blank lines.
  558.  
  559. 20)
  560. NFS file system foo exported with no restrictions.
  561.    Anyone can mount the file system.  May or may not be a problem, but
  562. look over closely, if you value ANY of the info on it!
  563.    To fix, put in a valid list of hosts that may mount it.
  564.  
  565. 21)
  566. Root's umask set to xyz
  567.    If root's umask is set incorrectly, any files that it creates will be
  568. have bad permissions (e.g. world writable if 000, x00, or xy0).
  569.    To fix, put a "safe" value; 077 or whatever.
  570.  
  571. 22)
  572. "." is in roots path!
  573.    Trojan horses traditionally play upon having the current directory in
  574. a users path.  A bad user will put a trojan horse with a the same name as
  575. a common system command ("ls" is a favorite) and place it in a location that
  576. s/he thinks might be executed.  When the trojan horse is executed, it will
  577. not only execute the command, but will also either steal your account
  578. privileges or have your account perform some action that they desire.
  579.  
  580. 23)
  581. User foo's home directory foo_dir is mode xyz!
  582.  
  583.    If a user's home directory is writable, you have the same problems as (3),
  584. except all of the user's files are in jeopardy this time.
  585.  
  586.    To fix, type:
  587.         chmod a-w foo_dir
  588.  
  589. 24)
  590. User foo: .bar is mode xyz!
  591.  
  592.    In this case, ".bar" stands for one of the user's initialization files,
  593. such as .login, .profile, .exrc, ect.  If the user's file is world writable,
  594. then anyone can modify that file, and whenever the user logs in or executes
  595. a command (such as "vi", when referring to ".exrc"), they will execute
  596. whatever commands the bad girl/boy wants them to.
  597.  
  598.    To fix, type:
  599.         chmod a-w foo_file
  600. SHAR_EOF
  601. #    End of shell archive
  602. exit 0
  603.  
  604. From @medusa.cs.purdue.edu:df@cs.purdue.edu Wed Jan 31 00:01:51 1990
  605. Received: from BBN.COM by pineapple.bbn.com id <AA01286@pineapple.bbn.com>; Wed, 31 Jan 90 00:01:48 -0500
  606. Received: from medusa.cs.purdue.edu by BBN.COM id aa22146; 30 Jan 90 23:57 EST
  607. Received: by medusa.cs.purdue.edu (5.61/PURDUE_CS-1.2)
  608.     id <AA08905@medusa.cs.purdue.edu>; Tue, 30 Jan 90 23:57:37 -0500
  609. From: dan <df@cs.purdue.edu>
  610. Message-Id: <9001310457.AA08905@medusa.cs.purdue.edu>
  611. Subject: COPS, note #2
  612. To: Rich Salz <rsalz@BBN.COM>
  613. Date: Tue, 30 Jan 90 23:57:34 EST
  614. In-Reply-To: <8910021306.AA00139@prune.bbn.com>; from "Rich Salz" at Oct 2, 89 9:06 am
  615. X-Mailer: ELM [version 2.2 PL10]
  616. Status: R
  617.  
  618.  
  619.   The shar files are in no special order, nor do they have to be
  620. unpacked in any order.  Since I don't know much 'bout shar, I put
  621. in some mkdir's at the beginning of the shars so the directory
  622. structure I wanted would be preserved.  You may do with them what
  623. you will....
  624.  
  625.  
  626.  -- dan
  627.  
  628.  
  629.