今天我们继续聊一聊网络端口扫描那些事,以及Python如何助力于端口扫描。无论今后你是否从事网络安全或者安全渗透测试一职,只要你在测试、测开领域行走着、奔跑着,“网络端口扫描”将是你知识技能储备中不可或缺的一角。
端口扫描可视为一种监控技术,用来依次定位某个指定主机上可用的,开放的端口。
一般而言,这类技术常见于网络管理员,渗透测试人员甚至黑客等人的日常工作实践中。这类人员可以根据当前工作任务需求,配置端口扫描器,最大程度地获取目标系统中的信息。
通常经过对目标主机端口扫描后,可以获取的信息主要包括:
(1)目标主机上开放的所有端口
(2)在每个端口上运行的服务及其相关信息
(3)目标主机的操作系统和MAC地址信息
我们可以把端口扫描想象成一个小偷悄悄进入一间房子(目标主机可视为房子),检查每个门窗是否关好(端口可视作门窗),看看哪些门窗是打开的(哪些端口是开放的)。
在互联网中,用于通信的是TCP/IP协议,该协议套件由两个协议组成,即TCP和UDP。这两种协议都有0到65535个端口。这些端口按范围可分为如下三类:
(1)系统或公认端口:0 —— 1023
(2)用户或注册端口:1024 —— 49151
(3)动态或私有端口:49151 —— 65535
可见系统服务器上的端口众多,但实际上常用的端口才几十个,由此可以看出未定义的端口相当多。为了安全起见,通常建议关闭系统中不必要的端口,不对外开放。
如此一来,我们就有超过65000个端口需要关闭。
在上一篇文章中《测试人必会 ——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端口,进行查看。
扫描结果如下:
在实践了Socket、Ping方式进行端口扫描后,我们再来看另一种方式,通过建立TCP进行端口扫描。
TCP需要经过三次握手,才能建立连接,三次握手创建连接的过程如下:
首先,客户端会向服务端发送一段TCP报文,标志位为SYN,表示“请求建立新连接”。
接着,正常情况下,正处于监听状态下的服务端,会接收来自客户端发来的报文,随后,服务端也会返回 一段TCP报文。
同时标志位为SYN-ACK,表示“确认客户端的报文序号有效,告诉客户端,服务端收到了来自客户端的数据,同意创建新连接”。
即,目标系统返回一个设置了 SYN和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 获取。希望会给你带来帮助和方向
喜欢软件测试的小伙伴们,如果我的博客对你有帮助、如果你喜欢我的博客内容,请 “点赞” “评论” “收藏” 一键三连哦!