端口扫描与设计实验报告.doc_第1页
端口扫描与设计实验报告.doc_第2页
端口扫描与设计实验报告.doc_第3页
端口扫描与设计实验报告.doc_第4页
端口扫描与设计实验报告.doc_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

北京理工大学珠海学院课程设计说明书20132014学年第1学期题目: 端口扫描器的设计与实现 学 院: 计算机 专业班级: 计算机科学与技术4班 学 号: 110201014005/019 学生姓名: 官广昌 黄晨豪 指导教师: 刘玉仙 成 绩: 时 间: 2013年12月28 北京理工大学珠海学院课程设计任务书 2013 2014 学年第 1 学期学生姓名: 官广昌 黄晨豪 专业班级: 11计算机科学与技术4班 指导教师: 刘玉仙 工作部门: 计算机学院 一、课程设计题目端口扫描器的设计与实现二、课程设计内容对ip端口进行扫描,分析结果。三、进度安排(1)1-4学时,选定题目、分析需求、理解需求;(2)5-8学时,制定设计方案;(3)9-16学时,编写程序、调试、测试;(4)17-20学时,编写设计报告;(5)21-24学时,答辩。四、基本要求1 网络安全设计方案具有实用价值;2 根据指导教师给出的题目进行分配,每个题目最多不超过2个人完成。3 题目可以相同,但参数要求不同,每人必须独立完成。4、 写出课程设计报告,应不少于3000字(不含附录),同一组学生只需提交1份, 但必须在报告中列明分工。 课程负责人签名: 年 月 日课程设计成绩评定表姓 名成绩评定权重总分总成绩(五分制)平时成绩20报告成绩50答辩成绩30官广昌黄晨豪分工:官广昌黄晨豪1、 上网搜索资料2、程序编写3、写实验报告1、总体架构设计2、程序修改3、制作ppt 端口扫描器的设计与实现摘 要计算机信息网络的发展加速了信息化时代的进程,但是随着社会网络化程度的增加,对计算机网络的依赖也越来越大,网络安全问题也日益明显。端口扫描技术是发现安全问题的重要手段之一。本程序是在Windows系统中使用C语言完成的一个端口扫描程序。此程序主要完成了ip端口的扫描功能。扫描能对单个指定的主机进行扫描或对指定网段内的主机进行逐个扫描。扫描结果以列表的形式直观地展现出来。通过对扫描结果的分析知道了,有哪些端口是开放的。关键词:端口扫描 ip端口 网络安全 ip扫描目录第一章 课程设计的目的21.1、课题的背景及意义21.2、端口扫描现状2第二章 功能模块与系统结构2第三章 相关知识33.1、端口的基本概念33.2、常见端口介绍4第四章 实验流程64.1、步骤64.2、流程图6第五章 结果7第六章 源程序10参考文献19心得体会19附件20第一章 课程设计的目的1.1、课题的背景及意义网络中每台计算机犹如一座城堡,这些城堡中,有些是对外完全开放的,有些却是大门紧闭的。入侵者们是如何找到,并打开它们的城门呢?这些城门究竟通向何处?在网络中,把这些城堡的“城门”称之为计算机的“端口”。端口扫描是入侵者搜索信息的几种常用方法之一,也正是这一种方法最容易暴露入侵者的身份和意图。一般说来,扫描端口有以下目的:判断目标主机上开放了哪些服务判断目标主机的操作系统如果入侵者掌握了目标主机开放了哪些服务,运行何种操作系统,他们就能使用相应的手段实现入侵。而如果管理员先掌握了这些端口服务的安全漏洞,就能采取有效的安全措施,防范相应的入侵。1.2、端口扫描现状计算机信息网络的发展加速了信息化时代的进程,但是随着社会网络化程度的增加,对计算机网络的依赖也越来越大,网络安全问题也日益明显。端口扫描技术是发现安全问题的重要手段之一。一个端口就是一个潜在的通信通道,也就是一个入侵通道。对目标计算机进行端口扫描,能得到许多有用的信息。扫描器通过选用远程TCP/IP不同的端口的服务,并记录目标给予的回答,通过这种方法,可以搜集到很多关于目标主机的各种有用的信息,从而发现目标机的某些内在的弱点。 第二章 功能模块与系统结构作为端口扫描程序,首先需要完成的功能就是对于系统操作系统的服务端口进行扫描,返回扫描结果。对于端口的扫描,包括对于本机系统服务端口,局域网内目标机系统,以及远程IP的系统服务端口进行扫描。有些时候,用户并不需要去扫描整个系统的所有端口,因为这样的话不仅会浪费大量的时间,而且可能导致难以找到自己需要了解的端口的扫描结果。所以,对于选择性地对端口进行扫描也非常重要。所以我们只对21端口进行扫描。用户在等待扫描的时候,往往希望知道它的工作进度。这样用户可以更好地控制自己的操作。站在用户的角度思考,设置进度是程序需要完成的,这样就能知道程序扫描的进度。系统必须提供的服务是功能需求的基本,本着站在用户角度思考的原则,做出如上叙述需求,从简列举如下:扫描功能;Ip判断功能;计算时间功能;显示功能; 第三章 相关知识3.1、端口的基本概念: 我们这里所说的端口,不是计算机硬件的i/o端口,而是软件形式上的概念。服务器可以向外提供多种服务,比如,一台服务器可以同时是web服务器,也可以是ftp服务器,同时,它也可以是邮件服务器。为什么一台服务器可以同时提供那么多的服务呢?其中一个很主要的方面,就是各种服务采用不同的端口分别提供不同的服务。 根据提供服务类型的不同,端口分为两种,一种是tcp端口,一种是udp端口。计算机之间相互通信的时候,分为两种方式:一种是发送信息以后,可以确认信息是否到达,也就是有应答的方式,这种方式大多采用tcp协议;一种是发送以后就不管了,不去确认信息是否到达,这种方式大多采用udp协议。对应这两种协议的服务提供的端口,也就分为tcp端口和udp端口。那么,如果攻击者使用软件扫描目标计算机,得到目标计算机打开的端口,也就了解了目标计算机提供了那些服务。3.2、常见端口介绍 端口:21 服务:FTP 说明:FTP服务器所开放的端口,用于上传、下载。最常见的攻击者用于寻找打开anonymous的FTP服务器的方法。这些服务器带有可读写的目录。木马Doly Trojan、Fore、Invisible FTP、WebEx、WinCrash和Blade Runner所开放的端口。 端口:23 服务:Telnet 说明:远程登录,入侵者在搜索远程登录UNIX的服务。大多数情况下扫描这一端口是为了找到机器运行的操作系统。还有使用其他技术,入侵者也会找到密码。木马Tiny Telnet Server就开放这个端口。 端口:25 服务:SMTP 说明:SMTP服务器所开放的端口,用于发送邮件。入侵者寻找SMTP服务器是为了传递他们的SPAM。入侵者的帐户被关闭,他们需要连接到高带宽的E-MAIL服务器上,将简单的信息传递到不同的地址。木马Antigen、Email Password Sender、Haebu Coceda、Shtrilitz Stealth、WinPC、WinSpy都开放这个端口。 端口:80 服务:HTTP 说明:用于网页浏览。木马Executor开放此端口。3.3、常用端口扫描技术:1、 TCP connect()扫描: 这是最基本的TCP扫描,操作系统提供的connect()系统调用可以用来与每一个感兴趣的目标计算机的端口进行连接。如果端口处于侦听状态,那么connect()就能成功。否则,这个端口是不能用的,即没有提供服务。这个技术的一个最大的优点是,你不需要任何权限。系统中的任何用户都有权利使用这个调用。另一个好处就是速度,如果对每个目标端口以线性的方式,使用单独的connect()调用,那么将会花费相当长的时间,使用者可以通过同时打开多个套接字来加速扫描。使用非阻塞I/O允许你设置一个低的时间用尽周期,同时观察多个套接字。但这种方法的缺点是很容易被察觉,并且被防火墙将扫描信息包过滤掉。目标计算机的logs文件会显示一连串的连接和连接出错消息,并且能很快使它关闭。2、TCP SYN扫描: 这种技术通常认为是“半开放”扫描,这是因为扫描程序不必要打开一个完全的TCP连接。扫描程序发送的是一个SYN数据包,好象准备打开一个实际的连接并等待反应一样(参考TCP的三次握手建立一个TCP连接的过程)。一个SYN|ACK的返回信息表示端口处于侦听状态:返回RST表示端口没有处于侦听态。如果收到一个SYN|ACK,则扫描程序必须再发送一个RST信号,来关闭这个连接过程。这种扫描技术的优点在于一般不会在目标计算机上留下记录,但这种方法的缺点是必须要有root权限才能建立自己的SYN数据包。3、TCP FIN 扫描: SYN扫描虽然是“半开放”方式扫描,但在某些时候也不能完全隐藏扫描者的动作,防火墙和包过滤器会对管理员指定的端口进行监视,有的程序能检测到这些扫描。相反,FIN数据包在扫描过程中却不会遇到过多问题,这种扫描方法的思想是关闭的端口会用适当的RST来回复FIN数据包。另一方面,打开的端口会忽略对FIN数据包的回复。这种方法和系统的实现有一定的关系,有的系统不管端口是否打开都会回复RST,在这种情况下此种扫描就不适用了。另外这种扫描方法可以非常容易的区分服务器是运行Unix系统还是NT系统。4、 IP段扫描: 这种扫描方式并不是新技术,它并不是直接发送TCP探测数据包,而是将数据包分成两个较小的IP段。这样就将一个TCP头分成好几个数据包,从而过滤器就很难探测到。但必须小心:一些程序在处理这些小数据包时会有些麻烦。5、 TCP 反向 ident扫描: ident 协议允许(rfc1413)看到通过TCP连接的任何进程的拥有者的用户名,即使这个连接不是由这个进程开始的。例如扫描者可以连接到http端口,然后用identd来发现服务器是否正在以root权限运行。这种方法只能在和目标端口建立了一个完整的TCP连接后才能看到。 6、FTP 返回攻击: FTP协议的一个有趣的特点是它支持代理(proxy)FTP连接,即入侵者可以从自己的计算机和目标主机的FTP server-PI(协议解释器)连接,建立一个控制通信连接。然后请求这个server-PI激活一个有效的server-DTP(数据传输进程)来给Internet上任何地方发送文件。对于一个User-DTP,尽管RFC明确地定义请求一个服务器发送文件到另一个服务器是可以的,但现在这个方法并不是非常有效。这个协议的缺点是“能用来发送不能跟踪的邮件和新闻,给许多服务器造成打击,用尽磁盘,企图越过防火墙”。 第四章 实验流程4.1、步骤: 1.先输入想要扫描的网段; 2.然后将输入的网段转化为可排序的ip数组 3.建立多个线程,每个线程扫描一个ip。每个线程内先建立数据流套接字, 然后绑定 ip端口进行扫描。将扫描端口显示。 4.清理结束后进程,输出结果。 5.计算所用时间。 程序中主要的函数: int main()/主函数 InitProc();/初始化 UserInput();/输入 ScanIp(g_startIp,g_endIp,g_map_ScanResult);/开始扫描 CleanProc();/清理结束后进程 OutPutScanInfo();/输出结果 DWORD WINAPI ThreadFunc(LPVOID th_para)/扫描线程每一个ip unsigned long InvertIp(unsigned long srcIp) /将ip化为可比较的 int GetIpToScan(const string &StartIp, const string &EndIp, vector &vec_ip)/将所有ip排序放在一个数组内4.2、流程图: ThreadFunc函数: 主流程图:结束计算时间ScanIp扫描输入ip断 初始化 开始第五章 结果 开始界面: 扫描界面:结果界面:Ip错误时的界面:第六章 源程序源程序:#pragma comment(lib,ws2_32.lib)#pragma warning (disable:4786)#include #include #include #include #include #include #include #include /#include IpScan.husing namespace std;/全局变量:/待扫描的端口short g_portsTOscan= 20,21,22,23,25,42,43,47,53,63,67,68,79,80,95,106,107,109,110,113,135,137,138,139,143, 144,161,162,443,445,1024,1080,1433,1434,1755,3306,4000,5010,5190,5631,5632,8000,8080 ;const short PORTSNUM = sizeof(g_portsTOscan) / sizeof(short);/端口个数/等扫描的IPvector g_vec_IpToScan;string g_startIp;string g_endIp;/开启的线程数,目前为1个IP1个线程long g_runThreadNum;/socket相关TIMEVAL g_timeout; /阻塞等待时间/FD_SET g_mask; /socket模式设置,储存socket信息const short TIMEOUT = 1; /阻塞等待时间WSADATA g_wsadata; /socket版本信息/线程中的互斥体HANDLE g_PortMutex; HANDLE g_ThreadNumMutex; HANDLE g_ResultMutex; /输入结果的互斥量/保存IP扫描的结果multimap g_map_ScanResult;/-/线程函数,扫描每一个IPDWORD WINAPI ThreadFunc(LPVOID th_para) /获取需要扫描的IP /char *pStrIp = (char*)th_para; unsigned long ulScanIp = *(unsigned long*)th_para; int index = 0; /端口索引 SOCKET link_sock; /SOCKET FD_SET set_flag; /SOCKET描述 short select_ret; /select异步返回值 short port; /正在扫描的端口 while (index PORTSNUM) port = g_portsTOscanindex; /创建数据流套接字 link_sock = socket(AF_INET, SOCK_STREAM, 0); if (link_sock = INVALID_SOCKET) /cout 创建link_sock socket失败:错误号为: GetLastError() endl; WaitForSingleObject(g_ThreadNumMutex,INFINITE); g_runThreadNum-; ReleaseMutex(g_ThreadNumMutex); /cout *还有_ g_runThreadNum _个扫描线程进行中* endl; return -1; FD_ZERO(&set_flag); /将指定文件描述符清空 FD_SET(link_sock,&set_flag); /用于在文件描述符集合中增加一个新的文件描述符 /设置连接地址 SOCKADDR_IN scan_addr; scan_addr.sin_family = AF_INET; scan_addr.sin_addr.s_addr = ulScanIp; scan_addr.sin_port = htons(port); unsigned long sock_set = 1; ioctlsocket(link_sock,FIONBIO,&sock_set); /设置套接字为非阻塞模式,第3个参数非0为非阻塞 connect(link_sock,(struct sockaddr *) &scan_addr, sizeof(scan_addr);/连接指定IP端口 select_ret = select(0,NULL,&set_flag,NULL,&g_timeout);/异步返回值 if (select_ret = 0 | select_ret = -1) +index; continue; else strstream stream_result; struct in_addr ipaddr; ipaddr.s_addr = ulScanIp; char *pStrIp = inet_ntoa(ipaddr); stream_result t 主机地址为: pStrIp t找到开放的端口: port 0; string str_result(stream_result.str(); /将扫描结果储存到输出变量中去 WaitForSingleObject(g_ResultMutex,INFINITE); g_map_ScanResult.insert(make_pair(ulScanIp,str_result); ReleaseMutex(g_ResultMutex); +index; /扫描完一个线程 shutdown(link_sock, 0); closesocket(link_sock); WaitForSingleObject(g_ThreadNumMutex,INFINITE); g_runThreadNum-; ReleaseMutex(g_ThreadNumMutex); /cout *还有_ g_runThreadNum _个扫描线程进行中* 8) & 0x00FF; third = (srcIp 16) & 0x00FF; fourth = (srcIp 24) & 0x00FF; return (first 24) | (second 16) | (third 8) | fourth; /-/将IP内的IP转化成一个一个unsigned long 类型存在数组中int GetIpToScan(const string &StartIp, const string &EndIp, vector &vec_ip) /判断输入的IP是否合法 unsigned long ulStartIp = inet_addr(StartIp.c_str(); unsigned long ulEndIp = inet_addr(EndIp.c_str(); if( INADDR_NONE = ulStartIp | INADDR_NONE = ulEndIp ) cout 请输入合法的IP ulEndIp) max_ip = ulStartIp; ulStartIp = ulEndIp; ulEndIp = max_ip; int ipnums = ulEndIp - ulStartIp; for(int i = 0;i = ipnums;+i) /将每个IP的unsigned long型存到数组中供扫描 vec_ip.push_back(InvertIp(ulStartIp+); return 0;/-/功能: 输入一个IP段,输出该IP段内的端口开放情况信息int ScanIp(const string &start_Ip, const string &endIp, multimap &ouputMap) /分解IP段内的IP到全局数组中去 GetIpToScan(start_Ip,endIp,g_vec_IpToScan); int scanNum = g_vec_IpToScan.size(); /线程总数 g_runThreadNum = scanNum;coutendl;coutendl; cout*; cout 共有 scanNum 个IP要扫描 endl; /对每个IP开一个线程 for (int i = 0; i scanNum; +i) CreateThread(NULL,0,ThreadFunc,&g_vec_IpToScani,0,NULL); /要是不间隔时间的话,同时创建socket会出现10093错误 Sleep(50); return 0;/-/输出扫描结果int OutPutScanInfo() cout 扫描到 g_map_ScanResult.size() 条记录 endl; multimap:iterator iter = g_map_ScanResult.begin(); ofstream out(out.txt); cout 显示总 g_map_ScanResult.size() 条记录: endl;coutendl; for (; iter!=g_map_ScanResult.end(); +iter) out second endl; cout second endl; return 0;/-void UserInput() cout endl; cout * endl; cout * * endl; cout * 端口扫描器 * endl; cout * * endl; cout * endl; cout endl; cout*endl; cout* 可扫描一个或多个IP,输入同一网段的两个IP。 *endl;cout* 格式为 54. *endl; cout* 只扫描一个IP时,输入两个相同IP. *endl; cout* 扫描多个IP时,输入两个不相同IP. *endl; cout* endl; coutendl;coutendl; cout*; cout 现在请输入需要扫描的IP ;cout g_startIp; cout g_endIp; cout* endl; /-/初始化相关信息void InitProc() /初始化socket相关信息 int ws_result; ws_result = WSAStartup(MAKEWORD(2,2),&g_wsadata); if (ws_result != 0) cout socket WSAStartup初始化失败 endl; /设置阻塞函数的超时时间 g_timeout.tv_sec = TIMEOUT; g_PortMutex = CreateMutex(NULL, FALSE, port mutex); g_ThreadNumMutex= CreateMutex(NULL, FALSE, threadnums mutex); g_ResultMutex = CreateMutex(NULL, FALSE, result mutex);/-/清理void CleanProc() /线程都执行完后清理socket相关信息/ while (1) WaitForSingleObject(g_ThreadNumMutex,INFINITE); if (g_runThreadNum = 0) break; ReleaseMutex(g_ThreadNumMutex); Sleep(100); /清理socket相关信息 WSACleanup();in

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论