|
非标准端口服务的识别
摘要
本文主要讨论非标准端口服务的识别的方法,以及它在网络安全评估软件中的应用。本文从攻击者的角度来分析网络安全的评估。
前言:
服务识别在网络安全评估中的作用
非标准端口服务识别的意义
常见服务的识别(被动识别、主动识别)
非标准端口服务识别在安全评测中的应用(构想)
感谢
十分感谢北京工业大学计算机学院的老师给予的指导。感谢我的家人、Ee、我宿舍的同学们在我撰写本文时给予的关照。
词汇表
端口扫描 (Port Scan): 使用端口扫描工具来扫描网络上任意一台主机的任意TCP/UDP端口,以检查其提供了哪些服务,即哪些端口是激活的。
周知端口(Well known ports): 0-1023端口
已定义端口(Registered Ports): 1024-49151端口
动态分配/私有端口(Dynamic and/or Private Ports)49152-65535端口。
服务器程序(Server Program):
主机上运行的一个程序,通过这个程序,主机可以同不同客户机程序的用户进行通信。服务器软件有通信标准,遵从这种标准的客户机程序才能同服务器程序正常通信。
握手(hand shaking): 两个通信设备或软件为建立连接而互相传递信号和确认的过程。
1.前言
从上世纪60年代互联网的前身--ARPANET诞生起,网络就开始向着开放、国际化、自由的方向发展着。以Internet为代表的全球性信息化浪潮日益深刻,信息网络技术的应用正日益普及和广泛。越来越多的大型、重要机构开始通过网络来实现业务和信息共享。随着网络的普及,安全问题成为影响网络效能的重要问题。
在互联网上,每天都要发上数万次以上的攻击事件,或者非授权测试。根据《今日美国报》的报道,黑客每年给全球电脑网络带来数百亿美元的损失。
目前,一般认为,网络存在的威胁主要表现在:
非授权访问:没有预先经过同意,就使用网络或计算机资源被看作非授权访问,如有意避开系统访问控制机制,对网络设备及资源进行非正常使用,或擅自扩大权限,越权访问信息。它主要有以下几种形式:假冒、身份攻击、非法用户进入网络系统进行违法操作、合法用户以未授权方式进行操作等。
信息泄漏或丢失:指敏感数据在有意或无意中被泄漏出去或丢失,它通常包括,信息在传输中丢失或泄漏(如"黑客"们利用电磁泄漏或搭线窃听等方式可截获机密信息,或通过对信息流向、流量、通信频度和长度等参数的分析,推出有用信息,如用户口令、帐号等重要信息。),信息在存储介质中丢失或泄漏,通过建立隐蔽隧道等窃取敏感信息等。
破坏数据完整性:以非法手段窃得对数据的使用权,删除、修改、插入或重发某些重要信息,以取得有益于攻击者的响应;恶意添加,修改数据,以干扰用户的正常使用。
拒绝服务攻击:它不断对网络服务系统进行干扰,改变其正常的作业流程,执行无关程序使系统响应减慢甚至瘫痪,影响正常用户的使用,甚至使合法用户被排斥而不能进入计算机网络系统或不能得到相应的服务。
利用网络传播病毒:通过网络传播计算机病毒,其破坏性大大高于单机系统,而且用户很难防范。
为了保护网络安全,目前通常使用的方法有:安装防火墙(Firewall)、安装入侵检测系统(IDS)、访问控制、加密传输。但是,从某种意义上说,防护永远是被动的、滞后的。新的攻击方法总是在它的防护方法诞生之前就造成了极大破坏。所以,评估网络是否真的安全的方法,不是看他的防护措施有多么多,而是应该站在攻击者的角度,对网络进行真实的、经过授权的攻击测试。
2.服务识别在网络安全评估中的作用
假如从入侵者的角度来评估网络的安全状况,我们可以看到黑客通常的入侵步骤一般是:第一步,收集信息:第二步,收集足够的信息后,扫描目标网络,并且分析其中的安全弱点;第三步,在收集到这些安全弱点的基础上,进攻目标网络;第四步,进攻目标网络后,可以取得足够的权限;第五步,窃取数据或者对系统进行破坏;第六步,打扫战场,把入侵痕迹全部抹去,使被入侵机器的系统管理员没办法追查。第一步,也是最重要的一步--收集信息(Information
gather)中,最常见的方法就是端口扫描。一个端口就是一个潜在的通信通道,也就是一个入侵通道。对目标计算机进行端口扫描,能得到许多有用的信息。
根据RFC1700的规定的已分配端口(the assigned
ports),网络服务和端口是一一对应的。比如FTP服务通常开设在21端口,TELNET服务通常开设在23端口。进行端口扫描,可以快速获得被评估主机开设的服务。当然,如果能直接控制待评估的主机,不通过端口扫描也可以获得开设服务的情况。但是一些隐藏的比较好的后门程序(backdoors),能逃过一般的本地检查。而且,出于安全的考虑,和评估真实性的考虑,通常情况下,不可能直接控制主机。所以,端口扫描是获得主机开设服务的更好的方法。
假如对www.foo.bar扫描的结果如下:
21,22,25,80,110,7626, 端口(TCP端口)开放。通过查RFC1700马上就可以得出结论:该主机开设的服务有:FTP,
SSH,SMTP,HTTP,POP3以及一个未知的服务在7626端口。实际上上面的步骤就是模仿入侵者的第一步--收集信息。现在,已经获得了足够多的信息。作为评估者,我们可以按照现有的针对FTP、SSH、SMTP、HTTP、POP3的漏洞库对该主机进行攻击测试。这样就做到了有的放矢,而不是所有服务的各种漏洞全都一一尝试。先进行信息收集可以节省大量的时间以及网络资源。目前常见的网络安全评估软件,如:ISS、Nessus等都是在做攻击性测试前先做端口扫描。在获得端口列表后,软件自动对应成相应的服务,然后加载相应的测试模块并且进行测试。
3.非标准端口服务识别的意义
刚才提到的www.foo.bar这台主机上有一个未知的服务开设在7626端口。这个端口开放有如下几种可能:
该主机将某服务故意开设到了非标准端口。
该主机被安置了后门程序。
该主机开设了一个RFC1700中未定义的服务。
因为该端口是未定义的,所以,检测者无法通过查RFC1700的方法来直接获得服务。根据规定,49151之下的端口都可以被注册为某种应用所有。7626端口开设的服务,很可能是该主机的安全隐患。为了对该主机做完全的安全测试,我们必须识别7626端口开设的服务。
从另外的角度来看,某些安全意识较强的系统管理员,有可能故意将服务开设到非标准端口,即大于1023的端口。比如将FTP服务开设到21000端口,而不是标准的21端口。这样,一般的用户和技术实力不足的攻击者就不会找到FTP服务,也就无法利用公开的FTP漏洞来进行攻击。同时,这样做从一定程度上也可以限制非授权访问。
但是对于技术实力较强的经验丰富的攻击者来说,他们可以轻松的识别出开设在非标准端口服务。进而,可以做出相应的攻击。对主机进行安全测试,必须要尽量模拟高技术水平的攻击者进行测试。好的安全测试软件也应该具备识别开设在非标准端口服务的能力。所以,识别开设在非标准端口服务是网络安全测试中必不可少的一项。
4.常见服务的识别
每个服务必须要有自己的、唯一的特征标志。否则,客户端软件就无法和服务器软件完成握手和进一步的信息交换。通常情况下,攻击者就是利用这点来识别服务的。以常见的TCP类型服务为例。在完成TCP协议的3次握手后,客户端软件和服务器软件建立了连接(connection)。这时服务器软件可以被分成2种,一种是主动发出握手信息,要求客户端软件回应,另一种等待客户端软件发来命令,直到超时。本文中,将主动发出握手信息的软件称为"主动式服务器软件",等待客户端软件命令的被称为"被动式服务器软件"。
先谈对"主动式服务器软件"的识别。由于主动式服务器软件,在建立连接后,将主动发过来握手信息,或者banner信息,我们只要对这些信息进行处理就能识别出服务的类型,甚至软件的名称和版本号。
常见的"主动式服务器软件"对应的协议有TELNET、SSH、FTP、SMTP、POP3等等。telnet客户端软件一旦和telnet服务器软件建立连接,服务器软件就会发出连续的一串字符,其中第一个字符肯定是ASCII码255。RFC854中定义了握手字符的含义。所有的握手信息都是由IAC(255)开始的。下面是一个telnet握手过程的例子:
->255 253 24 255 253 31 255 253 35 255 253 39 255 253 36
<-255 252 24 255 252 31 255 252 35 255 252 39 255 252 36
->255 254 24 255 254 31 255 254 35 255 254 39 255 254 36
->255 251 1 255 251 3 255 253 1 108 111 103 105 110 58 32
"->"表示的是接收的信息;"<-"表示的是发出的信息。
IAC(255) telnet的控制命令混杂在字节流里面,以这个255表明这是个三元协商队列,后跟verb和option 。verb
有四种类型Do(253) Dont(254) Will(251) Wnot(252). Do/Dont-><-Will/Wnot。
一方用Do向对方发出请求(Request),另一方用Will作答. 如:Client发送IAC DONT
ECHO要求Server不要回显字符,Server用IAC WNOT ECHO作答。 Will/Wnot-><-Do/Dont
一方用Will指定自己(Offer),另一方用Do作答。option 有四种0 二进制传输 1 Echo 3 抑制向前 24 终端类型
。最后的子协商队列以255 250开头 255 240结束。
根据这样的定义,要识别telnet服务器程序,只要在连接后按照telnet的握手规则回复一串字符给服务器端程序就行了。附录中有进行telnet握手的程序。
SSH的识别非常简单。SSH服务器端程序和客户端程序TCP连接建立后,客户端进入等待,服务器向客户端发送第一个报文,宣告自己的版本号,包括协议版本号和软件版本号。协议版本号由主版本号和次版本号两部分组成。它和软件版本号一起构成形如:
"SSH-<主协议版本号>.<次协议版本号>-<软件版本号> "
例如对www.foo.bar进行SSH连接的时候,服务器程序首先发来的是:"SSH-1.99-OpenSSH-2.1 "。
识别SSH服务只需要在连接后接收一下服务器端发来的信息,然后判断是否是"SSH-<数字+点>"的格式就行了。
FTP服务器端软件和客户端软件建立连接后,发来一个banner。通常的banner可能是下面样子的:
220-
220-Welcome to FTP.LIB.PKU.EDU.CN
220-=============================
220-HTTP://FTP.LIB.PKU.EDU.CN
220-HTTP://FTP.LIB.PKU.EDU.CN:81
220-
220-
220 sun3000 FTP server (Version wu-2.6.0(1) Thu Oct 28 12:59:35 CST
1999) ready.
Banner通常都是以220-或者230-开始,而且其中一般都包含"FTP
server"字样。连接之后,服务器主动送来banner,而且这个banner除非修改代码,否则是不可能去掉的。在banner中通常包含了服务器端软件的名称和版本号。所以如果能建立一个常见的软件标示的数据库,并且对banner信息进行分析,就可以得到更多的信息。要判断是否是FTP服务器软件,只要对banner信息进行过滤和处理就行了。
SMTP、POP3服务器软件和FTP服务器软件类似。他们都有一个banner。SMTP的接入过程如下:
服务器:
客户端:
服务器: 220 innosoft.com SMTP service ready
POP3的banner通常是下面的样子:
+OK incore system mail POP3 Server ready
所以,只要仿照识别FTP服务器程序的方法,对SMTP、POP3服务器软件发出的banner进行过滤和处理就可以了。
总之,对于"主动式服务器软件"的识别,只要过滤和处理它发来的banner和握手信息就可以得到服务的名称。如果能有一个软件特称的数据库,那么识别软件的名称和版本也是可以实现的。
对于"被动式服务器软件",连接后服务器软件不主动发出握手信息。要识别服务的名称,必须要模拟客户端软件发出一些命令。最常见的"被动式"的服务是HTTP服务。在HTTP客户端软件与服务器端软件建立连接后,客户端软件通常发出下面的指令:
GET /index.htm HTTP/1.1
HOST: www.foo.bar
服务器端返回的通常是类似下面的数据:
HTTP/1.1 200 OK
Server: Microsoft-IIS/4.0
Date: Mon, 23 Apr 2001 05:20:10 GMT
Content-Type: text/html
Accept-Ranges: bytes
Last-Modified: Mon, 23 Apr 2001 05:20:10 GMT
ETag: W/"0c7c1c78348d71:c6fa"
Content-Length: 3137
下面接的就是html代码。
要识别HTTP服务器软件,只要仿照HTTP客户端软件发送一组命令,接收服务器软件返回的数据,然后进行过滤和处理就可以得到。对于上面提到的"主动式服务器软件",为了保证识别的准确性,也可以采用发送一组命令,接收、处理返回数据的方法来识别。当然,这样做虽然提高了识别的准确性,但是将会大大的降低识别的速度。比如对SMTP服务器软件发送一个"NOOP"命令过去,他将返回"250
Ok"。
综上所述,识别"主动"和"被动"服务都需要首先建立一个服务特征的数据库。这里所说的特征可以是下面的几点:服务器软件banner信息、服务器软件握手信息、服务器软件对特定命令的回应等等。由于大多数网络服务都是基于服务器/客户端模式的,为了建立连接,必须要有明确且唯一的建立连接的格式。或者说,客户端必须能识别出相应的服务器软件,才能与其通信。检测服务的过程实际上就是模仿客户端软件与服务器软件建立连接并通信。由于服务器软件都具有唯一的特征供客户端软件进行识别,所以识别任意一种服务的通常步骤应该是:(主动式服务器软件)连接->接收banner或握手信息->查找数据库并且进行比较->给出结果;(被动式服务器软件)连接->模仿客户端发出一组命令->接收回应->查找数据库并进行比较->给出结果。只要数据库中含有相应服务器软件的资料,并且能保证该资料是服务器软件的唯一特性,那么识别任意端口的已知服务都是可以实现的(这里说的已知指数据库中含有该服务器软件的特征)。
5.非标准端口服务识别在安全评测中的应用(构想)
按照前面所述,要对一台机器进行一次完成的安全评测,必须要尽可能多的识别出该机器开设的服务。对于一个自动化的评测软件,更要做到这点。非标准端口服务的识别,是实现该目标的关键。
在我看来,做安全评测的步骤应该尽可能的模拟进攻者的步骤,即首先进行信息收集,然后再根据收集到的信息调用相应的测试模块进行测试。下面是一个简单的流程图:
目前常见的安全测试软件通常没有服务识别这一步骤,大多只是按照标准端口服务的定义来调用相应模块。这样做有可能带来误判,造成评测的不准确。加上服务识别这一过程,将大大的增强判断的准确性。
网络安全评测是一个综合的课题,它涉及技术、管理、使用等许多方面,它既包括评测信息系统本身的安全问题,也有评测物理的和逻辑的安全措施,以及对系统管理员素质的考察。一种技术只能解决一方面的问题,而不是万能的。要想做到对网络安全进行一次完全的评测,仅靠简单的扫描是不够的。培养有安全意识的系统管理员是建立一个安全的网络的首要步骤。未来的网络安全面临着更大的挑战和机遇。
|