域渗透——利用GPO中的计划任务实现远程执行
0x00 前言
在之前的文章《渗透基础——Windows下计划任务的使用》曾介绍过计划任务的用法。而在域环境中,通过组策略(Group Policy Object)同样能够实现计划任务的远程执行,本文将要对这个方法进行介绍,分析利用思路。
0x01 简介
本文将要介绍以下内容:
- GPO中的计划任务简介
- 通过Group Policy Management Console (GPMC) 实现计划任务的远程执行
- 通过命令行实现计划任务的远程执行
- 新建GPO实现远程执行
- 修改已有的GPO,实现远程执行
- GPO的常用操作
0x02 简介
值得阅读的资料:
http://www.harmj0y.net/blog/redteaming/abusing-gpo-permissions/
https://adsecurity.org/?p=2716
http://www.sicherheitsforschung-magdeburg.de/uploads/journal/MJS_052_Willi_GPO.pdf
GPO全称Group Policy Objects,用来存储Active Directory中的策略
自Windows Server 2008开始,GPO开始支持计划任务,便于管理域中的计算机和用户
默认情况下,域用户的组策略每90分钟更新,随机偏移为0-30分钟,域控制器的组策略每5分钟更新
注:
可通过命令实现组策略的强制更新
默认组策略的保存位置:\\<DOMAIN>\SYSVOL\<DOMAIN>\Policies\
,所有域内主机都能访问
注:
之前的文章《域渗透-利用SYSVOL还原组策略中保存的密码》曾介绍过这个文件位置
默认存在两个组策略,每个文件夹对应一个组策略:
{6AC1786C-016F-11D2-945F-00C04fB984F9}
对应Default Domain Controllers Policy
{31B2F340-016D-11D2-945F-00C04FB984F9}
对应Default Domain Policy
如下图
0x03 通过Group Policy Management Console (GPMC) 实现计划任务的远程执行
在域控制器上,位置: Administrative Tools
-> Group Policy Management
如下图
选择域test.local,右键,选中第一个,创建GPO,如下图
输入名称TestGPO1,这会创建一个全局的GPO,作用于所有域用户
选择TestGPO1,右键,Edit...
User Configuration
-> Preferences
-> Control Panel Settings
-> Scheduled Tasks
New
-> Immediate Task(Windows Vista and later)
,如下图
注:
Immediate Task会在每次组策略刷新时执行
四种计划任务的区别可参考官方文档:
https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2008-R2-and-2008/cc770904(v%3dws.11)
注:
也可以选择位置Computer Configuration
-> Preferences
-> Control Panel Settings
-> Scheduled Tasks
接下来,根据提示设置计划任务即可
为便于测试,执行的操作为将执行结果输出到文件,如下图
这个组策略对应的ID为{7D85A2EF-F525-4D8C-B12D-F2825F3A1224}
,在位置\\test.com\SYSVOL\test.com\Policies\{7D85A2EF-F525-4D8C-B12D-F2825F3A1224}\User\Preferences\ScheduledTasks
下找到文件ScheduledTasks.xml
,里面保存计划任务的配置信息
对于域内的主机,可以等待90分钟使组策略自动更新,也可以在客户端执行如下命令强制刷新组策略:
gpupdate /force
客户端默认更新组策略的方式:
读取域共享目录中组策略的版本,位置为\\<domain.com>\Policies\<gpo id>\GPT.ini
,如果版本高于本地保存的组策略版本,客户端将会更新本地的组策略
每次修改组策略,\\<domain.com>\Policies\<gpo id>\GPT.ini
中的Version
会增加
如果域控制器强制客户端刷新组策略,那么不会比较域共享目录中组策略的版本
0x04 通过命令行实现计划任务的远程执行
域控制器系统: Windows Server 2012 R2 x64 域名: test.com
1、创建一个GPO
New-GPO -Name TestGPO1
2、将GPO连到到域test.com
New-GPLink -Name TestGPO1 -Target "dc=test,dc=com"
注:
两条命令可以简写为一条命令:
new-gpo -name TestGPO1 | new-gplink -Target "dc=test,dc=com"
通过命令行回显获得ID为0bfd3f0c-21a1-4eca-8a5e-1f0bd4dc64dc
3、创建计划任务
通过Group Policy Management Console (GPMC)创建的计划任务会自动注册
而我目前还没有找到注册计划任务的接口,所以只能寻找一个变通的方法
好在我最终找到了变通的解决方法,步骤如下:
(1)导出GPO
Backup-Gpo -Name TestGPO1 -Path C:\test
(2)创建计划任务的配置文件ScheduledTasks.xml
路径为\\<domain.com>\Policies\<gpo id>\DomainSysvol\GPO\User\Preferences\ScheduledTasks\ScheduledTasks.xml
(3)修改Backup.xml
和gpreport.xml
加入计划任务的配置信息
(4)还原GPO
Import-GPO -BackupId <backupid> -TargetName TestGPO1 -Path C:\test
完整实现代码已开源,下载地址如下:
https://github.com/3gstudent/Homework-of-Powershell/blob/master/New-GPOImmediateTask.ps1
注:
下篇文章将会详细介绍原理和脚本实现细节
脚本命令示例:
New-GPOImmediateTask -TaskName Debugging -GPODisplayName TestGPO -SysPath '\\dc.test.com\sysvol\test.com' -CommandArguments '-c "123 | Out-File C:\test\debug.txt"'
脚本自动实现以下操作:
- 将TestGPO备份至当前目录
- 修改备份文件夹下的
Backup.xml
和gpreport.xml
- 在备份文件夹中生成文件
ScheduledTasks.xml
- 还原TestGPO
4、强制客户端刷新组策略
Invoke-GPUpdate -Computer "TEST\COMPUTER-01"
注:
Windows Server 2008 R2默认不支持该命令,Windows Server 2012支持
客户端的防火墙需要允许以下连接:
- Remote Scheduled Tasks Management (RPC)
- Remote Scheduled Tasks Management (RPC-ERMAP)
- Windows Management Instrumentation (WMI-IN)
官方资料:
https://docs.microsoft.com/en-us/powershell/module/grouppolicy/invoke-gpupdate?view=win10-ps
5、删除GPO
Remove-GPO -Name TestGPO1
注:
通过Group Policy Management Console (GPMC)右键删除GPO不会删除对应的文件夹,Remove-GPO可以
0x05 利用思路
前提是获得了域管理员的权限或者某个组策略的编辑权限
通用操作如下:
加载GroupPolicy模块:
Import-Module GroupPolicy –verbose
获得所有GPO的内容:
Get-GPO -All
将所有GPO导出为一个HTML报告:
Get-GPOReport -All -ReportType html -Path C:\GposReport\GposReport.html
将每个GPO单独导出一个HTML报告:
Get-GPO -All | %{
Get-GPOReport -name $_.displayname -ReportType html -path ("c:\GPOReports\"+$_.displayname+".html")
}
查看指定GPO的权限设置:
Get-GPPermission -Name "TestGPO1" -All
备份指定GPO:
Backup-Gpo -Name TestGPO1 -Path C:\GpoBackups
备份所有GPO:
Backup-Gpo -All -Path "c:\GpoBackups"
还原指定GPO:
Restore-GPO -Name TestGPO1 -Path C:\GpoBackups
还原所有GPO:
Restore-GPO -All -Path "c:\GpoBackups"
根据不同情况,有以下两种利用思路:
1、新建组策略,创建计划任务实现远程执行
- 创建一个新的GPO
- 备份GPO
- 修改Backup.xml和gpreport.xml
- 创建ScheduledTasks.xml
- 还原GPO
- 强制客户端刷新策略
- 清理操作痕迹
2、修改已有组策略,替换计划任务
如果域控制器上已有策略并配置了计划任务
不再需要注册,修改ScheduledTasks.xml就好
0x06 GPO的常用操作
创建OU:
New-ADOrganizationalUnit -Name OUTest1 -Path "dc=test,dc=com"
查看当前域中的所有计算机:
dsquery computer
获得结果”CN=Computer1,CN=Computers,DC=test,DC=com”
将该计算机加到OU=OUTest1中:
dsmove "CN=Computer1,CN=Computers,DC=test,DC=com" -newparent OU=OUTest1,dc=test,dc=com
查询OU=OUTest1中的计算机:
dsquery computer OU=OUTest1,dc=test,dc=com
创建GPO并连接:
new-gpo -name TestGPO | new-gplink -Target "OU=OUTest1,dc=test,dc=com"
还原:
将计算机Computer1从OU=OUTest1中移除
dsmove "CN=Computer1,OU=OUTest1,DC=test,DC=com" -newparent CN=Computers,dc=test,dc=com
删除OU=OUTest1:
set-ADOrganizationalUnit -Identity "OU=OUTest1,dc=test,dc=com" -ProtectedFromAccidentalDeletion $false
Remove-ADOrganizationalUnit -Identity "OU=OUTest1,dc=test,dc=com" -Recursive -Confirm:$False
0x07 小结
本文介绍了利用GPO中的计划任务实现远程执行的方法,分析利用思路,通过命令行实现了GPO和计划任务的创建、修改和删除。
0x08 补充
我注意到harmj0y的博客中提到了某些情况下他的脚本无法使用的情况:
http://www.harmj0y.net/blog/redteaming/abusing-gpo-permissions/
个人认为是因为创建的计划任务没有注册,使用我修改以后的脚本应该能解决这个问题,如果读者有新的建议,欢迎及时反馈。