|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T r
Length: 4926 (0x133e) Types: TextFile Names: »root.chk«
└─⟦4f9d7c866⟧ Bits:30007245 EUUGD6: Sikkerheds distributionen └─⟦3da311d67⟧ »./cops/1.04/cops_104.tar.Z« └─⟦6a2577110⟧ └─⟦4f9d7c866⟧ Bits:30007245 EUUGD6: Sikkerheds distributionen └─⟦6a2577110⟧ »./cops/1.04/cops_104.tar« └─⟦this⟧ »cops_104/root.chk«
: # # Usage: root.chk # # This shell script checks pathnames inside root's startup files for # writability, improper umask settings (world writable), non-root # entries in /.rhosts, and to ensure that root is in /etc/ftpusers. # Also check for a single "+" in /etc/hosts.equiv (world is trusted), # and that /bin, /etc and certain key files are root owned, so that you # can't, say, rcp from a host.equived machine and blow over the password # file... this may or may not be bad, decide for yourself. # Startup files are /.login /.cshrc /.profile # # Mechanism: These files contain paths and filenames that are stripped # out using "grep". These strings are then processed by the "is_able" # program to see if they are world writable. Strings of the form: # # path=(/bin /usr/bin .) # and # PATH=/bin:/usr/bin:.: # # are checked (using grep) to ensure that "." is not in the path. All # results are echoed to standard output. In addition, some effort was # put into parsing out paths with multiple lines; e.g. ending in "\", # and continuing on the next line. # For umask stuff, simply grep for umask in startup files, and check # umask value. For /etc/ftpuser, simple grep to check if root is in # the file. For /etc/hosts.equiv, just check to see if "+" is alone # on a line by awking it. # # AWK=/bin/awk SED=/bin/sed TEST=/bin/test ECHO=/bin/echo GREP=/bin/grep SORT=/usr/bin/sort EXPR=/bin/expr LS=/bin/ls # root startup/important files csh=/.cshrc sh=/.profile rhosts=/.rhosts big_files="/.login /.cshrc /.profile" # root should own *at least* these, + $big_files; you can check for all files # in /bin & /etc, or just the directories (the default.) # root_files="/bin /bin/* /etc /etc/* $big_files $rhosts" root_files="/dev /usr/etc /bin /etc $big_files $rhosts /etc/passwd /etc/group" # misc important stuff ftp=/etc/ftpusers equiv=/etc/hosts.equiv # should't have anyone but root owning /bin or /etc files/directories # In case some of the critical files don't exist (/.rhost), toss away error # messages non_root=`$LS -ld $root_files | $AWK '{if ($3 != "root") print $NF}'` if $TEST -n "$non_root" ; then $ECHO "Warning! Root does not own the following file(s):" $ECHO $non_root fi # parse into separate paths: for i in $big_files do if $TEST -s $i then ./chk_strings $i # check for umask stuff (thanks to Bruce Spence): if umsk=`$GREP umask $i ` 2>/dev/null then mask=`$ECHO $umsk|$AWK '{if($2!=""){if(length($2)==1) print "00"$2; \ else if (length($2)==2) print "0"$2; \ else print $2} else print "000"}'` # perm=`$EXPR substr $mask 3 1` perm=`$ECHO $mask | $SED 's/[0-9][0-9]//'` if $TEST "$perm" -lt 2 -o "$perm" = 4 then if $TEST "$umsk" then $ECHO "Warning! Root's umask set to $umsk in $i" fi fi fi fi done # check to see if root is in ftpusers file if $TEST -s $ftp then if $TEST ! "`$GREP "root" $ftp`" then $ECHO Warning! $ftp exists and root is not in it fi fi # check for a "+" in hosts.equiv. Bad. Bad dog. if $TEST -f $equiv ; then $AWK '{if (NF==1 && $1=="+") printf("Warning! A \"+\" entry in %s!\n", "'$equiv'")}' $equiv fi # check for non-root entries in /.rhosts #$AWK '{if ((NF==1&&!($1=="localhost" || $1=="root"))||(NR!=1&&$2!="root")) printf("Warning! Non root entry in %s! %s\n", $rhosts, $0)}' $rhosts # checking paths... # # For both the .profile and .cshrc, the methods are similar. Awk for # lines with "path" or "PATH", rip out the guts, then check with is_writable # Trying to pull out the multi line stuff was a pain... no thanks to # Jay Batson for telling me this was broken :-) # { # # Get the root paths from $csh. if $TEST -f $csh; then $AWK '{foo=substr($NF,1,length($NF)); \ if (bar && foo=="\\" ) foobar[i++] = $0; \ if (bar && foo==")") { bar = 0; \ foobar[i++] = $0;}} /path/ { foobar[i++] = $0; \ foo=substr($NF,1,length($NF)); \ if (foo=="\\" ) bar = NR \ } END { for (j=0; j<=i; j++) print foobar[j] } ' $csh | $SED -e 's/#.*$//' -e 's/(//' -e 's/)//' -e 's/.*=//' | $AWK '{for (i=1;i<=NF;i++) print $i}' fi # # Get the root paths from $sh. if $TEST -f $sh; then $AWK -F: '{foo=substr($NF,1,length($NF)); \ if (bar && foo=="\\" ) foobar[i++] = $0; \ if (bar) { bar = 0; \ foobar[i++] = $0;}} /PATH/ { foobar[i++] = $0; \ foo=substr($NF,1,length($NF)); \ if (foo=="\\" ) bar = NR \ } END { for (j=0; j<=i; j++) print foobar[j] }' $sh | $SED -e 's/#.*$//' -e 's/^export.*$//' -e 's/PATH=//' -e 's/;.*$//' | $AWK '{ split($0,temp,":"); for (i in temp) \ if (temp[i] == "") print "."; \ else print temp[i]}' fi } | $SORT -u | while read i do # check to see if "." is in path if $TEST "." = "$i" then $ECHO "Warning! \".\" (or current directory) is in roots path!" fi if ./is_writable $i then $ECHO "Warning! Directory $i is _World_ writable and in roots path!" fi done # end of script