本书前几章已经涵盖了大量的渗透相关知识,现在是时候来将这些知识应用到实践中了。我们要使用Metasploit中各种业内领先的测试工具来轻松地对目标网络、网站或者其他服务进行渗透测试和漏洞评估。
本章将着眼于以下几个要点。
本章的重点是使用各种行业内流行的工具与Metasploit一起进行渗透测试。不过Web安全测试的测试阶段可能与其他类型的安全测试有所不同,但原则仍然是相同的。
我们可以使用三种不同的方法来完成一次渗透测试,分别是白盒测试、黑盒测试和灰盒测试。白盒测试指的是渗透测试工程师已经掌握了系统的全部信息,而且客户将会提供所有账户信息、源代码和其他与环境有关的必要信息。黑盒测试指的是渗透测试工程师此前对目标的信息掌握量几乎为零。灰盒测试介于两者之间,指的是渗透测试工程师仅掌握了少量或部分环境信息。我们将在本章的下一节展示一次灰盒测试,因为这种测试方法最大程度上结合了另外两种方法的优点。灰盒测试可能包含,也可能不包含操作系统(operating system,OS)的细节、部署的Web应用程序、运行的服务器版本以及完成渗透测试所需的所有其他技术细节。灰盒测试所需的部分信息要求测试人员使用扫描获取,因此它的耗时将比黑盒测试少,但是比白盒测试多。
假设我们知道目标服务器上运行着Windows操作系统,但不知道其确切版本。在这种情况下,我们就可以将Linux和Unix系统的踩点技术去掉,将全部精力都放在Windows版本的检查上。这样可将处理范围局限在单一系统内,而无须考虑所有类型的系统,从而节省了大量时间。
以下是使用灰盒测试技术进行渗透测试的各个阶段。
上图清楚地说明了灰盒测试包括的各个阶段。另外,图中使用虚线框的阶段并不是必需的。而使用双线框表示的阶段是关键阶段,使用单线框表示的阶段是在进行测试时要遵循的标准阶段。现在开始渗透测试并对灰盒测试的各个方面进行分析。
进入客户的工作场所后要做的第一件事情就是与员工以及最终用户进行交流。这个阶段进行的主要是非技术型黑客行为,也就是社会工程学。这样做的目的是以最终用户的角度收集目标系统的信息。这个阶段同样也检测了目标组织的最终用户是否会因泄露内部的信息从而导致系统安全被破坏。下面的例子应该可以让你对此有一个更深的了解。
去年,我们的团队开展了一次白盒测试。我们来到客户的工作场所进行进一步的内部测试。到那里之后,我们开始与最终用户交流,询问他们在使用新安装的系统时是否遇到了什么问题。出人意料的是,他们谁都不允许我们接触他们的系统。但他们很快解释说这是因为有一个登录问题,一段时间内不允许连接超过10次。
虽然知道这是客户公司的安全策略,但是我们对于不能使用任何客户端还是有些惊讶。不过后来,我们团队的一个成员发现了一位55~60岁的老员工在使用互联网时遇到了问题。我们过去询问他是否需要些帮助,他的回答是肯定的。我们告诉他可以用我们带来的笔记本连接到局域网中工作。他把网线插到了我们的笔记本电脑上,然后开始工作。我们中一个站在他身后的同事使用手中的摄像笔记录了这位老员工的所有操作,例如他登录系统的账号。
我们又发现了一位系统出现问题的女士,她说她经常在登录的时候遇到问题。我们随即告诉她,我们将尽快解决,但是我们需要她的账户信息以便从后台进行处理。另外我们还对她说,需要她将用户名、密码以及登录的IP地址告诉我们。她很快同意了,并将这一切都告诉了我们。通过这个例子可以得出这样的结论:无论这些网络环境设置得多么安全,当员工遇到问题时,他们都可能会轻易地泄露自己的登录信息。我们后来将这些内容作为报告的一部分汇报给了客户。
从最终用户处可以获得的其他类型的有用信息包括下面这些。
这些信息在对可测试的系统进行先验性技术测试时是必需的,将有助于确定测试的关键区域。
不过,这个阶段在进行灰盒测试时并不是必需的。比如说有时你的客户只是需要你完成对他们网站的测试,或者你的客户公司在一个很远的地方,甚至跟你不在同一个国家。在这些情况下,我们将略过这个阶段,并向公司的管理员或者其他工作人员询问他们目前正在使用的各种技术。
在与最终用户交流完之后,我们需要研究网络配置并从目标网络获取更多信息。同时,从最终用户处收集到的信息可能是不全面甚至是错误的。渗透测试工程师的职责之一就是将每一个细节再确认一遍,因为误报和伪造的信息可能会使渗透测试出现问题。
信息收集包括获取目标网络的深入细节、所使用的技术、正在运行的服务版本,等等。
这些信息可以从最终用户、管理员、网络工程师处收集。在进行远程测试或者信息收集不完整的时候,可以使用各种漏洞扫描工具(例如Nessus、GFI局域网卫士、OpenVAS等)来获取缺少的信息,例如操作系统、服务、TCP或者UDP端口。
在下一节中,我们会使用行业内最优秀的工具(例如Nessus和OpenVAS)来收集信息。不过在开始这个任务之前,可以先使用客户端访问页面、进行前期交互或用问卷调查等方法获取一部分待测试环境的信息。
测试环境示例
根据通过问卷调查、前期交互和用客户端访问页面等方法收集到的信息,我们得出以下的测试环境示例。
我们已经获得了对目标网络的VPN访问权限,目标是对一个网络进行渗透测试。我们已经获悉该企业网络使用了基于Windows的操作系统。假设这里已经如同第1章介绍的那样使用NMAP完成了对目标的扫描,并在192.168.0.196上发现了一个用户系统。接下来让我们使用Metasploit和其他行业顶尖工具来完成一次全面的渗透测试。第一个登场的工具是OpenVAS。这是一款漏洞扫描软件,是世界上最先进的漏洞管理工具之一。OpenVAS最大的优势在于它是完全免费的,这一点使它成为小型公司和个人的最佳选择。虽然OpenVAS有时也会出现一些问题,而且可能需要你花费很多精力去手动修复这些错误,但是作为行业瑰宝之一,OpenVAS一直是我最为欣赏的漏洞扫描程序。
如果需要在Kali Linux中安装OpenVAS,可以参考以下网址提供的资料:https://www.kali.org/penetration-testing/openvas-vulnerability-scanning/。
为了将OpenVAS整合到Metasploit中,首先需要在Metasploit中加载OpenVAS插件,过程如下。
可以看到,在Metasploit中还包含了很多流行的工具模块,例如SQLMAP、Nexpose和Nessus。
为了将OpenVAS插件加载到Metasploit中,需要在Metasploit的控制台中输入命令load openvas
。
上图显示了一个在Metasploit中成功加载OpenVAS插件的过程。
为了能在Metasploit中使用OpenVAS的功能,需要将Metasploit中的OpenVAS插件与OpenVAS软件本身连接起来。这一点可以通过在命令openvas_connect
后面添加用户凭证、服务器地址、端口号和SSL状态实现,整个过程如下图所示。
在正式开始之前,我们先来了解一下工作区的概念。使用工作区是一个管理渗透测试的绝佳选择,特别是当你在一家专门从事渗透测试和漏洞评估的公司工作的时候。我们可以为不同的项目创建不同的工作区,从而轻松管理这些项目。使用工作区可以确保不会将本次测试和其他项目的结果弄混。因此,我强烈建议你在进行渗透测试的时候使用工作区。
新工作区的创建以及工作区之间的切换十分简单,下图给出了工作区的操作实例。
在上图中,我们添加了一个名为AD_Test
的新工作区,然后仅通过输入workspace
命令和AD_Test
(工作区的名字)就切换到了这个工作区。
要启动漏洞扫描,第一件要做的事就是创建目标。可以使用命令openvas_target_create
来创建任意数量的目标,如下图所示。
我们已经创建了IP地址为192.168.0.196
的目标,它的名字为196_System
,备注为196_System_in_AD
(为了对目标进行说明)。最好记住这个目标的ID。
接下来需要为被测试的目标定义一个策略。可以使用openvas_config_list
命令列出示例策略,如下所示。
msf > openvas_config_list
[+] OpenVAS list of configs
ID Name
-- ----
085569ce-73ed-11df-83c3-002264764cea empty
2d3f051c-55ba-11e3-bf43-406186ea4fc5 Host Discovery
698f691e-7489-11df-9d8c-002264764cea Full and fast ultimate
708f25c4-7489-11df-8094-002264764cea Full and very deep
74db13d6-7489-11df-91b9-002264764cea Full and very deep ultimate
8715c877-47a0-438d-98a3-27c7a6ab2196 Discovery
bbca7412-a950-11e3-9109-406186ea4fc5 System Discovery
daba56c8-73ec-11df-a475-002264764cea Full and fast
出于学习的目的,我们选择使用Full and fast ultimate策略。留心一下策略ID,这里对应的ID是698f691e-7489-11df-9d8c-002264764cea
。
现在已经知道了目标ID和策略ID,可以更进一步,使用如下所示的命令openvas_task_create
来创建一个漏洞扫描任务。
msf > openvas_task_create
[*] Usage: openvas_task_create <name> <comment> <config_id> <target_id>
msf > openvas_task_create 196_Scan NA 698f691e-7489-11df-9d8c-002264764cea
5e34d267-af41-4fe2-b729-2890ebf9ce97
[*] 694e5760-bec4-4f80-984f-7c50105a1e00
[+] OpenVAS list of tasks
ID Name Comment Status Progress
-- ---- ------- ------ --------
694e5760-bec4-4f80-984f-7c50105a1e00 196_Scan NA New -1
我们已经使用openvas_task_create
命令和任务名字、注释、控制ID和1(目标ID)创建了一个新的任务。成功创建任务之后,就可以按如下所示开始扫描了。
msf > openvas_task_start 694e5760-bec4-4f80-984f-7c50105a1e00
[*] <X><authenticate_response status='200'
status_text='OK'><role>Admin</role><timezone>UTC</timezone><severity>nist</
severity></authenticate_response><start_task_response status='202'
status_text='OK, request submitted'><report_id>c7886b9c-8958-4168-9781-
cea09699bae6</report_id></start_task_response></X>
从上面的结果中可以看到,我们已经使用openvas_task_start
命令和任务ID完成了扫描的初始化。现在使用openvas_task_list
命令来查看一个任务的进度,如下图所示。
保持对任务进度的观察,直至任务结束。然后使用openvas_report_list
命令列出扫描报告,过程如下图所示。
我们可以下载这份报告,也可以使用openvas_report_download
命令以及报告ID、格式ID、位置和名字将这份报告直接导入数据库,如下图所示。
我们可以通过openvas_report_import
命令将其导入到Metasploit中,如下图所示。
也可以使用openvas_format_list
命令来查看所有的格式ID,过程如下图所示。
将报告成功导入数据库之后,就可以使用vulns
命令查看MSF中的漏洞数据库,如下图所示。
所有的漏洞都已经保存到了数据库中。我们还可以通过浏览器访问9392端口来登录Greenbone助手,对漏洞数量进行交替确认,并深入了解这些漏洞的细节,如下图所示。
我们已经在目标主机上发现了多个影响很大的漏洞,现在正是对威胁区域进行建模、确定针对目标系统高危漏洞的最好时机。
在进行渗透测试的时候最先考虑的就是对威胁区域进行建模。这个阶段最重要的就是网络中的关键区域,这些区域是至关重要的,同时它们与其他区域也建立着连接。一个网络和系统是否脆弱取决于威胁区域。我们可能找到了很多目标网络或者系统的漏洞,但是这些漏洞会对关键区域造成什么样的影响才是我们最关心的问题。这个阶段的研究重点是如何消除那些对组织资产产生最高威胁的漏洞。对威胁区域进行建模将会帮助我们对目标漏洞进行正确的设置。不过应客户要求,可以跳过这个阶段。
分析目标可能产生的影响,并将这些漏洞与可能产生的最大影响进行标记是十分必要的。此外,当我们面对的渗透目标是一个大型网络的关键区域时,威胁建模也是十分重要的。
根据OpenVAS提供的扫描结果,可以看到两个关于DCE/RPC和MSRPC服务的枚举报告漏洞,但是由于当前设备位于网络内部,因此这两个漏洞不会对基础设施造成损害,所以可以将它们排除在我们的渗透测试范围之外。同时,利用DOS之类的漏洞进行渗透测试可能会引起目标计算机蓝屏宕机(Blue Screen of Death,BSOD)。在大多数渗透测试中,都应尽量避免使用DoS攻击方式,除非我们事先征求客户同意。因此,跳过这个漏洞,转而去选择一个靠得住的漏洞——HTTP文件服务器远程代码执行漏洞(HTTP File Server Remote Command Execution Vulnerability)。通过在OpenVAS的Web界面浏览这个漏洞的细节,可以看到这个漏洞对应的编号为CVE 2014-6287。接着在Metasploit中查找这个漏洞对应的渗透模块,很快便会找到exploit/windows/http/rejetto_hfs_exec
模块,查找的过程如下图所示。
我们来加载渗透模块,设置所需选项,通过漏洞对目标进行渗透如下图所示。
现在我们已经设置好了所有的参数,接下来只需要使用exploit
命令启动这个渗透模块,这个过程如下图所示。
干得漂亮!我们已经成功完成了对目标系统的入侵,接下来使用一个后渗透测试来查看目标操作系统的类型。
运行sysinfo
命令之后,可以发现这个系统的类型为64位的Windows 10。这个系统位于一个名为PYSSG的域中,当前已经有7个用户登录。下面运行arp
命令搜索网络中的其他系统。
可以看到在这个网络中运行着许多系统,不过我们知道这个网络是在Active Directory下配置的。这时我们就可以考虑对Active Directory的结构进行测试,并获得该网络其他部分的信息,从而可能获得对域控制器的访问权限。
现在我们已经成功渗透了Active Directory(AD)网络中的一台主机,下面就要找出这个网络的域控制器并尽可能多地收集关于它的信息,最后再利用这些信息完成对它的渗透。
查找域控制器
enum_domain
模块就可以用来查找域控制器,操作的过程如下图所示。
从上图中可以看到,我们搜集到了很多有用的信息,例如域名、域名控制器以及它的IP地址。这个模块使用起来也很简单,你只需要提供一个参数的值就可以完成操作,这个参数就是那个用来控制被渗透主机的会话标识符。
列举出Active Directory网络中的共享文件
如果希望查看这个网络中的共享文件,可以使用enum_shares
这个模块,使用的过程如下图所示。
从上图中可以看到,在这个网络中有一个print共享文件,但这个发现好像没有什么价值。没关系,我们接着来尝试一些其他的模块。
列举出Active Directory网络中的主机
下面使用enum_domain_computers
模块来查看Active Directory网络中的主机信息,查看的过程如下图所示。
在上图中可以看到我们只设置了模块中的一个参数——会话标识符。下面运行这个模块并分析结果。
从上图中可以看到,我们获得了很多有用的信息,例如域名信息、计算机名、OU,甚至可以看到目标操作系统的详细版本信息: Windows Server 2016标准版。这可是一个非常先进的操作系统,想在它身上找到漏洞进行渗透是个很有挑战性的难题。接下来不妨继续搜索一些有用的信息。
列举出在Active Directory中登录的用户
有时候,我们可以通过盗取管理员的令牌在Active Directory 中“为所欲为”。下面首先来查看一下已经登录到这个网络的用户。
还行,我们找到了一个登录到系统的用户。下面使用一些更高级的Metasploit功能来搜集这个网络的有用信息。
列举出域令牌
接下来在已被成功渗透的主机上面运行post/windows/gather/enum_domain_tokens
模块,它将会显示当前使用的域账户信息,这个过程如下图所示。
我们发现了一个有意思的结果,账号deepankar恰好正是这台机器的本地管理员(local administrator)。另外,我们在“域组和用户令牌”列表中找到了一个很有意思的条目:deep,它就是域管理员的账号。这也意味着域管理员可以从这台机器登录。这个模块还可以列出用户的运行过程,使用方法如下所示。
干得漂亮!我们现在看到了所有的本地管理员和域管理员所运行的进程。接下来继续对域进行枚举,看看是否可以找到更多的信息。
在Meterpreter中使用extapi
在扩展API的帮助下,Windows环境中的Meterpreter可以实现很多新功能。扩展API中提供了对剪贴板操作、查询服务的简单访问,枚举打开的窗口以及ADSL查询功能。
如果想要在Metasploit中载入扩展API的话,只需要使用命令load
加上extapi
即可,这个过程如下图所示。
运行上图所示的命令可以使用更多的功能。如果需要查看这些功能的帮助信息,可以在Meterpreter中输入?
,执行过程如下所示。
使用Metasploit列举出打开的窗口
扩展API中的window_enum
可以列出被渗透主机上所有打开的窗口。这可以帮助我们掌握目标以及运行在其上的程序的更多信息。现在来看看当在目标系统上运行这个模块时会发生什么。
跟设想的一样,Meterpreter中列出了目标主机上所有打开窗口的列表以及它们当前的进程ID。接着再仔细地查看一下。
可以看到,目标系统上打开了微软公司的word程序,这表示目前正有人在使用这台计算机。
剪贴板的操作
现在我们已经获悉目前有人正在使用这台电脑,而且也可以使用扩展API的功能了,接下来就尝试操作目标上的剪贴板,如下图所示。
干得漂亮!看起来好像有人将某个应用程序的用户名和密码复制到剪贴板上了!等等,别急,192.168.0.190正好是域控制器的IP地址。多注意一下这些用户名和密码,我们很快将利用它们进行更复杂的攻击。
使用Metasploit中的ADSI管理命令
我们现在已经拥有了域控制器上的一些关键的用户名与密码。但是我们绝不能止步于此,继续探索吧!
我们在adsi_computer_enum
命令后面添加了pyssg.com
参数,并执行了这个命令,结果中列出了当前网络中很多之前不知道的主机。这些主机大多运行着Windows 10专业版操作系统。来看看我们还得到了哪些有用的信息。
另外还可以使用adsi_dc_enum
命令加上pyssg.com
的方式来查找域控制器,这个pyssg.com
就是上图中所使用的那个域名。命令adsi_user_enum
可以帮助我们更详细地查看AD 用户,如下图所示。
我们在这里只发现了一个OU。仔细查看上图可以发现,默认OU为OPS。
在网络中使用PsExec渗透模块
在前面的章节中我们获得了一些用户名和密码。现在要在Metasploit的psexec
模块中使用这些信息来获取域控制器的控制权限。下面的内容来自微软官方网站。
“PsExec是作为telnet的轻量级替代品开发出来的,利用它可以在其他系统上执行进程。你可以在无须安装客户端的情况下,实现与控制台程序的完美互动。PsExec最强大的用途包括在远程系统上启动交互式命令提示符,以及远程启用IpConfig等可以显示远程系统信息的工具。”
PsExec这个模块主要用来实现pass-the-hash攻击,这种情况下攻击者往往获悉了密码的散列值,但是尚未从这个散列值还原出密码的值。这个模块可以利用密码的散列值登录到目标系统上,从而执行各种命令。不过现在我们已经知道了目标的明文密码值,所以直接使用这个模块就可以登录到域控制器。下面给出了这个模块的使用方法。
我们已经设置好了所有的选项,下面开始执行并分析执行结果。
做得很棒!我们已经成功获取了域服务器的控制权。尝试几个后渗透模块,来看看是否能成功。
没错!我们已经成功完成了对Windows 2016服务器的渗透。尽管这个服务器没有任何严重的漏洞,但是在访问权限控制上却存在着缺陷。
现在已经拥有了服务器的系统级控制权限,我们几乎可以对它为所欲为了。
在Metasploit中使用Kiwi
Metasploit中提供了用来实现针对登录凭证的操作的Mimikatz和Kiwi扩展模块,它们实现了密码和散列值的导出、内存中密码的导出、生成黄金票据(golden tickets)等功能。首先在Metasploit中载入kiwi
,如下图所示。
成功载入kiwi
模块之后,就可以看到这个模块中提供的命令菜单了,具体显示的内容如下所示。
下面试着运行lsa_dump_secrets
命令,并查看我们是否可以导出一些有用的东西来。
干得漂亮!显然我们已经将密码的NTLM和SHA1散列值导出了,现在我们已经拥有大量可以用来制作黄金票据的信息了。不过,关于黄金票据的内容要在后面的章节中再介绍。现在我们尝试使用hashdump
命令来导出散列值。为了完成这个操作,我们必须迁移到一个用户进程上来。首先使用ps
命令列出所有的进程来,如下图所示。
迁移到lsass.exe进程上,它的进程ID为576,如下图所示。
太棒了!我们已经成功地将这个进程迁移到lsass.exe上,运行haskdump
命令就可以导出所有的用户散列值,我们一会将破解它们。
使用Metasploit中的cachedump
工具
既然我们已经取得了一个高级的访问权限,最好使用cachedump
来获取用户登录凭证,如下图所示。
我们之前已经了解了实现对目标系统进行持久性控制的很多方法,后续章节将会对此进行更详细的介绍。在一个拥有众多用户的大型网络中秘密地添加一个用户以保证我们对Active Directory网络的持续访问,这并不是一件困难的事。加载post/windows/manage/add_user_domain
模块的过程如下所示。
可以看到这里面已经设置好了所有需要的参数,例如USERNAME
、PASSWORD
和 SESSION
。运行这个模块并查看我们的用户是不是已经添加到了域中。
可以看到我们已经成功地将用户hacker添加到了PYSSG
域中。我们可以轻松地使用这个用户随意登录。不过我还是建议你使用一个和现有名称相似的用户名,像hacker这种用户名未免太显眼了。
另外,还可以使用loot
命令来查看所有搜集到的信息的细节,如下图所示。
现在让我们来讨论如何手动创建一份渗透测试报告,看看其中应该包括哪些内容,这些内容应该放在什么位置,应该加入/移除什么,如何规范化报告的格式,以及如何使用图表等。这个渗透测试的报告将会被很多人阅读,例如负责人、管理员、高层决策人员。因此,必须将所有资料组织得足够好,这样我们所要表达的想法才能被这些人正确理解。
一份合格的渗透报告可以按照以下格式进行细分。
下面是对一些重要步骤的简要说明。
执行摘要是对完整报告的总结,它要以不包含专业术语的一般语言进行叙述,侧重于向高级管理人员提供信息,通常包含以下信息。
漏洞信息摘要:这部分以表格的形式描述发现的漏洞数量,将按照它们的危险等级分为高、中、低三个级别,危险等级越高,造成的破坏越大。这个阶段含有一个漏洞分布图表,这个表包括了多个系统的所有问题信息。下表就是这样的一个示例。
危险等级 | 漏洞数量 |
---|---|
高 | 19 |
中 | 15 |
低 | 10 |
建议摘要:这部分列举出来的建议仅是针对那些影响最大的漏洞。
报告的这一部分包括了渗透测试期间执行的所有步骤、漏洞的深入细节以及修改建议。一般来说,管理员对下面列出的内容更感兴趣。
在本章中,我们了解了如何使用OpenVAS内置的连接器和Metasploit的各种扩展来完成网络上的高效渗透测试,以及如何生成渗透测试报告。后面的章节中还会介绍Metasploit中的更多内置连接器,例如Nessus、SQLMAP等。
在下一章中,我们将会学习如何使用Metasploit完成客户端攻击,以及如何使用社会工程学和攻击载荷交付获取那些无法直接渗透的系统控制权限。