[这个贴子最后由bigblock在 2003/11/06 04:58pm 第 1 次编辑]
1.2 谁在滥用(misusing)系统?
有两个词来描述攻击者: 黑客和骇客。黑客是一个一般术语:喜欢进入东西
的人。良性的黑客是那些喜欢进入他/她自己的计算机发现如何工作的人。
恶意的黑客是那些喜欢进入其他人系统的人。良性黑客希望媒体能停止对
所有黑客的苛刻批评,使用骇客来做替代。很不幸,这个想法没有被接受
无论如何,在这个FAQ使用的词语是'入侵者',来一般表示那些想要进入其
他人系统的人。
侵入者可以被分为两类:
外部的: 你网络外面的侵入者,或者可能攻击你的外部存在(乱改的web
服务器,通过e-mail服务器转来的垃圾邮件)。外部的侵入者可能来自
Internet, 拨号线, 物理介入, 或者从同你网络连接的伙伴网络(卖主,
客户, 中间商等)。
内部的: 合法使用你的互连网络的侵入者。包括滥用权力的人(比如社会
安全雇员因为不喜欢某人就将其标志为死亡)和模仿更改权力的人(比如使用
别人的终端)。一个常被引用的统计就是80%的安全问题同内部人有关。
有几种类型的侵入者: '快乐骑士'(Joy riders)因能而黑;'文化破坏者'
(Vandals)意于毁坏或更改Web页面; 奸商 (Profiteers)意于利益,如控制
系统勒索或者窃取数据得利。
1.3 入侵者如何进入系统?
入侵者进入系统的主要途径:
物理侵入: 如果一个侵入者对主机有物理进入权限。(比如他们能使用键盘
或者参与系统),应该可以进入。方法包括控制台特权一直到物理参与系统
并且移走磁盘(在另外的机器读/写)。甚至BIOS保护也很容易穿过的: 事实
上所有的BIOS都有后门口令。
系统侵入: 这类侵入表现为侵入者已经拥有在系统用户的较低权限。如果系
统没有打最新的漏洞补丁,就会给侵入者提供一个利用知名漏洞获得系统
管理员权限的机会。
远程侵入: 这类入侵指入侵者通过网络远程进入系统。侵入者从无特权开始
这种侵入方式包括多种形式。比如如果在他/她和受害主机之间有防火墙存在
侵入者就复杂得多。
应该注意网络侵入检测系统主要关心远程侵入。
1.4 入侵者为什么能侵入系统?
软件总是存在bug。系统管理员和开发人员永远无法发现和解决所有的可能
漏洞。侵入者只要发现一个漏洞就可以入侵系统。
1.4.1 软件bug
软件bug存在于服务器后台程序(Daemons), 客户程序, 操作系统, 网络
协议栈。软件bug可以分为如下几种:
缓冲区溢出: 我们读来的几乎所有的安全漏洞归于这一类。一个典型的
例子是一个开发人员设定了一个256字符长的缓冲区来存储用户名。
开发人员想当然的认为没有人的名字比这个长。但是黑客想,如果我
输入一个错误的很长的用户名会发生什么呢? 附加的字符会去哪里?
如果黑客恰巧做对了, 他们发送300个字符, 包括了被服务器执行的
代码,并且,他们进入了系统。黑客们通过几个方法发现这些bug。
首先,很多服务的源代码在网络上是公开的。黑客们经常读这些代码
寻找有缓冲区溢出问题的程序。第二,黑客们可以读程序本身来看是否
有问题存在,虽然读汇编代码输出真的很难。第三,黑客们会检查程序
所有的输入并且试图利用随机数据来溢出。如果程序崩溃了,就会存在
让黑客认真构造输入并且允许进入的机会。应该注意这个问题在C/C++
编写的程序中普遍存在,却很少出现在Java的程序当中。
意外结合: 程序通常被组合成很多层代码,包括了潜在的作为最下面
的操作系统层。侵入者常可以发送一些对于一层无意义的输入, 却对
其他层有意义。Web上最常见的控制用户输入的语言就是Perl。Perl写
的程序往往发送这些输入到其他的程序来进一步的处理。一个常见的
黑客技术就是输入字符串"|mail < /etc/passwd"。这个命令得以执行
是因为操作系统为这个输入启动一个附加的程序。然而操作系统解释
管道符"|"并且按语义启动"mail"程序,结果是将password文件寄给
侵入者。
未处理的输入: 很多程序写成处理有效的输入,很多程序员不知道
当一些人的输入不符合规格的后果。
竞争(Race)条件: 现在的许多系统是多任务/多线程的。这就意味着他
们可以同时运行多个程序。如果两个程序同时访问同一个数据就会发生
危险。想象A和B的两个程序,需要修改同一个文件。为了修改,每个
程序将文件读入内存,在内存中改变内容,然后将内存复制到文件。
当程序A将文件读入内存并且进行修改的时候,产生了一个竞争条件。
在A写文件前,程序B执行并且获得读写权限。现在程序A将内存复制到
文件中。因为程序A 在B修改前开始,所有B的修改丢失了。因为你必须
获得正确的执行顺序,所以竞争条件是非常稀有的。侵入者通常不得不
试上千次,然后获得权限,进入系统。
1.4.2 系统配置
系统配置bug可以分为如下类别:
缺省配置: 许多系统交付给客户的时候采用的缺省的易用的配置。不幸
的是,"易用"就意味着"易侵入"。几乎所有的交付给你的Unix和WinNT
系统可以很容易的被攻击。
懒惰的系统管理员: 惊人的数字的主机被配置成没有系统管理员口令。
这个是因为系统管理员太懒惰了以至于懒得马上配置一个,他们只是
希望系统最好能少麻烦的尽快启动运行。不幸,他们再也不回来设置一
个,让侵入者轻易的进来。侵入者最容易的事情就是先扫描所有的机器
找没有口令的主机。
生成的漏洞: 事实上所有的程序可能被配置成一个非安全的模式。有的
时候系统管理员将不注意的在主机上打开一个漏洞。许多系统管理员
手册都建议系统管理员关掉所有不是绝对必要的程序和服务来避免意外
漏洞。应该注意安全审计包通常可以发现这些漏洞并且提醒系统管理员
信任的关系: 侵入者常用"岛跳"的方法利用信任关系攻击网络。一个
互相信任主机的网络和他们最脆弱的连结一样安全。
1.4.3 口令解密
这个是一个特殊的部分。
真正脆弱的口令: 很多人使用他们自己的名字,孩子的名字,配偶的名
字,宠物的名字,或者小车的型号做口令。也有的用户使用"password"
或者简单到什么也没有。这给出了侵入者可以自己键入的不多与30个
可能性的列表。
字典攻击: 上述攻击失败后,侵入者开始试图"字典攻击"。这种方法,
侵入者利用程序尝试字典中的单词的每种可能。字典攻击可以利用重复
的登陆或者收集加密的口令并且试图同加密后的字典中单词匹配。侵入
者通常利用一个英语字典或其他语言的字典。他们也使用附加的类字典
数据库,比如名字和常用的口令。
强力攻击(Brute force attacks): 同字典攻击类似,侵入者可能尝试
所有的字符组合方式。一个4个由小写字母组成的口令可以在几分钟内
被破解。(大约的共有50万个可能的组合)一个较长的由大小写字母组成
的口令,包括数字和标点(10万亿种可能的组合)可以在一个月内破解,
如果你可以每秒试100万种组合。(实际上,一个单机每秒可以算上几千
次。)
1.4.4 监听不安全的通信
共享媒体: 传统的以太网中, 你只要在线上启动Sniffer就可以看到在
一个网段的所有通信。现在这个方法由于更多公司采用交换以太网而困
难。
服务器监听: 然而在一个交换的网络里,如果你可以在一个服务器(特
别是做路由器的)安装sniffer程序,你就可以可以使用得到的信息来
攻击客户主机和信任主机。比如,你可能不知道某个用户的口令,通过
在他登陆的时候监听Telnet会话,就可以得到他的口令。
远程监听: 大量的主机可以RMON,带有公共团体字符串。当带宽非常低
的时候(你不能监听所有的通信),则呈现有趣的可能性。
1.4.5 设计的缺点
甚至当一个软件完全按照设计来实现的时候,仍然可能因为设计时的
bug带来被侵入。
TCP/IP 协议缺点: TCP/IP协议在我们有很多被黑经验前被设计。结果
有很多可能引起安全问题的设计缺点。一些例子比如smurf攻击,ICMP
不可达的连结, IP哄骗, 和SYN floods。最大的问题是IP协议本身非常
信任: 黑客自由的伪造和更改IP数据。IPSec被设计成解决了很多的
缺点,但是没有被广泛的应用。
Unix 设计缺点: 有很多Unix固有的缺点使得Unix系统频繁的被入侵。
主要问题是权限控制系统, 只有"root"才是系统管理员权限。结果:
1.5 入侵者如何获得口令?
入侵者利用如下方法获得口令:
明文监听: 一些协议(Telnet, FTP, 基本HTTP)使用明文的口令,意味着
他们在比如客户/服务器传输过程中不进行加密。入侵者可以使用一个协议
分析仪观察线缆上的这样的口令。不需要更多的努力;入侵者马上可以使用
这些口令来登陆。
密文监听: 许多协议,使用加密的口令。这种情况下,入侵者就需要执行
字典或者强力攻击口令来试图解密。应该注意到你不能发现入侵者的存在,
因为他/她是完全被动并且不用向线缆传送任何东西。口令破解在入侵者利
用自己的机器来鉴权的时候,不许要发送人和东西到线缆。
重放(Replay)攻击: 很多情况下,入侵者不必解密口令。他们可以使用加密
的格式来代替登陆系统。这通常需要重新编码客户端软件来使用加密的口令
口令文件窃取: 所有的用户数据库通常存储在磁盘上的一个单个文件。UNIX
下这个文件是/etc/passwd(或者这个文件的其他镜像),WinNT下,是SAM文件
每个方法,一旦入侵者取得了这个文件,他/她就能运行解密程序(如上面所
述)来发现文件中一些脆弱的密码。
观察: 一个传统的口令安全问题是口令必须长而且难猜(使得字典和强力攻
击不合理的困难)。然而,这样的口令往往很难记忆,所以用户就在某地写
下来。入侵者常可以搜寻一个个人办公桌来发现写到小字条上的口令(一般
在键盘下面)。入侵者也可以自己训练在用户后面观察口令的键入。
交际工程: 一个普通(且成功)的技巧是简单的打个电话给用户并且说 "hi,
我是MIS组的Bob, 我们正跟踪网络上的一些问题,并且出现在你的机器里。
你用的是什么口令呢?"许多用户会在这种情况下放弃他们的口令。(许多公
司有政策让用户永远不要给出他们的口令,甚至他们自己的MIS部门,但是
这个伎俩仍然成功。一个简单的解决方法就是MIS组打电话给6个月的雇员
问他们口令,然后批评他们的错误,这样他们就不会忘记了:-)
1.6典型的入侵过程?
一个典型的入侵过程也许如下:
步骤1.外部侦查--
入侵者会尽可能地找出实际上并不直接给予他们的资讯.
他们常通过公开资讯或伪装成正常的使用者.
用这种方式的入侵者, 将使你实在难以察觉. 如你的
网络跟你的Domain Name 一起 注册的(例如 foobar.com),入侵者可以
使用'whois'这种查表(lookup)来尽量找出你的网路(network)资讯.
入侵者也许经由你的DNS表(使用'nslookup','dig',或
其他的工具程序 来作 domain 的转换)来找出你机器的名字.
入侵者会浏览其他的公开资讯, 例如 你的公开站点和
匿名(anonymous)FTP 站点. 入侵者也许会寻找关于你公司的
新闻文件和报刊的发行品.
步骤2.内部侦查--
入侵者使用更具侵略性的技术来对资讯扫描,但不会破坏
任何东西.他们将由你全部的网页来找出CGI scripts(CGI
scripts 经常是容易被入侵的).他们也许会为了试探主机的存
在而使用'ping'.他们也许会用 UDP/TCP scan/strob(扫描)来
找出目标主机的可获得服务(services).他们也许会执行一个
如同 'rpcinfo','showmount', 'snmpwalk'等等 的工具程序
, 来寻找可获得的资讯.关于这点,入侵者只是做出"正常的"
网路行为,并且没有作出任何被归类为闯入(intrusion)的举动.
针对这点,NIDS会告诉你"有人在检查你的大门握把",但没有人
真的去试着把门打开.
步骤3.入侵--
入侵者违越了规矩,并开始对目标主机作了可能的漏洞入侵.
入侵者尝试 在一个输入资料里,传递一个shell 指令,因而
危及CGI script.入侵者试图以传递大量的资料的方式,来侵害
一个已知的缓冲区溢位(buffer-overrun)漏洞.入侵者开始检查
有无 简单可猜(甚至 没有)密码的户帐号.一个黑客,会由
几个阶段性的入侵.例如,如果黑客可以得到一个用户的帐号,
他将试图作更进一步的入侵举动来获得 root/admin.
步骤4.立足--
在这阶段中,入侵者已经由机器的入侵,成功地在你的网路中立足.
入侵者主要的目的就是藏匿入侵证据(修改稽核(audit trail)与log档)
并确认他可以再次侵入.他们也许会安装可让他们执行的'toolkits'
.用他们有着后门(backdoor)密码的木马(Trojanhorses)置换原先的服务
,或 创造一个属于自己的使用者帐户.System IntegrityVerifiers
(SIVs)可以 注意到 档案的改变 而对使用这些手段的入侵者
做出检测.由于大部分的网路难以防御来自内部的侵害,入侵者将利用
这个机器作为其他机器的跳岛.
步骤5.利益--
入侵者利用他们的优势偷取机密资料,滥用系统资源(阶段性的由其他机器
侵扰你的机器)或破坏你的网页.
其他的情节也许开始情况不同.不管是入侵特定的站点或者是随机地在
网路世界中扫描特定的漏洞.例如 入侵者可能会企图扫描有着
SendMail DEBUG漏洞机器的整个网路.他们可以轻易入侵有漏洞的机器.
他们不会直接针对你,甚至不知道你是谁.(就好像'birthdayattack'般,
列出已知的系统漏洞与IP位置,凭运气的找到有着其中一项漏洞的机器)
1.7一般的入侵类型有哪些?
有三种攻击方式:
侦察--包括ping扫描,DNS zone 转换,e-mail侦察,
TCP 或 UDP 端口(port)扫描(scan),与经由公开网页伺服
器可能的索引(indexing),来发现CGI漏洞.
漏洞--入侵者将会利用隐密的特性或缺陷(bugs)来存取系统.
拒绝服务(denial-of-service)(DOS)攻击--入侵者试图
破坏服务(或机器),使网路连结(link)超载,CPU超载,填满硬盘.
入侵者不是想获得资讯,而是仅仅以如破坏者般的
行为而不让你使用机器.
1.8 常见漏洞有哪些?
1.8.1 CGI脚本(scripts)
CGI程式是恶名昭彰地不安全.典型的安全漏洞
包括 经由shell特殊字元(metacharacters)
的利用,直接传递变质的输入 于 命令shell里.
使用隐藏的变数,指定系统里的档案名(filename)
,或揭示更多系统的种种.最为人知的CGI缺陷就是
装载于NCSA httptd的'phf'数据库(library).
'phf'library 假定为允许 伺服解析(sever-parsed)HTML,
而造成 传回任何档案 的漏洞. 其他入侵者试图使用的
知名CGI脚本漏洞有:TextCounter, GuestBook, EWS,
info2www, Count.cgi, handler, webdist.cgi,
php.cgi, files.pl, nph-test-cgi, nph-publish,
AnyForm, FormMail.如果你发现有人试图存取上述
的CGI脚本(但你没有使用他们),这便清楚显示了一
个入侵的意图(假设你没有把你想使用的CGI脚本
用那个缺陷版本安装).
1.8.2 Web 服务器(server) 攻击
在CGI程序执行后,Web服务器可能有了其他的漏洞.
非常多的self-written Web服务器(包括IIS 1.0 与 NetWare2.x)
会因为在一 档案名
之中,能把一连串的"../"写在路径(path)名里,
因而跳到 系统档案 的其他地方,得到任何档案.
其他的一般漏洞,就是在 请求(request)域(field) ,
或 其他 HTTP数据 的 缓冲区溢出.
Web服务器常因为与其底层的operating system
有着互动的关系 ,而产生漏洞.在Microsoft IIS
里有个古老的漏洞被使用,因档案有两个档案名--
一个 长档名与 一个短的相应8.3形式名 ,有时能
绕过允许机制 而获得存取.NTFS (the new file system)
有一个特色,名为--"alternate data streams" 相似于
Macintosh系统的 数据与 资源 forks.你可以在通过stream
name时,添加上"::$DATA"(这是为了看他的脚本而不是执行什么)
,来存取他的档案.
服务器长久以来因URLs而存在着问题.例如
"death by a thousand slashes"
问题,导致Apache产生大量的
CPU负载,因它试着在数以千计的"/" URL中处理每一个目录.
1.8.3 Web浏览器 攻击
Microsoft与Netscape的Web浏览器,都有安全漏洞(当然啦,虽然
最新版本的,我们还没发现),这包括了URL, HTTP, HTML,
JavaScript, Frames, Java, 与 ActiveX 攻击.
URL数据段,会有缓冲区溢位的情况,当它由HTTP标头(header)
被解悉时,在屏幕上显示时,或于某种形式被处理(如
由cache history储存).而且,有着古老Internet
Explorer漏洞的在浏览器,在执行 LNK或URL命令时会伴随着
能在内部造成影响的漏洞.
HTTP 头可能因为传递给只收特定值的函数而产生漏洞
HTML常会存在漏洞,如 MIME-type 缓冲区溢位 于
Netscape Communicator的 |