您的位置:首页 > 理论基础 > 计算机网络

网络扫描技术揭秘读书笔记3-TCP/UDP端口扫描器设计原理

2013-11-06 21:02 615 查看
端口是一个传输层的概念,传输层一般将协议分为TCP协议和UDP协议,所以端口扫描也根据扫描所采用的类型可以分为TCP端口扫描、UDP端口扫描两大类。端口扫描器是最早、最普遍的扫描器之一,所特别是对于TCP扫描,黑客和广大编程爱好者设计出很多高效的算法,但与此同时,操作系统的设计者和防火墙的设计者也针对这些算法进行优化。可以说对端口的扫描监测和预防,也是判断防火墙优劣的一项重要指标。

1.端口扫描的概念

(1).端口扫描

熟知端口中的协议和端口是一一对应的,但有时一个服务可以对应多个端口。例如FTP(FileTransfer Protocol,文件传输协议)占用了20和21两个端口,其中端口21用于在一次传输过程中,控制命令的收发(如文件开始、同步、文件结束),端口20用于文件中的数据传送。另如NetBIOS协议同时使用了137、138、139三个端口,其中137、138是UDP端口,当通过网上邻居传输文件时用这个端口。139端口是TCP端口,通过这个端口可以获得NetBIOS/SMB服务,用于Windows文件和打印机共享和SAMBA。

(2). 端口扫描原理

端口扫描,就是逐个对一段端口或指定的端口进行连接,并通过连接结果判断一台计算机上都提供了哪些服务,然后就可以针对这些服务的已知漏洞进行攻击。

TCP端口为例,其原理是当一个主机向远端一个服务器的某一个端口提出建立连接的请求,如果对方有此项服务,就会同意建立连接,如果对方未安装此项服务时,则不会同意建立连接。

对于UDP端口,由于没有“连接”的概念,即使本机向远端主机某个UDP端口发送一个数据包,对方没有回复,也不能断定对方该端口是否处于“开”的状态。好在ICMP协议中,当向对方未提供服务的端口发送数据时,对方会自动回复一个“远端端口未打开”的错误,那么这个错误信息就可以作为端口“关”的依据,相反则认为该端口是开的

2.端口扫描技术

(1).网络通信实例分析

由于本章只是TCP和UDP两协议端口的扫描,所以下面只介绍两种数据包头的格式和通信实例。

--TCP包头数据格式及通信实例

TCP数据包是包含在一个IP数据报文中的。其中,“标志”项是由几个标志位组成的,自左至右依次为URG(加急,Urgent)、ACK(确认,Acknowledge)、PSH (推送,Push)、RST(复位,Reset)、SYN(同步,Synchronize)、FIN(结束,Finish),这些标志位都将用于高级扫描

第一次,       发送连接请求。172.16.0.111→172.16.0.205

源端口:1887(07 5F),目端口:80(00 50),SEQ=110831053(06 9B 25 CD),ACK=0(00 00 00 00),SYN=1,ACK=0。

第二次,       回复的信号。172.16.0.205→172.16.0.111

源端口:80(00 50),目端口:1887(07 5F),SEQ=3028802247(B4 87 DA C7),ACK=110831054(06 9B 25 CE),SYN=1,ACK=1。

第三次,       确认连接,TCP连接建立。172.16.0.111→172.16.0.205

源端口:1887(07 5F),目端口:80(00 50),SEQ=110831054(06 9B 25 CE),ACK=3028802248(B4 87 DA C8),SYN=0,ACK=1。

--UDP包头数据格式及通信实例

UDP协议是面向非连接的,任何一方创建好后,都可以向对方发送数据包,甚至可以在对方未开机或不存在的情况下,一方仍然可以成功地发送数据包。

(2).TCP扫描

TCP是面向连接的协议,一个成功的TCP连接一般都会首先完成完整的“三次握手”过程,而几乎所有的TCP扫描都是在三次握手过程中做文章。

几乎所有的一般的网络编程接口都会对这个过程进行封装,所以如果直接调用封装后的函数,则实现起来也就没那么难,这种方式下,对方可以很容易检测到正被扫描,并反向查出是谁在扫描。

高级TCP扫描就是通过非正常的三次握手,或不完整的三次握手,然后从这一过程中的异常三次握手的反应,判断出某个端口是否处于“开”的状态。

<1>. TCP connect扫描

这是最基本的TCP扫描方式,其原理是直接使用系统提供的连接函数完成完整的三次握手。连接函数在几乎具有支持网络编程的编程语言里都能找到,在WindowsSocket2中是connect函数,在CSocket类中是该类的Connect方法。

这项扫描技术的优点是:不需要关注三次握手的细节,并且该函数对于使用用户的权限没有太多的限制。它的缺点是安全性差,很容易被对方发觉,或者被对方的防火墙过滤掉。目标主机的日志文件也会记录下这一连串的连接和连接出错的服务消息,并被反向查出来。

<2>. TCP SYN扫描

TCP SYN扫描又称“半开扫描”。回顾TCP连接的三次握手,申请方首先发送的是一个SYN数据包,服务方在接到这个SYN数据包后,如果该端口处于侦听状态,则会回复一个SYN|ACK的数据包;如果该端口没有处于侦听状态,则会回复一个RST的数据包。而此时如果对方处于侦听状态,申请方还需要再向对方回复一个ACK数据包以示建立连接。此时对方就认为连接建立,并记入日志

例如:下图所示为zenmap工具扫描,得到的目标主机部分开放端口列表:



下面是通过Wirshark工具捕获目标主机返回的TCP数据包列表的部分信息:



第1个[SYN,ACK]数据包  epmap(port 135)



第2个[SYN,ACK]数据包  netbios-ssn (port 139)



无论服务方回复SYN|ACK的数据包,还是回复RST的数据包,申请方其实已经能够判断对方端口是否为“开”的状态。之后的ACK数据包发送则被对方监视,如果此时不发送ACK数据包,而是发一个RST数据包,则不仅关闭了这个未完成的连接过程,并且也会因为连接未建立而不会被对方记录。这种扫描方式因为使用了SYN标志位,所以被称为TCPSYN扫描。这种扫描技术的优点在于一般不会在目标计算机上留下记录,有时即使在用netstat命令也显示不出来;但这种方法的一个缺点是必须要有管理员权限才能建立自己的SYN数据包。

下图所示为:TCP SYN扫描在目标主机回复SYN|ACK数据包的情况下,向对方发送RST数据包来关闭这个未完成的连接过程



<3>. TCP ACK扫描  TCP NULL扫描   TCP FIN+URG+PSH扫描  TCP FIN扫描 TCP反向Ident扫描  

(3) UDP扫描

UDP是面向非连接的协议,不需要建立连接过程,对其进行扫描比较复杂

<1>普通UDP扫描

在申请方向目标主机的一个未打开的UDP端口发送一个数据包时,根据网络通信的ICMP协议(RFC792)规定,对方主机会回复一个“目的不可达”(ICMP_PORT_UNREACH)错误。通过这一原理,就可以知道对方端口是处于“开”还是“关”状态。

由于UDP和ICMP错误都不保证能到达,因此这种扫描器一次扫描的结果不一定准确,有时需要多次扫描才能得到准确的结果。另外由于RFC对ICMP错误消息的产生速率做了规定(例如Linux就将ICMP报文的生成速度限制为每4秒钟80个,当超出这个限制的时候,还要暂停1/4秒),所以此扫描方法较慢。同时,这种扫描方法需要具有管理员的权限

<2>UDP recvfrom和write扫描

本方案是前一方案的改进,目的在于所需要的系统管理员的权限问题。由于只有具备系统管理员的权限才可以查看ICMP错误报文,那么在不具备系统管理员权限的时候可以通过使用recvfrom()和write()这两个系统调用来间接获得对方端口的状态。

对一个关闭的端口第二次调用write()的时候通常会得到出错信息。而对一个UDP端口使用recvfrom调用的时候,如果系统没有收到ICMP的错误报文通常会返回一个EAGAIN错误,错误类型码13,含义是“再试一次(Try   Again)”;如果系统收到了ICMP的错误报文则通常会返回一个ECONNREFUSED错误,错误类型码111,含义是“连接被拒绝(Connect  
refused)”。通过这些区别,就可以判断出对方的端口状态如何。

<3>高级UDP扫描技术

由于Socket API本身提供的信息无法做出最终判断,所以在UDP扫描中多是利用Socket和ICMP进行的组合判断。此外就是一些特殊应用的扫描,即通过对某些特殊服务或软件的了解,可以知道该软件监听某端口,并在向其发送指定数据时,对方有反馈,根据这一特性进行判断,这种扫描类似于服务扫描

3.手工扫描

用默认安装条件下操作系统本身提供的命令或程序文件进行手工扫描(检测端口)。

(1).检测单主机单端口开与否

检测172.20.1.195主机的20端口和21端口,输入DOS命令:telnet 172.20.1.195.20,回车后若返回“连接失败”信息,可以断定Telnet无法与对方20号端口建立TCP连接,即对方的端口20未打开,反之对方端口20是打开的。

(2).检测单主机单端口是否有相应服务

端口21

端口21一般被指定为FTP服务使用,要判断目标主机是否开21号端口,只需要使用Windows自带的FTP程序进行检测即可。例如输入DOS命令:ftp 192.168.1.1

端口23

端口23被指定为Telnet服务使用,要判断目标主机是否开23号端口,只需要使用Windows自带的Telnet程序进行检测即可。例如输入DOS命令:telnet 192.168.1.1

端口80

在IE浏览器的“URL地址”输入框里输入“http://192.168.1.1”,IE浏览器就会自动访问对方80端口,如果显示浏览出错就表明对方80端口未开,否则正常显示了内容,则表示80端口开。

端口137、138、139、445

端口139向用户提供NetBIOS服务,要判断目标主机是否开139号端口,只需要使用Windows自带的net命令进行检测即可。输入DOS命令“net use \\192.168.1.1\ipc$”,即检测对方端口139的开关状态。

(3).检测多主机或多端口

如果一次想检测多个主机或单主机的多个端口,除了依次用上面的方式一个一个地检测之外,还可以通过DOS命令中的脚本、Shell命令等操作实现。

扫描本机正在使用的端口

在弹出的“命令提示符”窗口中输入“netstat”命令

netstat命令是用于显示协议统计信息和当前TCP/IP 网络连接的程序。该命令的参数有很多,都是可选的。

扫描一段主机的特定端口

在DOS下,批处理命令其实也有简单的编程功能,通过这些语句同样可以达到多线程的作用。例如:

for /l %%a in (1,1,254)do start /min /low telnet 192.168.1.% %a 139

该命令会自动通过Telnet连接IP地址从192.168.1.1到192.168.1.254之间的所有主机的端口139进行检测,运行后将会依次弹出254个命令提示符的DOS窗口,每个窗口对应一个IP地址139端口的扫描。5秒钟后,凡是该DOS窗口所对应的IP主机未开或未打开端口139的窗口将自动关闭,还剩下的未关窗口就是所要的IP地址。

for命令(不区分大小写)的作用是对一组文件中的每一个文件执行某个特定命令。

该命令的语法是:FOR /参数 %变量 IN (数组范围) DO 命令 [命令参数]



扫描某一指定主机的一段端口

在DOS下,同样有批处理命令实现多线程扫描某一IP的一段端口范围,例如:

for /l %%a in (1,1,65535)do start /low /min telnet 192.168.1.1 %%a

该命令会自动通过Telnet连接IP地址为192.168.1.1的主机,端口值从1到65535范围内的这6万多个端口值。

扫描一个网段的所有端口

for /l %a in (1,1,254) dofor /l %b in (1,1,65535) do start /low /min telnet 192.168.1.%a %b

该命令会把IP地址为192.168.1.1到192.168.1.254之间的所有主机的所有端口进行扫描。

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  网络扫描