信息工程学院计算机网络
题目全称:课 程:学 号:班 级:姓 名:课程研究报告
端口扫描工具设计
计算机网络
20105605
通信1004
刘科
- 1 -
计算机网络课程研究报告
摘要
在现在这个信息化的社会中,网络的发展已经超出了人们预想,在很短的时间里已经渗透到军事,金融,商业,交通,电信,教育等领域,并发挥着越来越大的作用。社会对网络系统的依赖也越来越强,使得密集信息和财富高度集中与计算机中。另一方面,这些网络系统都依靠计算机网络接受和处理信息,实现其相互间的联系和对目标的管理与控制。而网络端口扫描作为维护网络安全的重要手段,可以帮助服务器提供商找出自身漏洞,避免黑客攻击;测试远程服务器的端口是否可达,防止沿途运营商、防火墙限制了端口导致服务不可用。
.备注
本次计算机网络课程设计我主要是学习一下端口扫描工具的基本知识以及研究别人做出的端口扫描工具,以下即是本次研究的相关研究报告。鉴于自己计算机方面知识不是很好,不足之处还请老师指出与修正。
- 2 -
计算机网络课程研究报告
1 端口扫描器的研究
1.1 TCP协议介绍
提到端口扫描技术就不可不提及TCP协议了,作为互联网的核心协议,TCP协议的重要性是人人皆知,端口扫描主要是建立在TCP协议基础上的一门技术。TCP协议是一种面向连接的,可靠的传输协议。一次正常的TCP传输需要通过在客户和服务器之间建立特定的虚电路连接来完成,这个过程通常被称为“三次握手”。TCP通过数据分段中的序列号保证所有的传输数据可以在远端按照正常的次序重组,而通过确认保证数据传输的完整性。 三次握手过程:
1:客户端发送一个TCP包(SYN请求)给服务端,其中标记SYN(同步序号)要打开。SYN请求指明了客户端希望连接的服务器端端口号和客户端的ISN。
2:服务器端发回应答,包含自己的SYN信息ISN和对客户端的SYN应答,应答时返回下一个希望得到的字节序号。
3:客户端对从S服务器端来的SYN进行应答,数据发送开始。
1.2 UDP协议介绍
UDP,用户数据报协议。UDP为应用程序提供了一种方法来发送经过封装的IP数据报,而且不必建立连接就可以发送这些IP数据报。
UDP传输的数据段是由8个字节的头和净荷域构成的。两个端口分别被用来标识出源机器和目标机器内部的端点。当一个UDP分组到来的时候,它的净荷部分被递交给与目标端口相关联的那个进程。当目标端口必须将一个应答送回给源端口的时候,源端口是必须的。发送应答的进程只要将近来的数据段中的源端口域复制到输出的数据段中的目标端口域,就可以指定在发送机器上有哪个进程来接受应答。UDP长度包含了8字节的头和数据部分。UDP校验和是可选的,如果不计算的话,则在该域中存放0,如果真正的计算结果试的话,则该域中存放的全是1,除非数据 的质量并不重要,否则就不应该将校验和的功能关闭。另外值得明确提出来的是UDP没有做到的一
- 3 -
计算机网络课程研究报告
些事情。UDP并不考虑流控制,错误控制,在收到一个坏的数据段之后它也不重传。所有这些工作都留给用户的进程。UDP所作的事情是提供一个接口,并且在接口中增加解复用的特性。他利用端口的概念将数据段解复用到多个进程中,这就是他所做的全部工作。
1.3 SOCKET介绍
Socket接口是TCP/IP网络的API,Socket接口定义了许多函数或例程,程序员可以用它们来开发TCP/IP网络上的应用程序。要学Internet上的TCP/IP网络编程,必须理解Socket接口。 Socket接口设计者最先是将接口放在Unix操作系统里面的。如果了解Uinx系统的输入和输出的话,就很容易了解Socket了。网络的Socket数据传输是一种特殊的I/O,Socket也是一种文件描述符。Socket也具有一个类似于打开文件的函数调用Socket(),该函数返回一个整型的Socket描述符,随后的连接建立,数据传输等操作都是通过该Socket实现的。
Sockfd是需要关闭的socket的描述符。参数 how允许为shutdown操作选择以下几种方式: ·0-------不允许继续接收数据
·1-------不允许继续发送数据
·2-------不允许继续发送和接收数据,均为允许则调用close ()
shutdown在操作成功时返回0,在出现错误时返回-1并置相应errno。
1.4 常用端口扫描技术
1.4.1 TCP connect()扫描:
这是最基本的TCP扫描,操作系统提供的connect()系统调用可以用来与每一个感兴趣的目标计算机的端口进行连接。如果端口处于侦听状态,那么connect()就能成功。否则,这个端口是不能用的,即没有提供服务。这个技术的一个最大的优点是,你不需要任何权限。系统中的任何用户都有权利使用这个调用。另一个好处就是速度,如果对每个目标端口以线性的方式,使用单独的connect()调用,那么将会花费相当长的时间,使用者可以通过同时打开多个套接字来加速扫描。使用非阻塞I/O允许你设置一个低的时间用尽周期,同时观察多个套接字。但这种方法的缺点是很容易被察觉,并且被防火墙将扫描信息包过滤掉。目标计算机的logs文件会显示一连串的连接和连接出错消息,并且能很快使它关闭。
1.4.2 TCP SYN扫描:
这种技术通常认为是“半开放”扫描,这是因为扫描程序不必要打开一个完全的TCP连接。
- 4 -
计算机网络课程研究报告
扫描程序发送的是一个SYN数据包,好象准备打开一个实际的连接并等待反应一样(参考TCP的三次握手建立一个TCP连接的过程)。一个SYN|ACK的返回信息表示端口处于侦听状态:返回RST表示端口没有处于侦听态。如果收到一个SYN|ACK,则扫描程序必须再发送一个RST信号,来关闭这个连接过程。这种扫描技术的优点在于一般不会在目标计算机上留下记录,但这种方法的缺点是必须要有root权限才能建立自己的SYN数据包。
1.4.3 TCP FIN 扫描:
SYN扫描虽然是“半开放”方式扫描,但在某些时候也不能完全隐藏扫描者的动作,防火墙和包过滤器会对管理员指定的端口进行监视,有的程序能检测到这些扫描。相反,FIN数据包在扫描过程中却不会遇到过多问题,这种扫描方法的思想是关闭的端口会用适当的RST来回复FIN数据包。另一方面,打开的端口会忽略对FIN数据包的回复。这种方法和系统的实现有一定的关系,有的系统不管端口是否打开都会回复RST,在这种情况下此种扫描就不适用了。另外这种扫描方法可以非常容易的区分服务器是运行Unix系统还是NT系统。
1.4.4 IP段扫描:
这种扫描方式并不是新技术,它并不是直接发送TCP探测数据包,而是将数据包分成两个较小的IP段。这样就将一个TCP头分成好几个数据包,从而过滤器就很难探测到。但必须小心:一些程序在处理这些小数据包时会有些麻烦。
1.4.5 TCP 反向 ident扫描:
ident 协议允许(rfc1413)看到通过TCP连接的任何进程的拥有者的用户名,即使这个连接不是由这个进程开始的。例如扫描者可以连接到http端口,然后用identd来发现服务器是否正在以root权限运行。这种方法只能在和目标端口建立了一个完整的TCP连接后才能看到。
1.4.6 FTP 返回攻击:
FTP协议的一个有趣的特点是它支持代理(proxy)FTP连接,即入侵者可以从自己的计算机self.com和目标主机target.com的FTP server-PI(协议解释器)连接,建立一个控制通信连接。然后请求这个server-PI激活一个有效的server-DTP(数据传输进程)来给Internet上任何地方发送文件。对于一个User-DTP,尽管RFC明确地定义请求一个服务器发送文件到另一个服务器是可以的,但现在这个方法并不是非常有效。这个协议的缺点是“能用来发送不能跟踪的邮件和新闻,给许多服务器造成打击,用尽磁盘,企图越过防火墙”。
- 5 -
计算机网络课程研究报告
1.4.7 UDP ICMP端口不能到达扫描:
这种方法与上面几种方法的不同之处在于使用的是UDP协议,而非TCP/IP协议。由于UDP协议很简单,所以扫描变得相对比较困难。这是由于打开的端口对扫描探测并不发送确认信息,关闭的端口也并不需要发送一个错误数据包。幸运的是许多主机在向一个未打开的UDP端口发送数据包时,会返回一个ICMP_PORT_UNREACH错误,这样扫描者就能知道哪个端口是关闭的。UDP和ICMP错误都不保证能到达,因此这种扫描器必须还实现在一个包看上去是丢失的时候能重新传输。这种扫描方法是很慢的,因为RFC对ICMP错误消息的产生速率做了规定。同样这种扫描方法也需要具有root权限。
1.4.8 UDP recvfrom()和write() 扫描:
当非root用户不能直接读到端口不能到达错误时,Linux能间接地在它们到达时通知用户。比如,对一个关闭的端口的第二个write()调用将失败。在非阻塞的UDP套接字上调用recvfrom()时,如果ICMP出错还没有到达时回返回EAGAIN-重试。如果ICMP到达时,返回ECONNREFUSED-连接被拒绝。这就是用来查看端口是否打开的技术。
1.5 常见端口扫描器
1.5.1 NSS(网络安全扫描器)
NSS由Perl语言编成,它最根本的价值在于它的速度,它运行速度非常快,它可以执行下列常规检查: ■Sendmail ■匿名FTP ■NFS出口 ■TFTP ■Hosts.equiv
■Xhost
利用NSS,用户可以增加更强大的功能,其中包括: ■AppleTalk扫描 ■Novell扫描 ■LAN管理员扫描
■可扫描子网
NSS执行的进程包括:
■取得指定域的列表或报告,该域原本不存在这类列表 ■用Ping命令确定指定主机是否是活性的
- 6 -
计算机网络课程研究报告
■扫描目标主机的端口 ■报告指定地址的漏洞
1.5.2 Strobe(超级优化TCP端口检测程序)
strobe是一个TCP端口扫描器,它可以记录指定机器的所有开放端口。strobe运行速度快。 strobe的主要特点是,它能快速识别指定机器上正在运行什么服务。strobe的主要不足是这类信 息是很有限的,一次strobe攻击充其量可以提供给“入侵者”一个粗略的指南,告诉什么服务可以 被攻击。但是,strobe用扩展的行命令选项弥补了这个不足。比如,在用大量指定端口扫描主机 时,可以禁止所有重复的端口描述。 其他选项包括:
■定义起始和终止端口
■定义在多长时间内接收不到端口或主机响应,便终止这次扫描。 ■定义使用的socket号码
■定义strobe要捕捉的目标主机的文件
1.5.3 SATAN(安全管理员的网络分析工具)
SATAN是为UNIX设计的,它主要是用C和Perl语言编写的(为了用户界面的友好性,还用了一些HTML技术)。它能在许多类UNIX平台上运行,有些根本不需要移植,而在其他平台上也只是略作移植。
SATAN用于扫描远程主机的许多已知的漏洞,其中包括,但并不限于下列这些漏洞: ■FTPD脆弱性和可写的FTP目录 ■NFS脆弱性 ■NIS脆弱性 ■RSH脆弱性 ■Sendmail ■X服务器脆弱性
1.5.4 Jakal
Jakal是一个秘密扫描器,也就是就,它可以扫描一个区域(在防火墙后面),而不留下任何痕迹。秘密扫描器工作时会产生“半扫描”(half scans),它启动(但从不完成)与目标主机的SYN/ACK过程。从根本上讲,秘密扫描器绕过了防火墙,并且避开了端口扫描探测器,识别出在防火墙后面运行的是什么服务。(这里包括了像Courtney和GAbriel这样的精制扫描探测器)
- 7 -
计算机网络课程研究报告
1.5.5 IdentTCPscan
IdentTCPscan是一个更加专业化的扫描器,其中加入了识别指定TCP端口进程的所有者的功能,也就是说,它能测定该进程的UID。可在如下地址找到拷贝:http://www.giga.or.at/pub/hacker/unix ;
1.5.6 CONNECT
CONNECT是一个bin/sh程序,它的用途是扫描TFTP服务子网。
1.5.7 FSPScan
FSPScan用于扫描FSP服务顺。FSP代表文件服务协议,是非常类似于FTP的Internet协议。它提供匿名文件传输,并且据说具有网络过载保护功能(比如,FSP从来不分叉)。FSP最知名的安全特性可能就是它记录所有到来用户的主机名,这被认为优于FTP,因为FTP仅要求用户的E-mail地址。
1.5.8 XSCAN
XSCAN扫描具有X服务器弱点的子网(或主机)。XSCAN增加了一个功能:如果它找到了一个脆弱的目标,它会立即加入记录。
XSCAN的其他优点还包括:可以一次扫描多台主机。这些主机可以在行命令中作为变量键入(并且你可以通过混合匹配同时指定主机和子网)。
1.6 本章小节
本章节着重介绍了TCP协议、UDP协议以及SOCKET接口的相关知识
还大致介绍了TCP connect()扫描、CP SYN扫描、CP FIN 扫描、IP段扫描等几种常规扫描模式。 最后还介绍了NSS、Strobe、ATAN、Jakal等几种常见的扫描工具。为网络扫描工具的开发打下了理论基础。
- 8 -
计算机网络课程研究报告
2 端口扫描器的开发
2.1 开发原理
开发端口扫描器需要用到控件,利用它与远程计算机建立连接,并通过用UDP协议或TCP协议进行数据交换。这样就能确认远程计算机的端口开放情况。由于TCP协议判断远程计算机的信息比UDP协议准确,所以本文使用Winsock控件的TCP协议来开发扫描器。
首先在IP地址和端口的循环中动态建立winsock套接字(Fsocket),在该套接字的通讯方式上选择非阻塞方式(WSAAsyncSelect()),并在Fsocket套接字,线程内分配的非可视控件句柄,网络事件处理函数以及网络事件消息(FD_CONNECT连接消息)之间建立相应的关联。设置好Fsocket的IP地址和相应的端口号后,调用connect()函数与远程目标主机建立连接。调用WaitForSingleObject()函数等待网络连接事件的发生,一旦连接成功将自动调用自定义的 ReadData()函数处理相应网络消息。最后将网络事件复位(ResetEvent)以便等待下一网络事件发生,并取消在Fsocket套接字,线程内分配的非可视化句柄,网络事件处理函数以及网络事件消息(FD_CONNECT连接消息)之间建立相应的关联,关闭Fsocket.
2.1.1
属性
LocalHostName | 本机名。
LocalIP | 本机IP地址。
LocalPort | 本机通信程序的端口(0\\<端口\\<65536)。 RemoteHost | 远程计算机名。
RemotePort | 远程计算机的通信程序端口。 state | 连接的当前状态。 Protocal | 使用 TCP或UDP协议。
2.1.2 方法
Listen | 用于服务器程序,等待客户访问。 格式:
Winsock对象.listenConnect | 用于向远程主机发出连接请求。 格式:
Winsock对象.connect \\[远程主机IP地址,远程端口]Accept | 用于接受一个连接请求。
- 9 -
计算机网络课程研究报告
格式:
Winsock对象.accept Request IDSenddata | 用于发送数据。
格式:
Winsock对象.senddata 数据Getdata | 用来取得接收到的数据。 格式:
Winsock对象.getdata 变量 \\[,数据类型 \\[,最大长度]]Close | 用于关闭当前连接。 格式:Winsock对象.close
2.1.3 事件
Close | 远程计算机关闭连接时触发。
Connect | 连接建立好,可以进行通信时触发(客户端)。 ConnectRequest | 有连接请求到达时触发(服务器端)。 DataArrival | 有数据到达时触发。 Error | 发生错误时触发。 SendProgress | 数据传送进度。
2.2 开发端口扫描器界面
下面来开VB开始制作界面。首先构造一个基本的扫描器界面,包括IP地址栏、端口栏、结果栏和速度设置栏。 步骤1:
新建一个窗体,在其中添加4个 textbox控件,分别命名为“txtIP”、“txtLowerBound”、“”和“txtMaxConnections”。它们分别代表目标IP地址、开始端口、结束端口和速度线程数。再分别给这4个textbox控件加上frame控件,并将frame的caption值分别设置为目标IP地址、端口范围和线程数。这样就显得比较美观。
步骤2:
添加一个listbo控件,它用来显示扫描的端口开放结果,将其命名为lstOpenPorts。再添加三个控件,将其Caption值分别设置为扫描、停止和清除。
步骤3 :
添加一个Winsock控件,命名为“wskSocket”,同时添一个timer控件,命名为“timTimer”。 步骤4:
为了显示状态,在界面底部增加一个statusbar控件,将其命名为“sbMain”。它用来显示速度及时间等信息。
- 10 -
计算机网络课程研究报告
2.3 代码编写
Dim portnum As Long '设置变量! Dim start As String
Private Sub cmdClear_Click()
lstOpenPorts.Text = \"\" '输入的文本 End Sub
Private Sub cmdScan_Click()
If txtUB.Text = \"\" Or Text3.Text = \"\" Then '如果.IF
MsgBox \"端口号不能为空!!\" '提示 Exit Sub End If
Winsock1.Close '控件 start = True
Call SCanningPorts '调用自定义的过程
stOpenPorts.Text = lstOpenPorts.Text & vbCrLf & \"端口\" & txtUB.Text & \"-\" & Text3.Text & \"已经扫描成功!\" End Sub
Private Sub cmdStop_Click() start = False End Sub
Sub SCanningPorts() '自定义的过程 Dim porttwo As Long portnum = txtUB.Text porttwo = Text3.Text On Error GoTo viriio:
- 11 -
计算机网络课程研究报告
Do
portnum = portnum + 1 DoEvents
If start = True Then Winsock1.Close DoEvents
Winsock1.LocalPort = portnum DoEvents
txtcon.Text = portnum Winsock1.Listen DoEvents Else
portnum = 0 Exit Sub End If
Winsock1.Close DoEvents
Loop Until portnum >= porttwo portnum = 0 viriio:
If Err.Number = 10048 Then
lstOpenPorts.Text = lstOpenPorts.Text & vbCrLf & \"端口\" & Winsock1.LocalPort & \"开放中\" Resume Next End If End Sub
Private Sub Form_Load() End Sub
- 12 -
计算机网络课程研究报告
2.4 测试
对该软件进行测试:
达到开发目的,具备发现一个计算机或网络的能力;具备发现一台计算机,就有发现目标计算机正在运行什么服务的能力;具备测试目标计算机上的这些服务,发现存在的漏洞的能力。
2.5 本章小结
开发了一款简单的基于VB的网络端口扫描工具。并对其进行了测试,在Windows NT/XP下稳定运行。
3 结束语
通过一个多月紧张有序的学习与研究,圆满完成了本次课程研究。在本次课程研究中主要采取了百度加咨询学长的方式。
通过这次对端口扫描工具的研究,我真正体会到了端口扫描的重要性。这次课程设计使我对网络端口扫描有了深刻的认识,对它们的理解也更为深入了。诚然,我现在不能开发出端口扫描工具,在本次课程设计完全仅仅是对端口扫描工具进行了研究。
- 13 -
14
因篇幅问题不能全部显示,请点此查看更多更全内容