简单的端口扫描器实现.docx
- 文档编号:26799989
- 上传时间:2023-06-22
- 格式:DOCX
- 页数:34
- 大小:200.80KB
简单的端口扫描器实现.docx
《简单的端口扫描器实现.docx》由会员分享,可在线阅读,更多相关《简单的端口扫描器实现.docx(34页珍藏版)》请在冰豆网上搜索。
简单的端口扫描器实现
安阳师范学院本科学生毕业论文
简单的端口扫描器实现
作 者
系(院)人文管理学院
专 业计算机科学与技术
年 级2013级
学 号
指导教师
论文成绩
日 期2015年5月
诚信承诺书
郑重承诺:
所呈交的论文是作者个人在导师指导下进行的研究工作及取得的研究成果。
除了文中特别加以标注和致谢的地方外,论文中不包含其他人已经发表或撰写的研究成果,也不包含为获得安阳师范学院或其他教育机构的学位或证书所使用过的材料。
与作者一同工作的同志对本研究所做的任何贡献均已在论文中作了明确的说明并表示了谢意。
作者签名:
日期:
导师签名:
日期:
院长签名:
日期:
论文使用授权说明
本人完全了解安阳师范学院有关保留、使用学位论文的规定,即:
学校有权保留送交论文的复印件,允许论文被查阅和借阅;学校可以公布论文的全部或部分内容,可以采用影印、缩印或其他复制手段保存论文。
保密论文在解密后遵守此规定。
作者签名:
导师签名:
日期:
目录
1引言2
2端口扫描概述2
3端口扫描相关知识2
3.1端口的基本概念2
3.2常见端口介绍3
3.3端口扫描器功能简介3
3.4常用端口扫描技术3
3.4.1TCPconnect()扫描3
3.4.2TCPSYN扫描3
3.4.3TCPFIN扫描3
3.4.4IP段扫描4
3.4.5TCP反向ident扫描4
3.4.6FTP返回攻击4
4实验流程和运行流程4
4.1实现流程4
4.2程序中主要的函数7
4.3主流程图8
5总结10
5.1提出问题10
5.2解决问题10
5.3心得体会10
6致谢11
参考文献11
简单的端口扫描器实现
李涛
(安阳师范学院人文管理学院河南安阳455002)
摘要:
本设计通过端口扫描器的研究来提高对计算机安全的认识。
利用TCPconnect扫描原理,扫描主机通过TCP/IP协议的三次握手与目标主机的指定端口建立一次完整的连接,如果目标主机该端口有回复,则说明该端口开放。
利用多线程技术实现了对一目标IP进行设定数目的端口扫描,计算机端口扫描技术就是这种主动防御策略实现的重要技术手段。
该端口扫描器采用c++语言开发,在VC6.0编译环境下通过测试。
关键词:
端口扫描器;IP段扫描;信息安全
1引言
扫描器是网络信息收集的一种方法之一,从功能上可化分为漏洞扫描器和端口扫描器。
理解客户机-服务器与端口扫描之间的工作原理,完成对目标主机端口扫描功能的实现,即发现目标主机开启的端口信息。
可见,端口与进程是一一对应的,如果某个进程正在等待连接,称之为该进程正在监听,那么就会出现与它相对应的端口。
由此可见,通过扫描端口,便可以判断出目标计算机有哪些通信进程正在等待连接。
2端口扫描概述
对于毕业设计建设,首先应考虑选择一个实验平台,考虑到windows操作系统在pc机上的垄断地位,再加上microsoft提供的办公软件、数据软件的通用性,使得现有的信息系统大都建立在windows操作系统基础上,而且,现有的信息安全攻击操作系统或漏洞威胁,大多数是针对windows操作系统[1],因此,我们选择windows系统作为实现平台。
本毕业论文的目标是设计并实现一个简单的端口扫描器,它通过与目标主机TCP/IP端口建立连接并请求某些服务,记录目标主机的应答,分析目标主机相关信息,从而发现目标主机某些内在的安全弱点。
扫描器通常分两类:
漏洞扫描器和端口扫描器。
端口扫描器用来扫描目标机开放的服务端口以及端口相关信息[2],漏洞扫描器检查目标中可能包含的大量已知的漏洞,如果发现潜在的漏洞可能性,就报告给扫描者。
网络漏洞端口扫描器对目标系统进行检测时,首先探测目标系统的存活主机,对存活主机进行端口扫描,确定系统开放的端口,然后扫描器对开放的端口进行网络服务类型的识别,确定其提供的网络服务。
漏洞扫描器根据目标系统的操作系统平台和提供的网络服务,调用漏洞资料库中已知的各种漏洞进行逐一检测,通过对探测响应数据包的分析判断是否存在漏洞。
在分析总结目前现有的扫描软件,掌握扫描器的原理基础上,首先设计、实现一种端口扫描程序,存储扫描结果。
3端口扫描相关知识
3.1端口的基本概念
我们这里所说的端口,不是计算机硬件的i/o端口,而是软件形式上的概念。
服务器可以向外提供多种服务,比如,一台服务器可以同时是web服务器,也可以是ftp服务器,同时,它也可以是邮件服务器。
为什么一台服务器可以同时提供那么多的服务呢?
其中一个很主要的方面,就是各种服务采用不同的端口分别提供不同的服务。
根据提供服务类型的不同,端口分为两种,一种是tcp端口,一种是udp端口。
计算机之间相互通信的时候,分为两种方式:
一种是发送信息以后,可以确认信息是否到达,也就是有应答的方式,这种方式大多采用tcp协议;一种是发送以后就不管了,不去确认信息是否到达,这种方式大多采用udp协议。
对应这两种协议服务提供的端口,也就分为tcp端口和udp端口。
那么,如果攻击者使用软件扫描目标计算机,得到目标计算机打开的端口,也就了解了目标计算机提供了那些服务。
计算机信息网络的发展加速了信息化时代的进程,但是随着社会网络化程度的增加,对计算机网络的依赖也越来越大,网络安全问题也日益明显[3],端口扫描技术是发现安全问题的重要手段之一。
一个端口就是一个潜在的通信通道,也就是一个入侵通道。
网络安全从其本质来讲就是网络上信息安全[4],它涉及的领域相当广泛,这是因为目前的公用通信网络中存在着各式各样的安全漏洞和威胁。
对目标计算机进行端口扫描,能得到许多有用的信息。
扫描器通过选用远程TCP/IP不同的端口的服务,并记录目标给予的回答,通过这种方法,可以搜集到很多关于目标主机的各种有用的信息,从而发现目标机的某些内在的弱点。
3.2常见端口介绍
端口是一个16bit的地址,用端口号进行标识不同作用的端口。
端口一般分为两类。
熟知端口号:
范围从0到1023,这些端口号一般固定分配给一些服务。
比如21端口分配给FTP服务,25端口分配给SMTP服务,就是所说的邮件服务。
80端口分配给HTTP服务,135端口分配给RPC服务等等。
动态端口号:
动态端口的范围从1024到65535,这些端口号一般不固定分配给某个服务,也就是说许多服务都可以使用这些端口。
只要运行的程序向系统提出访问网络的申请,那么系统就可以从这些端口号中分配一个供该程序使用。
比如8080端口就是分配给第一个向系统发出申请的程序。
在关闭程序进程后,就会释放所占用的端口号。
3.3端口扫描器功能简介
端口分为源端口和目的端口,源端口是本机打开的,目的端口是在和本机通信的另一台计算机的端口。
端口是由计算机的通信协议TCP/IP协议定义的。
其中规定,用IP地址和端口作为套接字,它代表TCP连接的一个连接端,一般称为Socket。
具体来说,就是用IP端口来定位一台主机中的进程。
可以做这样的比喻,端口相当于两台计算机进程间的大门,可以随便定义,其目的只是为了让两台计算机能够找到对方的进程。
计算机就像一座大楼,这个大楼有好多入口(端口),进到不同的入口中就可以找到不同的公司(进程)。
如果要和远程主机A的程序通信,那么只要把数据发向A端口就可以实现通信了。
可见,端口与进程是一一对应的,如果某个进程正在等待连接,称之为该进程正在监听,那么就会出现与它相对应的端口。
由此可见,通过扫描端口,便可以判断出目标计算机有哪些通信进程正在等待连接。
服务器上所开放的端口就是潜在的通信通道,也就是一个入侵通道。
对目标计算机进行端口扫描[5],能得到许多有用的信息,进行端口扫描的方法很多,可以是手工进行扫描、也可以用端口扫描软件进行。
扫描器通过选用远程TCP/IP不同的端口的服务,并记录目标给予的回答,通过这种方法可以搜集到很多关于目标主机的各种有用的信息,例如远程系统是否支持匿名登陆、是否存在可写的FTP目录、是否开放TELNET服务和HTTPD服务等。
3.4常用端口扫描技术
3.4.1TCPconnect()扫描
这是最基本的TCP扫描,操作系统提供的connect()系统调用可以用来与每一个感兴趣的目标计算机的端口进行连接。
如果端口处于侦听状态,那么connect()就能成功。
否则,这个端口是不能用的,即没有提供服务。
这个技术的一个最大的优点是,你不需要任何权限。
优点:
稳定可靠,不需要特殊的权限。
系统中的任何用户都有权利使用这个调用。
另一个好处就是速度快。
如果对每个目标端口以线性的方式,使用单独的connects调用,那么将花费相当长的时间,你可以通过同时打开多个套接字,从而加速扫描。
缺点是扫描方式不隐蔽。
3.4.2TCPSYN扫描
TCPSYN扫描是使用最为广泛的扫描方式,其原理就是向待扫描端口发送SYN数据包,如果能够收到SYN+ACK数据包,则代表此端口开放,如收到RST数据包,则证明此端口关闭,如未收到任何数据包,且确定该主机存在,则证明该端口被防火墙等安全设备过滤。
由于SYN扫描并不会完成TCP连接的三次握手过程,所以SYN扫描又叫做半开放扫描。
SYN扫描的最大优点就是速度,在Internet上,如果不存在防火墙,SYN扫描每秒钟可以扫描数千个端口,但是SYN扫描由于其扫描行为较为明显,容易被入侵检测系统发现,也容易被防火墙屏蔽,且构造原始数据包需要较高系统权限。
3.4.3TCPFIN扫描
有的时候有可能SYN扫描都不够秘密。
一些防火墙和包过滤器会对一些指定的端口进行监视,有的程序能检测到这些扫描。
如果目标主机该端口是“关”状态,则返回一个TCPRST数据包;否则不回复。
根据这一原理可以判断对方端口是处于“开”还是“关”状态。
相反,FIN数据包可能会没有任何麻烦的通过。
这种扫描方法的思想是关闭的端口会用适当的RST来回复FIN数据包。
另一方面,打开的端口会忽略对FIN数据包的回复。
FIN扫描具有较好的隐蔽性,不会留下日志,但是其应用具有很大局限性:
由于不同系统实现网络协议栈的细节不同,FIN扫描只能扫描Linux/UNIX系统,如果是Windows系统,无论端口开放与否都会直接返回RST数据包,无法对端口状态进行判断。
3.4.4IP段扫描
这种扫描方式并不是新技术,它并不是直接发送TCP探测数据包,而是将数据包分成两个较小的IP段。
这样就将一个TCP头分成好几个数据包,从而过滤器就很难探测到。
但必须小心:
一些程序在处理这些小数据包时会有些麻烦。
3.4.5TCP反向ident扫描
ident协议允许(rfc1413)看到通过TCP连接的任何进程的拥有者的用户名,即使这个连接不是由这个进程开始的,该服务就会读取指定TCP连接的查询数据,将拥有指定TCP连接的用户信息反馈给对方,。
例如扫描者可以连接到http端口,然后用identd来发现服务器是否正在以root权限运行。
这种方法只能在和目标端口建立了一个完整的TCP连接后才能看到。
3.4.6FTP返回攻击
FTP协议的一个有趣的特点是它支持代理(proxy)FTP连接,即入侵者可以从自己的计算机和目标主机的FTPserver-PI(协议解释器)连接,建立一个控制通信连接。
然后请求这个server-PI激活一个有效的server-DTP(数据传输进程)来给Internet上任何地方发送文件。
对于一个User-DTP,尽管RFC明确地定义请求一个服务器发送文件到另一个服务器是可以的,但是现在这个方法并不是非常有效。
这种方法的优点很明显,它不容易被追踪,并可能穿过防火墙。
这个协议的缺点是“能用来发送不能跟踪的邮件和新闻,给许多服务器造成打击,用尽磁盘,企图越过防火墙”。
4实验流程和运行流程
4.1实现流程
(1)对源代码仔细检查,看是否出现异常,确保程序可以正常运行。
图1源程序编译页面
(2)输入想要扫描的网段,然后将输入的网段转化为可排序的ip数组。
//功能:
输入一个IP段,输出该IP段内的端口开放情况信息
intScanIp(conststring&start_Ip,conststring&endIp,multimap
{
//分解IP段内的IP到全局数组中去
GetIpToScan(start_Ip,endIp,g_vec_IpToScan);
intscanNum=g_vec_IpToScan.size();
//线程总数
g_runThreadNum=scanNum;
cout< cout< cout<<"********************************************************************************"; cout<<"共有"< //对每个IP开一个线程 for(inti=0;i { CreateThread(NULL,0,ThreadFunc,&g_vec_IpToScan[i],0,NULL); //要是不间隔时间的话,同时创建socket会出现10093错误 Sleep(50); } return0; } (3)建立多个线程,每个线程扫描一个ip。 每个线程内先建立数据流套接字,然后绑定ip端口进行扫描。 将扫描端口保存到g_map_ScanResult。 //保存IP扫描的结果 multimap //线程函数,扫描每一个IP DWORDWINAPIThreadFunc(LPVOIDth_para) { //获取需要扫描的IP //char*pStrIp=(char*)th_para; unsignedlongulScanIp=*(unsignedlong*)th_para; intindex=0;//端口索引 SOCKETlink_sock;//SOCKET FD_SETset_flag;//SOCKET描述 shortselect_ret;//select异步返回值 shortport;//正在扫描的端口 while(index { port=g_portsTOscan[index];//创建数据流套接字 link_sock=socket(AF_INET,SOCK_STREAM,0); if(link_sock==INVALID_SOCKET) //cout<<"创建link_socksocket失败: 错误号为: "< WaitForSingleObject(g_ThreadNumMutex,INFINITE); g_runThreadNum--; ReleaseMutex(g_ThreadNumMutex); //cout<<"***还有_"< <<"_个扫描线程进行中**"< return-1; } (4)清理结束后进程,输出结果。 voidCleanProc()//清理 { ////////////////线程都执行完后清理socket相关信息////// while (1) { WaitForSingleObject(g_ThreadNumMutex,INFINITE); if(g_runThreadNum==0) { break; } ReleaseMutex(g_ThreadNumMutex); Sleep(100); } //清理socket相关信息 WSACleanup(); } //输出扫描结果 intOutPutScanInfo() { cout<<"扫描到"< multimap : iteratoriter=g_map_ScanResult.begin(); ofstreamout("out.txt"); cout<<"显示总"< "< cout< for(;iter! =g_map_ScanResult.end();++iter) { out< cout< } 4.2程序中主要的函数 intmain();主函数 InitProc();初始化 UserInput();输入 ScanIp(g_startIp,g_endIp,g_map_ScanResult);开始扫描 CleanProc();清理结束后进程 OutPutScanInfo();输出结果 DWORDWINAPIThreadFunc(LPVOIDth_para);扫描线程每一个ip unsignedlongInvertIp(unsignedlongsrcIp); 将ip化为长整型 intGetIpToScan(conststring&StartIp,conststring&EndIp,vector 4.3主流程图 图2函数主流程图 4.4结果 图3开始界面 说明: 可扫描的IP段为192.168.1.1-192.168.1.254。 图4扫描界面 说明: 本程序需要在联网的情况下才能完全找到开放的端口。 图5结果界面 4.5扫描结果说明 80端口说明: 80端口是为HTTP(HyperTextTransportProtocol)即超文本传输协议开放的,此为上网冲浪使用次数最多的协议,主要用于WWW(WorldWideWeb)即万维网传输信息的协议。 可以通过HTTP地址(即常说的“网址”)加“: 80”来访问网站,因为浏览网页服务默认的端口号都是80,因此只需输入网址即可,不用输入“: 80”了。 有些木马程序可以利用80端口来攻击计算机的,例如Executor、RingZero等。 135端口说明: 135端口主要用于使用RPC(RemoteProcedureCall,远程过程调用)协议并提供DCOM(分布式组件对象模型)服务,通过RPC可以保证在一台计算机上运行的程序可以顺利地执行远程计算机上的代码;使用DCOM可以通过网络直接进行通信,能够跨过包括HTTP协议在内的多种网络传输。 冲击波病毒就是利用RPC漏洞来攻击计算机的。 RPC本身在处理通过TCP/IP的消息交换部分有一个漏洞,该漏洞是由于错误地处理格式不正确的消息造成的。 该漏洞会影响到RPC与DCOM之间的一个接口,该接口侦听的端口就是135。 139端口说明: 通过139端口入侵是网络攻击中常见的一种攻击手段,一般情况下139端口开启是由于NetBIOS网络协议的使用。 NetBIOS即网络基本输入输出系统,系统可以利用WINS服务、广播及Lmhost文件等多种模式将NetBIOS名解析为相应IP地址,从而实现与对方计算机进行共享资源的连接。 445端口说明: 445端口是一个毁誉参半的端口,有了它我们可以在局域网中轻松访问各种共享文件夹或共享打印机,但也正是因为有了它,黑客们才有了可乘之机,他们能通过该端口偷偷共享你的硬盘,甚至会在悄无声息中将你的硬盘格式化掉! 我们所能做的就是想办法不让黑客有机可乘,封堵住445端口漏洞。 3306端口说明: MySQL的默认端口。 这个是数据库端口,进去后,可以查看数据库中的数据。 5总结 5.1提出问题 (1)确定选题后,综合考虑选择哪种技术去实现端口扫描,写出原因。 (2)面对大量端口需要扫描,怎么样做到既保持程序效率又保持程序的稳定性。 (3)在程序设计完成后,怎样经过调试确定最大连接线程数。 5.2解决问题 首先综合考虑各种技术及背景,发现用connect()函数去连接这个方法更加可靠且易于实现和调试,在出现问题后可相对容易的对其解决。 而且在本学期学过网络安全tcp/ip的课程,对connect()函数的连接过程有些许掌握,更有利于软件的开发。 在面对几千甚至上万个端口需要扫描时,需要考虑到并发处理端口,我们想到了多线程,在对其多线程设计中,要注意控制线程的数量,如果线程数量过多,会造成程序的崩溃,若太少,则程序运行太慢。 所以用多线程并发技术并加以最大线程数量来控制。 程序在运行中,与程序性能有关的首先是本机硬件条件和对方应答所需时间,不同端口号处理响应请求时间也不一样而且跟网络环境也有一定关系。 一般来说,机器处理器速度越快,则处理每个端口的速度越快。 所以程序应该在实际运行中,通过不断修改最大线程数并运行来找到一个合适的最大线程数量,可以将范围从1000设置到10000,再到60000,不断进行调试达到最佳。 5.3心得体会 本设计经过一学期的努力,基本满足了一个端口扫描程序的基本要求。 完成后的程序实现了ip端口扫描功能,能对单个ip扫描或多个ip。 系统设计期间,学习到很多课堂上没有的知识,还积累了很多实践经验,增强了动手能力和解决实际问题的能力。 通过这次的课程设计,对网络编程有了更深入的了解,进一步熟悉了TCP和UDP协议的内容,掌握了ip扫描端口的基本原理。 对编程思想有了进一步的体会,养成了一些良好的编程习惯。 系统虽然完成,但还有很多不足之处,希望自己能不断学习和实践,争取以后做得更好。 通过这次端口扫描器的实验深化了信息对抗,信息安全的意识。 对于网络扫描器有了整体上的认识。 了解了socket函数的基本用法和端口扫描的基本原理,更加熟练掌握了c++语言。 在这次设计中在处理线程上遇到了很大麻烦,不过通过上网查找和书本,基本解决,还有就是刚开始在socket的运用上很是不懂,经过上网查找也顺利解决。 总之这次设计,不仅是对以前只是的巩固,也学习到了许多新知识。 6.致谢 从接受课题到现在完成毕业设计论文,衷心地感谢我的指导老师宋俊昌老师,本系统是在宋老师的悉心指导和耐心教导下完成的,他给予了我很大的帮助,在系统的设计开发过程中向我提供了相关的参考书籍与网站设计资料。 在系统设计过程中,我遇到了许多自己靠看书查阅资料解决不了的技术上的问题宋老师都及时地给予指导。 同时感谢系计算机教研室的其他老师与工作人员,他们给我提供了良好的学习和研究环境,并为我的论文提出了许多宝贵的参考意见,少走了不少弯路。 还感谢我的亲人和朋友,是他们在背后默默的支持我,鼓励我。 本次论文的完成,学校为
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 简单 端口 扫描器 实现
![提示](https://static.bdocx.com/images/bang_tan.gif)