物理侵入: 如果一个侵入者对主机有物理进入权限。(比如他们能使用键盘或者参与系统),应该可以进入。方法包括控制台特权一直到物理参与系统并且移走磁盘(在另外的机器读/写)。甚至BIOS保护也很容易穿过的: 事实上所有的BIOS都有后门口令。 系统侵入: 这类侵入表现为侵入者已经拥有在系统用户的较低权限。如果系统没有打最新的漏洞补丁,就会给侵入者提供一个利用知名漏洞获得系统管理员权限的机会。 远程侵入: 这类入侵指入侵者通过网络远程进入系统。侵入者从无特权开始这种侵入方式包括多种形式。比如如果在他/她和受害主机之间有防火墙存在侵入者就复杂得多。 应该注意网络侵入检测系统主要关心远程侵入。 1.4 入侵者为什么能侵入系统? 1.4.1 软件bug 软件bug存在于服务器后台程序(Daemons), 客户程序, 操作系统, 网络协议栈。软件bug可以分为如下几种: 缓冲区溢出: 我们读来的几乎所有的安全漏洞归于这一类。一个典型的例子是一个开发人员设定了一个256字符长的缓冲区来存储用户名。 未处理的输入: 很多程序写成处理有效的输入,很多程序员不知道当一些人的输入不符合规格的后果。 竞争(Race)条件: 现在的许多系统是多任务/多线程的。这就意味着他们可以同时运行多个程。如果两个程序同时访问同一个数据就会发生危险。想象A和B的两个程序,需要修改同一个文件。为了修改,每个程序将文件读入内存,在内存中改变内容,然后将内存复制到文件。 1.4.2 系统配置 缺省配置: 许多系统交付给客户的时候采用的缺省的易用的配置。不幸的是,"易用"就意味着"易侵入"。几乎所有的交付给你的Unix和WinNT系统可以很容易的被攻击。 懒惰的系统管理员: 惊人的数字的主机被配置成没有系统管理员口令。这个是因为系统管理员太懒惰了以至于懒得马上配置一个,他们只是希望系统最好能少麻烦的尽快启动运行。不幸,他们再也不回来设置一个,让侵入者轻易的进来。侵入者最容易的事情就是先扫描所有的机器找没有口令的主机。 生成的漏洞: 事实上所有的程序可能被配置成一个非安全的模式。有的时候系统管理员将不注意的在主机上打开一个漏洞。许多系统管理员手册都建议系统管理员关掉所有不是绝对必要的程序和服务来避免意外漏洞。应该注意安全审计包通常可以发现这些漏洞并且提醒系统管理员信任的关系: 侵入者常用"岛跳"的方法利用信任关系攻击网络。一个互相信任主机的网络和他们最脆弱的连结一样安全。 1.4.3 口令解密 真正脆弱的口令: 很多人使用他们自己的名字,孩子的名字,配偶的名字,宠物的名字,或者小车的型号做口令。也有的用户使用"password"或者简单到什么也没有。这给出了侵入者可以自己键入的不多与30个可能性的列表。 字典攻击: 上述攻击失败后,侵入者开始试图"字典攻击"。这种方法,侵入者利用程序尝试字典中的单词的每种可能。字典攻击可以利用重复的登陆或者收集加密的口令并且试图同加密后的字典中单词匹配。侵入者通常利用一个英语字典或其他语言的字典。他们也使用附加的类字典数据库,比如名字和常用的口令。 强力攻击(Brute force attacks): 同字典攻击类似,侵入者可能尝试所有的字符组合方式。一个4个由小写字母组成的口令可以在几分钟内被破解。(大约的共有50万个可能的组合)一个较长的由大小写字母组成的口令,包括数字和标点(10万亿种可能的组合)可以在一个月内破解, 1.4.4 监听不安全的通信 服务器监听: 然而在一个交换的网络里,如果你可以在一个服务器(特别是做路由器的)安装sniffer程序,你就可以可以使用得到的信息来攻击客户主机和信任主机。比如,你可能不知道某个用户的口令,通过在他登陆的时候监听Telnet会话,就可以得到他的口令。 远程监听: 大量的主机可以RMON,带有公共团体字符串。当带宽非常低的时候(你不能监听所有的通信),则呈现有趣的可能性。 1.4.5 设计的缺点 TCP/IP 协议缺点: TCP/IP协议在我们有很多被黑经验前被设计。结果有很多可能引起安全问题的设计缺点。一些例子比如smurf攻击,I Unix 设计缺点: 有很多Unix固有的缺点使得Unix系统频繁的被入侵。主要问题是权限控制系统, 只有"root"才是系统管理员权限。
【软考】入侵检测系统FAQ
1.3 入侵者如何进入系统?
入侵者进入系统的主要途径:
软件总是存在bug。系统管理员和开发人员永远无法发现和解决所有的可能漏洞。侵入者只要发现一个漏洞就可以入侵系统。
开发人员想当然的认为没有人的名字比这个长。但是黑客想,如果我输入一个错误的很长的用户名会发生什么呢? 附加的字符会去哪里?如果黑客恰巧做对了, 他们发送300个字符, 包括了被服务器执行的代码,并且,他们进入了系统。黑客们通过几个方法发现这些bug。
首先,很多服务的源代码在网络上是公开的。黑客们经常读这些代码寻找有缓冲区溢出问题的程序。第二,黑客们可以读程序本身来看是否有问题存在,虽然读汇编代码输出真的很难。第三,黑客们会检查程序所有的输入并且试图利用随机数据来溢出。如果程序崩溃了,就会存在让黑客认真构造输入并且允许进入的机会。应该注意这个问题在C/C++编写的程序中普遍存在,却很少出现在Java的程序当中。
意外结合: 程序通常被组合成很多层代码,包括了潜在的作为最下面的操作系统层。侵入者常可以发送一些对于一层无意义的输入, 却对其他层有意义。Web上最常见的控制用户输入的语言就是Perl。Perl写的程序往往发送这些输入到其他的程序来进一步的处理。一个常见的黑客技术就是输入字符串"|mail < /etc/passwd"。这个命令得以执行是因为操作系统为这个输入启动一个附加的程序。然而操作系统解释管道符"|"并且按语义启动"mail"程序,结果是将password文件寄给侵入者。
当程序A将文件读入内存并且进行修改的时候,产生了一个竞争条件。在A写文件前,程序B执行并且获得读写权限。现在程序A将内存复制到文件中。因为程序A 在B修改前开始,所有B的修改丢失了。因为你必须获得正确的执行顺序,所以竞争条件是非常稀有的。侵入者通常不得不试上千次,然后获得权限,进入系统。
系统配置bug可以分为如下类别:
这个是一个特殊的部分。
如果你可以每秒试100万种组合。(实际上,一个单机每秒可以算上几千次。)
共享媒体: 传统的以太网中, 你只要在线上启动Sniffer就可以看到在一个网段的所有通信。现在这个方法由于更多公司采用交换以太网而困难。
甚至当一个软件完全按照设计来实现的时候,仍然可能因为设计时的bug带来被侵入。