今天我们继续聊一聊网络端口扫描那些事,以及Python如何助力于端口扫描。无论今后你是否从事网络安全或者安全渗透测试一职,只要你在测试、测开领域行走着、奔跑着,“网络端口扫描”将是你知识技能储备中不可或缺的一角。
端口扫描可视为一种监控技术,用来依次定位某个指定主机上可用的,开放的端口。
一般而言,这类技术常见于网络管理员,渗透测试人员甚至黑客等人的日常工作实践中。这类人员可以根据当前工作任务需求,配置端口扫描器,最大程度地获取目标系统中的信息。
通常经过对目标主机端口扫描后,可以获取的信息主要包括:
(1)目标主机上开放的所有端口
(2)在每个端口上运行的服务及其相关信息
(3)目标主机的操作系统和MAC地址信息
我们可以把端口扫描想象成一个小偷悄悄进入一间房子(目标主机可视为房子),检查每个门窗是否关好(端口可视作门窗),看看哪些门窗是打开的(哪些端口是开放的)。
在互联网中,用于通信的是TCP/IP协议,该协议套件由两个协议组成,即TCP和UDP。这两种协议都有0到65535个端口。这些端口按范围可分为如下三类:
(1)系统或公认端口:0 —— 1023
(2)用户或注册端口:1024 —— 49151
(3)动态或私有端口:49151 —— 65535
可见系统服务器上的端口众多,但实际上常用的端口才几十个,由此可以看出未定义的端口相当多。为了安全起见,通常建议关闭系统中不必要的端口,不对外开放。
如此一来,我们就有超过65000个端口需要关闭。
使用Socket进行端口扫描在上一篇文章中《测试人必会 ——Python带你上手Web Socket》,介绍了套接字相关知识。现在,我们将使用套接字构建一个简单的端口扫描器。
使用套接字进行端口扫描器的构建,通过Python脚本实现如下:
运行上述脚本后,首先会提示输入目标主机名,这里可以输入你想要扫描的任何主机名。
值得一提的是,未经授权下的端口扫描可能被视为违法行为。
所以在未经服务器或计算机所有者,明确书面许可的情况下,不应对任何网站/IP地址执行端口扫描程序。
在自行练习实践的情况下,强烈建议在本地主机或自己的网站上执行端口扫描。
以上程序我们仅以自己本机为例,进行实践展示,为了节省时间,我们仅将扫描的端口范围设置在100 到 450;
扫描结果如下:
输出显示,在100到450的端口范围内(不包括450),经过Python Socket脚本创建的扫描程序,扫描后发现两个端口( 端口135和445)是开放的。读者朋友们也可以更改此范围,检查其 他端口的开放情况。
Ping扫描可以在特定网络范围内,查找多台机器其端口的可用性。假设我们有一个待测IP地址列表,通过Ping扫描(即操作系统的Ping命令),可以逐个扫描列表中的所有IP地址,但通过命令行的方式逐一扫描IP地址是非常耗时的。
Python给我们提供了解决方案,简洁的Python脚本就能帮我们实现Ping扫描,查找实时主机中端口的可用性。
具体实现脚本如下:
通过将IP地址范围拆分为多个部分来选择要Ping扫描扫描的IP地址范围。
运行上述脚本后,首先会提示输入目标主机名,这里为了安全起见,还是以我们本机为例"127.0.0.1",然后分别输入起止端口号,为了便于演示和节省时间,这里我们仅扫描130-135端口,进行查看。
扫描结果如下:
使用TCP进行端口扫描在实践了Socket、Ping方式进行端口扫描后,我们再来看另一种方式,通过建立TCP进行端口扫描。
TCP需要经过三次握手,才能建立连接,三次握手创建连接的过程如下:
1 步骤1-设置SYN 标志的数据包
首先,客户端会向服务端发送一段TCP报文,标志位为SYN,表示“请求建立新连接”。
2 步骤2- 设置SYN-ACK标志的数据包
接着,正常情况下,正处于监听状态下的服务端,会接收来自客户端发来的报文,随后,服务端也会返回 一段TCP报文。
同时标志位为SYN-ACK,表示“确认客户端的报文序号有效,告诉客户端,服务端收到了来自客户端的数据,同意创建新连接”。
即,目标系统返回一个设置了 SYN和ACK标志的数据包。
3 设置ACK标志的数据包
客户端接收到来自服务端的确认(即,确认收到服务端发来的TCP报文)之后,明确了从客户端到服务端的数据通信是正常的。
这时,客户端会返回最后一段TCP报文,标志位为ACK,表示“确认收到服务器端同意连接的信号”。
即,告诉服务器,我知道你收到我发的数据了。
也许,在读者看来,这三次握手间的相互确认着实麻烦了些,既然可以通过上面的Ping命令进行端口扫描,何必又多此一举,用TCP创建连接的方式,进行端口扫描呢?
其背后的主要原因是假设我们对数据包使用了防火墙,那么Ping扫描程序将无法工作,这时就需要TCP扫描来协助了。
具体实现脚本如下:
首先通过将IP地址范围拆分为多个部分来选择要Ping扫描扫描的IP地址范围。
接下来是使用扫描地址的函数,该函数进一步使用套接字,从而得出有关主机的响应以及完成扫描过程所需的时间。
其中connect_ex((addr,135)) 语句,如果操作成功则为0,否则为errno 变量的值。
安全起见,我们以本机为例 “127.0.0.1”,分别输入起止端口号,为了便于演示和节省时间,这里我们仅扫描130-135端口,进行查看。
扫描结果如下:
总结无论你是否有志于安全测试,端口扫描技术都是测试人员知识储备库中不可或缺的一项。
本次分享通过Python提供的三种方式,对目标系统进行端口扫描,进行了实战演练。希望通过本文的学习,能够加深你对网络端口的认知,让它不再成为你的知识盲区。
现在就有这么一个机会,我邀请你进入我们的软件测试学习交流群:914172719,备注“csdn”大家可以一起探讨交流软件测试,共同学习软件测试技术、面试等软件测试方方面面,还会有免费直播课,收获更多测试技巧,我们一起进阶Python自动化测试/测试开发,走向高薪之路。
最后也为大家准备了一份配套的学习资源,你能在 公众号:【伤心的辣条】免费获取一份216页软件测试工程师面试宝典文档资料。以及相对应的视频学习教程免费分享!,其中资料包括了有基础知识、Linux必备、Shell、互联网程序原理、Mysql数据库、抓包工具专题、接口测试工具、测试进阶-Python编程、Web自动化测试、APP自动化测试、接口自动化测试、测试高级持续集成、测试架构开发测试框架、性能测试、安全测试等。
喜欢软件测试的小伙伴们,如果我的博客对你有帮助、如果你喜欢我的博客内容,请 “点赞” “评论” “收藏” 一键三连哦!
好文推荐
转行面试,跳槽面试,软件测试人员都必须知道的这几种面试技巧!
面试经:一线城市搬砖!又面软件测试岗,5000就知足了…
面试官:工作三年,还来面初级测试?恐怕你的软件测试工程师的头衔要加双引号…
什么样的人适合从事软件测试工作?
那个准点下班的人,比我先升职了…
测试岗反复跳槽,跳着跳着就跳没了…
包装成1年工作经验的测试工程师,我给他的面试前的建议如下
“入职一年,那个被高薪挖来的自动化软件测试被劝退了。”
4个月自学软件测试面进阿里!如何从功能测试转成自动化…我经历了什么
6000元报了培训班,3个月后我成功“骗”进了腾讯大厂,月薪15000



