韩塞北
[摘要]本文主要从黑客入侵的技术中如何掩盖其行踪,达到保护自己目的,为大家查找入侵途径及防范入侵提供帮助。
[关键词]木马 入侵 隐藏 攻击
一、隐藏踪迹
1.编辑系统日志
许多攻击者会在本地系统日志中留下痕迹。例如某个对OpenSSH实施蛮力口令攻击的用户会产生日志记录。Syslog记录通常含有攻击者的身份或位置的信息。在入侵之后,攻击者很可能会抹掉记录其踪迹的日志。Syslog文件一般保存在root::root所属的/var/log/目录下。其文件许可通常为644,即所有人均可读,但是只有root可写。已经攻破root的攻击者能够抹掉与其相关的日志信息。
2.抹去日志记录文件
大部分登录软件都会在名为/var/log/utmp或/var/log/wtmp的文件中记录每次成功的登录。这些文件以机器可读的格式保存每个用户登录和注销时间。这样攻击者就能根据可疑活动的发生时间快速地定位到这段时间内登录系统得用户。可以用程序last从这些文件中提取信息:如果能够写入/var/log/utmp或/var/log/wtmp文件,攻击者就能够编辑这些文件以删除与其登录相关的踪迹。有许多工具可以从以上文件中删除登录信息。或者可以直接删除这些文件。
二、木马化系统程序
1.日志报告。多数日志程序都将日志信息记录在wtmp,utmp或syslog文件中。通过重新编译login,su,sudo,in.telnetd,sshd,rlogind等,攻击者才能够从根本上阻止记录这些信息。类似于w,who和last的命令扫描wtmp和utmp文件,以报告当前有哪些用户,或者显示之前的登录情况。通过修改这些命令,攻击者甚至无需修改日志文件的内容就能保持隐身状态。
2.进程报告。类似于ps,lsof和top的命令通常也被木马化。以隐藏运行的任意进程。这些进程通常包括口令破解会话、对外攻击或远程守护进程。例如,可以在ps命令的某个源代码文件readproc.c中添加了若干代码:
proc_t* ps_readproc(PROCTAB *PT,proc_t* rbuf) {
next_proc:
while((ent = readdir(PT->procfs))&&(*ent->d_name<0||*ent->d_name>9)){…}
if(!ent||!ent->d_name) return NULL;
sprintf(path,”/proc/%s”,ent->d_name);
if(stat(path,&sb)= = -1) goto next_proc;
if(sb.st_uid = = 8765) { goto next_proc; }
if(!allocated){…}
在上面程序中,只是简单地让ps跳过任何ID为8765的进程。这样ps将只会报告与之无关的其他进程。此外,也可以将ps编写成忽略设置了在名字中包含特定字符串的进程。
3.文件报告。文件报告工具,通常都能找到系统中我们创建的所有文件。这些文件通常包括攻击源代码、攻击输出、破解数据库和机器列表等。攻击者可以修改这些工具来隐藏其文件或目录。
下面是/bin/ls源代码ls.c的一个经过修改的版本:
static int file_intertesting(const struct direct *next) {
for(ignore = ignore_patterns;ignore;ignore =ignore->next)
if(fnmatch(ignore->patern,next->d_name,FNM_PERIOD)= = 0) return 0;
if(!strcmp(next->d_name,”...”)) return 0;
if(really_all_files||next->d_name[0]!=.||(all_files))
在上面,修改了file_interesting函数,该函数用来确定是否在列表中输出相应的文件名。通过修改file_interesting函数可以隐藏文件名为”...”的文件。显然通过木马化足够的文件列表程序,攻击者能够隐藏所有特殊的目录。
4.网络报告。通过诸如netstat,lsof和tcpdump等程序,可以看到系统中与黑客有关的进入连接和外出连接。其他网络信息,诸如网络接口配置、网络路由、硬件地址表,可以通过木马化route,ifconfig和arp等命令隐藏起来。
5.安全工具。对木马化和踪迹隐藏而言,本地安装的安全工具尤为重要,例如制定的进程检查脚本、用户监视软件、文件完整性工具或数据库。如果攻击者能够修改文件完整性软件或suid/sgid检查程序,以使之忽略其所建立的特定目录,就能在该目录下安全地安装任何东西而不被发现,包括suid为root的程序,而通常这类程序很容易被发现。
三、隐藏木马文件
1.文件名诡计。Linux文件名可以包含除/和\000之外的任何字符。在文件名中使用不可打印字符即可在诸如ls或ps的工具下伪装其真实名字。这里创建了一个名为“..”的目录。此时因为多数人不会以-a标志来使用ls,因此根本就看不到这个目录。而那些确实使用了-a标志的人也有可能不会注意到这个情况,将之误以为..目录。然后,以同样的方式,黑客把一个攻击程序重命名为“sh”。该程序运行时,在ps命令下的显示与普通的sh只有细微的差别。
2.更改argv[0]。程序运行时会得到一个命令行参数列表。这些参数保存在名为argv的数组中,其中argv[1]为第一个参数,argv[2]为第二个参数。而argv[0]则是这个程序自己的名字。如果需要的话,程序可以用这个参数来确定自己的运行方式。例如gzip,gunzip和zxat通常都是到相同i节点的硬连接:因此,在这个例子中,如果运行/bin/gzip,则程序根据argv[0]来确定应当执行压缩功能。在程序中也可更改这个变量,且在ps的输出中所显示的将是该更改值。
3.已删除文件。除非链接数为0,否则系统不会物理删除磁盘上的文件。在上面的/gzip/gunzip/zcat例子中,因为这些文件名都指向磁盘上的同一个i节点,所以其链接数是3。用户在删除/bin/gzip之后,仍然可以使用/bin/gunzip和/bin/zcat。每当某个进程打开文件时,内核会将文件的引用计数加1。也就是说,即便某个进程打开并删除了一个文件,所有打开该文件的其它进程仍然可以访问它。我们可以利用这个机制来隐藏程序所使用的数据文件,或者隐藏程序自身。因为当进程被kill掉,它所打开文件的链接数就会归于0,相应文件也会永久丢失。所以,这也就成为一种简单的方法,即只要kill进程或重启动机器,管理员就要费些周折才能找到相关证据。
4.覆盖性加载。攻击者可以利用加载的办法来隐藏整个目录,使别人难以轻易访问。例如可以创建/opt/tmp目录并将自己的所有工具都放置在该目录下。然后切换到这个目录,运行所需要的任何程序。在做完这些工作之后。它在/opt/tmp上加载一个新的tmpfs文件系统:
参考文献:
[1]卢开澄.计算机密码学——计算机网络中的数据保密与安全.清华大学出版社,2004.
[2]陈明.网络设计教程.清华大学出版社,2004.
[3]潘志翔,岑进锋.黑客攻防编程解析.机械工业出版社,2003.