《Python网络安全项目实战》项目4 编写网络扫描程序
- 项目4 编写网络扫描程序
- 任务4.1 扫描内网有效IP地址
- 任务描述
- 任务分析
- 任务实施
- 任务拓展
- 任务4.2 编写端口扫描工具
- 任务描述
- 任务分析
- 任务实施
- 相关知识
- 任务评价
- 任务拓展
- 项目评价
项目4 编写网络扫描程序
许多扫描工具是由Python编写的。本项目中我们将用python写一个IP扫描工具,用来发现内网在线的IP以及开放的端口。
项目目标:
能够正确获取系统的类型,是Windows还是Linux;
能够正确获得本机IP的地址;
能够正确得到IP地址的在线和端口开放情况。
任务4.1 扫描内网有效IP地址
任务描述
在对局域网进行管理时,为了知道网段内的IP在线情况,知道网段IP地址的使用情况,我们可以对网段的所有IP地址进行一次扫描。
任务分析
判断一个IP是否在线,最简单的方法就是去ping这个IP,通过ping返回的信息来判断IP是否在线,在Windows中ping命令默认发送4个数据包,而Linux中默认是一直发送数据,但是这个值也是可以更改的,Windows中只需要加上-n参数后面跟上一个数字,就是发送多少个数据包,而Linux中为-c,为了统一发送数据包的个数,需要先判断系统为Linux还是Windows。
确定好系统之后就是本网段的所有网址,对于一个C类内网网段,,一共有256个内网地址,从0到255,通过获取自己的IP地址,再对IP地址进行编辑,就可以获得内网所有IP,再通过ping命令去ping所有的IP,再通过返回信息就可以得到内网所有有效的IP地址。
使用python编程进行内网的IP扫描,那么需要用到网络相关的模块,在扫描内网前,先要知道自己的IP地址,而自己的IP地址是本地系统上的信息,所以还需要用到os模块,为了一次ping多个IP同时进行,还需要treading模块。
任务实施
【步骤1】:由于这次IP扫描的编程过程中需要使用系统、网络、线程、时间模块,所以在编程前先引用需要的模块(见图4-1-1)。
图4-1-1 引用需要使用的模块
【步骤2】:先获取系统信息,判断自己的系统是windows,还是linux,返回ping时需要使用-n,还是-c参数来确定数据包的个数(见图4-1-2)。
图4-1-2 获取系统类型
【步骤3】:获取到系统信息之后,再根据返回判断是windows,还是linux,根据不同的系统使用不同的方法获取IP(见图4-1-3)。
图4-1-3 获得本机IP地址
【步骤4】:获取到本机内网IP之后,调用系统ping命令来确认IP是否在线(见图4-1-4)。
图4-1-4 判断IP是否在线
【步骤5】:通过对获取本机内网IP的处理,生成整个网段的IP,生成一个IP就调用ping_IP这个方法看IP是否在线(见图4-1-5)。
图4-1-5 判断当前网段的在线IP
【步骤6】:在所有方法和功能都编写完成之后,编写主函数调用各方法(见图4-1-6)。
图4-1-6 编写主函数
【步骤7】:在Python IDLE中打开并运行程序(见图4-1-7)。
图4-1-7 运行程序
相关知识
platform模块:platform模块中有很多函数用来获取操作系统信息,包括操作系统名称,版本号,操作系统的位数,计算机类型,计算机网络名称等。
threading模块:threading模块的主要做用是来处理和控制线程的,一个进程可以有多个线程。
socket模块:socket模块是用来处理网络连接问题的,可以用做服务端,也可以用作客户端。
subprocess模块:subprocess模块的功能是用来创建个管理子进程的,还提供一些管理标准流和管道的工具,在进程间使用文本通信。
任务评价
请学生按照下表中的要求完成本次评价,并在物理机桌面上以自己的两位学号+姓名的形式命名文件夹,保存所有截图文件,文件保存为jpeg或 png格式。
任务拓展
- 编写程序扫描内网有效IP,并将找到的IP自动记录在文本文件当中。
- 编写程序读取记录IP的文本文件,与扫描到的内网有效IP进行对比验证。
任务4.2 编写端口扫描工具
任务描述
使用python对指定端口进行扫描。
任务分析
在对服务器的探测中,能否正确的判断端口的开放是十分重要的,一个服务器开放的端口越多,就代表着打开的窗户越多,而这些打开的窗户,难免就会存在一些问题,那么我们为了能够更好安全性,就必须了解一个服务器开放了哪些端口,利用python,就可以很好的实现端口的发现。
在python编程中,可以使用socket模块中的connect()来与指定IP的指定端口建立连接,连接建立成功则说明IP的端口是开放状态,若长时间没能成功建立连接,我们就认为这个端口是关闭的。
端口一共有65535个,周知端口为0-1023,注册端口为1024-49151,动态端口为49152-65535,而常用的服务一般都在0-1023之间,除了这个1024个端口外,还有一些常见端口,如1433,3389,4899等。
本任务要求在192.168.1网段对指定的IP地址区间进行扫描,扫描每一个IP地址的端口,并将扫描结果保存在一个文件中。
IP地址的生成。
端口号的生成。
扫描端口是否开放。
任务实施
【步骤1】:引用socket模块,如图4-2-1所示。
图4-2-1 引用模块
【步骤2】:定义变量接收开始IP和结束IP,如图4-2-2所示。
图4-2-2 IP
【步骤3】:定义变量接受开始端口和结束端口,如图4-2-3所示。
图4-2-3 端口
【步骤4】:使用socket模块中的connect()函数,函数不报错,不报异常,则表示端口连接成功,端口开放,否则端口就是关闭的,如图4-2-4所示。
图4-2-4 端口连接
【步骤5】:调用函数,如图4-2-5所示。
图4-2-5 调用函数
【步骤6】:在python IDLE中运行python程序或扫描指定IP的端口,会在python程序所在的目录生成一个IP_Port.txt文件,文件中会保存python程序运行的结果,如图4-2-6所示。
图4-2-6 运行python程序
【步骤7】:打开IP_Port.txt文件可以看到程序的运行结果,如图5-2-7所示。
图4-2-7 IP_Port.txt文件内容
相关知识
Socket模块:在使用socket模块中的connect()函数连接目标IP和端口时,设定一个超时时间,当端口不可达时,则会一直连接,端口可达时,则无状态,将超时的端口定位未开放端口。
Connect()扫描:这种扫描模式,是发起正常的访问请求,通过“三次握手”来确认端口的开放。
(1)服务器端口开放:
客户端发送一个SYN包给服务器。
服务器返回一个SYN/ACK包,表明端口开放。
客户端返回一个ACK包,建立接连。
客户端主动断开连接。
(2)服务器端口关闭:
客户端发送一个SYN包给服务器。
服务器返回一个RST/ACK包,表明端口未开放。
任务评价
请学生按照下表中的要求完成本次评价,并在物理机桌面上以自己的两位学号+姓名的形式命名文件夹,保存所有截图文件,文件保存为jpeg或 png格式。
任务拓展
- 编写慢速内网有效IP扫描程序,避免占用过多的网络资源。
- 编写随机延时慢速端口扫描程序,隐藏扫描行为避免被网络管理员发现。