现在让我们将目光转向对各种专业服务的渗透测试。作为渗透测试工程师,你在职业生涯中很可能遇到这样的公司客户或者渗透环境:他们仅仅需要对某一台特定的服务器进行渗透测试,这台服务器上可能运行着数据库、IP电话(voice over internet protocol,VOIP)或者监控和数据采集系统(supervisory control and data acquisition,SCADA)。本章在实现对这些服务的渗透的同时,还要对使用的方法进行完善。本章将着眼于以下几个要点。
成功完成一次对特定服务的渗透测试需要娴熟的渗透技巧以及对服务的深刻理解。本章将从这两个方面下手,完成对服务进行的渗透测试。
SCADA是一系列软件和硬件的组合,现在已经广泛应用在堤坝、发电站、炼油厂以及大型服务器控制服务等方面的管理中。
SCADA主要用于完成高度专业的任务,例如对水位的调度控制、天然气管道的输送、电力网络的控制,等等。
SCADA系统是ICS(工业控制系统),通常用在一些很关键的环境中。一旦出现问题,将很有可能危及人的生命。ICS通常应用在大型工业生产中,负责控制各种生产过程,例如按照一定比例混合两种化学药品、在特定环境中加入二氧化碳、向锅炉中加入适量的水,等等。
这种SCADA系统的组成部分如下所示。
组成部分 |
用途 |
---|---|
远程终端单元 |
这是一种可以将模拟类型的测试值转换为数字信息的装置。使用最广泛的通信协议是ModBus |
可编程逻辑控制器 |
这个部件集成了输入输出服务器和实时操作系统,它的工作与RTU十分相似。它也可以使用各种网络协议(例如FTP、SSH) |
人机界面 |
这是一个可以直接观察或者通过SCADA系统控制的图形化显示环境。HMI是图形用户界面,是攻击者利用的一个方面 |
智能电子设备 |
这基本上就是一个微芯片,具体来说就是一个控制器。它可以通过发送命令来完成指定的任务,例如在加入特定剂量的某种物质与另一物质混合之后关闭阀门等 |
ICS起着十分关键的作用,一旦它们的控制权落入到不法分子手中,将会产生灾难性的后果。可以试想一下,如果天然气管道的电路控制系统遭到了恶意拒绝服务攻击,这可不仅仅会给我们带来点麻烦而已——某些SCADA系统的损坏是会要人命的。你也许看过电影《虎胆龙威4》,其中黑客们控制了天然气管道,这看起来好像很酷;他们还引起了交通混乱,这好像也很有趣。但在现实生活中,一旦这种事情发生,将会造成十分严重的破坏,甚至会夺走一些人的生命。
正如我们过去看到的那样,随着震网病毒(Stuxnet worm)的出现,ICS和SCADA系统的安全性遭到了严重的侵犯。接下来将讨论如何渗透进入一个SCADA系统,或者如何对它们进行测试以确保它们的安全,以此来共创一个安全的未来。
本节将会讨论如何渗透进入SCADA系统。现在有很多可以测试SCADA系统的工具,但是对它们的讨论将会超出本书的范围。因此,为了保证本书简单易读,这里只介绍以Metasploit为工具对SCADA系统的HMI的渗透。
测试SCADA的基本原理
让我们开始了解渗透SCADA系统的基本知识。最近Metasploit中添加了很多渗透模块,利用这些模块可以渗透进入SCADA系统。然而,由于安全性的进步,在网络上找到还在使用默认的用户名和密码的SCADA服务器已经不太可能了,但这种可能性却的确存在。
目前比较流行的互联网扫描网站是https://shodan.io,它提供了在互联网上查找SCADA服务器的功能。下面给出了在Metasploit中集成Shodan的步骤。
首先在Shodan网站创建一个账号。
(1) 成功注册后,可以在账户的Shodan服务中找到API密钥。利用这个密钥,可以通过Metasploit搜索各种服务。
(2) 启动Metasploit,并加载auxiliary/gather/shodan_search
模块。
(3) 将模块中参数SHODAN_APIKEY
的值设定为你所申请账户中的API密钥。
(4) 试着使用Rockwell Automation公司开发的系统来查找SCADA服务器,这需要将QUERY
参数的值设定为Rockwell
,结果如下图所示。
(5) 设置SHODAN_APIKEY
选项和QUERY
选项,得到如下图所示的结果。
我们使用Metasploit模块很轻松地在互联网上找到了大量采用Rockwell自动化技术的、正在运行的SCADA服务器。但是你最好不要向这些不了解的,尤其是没有权限的网络设备发起攻击。
基于SCADA的渗透模块
最近一段时间, SCADA系统被渗透的事件发生率明显提高。SCADA系统也存在着各种各样的漏洞,例如栈溢出漏洞、整型溢出漏洞、跨站脚本漏洞和SQL注入漏洞。
此外,这些漏洞还可能会威胁我们的财产和生命,这一切正如之前讨论过的那样。造成SCADA设备受到黑客攻击的主要原因有两个:SCADA开发人员在编程时的疏忽和操作人员在控制时的不规范。
我们来看一个SCADA设备的例子,并尝试使用Metasploit来对其进行渗透。在接下来的例子中,我们将会在Windows XP上运行Metasploit来对一个DATAC RealWin SCADA Server 2.0系统进行渗透。
由于这个运行在912端口上的服务使用了C语言中的sprintf
函数,因此存在缓冲区溢出漏洞。DATAC RealWin SCADA server的源代码使用sprintf
函数显示一个根据用户输入构成的特定字符串。一旦这个漏洞函数被攻击者利用,就可能导致整个系统的沦陷。
现在就使用Metasploit中的渗透模块exploit/windows/scada/realwin_scpc_initialize
完成对DATAC RealWin SCADA Server 2.0的渗透。这个过程如下图所示。
将这里RHOST的值设置为192.168.10.108
,将攻击载荷的值设置为windows/meterpreter/bind_tcp
。DATAC RealWin SCADA所使用的默认端口为912。现在就对这个目标进行测试,验证该漏洞是否可以被渗透。
好了!我们利用这个漏洞成功实现了对目标的渗透。接下来载入mimikatz
模块来查找系统中的明文密码,这个过程如下图所示。
当输入命令kerberos
之后,就可以找到以明文形式保存的密码了。我们将会在本书的后半部分对mimikatz
的功能和其他库进行详细的介绍。
大多数的SCADA服务器都工作在内部/孤立的网络上。不过这里假设一种可能性:攻击者已经获得了面向互联网的服务器的控制权,从而可以将该服务器作为跳板来进行入侵。他可以改变PLC的状态,读取和改写控制器的状态,以此造成严重的破坏。下面来看一个例子。
从上图中可以看出,攻击者已经获得了子网192.168.174.0中的一个系统的控制权限,并且已经添加了到达另一个内部网络192.168.116.0的路由。
接下来攻击者将对内部网络中的主机进行端口扫描。假设他在IP地址192.168.116.131上发现了一台主机。进行一次广泛的端口扫描显然是必不可少的,要注意不规范的操作可能会引起严重的后果。下面来看看在这个场景中如何进行端口扫描。
可以看出,前面进行的扫描不是一次常规扫描。这里使用了参数 -n
来禁止DNS解析。参数 -sT
表示使用TCP连接扫描,在这个扫描中会有一秒的延时,这意味着将会按照顺序扫描端口,每次扫描一个。这次Nmap扫描的结果如下所示。
502端口是一个标准的Modbus/TCP服务器端口,用来实现SCADA软件与PLC的通信。有趣的是,Metasploit中提供了一个modbusclient
模块,它可以用来与Modbus端口通信,并且可以实现对PLC中寄存器的内容进行修改。下面给出了一个例子。
可以看到,这个辅助模块的默认功能是读取寄存器。这里我们将"DATA_ADDRESS"
的值设置为4,模块执行之后就会输出第4个寄存器的值。可以看到这个值为0。我们换一个寄存器DATA_ADDRESS 3
再试一次。
好了,将值设置为3,得到的输出为56,这表示当前第3个数据寄存器中的值为56。我们可以将这个值视为温度,如下图所示。
一个攻击者可以通过在辅助模块中将ACTION
的值设置为WRITE_REGISTERS
来修改这些值,如下图所示。
来查看一下我们是否可以修改寄存器中的值。
可以看到,我们已经成功地修改了这个值,这意味着HMI上的温度值也将不可避免地上升,如下图所示。
上面的示例接口仅用作说明目的,并演示SCADA和ICS系统的重要性。我们还可以通过将ACTION
设置为READ_COILS
来处理线圈中的值。此外,我们可以按照如下所示设置NUMBER
选项来读取/写入多个寄存器和线圈中的数据。
在Metasploit中有大量以SCADA系统漏洞为目标的渗透模块。如果想获取有关这些漏洞的详细信息,可以访问互联网上最大的SCADA黑客和安全技术网站http://www.scadahacker.com。在http://scadahacker.com/resources/msf-scada.html页面上的msf-scada部分也有大量有关渗透模块的信息。
使SCADA网络更安全是每一个从事安全防护工作的渗透测试工程师的首要目标。仔细阅读下面的内容来学习如何才能实现SCADA服务的安全并对网络进行约束。
实现SCADA的安全
在实践中实现SCADA的安全是一个很困难的任务。不过,我们在实现SCADA系统的安全时可以遵循以下这些关键点。
对网络进行约束
网络发生的攻击事件通常与未经授权的访问或者多余的开放服务等有关。抵御各种SCADA攻击的最好办法就是移除或者卸载不需要的服务。
SCADA系统通常是基于Windows XP实现的,这加大了系统遭受攻击的可能性。如果你正在设计实现一个SCADA系统,一定要不断地为你的Windows系统安装补丁,这样才能免遭常见攻击的破坏。
学习了对SCADA网络进行渗透的基础知识之后,接下来开始测试数据库服务。在这一节中,我们的主要目标是测试数据库以及测试各种漏洞。数据库中包含了关键业务数据。因此如果数据库管理系统存在漏洞,就可能引起远程代码执行或者整个网络被渗透,从而导致公司的机密数据泄露。与金融交易、医疗记录、犯罪记录、产品、销售、市场营销等相关的数据可能被出售给一些别有用心的人,这些数据库对于他们来说是相当有用的。
为了确保数据库是完全安全的,我们需要制定相关策略,采用各种类型的攻击方式对这些服务进行测试。现在,我们开始测试数据库,看看对数据库进行渗透测试的各个阶段。
早在1989年微软就推出了它的数据库。大多数网站如今将最新版本的MS SQL Server作为它们的后台。不过,如果网站太大或者每天要处理太多的事务,数据库就必须免于受到任何漏洞和问题的困扰。
在本节对数据库的测试中,我们将集中精力以一种有效的方式来测试数据库管理系统。默认情况下,MS SQL运行在TCP的1433端口以及UDP的1434端口。现在开始测试在Windows 8系统上运行的MS SQL Server 2008。
现在使用Metasploit中用于MS SQL的专门模块,并查看通过这些模块可以帮助我们获得哪些信息。要使用的第一个辅助模块是mssql_ping
,这个模块会收集一些其他的服务信息。
好的,现在载入这个模块并开始这次扫描,如下图所示。
正如上图所示,我们通过扫描获得了大量的信息。Nmap提供了一个类似的模块来扫描MS SQL数据库。但是与Nmap相比,Metasploit辅助模块返回的结果显然可读性更强。下面看看还有哪些模块可用来测试MS SQL Server。
渗透测试数据库的下一步是对身份验证模式进行精确的检测。Metasploit中含有一个名为mssql_login
的内置模块。我们作为身份验证的测试者,可以使用这个模块来对MS SQL数据库中的用户名和密码进行暴力破解。
现在载入这个模块并分析这个结果。
运行了这个模块之后,它会首先使用系统的默认用户名和密码进行测试。这个默认用户名就是sa
,而默认的密码则是空。如果使用这个组合成功登录,我们就可以知道默认的用户名和密码还在使用之中。此外,如果使用sa
账户并不能成功登录,那么就需要使用更多的登录凭证去进行测试。为了完成这项任务,我们将参数USER_FILE
和PASS_FILE
的值分别设置为进行破解所要使用的用户名和密码字典文件的名字,然后对DBMS的用户名和密码进行暴力破解。
来设定渗透需要的几个参数:USER_FILE
、PASS_FILE
以及RHOSTS
。只有设定了这些参数,模块才能正常运行。我们对这几个参数进行如下设置。
现使用这个模块来对目标数据库服务器进行攻击,输出如下图所示。
正如上面的结果展示的,我们看到了两条与数据库相匹配的用户名和密码信息,还找到了默认用户名sa
,它的密码为空。另外,还发现了另一个用户名为nipun
、密码为12345
的登录凭证。
现在我们已经取得了sa
和nipun
两个数据库用户的登录凭证。接下来通过使用其中一个来获取其他用户的登录凭证。可以使用mssql_hashdump
模块来完成这个任务。让我们查看这个模块的工作过程,并从这个模块成功完成后提供的所有信息中进行调查。
我们已经获得数据库服务器中其他用户密码的散列值。现在可以使用第三方工具来对这些散列值进行破解,这样就可以提升权限或者获得其他数据库和表的权限。
我们在上一节中取得了目标数据库的用户名和密码。现在可以登录到这个服务器上,从该数据库收集重要的信息,比如存储过程、数据库的数量和名称、可登录到数据库的Windows组、数据库中的文件以及一些参数。
为了实现这个目的,可以使用mssql_enum
。接下来看看如何在目标数据库上运行这个模块。
当mssql_enum
运行起来之后,就可以收集到该数据库的大量信息。来看看它都为我们提供了什么信息。
正如我们看到的那样,这个模块几乎展示了数据库的所有信息,例如存储过程、数据库的名称和数量、被禁用的账户,等等。
我们将会在5.2.6节中看到如何绕过一些禁用的存储过程。另外,如xp_cmdshell
之类的过程可能会导致整个数据库被渗透。可以从上图中看到该服务器中xp_cmdshell
是可用的。接着查看mssql_enum
模块还提供了哪些信息。
运行这个模块之后,可以从上面的屏幕截图中看到大量的信息。这里面包括了一个存储过程的列表、一些密码为空的账户、数据库的Windows登录名以及管理员登录名。
在收集够了关于目标的信息以后,让我们在目标数据库上完成一些后渗透攻击。为了完成后渗透攻击,可以使用两个不同但都十分方便的模块。第一个要使用的模块是mssql_sql
,凭借它将可以在数据库上运行SQL查询。第二个要使用的模块是mssql_exec
,它可以启用已经被禁用的xp_cmdshell
,从而允许执行系统级的命令。
重新载入xp_cmdshell
功能
模块mssql_exec
将会通过重新载入禁用的xp_cmdshell
功能来运行系统级的命令。这个模块需要设置要执行的系统命令的CMD
选项。让我们查看一下这个过程。
完成了mssql_exec
模块的运行之后,屏幕上将会显示出如下图所示的结果。
结果窗口中清楚地显示了对目标数据库服务器成功执行的系统命令。
运行SQL查询命令
可以使用mssql_sql
模块对目标数据库服务器执行SQL查询命令。你只需将SQL参数的值设定为一条有效的数据库查询命令,这条命令就会被执行,如下图所示。
将SQL参数的值设置为select @@version
。数据库成功执行这条查询命令之后,我们就可以获悉这个数据库的版本了。
按照之前的步骤,可以使用Metasploit来测试出各种数据库的漏洞。
我的另一本著作中介绍了对MySQL数据库的测试:https://www.packtpub.com/networking-and-servers/metasploit-bootcamp。
下面提供了一些用于保护MS SQL数据库的资源:https://www.mssqltips.com/sql-server-tip-category/19/security/。
关于MySQL的一些参考资料:http://www.hexatier.com/mysql-database-security-best-practices-2/。
现在的重点是测试支持VOIP的服务,并学习如何找到可能影响VOIP服务的各种漏洞。
相比传统的电话服务,VOIP的价格要低廉很多。相比传统的电信业务,VOIP更加灵活,也提供了各种特性,例如多样的扩展性、来电显示服务、日志服务、每次通话的录音,等等。最近许多公司都推出了用于IP电话服务的专用交换机(private branch exchange,PBX)。
无论是传统的还是现代的电话系统在面对物理线路的攻击时都还显得十分脆弱。例如,一个攻击者改变了电话线路的连接情况,将受害者的电话线路连接到了自己这里。他将可以使用自己的设备接听本来是打给受害者的电话,也能够以受害者的号码拨打外部的电话,同样可以使用这个线路来上网或者发送、接收传真。
在对VOIP进行渗透的时候,可以不用改变受害者的电话线路。不过,如果你并不了解关于VOIP的基础知识以及工作原理,那么这次渗透将会是十分困难的工作。这部分内容将会向我们指明如何在不挟持电话线路的情况下成功渗透一个VOIP网络。
PBX简介
在中小型企业中,PBX是一个性价比很高的电话通信解决方案。因为它非常灵活,实现了各房间和各楼层之间的通信。大型公司也可能会选择PBX,主要因为要将每一条电话线路单独与外界联通是一项很麻烦的工作。一个PBX包括以下几个部分。
VOIP服务的类型
可以将VOIP技术分成三种不同的类型,下面来看看它们都是什么。
自托管网络
在这种类型的网络中,PBX通常被安装在客户端的页面本身,与Internet 服务提供商(Internet service provider,ISP)建立远程连接。这种类型的网络连接通常通过大量的虚拟局域网向PBX设备发送VOIP数据流量,这些流量会被转发给公用电话交换网(public switched telephone network,PSTN)和ISP以进行线路交换和建立互联网连接。下图给出了一个图形化的例子。
托管服务
在托管服务类型的VOIP技术中,客户端都不存在PBX。但是,所有设备都是在客户端通过互联网连接到服务提供商的PBX,也就是使用IP/VPN技术通过会话初始协议(session initiation protocol,SIP)线路连接的。
让我们在下图的帮助下看看这项技术是如何实现的。
SIP服务提供商
互联网上有很多的SIP服务提供商,他们提供了可以直接使用的VOIP服务。此外,可以使用任何客户端去接入VOIP服务,例如Xlite,如下图所示。
可以使用Metasploit内置的SIP扫描模块工具来对网络中的VOIP设备进行踩点。这里有一个极为著名的SIP端点扫描程序(SIP endpoint scanner)就内置在Metasploit中,可以通过让这个扫描器发出各种SIP服务的options
请求来查找网络上启用了SIP服务的设备。
继续使用/auxiliary/scanner/sip
下的options
辅助模块对VOIP进行扫描,并对扫描的结果进行分析。这里的目标是一个运行了Asterisk PBX VOIP客户端的XP系统。通过载入一个辅助模块来扫描网络中的SIP服务,如下图所示。
可以看到在auxiliary/scanner/sip/options
辅助模块中有很多可以配置的选项,这里必须进行配置的选项只有RHOSTS
。当对大型网络进行配置的时候,可以使用无类别域际路由选择(classless inter domain routing,CIDR)格式来定义IP地址段。当模块运行起来后,将会开始扫描指定IP范围内可能使用SIP服务的设备,运行这个模块的过程如下图所示。
我们清楚地看到,这个模块在成功运行之后会返回给我们许多使用了SIP服务的设备的IP相关信息。这些SIP服务包括agent(它指示PBX的名称和版本)和verbs(它定义PBX支持的请求的类型)。因此,可以使用这个模块来收集网络上的SIP服务的相关信息。
找出目标所支持的各种选项的请求信息后,现在让我们使用另一个Metasploit模块auxiliary/scanner/sip/enumerator
来对VOIP服务进行扫描和用户列举。这个模块对目标范围内的VOIP服务进行扫描,并试图列举出所有用户。下面来看一下这个模块的功能。
上图列举了这个模块的所有选项。为了能使用该模块,必须对其中的一些选项进行设置。
如图所示,我们设置了MAXEXT
、MINEXT
、PADLEN
和RHOSTS
选项。
在上图中使用的列举模块中,我们分别将MINEXT
和MAXEXT
的值定义为3000
和3005
。MINEXT
是查找分机号码的起始地址,MAXEXT
是查找分机号码的结束地址。可以将这些选项设置成一个相当大的范围,例如将MINEXT
设置为0
,将MAXEXT
设置为9999
,这样将会在0
~9999
地址范围内使用VOIP服务的分机号码中查找用户。
接下来为RHOSTS
变量赋一个CIDR格式的值来运行这个模块,从而扫描目标范围内的计算机,如下图所示。
将RHOSTS
的值设定为192.168.65.0/24
,该模块将会扫描整个目标子网。现在运行这个模块,可以看到如下显示。
扫描结果显示了大量使用了SIP服务的用户。另外,由于之前设置了MAXEXT
和MINEXT
的值,该模块只扫描了分机号码为3000
~3005
的用户,一个分机号码可以被看作是一个特定网络中用户的地址。
在获得了足够多的关于使用SIP服务的用户信息之后,使用Metasploit来伪造一次欺骗性的通话。这里有一个用户在Windows XP上运行着SipXphone 2.0.6.27,可以使用auxiliary/voip/sip_invite_spoof
模块来向他发送一个伪造的会话请求,过程如下图所示。
我们将参数RHOSTS
的值设定为目标的IP地址,将EXTENSION
设定为4444。SRCADDR
的值保持为192.168.1.1
,这个值就是我们拨打电话时伪造的源地址。
好了,现在运行这个模块。
现在查看受害者的客户端。
可以清楚地看到,电话软件显示有来电了。显示的来电IP为192.168.1.1
,同时也显示了来自Metasploit的预定义消息。
如果想获得系统的完全控制权限,也可以尝试对电话软件进行渗透。在上一个场景中,我们已经获得了目标的IP地址,接下来让我们使用Metasploit对其进行渗透。Kali操作系统中包含了专门设计测试VOIP服务的工具。下面提供了一个可以用来渗透VOIP服务的工具列表。
现在返回到渗透的内容,在Metasploit中同样包含了很多用来渗透VOIP软件的功能模块,我们来看一个这样的例子。
这里要渗透的目标程序是SipXphone Version 2.0.6.27,该应用的图形化界面如下图所示。
关于漏洞
这个漏洞在该应用处理Cseq
值的时候产生。发送一个超出指定长度的字符串将会引起该程序崩溃,同时还会导致攻击者运行恶意代码并获得系统的管理权限。
对应用的渗透攻击
现在开始使用Metasploit对SipXphone Version 2.0.6.27进行渗透。要用到的渗透模块为exploit/windows/sip/sipxphone_cseq
。在Metasploit中启动这个模块,并设置必要的选项。
这里必须设置RHOST
、LHOST
和payload
的值。当一切设置完毕之后,开始对目标程序进行渗透,这个过程如下图所示。
成功了!我们不费吹灰之力就获得了目标的Meterpreter控制权,使用Metasploit利用软件的漏洞来渗透VOIP是一项极为容易的任务。如果要对VOIP设备或其他设备相关的漏洞进行高效测试,可以使用第三方工具。
从以下网址可以找到对VOIP进行测试的优质资源:http://www.viproy.com。
可以参考更多关于确保VOIP网络安全性的优秀指南:https://searchsecurity.techtarget.com/feature/Securing-VoIPKeeping-Your-VoIP-Networks-Safe和https://www.sans.org/reading-room/whitepapers/voip/security-issues-countermeasurevoip-1701。
在本章中,我们见识到了多个渗透测试。在这些场景中,我们分别完成了对各种服务的渗透,例如数据库、VOIP和SCADA。本章学习了SCADA以及它的基本原理,还学习了如何获得一个数据库服务的各种信息,以及如何取得这个数据库的全部控制权限。此外,还学习了如何通过扫描网络上的VOIP客户端来实现VOIP欺骗,以此完成对VOIP服务的测试。
在进入下一章之前,你应该完成以下练习。
下一章将介绍如何使用Metasploit和其他的流行扫描工具来完成一个完整的渗透测试。还将涵盖如何系统地实现一次对指定目标的渗透测试,介绍如何创建一份渗透测试的报告,以及该报告中应该包含哪些内容和应该将哪些内容排除在外。