第3章 黑 客 攻 击   “黑客”一词是对于网络攻击者的统称。一般说来,黑客是一个精通计算机技术的特殊群体。从攻击的动机看,可以把黑客分为3类:一类称为“侠客”(hacker),他们多是好奇者和爱出风头者;一类称为“骇客”(crackers),他们是一些不负责的恶作剧者;一类称为“入侵者”(intruder),他们是有目的的破坏者。随着Internet的普及,黑客的活动日益猖獗,对社会造成巨大损失。   黑客形式多样,技术不断更新。下面仅介绍其中影响较大的几个。 3.1 黑客攻击的基本过程与常用工具 3.1.1 黑客进行网络攻击的一般过程   黑客进行网络信息系统攻击的主要工作流程是:收集情报、远程攻击、远程登录、取得权限、留下后门、清除日志,主要内容包括目标分析、文档获取、破解密码、日志清除等。这些内容都包括在黑客攻击的3个阶段——准备阶段、实施阶段和善后阶段中。   1.攻击的准备阶段   (1)确定目的。一般说来,入侵者进行攻击的目的主要有3种类型:破坏型、获取型和恶作剧型。破坏型攻击指破坏攻击目标,使其不能正常工作,主要的手段是拒绝服务攻击(DoS)。获取型主要是窃取有关信息,或获取不法利益。恶作剧型则是进来遛遛,以显示自己的能耐。目的不同,但所采用的手段大同小异。   (2)踩点,即寻找目标。   (3)查点。搜索目标上的用户、用户组名、路由表、SNMP信息、共享资源、服务程序及旗标等信息。   (4)扫描。自动检测计算机网络系统在安全方面存在的可能被黑客利用的脆弱点。   (5)模拟攻击。进行模拟攻击,测试对方反应,找出毁灭入侵证据的方法。   2.攻击的实施阶段   (1)获取权限。获取权限往往是利用漏洞进行的。系统漏洞分为本地漏洞和远程漏洞两种:本地漏洞需要入侵者利用自己已有的或窃取来的身份,以物理方式访问机器和硬件;相比本地漏洞,攻击者往往只需要向系统发送恶意文件或者恶意数据包就能实现入侵。这就是远程漏洞比本地漏洞更危险的原因。因此,黑客的攻击一般都是从远程漏洞开始的。但是利用远程漏洞获取的不一定是最高权限,往往只是一个普通用户的权限,这样常常没有办法做黑客们想要做的事。这时就需要配合本地漏洞来把获得的权限进行扩大,常常是扩大至系统的管理员权限。   (2)权限提升。有时获得了一般用户的权限就足以达到修改主页等目的了,但只有获得了最高的管理员权限之后,才可以做诸如网络监听、清理痕迹之类的事情。要完成权限的扩大,不但可以利用已获得的权限在系统上执行利用本地漏洞的程序,还可以放一些木马之类的欺骗程序来套取管理员密码,这种木马是放在本地套取最高权限用的,而不能进行远程控制。   (3)实施攻击。如对一些敏感数据的篡改、添加、删除和复制,以及对敏感数据的分析,或者使系统无法正常工作。   3.攻击的善后阶段   (1)修改日志。如果攻击者完成攻击后就立刻离开系统而不做任何善后工作,那么他的行踪将很快被系统管理员发现,因为所有的网络操作系统一般都提供日志记录功能,会把系统上发生的动作记录下来。为了自身的隐蔽性,黑客一般都会抹掉自己在日志中留下的痕迹。为了能抹掉痕迹,攻击者要知道常见的操作系统的日志结构以及工作方式。   (2)设置后门。一般黑客都会在攻入系统后不止一次地进入该系统。为了下次再进入系统时方便一点,黑客会留下一个后门,特洛伊木马就是后门的最好范例。   (3)进一步隐匿。只修改日志是不够的,因为百密必有一疏,即使自认为修改了所有的日志,仍然会留下一些蛛丝马迹。例如,安装了某些后门程序,运行后也可能被管理员发现。所以,黑客经常通过替换一些系统程序的方法来进一步隐藏踪迹。这种用来替换正常系统程序的黑客程序称为rootkit,这类程序在一些黑客网站可以找到,比较常见的有LinuxRootKit,现在已经发展到了5.0版本了。它可以替换系统的ls、ps、netstat、inetd等一系列重要的系统程序,当替换了ls后,就可以隐藏指定的文件,使得管理员在使用ls命令时无法看到这些文件,从而达到隐藏自己的目的。 3.1.2 黑客常用工具   一般说来,众多的恶意代码都是黑客的帮凶,或者是黑客利用的工具。不过有一些恶意代码是黑客利用最多的工具,陷门就是其一。此外还有一些是黑客刻意研发出来的工具,例如下列一些。   (1)僵尸网络。僵尸网络与后门类似,也允许攻击者访问系统。但是所有被同一个僵尸网络感染的计算机将会从一台控制命令服务器接收到相同的命令。有关作用将在3.5.3节介绍。   (2)下载器。这是一类用来下载其他恶意代码的恶意代码。下载器通常是在攻击者获得系统的访问时首先进行安装的。下载器程序会下载和安装其他的恶意代码。   (3)间谍软件。这是一类从受害计算机上收集信息并发送给攻击者的恶意代码。例如嗅探器、密码哈希采集器、键盘记录器等。这类恶意代码通常用来获取E-mail、在线网银等账号的访问信息。   (4)启动器。用来启动其他恶意程序的恶意代码。通常情况下,启动器使用一些非传统的技术,来启动其他恶意程序,以确保其隐蔽性,或者以更高权限访问系统。   (5)内核套件。设计用来隐藏其他恶意代码的恶意代码。内核套件通常是与其他恶意代码(如后门)组合成工具套装,来允许为攻击者提供远程访问,并且使代码很难被受害者发现。   (6)勒索软件。设计成吓唬受感染的用户来勒索他们购买某些东西的恶意代码。这类软件通常有一个用户界面,使得它看起来像是一个杀毒软件或其他安全程序。它会通知用户系统中存在恶意代码,而唯一除掉它们的方法只有购买他们的“软件”,而事实上,他们所卖软件的全部功能只不过是将勒索软件进行移除而已。   (7)发送垃圾邮件的恶意代码。这类恶意代码在感染用户计算机之后,便会使用系统与网络资源来发送大量的垃圾邮件。这类恶意代码通过为攻击者出售垃圾邮件发送服务而获得收益。 3.2 系统扫描攻击   系统扫描攻击也称为系统敏感信息采集,其目标是获取系统的有关敏感数据。网络拓扑结构、网络地址、端口开放状况、运行什么样的操作系统、存在哪些漏洞以及用户口令等关系到信息系统的运行和安全状态,它们都可以称为信息系统敏感数据。用扫描手段获取这些数据是网络管理人员进行网络维护常用的手段,也是攻击者进行攻击踩点、确定攻击目标和攻击方法的基本手段。 3.2.1 网络扫描   网络扫描包括地址扫描和端口扫描。前者的目的是判断某个IP地址上有无活动主机和系统,以及某台主机是否在线;后者的目的是判断有关端口的打开状况。   1. 地址扫描   进行地址扫描的方法很多,下面先介绍几种常用的命令。   1)ping命令   ping是潜水艇人员的专用术语,表示回应的声纳脉冲。在网络中,用ping命令向目标主机发送ICMP回显请求报文,并等待ICMP回显应答,从而检测网络的连通情况和分析网络速度。   ping命令的完整格式如下。    ping [-t] [-a] [-n count] [-l size] [-f] [-i ttl] [-v tos] [-r count] [-s count] [-j computer-list] | [-k computer-list] [-w timeout] destination-list      各参数的含义如下。   -t:不断ping目标主机,直至中断。   -a:以IP地址格式来显示目标主机的网络地址。   -n count:指定要ping的次数,默认值为4。   -l size:指定发送到目标主机的数据包的大小,默认为32B,最大值是65527B。   -f:在数据包中发送“不要分段”标志,数据包就不会被路由上的网关分段。   -i ttl:将“生存时间”字段设置为ttl指定的值。   -v tos:将“服务类型”字段设置为tos指定的值。   -r count:在“记录路由”字段中记录传出和返回数据包的路由。count最少可以指定1台计算机,最多可以指定9台计算机。   -s count:指定count指定的跃点数的时间戳。   -j computer-list:利用computer-list指定的计算机列表路由数据包。连续计算机可以被中间网关分隔(路由稀疏源)的IP允许的最大数量为9。   -k computer-list:利用computer-list指定的计算机列表路由数据包。连续计算机不能被中间网关分隔(路由严格源)的IP允许的最大数量为 9。   -w timeout:指定超时间隔,单位为毫秒。   destination-list:指定要ping的远程计算机。   ping命令有如下几种用法。   (1)使用ICMP协议的Ping扫描:Ping程序利用ICMP协议中的ICMP Echo Request数据包进行探测,如果目标主机返回了ICMP Echo Reply数据包,说明主机真实存在。   (2)TCP ACK Ping扫描:发送一个只有 ACK标志的TCP数据包给目标主机,如果目标主机反馈一个TCP RST数据包,则表明主机存在。更容易通过一些无状态型的包过滤防火墙。   (3)TCP SYN Ping扫描:如果目标主机活跃但是指定端口不开放,则会返回RST。如果目标主机端口开放,则返回SYN/ACK标志的数据包。无论收到哪种反馈,都可以判断目标主机真实存在。   2)tracert命令   tracert是一个路由跟踪程序,它通过向目标发送不同的IP生存时间(TTL)值的ICMP回显数据包来确定到目标所选择的路由。tracert程序工作时,首先发送一个TTL=1(ms)的回显数据包,以后每次递增1;它要求每个路由器在转发数据包之前先将TTL减1,当TTL=0时,路由器将返回ICMP Time Exceeded。这样,直到目标响应或TTL达到最大值后,可以根据每次到达的路由接口列表得到到达目标的路由信息。它的主要选项如下。   -d:防止将中间路由器解析为它们的IP地址。   -h maximum_hops:指定搜索到目标地址的最大跳跃数,默认值为30。   -j host_list:是一系列用空格分隔的带点十进制IP地址,用来表示一系列由一个或多个路由器隔开的中间目标。最大数量为9,仅在IPv4中才使用。   -w timeout:指定超时时间间隔,程序默认的时间单位是毫秒。默认值为4000。   -4:强制tracert使用IPv4。   -6:强制tracert使用IPv6。   target_name:目标主机的名称或IP地址。   3)pathping命令   pathping命令是一个路由跟踪工具,它将ping和tracert命令的功能与这两个工具所不提供的其他信息结合起来。pathping命令在一段时间内将数据包发送到将到达最终目标的路径上的每个路由器,然后根据从每个跃点返回的数据包计算结果。由于命令显示数据包在任何给定路由器或链接上丢失的程度,因此可以很容易地确定可能导致网络问题的路由器或链接。它的主要选项如下。   -n hostnames:不将地址解析成主机名。   -h maximum hops:搜索目标的最大跃点数。   -g host-list:沿着主机列表释放源路由。   -p period:在ping之间等待的毫秒数。   -q num_queries:每个跃点的查询数。   -w time-out:每次等待回复的毫秒数。   -i地址:使用指定的源地址。   -4 IPv4:强制pathping使用IPv4。   -6 IPv6:强制pathping使用IPv6。   4)who命令   who命令主要用于查看当前在线上的用户情况。它的主要选项如下。   -a:显示所有用户的所有信息。   -m:显示运行该程序的用户名,和“who am I”的作用一样。   -q:只显示用户的登录账号和登录用户的数量,该选项优先级高于其他任何选项。   -u:在登录用户后面显示该用户最后一次对系统进行操作距今的时间。   -h:显示列标题。   5)ruser命令   ruser是一个UNIX命令,可以生成登录到远程机的用户列表。它的主要选项如下。   -a:即使没有用户登录也提供报告。   -h:按主机名的字母顺序排序。   -i:按空闲时间排序。   -l:提供类似于who命令的更长的清单。   -u:按用户数量排序。   6)finger命令   finger(端口79)是一个UNIX命令,用于提供站点及用户的基本信息。它的主要选项如下。   -s:显示用户注册名、实际姓名、终端名称、写状态、停滞时间和登录时间等信息。   -l:除了用-s选项显示的信息外,还显示用户主目录、登录Shell、邮件状态等信息,以及用户主目录下的.plan、.project和.forward文件的内容。   -p:除了不显示.plan文件和.project文件以外,与-l选项相同。   7)host命令   host是一个UNIX命令,可以把一个主机名解析到一个网络地址或把一个网络地址解析到一个主机名,得到很多信息,包括操作系统、计算机和网络的很多数据。它的主要选项如下。   -a:等同于-v-t。   -C:在需要认证的域名服务器上查找SOA记录。   -d:等同于-v。   -l:列出一个域内所有的主机。   -i:反向查找。   -N:改变点数。   -r:不使用递归处理。   -R:指定UDP包数。   -T:支持TCP/IP模式。   -v:运行时显示详细的处理信息。   -w:永远等待回复。   -W:指定等待回复的时间。   -4:用于IPv4的查询。   -6:用于IPv6的查询。   8)netstat   该命令可以使用户了解到自己的主机是怎样与Internet相连接的。它的主要选项如下。   -r:显示本机路由表的内容。   -s:显示每个协议(包括TCP、UDP和IP)的使用状态。   -n:以数字表格形式显示地址和端口。   -a:显示所有主机的端口号。   2. 端口扫描   在TCP/IP网络中,端口号是主机上提供的服务标识。例如,FTP服务的端口号为21,Telnet服务的端口号为23,DNS服务的端口号为53,HTTP服务的端口号为80等。入侵者知道了被攻击主机的地址后,还需要知道通信程序的端口号。一个打开的端口就是一个潜在的入侵通道。只要扫描到相应的端口已打开,就知道目标主机上运行着什么服务,以便采取针对这些服务的攻击手段。下面介绍几种常用的端口扫描技术。   1)全连接扫描与半连接扫描   TCP连接通过三次握手(three-way handshake)建立。图3.1表示了一个建立TCP连接的三次握手过程。若主机B运行一个服务器进程,则它要首先发出一个被动打开命令,要求它的TCP准备接收客户进程的连接请求,然后服务器进程就处于“听”状态,不断检测有无客户进程发起连接的请求。 图3.1 建立TCP连接的三次握手过程   (1)若主机A中运行有客户进程,当它需要服务器的服务时,就要向它的TCP发出主动连接请求:用SYN=1和ACK=0表示连接请求,用SEQ=x表示选择了一个序号。主机B收到A的连接请求报文,就完成了第一次握手。   (2)主机B如果同意连接,其TCP就向A发回确认报文:用SYN=1和ACK=1表示同意连接,用ACK=x+1表示对x的确认,用SEQ=y表示B选择的一个序号。主机A接收到该确认报文,完成第二次握手。   (3)接着,主机A的TCP就还要向主机B发出确认:用SYN=1和ACK=1表示同意连接,用ACK=y+1表示对y的确认,同时发送A的第一个数据SEQ=x+1。主机B收到主机A的确认报文,完成第三次握手过程。   完成这样一个三次握手,才算建立了可靠的TCP连接,才能可靠地传输数据报文,也可以获取端口是否开放的信息。这种扫描称为全连接扫描或TCP connect扫描。但是,这种扫描往往会被远程系统记入日志。为避免被记入日志,可以使用半开放扫描——TCP SYN扫描。因为,当客户端发出一个SYN连接请求报文后,如果收到了远程目标主机的ACK/SYN确认,就说明远程主机的该端口是打开的;若没有收到远程目标主机的ACK/SYN确认,而是收到RST数据报文(表明连接出现了问题),就说明远程主机的该端口没有打开。这样对于扫描要获得的信息已经足够了,也不会在目标主机的日志中留下记录。这种扫描称为半连接扫描或SYN扫描。   2)TCP FIN扫描   FIN是释放连接的数据报文,表明发送方已经没有数据要发送了。很多日志不记录这类报文。TCP FIN扫描的原理是向目标端口发送FIN报文,当FIN数据包到达一个关闭的端口时,会返回一个RST的回复;当FIN数据包到达一个开放的端口时,该包将被忽略,没有回复。由此可以判断一个端口是关闭还是打开的。这种方法还可以用来区别操作系统是Windows,还是UNIX。   这种方法比SYN扫描更隐蔽,也被称为秘密扫描。但是,有的系统不管端口打开与否,一律回复RST。这时,FIN扫描就不适用了。   3)认证扫描   前面介绍的扫描方法有一个共同特点:判断一个主机中哪个端口上有进程在监听。 认证扫描的特点与之不同,它是利用认证协议(将在第5章介绍),获取运行在某个端口上进程的用户名(userid)。例如,尝试与一个TCP端口建立连接,如果连接成功,扫描器发送认证请求到目的主机的TCP端口113。   认证扫描同时也被称为反向认证扫描,因为即使最初的RFC建议的是一种帮助服务器认证客户端的协议,然而在实际的实现中也考虑了反向应用(即客户端认证服务器)。   4)慢速扫描   慢速扫描就是使用非连续性端口,进行时间间隔长、且无定率的扫描,并使用不一致的源地址,使这些扫描记录无规律地分布在大量日志中被淹没,给日志分析造成困难。   5)乱序扫描   乱序扫描就是对扫描的端口号集合随机地产生扫描顺序,并且每次的扫描顺序不同。这就给入侵检测系统的发觉端口扫描带来困难。   3. 网络扫描工具   1)NMap   NMap是运行在Linux/UNIX下的一个功能非常强大的扫描工具,被称为扫描之王。它支持多种协议(如TCP、UDP、ICMP等)扫描,可以用来查看有哪些主机以及主机运行何种服务。   NMap的扫描方式如下。   (1)TCP connect扫描。   (2)TCP SYN (half open) 扫描。   (3)TCP FIN、Xmas或NULL (stealth) 扫描。   (4)TCP ftp proxy (bounce attack) 扫描。   (5)使用IP分片包的SYN/FIN扫描。   (6)TCP ACK和Window扫描。   (7)UDP raw ICMP port unreachable扫描。   (8)ICMP ping扫描。   (9)TCP ping扫描。   (10)Direct (non portmapper) RPC扫描。   (11)通过TCP/IP堆栈探测远程主机操作系统和Reverse-ident扫描等。   2)SuperScan   SuperScan(见图3.2)是一款Windows平台上的具有TCP connect端口扫描、ping和域名解析等功能的工具,能较容易地做到对指定范围内的IP地址进行ping和端口扫描。 图3.2 SuperScan主界面   SuperScan的功能如下。   (1)通过ping来检验IP是否在线。   (2)IP和域名相互转换。   (3)检验目标计算机提供的服务类别。   (4)检验一定范围的目标计算机是否在线和端口情况。   (5)工具自定义列表检验目标计算机是否在线和端口情况。   (6)自定义要检验的端口,并可以保存为端口列表文件。   (7)SuperScan自带一个木马端口列表trojans.lst,通过这个列表可以检测目标计算机是否有木马,也可以自己定义修改这个木马端口列表。   3)Wireshark   Wireshark(见图3.3)是一个网络封包分析软件,其功能是截取流经本地网卡的数据流量进而对其进行分析。通常的应用包括网络管理员用来解决网络问题,网络安全工程师用来检测安全隐患,开发人员用来测试协议执行情况,读者用来学习网络协议。 图3.3 Wireshark主界面   图形界面的Wireshark使用十分便捷,选取监听的网卡之后,主界面中会显示所有的数据流量。双击任意条目,则可以根据协议的层次拆分该数据流。Wireshark内置了基本的网络协议,可以方便地查询包括但不局限于IP、TCP、UDP、HTTP、FTP和SMB等常见的协议内容。 3.2.2 漏洞扫描   系统安全漏洞也称为系统脆弱性(vulnerability),是系统缺陷和不足。管理人员可以通过漏洞扫描对所管理的系统和网络进行安全审计,检测系统中的安全脆弱环节,所以也称为网络安全扫描。攻击者则可以通过漏洞扫描找到入侵攻击的缺口实施攻击。   常言道:“苍蝇不叮无缝的蛋。”对于信息系统的攻击基本上都是利用系统的漏洞进行的。非法用户可利用系统安全漏洞获得计算机系统的额外权限,在未经授权的情况下访问或提高其访问权,危害计算机系统的正常运行。   攻击者扫描到系统的漏洞,测试出目标主机的漏洞信息后,往往会先通过使用插件(功能模块技术)进行模拟攻击,或者采用漏洞库的匹配方法,制定出攻击的策略。网络管理者也会针对这些漏洞制定相关对策。   1. 系统安全漏洞的类型   对于漏洞可以从不同的角度进行分类,来讨论它们的特点。   1)基于触发主动性的漏洞分类   (1)主动触发漏洞。该漏洞可以被攻击者直接用于攻击,如直接访问他人计算机。   (2)被动触发漏洞。这种漏洞必须要有计算机操作人员配合才能起作用。例如,攻击者给某人发一封带有特殊的jpg图片文件的邮件,接收者只有打开该图片文件,才会导致某个漏洞被触发,使系统被攻击;若接收者不看这个图片,则不会受攻击。   2)基于发现时间的漏洞分类   (1)已发现很久的漏洞。厂商发布补丁或修补方法已经有一段时间,广为知晓。由于很多人已经进行了修补,因此宏观危害较小。   (2)刚发现的漏洞。厂商刚发布补丁或修补方法,知道的人还不多。这种漏洞相对于已发现很久的漏洞危害性较大,若此时使用蠕虫或傻瓜化程序,就会导致大批系统受到 攻击。   (3)0day漏洞。还没有公开,或因私下交易而形成的漏洞。这类漏洞会导致目标受到精确攻击,危害非常大。   3)基于系统或部位的漏洞分类   (1)操作系统漏洞。指计算机操作系统本身所存在的问题或技术缺陷。操作系统产品提供商通常会定期对已知漏洞发布补丁程序提供修复服务。   (2)Web服务器漏洞。主要包括物理路径泄露、CGI源代码泄露、执行任意命令、缓冲区溢出、拒绝服务、SQL注入、条件竞争和跨站脚本执行漏洞。   (3)不同服务相互感染漏洞。有时候在一台服务器上会运行多种网络服务,如Web服务、FTP服务等。这就很可能会造成服务之间的相互感染,攻击者只要攻击一种服务,就可以利用相关的技术作为平台,攻陷另一种服务。   (4)数据库服务器漏洞。如某些数据库服务器在处理请求数据时存在缓冲区溢出漏 洞,远程攻击者可能利用此漏洞控制服务器,向数据库服务器发送畸形请求触发漏洞,最终导致执行任意指令。   (5)应用程序漏洞。这种漏洞由应用程序编写时的错误导致。目前,大部分应用程序都有数百万行代码。但人们只需要几分钟就可以开启后门或者安放“定时炸弹”。   (6)内存覆盖漏洞。内存覆盖漏洞主要为内存单元可指定,写入内容可指定。这样就能执行攻击者想执行的代码(如缓冲区溢出漏洞、格式化字符串漏洞、PTrace漏洞、Windows 2000的硬件调试寄存器用户可写漏洞)或直接修改内存中的机密数据。   4)基于成因的漏洞分类   (1)操作性漏洞。操作性漏洞可以分为写入内容被控制和内容信息被输出两种情形。   写入内容被控制导致可伪造文件内容、权限提升或直接修改重要数据(如修改存贷数据)。内容信息被输出包含内容被打印到屏幕、记录到可读的日志文件、产生可读的core文件等。   (2)配置漏洞。可以分为系统配置漏洞和网络结构配置漏洞两种。   系统配置漏洞多源于管理员疏漏,如共享文件配置漏洞、服务器参数配置漏洞、使用默认参数配置的漏洞等。网络结构配置漏洞多与网络拓扑结构有关,如将重要设备与一般设备设置在同一网段等。   (3)协议漏洞。这种漏洞主要源于Internet上的现行协议在设计之初仅考虑了效率和可靠性,没有考虑安全性。这类漏洞很多。后面将要介绍的ARP欺骗、IP源地址欺骗、路由欺骗、TCP会话劫持、DNS欺骗和Web欺骗等都是由于协议漏洞引起的。此外还有UDP Flood(循环)攻击(基于UDP端口漏洞)、SYN Flood攻击、Land攻击、Smurt攻击、WinNuke攻击、Fraggle攻击和Ping to death攻击等都源于相关协议漏洞。   (4)程序漏洞。程序漏洞缘于程序设计的复杂性、程序设计语言的漏洞和运行环境的不可预见性。下面是一些常见的程序漏洞。 * 缓冲区溢出漏洞。 * 格式字符串漏洞。 * BIND漏洞。 * Finger漏洞。 * SendMail漏洞。   2. 常用的漏洞扫描器   目前已经开发出了大量的扫描器。下面仅列举几例。   1)ISS/SAFESuite(应用层风险评估工具)   ISS(Internet Security Scanner)始于1992年,最初由Christopher Klaus发布,是一个小小的开放源代码扫描器,但功能强大,不过价格也昂贵。   它可以用来检查使用TCP/IP网络连接的主机是否会受到攻击,可以扫描以下漏洞。   (1)一些默认的包头,如是否存在guest、bbs等。   (2)IP包头。   (3)Decode Alias。   (4)Sendmail。   (5)匿名FTP。   (6)NIS、NFS、rusers。   SAFESuite是ISS的最新版本,功能更强,效率更高,不仅可以运行在UNIX下,还可以运行在Windows下。它不仅能广泛检查各种服务,还能对所发现漏洞提供位置信息、有关描述和正确的应对建议。   2)Nessus   Nessus(见图3.4)是一款可以运行在Linux、BSD、Solaris以及其他一些系统上的远程漏洞扫描与分析软件,它采用B/S架构的方式安装,以网页的形式向用户展现。用户登录之后可以指定对本机或者其他可访问的服务器进行漏洞扫描。Nessus的扫描程序与漏洞库相互独立,因而可以方便地更新其漏洞库,同时提供多种插件的扩展和一种语言NASL(Nessus Attack Scripting Language)用来编写测试选项,极大地方便了漏洞数据的维护、更新。在扫描完成后,Nessus还可以生成详尽的用户报告,包括脆弱性、漏洞修补方法以及危害级别等,以方便后续加固工作。 图3.4 Nessus主界面   3)Mysfind   Mysfind是著名的扫描器pfind的加强版,主要用于扫描Printer漏洞和Unicode漏洞。Printer漏洞可以让攻击者取得系统的控制权,Unicode漏洞可以让攻击者随意操作系统内的文件甚至完全控制系统。它采用多线程扫描系统漏洞,速度快,结果准。   Mysfind是一个命令行程序,格式如下。    sfind 漏洞类型 开始IP地址 结束IP地址      它有3种扫描方式。   -all:扫描所有漏洞。   -e:扫描Printer漏洞,可以让攻击者取得系统的控制权。   -u:扫描Unicode漏洞,可以让攻击者随意操作计算机内的文件甚至完全控制系统。   扫描结束以后,结果自动保存在sfind.txt文件中。   4)X-Scan   X-Scan能够扫描大范围网段中存在漏洞的主机。它采用多线程方式对指定IP地址(或单机)进行安全漏洞检测,支持插件功能,可以在图形和命令两种界面下操作,扫描内容包括远程操作系统类型及版本、标准端口状态、端口BANNER信息、SNMP信息、CGI漏洞、IIS漏洞、RPC漏洞、SQL-Server、FTP-Server、SMTP-Server、POP3-Server、NT-Server和注册表信息等。   5)Zenoss   Zenoss是商业服务器监控工具Zenoss Enterprise的一个开源版本,全部用Python语言编写。它支持Nagios plugin format(Nagios插件格式),所以许多Nagios的插件也可以用于Zenoss。Zenoss的一个突出的地方是它强大而又容易使用的用户接口。   6)AppScan   AppScan是IBM公司推出的一款Web应用安全测试工具,它采用黑盒测试的方式,可以扫描常见的Web应用安全漏洞。   7)Nikto   Nikto是一款非常全面的Web扫描器,能在200多种服务器上扫描出2000多种有潜在危险的文件、CGI及其他问题。它也使用LibWhisker库,但通常比Whisker更新得更为频繁。   8)N-Stealth   N-Stealth是ZMT公司出品的一款商业的Web站点安全扫描软件,同时也有可以免费使用的版本,只是功能没有商业版本的多,漏洞库也不支持自动更新。 3.2.3 口令攻击   口令机制是资源访问的第一道关口。攻破了这道关口,就打开了进入系统的第一道大门。所以口令攻击是入侵者最常用的攻击手段。口令攻击可以从破解口令和屏蔽口令保护两个方面进行。下面主要介绍口令破解技术。   1. 口令攻击的基本技术   1)口令字典猜测破解法   攻击者基于某些知识,编写出口令字典,然后对字典进行穷举或猜测攻击。表3.1为口令字典的构造方法。 表3.1 口令字典的构造方法 序号 口 令 类 型 实 例 序号 口 令 类 型 实 例 1 规范单词 computer 14 动词变化 see, sees, saw, seen 2 反写规范单词 retupmoc 15 复数 books 3 词首正规大写 Computer 16 法律用语 legal 4 反拼写与反大写 computeR 17 地名(城/街/山/河等) BeiJing 5 缩写 TCP 18 生物词汇 Dog 6 带点缩写 T.C.P 19 医药词汇 vitamin 7 缩写后带点 TCP. 20 技术词汇 Ruter 8 略写 etc. 21 商品 beer 9 专有名词缩写,带点 Ph.D 22 用户标识符 woodc 10 专有名词缩写,不全大写 kHz 23 反写用户标识符 cdoow 11 姓 Bush 24 串接用户标识符 woodc-woodc 12 名 Tom 25 截短用户标识符 woo 13 所有格 Bob’s 26 串接用户标识符并截短 woodcwood 续表 序号 口 令 类 型 实 例 序号 口 令 类 型 实 例 27 单字符构成串 bbbbbb 32 邮政编码 214036 28 键盘字母 asdfgh 33 证件号码 20010612345 29 文化名人 Beethoven 34 门牌号码 AB3579 30 年月日 040723 35 车牌号码 苏-w12345 31 电话号码 5863583      目前,Internet上已经提供了一些口令字典,从一万到几十万条,可以下载。此外,还有一些可以生成口令字典的程序。利用口令字典可以通过猜测方式进行口令破解攻击。   2)穷举破解法   有人认为使用足够长的口令或者使用足够完善的加密模式,计算机就不会被攻破。事实上没有攻不破的口令,这只是个时间问题。如果有速度足够快的计算机能尝试字母、数字、特殊字符的所有组合,将最终能破解所有的口令。这种类型的攻击方式通过穷举口令空间获得用户口令,称为穷举破解法或蛮力破解,也称为强行攻击。例如,先从字母a开始,尝试aa、ab、ac…,然后尝试aaa、aab、aac…。   3)组合破解法   词典破解法只能发现词典单词口令,但是速度快。穷举破解法能发现所有的口令,但是破解时间很长。鉴于很多管理员要求用户使用字母和数字,用户的对策是在口令后面添加几个数字,例如把口令computer变成computer99,这时使用强行破解法非常费时间。由于实际的口令常常很弱(可以通过对字典或常用字符列表进行搜索或经过简单置换而发现的口令),这时可以基于词典单词而在单词尾部串接几个字母和数字,这就是组合破解法。   4)其他破解类型   (1)社会工程学:通过对目标系统的人员进行游说、欺骗、利诱,获得口令或其部分。   (2)偷窥:观察别人输入口令。   (3)搜索垃圾箱。   2. 口令破解工具   1)Cain & Abel(穷人的L0phtCrack)   类别:免费。   平台:Windows。   简介:Cain & Abel是一个针对Windows操作系统的免费口令恢复工具。它通过如下多种方式轻松地实现口令恢复:网络嗅探、破解加密口令(使用字典或强行攻击)、解码被打乱的口令、显示口令框、显示缓存口令和分析路由协议等。该工具的源代码不公开。   2)DSniff(一流的网络审计和渗透测试工具)   类别:开放源码。   平台:Linux/BSD/UNIX/Windows。   简介:DSniff是由Dug Song开发的一套包含多个工具的软件套件。其中,dsniff、 filesnarf、mailsnarf、msgsnarf、rlsnarf和webspy可以用于监视网络上的数据(如口令、 E-mail、文件等),arpspoof、dnsspoof和macof能很容易地截取到攻击者通常难以获取的网络信息(如二层交换数据),sshmitm和webmitm则能用于实现重写SSH和HTTPS会话达到monkey-in-the-middle攻击。   3)John the Ripper(格外强大、灵活、快速的多平台哈希口令破解器)   类别:开放源码。   平台:Linux/BSD/UNIX/Windows。   简介:John the Ripper是一个快速的口令破解器,支持多种操作系统,如UNIX、DoS、Win32、BeOS和OpenVMS等。它设计的主要目的是用于检查UNIX系统的弱口令,支持几乎所有UNIX平台上经crypt函数加密后的口令哈希码,也支持Kerberos AFS和Windows NT/2000/XP LM哈希码等。   4)L0phtCrack 4(Windows口令审计和恢复程序)   类别:商业。   平台:Linux/BSD/UNIX/Windows。   简介:L0phtCrack从独立的Windows NT/2000工作站、网络服务器、主域控制器或 Active Directory上正当获取或者从线路上嗅探到的加密哈希值里破解出Windows口令,含有词典攻击、组合攻击、强行攻击等多种口令猜解方法。   5)网络刺客   网络刺客是一个强大的网络安全工具,扫描只是其中的一个功能。它的扫描功能包括共享扫描、端口扫描和口令扫描猜测等。 3.3 欺骗型攻击   在网络环境下,通信主体之间的认证也是基于数字进行的。这种非直接的认证为欺骗(Spoofing)提供了机会。广义地说,网络欺骗泛指在网络环境下,攻击者冒充已经建立了信任关系的对象中的一方,对另一方进行欺骗,获取有用资源的行为。一般说来,网络欺骗是针对网络协议漏洞实施的。本节讨论几种常见的欺骗型攻击的原理和手段。 3.3.1 ARP欺骗——交换网络监听   在1.2.3节中介绍了共享网络中的窃听问题。但是,现在以太网已经从共享进入到交换时代。交换式网络不是共享网络,交换式设备可以准确地将数据报文发给目的主机。这时,在交换网络中,能够直接收听的是群发帧和广播帧,无法直接实施广泛监听。   在这种环境下,由于一个局域网上发往其他网络的数据帧的目标地址都是指向网关的,因此实施监听的一个简单的方法是将安装有Sniffer软件的计算机伪装成为网关。这就是地址解析协议(Address Resolution Protocol,ARP)欺骗窃听。   1.ARP欺骗窃听原理   ARP是一个将32位的IP地址翻译成48位MAC地址的协议。图3.5是ARP的请求和应答分组格式。 图3.5 ARP的请求和应答分组格式   ARP协议是一个无状态的协议,一旦收到ARP应答报文,就会对其高速缓存中的IP地址到MAC地址的映射记录进行更新,而不会关心之前是否发出过ARP请求。ARP欺骗的核心就是向目标主机发送一个包含伪造的IP-MAC映射信息的ARP应答报文。当目的主机收到此应答报文后就会更新其ARP高速缓存,从而使目标主机将报文发送给错误的对象。这种攻击也称为中间人攻击。   所谓中间人攻击,就是使进行监听的主机插入到被监听主机与其他网络主机之间,利用ARP欺骗进行攻击,造成进行监听的主机成为被监听主机与其他网络主机通信的中继。如图3.6所示,当主机A要给主机B发送IP包时,在包头中需要填写B的IP为目标地址,并且这个IP包在以太网上传输的时候,还需要进行一次以太包的封装,即填入B的MAC地址。但是A是不知道B的MAC地址的。为了获得B的MAC地址,A就广播一个ARP请求包,请求包中填有B的IP地址,以太网中的所有计算机都会接收这个请求,而正常的情况下只有B会给出ARP应答包,包中就填充上了B的MAC地址,并回复给A。A得到ARP应答后,将B的MAC地址放入本机缓存,便于下次使用,或者更新已有的ARP 缓存。 图3.6 ARP欺骗窃听   由于ARP并不只在发送了ARP请求后才接收ARP应答,这就会使入侵者有机可乘。例如,局域网中的主机C可能会冒充主机B向A发送一个伪造的ARP应答,应答中的IP地址为B的IP地址,而MAC地址是主机C的MAC地址(也可以是另外的主机D的MAC地址),则当A接收到C伪造的ARP应答后,就会更新本地的ARP缓存,这样A就会把发向B的数据包发送到同一物理网的主机C(或D)。这样,C就是插入的A和B之间的进行攻击的主机。   2.ARP欺骗窃听防范   1)采用静态ARP   指定静态ARP,即将IP地址与MAC地址绑定。大多数UNIX系统支持ARP读取指定的IP和MAC地址对应文件,首先编辑内容为IP和MAC地址对照的文件,然后使用命令arp -f /path/to/ipandmacmapfile读取文件,这样就指定了静态的ARP地址,即使接收到ARP应答,也不会更新自己的ARP缓存,从而使ARP欺骗丧失作用。   Windows系统没有-f这个参数,但有-s参数,可以用命令行指定IP和MAC地址对照关系,如arp -s 192.168.1.33 00-90-6d-f2-24-00。但除了Windows XP外,其他版本的Windows平台即使这样做,当接收到伪造的ARP应答后,依然会更新自己的ARP缓存,用新的MAC地址替换掉旧的MAC地址,所以无法对抗ARP欺骗。而且采用静态ARP有一个缺憾,就是如果网络很大的话,工作量会非常大。   2)ARP监听检测   首先,借助检测IP地址和MAC地址对应的工具,如arpwatch,安装了arpwatch的系统在MAC地址发生变化时会在系统的日志文件中看到如下提示。    Apr 21 23:05:00 192.168.1.35 arpwatch:flip flop 192.168.1.33 0:90:6d:f2:24:0 (8:0:20:c8:fe: 15) Apr 21 23:05:02 192.168.1.35 arpwatch:flip flop 192.168.1.33 8:0:20:c8:fe:15 (0:90:6d:f2: 24:0) Apr 21 23:05:03 192.168.1.35 arpwatch:flip flop 192.168.1.33 0:90:6d:f2:24:0 (8:0:20:c8:fe: 15)      从提示中可以看出,arpwatch检测到了网关MAC地址发生了改变。   其次,借助一些入侵检测系统,如Snort,也可以起到一定的检测作用。在Snort的配置文件中打开arpspoof的preprocessor开关并进行配置即可。   3)数据加密   数据加密可以使攻击者即使窃听到,也无法了解内容。   3. 监听器   监听器(Sniffer)是一种用于捕获网络报文的软件,可以用来进行网络流量分析,找出网络中潜在问题,确定在通信所使用的多个协议中属于不同协议的流量大小,哪台主机承担主要协议的通信,哪台主机是主要的通信目的地,报文发送的时间是多少,主机间报文传送的时间间隔等,是网络管理员的一种常用工具。   监听器只是接收数据,而不向外发送数据,从而能悄无声息地监听到所有局域网内的数据通信,其潜在危害性也在于此。   下面介绍几种常用的监听器。   1)Sniffer Pro   Sniffer Pro是NAI公司开发的一种图形界面嗅探器。它功能强大,能全面监视所有网络信息流量,识别和解决网络问题,是目前唯一能够为七层OSI网络模型提供全面性能管理的工具。   2)Libpcap/Winpcap   Libpcap是Packet Capture Library(数据包捕获函数库)的缩写与重组。它不是一个监听器,但是它提供的C语言函数接口可用于对经过网络接口的数据包的捕获,以支持监听器产品的开发。   Winpcap是Libpcap的Win32版本。   3)Dsniff   Dsniff是Dug Song编写的一个功能强大的工具软件包,可以支持多种协议类型,包括FTP、Telnet、rlogin、Ldap、SMTP、POP、IMAP、IRC、ICQ、MS-CHAP、Npster、Citrix、ICA、PCAnywher、SNMP、OSPF、PPTP、X11、NFS、RIP、VRRP、Microsoft SQL Protocol等。   4)Tcpdump/Windump   Tcpdump是一个传统的嗅探器,通过将网卡设置为混杂模式截取帧进行工作。   4.ARP监听软件arpspoof   arpspoof是Dsniff中的一个组件,是一个基于ARP理论的网络监听程序,它的工作原理是这样的:发起ARP欺骗的主机向目标主机发送伪造的ARP应答包,骗取目标系统更新ARP表,将目标系统的网关的MAC地址修改为发起ARP欺骗攻击的主机MAC地址,使数据包都经由发起ARP欺骗的主机。这样即使系统连接在交换机上,也不会影响对数据包的截取,由此就轻松地通过交换机实现了网络监听。例如,主机A和B连接在交换机的同一个VLAN(虚拟局域网)上。   A主机的IP地址为192.168.1.37。   B主机的IP地址为192.168.1.35,MAC地址为08-00-20-c8-fe-15。   网关的IP地址为192.168.1.33,MAC地址为00-90-6d-f2-24-00。   (1)在A主机上看到A主机的ARP表:    C:>arp -a nbsp; Interface:192.168.1.37 Internet Address Physical Address Type 192.168.1.33 00-90-6d-f2-24-00 dynamic      可以看到A主机中保留着网关的IP地址192.168.1.33和对应的MAC地址00-90-6d-f2- 24-00。   (2)在B主机上执行arpspoof,将目标指向A主机,宣称自己为网关,如下所示。    HOSTB# arpspoof -t 192.168.1.37 192.168.1.33 8:0:20:c8:fe:15 0:50:ba:1a:f:c0 0806 42:arp reply 192.168.1.33 is-at 8:0:20:c8:fe:15 8:0:20:c8:fe:15 0:50:ba:1a:f:c0 0806 42:arp reply 192.168.1.33 is-at 8:0:20:c8:fe:15 8:0:20:c8:fe:15 0:50:ba:1a:f:c0 0806 42:arp reply 192.168.1.33 is-at 8:0:20:c8:fe:15 8:0:20:c8:fe:15 0:50:ba:1a:f:c0 0806 42:arp reply 192.168.1.33 is-at 8:0:20:c8:fe:15 8:0:20:c8:fe:15 0:50:ba:1a:f:c0 0806 42:arp reply 192.168.1.33 is-at 8:0:20:c8:fe:15 8:0:20:c8:fe:15 0:50:ba:1a:f:c0 0806 42:arp reply 192.168.1.33 is-at 8:0:20:c8:fe:15 8:0:20:c8:fe:15 0:50:ba:1a:f:c0 0806 42:arp reply 192.168.1.33 is-at 8:0:20:c8:fe:15 8:0:20:c8:fe:15 0:50:ba:1a:f:c0 0806 42:arp reply 192.168.1.33 is-at 8:0:20:c8:fe:15 8:0:20:c8:fe:15 0:50:ba:1a:f:c0 0806 42:arp reply 192.168.1.33 is-at 8:0:20:c8:fe:15      可以看到B主机持续向A主机发送ARP回应包,宣称网关192.168.1.33的MAC地址是B主机自己。此时,在A主机上看到ARP表的内容:    C:>arp -a Interface:192.168.1.37 Internet Address Physical Address Type 192.168.1.33 08-00-20-c8-fe-15 dynamic      显然A主机的ARP表已经改变了,网关的MAC地址被更新为B主机的MAC地址。这样,当有数据包发送时,A主机理所当然地会发到其ARP表中网关对应的MAC地址08-00-20-c8-fe-15。可是,A主机却不知道它的数据实际上发送到了一台别有用心的B主机。   (3)但是还不能这样结束。为了让A主机不会有明显的感觉,B主机还必须打开数据 转发。在不同的系统中应使用不同的转发方法: * 在Linux中可以使用sysctl -w net.ipv4.ip_forward=1。 * 在BSD系统可以使用sysctl -w net.inet.ip.forwarding=1。 * 在Solaris系统可以使用ndd -set /dev/ip ip_forwarding=1。   除了这样打开内核的支持外,也可以选用外部的fragrouter等转发软件,如此,就能确保A主机能正常工作了。 3.3.2 IP源地址欺骗   IP有一个缺陷:它只依据IP头中的目的地址发送数据包,而不对数据包中的IP地址进行认证。这个缺陷使任何人不经授权就可以伪造IP包的源地址。IP源地址欺骗就是基于这一点,使攻击者可以假冒他人的IP地址向某一台主机发送数据包,进行攻击。   攻击者使用IP地址欺骗的目的主要有两种。   (1)隐藏自身,对目标主机发送不正常包,使之无法正常工作。   (2)伪装成被目标主机信任的友好主机得到非授权的服务。   1.IP源地址欺骗攻击的基本过程   IP源地址欺骗是冒用别的主机的IP地址来欺骗第三者。假定有两台主机S(设IP地址为201.15.192.11)和T(设IP地址为201.15.192.22),并且它们之间已经建立了信任关系。入侵者X要对T进行IP欺骗攻击,就可以假冒S与T进行通信。   1)确认攻击目标   实行IP源地址欺骗的第一步是确认攻击目标。下面是容易受到电子欺骗攻击的服务类型。   (1)运行Sun RPC(Sun Remote Procedure Call,Sun远程过程调用)的网络设备。   (2)基于IP地址认证的任何网络服务。   (3)提供R系列服务的计算机,如提供rlogin、rsh、rcp等服务的计算机。   其他没有这类服务的系统所受到的IP欺骗攻击虽然也有,但要少得多。   2)使被冒充的主机无法响应目标主机的会话   当X要对T实施IP源地址欺骗攻击时,就要假冒S(称为被利用者)与目标主机T进行通信。但是,X并不是真正的S,而T只向S回送应答包。这样,就有可能使S对T的报文产生反应,而将X暴露。X避免自己暴露的办法是让S瘫痪,使之无法响应目标主机T的数据包。   使S瘫痪的办法是对其实施拒绝服务攻击,例如,通过SYN Flood攻击使之连接请求被占满,暂时无法处理进入的其他连接请求。通常,黑客会用一个虚假的IP地址(可能该合法IP地址的服务器没有开机)向目标主机TCP端口发送大量的SYN请求。受攻击的服务器则会向该虚假的IP地址发送响应。自然得不到回应,得到的是该服务器不可到达的消息。而目标主机的TCP会认为这是暂时的不通,于是继续尝试连接,直到确信无法连接。不过这已经为黑客进行攻击提供了充足的时间。   3)精确地猜测来自目标请求的正确序列数   X为了使自己的攻击不露馅的另一个措施是取得被攻击目标T主机的信任。由于TCP是可靠传输协议,每台主机要对自己发送的所有字节分配序列编号,供接收端确认并据此进行报文装配。在通过三次握手建立TCP连接的过程中,客户端首先要向服务器发送序列号x,服务器收到后通过确认要向客户端送回期待的序列号x+1和自己的序列号。由于序列号的存在,给IP欺骗攻击增加了不少难度,要求攻击者X必须能够精确地猜测出来自目标机的序列号,否则也会露馅。那么,如何精确地猜测来自目标机的序列号呢?这就需要知道TCP序列号的编排规律。   初始的TCP序列号是由tcp_init(?)函数确定的,是一个随机数,并且它每秒钟增加128?000。这表明,在没有连接的情况下,TCP的序列号每9.32 h会复位一次;而有连接时,每次连接把TCP序列号增加64 000。   随机的初始序列号的产生也是有一定规律的。在Berkeley系统中,初始序列号由一个常量每秒钟加1产生。   所以,TCP序列号的估计也并非绝对不可能。但是,除此之外,攻击者还需要估计他的服务器与可信服务器之间的往返时间(RTT)。RTT一般是通过多次统计平均计算出来的。在没有连接的情况下,TCP序列号为128000·RTT;如果目标服务器刚刚建立过一个连接,就还要加上64 000。   上述分析是一种理论上的分析。黑客通常的做法是通过对目标主机的合法连接来获得目标主机发送IP数据包的序列记录,即先请求连接目标主机,等目标主机送回带序列号的回应后,记录序列号并断开连接。   在一般情况下,通过对所记录的序列号的分析,也可以猜测出认证要求序列号的规则。   4)实施欺骗过程   ① 冒充受信主机连接到目标主机。   ② 根据猜出的序列号,向目标主机发送回应IP包。   ③ 进行系列会话。   2.IP源地址欺骗的防范   IP源地址欺骗攻击比较普遍,产生的危害性很大。下面是IP欺骗的一些预防策略。   (1)放弃基于IP地址的信任策略。IP欺骗是基于IP地址信任的。而IP地址很容易伪造。因此,阻止这类攻击的一种非常简单的方法是放弃以IP地址为基础的验证。   (2)使用随机化的初始序列号。序列号是接收方TCP进行合法检查的一个重要依据。黑客攻击能够得逞的一个重要因素就是序列号有一定的选择和增加规律。堵塞这一漏洞的方法就是让黑客无法计算或猜测出序列号。Bellovin提出了一个公式: