A few updates... 1) Change the standard file attributes on the md5 file before setting the immutable flag. I make mine 0400 so it's read-only by the superuser. (chmod 0400 /etc/chkrootkit.md5) 2) You may need to edit the location of your mail program in line 18 (changed mine from /usr/bin/mail to /bin/mail). 3) Line 32 of the script will need to be adjusted on Linux boxes... the md5 output is reversed. Simply replace the command 'pop' with 'shift'.
-Jason At 05:54 PM 2/22/2002 -0500, Jason Dixon wrote: >Thanks to an article on the O'Reilly network >(http://linux.oreillynet.com/pub/a/linux/2002/02/07/rootkits.html), I've >started using chkrootkit (http://www.chkrootkit.org), a utility that >checks for rootkits on your Linux/BSD/Solaris install. It looks for >certain signatures in trojaned system binaries and compares them against >known rootkits. It includes other tools that check for network >promiscuity (ifpromisc), lastlog deletions (chklastlog), wtmp deletions >(chkwtmp), wtmpx deltions (check_wtmpx - Solaris only), and checks for >signs of LKM trojans (chkproc). > >I've performed some extra steps which allow me to automate the running of >chkrootkit, while also authenticating the validity of the chkrootkit >binary itself. I'm including the steps here, in case anyone else would >like to try this on their own systems. Please note... this utility is >great for checking against *known* rootkits... it's not a substitution for >common security practices. I would also suggest that anyone serious about >preventing rootkit modifications also ensure they install Tripwire on all >new installations. However, in situations where a box does not already >have Tripwire installed, chkrootkit is a great tool to help gain back some >peace of mind. This document covers Linux and *BSD installs only. > >Installation of chkrootkit is very simple. Grab the tarball, uncompress, >and run 'make sense' (as root). Copy the binaries to a standard system >bin (I used /usr/local/sbin). Cd to the new location and run the >chkrootkit by hand to make sure everything looks good.... > >tar zxf chkrootkit-0.35.tar.gz >cd chkrootkit-0.35/ >make sense >cp chkrootkit /usr/local/sbin/ >cp chkwtmp /usr/local/sbin/ >cp chklastlog /usr/local/sbin/ >cp chkproc /usr/local/sbin/ >cp ifpromisc /usr/local/sbin/ >./chkrootkit > >The output will look something like this... (snipped for brevity's sake) > >ROOTDIR is `/' >Checking `amd'... not infected >Checking `basename'... not infected >Checking `biff'... not infected >Checking `chfn'... not infected >Checking `chsh'... not infected >Checking `cron'... not infected >Checking `date'... not infected >... >Checking `sniffer'... >dc0 is not promisc >sl0 is not promisc >ppp0 is not promisc >bridge1 is not promisc >gif0 is not promisc >Checking `wted'... nothing deleted >Checking `z2'... nothing deleted > >Ok, now for the extra layer of security. To ensure that no one tampers >with my chkrootkit binaries, I've created a new file (/etc/chkrootkit.md5) >containing the md5sum for each binary. Next, we want to modify the md5 >file so nobody can tamper with it. We want to turn on the *immutable* bit >for this file. Making a file immutable means that no one can modify the >delete the file. In linux, we want to use the 'chattr +i' command... in >*BSD, the same command is 'chflags schg'. To view special attributes, you >must use 'lsattr' in Linux and 'ls -lo' in *BSD. Note that in Linux, the >immutable flag can be removed by the superuser at any time with 'chattr >-i'. In *BSD systems, you can only remove the "system immutable" (schg) >flag in securelevel 0 or -1 (single-user mode is an example of securelevel 0). > >md5sum chkrootkit >> /etc/chkrootkit.md5 >[run the same command for each binary; command is 'md5' in *BSD] > >chattr +i /etc/chkrootkit.md5 [Linux] >chflags schg /etc/chkrootkit.md5 [*BSD] > >To automate these utilities, I've setup a cron job to execute a perl >script I've created which first authenticates our stored md5 digests >against the current md5 values. It uses the Digest::MD5 perl module to >run the digests. Installing the perl module is very simple... grab the >tarball, uncompress to a directory, run (as root) 'perl Makefile.pl', >'make', 'make test' and 'make install'. > >wget http://www.cpan.org/authors/id/GAAS/Digest-MD5-2.16.tar.gz >tar zxf Digest-MD5-2.16.tar.gz >cd Digest-MD5-2.16/ >perl Makefile.pl >make >make test >make install > >Here is the script... I make no guarantees... YMMV. Note the variables >that should be changed specific to your usage... $md5_sav_file (location >of your trusted md5 file), $runpath (location of your chkrootkit binary), >and $admin_mail (your email address... make sure to escape the '@' with a >backslash or perl won't interpret it correctly). The script will first >compare the known and trusted md5 sums found in our immutable file to the >current md5 sums of the binaries. If there are any discrepancies, it will >report them. Next, it will cd to the system bin (as defined by $runpath) >and run the chkrootkit binary. It needs to cd to the directory, as >chkrootkit will attempt to run the other utilities within it's current >directory. > >#!/usr/bin/perl -w ># safe_chkrootkit.pl > >use strict; >no strict 'subs'; >use Digest::MD5(md5_hex); > >my $md5_new; >my $md5_sav; >my $md5_sav_file = "/etc/chkrootkit.md5"; >my $file; >my $file_and_path; >my $path = "/usr/local/sbin"; >my @files = qw( ifpromisc chkproc chkrootkit chklastlog chkwtmp ); >my @input; >my $admin_mail = "admin\@localhost.com"; > >open(MAIL, "|/usr/bin/mail $admin_mail"); >print MAIL "Running authentication tests on chkrootkit binaries...\n\n"; > >while (<@files>) { > $file = $_; > $file_and_path = "$path/$file"; > open(MD5,"$file_and_path") || die "Can't open file for reading: $!"; > $md5_new = Digest::MD5->new->addfile(MD5)->hexdigest; > close(MD5); > open(TST,"$md5_sav_file",) || die "Can't open file for reading: $!"; > while (<TST>) { > chomp; > if (/$file/) { > @input = split(/ /,$_); > $md5_sav = pop(@input); > unless ($md5_new eq $md5_sav) { > print MAIL "\t\t\t*** WARNING ***\n"; > print MAIL "The binary file for " . $path > . "/" . $file . " has been altered.\n"; > print MAIL "The original md5 sum for > $file was\n\n"; > print MAIL "\t\t$md5_sav\n\n"; > print MAIL "and the new md5 sum is\n\n"; > print MAIL "\t\t$md5_new\n\n"; > print MAIL "Please investigate ASAP\n"; > print MAIL "\t\t\t*********************\n"; > } else { > print MAIL "\[$file\]\n"; > print MAIL "Current: $md5_new\n"; > print MAIL "Trusted: $md5_sav\n\n"; > } > } > } > close(TST); >} > >I hope that others find this as useful as I have. I've implemented this >on my OpenBSD firewall, and plan on installing it on my Linux workstation >ASAP. Keep in mind that there are many other facets of system security >that should still be scrutinized, but this is a nice tool to help out >nonetheless. If anyone has any questions, comments or suggestions >regarding my usage of this program, or the functionality of the script, >please let me know. > >-Jason > >_________________________________________________________ >Do You Yahoo!? >Get your free @yahoo.com address at http://mail.yahoo.com _________________________________________________________ Do You Yahoo!? Get your free @yahoo.com address at http://mail.yahoo.com