基于端口扫描的变电站主机漏洞检测系统

2022-01-28 02:13颜天佑
信息安全研究 2022年2期
关键词:安全漏洞线程口令

颜天佑 卢 灏

(广东电网有限责任公司广州供电局 广州 510620)

随着第4次工业革命的到来,工业信息化进程不断推进,传统电网已经不能满足国民生产生活的需求,再加上严峻的资源匮乏和环境污染问题,使得智能电网成为主流的发展趋势.变电站作为电力供应网络的重要环节,必然是智能电网研发中的热点领域.不仅要承担起电力能量转换、调节控制、信息检测等重要工作,更需要具备电力网络的实时监测、自动控制、信息分析、风险预测和处理等高级功能.然而,网络本身就是一个开放性服务系统,再加上主流通信协议和系统架构在使用中固有的安全缺陷,使得任何一种网络系统都不可能完全避开网络风险以及安全威胁[1].这也就意味着人们在接受由快速发展的网络所带来的生活上的便利和经济上的效益的同时,也要面对网络空间安全提出的可能危及到每个人的巨大挑战,比如黑客攻击、病毒传播、非法联络、信息窃取等,这些威胁网络信息安全的事件频发,给国家安全、制度完善和人身权利造成了很大的危害,并造成了巨大的经济损失.所以,在如今这个信息化程度稳步提升、网络技术应用高速扩展的时代,保障网络空间的安全显得愈发重要.

根据目前网络安全的状况来看,虽然国家和企业都对这方面投入了很多财力物力人力,但是仍然没能有效地将黑客的攻击阻挡在防火墙外.尤其针对电网来说,紧密关系国民日常生活和国家正常运作,很多黑客会利用一些尚未发掘或潜在已久的漏洞攻击电力网络或者窃取内部机密信息.总的来说,我们认为变电站系统仍存在以下安全隐患:

1) 智能变电站2次系统本身的网络架构复杂,涉及多设备、多层次、多系统,很容易出现漏洞,使得网络本身的安全性大大降低;

2) 系统管理和维护耗费大量的人力物力财力,防火墙的部署以及漏洞库的更新都是一个长期的可持续过程;

3) 对网络安全保护范畴缺乏正确完整的认识,构建安全可靠的智能变电站系统不仅需要在传统的电力网络中融入网络技术,更包括安全策略在管理中的部署[2],在不影响原始系统可用性的前提下提高安全等级;

4) 缺乏有效和准确的入侵检测和漏洞检测系统[3].

因此,本文以变电站主机安全为主要出发点,考虑到它在运行过程中不可避免地要开放各种端口进行服务,设计实现了一个基于端口扫描的漏洞检测系统,并反馈给安全管理人员详细的扫描结果报告,以帮助其了解系统的实时状态,提高安全性.

1 网络安全漏洞及攻击原理

1.1 安全漏洞的定义

所谓的安全漏洞是指在安全策略设计、通信协议应用以及软硬件开发等过程中所存在的不可避免的问题.它允许攻击者在不经过正规许可的情况下访问系统、修改系统甚至销毁系统.漏洞的出现有其必然性[4].

1) 硬件原因

软件程序员无法弥补的硬件有一些固有的漏洞.同时,在工作时,这些由硬件引发的漏洞有很大的可能会通过软件漏洞的形式表现出来.

2) 设计原因

许多计算机网络在初次设计时没有充分考虑安全问题.因此有很多的网络技术和协议在网络安全方面存在着先天的不足,这些是很难通过后天的维护去修复的.

3) 编程原因

从主观方面来看,有一部分编程人员喜欢在自己的程序中留下一些后门来方便自己的一些行为.从客观上来讲,由于时代和技术的限制,很多程序员在编程时不会去考虑安全问题或者没有能力去处理这类问题,导致设计中不可避免的缺陷造成了安全漏洞.从软件工程学科的角度来看,系统的正确性只能通过测试加以验证,但这只能用来发现错误、验证错误的存在,而无法证明某些错误不存在,因此即使经过测试也很难保证系统中没有潜在的隐含错误.

4) 管理原因

即使硬件和软件都完美无缺不存在安全漏洞,但是相关的管理人员在进行网络资源调配或者对系统的不合理配置都会导致一些人为的安全漏洞的产生,这一点很值得人们注意[5].

1.2 安全漏洞攻击

1) 拒绝服务攻击

当攻击者使用类似洪泛的信息击中网络系统时,会出现最常见的DoS攻击.比如用户通过网址访问某网站时,实际上是在向网站的服务器发送浏览网站的请求.由于资源有限,服务器只能同时处理一定数量的请求,因此如果攻击者在一段时间内向服务器发送的请求超过其处理能力,服务器没有资源来处理其他正常请求,导致服务器崩溃.正是因为其他用户无法再进入这个网站所以被称为“拒绝服务攻击”.其攻击原理如图1所示:

2) 缓冲区溢出攻击

所谓的缓冲区是内存中预留出来的用于存储数据的连续存储空间.缓冲区溢出攻击是指实际所存入缓冲区的内容超出其预留的大小,利用地址冲突获得堆栈操作能力,通过重写其返回地址以获得目标控制权[7].缓冲区溢出攻击可能导致程序执行失败、系统关闭或其他后果[8].更重要的是它也可以用来执行未授权的指令,甚至可以获得系统执行各种非法操作的特殊权限[9].

3) 身份欺骗类攻击

身份欺骗是一种主动攻击.这种攻击的方式非常多,常见的有IP欺骗攻击、ARP欺骗攻击、MAC地址欺骗攻击、DNS欺骗攻击、代理服务器欺骗攻击、账户名称欺骗攻击等.其中IP欺骗攻击使用最为广泛[10].

2 网络安全漏洞扫描技术

安全漏洞扫描也被称为脆弱性评估(vulnerability assessment),是为了让安全管理人员能够及时了解网络中有哪些漏洞,来针对性地采取一些措施,从而降低系统受到攻击的概率的一种安全技术.它与防火墙、入侵检测系统的共同配合使用能够为网络系统提供更全面的安全保障[11].相比于防火墙和入侵检测系统的被动防御,漏洞扫描可以说是主动出击,发现漏洞然后防患于未然[12].

2.1 安全漏洞扫描的基本原理

通过扫描网络系统,安全管理员可以清楚地了解网络目前的状态、实时安全配置以及所运行的应用程序和服务.扫描方法[13]是积极的和非破坏性的.从安全保护的角度来看,这种方法可以提前发现潜在的安全风险并在攻击被黑客利用之前对其进行修复.

漏洞扫描技术主要包括2种实现方法:首先是先进行端口扫描,收集系统的各种相关信息,如是否可以匿名登录、是否用root身份运行等.获取目标端口信息及其相应的网络应用服务后,与漏洞库进行比较,发现潜在的安全风险.其次是模拟黑客攻击并对目标执行攻击性安全扫描,如拒绝服务攻击[14].

2.2 端口扫描基本方法

端口扫描是漏洞扫描的主要形式[15].

1) TCP连接扫描(TCP connect scan).又称“TCP全连接扫描”,它也是公认的相比所有扫描技术中最简单直接的方法.它首先针对目标端口建立3次握手通信过程,然后调用操作系统内置函数connect()即可连接到目标计算机.如果端口处于活动状态,则可以成功调用该功能,否则端口将处于不可用状态并且无法提供服务[16].

2) TCP同步序列号扫描(TCP SYN scan).如果端口扫描过程不建立完整的TCP连接,即建立TCP连接时只完成前2次握手,并且连接第3次断开连接,从而无法完全建立连接.这种端口扫描方法也称为“半连接扫描”.

SYN扫描从自身指定端口向目标指定端口发送TCP SYN连接建立请求数据包后,等待对方返回响应数据包[17].如果SYN位和ACK位在响应数据包中有所设置,则证明目标端口是打开的.如果所收到的答复数据包是RST连接重置数据包,则证明另一方的端口处于非活动状态.也就是说使用这种方法只要完成建立连接的有效部分就可以完成端口扫描.

3) TCP结束标志扫描(TCP FIN scan).该扫描方法不依赖于前2种方式中通信双方所要求的TCP 3次握手过程.在TCP连接结束时,它会希望端口发送一个连接终止数据包并为其设置FIN位.如果这个端口是不活跃的,则会忽略该数据包,不对其进行操作,而如果这个端口是活跃的,会对其进行回复,本地端口即可收到具有响应RST设置的连接重置数据包[17].我们可以根据它是否响应RST数据包来判断端口是否处于活动状态.

3 基于端口扫描的变电站主机漏洞检测系统

3.1 系统需求分析与流程设计

总体来说,这是一个基于端口扫描的变电站主机安全漏洞检测系统.

针对智能变电站系统业务连续性和实时性强的特点,进行漏洞检测的过程必须不影响变电站主机的正常运行.本文从端口检测入手,仅通过模拟正常访问建立TCP/UDP连接测试变电站主机的开放端口服务,不要求变电站主机进行额外操作,不占用其他资源.

在端口扫描部分,传统的端口扫描方法中大多是采用指定端口范围的方式,但实际生活中常用的开放端口分散性强、跨度广,大批量检测和多次重复检测都难免会增加变电站主机的访问量和服务负担[18],同时浪费更多时间,不利于漏洞的实时发现与防御.本文在此基础上拓展了指定端口集合的扫描方法,安全人员能够根据变电站系统的实际运行情况,指定需要扫描的端口,只需执行1次检测即可实现多个端口段的检测,保证低耗时、高效率.

在具体实施上,该系统借助Java多线程的机制.并非是同一线程逐个、依次与变电站主机的每个端口建立连接,而是多个线程并发访问1次,分别测试不同的端口,极大地优化了网络连接部分的额外耗时,预防传统检测技术可能造成的网络拥塞问题[19].

最后,考虑到变电站系统管理人员可能对于网络漏洞安全缺乏熟练性和专业性,该系统以HTML的形式给出漏洞扫描报告,尽可能详尽地说明系统状态来协助系统安全管理人员了解系统端口运行状况,提高系统安全性.

系统整体结构如图2所示,分为端口扫描和漏洞检测2大部分.

其中端口扫描部分包含2种方法,漏洞检测模块中则包含3个流程.从上到下,先进行端口扫描,既可以扫描指定的端口范围,也可以扫描指定的端口集合.其目的主要是先找出目标网站主机开放的端口,然后通过调用第三方工具对这些已开放的端口进行漏洞检测,先确定并行的线程数再选择需要检测的漏洞种类,最后检测完成生成检测报告.系统整体流程如图3所示:

3.2 模块设计

3.2.1 多线程并发机制

本文定义了一个scanLargePorts类,类中包含一种后续实现的端口扫描方法ScanMethod.这里通过循环建立线程池,然后线程可以通过调用该方法进行扫描.另外,在后面放置一个while循环来判断线程池是否已经关闭,若关闭则输出“扫描结束”并跳出循环,若尚未关闭则等待1 s,并调用Exception类中的方法打印产生错误的位置和原因.

对于线程数目的确定,考虑到不同外部环境、不同硬件设备对于检测可能造成的干扰,我们允许用户根据设备计算能力、主机负载能力、检测精度要求等自行设置并发线程个数,提高稳定性.

部分模块代码如下:

/*

多线程扫描目标主机的端口开放情况

ip 需要扫描的目标IP或目标域名,

例:14.215.177.38 www.baidu.com;

sport 起始端口号;

eport 结束端口号;

thnumber 并发线程个数;

timeout 连接超时时间

*/

public void scanPorts(String ip, int sport, int eport,int thnumber, int timeout)

{

ExecutorService threadPool=

Executors.newCachedThreadPool();

for (inti=0;i

/*调用端口扫描方法ScanMethod*/

threadPool.execute(scanMethod);

}

threadPool.shutdown();

while (true) {

if (threadPool.isTerminated()) {

System.out.println(“扫描结束”);

break;

}

try {

Thread.sleep(1000);

}

catch (InterruptedException e) {

e.printStackTrace();

}

}

}

3.2.2 端口扫描模块

1) 扫描指定范围端口

主要实现思路是给定一个端口号的范围,让扫描器扫描这个范围中所有端口,检查端口的开放情况.在这里本文通过定义run()函数来实现对范围内每个端口的扫描,并建立socket连接来测试端口是否开放[20],即若能成功建立连接则说明该端口是开放的,若在建立连接时发生超时则说明该端口处于关闭状态.在多线程机制下,对于指定范围内的端口,端口序号是有序排列的,每个线程按照序号一一对应一个端口号,相当于对整个端口序列按照线程总数进行分组,当前线程对分配到的端口检测完成后,自动获取下一组端口中与之对应的端口,间隔式检测,保证每次这些线程偶读同时进行扫描,不会出现多线程同时检测同一端口造成的访问冲突以及资源抢占问题.实现代码如下:

class ScanMethod1 implements Runnable {

private String ip; /*目标主机的IP地址*/

private int sport, eport, thnumber,

serial, timeout; /*serial线程序列号,

即第几个线程 */

public void run() {

int port=0;

try {

InetAddress address=

InetAddress.getByName(ip);

Socket socket;

SocketAddress socketAddress;

for (port=sport+serial; port<=

eport; port += thnumber) {

socket=new Socket();

socketAddress=new

InetSocketAddress(address, port);

try {

socket.connect(socketAddress,

timeout); /*时间超时*/

socket.close();

System.out.println(“端口”+port

+“ :开放”);

}

catch (IOException e) {

/*System.out.println(“端口”+

port+“ :关闭”);*/

}

}

}

catch (UnknownHostException e) {

e.printStackTrace();

}

}

}

2) 扫描指定端口集合

据统计,计算机有大约65535个端口,但是常用端口只有20个左右,跨度范围广、分散性强.若只采用指定端口范围的方式,大批量检测和重复检测都不是最优方法.本文设计了扫描指定端口集合的方式,用户根据实际情况在给定的端口集合中输入所有需要扫描的端口号,只需让扫描器检查这些指定端口是否开放.与之前扫描指定范围的端口类似,只是在这里端口号不是按照顺序依次罗列,而是随机分布的.本文将给定的一系列端口号用数组的形式存储下来,然后依旧通过建立socket连接的方式来确定端口的状态.

public void run() {

/*PortSet为待检测端口集合*/

int port=0;

Integer[] ports=portSet.toArray(new

Integer[portSet.size()]);

try {

InetAddress address=

InetAddress.getByName(ip);

Socket socket;

SocketAddress socketAddress;

if (ports.length<1)

return;

for (port=0+serial; port<=

ports.length-1;port+=thnumber) {

socket=new Socket();

socketAddress=

new InetSocketAddress(address,

ports[port]);

try {

socket.connect(socketAddress,

timeout);

socket.close();

System.out.println(“端口”+

ports[port]+“ :开放”);

}

catch (IOException e) {

/*System.out.println(“端口”+

ports[port]+“ :关闭”);*/

}

}

}

catch (UnknownHostException e) {

e.printStackTrace();

}

}

3.2.3 漏洞检测

考虑到系统的有效完备性,我们共提供20个漏洞检测类型[21].用户可以根据检测需求自行选择.完整的漏洞类型如下:1)开放服务;2)NT-Server弱口令;3)NetBios信息;4)Snmp信息;5)远程操作系统;6)TELNET弱口令;7)SSH弱口令;8)REXEC弱口令;9)FTP弱口令;10)SQL-Server弱口令;11)WWW弱口令;12)CVS弱口令;13)VNC弱口令;14)POP3弱口令;15)SMTP弱口令;16)IMAP弱口令;17)NNTP弱口令;18)SOCKS5弱口令;19)IIS编码/解码漏洞;20)漏洞检测脚本.

当设置好需要检测的漏洞类型后,即可加载插件,检测指定地址的主机中存在的漏洞并生成扫描报告.为了尽可能地帮助管理人员深入了解系统安全状况,所生成的扫描报告中不包含指定地址下的主机存活数量,而且按照问题严重等级分为漏洞数量、警告数量、提示数量,对其出现的安全问题也能够比较详尽的说明,比如每一个安全问题所对应的端口/服务、安全漏洞的表现及其解决方案.

4 系统测试

4.1 端口扫描

本文针对扫描指定端口范围和扫描指定端口集合2种方法,分别测试了并发的不同线程个数针对同一测试主机(172.26.193.192)进行端口扫描的结果.以并发5个线程扫描常见端口为例,扫描结果如图4所示,能够扫描到用来浏览网页的443和80端口处于开放状态.

考虑到检测系统不能影响变电站主机的正常工作,本文对于整个检测过程的耗时也进行了统计.对于指定端口集合的扫描,保证集合相同,分别并发5,10,15个线程进行测试;对于指定范围端口的扫描,分别设置端口号从0~100,0~500和0~1 000,并发线程数分别为10,20,50.结果如表1所示:

表1 多线程并发端口扫描耗时分析

由测试结果可知,系统的整体运行时间在可接受范围内,对变电站主机的正常业务工作影响不大.

当待扫描的端口范围一样时,增加同时进行扫描的线程数能有效地降低耗费的时间,但是增加的线程数如果过大,可能会导致扫描的精度下降.可以由用户根据检测需求自行设置并发线程数目,灵活使用.

4.2 漏洞检测

为了全面测试系统功能,本文首先针对本地主机进行了漏洞检测,检测过程中勾选了所提供的全部漏洞类型,检测过程如图5所示:

为了验证系统的通用性和可靠性,我们还针对另一台主机进行了漏洞检测.2台主机所生成的检测报告如图6和图7所示:

5 结束语

如今,网络空间逐渐发展成为继海、陆、空、天之后的第5个具有战略意义的空间,成为工业信息化、产业智能化的核心、关键和基础.由于网络空间的开放、服务、动态和可移动等异构特性,使得新技术更新换代、不断涌现的同时,也面临着更加严峻的安全形势.本文以关系国民生活的变电站系统为落脚点,为其设计了基于端口检测的漏洞扫描系统,针对其所开放的服务端口,及时监测并发现潜在危险.涵盖了主机中可能存在的20种漏洞供用户自行选择,既能全面检测,也能针对性检测,完备性强,灵活性高.同时,多线程并发操作也使得本文的系统具有较好的实用性和高效性.综上所述,本文设计研发的系统能够协助系统安全管理人员了解变电系统运行状况,提高系统的安全性.

猜你喜欢
安全漏洞线程口令
5G终端模拟系统随机接入过程的设计与实现
实时操作系统mbedOS 互斥量调度机制剖析
浅析体育赛事售票系统错票问题的对策研究
刍议计算机软件中的安全漏洞检测技术
高矮胖瘦
口 令
智能设备安全漏洞知多少
好玩的“反口令”游戏
计算机软件安全漏洞检测技术
健身气功·五禽戏教学口令