可能在入侵事件之前,你已经在系统上花费了大量时间。你了解这些系统的里里外外,进行了相当多的文档工作,并且做了备份。在系统上,开启了进程审计(或者*BSD的系统审计),进行了系统实时数据(sadc[8])来保存系统的性能数据。管理日志的时候,可能没有足够的空间来频繁存储这些数据,你可以发送syslog数据到安全的日志服务器上。
你接到webmaster的电话,他发现某个web服务器上CPU负载很高,而这个服务器每天的浏览量仅仅几千而已。webmaster确信服务器存在有什么问题。 vmstat 和 mpstat (只在*BSD系统上) 表明CPU被用户空间的一个或者多个进程消耗掉了,但是内存和I/O子系统还没有大量使用。 iostat 也显示出磁盘系统不正常。
$ vmstat 1 4
procs memory swap io system cpu
r b w swpd free buff cache si so bi bo in cs us sy id
1 0 0 376 7756 29772 570960 0 0 7 3 441 397 87 5 8
5 0 0 376 6728 29772 570960 0 0 0 0 498 1249 100 0 0
6 0 0 376 7240 29772 570960 0 0 0 0 652 1563 97 3 0
6 0 0 376 7604 29772 570960 0 0 0 0 536 1323 97 3 0
$ mpstat 1 4
20:51:21 CPU %user %nice %system %idle intr/s
20:51:22 all 100.00 0.00 0.00 0.00 479.00
20:51:23 all 100.00 0.00 0.00 0.00 496.00
20:51:24 all 100.00 0.00 0.00 0.00 499.00
20:51:25 all 97.00 0.00 3.00 0.00 481.00
Average: all 98.00 0.60 1.40 0.00 486.60
$ iostat -dk 1 4
Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
dev3-0 0.00 0.00 0.01 73 1296
dev3-0 0.00 0.00 0.00 0 0
dev3-0 0.00 0.00 0.00 0 0
dev3-0 0.00 0.00 0.00 0 0
|
sar (*BSD的sa) 显示CPU从早些晚上 03:17 就开始被使用。 lastcomm 显示FTP客户端在03:17以root运行了几次, last 这个命令显示最近的登录,没有显示出这个时间段有 root 从什么地方登录进来。另外,这个服务器又使用 sudo来管理root权限。这里有两个系统管理员账号可以用 root登录,但是他们并没有登录过,特别是在 AM 3这个时间附近。根据这一点,你决定使用CD上准备好的二进制工具。现在运行 top -d1,并且发现apache这个进程占用了100%的CPU。 现在用 grep 检查apche的错误日志,这个GNU工具可以有更多有用的参数,-A, -B和-C 可以让你指定想从哪一个匹配的行的开始,之前或者周围看。 grep可以通过-E 来使用扩展的模式匹配表达式。可以检查系统日志。但是并没有在这些日志里面检查到什么奇怪的地方。 现在继续进行检查。运行 ps -eflcyL (Solaris 9),ps -eflcym --headers (Deb3.0, RH8.0)或者 ps auwxhkwvl(OBSD 3.2)。找到进程 apache,而这一次发现有问题了。这里只有一个apache进程和多个httpd进程。httpd实际上是Apache服务器,因为httpd是在apachectl文件执行的二进制,运行的apache是前派生的,因此,如果二进制文件被重命名为"apache",那么也应该有多个进程存在。这就是问题所在。 使用 lsof -p
[9] ,发现这个apache进程打开了一个叫 john.pot 的文件。立刻通过google,查询这是一个叫“John the Ripper”的密码破解工具,正是这个东西让CPU满负荷了。 现在来检查这个所谓的apache程序。通过 file apache,表明这个文件是ELF可执行的。现在进行进一步的挖掘,执行 readelf -a apache,确信这是一个ELF可执行程序。 od -xc apache | less 现实ELF魔法数字(7f454c46),ldd显示apache连接的共享对象库比实际的httpd进程小一些,这里面一定有文章:
$ ldd ./apache
libc.so.6 => /lib/libc.so.6 (0x4001f000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
$ ldd /usr/sbin/httpd
libm.so.6 => /lib/libm.so.6 (0x7002c000)
libcrypt.so.1 => /lib/libcrypt.so.1 (0x700c4000)
libdb.so.2 => /lib/libdb.so.2 (0x70100000)
libdb2.so.2 => /lib/libdb2.so.2 (0x70120000)
libexpat.so.1 => /usr/lib/libexpat.so.1 (0x70180000)
libdl.so.2 => /lib/libdl.so.2 (0x701b4000)
libc.so.6 => /lib/libc.so.6 (0x701c8000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x70000000)
|
执行: strings | grep -i john,显示如下:
|