渗透测试是一种有目的性的、针对目标机构计算机系统安全的检测评估方法。渗透测试可以发现系统的漏洞和安全机制方面的隐患,并以此进行渗透攻击来取得目标计算机的控制权。通过渗透测试可以知道目标机构的计算机系统是否易于受到攻击,现有的安全部署是否能妥善地抵御攻击,以及哪部分安全机制可能被绕过,等等。渗透测试的主要目的是改善目标机构的安全性。
正所谓“工欲善其事,必先利其器”,渗透测试能否成功很大程度上取决于测试时是否使用了正确的工具和技术。渗透测试工程师必须选择正确的渗透测试工具和技术,才能保证任务的完成。当提到最优秀的渗透测试工具时,安全业界的绝大多数人士都会首先想到Metasploit渗透框架。现在,Metasploit被公认是进行渗透测试时最有效的安全审计工具之一,它提供了最全面的漏洞渗透模块库,集成了优秀的模块开发环境,具有强大的信息收集和Web测试能力及其他许多功能。
本书不仅介绍了Metasploit渗透框架的功能与用法,还重点讲解了如何开发Metasploit模块和扩展Metasploit框架。本书假定读者已经掌握了Metasploit渗透框架的基础知识。在本书的部分章节中,我们也将带领读者回顾一些Metasploit渗透框架的基础性操作。
根据本书涵盖的所有知识,我们将按照下图所示的流程进行讲述。
本章将回顾渗透测试和Metasploit渗透框架的基础内容,这有助于我们学习后面的内容。
本章将着眼于以下几个要点。
正如“罗马不是一天就能建成的”,我们也不可能一天就成为专家级的渗透测试工程师。从一个“菜鸟”转变成渗透高手需要大量的实践工作,熟悉工作环境,具备对危急情况的处理经验,而最为重要的是,需要在反复的渗透测试工作中不断加深自己对该技能的领悟。
要对一个目标进行渗透测试,首先必须确保安全测试计划遵循了渗透测试执行标准(Penetration Testing Execution Standard,PTES)。如果对渗透测试的流程并不了解,可以登录http://www.pentest-standard.org/index.php/PTES_Technical_Guidelines来学习渗透测试和漏洞分析部分的内容。依照PTES的要求,下图给出了渗透测试过程的各个阶段。
请参考http://www.pentest-standard.org网站,了解如何在工作环境中设置硬件和渗透测试系统阶段信息。
在开始复杂的Metasploit攻击之前,先来了解一下渗透测试的各个阶段,看看一个专业的渗透测试是如何组织的。
作为渗透测试的第一个步骤,前期交互阶段将确定客户(可能是一个公司、机构或者网络)的渗透测试的关键细节。这一切都是在与客户进行商讨之后决定的。这个阶段是连接客户与渗透测试工程师的桥梁。在这个阶段,渗透测试工程师要与客户进行充分的交流,以便客户对即将开展的渗透测试会对他的网络或者服务器产生的影响有足够的了解。
因此,渗透测试工程师要以客户指导者的身份来进行这一阶段的工作。这一阶段还将确定渗透测试的范围、目标以及进行分析时的特殊需求,例如特殊的权限、关键系统的访问许可、网络或系统凭证等。商讨的范围还将包括渗透测试预期对测试目标所产生的积极效果。在本阶段,需要商讨的关键点如下所示。
如果想获得关于前期交互的更多信息,请访问网址http://www.pentest-standard.org/index.php/Reporting。
在信息收集阶段,你需要尽可能采用各种方式来收集目标网络的所有信息。这个目标网络可能是互联网的一个网站,或者是一个社会性的组织,甚至可能是一个财力雄厚的老牌商业公司。在这个阶段,最重要的是要通过各种社交媒体网络来收集相关信息,以及使用Google Hacking技术(一种使用特殊的查询方法通过Google搜索引擎收集敏感信息的工具)去寻找目标的相关信息。另外,对目标使用主动扫描和被动扫描技术进行踩点(footprinting)也是一种可行的办法。
信息收集是整个渗透测试过程中最为重要的阶段之一。与尝试所有可行的渗透测试方法相比,对目标有适当的了解可以让测试者选择合适和准确的渗透测试攻击方式。这样做将会大大缩短整个渗透测试耗费的时间。通常这个阶段会占到整个渗透测试所需时间的40%~60%。最终能否成功渗透进入目标网络很大程度上取决于测试者在这个阶段的工作成果。
渗透测试工程师必须通过对目标网络进行各种扫描以获得足够的信息。扫描目标计算机上运行的服务、开放的端口,以及验证这些端口上运行着的全部服务,然后判断这些服务中哪些是可以被攻击的,并且决定如何利用它们作为入侵目标的通道。
在这个阶段还要明确目标网络当前部署的安全控制措施以及如何才能破坏这些措施。
接下来用一个示例来讨论这一点。设想这里有一个针对Web服务器的黑盒测试,客户希望进行网络流量压力测试。
我们将对服务器进行网络流量压力测试以判断目标的抗流量压力水平。简言之,就是服务器对拒绝服务(Denial of Service,DoS)攻击的应对能力。DoS攻击或网络流量压力测试指的是向目标服务器发送数量极为巨大的网络请求或数据,其目的是检测目标服务器在面对此类情形时,是能够继续正常工作还是因资源耗尽而拒绝服务。为了实现这个目标,我们启动网络压力测试工具,并对目标网站发起一次攻击。然而,在攻击发起之后的几秒,服务器端就不再响应我们的客户端请求,从Web客户端也无法打开目标服务器的Web页面。此外,浏览器上还会显示目标Web页面已经不在线的提示。这是怎么回事呢?是我们已经成功搞掉了目标服务器吗?可惜的是,并非如此。事实上,这表明目标服务器存在保护机制。由于目标服务器的管理人员事先设置的保护机制发现了恶意攻击的企图,从而禁止了从我们的IP地址发起的后续访问请求。在发起攻击前必须准确地收集目标信息以及验证目标提供的各种网络服务。
因此,利用多个不同的IP地址对目标Web服务器进行测试是更好的选择。在测试时使用两到三个不同的虚拟专用服务器是一种值得推荐的做法。另外,我建议在使用攻击模块对真实目标进行渗透测试前,在虚拟环境下对所有的攻击模块进行模拟测试。一个正确的、关于攻击的模拟验证是必需的。如果没有进行模拟测试就开展了渗透测试,那么很有可能攻击模块会直接导致目标服务崩溃,而这并不是我们所期望见到的。网络压力测试通常应该在业务末期或者维护期进行。此外,将用于测试客户端的IP列在白名单中也是十分重要的。
现在来看第二个示例—— 一次对Windows 2012服务器的黑盒测试。在对目标服务器进行扫描的过程中,我们发现其80端口和8080端口都是开放的。在80端口上运行着最新版的互联网信息服务(Internet Information Services,IIS),在8080端口上运行着存在漏洞的Rejetto HFS服务器,而Rejetto HFS服务器容易受到远程代码执行(Remote Code Execution,RCE)漏洞的攻击。
然而,当我们试图利用这个有漏洞的HFS进行渗透的时候,却发现渗透失败了。这是一种很常见的情景,因为来自外部的恶意流量可能被防火墙拦截了。
若遇到这种情况,可以简单地改变入侵的方式,让目标服务器主动建立到我们的连接,而不是由我们去连接目标服务器。这种方法更容易成功,因为防火墙通常会被配置为检测入站流量而不是出站流量。
作为一个过程,它可以分解成以下步骤。
如果想获得关于信息收集的更多信息,请访问网址http://www.pentest-standard.org/index.php/Intelligence_Gathering。
为了保证渗透测试能够正确进行,必须进行威胁建模。在这个阶段,主要的工作是模拟出对目标准确的威胁以及这些威胁的作用,并根据这些威胁可能对目标产生的影响对其进行分类。根据之前在信息收集阶段做出的分析,在这个阶段我们可以确定最佳的攻击方式。威胁建模方法适用于商业资产分析、过程分析、威胁分析以及威胁能力分析。这一阶段将解决以下问题。
威胁建模将有助于渗透测试工程师完成以下工作。
威胁建模将有助于明确哪些资源最容易受到威胁,以及这些威胁各自是什么。
假定现在有一个针对公司网站的黑盒测试。目标公司的客户信息是公司的重要资产。然而,在同一后台程序的另一个数据库中保存了客户的交易记录。在这种情形下,攻击者就可以利用SQL注入漏洞获取客户的交易记录,而交易记录属于其他资产。因此在这个阶段,应该建立一个针对重要资产和其他资产的SQL注入漏洞威胁模型。
漏洞扫描工具(例如Nexpose和Metasploit Pro版)可以帮助我们以自动化的方式快速清晰地完成威胁建模。在开展大规模的测试时,这个优势更为明显。
如果想获取关于威胁建模的更多信息,请访问网址http://www.pentest-standard.org/index.php/Threat_Modeling。
漏洞分析是在一个系统或者应用程序中发现漏洞的过程。这些漏洞多种多样,涵盖了很多方面,从服务器的配置到Web程序服务,从应用程序到数据库服务,从基于VOIP的服务器到基于SCADA的服务都可能存在漏洞。这个阶段包含了三个不同的机制,那就是测试、验证和研究。测试包括主动测试和被动测试。验证包括去除误报和通过手动验证确认漏洞的存在。研究指的是发现并触发漏洞以确认它的存在。
有关威胁建模阶段的各个过程的更多信息,请访问http://www.pentest-standard.org/index.php/vulnerability_analysis。
渗透攻击阶段可以利用之前漏洞分析阶段的成果。这个阶段一般被认为是真正的攻击阶段。在这个阶段,渗透测试者可以针对目标系统的漏洞使用对应的入侵模块获得控制权限。本书主要介绍的就是这个阶段。
后渗透攻击阶段发生在渗透攻击阶段之后,这个阶段包含了当成功渗透攻击到对方计算机以后的很多任务,比如提升权限、上传和下载文件、跳板攻击,等等。
有关渗透攻击阶段各个过程的详细信息,请访问http://www.pentest-standard.org/index.php/Exploitation。
有关后渗透阶段的更多信息,请访问http://www.pentest-standard.org/index.php/Post_Exploitation。
在进行渗透测试时,创建整个渗透测试的正式报告是在最后一个阶段进行的。渗透测试报告的重要组成部分包括:确定目标最为重要的威胁,将渗透得到的数据生成图表,对目标系统的改进建议,以及这些问题的修复方案。在本书的后半部分,将会用一节来详细描述如何编写渗透测试报告。
有关报告阶段各个过程的详细信息,请访问http://www.pentest-standard.org/index.php/reporting。
一次渗透测试是否成功很大程度上取决于你的测试实验室是如何配置的。此外,一个成功的测试还需要回答以下问题。
在开始任何测试之前,必须确保所有的工具都已准备就绪并且都能顺利地工作。
在开始使用Metasploit之前,需要有一个测试用的实验环境。建立这种环境最好的办法就是拥有数目众多的计算机,同时在这些计算机上安装不同的操作系统。然而,如果只有一台计算机的话,最好的办法就是建立一个虚拟的实验环境。
虚拟化技术在如今的渗透测试中扮演着十分重要的角色。由于硬件设备的价格相对昂贵,采用虚拟化技术可以使渗透测试经济有效。在一台计算机上模拟出多个操作系统不仅可以节省大量成本,同时也减少了电力的使用和空间的占用。建立一个虚拟化的渗透测试环境可以避免对你的真实主机系统进行任何修改,并使得我们的所有操作都在一个独立的环境中进行。虚拟化的网络环境允许渗透测试在一个独立的虚拟网络中运行,从而无须使用或者修改主机系统的网络硬件。
此外,使用虚拟化技术的快照功能可以保存虚拟机在某一时刻的状态。这种功能相当有用,因为在我们进行一个虚拟测试的时候,可以随时拿系统当前的状态与之前的状态进行比较,也可以将系统随时恢复到之前的状态,这样如果文件在模拟攻击时发生了变化就无须再重新安装整个软件环境了。
虚拟化主机需要主机系统拥有足够的硬件资源,例如内存空间、处理能力、硬盘空间等,才能稳定运行。
有关快照的更多信息,请访问https://www.virtualbox.org/manual/ch01.html#snapshots。
现在来看看如何使用Kali操作系统创建一个虚拟测试环境。Kali是全世界最流行的渗透操作系统,该系统中默认安装了Metasploit。
可以从以下网址下载用于VMware和VirtualBox虚拟机的Kali Linux预建镜像:https://www.offensive-security.com/kali-linux-vmware-virtualbox-image-download/。
为了创建虚拟环境,需要支持虚拟化的仿真软件。可以从当前最为流行的两款软件VirtualBox和VMware Workstation Player中选择一个。好了,可以按照下面的步骤开始安装了。
(1) 下载VMware Workstation Player安装程序(https://my.vmware.com/web/vmware/free#desktop_end_user_computing/vmware_workstation_player/14_0)。在下载的时候要注意选择与你使用的主机系统架构相匹配的版本。
(2) 开始运行安装程序,直到系统安装工作完成。
(3) 下载最新版本的Kali虚拟机镜像(https://images.offensive-security.com/virtual-images/kali-linux-2017.3-vm-amd64.ova)。
(4) 运行VM Player程序,如下图所示。
(5) 切换到Player选项卡,然后选中File | Open。
(6) 浏览解压后Kali Linux的*.ova文件,单击Open按钮,然后会出现如下界面。
(7) 为虚拟机随便起一个名字,然后指定一个保存目录(我倾向于在一个拥有较大空间的硬盘上创建一个文件夹),再单击Import按钮。
(8) 接下来的导入过程会花费一些时间,你要保持耐心,不妨在这个时候听点喜欢的音乐。
(9) 成功导入之后,就可以在左侧的虚拟机列表中看到这个新加入的虚拟机,如下图所示。
(10) 接下来只需要启动这个操作系统即可。一个好消息就是Kali Linux虚拟机镜像文件中已经自带了VMware Tools,有了这个工具,你就可以实现在虚拟机和宿主机之间拖曳文件、共享文件等功能。
(11) Kali Linux虚拟机的登录用户名为root,密码为toor。
(12)下面打开一个命令行,然后初始化并启动Metasploit的数据库,如下图所示。
(13) 接下来输入msfconsole
命令来启动Metasploit框架,如下图所示。
有关Kali Linux的完整安装指导,请访问http://docs.kali.org/category/installation。
如需通过命令行在Linux系统上安装Metasploit,请访问http://www.darkoperator.com/installing-metasploit-in-ubunt/。
如需在Windows操作系统上安装Metasploit,请访问以下网址的教程:https://www.packtpub.com/mapt/book/networking_and_servers/9781788295970/2/ch02lvl1sec20/installing-metasploit-on-windows。
到现在为止我们已经回顾了渗透测试的基础内容,也完成了Kali Linux的建立。接下来介绍一下重点部分:Metasploit。Metasploit是一种安全框架,为渗透测试工程师提供了大量的渗透模块和扫描模块。2003年H.D Moore创建了Metasploit,从那之后Metasploit便快速发展起来,如今被公认是最为流行的渗透测试工具之一。Metasploit是一个完全的Ruby驱动项目,提供了大量的漏洞渗透、攻击载荷(payload)、编码技术以及后渗透模块。
Metasploit提供了以下多种版本。
本书中采用的是Metasploit Community版和Framework版。Metasploit还提供了下面几种类型的用户界面。
有关Metasploit Community版的更多信息,请访问https://community.rapid7.com/community/Metasploit/blog/2011/12/21/Metasploit-tutorial-an-introduction-to-Metasploit-community。
在Kali Linux建立完成之后,准备使用Metasploit开展我们的第一个渗透测试。不过在开始这个测试之前,先来回顾一下Metasploit的基本功能和术语。
成功运行Metasploit之后,就可以在Metasploit的命令控制台上键入help
命令或?
,Metasploit会列出所有可以使用的命令。接下来回顾一下在Metasploit中使用的基本术语。
现在来回顾一下本章中Metasploit将会用到的基本命令。下表给出了这些命令的使用示例。
命令 |
用途 |
示例 |
---|---|---|
|
选择一个指定的模块并使其开始工作 |
|
|
显示可用的特定功能的模块 |
|
|
给某个特定对象赋值 |
|
|
给某个对象赋值的同时设定作用域为全局,在模块进行切换的时候,该对象的值不会被改变 |
|
|
在设置一个辅助模块需要的所有选项之后,启动该辅助模块 |
|
|
启动一个渗透模块 |
|
|
取消当前选择的模块并且退回到上一级命令窗口 |
|
|
列出相关模块的信息 |
|
|
搜索符合条件的特定模块 |
|
|
检查某个特定目标是否易受攻击 |
|
|
列出当前可用的会话 |
|
下面来看看Meterpreter的基本命令。
Meterpreter命令 |
用途 |
示例 |
---|---|---|
|
列出被渗透主机的系统信息 |
|
|
列出被渗透主机的网络接口 |
|
|
列出目标主机ARP缓存地址的IP地址和MAC地址 |
|
|
将一个处于激活状态的会话发送到后台 |
|
|
获取目标主机的一个cmdshell |
|
|
获取当前用户细节 |
|
|
提升权限,获取系统级权限 |
|
|
获取Meterpreter会话在目标主机上注入进程的进程号 |
|
|
列出目标主机上运行的所有进程 |
|
我们已经回顾了Metasploit命令的基础知识。在下一节中,我们看看与传统工具和脚本相比,使用Metasploit的优势都有哪些。
如果是第一次接触Metasploit,可访问http://www.offensive-security.com/metasploit-unleashed/Msfconsole_Commands获取关于基本命令的更多信息。
在开始渗透之旅之前,必须弄清楚为什么要使用Metasploit工具来替代手动渗透技术。是因为那看起来很酷的黑客风格的控制终端使我们显得很专业,还是有什么其他的原因?与传统的手动技术相比,选择Metasploit的原因主要有以下几点。
选择Metasploit的主要理由之一就是其源代码的开放性以及积极快速的发展。世界上还有许多非常优秀的商业版渗透测试工具,但是Metasploit对用户开放它的源代码,并且允许用户添加自己的自定义模块。虽然Metasploit Pro版本是收费的,但如果以学习为目的,可以将Metasploit Community版作为首选。
Metasploit框架十分易用,不过这里的易用性是指Metasploit中命令的简单命名约定。它为执行大规模的网络渗透测试提供了便利。设想这样一个场景:我们面对的网络包含了整整200个系统。当使用Metasploit时,你可以对整个目标网络进行自动化渗透测试,而不必一台一台地逐个测试。指定参数值后,例如子网(subnet)和无类别域际路由(Classless Inter Domain Routing,CIDR),Metasploit就可以自动对所有计算机进行测试以发现目标上的漏洞。而如果采用手动测试,就需要分别对200个系统逐个测试。因此使用Metasploit渗透框架可以节省大量的时间和精力。
最为重要的是,在Metasploit中切换攻击载荷模块十分容易——它提供了set payload
命令来快速切换攻击载荷模块。因而在Metasploit中从Meterpreter终端或者shell控制行可以十分简单地转换到具体的操作,例如添加一个用户,获得远程桌面控制。在命令行中输入msfvenom
也可以很容易地创建一个人工攻击代码程序。
Metasploit可以在目标计算机上不留痕迹地建立控制通道,而一个自定义编码的渗透模块在建立控制通道时却可能会引起系统的崩溃。这确实是一个重要的问题,在这种情况下,我们都知道系统是不会立刻重新启动的。
设想这样一个场景:我们已经拿下了一个Web服务器,在准备建立通道的时候目标服务却崩溃了。这台服务器的计划维护时间是在50天以后。那现在该做什么呢?熬过接下来的50天直到目标服务再次启动,以便再一次入侵?再者,如果再次启动的时候,目标系统的漏洞已经修复了怎么办?我们只有暗自郁闷了。因此,更好的办法就是使用Metasploit框架。Metasploit在建立控制通道方面极为优秀,同时还提供了大量的后渗透测试模块,例如persistence
命令就可以建立一个对目标服务器的持久控制通道。
Metasploit提供了一个漂亮的图形化管理界面,另外也为第三方图形化管理软件(例如Armitage)提供了管理界面。这些界面极大地简化了渗透测试的工作,提供了易于切换的工作平台、漏洞管理、单击鼠标即可完成的渗透功能。本书的后面几章将详细讨论这些环境。
回顾完Metasploit的基本操作,该开始Metasploit渗透之旅了。我们设想这样一个场景:客户提供给我们一个IP地址,并要求测试它能否防御住攻击。这个测试的唯一目的就是确保所有应有的检查都已经到位。这个场景很简单。假定所有前期交互阶段的工作都由客户完成,我们直接开始测试阶段的工作。
如果你想在阅读案例研究的同时进行实践操作,可以参阅1.7节,该节会给出精确的网络和配置细节来帮助你完成整个案例的研究。
正如前文所介绍的那样,在信息收集阶段应该围绕着目标收集尽可能多的相关信息。主动扫描和被动扫描包括了端口扫描、banner获取,以及根据被测试的目标特点选择的各种其他扫描方式。当前场景中,我们要测试的目标是一个IP地址。因此在这次测试中可以跳过被动扫描,直接采用主动扫描的方法开始收集信息。
我们采用对内部目标踩点的方法,主要包括端口扫描技术、banner获取技术、ping扫描技术(目的是验证目标主机是否在线)以及服务扫描技术。
Nmap被证明是最适合进行内部目标踩点的工具之一。由Nmap生成的报告可以轻松地导入到Metasploit中。Metasploit内置了数据库功能,利用这个功能我们就能在Metasploit中执行Nmap扫描,并将扫描结果存储在数据库中。
有关Nmap扫描的更多信息,请访问http://nmap.org/bennieston-tutorial/。
推荐一本关于Nmap的优秀图书:http://www.packtpub.com/networking-and-servers/nmap-6-network-exploration-and-security-auditing-cookbook。
在Metasploit中使用数据库
将渗透测试的结果自动保存起来是一个不错的选择。这将帮助我们建立关于这次渗透测试的知识库。为了实现这个功能,可以使用Metasploit内置的数据库。将Metasploit与数据库建立连接可以加快搜索的速度,缩短响应的时间。下图给出了一个没有与数据库连接时的情形。
在安装阶段,我们已经看到了如何为Metasploit初始化数据库以及如何启动这个数据库。现在,为了检测当前Metasploit是否与数据库相连,需要输入db_status
命令,如下面的屏幕截图所示。
在一些特殊情况下,我们会希望连接到特殊的数据库而不是默认的Metasploit数据库。这时,需要使用db_connect
命令,如下图所示。
如果要连接到某个数据库,在使用db_connect
命令时还需要提供用户名、密码以及端口号、数据库名等信息。
来看看其他核心数据库操作命令是如何工作的。下表有助于了解这些数据库命令。
命令 |
用途 |
---|---|
|
用来与默认数据库之外的数据库交互 |
|
用来将数据库中保存的数据导出,用来生成测试报告或者用来导入到其他安全工具中 |
|
用来使用Nmap软件对目标进行扫描,并将结果保存到Metasploit的数据库中 |
|
用来检查是否建立了与数据库的连接 |
|
用来从指定的数据库中断开 |
|
用来向数据库中导入来自其他扫描工具(例如Nessus、Nmap等)的扫描结果 |
|
用来重新建立缓存,主要目的是使用新的配置替代之前缓存文件中错误或者过时的配置 |
在开始一次新的渗透测试时,最好将先前扫描的主机数据与这次的数据分别存储,这样两者就不会混在一起。可以通过在Metasploit中使用workspace
命令来完成此操作,如下图所示,但是要记住这一切需要在新的渗透测试操作开始之前进行。
可以通过输入workspace -a
命令和一个标识符来添加一个新的工作区。我们可以使用当前正在评估的机构名称作为标识符,如下图所示。
现在已经通过参数 -a
成功地创建了一个新的工作区。如果需要在多个工作区之间进行切换,也可以使用workspace
命令加上工作区的名字来实现,如上图所示。完成了对工作空间的选择之后,我们对目标IP进行一次快速的Nmap扫描,看看是否能找到一些可以利用的服务。
这个扫描结果有点令人沮丧,除了80端口之外,在目标上没有其他端口在运行服务。
默认情况下,Nmap只会扫描目标主机上最常用的1000个端口。不过我们可以使用参数
-p
来扫描目标的全部65 535个端口。
现在已经连接到了Metasploit的数据库,我们全部的检查结果都将保存在这个数据库中。输入services
命令可以查看数据库中所有的扫描服务。另外,我们使用命令db_nmap
并添加参数-sV
来执行一次版本扫描,这个过程如下图所示。
前面的Nmap扫描发现目标开放了80端口,并将这个结果保存在了数据库中。接下来的版本扫描中发现了目标的80端口上运行的是Apache 2.4.7 Web服务器,同时也扫描出了目标的MAC地址和操作系统类型,并在数据库中更新了这些内容,如上图所示。由于获取访问权限需要确定目标上所运行软件的精确版本信息,所以最好对这个版本信息进行二次检查。Metasploit中内置了一个用于识别HTTP服务器版本信息的辅助模块,我们来利用它,如下图所示。
下面要启动http_version
扫描器模块了,在命令行中输入use
命令加上这个模块所在的路径,本例中路径的值为auxiliary/scanner/http/http_version
。所有基于扫描功能的模块都有RHOSTS
选项,这个选项的值可以是一系列的IP地址或者子网。不过本例中只需要测试单个IP目标,因此只需要使用set
命令将其设置为192.168.174.132。接下来,使用run
命令来执行这个模块,如下图所示。
这里显示的Apache版本信息与之前的Nmap扫描结果一样。这个版本的Apache是安全的,我们在exploit-db.com
和0day.today
这些渗透模块库中都找不到关于它的信息。因此我们只剩下在Web程序中查找漏洞这一个途径了。现在首先浏览这个IP地址的页面,查看是否可以得到些有用的信息。
好了,现在我们可以看到一个空白的主页。接下来就可以使用Metasploit中的dir_scanner
模块来寻找一些已知目录,如下图所示。
在Metasploit中载入auxiliary/scanner/http/dir_scanner
模块之后,我们需要使用DICTIONARY
参数指定一个字典文件,在这个文件中包含大量的已知目录。另外,如果你希望加快整个过程的话,可以将THREADS
的值从1调整为20。下面就是这个模块执行的过程以及输出。
各个目录之间的空格符可能会导致不真实结果的出现。在使用phpcollab作为参数时得到的结果为302,这也就是说在试图访问phpcollab目录时,我们得到了一个重定向响应(302)。这个响应很有趣,不妨尝试在浏览器中打开这个目录,看看会得到什么结果。
干得漂亮,我们在目标系统中发现了一个基于PHP的应用程序。由于这个程序的存在,Metasploit模块得到了一个302响应。
通过信息收集,可知目标计算机上只开放了80端口,并且没有针对这个端口上所运行程序的渗透模块,不过我们发现在这个服务器上运行着一个PhpCollab Web应用程序。为了获得这个程序的控制权限,我们尝试了一些常用用户名和密码的组合,但是都没有成功。而且我们在Metasploit中也找不到PhpCollab的相关模块。
下面使用searchsploit
工具在https://exploit-db.com/中查找与PhpCollab有关的模块。这个工具允许你从本地的渗透模块数据库副本中查找要使用的模块。
看起来一切都很顺利,我们已经找到了针对PhpCollab的渗透模块。另外一个好消息是,这里还有一个可以直接在Metasploit中使用的模块。
PhpCollab应用程序并没能准确地实现对上传文件的内容进行过滤。因此,未经身份验证的攻击者可以上传恶意文件并运行任意代码。
PhpCollab 2.5.1中漏洞产生的原理
如果攻击者通过/clients/editclient.php?id=1&action=update的URL发送一个包含PHP恶意文件的POST请求,那么PhpCollab应用程序就会因此而被渗透。这个程序的代码并没有验证该请求是否来自授权用户。有问题的代码如下所示。
从第二行代码中可以看出,上传的文件都会被保存在logos_clients目录中,并会重新以 $id和$extention命名,这表示如果URL中id的值为1,那么通过这个URL上传的后门文件就会以1.php为名保存在目录logos_clients中。
如果需要获得关于此模块的更多信息,可以访问https://sysdream.com/news/lab/2017-09-29-cve-2017-6090-phpcollab-2-5-1-arbitraryfile-upload-unauthenticated/。
为了获取目标的控制权限,需要将这个渗透模块复制到Metasploit中。不过,直接将外部的渗透模块复制到Metasploit的exploit目录中并不是一种明智的做法,因为每当Metasploit进行更新操作时都会导致该模块被删除。因此将这个渗透模块放在一个通用目录中要比放在Metasploit的模块目录中更为明智。可以在操作系统的其他位置建立一个目录来保存这些模块,当需要使用这些模块时,就使用loadpath
命令来加载它们。现在先将找到的这个模块复制到某个目录中。
接下来按照下图所示的结构来创建目录。
我们在MyModules文件夹中创建了一个兼容Metasploit的目录结构,本例中为modules/exploits/nipun,然后将这个模块复制到了该目录中。然后按照下图所示在Metasploit中载入这个目录。
我们已经成功地在Metasploit中载入了这个模块。下面就可以使用这个模块了,如下图所示。
这个模块需要我们指定远程目标主机的IP地址、端口号,以及访问PhpCollab应用程序的路径。默认情况下,路径(TARGETURI
)和远程端口号(RPORT
)的值都已经设定完毕,所以我们只需要将RHOST
的值设定为目标主机的IP地址,然后输入exploit
命令。
太棒了,我们成功完成了对目标的控制。接下来就可以发挥那些基本的后渗透命令的作用了,然后再分析这些命令执行的结果,如下图所示。
正如上图所示,使用sysinfo
命令可以获取目标的系统信息,例如计算机名、操作系统类型、系统结构(64-bit),以及当前使用的Meterpreter版本(基于PHP)。通过使用shell
命令,可以使用系统自身的shell来控制被渗透主机,如下图所示。
可以看到,一旦进入系统shell,就可以使用其中的命令了。例如,id
命令可以显示当前用户的一些信息,www-data
表示如果想要彻底控制当前系统就必须取得root权限。另外,键入lsb_release -a
命令可以显示操作系统版本的release和codename详细信息。仔细观察这些内容,因为在获取系统的root权限时会用得上它们。在进入root获取阶段之前,我们先来查看目标系统上的一些信息。例如,使用getpid
命令来查看当前的进程ID,使用getuid
命令来查看当前的用户ID,使用uuid
来查看用户标识符,使用machine_id
来查看被渗透主机的机器标识符。现在运行刚刚提到的所有命令,并分析它们的执行结果。
我们所获得的这些信息都是比较简单直接的,包括Meterpreter所依靠的进程ID、用户ID、UUID以及机器ID。不过有一点需要注意,我们当前的控制是基于PHP Meterpreter的,由于它的局限我们不能运行特权命令。而如果你使用的是二进制Meterpreter shell,例如reverse TCP的话,就可以轻而易举地执行这些命令。首先,我们升级到一个高级一些的shell,以此来获得更高的目标控制权限。我们使用msfvenom
命令来创建一个恶意的payload,并将它上传到目标系统然后执行。现在开始吧!
考虑到要渗透的主机采用了64位的系统架构,因此我们也使用64位版本的Meterpreter,如上图所示。使用MSFvenom工具来生成符合我们需求的payload。在这个工具中使用参数 -p
来指定要使用的payload,本例中就是linux/x64/meterpreter/reverse_tcp。这个payload可以在64位Linux系统上运行,当其在被渗透的主机上启动之后,就会主动连接到我们的监听器,并提供一个对该主机的控制权限。由于这个payload需要连接到我们的计算机,所以它必须知道回连的地址。为此我们指定了LHOST
和LPORT
参数的值,其中LHOST
是监听器所在主机的IP地址,LPORT
是监听器所使用的端口。因为要在Linux主机上使用这个payload,所以我们指定输出格式(-f
)为elf,这是Linux操作系统中默认的可执行二进制文件格式。参数-b
用来指定那些需要避免的坏字符,如果在生成的shellcode中包含了坏字符,就会导致在传输或执行的过程中失败。后面的章节中会有关于坏字符产生原因以及如何处理坏字符的详细讲解。最后,将payload写入到reverse_connect.elf文件中。
之前我们已经在目标计算机上执行了一个PHP Meterpreter,接下来可以在这个Meterpreter中使用upload
命令上传这个新创建的payload。如上图所示,完整的命令需要使用upload
加上payload所在路径。另外,使用pwd
命令可以查看文件上传之后所在的目录,也就是我们正在使用的目录。如果上传的payload被执行了,它就会回连到我们的系统。不过,我们需要准备好一个能够接收这次回连的handler。这个handler在启动之后将会处理即将到来的连接,如下图所示。
从上图中可以看到,使用background
命令可以将当前的PHP Meterpreter会话切换到后台。然后启动exploit/multi/handler模块,并将其中的payload、LHOST和LPORT值设定为与之前的reverse_connect.elf一样,然后使用exploit
命令来执行。
在执行exploit时使用参数
-j
就可以在后台启动handler。这样做的好处是可以一次运行多个handler,而且它们都保持在后台运行。
现在已经成功启动了这个handler,接下来需要在目标系统上运行payload,如下图所示。
在Meterpreter中使用shell
切换到系统shell命令行工作模式。我们之前已经使用pwd
查看了目标系统的当前工作目录。接下来要为payload文件赋予一个可执行权限,这样它才可以执行。最后使用&
标识符在后台运行reverse_connect.elf。上图给出了全部过程,当这个文件执行之后,在目标主机上就会打开一个新的Meterpreter会话。使用sessions -i
命令可以看到我们已经在目标系统上打开了两个Meterpreter会话。
不过,比起PHP Meterpreter,x64/Linux的Meterpreter显然是一个更好的选择。除非获得了权限更高的Meterpreter,否则我们将一直使用它来控制目标系统。如果出现了意外的话,我们可以切换到HP Meterpreter,然后再次运行这个payload,就像之前所做的一样。这里需要注意的一点是,无论现在使用的是哪个类型的Meterpreter,我们都是低权限的用户,而这种情况是需要改变的。Metasploit框架中提供了一个名为local_exploit_suggester
的优秀模块,利用它可以提升权限。这个模块内置了一个可以用来检测各种本地特权提升漏洞的功能,并会给出最合适的选择。我们可以按照下图所示来加载这个模块。
我们使用use
命令加上绝对路径post/multi/recon/local_exploit_suggester来启动这个模块。既然希望在目标系统上使用这个渗透模块,我们自然需要选择一个较好的Meterpreter。因此,我们通过输入命令SESSION 2
来切换到会话2,这个2也就是x64/Linux Meterpreter所对应的会话标识符。下面来运行这个模块并分析输出。
很神奇吧!我们可以看到这个模块利用位于exploit/linux中的overlayfs_priv_esc
工具成功获得了目标系统上的root控制权限。但是我还有一个练习要留给大家。首先在目标上下载一个用户权限提升工具,然后执行它来获得root控制权限。可以到https://www.exploit-db.com/exploits/37292下载这个渗透模块。下一节将会介绍这个模块的细节。
使用本地root渗透模块提升权限
overlayfs
权限提升漏洞允许本地用户获得root权限,这是因为当用户对底层目录的文件进行修改时,会将原文件复制一份到上层目录,在这个过程中没有对文件的权限进行检查,导致用户可以利用overlayfs
绕过文件系统权限检查。
关于这个漏洞的详细描述可以查看https://www.cvedetails.com/cve/cve-2015-1328。
接下来我们进入shell命令行,然后控制目标系统从https://www.exploit-db.com/中下载渗透攻击模块。
我们将这个渗透攻击模块的名字由37292修改为37292.c,然后使用gcc
来编译这个文件,这样会得到一个可执行的文件,如下图所示。
可以看到我们已经成功完成了对这个文件的编译,接下来可以执行它了。
干得不错!随着这个渗透模块的运行,我们已经获得了目标系统的root控制权限。这意味着我们已经彻底控制了被渗透的计算机。运行一些基本命令来验证当前我们的身份,这个过程如下所示。
还记得吗?之前还有一个在后台运行的handler。我们再次运行那个reverse_connect.elf文件。
现在又打开了一个Meterpreter会话!我们来看看这个新打开的Meterpreter和前面两个Meterpreter的区别。
这里已经取得了目标系统上的第三个Meterpreter会话。不过这个会话中的UID,也就是用户的ID为0,表示这是一个root级的用户。因此这个Meterpreter会话就拥有了root级的权限,我们可以以此不受限制地控制整个系统。现在可以使用session -i
命令加上会话的标识符(本例中为3)在这些会话中进行切换。
如上图所示,使用getuid
命令来确认一下当前已经获得的root用户权限。好了,现在整个系统已经都在我们的控制中了,那么接下来又该做些什么呢?
保持对目标的持续控制是相当有用的功能,尤其是当涉及执法机构或者红队在测试目标系统上部署的防御时,这个功能显得尤为重要。我们可以使用Metasploit工具中post/linux/manage目录下的sshkey_persistence
模块来实现对Linux服务器的持续控制。这个模块会将我们已有的或者新创建的SSH密钥添加到目标系统的所有用户中。这样当下次我们需要登录到该目标系统时,它永远不会要求输入密码,而是允许使用密钥登录。下面来看看这个实现过程。
接下来可以使用set SESSION
命令加上标识符切换到指定会话。因为我们需要的是最高级的系统权限,所以使用3作为标识符切换到这个会话。在这个会话中运行该模块,整个过程如下图所示。
这个模块创建了一个新的SSH密钥,然后将其添加到了目标系统的两个账户root和claire中。现在可以通过用户root和claire使用SSH连接到目标系统,如果成功的话,表明这个后门程序已经成功完成了任务。这个过程如下图所示。
够神奇吧!可以看到我们已经使用参数 -i
和新创建的SSH密钥登录到目标系统上了,如上图所示。接下来看看是否可以使用用户claire远程登录:
棒极了!现在我们可以随意使用这两个账号登录了。
不过大多数的服务器都不允许root登录。因此你需要修改目标系统中的sshdconfig文件,将其中“root login”的值修改为“yes”,然后重新启动SSH服务。
尽量只在一个用户(例如root)里添加后门,因为大多数的用户都不会使用root进行远程登录的,这是因为在默认配置中这一点是被禁止的。
无论被你渗透的计算机安装了什么类型的操作系统,Metasploit中都提供了大量可用的后渗透测试模块,利用它们就可以获取目标系统上的各种数据。下面来使用这样的一个模块。
运行enum_configs
后渗透测试模块,可以看到已经收集了存在于目标系统上的所有配置文件。这些内容有助于我们完成密码发现、了解密码模式、查看各种运行服务的信息等操作。另外一个功能强大的模块是enum_system
,它可以收集关于操作系统的信息、用户账号、运行的服务、运行的cron作业、硬盘信息和日志文件等,如下图所示。
我们已经在目标上收集了大量的信息,现在是时候开始编写报告了吗?不,时机还未到。的确,一个合格的渗透测试者可以入侵目标系统,获得最高的控制权限,并对其进行分析。不过优秀的渗透测试者并不会仅仅停留在这些工作上,他的目标不只是一个主机,而是会竭尽所能侵入整个内部网络,并获取更多的控制权限(如果允许的话)。下面介绍一些可以进入到内部网络的跳板命令。其中一个很常用的命令是arp
,它可以列出内部网络中与被渗透主机通信过的所有主机。
可以看到这里面有一个单独的网络192.168.116.0存在。我们输入命令ifconfig
来查看目标系统中是否安装有连接到其他网络的网卡:
果然没错!我们在目标系统上又发现了一个网络适配器(Interface 3),它连接到了一个单独的网络。不过当我们尝试ping或者扫描这个网络里的地址时,却都失败了,看来从我们的主机是无法直接连接到这个网络的。所以我们需要一种通过被渗透主机将数据转发到目标系统的机制,这种机制通常被称作跳板(pivoting)。首先需要通过Meterpreter在被渗透主机上添加一条到达目标网络的路由,这样任何从我们主机所发出的信息都会经由被渗透主机转发到目标网络,而接收到的主机会以为这些信息来自被渗透主机。现在就来通过Meterpreter添加这个路由,过程如下所示。
在上图中我们使用了post/multi/manage目录下的autoroute
后渗透测试模块,并使用参数SUBNET
指定了目标子网,使用参数SESSION
指明了用来传输数据的Meterpreter会话的标识符。可以看到通过这个模块的运行,我们已经成功添加了一条到达目标网络的路由。现在再次在Metasploit中运行TCP端口扫描模块,查看是否可以对目标网络进行扫描。
现在运行portscanner
模块来扫描之前用arp
命令查看到的主机,也就是192.168.116.133,采用10个线程来查看1~10000号端口,这个过程如下图所示。
成功了!我们发现目标主机上的80端口是开放的。不过,这个成功必须以通过Meterpreter为前提。如果可以运行一些通过浏览器来查看目标80端口信息的外部工具就好了,这样就可以了解关于目标80端口上所运行程序的更多信息。Metasploit中内置了一个socks
代理模块,运行外部工具所产生的流量可以通过这个模块到达192.168.116.133主机。使用这个模块的过程如下所示。
auxiliary/server路径下的socks4a
模块就可以完成这个任务。它可以在本地的1080端口建立一个网关,然后将流量路由到目标系统。在127.0.0.1上的代理会将产生的浏览器流量通过被渗透的主机进行转发。不过,如果需要使用外部工具的话,我们还得使用proxychains
,并将其端口设置为1080。这个proxychains
的端口设置是通过修改/etc/proxychains.conf文件实现的。
接下来需要做的就很简单了,只需要在浏览器中将代理设置为这个地址,或者在使用第三方的命令行程序(例如Nmap和Metasploit)时,将proxychains
作为命令执行的前缀。首先如下图所示进行浏览器的代理配置。
另外还需要确保将No Proxy for处的“localhost”和“127.0.0.1”删掉。代理设置完成之后,需要在浏览器中输入目标IP地址和80端口,来查看是否可以达到目标的80端口。
太棒了!我们现在已经看到了那个应用程序,它就是Disk Pulse Enterprise,而且还是9.9.16版,这个版本是存在漏洞的。Metasploit中包含了很多关于此漏洞的模块。我们打开其中的一个模块,如下图所示。
我正是这个漏洞渗透模块的开发者之一。在利用这个漏洞之前,我们先来了解一下它。
这个漏洞是由于Disk Pulse Enterprise的Web服务器组件未能恰当地解析GET请求造成的。攻击者可以通过构造恶意的GET请求来覆盖SEH部分,从而实现对程序执行流程的修改。由于Disk Pulse Enterprise是以管理员的权限在运行,攻击者将会以此获得系统的最高控制权限。
下面利用这个漏洞来渗透目标操作系统,整个过程如下所示。
在使用这个模块的过程中,我们仅仅设置了RHOST
和LPORT
(用来控制被成功渗透主机的端口)两个参数,就完成了渗透的准备工作。可以看到当执行exploit
命令的时候,第五个会话就打开了,这表示我们已经成功地渗透了目标计算机。接下来使用sessions -i
命令来查看一下当前的会话列表。
切换到会话5,然后查看在这个会话中我们所拥有的系统权限。
输入getuid
命令,可以看到我们已经拥有了“NT AUTHORITY SYSTEM”级别的权限,这就是Windows操作系统中最高级别的权限。
关于这个漏洞的更多信息,可以查看http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-13696。
现在已经获得了目标系统最高的控制权限,接下来尝试一些后渗透测试模块,如下所示。
搜索一下目标系统上都安装了哪些应用程序是一个不错的主意,因为在这些程序中可能保存了登录到网络其他部分的凭证。根据给出的应用程序列表,我们发现了WinSCP 5.7,这是一个非常流行的SSH和SFTP客户端,而使用Metasploit则可以获取保存在它里面的登录凭证。现在运行一下post/windows/gather/credentials/winscp
模块,然后查看是否获得了保存在WinSCP里面的登录凭证。
太棒了,我们找到了一个用来登录到网络中另一台主机192.168.116.134的登录凭证。更令人兴奋的是这个登录凭证是一个root用户,所以当我们使用这个账户访问目标系统时,将会直接获得最高控制权限。我们在ssh_login
模块中使用这个登录凭证,如下所示。
我们已经知道了用户名和密码,下面就可以对这个模块中的对应选项赋值,然后输入目标IP地址,如下图所示。
棒极了,登录成功!Metasploit已经成功地自动获取到目标系统的控制,不过如果希望得到更高的Meterpreter控制权限,可以使用msfvenom
命令来创建一个后门程序。
这个后门程序在执行后将会连接到主机的1337端口,不过如何才能将这个程序送到这个已经被渗透的主机上呢?别忘了,之前我们已经运行了socks
代理辅助模块并且修改了配置。如果在一个命令行程序执行时给它加上proxychains
前缀的话,这个程序就会将proxychains
作为代理。所以当要传输一个文件的时候,我们就可以按照如下图所示的方法使用scp
。
好了,这个文件已经成功传送过去了。像之前一样,运行对应的handler,就可以看到目标系统的连接。下面查看一下在本次练习中获得的全部目标和会话,如下图所示。
在这个实际的例子中,我们渗透了三个系统,并分别通过本地漏洞、人为疏忽以及软件漏洞获得了它们的最高控制权限。
为了建立测试环境,我们需要建立两个不同的网络,以及多个操作系统。所需组件的详细信息如下表所示。
组件名称 |
类型 |
版本 |
网络信息 |
网络类型 |
---|---|---|---|---|
Kali Linux VM Image |
操作系统 |
Kali Rolling (2017.3) x64 |
192.168.174.128 (Vmnet8) |
Host-only |
Ubuntu 14.04 LTS |
操作系统 |
14.04 (trusty) |
192.168.174.132 (Vmnet8) |
Host-only |
Windows 7 |
操作系统 |
Pro |
192.168.116.133 (Vmnet6) |
Host-only |
Ubuntu 16.04 LTS |
操作系统 |
16.04.3 LTS (xenial) |
192.168.116.133 (Vmnet6) |
Host-only |
PhpCollab |
应用程序 |
2.5.1 |
|
|
Disk Pulse |
企业磁盘管理软件 |
9.9.16 |
|
|
WinSCP |
SSH和SFTP软件 |
5.7 |
|
|
在整个练习过程中,我们经历了以下关键步骤。
(1) 使用Nmap对目标IP地址192.168.174.132进行扫描。
(2) Nmap扫描显示,192.168.174.132上的80端口是开放的。
(3) 对目标80端口上运行的应用程序进行踩点,结果为Apache 2.4.7。
(4) 使用浏览器查看HTTP端口的内容,但没有任何发现。
(5) 运行dir_scanner
模块对Apache服务器进行字典式扫描,找到了PhpCollab应用程序的目录。
(6) 使用searchsploit
找到了一个针对PhpCollab的漏洞渗透模块,不过这个模块必须导入到Metasploit中才能使用。
(7) 成功渗透这个应用程序,也因此获得了目标系统的控制权限(受限的)。
(8) 为了提升控制权限,上传了一个可执行的后门程序。
(9) 运行suggester
模块,并发现overlayfs
权限提升漏洞可以帮助我们获得对目标系统的root控制权限。
(10) 从https://exploit-db.com/下载针对这个漏洞的渗透模块,对其进行编译后运行,以此来获得目标系统上的root级控制权限。
(11) 使用先前生成的那个后门程序,获得了另一个Meterpreter的控制权限,不过这次取得的权限是root级别的。
(12) 使用Metasploit中的sshkey_persistence
模块来实现对目标系统的持久控制。
(13) 在目标系统上运行arp
命令,发现该系统还连接到了另外一个网路,也就是192.168.116.0/24。
(14) 使用autoroute脚本添加一个到达这个网络的路由。
(15) 使用Metasploit中的TCP端口扫描器来扫描新发现的网络。
(16) 发现目标系统的80端口是开放的。
(17) 之前只能通过Meterpreter访问目标网络,现在可以使用Metasploit中的socks4a
模块,这样其他工具就可以通过这个模块连接到目标网络。
(18) 运行socks代理,将浏览器所使用代理的端口设置为1080。
(19) 在浏览器中打开192.168.116.133,发现目标系统中运行着Disk Pulse 9.9.16服务器。
(20) 在Metasploit中查找关于Disk Pulse的信息,发现这个软件存在一个基于SEH的缓冲区溢出漏洞。
(21) 因为这个软件是以系统级权限运行的,所以在成功渗透这个软件之后就可以获得目标系统的最高控制权限。
(22) 查看目标系统上所安装的软件列表,并在其中找到了WinSCP 5.7。
(23) 发现Metasploit中内置了一个可以从WinSCP收集登录凭证的模块。
(24) 在WinSCP中找到了一个root登录凭证,并在ssh_login
模块中用这个凭证登录到目标系统。
(25) 上传另一个后门程序,获得了目标系统上的root控制权限。
本章介绍了渗透测试的各个阶段,讲解了Metasploit的安装过程以及如何对指定网络开展黑盒测试,回顾了Metasploit的基本功能和用法,还阐释了在Metasploit中使用数据库的优势,以及如何使用Metasploit实现跳板攻击。
学完本章,我们掌握了以下内容。
本章的主要目的是介绍渗透测试的各个阶段和Metasploit框架,为后续章节的学习做准备。
你可以通过完成下面的练习来加深对本章内容的理解。
overlayfs
权限提升模块。下一章,我们将会开始程序编写以及Metasploit模块的构建工作。我们会学习如何使用Metasploit来构建先进的模块,了解一些最流行的扫描和验证测试脚本的工作原理。