8

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

 4 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.
neoserver,ios ssh client

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


Recommend

  • 11

    域渗透——利用dnscmd在DNS服务器上实现远程加载Dll 0x00 前言 由Shay Ber公开的一个利用方法,在域环境中,使用DNSAdmin权限能够在DNS服务器上实现远程加载Dll。这不算漏洞,但可以作为一个域渗透的技巧,本文将结合自己的...

  • 14

    域渗透——利用GPO中的计划任务实现远程执行(命令行实现原理与脚本细节) 0x00 前言 在上篇文章

  • 26

    0x00 前言 在渗透测试中,尤其是域渗透,常常会用到Windows系统的计划任务,一是用于远程启动程序,二是用于程序的自启动 那么,计划任务具体有哪些使用技巧呢?是否对权限有要求?一定需要管理员权限才能运行吗? 0x01 简介

  • 17

    0x00 前言 对于Windows系统,经常会用到远程桌面服务,通过界面对系统进行远程管理。 这其中存在一个不足:使用远程桌面服务进行远程登录(使用另一用户或是踢掉当前用户),无法获取到当前用户的系统状态。 如果想要查看(甚至是...

  • 10

    渗透技巧——利用tscon实现未授权登录远程桌面 0x00 前言 Windows系统下,tscon可被用来切换远程桌面的会话。正常情况下,切换会话时需要提供登录密码,但通过特殊的利用方法能够绕过验证,不输入密码实现未授权登录。...

  • 7

    0x00 前言 在以前的文章《在远程系统上执行程序的技术整理》整理过域环境下常用的程序执行方法:at、psexec、WMIC、wmiexec、smbexec和powershell remoting,这次将基于Matt Nelson‏ @enigma0x3的研究,详细介绍在域环境下使用DCOM执行程序的方...

  • 15

    Windows Lnk远程代码执行漏洞(CVE-2017-8464)利用测试 0x00 前言 北京时间6月14日凌晨,微软发布编号为CVE-2017-8464的漏洞公告,官方介绍Windows系统在解析快捷方式时存在远程执行任意代码的高危漏洞,黑客可以通过U盘、...

  • 7

    CronJob 计划任务异常不执行的问题 作者: 张志强 ...

  • 7

    分享一次Linux任务计划crontab不执行的问题排查过程 | 张戈博客Jager · 4月5日 · 2016年linux 694次已读朋友弄了一个小项目,要我帮忙做下Linux系统运维,上线一段时间后,发现项目偶尔会挂掉导致服务...

  • 9

    域渗透——利用GPO中的脚本实现远程执行 17 Oct 2022 0x00 前言 在之前的文章

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK