基于GUI网络渗透侦察工具设计与实践
摘 要
最近几年来,计算机网络的发展从未停下脚步,并且速度日益增快。为了应付日益增长的网络需求及网络流量,特别是多媒体流量的快速增长,网络信息技术不断产生,人们的生活开始变的更加离不开网络。然而网络给人们带来的帮助的同时也带来了问题。长久以来,网络攻击的数量在不断增长,网络安全事件在不断上演,网络攻防形势日益严峻。网络侦察也成为一种新型的情报信息获取方式。其作为网络攻击的第一个阶段,对于帮助黑客识别攻击系统信息,选择适合的攻击方式起到了重要的作用。因此有一个便于使用的网络渗透信息侦察工具至关重要的。
此应用是结合当下网络发展的实际情况,以满足实际应用为开发目的,参考国外主流的网络渗透侦察工具进行实际需求分析,基于python使用pyqt5开发出来的网络渗透侦察工具。本文详细介绍了网络侦察工具的系统概况,开发背景,网络侦察的研究现状、以及此系统各个模块的分析与实现。
关键词:web安全、网络攻防、网络侦察、图形用户界面
Design and Practice of GUI-based Network Penetration Reconnaissance Tool
Abstract
In recent years, the development of networks is constantly evolving. In order to cope with the increasing network demand and network traffic, especially the rapid growth of multimedia traffic, network information technology is constantly being produced. The Internet has developed into a very important part of people's lives.But the benefits brought by the development of the network have also brought a lot of problems.For a long time, the number of cyber attacks has been increasing, cyber security incidents are being staged, and the situation of cyber attacks and defenses is becoming increasingly grim.Network reconnaissance has also become a new way of acquiring intelligence information. As the first stage of network attack, it plays a vital role in helping hackers to identify information and choose a suitable attack method. Therefore, it is essential to have an easy-to-use network penetration information reconnaissance tool.
This application is combined with the actual situation of the current network development to meet the actual application for development purposes. Refer to the mainstream foreign network penetration reconnaissance tools for actual needs analysis, based on python network penetration reconnaissance tools developed using pyqt5.This article introduces in detail the system overview of the network reconnaissance tool, the development background, the network reconnaissance research status, and the analysis and implementation of each module of this system.
Keywords: Web security,Network attack and defense, network reconnaissance, GUI
目录1 前言11.1设计背景11.1.1计算机网络发展历程11.1.2网络侦察的前景11.1.3 Gui的优势11.2 网络渗透侦察的现状及发展11.3 系统的创新点21.3.1 集成各工具的便捷性21.3.2交互式的应用形式21.4 系统应用的意义21.4.1 对用户21.4.2对网络渗透21.5本章小结32 相关技术概述42.1 网络侦察技术42.2 Python技术42.3 Pyqt5技术42.4 Qt Designer设计工具53 系统需求分析及总体设计63.1 系统需求63.2 系统总体设计73.2.1 用户界面设计73.2.2程序运行流程设计93.3 本章小结94 主要功能模块分析104.1 Ping模块104.2 DNS模块104.3 Whois模块114.4 端口扫描模块124.5 Tracter模块134.6 本章小结135 系统设计与实现145.1 开发环境搭建145.1.1 开发语言阐述145.1.2 Python IDE介绍-PyCharm145.1.3 开发使用框架介绍-Pyqt5145.1.4 开发环境搭建155.2 文件结构及用途155.3 用户界面实现175.4 程序功能实现195.5 本章小结236 系统测试246.1 测试设计246.2 测试结果266.3测试运行效果266.4 本章小结337 总结34参考文献35谢 辞36
1 前言
1.1设计背景
1.1.1计算机网络发展历程
在1980年之后,网络开始走进一个全新的阶段,各种各类技术开始和网络结合,网络可以提供的服务也越来越多,并且应用范围越来越广。计算机网络已经覆盖至全球各地,并且其触手已经伸向了越来越多的领域。网络将成为国家的经济、政治和军事等的重要支柱。各个国家都在加紧对于地域、国家乃至全球的网络建设[1]。以此最终将会建成全球各地人人互通的大型互联网络。截至2018年,全球上网用户高达44亿人。
1.1.2网络侦察的前景
网络的普及应用使得网络侦查的作用日益突出。网络侦察给黑客攻击提供支持,甚至给军事情报侦察开辟了新的领域。但是,随之而来的是新的挑战和新的要求。当今世界是一个全球化信息化时代,网络攻击行为日益增加、信息化战争出现端倪[1]。因此,网络渗透侦察逐渐开始显露出其重要的地位和作用。
1.1.3 Gui的优势
人机的交互告别了以前复杂麻烦的字符命令语言时期,目前正处于基于图像用户界面的新时期。图像用户界面(GUI)是当下的一种主流的用户界面,其被运用于各种系统中。其中,众所周知的Windows系统就是基于图形用户界面。
因其具有人机交互性、美观性、实用性、技术性等的优势,因此广受喜爱。目前流行的图形化用户界面的特点是以窗口界面为关键,通过键盘鼠标等进行输入,并且用户通过点击鼠标即可完成大多数操作。这一种界面在人机交互的过程中主要是靠眼睛观看和手动控制。因此具有极其强的便利性,对于用户,特别是不懂计算机指令的用户非常友好。
1.2 网络渗透侦察的现状及发展
由于计算机的广泛使用,计算机网络上存在着大量的数据,其具有极高的价值。并且网络侦察频繁应用于军事斗争、政治斗争等重要场合中,因此网络侦察的作用在当今时代下越发明显。
当下,社会已经进入信息化时代。我国当前互联网安全的显示日益严峻,在网络上存在着大量的个人信息及重要的数据,一旦泄露后患无穷,同时我国部分主要的网络遭受到大量的DDos攻击。网络的信息情报战已经成为当前国际战争的一个主战场。网络侦察给当下的情报收集工作提供了新鲜思路,注入新鲜力量。
着眼未来,我们可以预见,网络对于人们来说会越来越重要,同时网络渗透侦察也会日渐重要。
1.3 系统的创新点
1.3.1 集成各工具的便捷性
当下要进行网络的一些基本侦察,需要使用多个工具。如,要想对于某一主机进行注册信息的查询,则需要通过使用站长之家、中国万网、阿里查询等网址进行查询,若这时还需要查询网站的开放端口需要通过其他脚本工具进行查询。这种工具间的切换会给用户的网络侦察工作带来不必要的麻烦,浪费用户的时间。
因此本次设计的作品,集成了whois、端口扫描等多种功能模块,使得用户在一个工具中即可查询到目标主机的多种信息,大大缩短用户的使用时间,给用户的侦察工作提供便利。
1.3.2交互式的应用形式
用户在使用时无需掌握计算机的相关指令,无需考虑网络渗透侦察的具体细节及方式。通过键盘输入和鼠标点击的方式即可轻松的获取到自己需要查询的信息。同时该设计也对于每一项功能都进行了适当的说明,通过这种方式提高了用户与程序之间的交互性,降低了用户的使用门槛,使得程序更加便于使用。
1.4 系统应用的意义
1.4.1 对用户
此项集成了多个网络侦察常用的方法,对于用户在进行一些网络信息收集及网络攻击的过程中起到了一个侦察兵及情报员的作用。能够帮助用户了解到目标网络的网络状态、网络地址、网络关键结点、网络联系方式如电话、姓名、邮件、地理位置等等。通过这种方式可以给用户在进行后续的操作时提供一些决策依据,使得用户的后续工作可以更加顺利的进行。
1.4.2对网络渗透
如同普通战争需要使用无人侦察机、侦察卫星、侦察兵等手段进行信息侦察,以便于后续的军事打击行动顺利展开一样,信息化战争中,网络渗透侦察是战争的第一步[2],其起着至关重要作用,使用者通过一定的网络渗透侦察方式来进行主机的侦察及信息的收集,以便后续工作更好的展开。
1.5本章小结
对系统的设计背景及现状进行了简单的概述。并对系统中创新的点进行了初步介绍。系统本身的意义在于帮助用户去简化网络侦察的操作,给用户一个方便、快捷、功能较为齐全的网络侦察工具,以此助力我国的网络侦察事业的发展。
2 相关技术概述
2.1 网络侦察技术
网络侦察是使用相关技术手段,获取对象计算机的相关信息。网络侦察是一次完整的网络攻击的第一阶段,为后续网络攻击的相关工作提供决策信息。其所获情报越丰富则对后续工作帮助越大。
通过对于前人经验的总结,认为一般需要侦察的信息有如下几点[2]:
对象网络的IP地址、名字及域
对象网络的注册信息,比如电话、姓名、邮件和位置等信息
DNS服务器、邮件地址
网络的拓扑结构
满足指定条件的设备
一切与目标主机有关系的其他信息
网络侦察的方式一般包括如下几点:
使用搜索引擎收集,通过搜索引擎全网快速检索和定位信息。
Whois查询,查到目标的注册相关信息。
DNS信息查询,了解IP地址网址名称的对应情况。
网络拓扑发现,通过对于数据包所经过的路径了解目标网络的关键结点。
利用社交网络获取信息,社交网络存在着复杂并且庞大的信息,这些信息也是帮助了解目标网络的重要方式之一。
2.2 Python技术
Python是一种程序设计语言,并且它在当今时代逐渐变的非常流行。具有强的编译性、解释性、互动性[3]、其易读、易维护,深受用户的欢迎与喜爱。一开始,它仅仅是被拿来编写一些自动化相关的脚本。但是,后来他的版本开始更新,功能也变得越来越多,所以它开始被用于开发一些规模比较大的项目。并且在当今社会,其应用领域越来越高。
其具有非常多的优势。重要优势之一就是完全免费,使用者可以不花钱就在随意一台计算机上安装使用Python和他提供的一些扩展库。且其的拓展库越来越丰富,根据这些库可以完成许多的任务。
2.3 Pyqt5技术
Python是现在很流行好用的一种程序设计语言,Qt则是一个很流行好用的开发库,而pyqt则是二者的结合出来的一种产物[4]。其中pyqt5是一个python的模块之一,是一种非常方便的插件。它一共拥有六百二十多个类,六千多个函数。是当下比较流行的开发工具,其功能也非常强大,用其可以开发出美观的界面。 由于python是可以跨越不同的平台之间的限制,pyqt5也支持跨越平台,它可以运行在任何一个多人使用的系统中,比如有UNIX系统,Windows系统,Mac OS系统。
2.4 Qt Designer设计工具
在PyQt的UI界面有两种方法实现[5]。一个是代码,但是比较的麻烦,也不够美观。另一个则是Qt Designer,用户可以直接使用它来设计界面。并且其界面的图像视图与业务逻辑相互之间互不干扰,使得开发更加便捷。Qt Designer中的使用方式非常的方便灵活,可以直接使用鼠标来设置各类控件,并且设置完成后可以直接查看界面的整体效果。最终生成的UI文件也直接通过pyuic5工具转换成PY文件。方便了程序开发,帮助开发人员更好的进行开发。 2.5 本章小结
此章节对与此次设计中用到的基本技术做了大致的介绍,帮助阅读者可以更好的了解此次系统的设计。
3 系统需求分析及总体设计
3.1 系统需求
需求分析是为了对目标系统提出的完整的、明确的、清晰的、可行的需求以便开发。
3.1.2 确定软件需求
在经过多方位的了解及咨询,参考主流软件(Sam Spade)及网络攻击者的实际侦察经验。确定了此工具提供的服务有如下几个:
主机的状态、IP地址、名字及域
注册信息,如电话、姓名、邮件和地理位置等信息
DNS服务器地址
网络的路由查询
网络开放端口
3.1.3 系统需求实现
为了满足以上需求,此系统提供了以下的几个功能模块:Ping模块、DNS模块、Whois模块、Nslookup模块、端口扫描模块、Tracter模块。具体流程如图3.1所示。
添加图片注释,不超过 140 字(可选)
图3.1 程序运行具体流程图
3.2 系统总体设计
3.2.1 用户界面设计
用户界面设计基本规则:
其一是界面具有一致性,要求界面中的控件的整体风格相差不大,界面整体较为和谐。并且在多个界面设置有相似的界面外观、布局以及相似的信息显示(比如背景颜色,控件颜色等)[6]。这样的界面会有比较高的一致性,用户使用起来会更加舒适。因此,控件的颜色、字体字号,边框设置,窗口背景颜色、布局方式和风格、提示信息等都有一个比较统一的标准规则,做到真正具有一致性。
其二是界面要简洁易用,不要过于复杂花俏。太花哨的界面会影响用户对与程序的使用,同时也可能会使得工具的运行变慢。因此界面设计的简洁明了非常重要。特别是对于攻防侦察软件来说,其界面不能太过于吸引眼球,也不能太富贵华丽。因为太过华丽复杂会比较容易使人产生视觉上的疲劳及审美疲劳,让人心浮气躁。同时使用者的注意力有可能会被复杂的界面分散,从而影响工具的使用使其失去其原本的味道。因此,界面设计需合理的布局和设计,颜色相似[6],简洁明了,将软件的性能作为重点进行突出,切勿喧宾夺主。用户界面始终是次要的,起锦上添花的作用。最重要的应该是让软件界面友好实用,这样这样用户才会更加喜爱和接受。
其三是要使得用户界面整体协调。比如控件位置要更加的合理协调,便于用户的浏览和使用。不能出现“前重后轻、右宽左窄”的不协调的现象。当然最重要的是关键的控件放在明显位置,突出重要的控件让用户一目了然,比如此侦察工具中的输入框和侦察得到的信息。
根据需求将此次的系统用户界面分为了四个界面,一个主要的用户界面及三个次要的界面。在主界面中,需要用户输入需要查询的主机名,及选择需要查询的内容,并且用较大的板块输出查询到的内容。在“关于”界面中,需要有应用的相关信息及应用作者的相关信息。在“帮助”界面中需要有一些帮助用户具体了解如何开始使用系统的信息。在“使用说明”界面中则需要有各个模块功能可以为用户提供的具体帮助的内容及对于查询到的结果进行分析的信息,以帮助用户更好的根据查询到的信息展开后续工作。 根据对上述的分析内容,绘制出了用户界面草图,如图3.2所示。
添加图片注释,不超过 140 字(可选)
(a)
添加图片注释,不超过 140 字(可选)
(b) (c)
添加图片注释,不超过 140 字(可选)
(d)
图3.2 使用说明界面草图
3.2.2程序运行流程设计
从需求中可以看出,我们需要进行界面的绘制,数据内容查询,将查询的内容返回至主界面进行显示,各个操作流程如图3.3所示
添加图片注释,不超过 140 字(可选)
图3.3 操作流程图
3.3 本章小结
在此章节中分析了工具的基本需求,以确定系统需要提供的服务及完成的功能,为后续的系统实现指明了方向。同时根据需求对于整个界面进行了初步的设计以及对于系统流程做了初步的介绍。
4 主要功能模块分析
4.1 Ping模块
PING (Packet Internet Grope)中文名字是因特网包探索器,它是用来了解网络是否畅通的。它的工作流程为:首先发送一个网络控制的请求消息给想要查询的网络,并告知其自己是否可以接受到对方的应答。通过这种方法就可以了解所需要查询的主机的网络状态,如该主机是否连接在互联网上,网络丢包率,生存时间、往返时间。
Ping的返回信息有一下四种,其有各种不同的含义,可以帮助用户进行判断。 第一种是Request Timed Out,是说明可以找到需要查询的网络,但是超时了。到达这一个主机的路由有存在于途经的一些路由表中,但是因为网络不太好,存在如网络拥塞这样的问题,使得数据包不可到达。 第二种是Destination Net Unreachable,是说明没有与对方主机建立连接,或者这一个主机是完全不存在的。而且到达这一个主机的路由没有出现在经过的路由表中。
第三种Bad IP address,是说明这个IP地址根本不存在或者没有方法去连解到DNS服务器,因此无法解析这个IP地址。 第四种Source quench received是说明途经的某些服务器或者对方忙,没有办法做出回应。
通过这些状态可以很好的帮助使用者判断目标主机的网络状态,为后续的攻击行为服务。
4.2 DNS模块
DNS既域名系统,其是提供一个容易记住及理解的名称(例如www.baidu.com)来帮助使用者更轻松的访问互联网。
DNS是一个分布式的数据库系统,层次结构来储存IP地址、域名、邮件服务器等信息[1]。根据它的结构,DNS的命名空间是由多个区域组成的,每个区里面有至少一个的域名称相关信息。图4.1[1]为DNS服务器的层次结构图的一个例子:
添加图片注释,不超过 140 字(可选)
图4.1 DNS服务器层次结构[1]
大多数的DNS系统的运行要有两个或者以上的DNS服务器:一台主服务器及一台用来容错的辅助服务器。
通过DNS查询,攻击者可以了解到主机对应的IP地址,及相关的DNS信息,以此来为后续攻击服务。
4.3 Whois模块
在互联网上建立一个网站服务器或者电子邮件服务器或者其他服务时,需要向相关的机构提交域名注册,以便用户访问。相关的注册的信息,如域名、联系方式、地址、电子邮箱、IP地址等信息则存在whois数据库和DNS数据库中,并且这些信息由注册机构及因特网建设组织进行维护。
在1999年之前,互联网上提供的注册服务机构仅有一家:Network Solution,然而随着互联网的不断发展,如今提供服务的机构已有数百家。通过对注册机构的查询,可以获取到一些有用的注册信息,包括如下几个:
姓名:较为完整的注册信息会有包含管理、技术、付款等人员的信息,即使注册信息并不完整,一般也会有一个或以上联系人。
电话号码:联系人的电话号码,一般可用于电话欺骗等的社会工程学攻击。
电子邮件:联系人的电子邮件。了解这个信息不仅可以知道联系人的邮件,更可以能从中推断出目标系统的组织使用的电子邮件格式,攻击者则可以根据目标组织内的任何一个用户名字推断出该用户的电子邮件。
邮件地址:获得该组织的地理位置,从而可以进行垃圾搜索(该搜索可以获取到一些实用的容易让人忽视的信息,帮助攻击者完成攻击。)或者可以到该地址去扫描不安全的无线电接入,以此达到入侵的目的。
IP地址:IP地址及地址段是攻击者开展精确的网络扫描及攻击的基础和前提,其重要性不容小觑。
域名服务器:可以获取到目标组织内部的服务器信息,了解目标组织的域名结构。
其他有效信息:除了以上的其他信息,包括注册及更新时间,目标组织服务器类型等等。
通过进行whois查询,可以帮助攻击者去了解到目标网络的基础信息,以帮助攻击者决策。
一般来说,使用者想要了解whois比较全面的内容,最方便的方法是通过站长之家、阿里云查询、站长工具等的网页进行查询。查询示意图4.2如下:
添加图片注释,不超过 140 字(可选)
图4.2 whois网站查询结果
4.4 端口扫描模块
攻击者要想进行进一步的网络攻击,端口扫描则可以为其提供很大的帮助。就网络而言,一个网络提供着多项服务,每一个处于监听状态的端口都会与网络服务密切相关,这些端口是攻击者进行入侵的一个潜在通道。端口扫描可以获取到网络上有哪些端口是开放的,从而得知主机上有哪些服务是在运行的,为更加高效、准确的网络攻击提供了很好的帮助。
TCP以及UDP是在传输层中的重要协议,其中端口是一个关键的概念。端口与这两个传输的协议有着很大的关系。端口主要用于识别主机上的网络服务。为了方便使用,给端口进行编号,引出了端口号这一概念,其一般分为两种,一种指定配发给常见程序的熟知端口号(0-1023)。另一种是随机配发给客户进程的一般端口号(1024-65535)[7]。常用的熟知端口号如表4.1下:
表4.1 常用熟知端口号
应用程序 | SSH | TELNET | SMTP | DNS | HTTP | POP3 | SNMP | SNMP |
---|---|---|---|---|---|---|---|---|
熟知端口 | 22 | 23 | 25 | 53 | 80 | 110 | 161 | 162 |
攻击者通过对于端口的扫描,可以得知哪些端口是开启的就可以知道哪些服务是开启的,进而利用这些服务的有可能存在的一些漏洞,来进行更进一步的攻击,这样可以帮助攻击更好进行。
4.5 Tracter模块
通过查明目标主机的主要路由路径可以有效的帮助攻击者找到目标网络的关键结点(比如路由器)以此来提高攻击者的攻击效率,使得攻击效果达到最大。
Tracert(跟踪路由)是路由跟踪程序,主要是用于确定数据报在访问目标所的途中走过的路由信息。Tracert命令是通过使用IP生存时间字段以及ICMP的消息来确定相关的路由路径,帮助用户找到攻击的道路。
4.6 本章小结
此章节根据第三章的需求确定了提供的服务的模块,并且对于这些模块进行了较为详细的介绍,介绍了这些模块对于网络渗透侦察的重要性,同时也帮助读者可以更好的了解网络渗透侦察的一些基本知识。
5 系统设计与实现
5.1 开发环境搭建
5.1.1 开发语言阐述
Python是一种程序设计的语言,且它在当今时代逐渐变的非常流行。其具有强的编译性、解释性、互动性,并且其易读、易维护,因此深受用户的欢迎与喜爱。这门语言是由吉多·范罗苏姆开发的,在这次的开发中他决心吸取ABC语言失败的教训,在Python 中避免出现非开放性而导致的失败问题。一开始,它仅仅是被拿来编写一些自动化相关的脚本。后来由于其的开源免费性,吸引了非常多的科学研究机构来使用。慢慢的,它加入了很多的与数据有关的拓展库,因此它变的很适合数据处理、表格制作、甚至是开发科学技术相关的语言程序。后来他的版本开始不断更新,当今已经发展到了python3,功能也变得越来越多,所以它开始被用于开发一些规模比较大的项目。在当今社会其应用领域越来越高,主要可应用Web 和 Internet开发、软件的开发、人工智能、网络爬虫等诸多不同领域。
其具有非常多的优势。重要优势之一就是完全免费,使用者可以不花钱就在随意一台计算机上安装使用Python和他提供的一些扩展库。逐渐其的拓展库越来越丰富,根据这些库可以完成许多的任务。
5.1.2 Python IDE介绍-PyCharm
PyCharm 一款是由 JetBrains 打造的 Python IDE(集成开发环境)。其具有调试、管理项目、关键语法高亮等一般的IDE所具有的功能。界面简洁明了,符合用户的习惯,可以给用户带来比较好的使用体验,因此选择其做为开发使用的IDE。
因为其具有多种功能,可以给项目的设计带来多种便利,并且其提供免费使用的社区版。所以此次设计选择PyCharm作为开发工具。
5.1.3 开发使用框架介绍-Pyqt5
pyqt5是作为python的插件而实现的,其是Python绑定Digia QT5的应用框架。pyqt5做为Python的模块之一,拥有620多个类,6000个函数方法。是当下比较流行的开发工具,其功能也非常强大,用其可以开发出美观的界面。 由于python的跨平台特性,pyqt5也支持跨平台,它可以运行在任何主流操作的系统中,其中包括UNIX系统,Windows系统,Mac OS系统。
因其具简单好用、功能强大、跨平台支持、性能高、稳定性高、原生支持、开源免费等的优势,综合考虑,选取作为此次系统的开发框架。
5.1.4 开发环境搭建
首先安装python,可以直接在官网上下载最新版本的python,下载完成后直接双击安装。安装后在配置环境变量,在Path中添加python安装路径。
安装Pyqt5:打开命令提示符(cmd),输入 “pip3 install sip”安装sip,其会自动下载并安装。完成后输入 pip3 install PyQt5,安装PyQt5,由于网络等多种原因,这个过程会比较漫长。
安装好PyQt5后,安装qt designer ,同样是在命令提示符内输入 “pip install PyQt5-tools”开始下载安装。完成后我们可以在Python安装路径\Scripts下看到designer.exe文件。通过这个文件我们就可以使用拖拽等可视化完成对于界面的设计。
操作流程图5.1如下
添加图片注释,不超过 140 字(可选)
图5.1 操作流程
5.2 文件结构及用途
首先确定“基于GUI的网络渗透侦察工具”的工程名为“my_search”,并建立my_search工程。具体的目录结构如图5.2所示。
添加图片注释,不超过 140 字(可选)
添加图片注释,不超过 140 字(可选)
图5.2 工程目录结构
为了使得项目的文件结构更加清晰,更易于后期的使用和维护。在工程下设置了多个命名空间,用来保存源代码、使用的图片及GUI界面,其中文件名称及说明如下表5.1所示。
表5.1 文件名称说明
资源目录 | 文件名称 | 文件说明 |
---|---|---|
resource | Ui | 文件夹,用来存放.ui格式的GUI界面 |
images | 文件夹,存放图片文件 | |
about.py | “关于”的界面 | |
help.py | “帮助”的界面 | |
instruction.py | “使用说明”的界面 | |
main.py | 程序的主入口 | |
main_window.py | 程序的主界面 | |
my_dns.py | 进行dns查询 | |
my_tcp.py | 进行开放端口扫描 | |
my_whois.py | 进行whois查询 |
项目使用的图标图片保存在images的文件夹中,具体每个资源的用途如下表5.2所示。
表5.2 文件夹images下文件名称及说明
资源目录 | 文件名 | 文件说明 |
---|---|---|
resource.images | about_i.png | “关于”的图标 |
clearall.png | “清屏”的图标 | |
download_i.png | “下载”的图标 | |
help_i.png | “帮助”的图标 | |
instruction.png | “使用说明书”的图标 | |
mainsearch.png | 程序的主图标 |
项目使用的ui界面则保存在ui文件夹中,以便后期可以通过可视化的方式对界面进行二次修改。具体每个资源的相关说明如下表5.3所示。
表5.3 文件夹ui下文件名称及说明
资源目录 | 文件名 | 文件说明 |
---|---|---|
resource.ui | about.ui | “关于”界面 |
help.ui | “帮助”界面 | |
instruction.ui | “使用说明”界面 | |
main.ui | 主界面 |
5.3 用户界面实现
用户界面主要是通过Qt designer工具来进行设计。
根据第三章中提到的设计需求及设计草图,可进行如下具体设计。
界面总体是是用网格布局(GridLayout)实现,其可以让整个界面布局更加工整对称。
主界面的右上侧区域为输入及其他功能区域。左边有一个输入框用作用户输入。其右侧有五个按钮,分别是:清屏、保存到本地、使用说明、帮助、关于。通过这五个按钮,帮助用户更好的使用该工具进行网络侦察。因其无右对齐属性,所以使用弹簧将五个按钮放到最右边。
主界面的左侧为选择查询内容区域。其共有六个按钮,供用户选择所需功能。此应用提供的功能有Ping、Dns、Whois、Port、Tracert、Nslookup,设置按钮属性为仅显示下边框即可到达目标效果。下方是两个字体调节的按钮,通过点击该按钮可以改变输出内容的字体大小,设置按钮为正方形并设置边框加粗即可达到目标效果。为了方便用户使用,为该区域的按钮设置了点击效果,当鼠标移动至按钮上方时,按钮的字体边框变为黑色,当完成点击后按钮字体和边框恢复为白色,其主要是通过代码实现,设置按钮的setStyleSheet为
("QPushButton{color: rgb(255, 255, 255);font: 87 10pt \"Arial Black\";" "border:none;border-bottom:2px solid white;}" "QPushButton:hover{color: rgb(0, 0, 0);border:none;border-bottom:2px solid black;}")
主界面的右下的区域是信息输出的区域,其主要是一个文本框(textBrowser)查询到的信息都会在这个框中显示,并且此框内容无法进行修改。由于此应用主要是信息收集的功能,所以此区域在整个应用中占据最大的板块。并且其默认的显示内容为应用的操作说明,主要包含各个功能模块的介绍,帮助用户了解及使用应用。
其实际显示效果如图4.3所示:
添加图片注释,不超过 140 字(可选)
图5.3 主界面实际效果
关于界面主要是应用的相关信息(如图标名称等)及应用作者的相关信息。其是使用网格布局,在每个布局区域中使用TextBrowser作为信息输出的控件。
帮助界面中则是一些系统使用的简短介绍,帮助用户快速的上手该应用。其使用单个TextBrowser控件进行内容的输出,即可完成对其的显示要求。
以上两个界面效果图5.4如图所示:
添加图片注释,不超过 140 字(可选)
-
(b)
图5.4 关于和帮助界面实际效果
使用说明界面中则有各个模块功能及可查询到的内容,以帮助用户更好的根据查询到的信息展开后续工作。其使用单个TextBrowser控件进行内容的输出,即可完成对其的显示要求。其显示的内容是通过标签<p></p>来进行显示,并且通过修改<p>标签的属性对输出的内容颜色进行修改,突出显示重点,使得显示更加生动有趣。
其效果图如图5.5所示:
添加图片注释,不超过 140 字(可选)
图5.5 使用说明界面实际效果
5.4 程序功能实现
信号与槽:在程序中所有的按钮点击操作都要涉及到信号与槽机制。信号与槽的关联是用 QObject::connect() 函数实现的。接下来以点击ping控件为例,对于ping_pb控件的点击为信号事件名称,start_ping为槽函数的名称,在整个槽函数中可以完成在点击ping按钮后会产生的操作,比如数据的查询和输出。其关键代码如下:
self.ping_pb.clicked.connect(Form.start_ping)
程序入口:程序入口文件main.py。在代码中我们可以看到,定义了一个MyWindowClass的类,在类中通过setupUI生成GUI的界面。当main.py文件被直接执行的时侯,运行“if __name__ == '__main__'”中的代码,生成一个窗口,将MyWindowClass中的控件绘至窗口中并显示。因此用户可以看到程序的窗口及控件。其关键代码如下:
class MyWindowClass(QtWidgets.QWidget,Ui_Form): #定义这个窗口类 def __init__(self): #重写方法以满足需求 super( MyWindowClass, self ).__init__() #继承 self.setupUi(self) #生成控件
if __name__ == '__main__': #执行 app = QtWidgets.QApplication(sys.argv) window = MyWindowClass() window.show() #显示 sys.exit(app.exec_())
数据传输:在程序中,将查询到的数据传输到用户界面中来,并且显示到界面的文本框内,主要是通过使用subprocess模块[8]产生子进程,获取子进程中的返回值,并将他们按行进行一一的读取,使用textBrowser的append方法以循环的方式显示到界面当中。这样用户就可以在界面中看到查询的内容。以查询输出开放端口为例,其关键代码如下:
cmd = "my_tcp.py "+t p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE) for i in iter(p.stdout.readline, ''): #读取行 QApplication.processEvents() #刷新界面 if len(i) < 1: break self.textBrowser.append(i.decode('gbk').strip())
需要注意的是,由于部分查询过程可能耗时会比较长,如果不对界面进行处理可能会导致界面假死,出现无响应的问题。因此在查询以及数据接收的过程中方法使用QApplication.processEvents()方法对用户界面进行不断的刷新,这样就可以一边刷新界面一边进行查询,避免出现假死的现象,使得程序的运行看起来较为流畅。
打开新页面:用管道的方式直接独立运行并绘制一个新的窗口,使得两个窗口在运行是可以互不干扰,其关键代码如下:
os.popen("python help.py")
dns数据查询:直接使用python提供的dns查询的工具包。其中的解析类resolver提供了query方法。使用该方法,并将其查询到的内容以循环的方式进行输出,这样就可以完成一个单纯的dns查询。其关键代码如下:
thedns = dns.resolver.query(host, 'A') for i in thedns.response.answer: for j in i.items: print(j)
开放端口数据查询:其查询的思路是使用socket连接,如果连接成功,则认为端口是开放,获取该端口号并输出。如果连接失败,认为端口关闭[9]。具体过程为:首先定义扫描的端口范围为0-1023,通过循环的方式对于每个端口都使用sock.connect_ex进行连接尝试,其的返回的是连接的状态,如果返回值为0的话,则说明此端口是开放的。将开放的端口保存至openports数组中,并将其一一输出。关键代码如下: def main(): host = sys.argv[1] portList = range(0, 1023) openPorts = threadingPortScan(host, portList) print(host) if len(openPorts)==0: print("No open port please try again") else: for i in openPorts: print("Opened Port : "+str(i)) # 输出
def threadingPortScan(host, portList, openPorts=[]): hostIP = socket.gethostbyname(host) # 获取域名对应的IP
nloops = range(len(portList)) threads = [] #声明一个数组 for i in nloops: #循环获取 t = threading.Thread(target=tcpPortScan, args=(hostIP, portList[i], openPorts)) threads.append(t)
def tcpPortScan(ip, port, openPort): sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 创建套接字 sock.settimeout(0.1) # 设置延时时间 try: result = sock.connect_ex((ip, port)) if result == 0: openPort.append(port) # 如果端口开放,就把端口给openPort except: pass sock.close() # 关闭
whois数据查询:其主要是通过套接字socket方式进行查询[10]。首先连接至whois.internic.net,再使用send方法发送查询的数据,再使用recv方法接收到所查询的数据,并将数据输出。由于该查询可能受网络及whois.internic.net等的影响较大,为避免过程长时间的查询,或者查询不到结果,使得用户界面无响应,因而使用eventlet.Timeout设置超时的时间,避免用户在使用时出现长时间的等待,影响用户的使用体验。
其关键代码如下:
def whois1(t1): with eventlet.Timeout(5, False): # 设置超时时间为5秒 try: s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect(('whois.internic.net', 43)) t=t1.replace('www.','') print(t) tb = bytes(t, encoding = "utf8") s.send(tb+b"\r\n") # 数据传输,类型为bytes response =b'' while True: data = s.recv(4096) response += data if not data : break s.close() print (response.decode()) except BaseException: s = "Timeout Please check the network or URL" print(s)
ping、tracter、nslookup数据查询:由于在windows系统中,通过cmd可以直接对ping、tracter、nslookup进行查询。因此,此次程序直接通过管道的方式查询获取到使用命令提示符的查询数据,并将他输出至界面中。由于数据的获取传输显示的方式在上面做过阐述,在此就不再赘述。
数据保存至本地:其是通过使用textBrowser的toPlainText方法获取到显示款内的数据,并且写入文件中。写入完成后弹出一个QMessageBox提示框,提示保存成功。其关键代码如下:
content = self.textBrowser.toPlainText() t=str(self.lineEdit.text()) ntime=str(time.time()) fname= t + ntime print(fname) with open('./'+fname,'w',encoding='utf-8')as f:#设置编码格式
f.write(content) QMessageBox.information(self, '保存到本地', '保存成功!', QMessageBox.Ok)
改变字体大小:其是通过使用lambda方法进行带参数的信号传递,槽函数取得textBrowser的字体大小,并且通过font.setPointSize方法将字号进行增加或者减小,随后通过textBrowser.setFont方法重新设置字体的大小。以字体增大为例,其关键代码如下:
self.add_pb.clicked.connect(lambda: Form.addfontsize(font))
def addfontsize(self,font): i = font.pointSize() font.setPointSize(i + 1) self.textBrowser.setFont(font)
5.5 本章小结
本章节主要对开发语言Python的基本知识,开发环境的搭建、项目结构、用户界面的实现、具体功能的实现等多方面进行了具体的阐述,以帮助阅读者更好的了解这个程序从无到有的实现过程。
6 系统测试
6.1 测试设计
至此,已经完成了代码的编写工作,接下来在的这一个章节中对此程序进行系统的测试,测试环境为window10系统。
主要测试过程:以www.163.com为测试的目标主机,对程序实现的功能模块进行一一测试。
根据需求和相关使用情况制定了较为系统全面的黑盒测试[11]计划。同时依照测试计划中的操作对程序的功能进行测试并对比结果。具体完整的计划如表6.1所示:
表6.1 测试计划
测试程序 | 测试方法 | 测试步骤 | 预期结果 |
---|---|---|---|
界面显示 | 黑盒测试 | 点击运行程序 | 程序界面显示完整,各按钮及按钮图标均正常显示 |
ping | 黑盒测试 | 分别对输入框进行如下操作:不输入、输出正确主机、输出错误主机点击ping按钮进行查询 | 不输入时,显示框输出“请输入需要查询的内容!(如www.baidu.com)”输入正确主机时,显示款正常显示ping查询的内容。输入错误主机时,显示框提示“找不到主机” |
DNS | 黑盒测试 | 1.分别对输入框进行如下操作:不输入、输出正确主机、输出错误主机2.点击DNS按钮进行查询 | 不输入时,显示框输出“请输入需要查询的内容!(如www.baidu.com)”输入正确主机时,显示款正常显示所查询主机的IP地址输入错误主机时,显示框提示“Please check the network or URL” |
Whois | 黑盒测试 | 1.分别对输入框进行如下操作:不输入、输出正确主机、输出错误主机2.点击Whois按钮进行查询 | 不输入时,显示框输出“请输入需要查询的内容!(如www.baidu.com)”输入正确主机时,显示款正常显示所查询主机的注册信息(如名称地址等)输入错误主机时,显示框提示“No match for ” |
Port | 黑盒测试 | 1.分别对输入框进行如下操作:不输入、输出正确主机、输出错误主机2.点击Port按钮进行查询 | 不输入时,显示框输出“请输入需要查询的内容!(如www.baidu.com)”输入正确主机时,显示款正常显示所查询主机的开放端口号。输入错误主机时,显示框提示“The host is invalid” |
Tracert | 黑盒测试 | 1.分别对输入框进行如下操作:不输入、输出正确主机、输出错误主机2.点击Tracert按钮进行查询 | 不输入时,显示框输出“请输入需要查询的内容!(如www.baidu.com)”。输入正确主机时,显示款正常显示所查询主机的IP地址。输入错误主机时,显示框提示“无法解析目标系统名称 swsws。”。 |
Nslookup | 黑盒测试 | 1.分别对输入框进行如下操作:不输入、输出正确主机、输出错误主机2.点击Nslookup按钮进行查询 | 不输入时,显示框输出“请输入需要查询的内容!(如www.baidu.com)”。输入正确主机时,显示款正常显示所查询主机的IP地址及服务器信息。输入错误主机时,显示框提示“Unkown”。 |
清屏 | 黑盒测试 | 点击清屏按钮 | 显示框内的内容恢复为空 |
保存 | 黑盒测试 | 点击保存按钮 | 显示框内输出的查询信息保存至同一级目录下,并且弹出“保存成功”提示 |
使用说明 | 黑盒测试 | 点击使用说明按钮 | “使用说明”界面显示完整 |
帮助 | 黑盒测试 | 点击帮助按钮 | “帮助”界面显示完整 |
关于 | 黑盒测试 | 点击关于按钮 | “关于”界面显示完整 |
字体放大 | 黑盒测试 | 点击左下方的加号键 | 显示框内字体变大 |
字体缩小 | 黑盒测试 | 点击左下方的加号键 | 显示框内字体变小 |
按钮提示 | 黑盒测试 | 将鼠标放在左侧的功能按钮上 | 按钮旁有关于该功能下相关提示 |
6.2 测试结果
经过了系统的功能测试,具体结果如下表6.2所示。
表6.2 测试结果
测试程序 | 测试结果 |
---|---|
界面显示 | 测试通过 |
ping | 测试通过 |
DNS | 测试通过 |
Whois | 测试通过 |
Port | 测试通过 |
Tracert | 测试通过 |
Nslookup | 测试通过 |
清屏 | 测试通过 |
保存 | 测试通过 |
使用说明 | 测试通过 |
帮助 | 测试通过 |
关于 | 测试通过 |
字体放大 | 测试通过 |
字体缩小 | 测试通过 |
按钮提示 | 测试通过 |
6.3测试运行效果
以下为程序具体运行的效果图。
点击运行该程序,显示框默认显示为该程序的使用说明书,效果如下图6.1所示:
添加图片注释,不超过 140 字(可选)
图6.1 主界面效果图
输入主机,点击清屏(使查询结果不受其他功能干扰),点击ping按钮进行查询,效果如图6.2所示:
添加图片注释,不超过 140 字(可选)
图6.2 ping查询后效果图
输入主机,点击清屏,点击DNS按钮进行查询,效果如图6.3所示:
添加图片注释,不超过 140 字(可选)
图6. 3 DNS查询后效果图
输入主机,点击清屏,点击Whois按钮进行查询,效果如图6.4所示:
添加图片注释,不超过 140 字(可选)
图6.4 whois查询后效果图
点击清屏,点击Port按钮进行查询,效果如图6.5所示:
添加图片注释,不超过 140 字(可选)
图6.5 端口扫描后效果图
输入主机,点击清屏,点击Tracert按钮进行查询,效果如图6.6所示:
添加图片注释,不超过 140 字(可选)
图6.6 路径追踪后效果图
输入主机,点击清屏,点击Nslookup按钮进行查询,效果如图6.7 所示:
添加图片注释,不超过 140 字(可选)
图6.7 nslookup查询后效果图
点击清屏,效果如图6.8所示:
添加图片注释,不超过 140 字(可选)
图6.8 点击清屏后效果图
点击保存到本地,效果如图6.9所示:
添加图片注释,不超过 140 字(可选)
图6.9 保存到本地后效果图
点击使用说明,效果如图6.10所示:
添加图片注释,不超过 140 字(可选)
图6.10 使用说明界面效果图
点击帮助和关于,效果如图6.11所示:
添加图片注释,不超过 140 字(可选)
添加图片注释,不超过 140 字(可选)
-
(b)
图6.11 帮助及关于界面效果图
点击放大字体,效果如图6.12所示:
添加图片注释,不超过 140 字(可选)
图6.12 放大字体后效果图
点击缩小字体,效果如图6.13所示:
添加图片注释,不超过 140 字(可选)
图6.13 缩小字体效果图
将按钮鼠标移至功能选择按钮上(以whois为例),效果如图6.14所示:
添加图片注释,不超过 140 字(可选)
图6.14 鼠标悬浮提示效果图
6.4 本章小结
此章节对于系统进行了系统测试,测试了系统中的各功能。描述了各个功能的使用方法和使用效果,同时也将完整的运行效果进行展示。
7 总结
经过数月的学习与努力,基于GUI的网络渗透侦察工具终于完成。由于对网络侦察及网络攻防有着浓厚的兴趣,但是网络侦察的相关集成工具少之又少,这是我对此选题感兴趣的重要原因,同时也是我从一开始对于GUI编程完全不了解到慢慢摸索着完成此软件的一大动力。
在这过程中,我学习到了很多知识,比如python基础知识、pyqt5基本语法、管道技术、socket网络编程、网络侦察基本知识等。最重要的是我学习到了利用网络上的丰富资源去解决问题,以及认识到,在遇到问题和困难的时候要勇于挑战,绝对不要轻易放弃。
虽然这个系统基本的功能已经实现,但是我知道,由于我水平有限,对于该系统的实现当中还是有一些不足,用户界面的操作还不够灵活。但是我相信随着我的不断努力和学习,此系统还可以得到进一步的优化与完善,带给用户更好的使用体验。
参考文献
[1] 丁学峰, 张翔. 网络侦察的发展前景[J]. 情报杂志, 2003(06):98-99.
[2] 吴礼发,洪征,李华波. 网络攻防原理与技术[M]. 北京:机械工业出版社,2019.
[3] 嵩天,礼欣,黄天羽. python语言程序设计基础(第二版)[M].高等教育出版社,2017.
[4] 王硕,孙洋洋. PyQt5快速开发与实战[M]. 北京:电子工业出版社,2017.
[5] 养薛定谔的猫.PyQT5速成教程-2 Qt Designer介绍与入门[EB/OL].PyQT5速成教程-2 Qt Designer介绍与入门 - 简书,2018
[6] jiezi506.用户界面设计的基本原则[EB/OL].https://wenku.baidu.com/view/7e02ebf804a1b0717fd5ddf0,2018
[7] 谢希仁.计算机网络(第7版)[M].电子工业出版社,2018.
[8] 墨痕诉清风. Python subprocess.Popen 实时输出 stdout(正确管道写法)[EB/OL].Python subprocess.Popen 实时输出 stdout(正确管道写法)_python subprocess stdout-CSDN博客, 2018
[9]sime_km.用python实现多线程端口扫描[EB/OL].用python实现多线程端口扫描_python 多进程端口扫描器-CSDN博客,2018
[10] 张呵呵呀.Python小白入门--(域名whois查询为例)[EB/OL].Python小白入门--(域名whois查询为例) - 张呵呵呀 - 博客园,2018.
[11] 黑马程序员.软件测试[M].人民邮电出版社,2019