发表于:2005-10-18 15:37:00
楼主
二、端口扫描
“端口扫描”(port scanning)是通过连接到目标系统的TCP协议或UDP协议端口,来确定什么服务正在运行。现在有许多人把“端口侦听”与“端口扫描”混为一谈,根本分不清什么样的情况下要用侦听技术,什么样的情况下要用扫描技术。现在的软件也似乎对这两种技术有点模糊了,有的干脆把两个功能都集成在一块。“端口扫描”与“网络扫描”是同一所指,只不过因为“网络扫描”最终还是通过对网络端口的扫描来达到目的,所以也就通俗地称之为“端口扫描”。
1. 端口扫描器的扫描原理
“端口扫描”通常指用同一信息对目标计算机的所有所需扫描的端口进行发送,然后根据返回端口状态来分析目标计算机的端口是否打开、是否可用。“端口扫描”行为的一个重要特征是:在短时期内有很多来自相同的信源地址传向不同的目的地端口的包。
对于用端口扫描进行攻击的人来说,攻击者总是可以做到在获得扫描结果的同时,使自己很难被发现或者说很难被逆向寻踪。为了隐藏攻击,攻击者可以慢慢地进行扫描。除非目标系统通常闲着(这样对一个没有listen()端口的数据包都会引起管理员的注意(这种情况太少见)),有很大时间间隔的端口扫描是很难被识别的。隐藏源地址的方法是发送大量的欺骗性的端口扫描包(1000个),其中只有一个是从真正的源地址来的。这样,即使全部包(1000)都被察觉,被记录下来,也没有人知道哪个是真正的信源地址。能发现的仅仅是“曾经被扫描过”。也正因为这样那些黑客们才乐此不彼地继续大量使用这种端口扫描技术来达到他们获取目标计算机信息、并进行恶意攻击。
通常进行端口扫描的工具目前主要采用的是端口扫描软件,也通称之为“端口扫描器”,端口扫描可以为提供三个用途:
(1)识别目标系统上正在运行的TCP协议和UDP协议服务。
(2)识别目标系统的操作系统类型(Windows 9x, Windows NT,或UNIX,等)。
(3)识别某个应用程序或某个特定服务的版本号。
端口扫描器是一种自动检测远程或本地计算机安全性弱点的程序,通过使用扫描器你可一不留痕迹的发现远程服务器的各种TCP协议端口的分配及提供的服务,还可以得知它们所使用的软件版本!这就能让间接的了解到远程计算机所存在的安全问题。
端口扫描器通过选用远程TCP/IP协议不同的端口的服务,记录目标计算机端口给予的回答的方法,可以搜集到很多关于目标计算机的各种有用信息(比如:是否有端口在侦听?是否允许匿名登陆?是否有可写的FTP目录,是否能用TELNET等。
端口扫描器并不是一个直接攻击网络漏洞的程序,它仅仅能帮助发现目标机的某些内在的弱点。一个好的扫描器还能对它得到的数据进行分析,帮助查找目标计算机的漏洞。但它不会提供一个系统的详细步骤。
端口扫描器在扫描过程中主要具有以下三个方面的能力:
(1) 发现一个计算机或网络的能力;
(2) 一旦发现一台计算机,就有发现目标计算机正在运行什么服务的能力;
(3) 通过测试目标计算机上的这些服务,发现存在的漏洞的能力。
编写扫描器程序必须要很多TCP/IP协议程序编写和C,Perl和或SHELL语言的知识。需要一些Socket编程的背景,一种在开发客户/服务应用程序的方法。
2 目前主流的端口扫描技术
目前主要的端口扫描技术有以下几种:
(1). TCP connect Scan
这种方法最简单,直接连到目标端口并完成一个完整的三次握手过程(SYN, SYN/ACK, 和ACK)。操作系统提供的“connect()”函数完成系统调用,用来与每一个感兴趣的目标计算机的端口进行连接。如果端口处于侦听状态,那么“connect()”函数就能成功。否则,这个端口是不能用的,即没有提供服务。这个技术的一个最大的优点是不需要任何权限,系统中的任何用户都有权利使用这个调用。另一个好处是速度。如果对每个目标端口以线性的方式,使用单独的“connect()”函数调用,那么将会花费相当长的时间,你可以通过同时打开多个套接字,从而加速扫描。使用非阻塞I/O允许你设置一个低的时间用尽周期,同时观察多个套接字。但这种方法的缺点是很容易被发觉,并且很容易被过滤掉。目标计算机的日志文件会显示一连串的连接和连接是出错的服务消息,目标计算机用户发现后就能很快使它关闭。
(2). TCP SYN Scan
这种技术也叫“半开式扫描”(half-open scanning),因为它没有完成一个完整的TCP协议连接。这种方法向目标端口发送一个SYN分组(packet),如果目标端口返回SYN/ACK标志,那么可以肯定该端口处于检听状态;否则,返回的是RST/ACK标志。这种方法比第一种更具隐蔽性,可能不会在目标系统中留下扫描痕迹。但这种方法的一个缺点是,必须要有root权限才能建立自己的SYN数据包。
(3). TCP FIN Scan
这种方法向目标端口发送一个FIN分组。按RFC793的规定,对于所有关闭的端口,目标系统应该返回一个RST(复位)标志。这种方法通常用在基于UNIX的TCP/IP协议堆栈,有的时候有可能SYN扫描都不够秘密。
一些防火墙和包过滤器会对一些指定的端口进行监视,有的程序能检测到这些扫描。相反,FIN数据包可能会没有任何麻烦的通过。这种扫描方法的思想是关闭的端口会用适当的RST来回复FIN数据包。另一方面,打开的端口会忽略对FIN数据包的回复。这种方法和系统的实现有一定的关系,有的系统不管端口是否打开,都回复RST,这样,这种扫描方法就不适用了。并且这种方法在区分Unix和NT时,是十分有用的。
(4). IP Scan
这种方法并不是直接发送TCP协议探测数据包,而是将数据包分成两个较小的IP协议段。这样就将一个TCP协议头分成好几个数据包,从而过滤器就很难探测到。但必须小心,一些程序在处理这些小数据包时会有些麻烦。
(5). TCP Xmas Tree Scan
这种方法向目标端口发送一个含有FIN(结束), URG(紧急)和PUSH(弹出)标志的分组。根据RFC793,对于所有关闭的端口,目标系统应该返回RST标志。
(6). TCP Null Scan
这种方法向目标端口发送一个不包含任何标志的分组。根据RFC793,对于所有关闭的端口,目标系统应该返回RST标志。
(7). UDP Scan
这种方法向目标端口发送一个UDP协议分组。如果目标端口以“ICMP port unreachable”消息响应,那么说明该端口是关闭的;反之,如果没有收到“ICMP port unreachable”响应消息,则可以肯定该端口是打开的。由于UDP协议是面向无连接的协议,这种扫描技术的精确性高度依赖于网络性能和系统资源。另外,如果目标系统采用了大量分组过滤技术,那么UDP协议扫描过程会变得非常慢。如果你想对Internet进行UDP协议扫描,那么你不能指望得到可靠的结果。
(8). UDP recvfrom()和write() 扫描
当非root用户不能直接读到端口不能到达错误时,Linux能间接地在它们到达时通知用户。比如,对一个关闭的端口,第二个write()调用将失败。在非阻塞的UDP协议套接字上调用recvfrom()时,如果ICMP出错还没有到达时回返回“EAGAIN”(重试)。如果ICMP到达时,返回“ECONNREFUSED”(连接被拒绝)。这是用来查看端口是否打开的技术。