联机的Linux的系统分析(第一部分)(第一版)

类别:软件工程 点击:0 评论:0 推荐:

联机的Linux的系统分析(第一部分)(第一版)

======================================================================

-----原著:Mariusz Burdach

翻译:西安邮电学院电科0101 徐兆元   02985384887

译文版权: 徐兆元 西安邮电学院156# [email protected]/[email protected]

2004.8.15

转载请通知

======================================================================

1.绪论

 在对一些情况的处理中,我们经常会遇到这样的情况:一个危及安全的系统没有被用户或管理者很好的清除.这是一个很好的机会去得到很有用的即使在漏洞被清除后也无法挽回的信息.

我会谈及以下这些概念:

正在运行的进程,

开放TCP/UDO端口,

被删除的程序镜象但仍在主存中运行的程序,

已建立的连接和被载入部分Linux系统内核的虚拟内存的模块.

所有以上的数据都可以帮助分析人员在离线的情况下找到确切的证据(入侵证据).此外,如果

当一个侵入事件仍在更新中,我们可以恢复几乎所以的被入侵者利用的数据.

有时这里描述的连接过程是能获得入侵所需要的数据的唯一途径,因为特定类型的恶意代码.

比如基于rootkits工具的LKM,是只有被加载到内存并且它不会改变任何文件或目录.一个相似的过程也存在于Windows视窗操作系统中----红色代码蠕虫是一很好的例子,这个恶意代码不被保存为任何一个文件但可以插入目录之中,然后它会从内存中运行.

 

另一方面,以下所用的方法也有严重的局限性并且对于数字分析它违反了信息收集的第一要务----一个并不能轻松完成的必要条件.这就是:所有的用户和内核级工具在收集数据时候会很自然地改变系统的状态.在联机的系统上运行任何的工具,我们在将它们加载到内存和系统为它们建立至少一个进程时候可能覆盖非常明显的入侵证据.在建立一个新的进程时,操作的内存管理器在主存中为它分配空间的时候的可能会覆盖其他未被分配到的数据空间,这在主存和交换分区都会发生.其他的问题发生在我们准备进行法律上的行动并且需要按照当地法律去做的时候.在主存的镜象中发现的数字签名是不可信的,因为它们可以用我们获得的工具伪造.所以在进行任何行动之前我们要决定是否需要在这个非安全系统上收集信息(译者注:你的收集可能是徒劳的,因为你可能不能确定入侵者的身份).我们非常值去了解这些.在主存中镜象中我们可以发现密码和明文文件.利用/proc伪造文件系统我们可以恢复已经被删除了的但仍然在内存中分配了内存的程序.

 

在一个理想的环境下,我们可以设想一个硬件基于Intel框架的计算机允许我们在没有操作系

统的情况下转储个内存到一个外部存储设备中.其实这一个解决方案已经存在在Sparc(译者注:Sparc是SUN公司的工作站系统)机器上,在这个系统上我们可以用固件来启动系统而进行整个物理存储器的转储.可不幸的是,没有类似的解决方案存在于硬件基于Intel和AMD的计算机上.尽管有上面的问题,基于软件的方法对法律意图还是有利的,我将把这些有利条件在文章中展示出来.本问的主要目的是介绍一种在证据收集过程中使用的方法.所有收集到的数据将被用于后面的离线法定分析.在整个收集周期中,一些提出的任务也被在准备和鉴定阶段完成---这是六个过程其中的两个被定义为"逐步事件处理"的两个过程,此方法由SANS学会发明.

2.定性分析

  本部分分为四个相互关联的小节:

  ●2.1 环境配置

  ●2.2 准备分析工具包

  ●2.3 从联机系统上收集数据---逐步过程

  ●2.4 原始数据分析和关键字查找

  2.1,2.2,2.3三部分将在这一篇文章中讨论,余下的过程和离线分析过程在下一篇中讨论.

 

2.1 环境配置

    在从系统中收集数据之前我们必须将自己的东西配置到系统环境中.首先我们必须运行一个网络嗅觉器(sniffer),它可以监视非安全系统网络的信息输入输出传递情况.这个操作是必须的.通过这种实时信息记录和分析,我们可以删除一定类型的恶意活动.tcpdump是一种极其卓越的工具来实现这种操作.我的建议是用原始的方式去记录数据包,因为其性能可能引起

其它的结果.

在非安全系统进行任何活动之前我们应该建立一个收集数据过程的列表.在本问的第三部分你可以看到一个关于此的实例.这个过程可以消除任何在我们进行分析时的要犯的错误.我们也必须在每个步骤完成之后进行一次总结以确定我们没有什么错误发生.文挡很重要,他可以让我们决定是否要将我们的结果带到法院去(注:对入侵者进行起诉).

 

下一步是在数据收集阶段记录命令的结果.我们将连接一台目标主机到本地网络上,并且这台

目标主机必须正在接受非安全主机信息.请紧记,我们不能在非安全系统上进行任何写操作.在非安全系统上进行数据记录的话会删除入侵的信息.为了避免以上的这些影响我们必须将我们的数据发送到一个远程的目标主机.这在分析过程中是一个饿非常重要的规则.需要再重复一次的是,象先前提及的这个要求其实是不容易做到的.

如果我们还没有得到存储在可移动存储设备上的可用的分析工具包,则现在是你为我们非安全系统准备这些工具的好机会.当利用这些工具包里的工具收集重要信息的时候,请根据工具分析结构的可靠信的从底到和高的顺序开始.

以下的方法向你展示如何为我们的工具准备外部存储设备.

 

2.2 准备分析工具包

   在进行数据收集时请记住我们必须做到以下要求:

   ●尽量不要在非安全系统上运行程序.为什么?因为入侵者可以修改系统命令(如netstat) 

     或系统库文件(如libproc),导致这些命令的结果不可靠.为了达到这个要点我们可以准 

     备静态编译版本的工具.

   ●尽量不要运行那些会修改文件和目录的程序

   ●所以的分析结果必须写到远程主机中.为了达到这个要求我们将远程主机当作我们的目标主机.我们将利用netcat工具来传送数据.

   ●你必须利用工具计算数据的hash值.这是一种确保我们的数据没有被改变过的方法.一个很好的做法是:为了确保数据没有被改变并且被恰当地保存在目标主机上,我们可以比较源文件和目标文件的hash值是否一致.有时在非安全主机上是计算hash值是可行的-----一个很好的例子是在内存中.当我们在/dev/mem设备中用md5sum两次的话,每次的hash值都不同. 这是因为我们每次在将程序加载到内存中(建立一个需要内存的进程)都会改变存储器的状态.在我们收集的过程中我们要立即计算hash值,当收集完成后.如果可能,这个过程最好在源主机和目标主机都进行.为了维护结果的完整性我们将使用md5sum工具

●     其实,确保我们的工具不会在非安全系统的主存和交换分区中进行写操作在一些步骤中是不可实现.这些将会在2.3节中详细讨论.现在,我们要确保我们已经有了合适的的工具存储在可移动设备上,工具列表如下(表1):

 

1: 分析所需要的工具(必须存储在可移动设备上).

 

程序名

来源 和 相关配置

  1  

nc

http://www.atstake.com/research/tools/network_utilities/nc110.tgz
How to build: $tar zxvf nc110.tgz; make linux
How to verify: file nc or ldd nc

2

dd

http://www.gnu.org/software/fileutils/fileutils.html
(added to core utilities)

3

datecat

http://www.gnu.org/software/coreutils/
How to build: $ tar zxvf coreutils-5.0.tar.gz; configure CC="gcc -static", make
How to verify: file date cat or ldd date cat

4

pcat

http://www.porcupine.org/forensics/tct
How to build: $tar zxvf tct-1.14.tgz; make CC="gcc -static"
How to verify: file pcat or ldd pcat

5

Hunter.o

http://www.phrack.org/phrack/61/p61-0x03_Linenoise.txt
To make the module more "independent" we have to delete the following lines from the source code:
#ifdef CONFIG_MODVERSIONS
#define MODVERSIONS
#include <linux/modversions.h>
#endif
We can load this module to other kernels by removing the MODVERSIONS.
How to build: $ gcc -c hunter.c -I/usr/src/linux/include/

6

insmod

http://www.kernel.org/pub/linux/utils/kernel/modutils/for kernel 2.4
How to build: $./configure-enable-insmod_static; make
How to verify: file insmod.static or ldd insmod.static

7

NetstatArproute

http://freshmeat.net/projects/net-tools/
How to build: $bzip2 -d net-tools-1.60.tar.bz2; tar xvf net-tools-1.60.tar.bz2; make config; make CC="gcc -static"
How to verify: file netstat arp route or ldd netstat arp route

8

dmesg

http://ftp.cwi.nl/aeb/util-linux/util-linux-2.12.tar.gz
How to build: $./configure; make CC="gcc -static"
How to verify: file dmesg or ldd dmesg

当我们已经成功地配置好了以上的工具,我们要将他们复制到可移动设备上(比如可读写光盘(CD-RW)).

2.3从联机系统上收集数据---逐步过程

  下一个必要的条件也是很重要的条件是我们要以适当的顺序来开始收集数据.要从最不可靠的到最可靠的顺序进行.我们必须紧记这一点.

 

  第一步:截取非安全系统的屏幕图象

  这是一种屏幕拍摄,当然我们得用数码相机进行这个操作.这是一个很简单的步骤.

  在我们进行第二步之前,先挂载我们的可移动存储设备(当然利用mount命令),让我们在考虑一下第二步会对非安全系统有什么影响.我们的活动会有什么作用呢?此时,让我们先忽略它给我们的非安全系统的内存带来的影响.

 

很清楚我们既然要挂载额外的设备到非安全系统中,我们就必须使用非被信任的mount命令去完成这个操作.当我们使用不信任的系统命令时这种状况肯定会发生.如果所以的操作都依照我们的计划的话,我们将使用已经挂载的设备上的可信任的工具来执行我们余下的命令.

 

我们同样需要通过检查来查看我们的mount命令给我们的系统带来了什么影响.我已经在一台计算机上完成了一些研究,表2列出了相应的被改变的文件和目录

 

# strace /bin/mount /mnt/cdrom

2: mount命令访问的文件列表

File

Modified Meta-data by the mount command

/etc/ld.so.cache

atime

/lib/tls/libc.so.6

atime

/usr/lib/locale/locale-archive

atime

/etc/fstab

atime

/etc/mtab*

atime, mtime, ctime

/dev/cdrom

atime

/bin/mount

atime

*We can avoid access to this file by using a "-n" switch.

  我们可以想象一种情况如果当一个入侵者修改了mount命令.当我们要运行这个命令时,另一个特殊的可以将所有入侵痕迹删除的进程被初始化,并且以此来阻止系统加载设备.这种进程被称为”deadman switch”.但是在这里我们假设这种情况不存在,我们回到我们数据收集的过程中.

   我建议我们去检查每个将被纳入我们的工具包的命令.这些命令将被用于我们稍后的数据收集.

 

我们还得停下来思考一下在mount进程中将面对的问题:

 ○当将媒体装如驱动器中后,卷管理器将自动加载媒.此时,那些文件和目录将被修改呢?

我们将这些文件列在表1中.

○假设一个未知媒体被正确地加载到非安全系统上.则第一个任务就是如果将此媒体卸载,那么我们怎么保证我们能安全地卸载它了.我建议两种情况.我们可以用非信任卸载命令或者将可信任卸载命令(静态连接)拷贝到软盘上.下一步,我们用非信任加载命令加载软盘然后运行可信任卸载命令.这个操作很简单但很有用.我们只是用了一个非信任卸载命令.

○管理者被注销或者更严重管理者密码被入侵者改变.当管理者被注销的话我们就必须重新进入系统.那么当我们在进入系统时那么文件被访问和修改了?多少附加的进程被建立了?如果管理者密码被改变了那么系统上的其他帐户是什么呢?在不访问shell的情况下有那些不可靠的数据被收集呢?开放的TCP/UDP端口了,当前连接,其他呢?

 

第二步:媒体加载

让我们继续,来加载媒体,此时我们的工具存储在CD-ROM上

 

# mount -n /mnt/cdrom

 

如果上面的加载成功的话我们就可以开始我们最重要的数据收集阶段.请紧记,所有用可信任命令得到的结果都必须被送到远程主机上.我使用netcat工具和管道方法去实现此操作.为了更好的区分那个任务在那个主机上完成的.所有在非安全系统上运行的命令将被一个字节标识,同样运行在远程主机上的命令也被一个字节来标识.参看下面的例子.

 

为了传送非安全系统的实际的数据到远程系统上(假设远程主机的IP地址为192.168.1.100)我们必须开放远程主机上TCP端口:

(remote host)# nc -l -p 8888 > date_compromised

 

再者,开放非安全系统主机的端口:

(compromised host)# /mnt/cdrom/date | /mnt/cdrom/nc 192.168.1.100 8888 -w 3

为了保持收集资料的完整性我们计算收集到的文件的hash值并且将每一步都文挡化.

(remote host)# md5sum date_compromised > date_compromised.md5

 

有时,我们在非安全系统上收集校检和并发送结果到远程主机上. 关于这个问题所能引起的更多问题已经在这篇文章的别处讨论到了.

(compromised host)# /mnt/cdrom/md5sum /etc/fstab | /mnt/cdrom/nc 192.168.1.100 8888 -w 3

 

第三步:当前日期

  结果是用UTC时间来记录的(译者注:UTC:格林尼治时间)

(remote)# nc -l -p port > date_compromised

(compromised)# /mnt/cdrom/date -u | /mnt/cdrom/nc (remote) port

(remote)# md5sum date_compromised > date_compromised.md5

 

第四步: 缓存表

 首先,我们必须从缓存表中及时收集数据,原因是这些数据具有生命周期,这些数据在表中的周期是很短的.我将从arp协议和路由表中收集这些数据.

 

Mac address cache table:

(remote)# nc -l -p port > arp_compromised

(compromised)# /mnt/cdrom/arp -an | /mnt/cdrom/nc (remote) port

(remote)# md5sum arp_compromised > arp_compromised.md5

 

Kernel route cache table:

(remote)# nc -l -p port > route_compromised

(compromised) # /mnt/cdrom/route -Cn | /mnt/cdrom/nc (remote) port

(remote)#md5sum route_compromised > route_compromised.md5

 

第五步:当前的连接和开放的TCP/UDP端口

  现在,我们来收集关于当前连接和开放的TCP/UDP端口的信息.

关于活动的sockets信息我们将在第八步中来解决.

(remote)#nc -l -p port > connections_compromised

(compromised)# /mnt/cdrom/netstat -an | /mnt/cdrom/nc (remote) port

(remote)#md5sum connections_compromised > connections_compromised.md5

 

在这一步中我们可以使用cat命令来代替netstat命令来进行操作.我们将关于开放的端口的信息被存放在/proc文件系统中(/proc/net/tcp and /proc/net/udp files).把关于当前连接的信息存放在/proc/net/netstat file中.所有的数据以16进制存储.

 

例如: 0100007F:0401 在十进制中表示 127.0.0.1:1025

  根据前面所提及的方法,当前连接会被纪录系统所监测到.把这纪录下很重要:

一个检测rootkit的简单的方法是当其加载到核心内存中时并隐藏到一个开放的端口中.我们必须从远程系统是扫描非安全系统被检测到的开放端口并且同时和我们从netstat命令中得到的结果进行比较.但是这个操作会带来很多不利因为我们又一次改变了非安全系统,在第七步中我将提供一种可代替的检测隐藏基于LKM的rootkit.

 

 

第一部分结束语

 

现在,我们已经用了一些数据和网络连接状态的纪录.在我们关闭系统非安全前,我们准备进行了一些附加的步骤. 下个月,在第二篇文章中我们将集中地从所收集的数据中寻找出恶意的代码并将它们发送到远程主机中.我们也会讨论一些在安全环境下能一次性完成的寻找方法.

 

 

参考书籍:

Alessandro Rubini, Jonathan Corbet. Linux Device Drivers, 2nd Edition. O'Reilly; 2001. Dan Farmer, Wietse Venema. Column series for the Doctor Dobb's Journal. http://www.porcupine.org/forensics/column.html. Daniel P. Bovet, Marco Cesati. Understanding the Linux Kernel, 2nd Edition. O'Reilly; 2002. Kernel source code. http://www.kernel.org/ Linux manual pages. National Institute of Standards and Technology. Computer Security Incident Handling Guide. http://csrc.nist.gov/. PHRACK #61. Finding hidden kernel modules (the extrem way) by madsys. http://www.phrack.org/. RFC 3227. Guidelines for Evidence Collection and Archiving. Smith Fred, Bace Rebecca. A guide to forensic testimony. Addison Wesley; 2003. Symantec Corporation. CodeRed Worm. http://securityresponse.symantec.com/. The Honeynet Project. Scan 29. http://www.honeynet.org/ The SANS Institute. Incident Handling step by step. http://www.sans.org/

关于作者

View more articles by Mariusz Burdach on SecurityFocus.

 

本文地址:http://com.8s8s.com/it/it36395.htm