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

发布于 2024-08-13 12:29:16 字数 9169 浏览 39 评论 0

0x00 前言

在之前的文章 《渗透基础——Windows 下计划任务的使用》 曾介绍过计划任务的用法。而在域环境中,通过组策略(Group Policy Object) 同样能够实现计划任务的远程执行,本文将要对这个方法进行介绍,分析利用思路。

0x01 简介

本文将要介绍以下内容:

  • GPO 中的计划任务简介
  • 通过 Group Policy Management Console (GPMC) 实现计划任务的远程执行
  • 通过命令行实现计划任务的远程执行
  • 新建 GPO 实现远程执行
  • 修改已有的 GPO,实现远程执行
  • GPO 的常用操作

0x02 简介

值得阅读的资料:

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/

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

文章
评论
26 人气
更多

推荐作者

IDC-hncloud

文章 0 评论 0

薆情海

文章 0 评论 0

mb_VjXiXQg5

文章 0 评论 0

爱,才寂寞

文章 0 评论 0

BE WATER

文章 0 评论 0

微信用户

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文