网络课设端口扫描与抓包分析报告.docx
- 文档编号:24095769
- 上传时间:2023-05-24
- 格式:DOCX
- 页数:47
- 大小:480.23KB
网络课设端口扫描与抓包分析报告.docx
《网络课设端口扫描与抓包分析报告.docx》由会员分享,可在线阅读,更多相关《网络课设端口扫描与抓包分析报告.docx(47页珍藏版)》请在冰豆网上搜索。
网络课设端口扫描与抓包分析报告
CENTRALSOUTHUNIVERSITY
计算机网络课程设计报告
题目端口检测与数据包捕获解析
学生姓名
班级学号
指导教师刘丽敏
设计时间2015年9月
第一章设计目的、任务与要求
现今,计算机网络已经彻彻底底地改变了人们的生活。
大量的数据都是经过计算机网络传输的,而TCP/IP协议是计算机网络中最重要的协议之一。
计算机网络中绝大多数数据都是以IP数据包的形式发送和接受的。
所以IP数据包的捕获是很多计算机安全技术的基础。
在本次课程实际中,通过编程实现网卡截取标准IP包,并解析IP数据包,以了解IP包结构中各个字段的含义与用途,更好掌握网络层的基本原理,这是第一点。
本课程设计的另一个目的是运用漏洞、端口的基础知识,设计并实现一个网络扫描器,它通过与目标主机TCP/IP端口建立连接并请求某些服务,记录目标主机的应答,分析目标主机相关信息,从而发现目标主机某些内在的安全弱点。
本次实验的要求在网络环境,实现端口检测以及捕获网络中的IP数据包,解析数据包的内容,将结果显示在标准输出上,并同时写入日志文件。
程序的具体要求如下:
l)实现本机以及局域网内计算机的端口监控。
2)在标准输出和日志文件中写入捕获的IP包的版本、头长度、服务类型、数据包总长度、数据包标识、分段标志、分段偏移值、生存时间、上层协议类型、头校验和、源IP地址和目的IP地址等内容。
3)形成记录结果的日志文件。
第二章系统总体分析设计
2.1总体需求分析
可以将本实验分为两个独立的模块来解决,具体两个模块的设计实现在后面单独章节里详述,从总体而言,可以设计一个界面,将两个功能整合到一起,然后让用户选择所要实验的功能。
而对于扫描本机端口,用自己写的端口扫描器也可以完成,但速度较cmd指令慢,所以将其单独出来作为一项功能。
其中,cmd中查本机端口号指令为netstat–no。
总体系统功能如下图:
2.2实验环境
本实验采用Windows操作系统平台,利用Windows提供的WindowsSocketsAPI实现IP数据包的捕获与分析。
采用WinSock2.2版本,编程语言选用C++,编程开发采用Code:
:
Blocks13.12。
第三章端口扫描模块分析设计
3.1端口的基本概念
我们这里所说的端口,不是计算机硬件的i/o端口,而是软件形式上的概念。
服务器可以向外提供多种服务,比如,一台服务器可以同时是web服务器,也可以是ftp服务器,同时,它也可以是邮件服务器。
为什么一台服务器可以同时提供那么多的服务呢?
其中一个很主要的方面,就是各种服务采用不同的端口分别提供不同的服务。
根据提供服务类型的不同,端口分为两种,一种是TCP端口,一种是UDP端口。
计算机之间相互通信的时候,分为两种方式:
一种是发送信息以后,可以确认信息是否到达,也就是有应答的方式,这种方式大多采用TCP协议;一种是发送以后就不管了,不去确认信息是否到达,这种方式大多采用UDP协议。
对应这两种协议的服务提供的端口,也就分为TCP端口和UDP端口。
那么,如果攻击者使用软件扫描目标计算机,得到目标计算机打开的端口,也就了解了目标计算机提供了那些服务。
3.2常见端口了解
端口是一个16bit的地址,用端口号进行标识不同作用的端口。
端口一般分为两类。
熟知端口号:
范围从0到1023,这些端口号一般固定的分配给一些服务,所以,这些端口分别对应哪些服务也是我们要关注的,以下是一些常见的熟知端口号的介绍:
1)端口:
21服务:
FTP
说明:
FTP服务器所开放的端口,用于上传、下载。
最常见的攻击者用于寻找打开anonymous的FTP服务器的方法。
这些服务器带有可读写的目录。
木马DolyTrojan、Fore、InvisibleFTP、WebEx、WinCrash和BladeRunner所开放的端口。
2)端口:
23服务:
Telnet
说明:
远程登录,入侵者在搜索远程登录UNIX的服务。
大多数情况下扫描这一端口是为了找到机器运行的*作系统。
还有使用其他技术,入侵者也会找到密码。
木马TinyTelnetServer就开放这个端口
3)端口:
25服务:
SMTP
说明:
SMTP服务器所开放的端口,用于发送邮件。
入侵者寻找SMTP服务器是为了传递他们的SPAM。
入侵者的帐户被关闭,他们需要连接到高带宽的E-MAIL服务器上,将简单的信息传递到不同的地址。
木马Antigen、EmailPasswordSender、HaebuCoceda、ShtrilitzStealth、WinPC、WinSpy都开放这个端口
4)端口:
80服务:
HTTP
说明:
用于网页浏览。
木马Executor开放此端口。
动态端口号:
动态端口的范围从1024到65535,这些端口号一般不固定的分配给某个服务,也就是说许多服务都可以使用这些端口。
只要运行的程序向系统提出访问网络的申请,那么系统就可以从这些端口号中分配一个供该程序使用。
比如8080端口就是分配给第一个向系统发出申请的程序。
在关闭程序进程后,就会释放所占用的端口号。
3.3扫描端口的基本原理
端口分为源端口和目的端口,源端口是本机打开的,目的端口是在和本机通信的另一台计算机的端口。
端口是由计算机的通信协议TCP/IP协议定义的。
其中规定,用IP地址和端口作为套接字,它代表TCP连接的一个连接端,一般称为Socket。
具体来说,就是用IP端口来定位一台主机中的进程。
可以做这样的比喻,端口相当于两台计算机进程间的大门,可以随便定义,其目的只是为了让两台计算机能够找到对方的进程。
计算机就像一座大楼,这个大楼有好多入口(端口),进到不同的入口中就可以找到不同的公司(进程)。
如果要和远程主机A的程序通信,那么只要把数据发向A端口就可以实现通信了。
可见,端口与进程是一一对应的,如果某个进程正在等待连接,称之为该进程正在监听,那么就会出现与它相对应的端口。
由此可见,通过扫描端口,便可以判断出目标计算机有哪些通信进程正在等待连接。
服务器上所开放的端口就是潜在的通信通道,也就是一个入侵通道。
对目标计算机进行端口扫描[5],能得到许多有用的信息,进行端口扫描的方法很多,可以是手工进行扫描、也可以用端口扫描软件进行。
扫描器通过选用远程TCP/IP不同的端口的服务,并记录目标给予的回答,通过这种方法可以搜集到很多关于目标主机的各种有用的信息,例如远程系统是否支持匿名登陆、是否存在可写的FTP目录、是否开放TELNET服务和HTTPD服务等。
3.4扫描端口的常用技术
1、TCPconnect()扫描:
这是最基本的TCP扫描,操作系统提供的connect()系统调用可以用来与每一个感兴趣的目标计算机的端口进行连接。
如果端口处于侦听状态,那么connect()就能成功。
否则,这个端口是不能用的,即没有提供服务。
这个技术的一个最大的优点是,你不需要任何权限。
系统中的任何用户都有权利使用这个调用。
另一个好处就是速度,如果对每个目标端口以线性的方式,使用单独的connect()调用,那么将会花费相当长的时间,使用者可以通过同时打开多个套接字来加速扫描。
使用非阻塞I/O允许你设置一个低的时间用尽周期,同时观察多个套接字。
但这种方法的缺点是很容易被察觉,并且被防火墙将扫描信息包过滤掉。
目标计算机的logs文件会显示一连串的连接和连接出错消息,并且能很快使它关闭。
2、TCPSYN扫描:
这种技术通常认为是“半开放”扫描,这是因为扫描程序不必要打开一个完全的TCP连接。
扫描程序发送的是一个SYN数据包,好象准备打开一个实际的连接并等待反应一样(参考TCP的三次握手建立一个TCP连接的过程)。
一个SYN|ACK的返回信息表示端口处于侦听状态:
返回RST表示端口没有处于侦听态。
如果收到一个SYN|ACK,则扫描程序必须再发送一个RST信号,来关闭这个连接过程。
这种扫描技术的优点在于一般不会在目标计算机上留下记录,但这种方法的缺点是必须要有root权限才能建立自己的SYN数据包。
3、TCPFIN扫描:
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连接,即入侵者可以从自己的计算机和目标主机的FTPserver-PI(协议解释器)连接,建立一个控制通信连接。
然后请求这个server-PI激活一个有效的server-DTP(数据传输进程)来给Internet上任何地方发送文件。
对于一个User-DTP,尽管RFC明确地定义请求一个服务器发送文件到另一个服务器是可以的,但现在这个方法并不是非常有效。
这个协议的缺点是“能用来发送不能跟踪的邮件和新闻,给许多服务器造成打击,用尽磁盘,企图越过防火墙”。
3.5功能设计与流程图
第四章端口扫描模块实现
4.1输入要扫描的网段并将其排序
//功能:
输入一个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; } 4.2ScanIP扫描 建立多个线程,每个线程扫描一个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.3清理结束后进程 //清理 voidCleanProc() { //线程都执行完后清理socket相关信息 while (1) { WaitForSingleObject(g_ThreadNumMutex,INFINITE); if(g_runThreadNum==0) { break; } ReleaseMutex(g_ThreadNumMutex); Sleep(100); } //清理socket相关信息 WSACleanup(); } 4.4输出结果 //输出扫描结果 intOutPutScanInfo() { cout<<"扫描到"< multimap : iteratoriter=g_map_ScanResult.begin(); ofstreamout("out.txt"); cout<<"显示总"< cout< for(;iter! =g_map_ScanResult.end();++iter) { out< cout< } return0; } 4.5计算时间 //计算程序运行时间 end_time=clock(); cost_time=(double)(end_time-start_time)/CLOCKS_PER_SEC; cout<<"使用时间为: "< 第五章抓包模块分析设计 5.1IP包知识 要能捕获并解析IP数据包,首先要了解IP数据包的格式。 互联网络层是TCP/IP协议参考模型中的关键部分。 IP协议把传输层送来的消息组装成IP数据包,并把IP数据包传送给数据链层。 IP协议在TCP/IP协议族中处于核心地位,IP协议制定了统一的IP数据包格式,以消除个通信子网中的差异,从而为信息发送方和接收方提供了透明的传输通道。 所以编制本程序前,首先要对IP包的格式有一定了解。 下图给出了IP协议的数据包格式: . IP数据包由首部和数据两部分组成。 首部的前一部分是固定长度,共20字节,是所有IP数据报必须具有的。 在首部的固定部分的后面是一些可选字段,其长度是可变的,可选字段之后是数据部分。 其中,首部固定部分中的各字段的长度及意义如下: (1)版本 占4位,指IP协议的版本。 通信双方使用的IP协议版本必须一致。 目前广泛使用的IP协议版本号为4(即IPv4)。 关于IPv6,目前还处于草案阶段。 (2)首部长度 占4位,可表示的最大十进制数值是15。 请注意,这个字段所表示数的单位是32位字长(1个32位字长是4字节),因此,当IP的首部长度为1111时(即十进制的15),首部长度就达到60字节。 当IP分组的首部长度不是4字节的整数倍时,必须利用最后的填充字段加以填充。 因此数据部分永远在4字节的整数倍开始,这样在实现IP协议时较为方便。 首部长度限制为60字节的缺点是有时可能不够用。 但这样做是希望用户尽量减少开销。 最常用的首部长度就是20字节(即首部长度为0101),这时不使用任何选项。 (3)区分服务 占8位,用来获得更好的服务。 这个字段在旧标准中叫做服务类型,但实际上一直没有被使用过。 1998年IETF把这个字段改名为区分服务DS(DifferentiatedServices)。 只有在使用区分服务时,这个字段才起作用。 (4)总长度 总长度指首部和数据之和的长度,单位为字节。 总长度字段为16位,因此数据报的最大长度为2^16-1=65535字节。 在IP层下面的每一种数据链路层都有自己的帧格式,其中包括帧格式中的数据字段的最大长度,这称为最大传送单元MTU(MaximumTransferUnit)。 当一个数据报封装成链路层的帧时,此数据报的总长度(即首部加上数据部分)一定不能超过下面的数据链路层的MTU值。 (5)标识(identification) 占16位。 IP软件在存储器中维持一个计数器,每产生一个数据报,计数器就加1,并将此值赋给标识字段。 但这个“标识”并不是序号,因为IP是无连接服务,数据报不存在按序接收的问题。 当数据报由于长度超过网络的MTU而必须分片时,这个标识字段的值就被复制到所有的数据报的标识字段中。 相同的标识字段的值使分片后的各数据报片最后能正确地重装,成为原来的数据报。 (6)标志(flag) 占3位,但目前只有2位有意义。 标志字段中的最低位记为MF(MoreFragment)。 MF=1即表示后面“还有分片”的数据报。 MF=0表示这已是若干数据报片中的最后一个。 标志字段中间的一位记为DF(Don’tFragment),意思是“不能分片”。 只有当DF=0时才允许分片。 (7)片偏移 占13位。 片偏移指出: 较长的分组在分片后,某片在原分组中的相对位置。 也就是说,相对用户数据字段的起点,该片从何处开始。 片偏移以8个字节为偏移单位。 这就是说,每个分片的长度一定是8字节(64位)的整数倍。 (8)生存时间 占8位,生存时间字段常用的的英文缩写是TTL(TimeToLive),表明是数据报在网络中的寿命。 由发出数据报的源点设置这个字段。 其目的是防止无法交付的数据报无限制地在因特网中兜圈子,因而白白消耗网络资源。 最初的设计是以秒作为TTL的单位。 每经过一个路由器时,就把TTL减去数据报在路由器消耗掉的一段时间。 若数据报在路由器消耗的时间小于1秒,就把TTL值减1。 当TTL值为0时,就丢弃这个数据报。 后来把TTL字段的功能改为“跳数限制”(但名称不变)。 路由器在转发数据报之前就把TTL值减1.若TTL值减少到零,就丢弃这个数据报,不再转发。 因此,现在TTL的单位不再是秒,而是跳数。 TTL的意义是指明数据报在网络中至多可经过多少个路由器。 显然,数据报在网络上经过的路由器的最大数值是255.若把TTL的初始值设为1,就表示这个数据报只能在本局域网中传送。 (9)协议 占8位,协议字段指出此数据报携带的数据是使用何种协议,以便使目的主机的IP层知道应将数据部分上交给哪个处理过程。 (10)头部检验和 占16位。 用于存放检查报头错误的校验码。 检验的范围是整个IP包的报头。 校验和按如下方法计算: 1)将头校验和的字段置为0。 2)将报头部分的所有数据以16位为单位进行累加,累加方式是求异或。 3)将累加的结果取反码,就是头校验和。 当收到一个IP包时,要检查报头是否出错,就把报头中的所有数据以16位为单位进行累加,若累加的结果为0,则报文没有出错。 (11)源地址 占32位。 为发送方的IP地址。 (12)目的地址 占32位。 为接收方的IP地址。 5.2功能设计与流程图 为了获取网络中的IP数据包,必须对网卡进行编程,在这里我们使用套接字(socket)进行编程。 但是,在通常情况下,网络通信的套接字程序只能响应与自己硬件地址相匹配的数据包或是以广播形式出发的数据包。 对于其他形式的数据包,如已到达网络接口但却不是发送到此地址的数据包,网络接口在验证投递地址并非自身地址之后将不引起响应,也就是说应用程序无法收取与自己无关的数据包。 我们要想获取流经网络设备的所有数据包,就需要将网卡设置为混杂模式。 整个系统可以分为四个模块,分别为套接字模块、捕获IP数据包模块、解析IP数据包模块和输出模块。 下面是程序流程图和各模块功能简介。 1.套接字模块 套接字模块主要包括原始套接字的创建和原始套接字的设置。 此模块先创建一个原始套接字,然后将此套接字绑定到一个本机的网络接口,再设置套接字使其能捕获经过此网络接口的所有IP数据包。 2.IP数据包的捕获模块 此模块主要负责捕获IP数据包,然后将捕获的数据包提交给IP数据包解析模块。 此模块利用设置好的原始套接字捕获IP数据包,然后将数据包提交给解析模块,直到键盘输入Ctrl+C时结束。 3.IP数据包分析模块 此模块主要负责对IP数据包进行分析,即根据IP数据包的格式把信息从捕获到的IP数据包中提取出来,然后再提交给输出模块。 4.输出模块 此模块负责输出IP数据包信息的输出,包括输出到标准输出和日志文件。 6.1数据结构的定义 本程序主要用到了两个数据结构,一个是IP头的结构体,一个是常用IP协议号与协议名的映射,为使程序代码更加美观,将这两个数据结构写在了头文件里。 1.IP头结构体 根据IP数据包的格式,定义IP头结构体如下: structIPHead { u_charihl: 4;//头长度 u_charversion: 4;//版本 u_chartos;//服务类型 u_shortlen;//IP包的总长度 u_shortid;//标识 u_shortoff;//分段偏移量 u_charttl;//生存期 u_charprotocol;//协议 u_shortcksum;//头校验和 structin_addrsaddr;//源IP地址 structin_addrdaddr;//目的IP地址 }; 2.常用IP协议号与协议名的映射 为了通过协议号得到协议名,于是定义了一些常见的协议号与其协议名的映射关系,如下: pair make_pair(1,"ICMP"), make_pair(2,"IGMP"), make_pair(3,"GGP"), make_pair
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 网络 端口扫描 分析 报告