1:扫描工具究竟是什么?
信息收集是入侵及安全状况分析的基础,传统地手工收集信息耗时费力,于是扫描工具出现了,它能依照程序设定自动探测及发掘规则内的漏洞,是探测系统缺陷的安全工具。
扫描器主要分主机扫描器及网络扫描器两大类型:
系统扫描器用于扫描本地主机,查找安全漏洞,查杀病毒,木马,蠕虫等危害系统安全的恶意程序,此类非本文重点,因此不再详细分析
网络扫描器通过网络来测试主机安全性,它检测主机当前可用的服务及其开放端口,查找可能被远程试图恶意访问者攻击的大量众所周知的漏洞,隐患及安全脆弱点。甚至许多扫描器封装了简单的密码探测,可自设定规则的密码生成器、后门自动安装装置以及其他一些常用的小东西,这样的工具就可以称为网络扫描工具包,也就是完整的网络主机安全评价工具[比如鼻祖SATAN和国内最负盛名的流光]
另外还有一种相对少见的数据库扫描器,比如ISS公司的 Database Scanner,工作机制类似于网络扫描器 ,主要用于检测数据库系统的安全漏洞及各种隐患。
2:扫描器究竟能干什么?
[1] 端口及服务检测 检测 目标主机上开放端口及运行的服务,并提示安全隐患的可能存在与否
[2] 后门程序检测 检测 PCANYWAY VNC BO2K 冰河等等远程控制程序是否有存在于目标主机
[3] 密码探测 检测 操作系统用户密码,FTP、POP3、Telnet等等登陆或管理密码的脆弱性
[4] 应用程序安全性探测 检测 CGI漏洞,WEB服务器[IIS,APACHE等],FTP服务器等的安全漏洞
[5] D.o.S探测 检测 各种拒绝服务漏洞是否存在
[6] 系统探测 检测 系统信息比如NT 注册表,用户和组,网络情况等
[7] 输出报告 将检测结果整理出清单报告给用户,许多扫描器也会同时提出安全漏洞解决方案
[8] 用户自定义接口 一些扫描器允许用户自己添加扫描规则,并为用户提供一个便利的接口,比如俄罗斯SSS的Base SDK
3:什么人经常使用/需要使用这种工具?
以提供安全检测服务的安全公司的技术员在得到客户授权后,需要使用扫描工具来对客户的主机进行漏洞发掘,查点工作,在对主机彻头彻尾检查过之后,才能完成他的工作--提交给客户关于主机完整详细的安全解决方案
网络上常流窜着许多精力过剩的脚本小子[Script kiddie],他们的主要工作[当然,也是他们的娱乐]就是在网络上四处搜寻一些公开的exploit信息,然后通过搜索引擎等WEB工具,匹配特殊的字符串来搜索存在这些漏洞的主机,以进行他们的游戏,在这个过程中扫描工具绝对是他们的一大帮凶,没有扫描工具的协助,他们很可能不能如此迅速[对一些脚本小子来说,没有了扫描工具意味着无法进行入侵行动]地进入你的主机!
可见,存在于网络上的扫描工具亦正亦邪,关键在于使用它们的人的动机。
4:在进一步了解扫描技术之前我该知道什么?
当然,必须有必要的网络基础知识,我假设看到这篇文章的读者均已经了解了TCP/IP协议最基础的一些东西,比如协议层和其性质等等
下面让我们来复习一下TCP数据包包头的结构,之后的原理介绍将牵涉到其中的内容,而且这些东西估计许多人都记不住:)
TCP数据包包头有6个位,FIN、SYN、PSH、RST、ACK和URG
ACK 置1,表示确认号有效;清0,表示数据包中不包含确认,确认号域将被忽略
PSH 表示数据包的接受者将收到的数据直接交给应用程序,而不是把它放在缓冲区,等缓冲区满才交给应用程序。这常用于实时通信。
RST 用来重置一个连接。用于一台主机崩溃或者其他原因引起的通信混乱。它也被用来拒绝接受一个无效的TCP数据包,或者用来拒绝一个建立连接的企图。当得到一个置RST位的TCP数据包时,通常说明本地机器有点问题。
SYN 用来建立一个连接。在请求连接的数据包中,SYN=1、ACK=0 指明确认域没有使用,对连接请求需要应答,所以,在应答的TCP数据包中SYN=1、ACK=1。SYN通常被用来指明请求连接和请求被接受。而用ACK来区分这两种情况。
FIN 用来释放一个连接。它指出发送者已无数据要发送。不过关闭一个连接后,进程还可以继续接收数据。SYN和FIN的TCP数据包都有序列号。因此这样可保证数据按正确的顺序被接收并处理。
5:扫描工具的扫描原理和它们的隐蔽性如何?
TCP connect : 这种类型就是最传统的扫描技术,程序调用connect()套接口函数连接到目标端口,形成一次完整的TCP三次握手过程,显然能连接得上的目标端口就是开放的。在UNIX下使用这种扫描方式不需要任何权限。还有一个特点,它的扫描速度非常快,可以同时使用多个socket来加快扫描速度,使用一个非阻塞的I/O调用即可以监视多个 socket. 不过由于它不存在隐蔽性,所以不可避免的要被目标主机记录下连接信息和错误信息或者被防护系统拒绝
TCP SYN : 这种类型也称为半开放式扫描[half-open scanning] 原理是往目标端口发送一个SYN包,若得到来自目标端口返回的SYN/ACK响应包,则目标端口开放,若得到RST则未开放。在UNIX下执行这种扫描必须拥有ROOT权限。由于它并未建立完整的TCP三次握手过程,很少会有操作系统记录到,因此比起 TCP connect 扫描隐蔽得多,但是若你认为这种扫描方式足够隐秘,那可就错了,有些防火墙将监视TCP SYN扫描,还有一些工具比如synlogger和courtney也能够检测到它。为什么?因为这种秘密扫描方法违反了通例,在网络流量中相当醒目,正是它的刻意追求隐蔽特性留下了狐狸尾巴!
TCP FIN : 原理:根据RFC 793文档 程序向一个端口发送FIN,若端口开放则此包将被忽略,否则将返回RST,这个是某些操作系统TCP实现存在的BUG,并不是所有的操作系统都存在这个BUG,所以它的准确率不高,而且此方法往往只能在UNIX上成功地工作,因此这个方法不算特别流行。不过它的好处在于足够隐蔽,如果你判断在使用TCP SYN 扫描时可能暴露自身的话可以一试这种方法。
TCP reverse ident 扫描:1996年 Dave Goldsmith 指出 ,根据RFC1413文档,ident协议允许通过TCP连接得到进程所有者的用户名,即使该进程不是连接发起方。此方法可用于得到FTP所有者信息,以及其他需要的信息等等。
TCP Xmas Tree 扫描 :根据RFC 793文档,程序往目标端口发送一个FIN 、URG和PUSH包,若其关闭,应该返回一个RST包
TCP NULL 扫描 :根据RFC 793文档,程序发送一个没有任何标志位的TCP包,关着的端口将返回一个RST数据包。
TCP ACK 扫描 : 这种扫描技术往往用来探测防火墙的类型,根据ACK位的设置情况可以确定该防火墙是简单的包过滤还是状态检测机制的防火墙
TCP 窗口扫描 : 由于TCP窗口大小报告方式不规则,这种扫描方法可以检测一些类UNIX系统[AIX , FreeBSD等] 打开的以及是否过滤的端口。
TCP RPC 扫描 : 这个方式是UNIX系统特有的,可以用于检测和定位远程过程调用[RPC]端口及其相关程序与版本标号。
UDP ICMP端口不可达扫描:此方法是利用UDP本身是无连接的协议,所以一个打开的UDP端口并不会给我们返回任何响应包,不过如果端口关闭,某些系统将返回ICMP_PORT_UNREACH信息。但是由于UDP是不可靠的非面向连接协议,所以这种扫描方法也容易出错,而且还比较慢。
UDP recvfrom() 和 write() 扫描: 由于UNIX下非ROOT用户是不可以读到端口不可达信息,所以NMAP提供了这个仅在LINUX下才有效的方式。在LINUX下,若一个UDP端口关闭,则第二次write()操作会失败。并且,当我们调用recvfrom()的时候,若未收到ICMP错误信息,一个非阻塞的UDP 套接字一般返回EAGAIN("Try Again",error=13),如果收到ICMP的错误信息,套接字返回ECONNREFUSED("Connectionrefused",error=111)。通过这种方式,NMAP将得知目标端口是否打开 [BTW: Fyodor 先生真是伟大!]
分片扫描: 这是其他扫描方式的变形体,可以在发送一个扫描数据包时,将数据包分成许多的IP分片,通过将TCP包头分为几段,放入不同的IP包中,将使得一些包过滤程序难以对其过滤 ,因此这个办法能绕过一些包过滤程序。不过某些程序是不能正确处理这些被人为分割的IP分片,从而导致系统崩溃,这一严重后果将暴露扫描者的行为!
FTP跳转扫描 : 根据RFC 959文档,FTP协议支持***** [PROXY], 形象的比喻:我们可以连上提供FTP服务的机器A,然后让A向我们的目标主机B发送数据,当然,一般的FTP主机不支持这个功能。我们若需要扫描B的端口,可以使用PORT命令,声明B的某个端口是开放的,若此端口确实开放,FTP 服务器A将返回150和226信息,否则返回错误信息 :"425 Can't build data connection: Connection refused".这种方式的隐蔽性很不错,在某些条件下也可以突破防火墙进行信息采集,缺点是速度比较慢。
ICMP 扫射 不算是端口扫描,因为ICMP中无抽象的端口概念,这个主要是利用PING指令快速确认一个网段中有多少活跃着的主机。
6. 哪些扫描工具比较优秀?
nMAP :世界上最受黑客欢迎的扫描器,能实现秘密扫描、动态延迟、重发与平行扫描、欺骗扫描、端口过滤探测、RPC直接扫描、分布扫描等,灵活性非常好,功能强大 。 官方主页
http://www.insecure.org/nmap/SATAN 扫描器的鼻祖,它采用Perl写的内核,通过PERL调用大量的C语言的检测工具对目标网站进行分析,因此可以嵌入浏览器中使用。
X-scan 国内著名网络安全站点-安全焦点的牛人 glacier [冰河作者,也是知名女黑客wollf的好老公~~:P] 的作品,个人认为作为纯粹的扫描器来说此物胜于小榕的流光。随着版本号提升,性能也越来越优秀,颇有实力和发展潜力的宝贝! 好话不多说,请直接去焦点DOWN!
www.xfocus.net流光 不得不承认这个程序是国内顶尖的扫描工具,整和了强大的破解和攻击成份。不过由于它的封装性太高,不适合学习技术,小榕主页 :
www.netxeyes.comISS ISS公司开发和维护商业性质的漏洞扫描程序,第一个可公开得到的多层次扫描器[虽然不免费],可移植性和灵活性都很好。
其他还有易于使用的CIS[Cerberus Internet Scanner],17岁天才少年开发的基于UNIX的扫描器-Nessus ;俄罗斯程序员开发的SSS, 还有其他各类有特色的扫描器,种类繁多,在此不一一介绍了。
7. 怎样发现和检测扫描?
TCP connect 扫描将直接被主机日志系统记录,后来发展出一些 TCP SYN 等所谓隐秘的扫描手段,但是由于这些隐秘扫描方法实际上是非常规地利用协议,与正常的访问有很大差别,在网络流量中特别醒目,只要安装了对应防护程序,也容易被记录这些扫描,于是事实上还是不够隐秘。目前几乎所有的IDS都能比较准确地检测到系统遭受了网络扫描,因为在网络探测手段中,扫描是最简单粗暴而嘈杂的方法,无异于大摇大摆从正门破门而入的愚蠢的小偷一般。普遍认为,扫描者需要足够的耐心,对同一主机使用缓慢的分布式扫描方法,间隔时间足够让入侵检测系统忽略,不按顺序扫描整个网段,将探测步骤分散在几个会话中,不应该导致系统或网络出现明显异常,不导致日志系统快速增加记录,那么这种扫描将是比较隐秘的。不过早期的IDS是预先定义一个时间段,在这个时间段内如发现了超过某一预订值的连接次数,就认为是端口扫描。对这些比较原始的IDS,缓慢及分布式的扫描隐秘性尚且不错,但若IDS能对收集到的长期数据进行系统分析分析[搭配专家系统],这样即使
缓慢且分布式的扫描也难逃被检测的命运,毕竟扫描是一种主动探测手段,从理论上是无法绝对隐秘的