权限维持-域后门

拿到域控后,需要一些技术来保持权限维持,接下来介绍常见的域控技术。

1:创建Skeleton域后门

安装Skeleton Key后,所有域账户都可以使用一个相同的密码进行认证,同时原有密码仍然有效。
该技术通过注入lsass。exe进程实现,创建的Skeleton Key保存在内存中,如果域控重启,那么其
将会失效。

利用条件:域管理员

利用工具:mimikatz。

mimikatz.exe
privilege::debug
misc::skeleton
exit

这样所有的域账户有一个相同的密码mimikatz。

缓解措施:
微软在 2014 年 3 月添加了 LSA(Local Security Authority,本地安全机构)保护策略,用来防止对 lsass.exe 进程的内存读取和代码注入。通过执行以下命令,可以开启或关闭 LSA 保护。

# 开启 LSA 保护策略
reg add “HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa” /v RunAsPPL /t REG_DWORD /d 1 /f
# 关闭 LSA 保护策略
reg delete “HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa” /v RunAsPPL
开启LSA 保护策略并重启系统后,Mimikatz 的相关操作都会失败。此时即使已经获取了 Debug 权限也无法读取用户哈希值,更无法安装 Skeleton Key。

2:创建DSRM域后门

DSRM(Directory Services Restore Mode,目录服务还原模式)是域控的安全模式启动选项,用于使服务器脱机,以进行紧急维护。在初期安装 Windows 域服务时,安装向导会提示用户设置 DSRM 的管理员密码。有了该密码后,网络管理员可以在后期域控发生问题时修复、还原或重建活动目录数据库。
在域控上,DSRM 账户实际上就是本地管理员账户(Administrator),并且该账户的密码在创建后几乎很少使用。通过在域控上运行 NTDSUtil,可以为 DSRM 账户修改密码,相关命令如下:

*其实就是一个账户。

利用条件:
windows server 2008之后,并且拥有域管。

通过mimikatz读取域控SAM文件,获取DSRM账户的哈希值
mimikatz.exe “privilege::debug” “token::elevate” “lsadump::sam” exit

img
c013ad5754c693dde42e6f2802c8ae4

改 DSRM 账户的登录模式,以允许该账户远程登录。可以通过编辑注册表的DsrmAdminLogonBehavior 键值来实现,可选用的登录模式有以下3种:
0:默认值,只有当域控制器重启并进入 DSRM 模式时,才可以使用 DSRM 管理员账号。
1:只有当本地 AD DS 服务停止时,才可以使用 DSRM 管理员账号登录域控制器。
2:在任何情况下,都可以使用 DSRM 管理员账号登录域控制器。
必然是修改为2:
reg add “HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa” /v DsrmAdminLogonBehavior /t REG_DWORD /d 2 /f

完事后可以应用到任意的NTLM哈希传递攻击。
如mimikatz:
sekurlsa::pth /user:administrator /domain:zhattatey /ntlm:c013ad5754c693dde42e6f2802c8ae4d

或者psexec:
./psexec.py zhattatey/Administrator@ip -hashes :xxx

3:SID History的利用:1. SID & SID History

在 Windows 系统中,SID(Security Identifiers)是指安全标识符,是用户、用户组或其他安全主体的唯一、不可变标识符。
Windows 根据 ACL(访问控制列表)授予或拒绝对资源的访问和特权,ACL 使用 SID 来唯一标识用户及其组成员身份。当用户登录到计算机时,会生成一个访问令牌,其中包含用户和组 SID 和用户权限级别。当用户请求访问资源时,将根据 ACL 检查访问令牌以允许或拒绝对特定对象的特定操作。
如果将账户删除,然后使用相同的名字创建另一个账户,那么新账户不会具有前一个账户的特权或访问权限,这是因为两个账户的 SID 不同。
SID History 是一个支持域迁移方案的属性,使得一个账户的访问权限可以有效地克隆到另一个账户,这在域迁移过程中非常有用。例如,当 Domain A 中的用户迁移到 Domain B 时,会在 Domain B 中新创建一个账号。此时,将 Domain A 用户的 SID 添加到 Domain B 的用户账户的 SID History 属性中。这就确保了 Domain B 用户仍然拥有访问 Domain A 中资源的权限。

SID:牌子,ACL:列表。访问时,把列表和牌子对照。

在实战中,hacker 可以将域管理员用户的 SID 添加到其他域用户的 SID History 属性中,以此建立一个隐蔽的域后门。

利用条件:域管

例:将Administrator的SID添加进Alice的SID History
# mimikatz版本大于2.1.0
mimikatz.exe “privilege::debug” “sid::patch” “sid::add /sam:Alice /new:Administrator” exit
# mimikatz版本小于2.1.0
mimikatz.exe “privilege::debug” “misc::addsid Alice ADSAdministrator” exit

*通过powershell查看Alice:
Import-Module ActiveDirectory
Get-ADUser hack -Properties SIDHistory

img
一毛一样。

如果用Alice连接域控,执行whoami /priv将看到拥有域管所有权限。

4:利用AdminSDHolder打造域后门

AdminSDHolder 是一个特殊的 Active Directory 容器对象,位于 Domain NC 的 System 容器下。

img
AdminSDHolder 通常作为系统中某些受保护对象的安全模板,以防止这些对象遭受恶意修改或滥用。
受保护对象通常包括系统的特权用户和重要的组,如 Administrator、Domain Admins、Enterprise Admins 以及 Schema Admins 等。
在活动目录中,属性 adminCount 用来标记特权用户和组。对于特权用户和组来说,该属性值被设为 1。
通过 ADFind 查询 adminCount 属性设置为 1 的对象,可以找到所有受 AdminSDHolder 保护的特权用户和组。

# 枚举受保护的用户
Adfind.exe -b “dc=hack-my,dc=com” -f “&(objectcategory=person)(samaccountname=*)(admincount=1)” -dn
# 枚举受保护的组
Adfind.exe -b “dc=hack-my,dc=com” -f “&(objectcategory=group)(admincount=1)” -dn
在默认情况下,系统将定期(每60分钟)检查受保护对象的安全描述符,将受保护对象的 ACL 与 AdminSDHolder 容器的 ACL 进行比较,如果二者不一致,系统就会将受保护对象的 ACL 强制修改为 AdminSDHolder 容器的 ACL。该工作通过 SDProp 进程来完成,该进程以 60 分钟为一个工作周期

在实战中,hacker 可以篡改 AdminSDHolder 容器的 ACL 配置。当系统调用 SDProp 进程执行相关工作时,被篡改的 ACL 配置将同步到受保护的 ACL 中,以此建立一个隐蔽的域后门。

利用条件:域管

执行以下命令,通过 PowerView 向 AdminSDHolder 容器对象添加一个 ACL,使普通域用户 Alice 拥有对 AdminSDHolder 的 “完全控制” 权限。
Import-Module .\PowerView.ps1
Add-DomainObjectAcl -TargetSearchBase “LDAP://CN=AdminSDHolder,CN=System,DC=hack-my,DC=com” -PrincipalIdentity Alice -Rights All -Verbose
执行后,Alice 用户成功拥有 AdminSDHolder 容器对象的完全控制权限
等待 60 分钟后,Alice 用户将获得对系统中的特权用户和组完全控制权限。

清除:
Remove-DomainObjectAcl -TargetSearchBase “LDAP://CN=AdminSDHolder,CN=System,DC=hack-my,DC=com” -PrincipalIdentity Alice -Rights All -Verbose

缩短SDDrop工作周期:

方法1:修改注册表
hacker 也可以通过注册表手动修改 SDProp 进程的工作周期,以缩短等待的时长(最小值1分钟,最大值2小时)。该注册表需要慎重修改, 当修改的频率变高时,CPU处理LSASS的开销也就越大,这很容易导致系统变得卡顿,该注册表键默认是不存在的。
# 工作周期修改为 1 分钟,键值以秒为单位
reg add HKLM\SYSTEM\CurrentControlSet\Services\NTDS\Parameters\AdminSDProtectFrequency /t REG_DWORD /d 60
img
方法2:强制 SDProp 执行
① 运行 Ldp.exe(C:\Windows\System32\Ldp.exe)
② 点击连接 -> 连接,输入当前机器的机器名或IP,端口默认为 389
③ 点击连接 -> 绑定,选择绑定为当前登录的用户
④ 在修改窗口这里针对不同版本的域控制器有不同的情况:
当域控为Windows Server 2008时,点击浏览 -> 修改,在属性选项卡中输入 FixUpInheritance ,在值字段输入 yes。操作选择添加,然后点击输入,最后运行即可。
img
当域控为Windows Server 2008 R2或Windows Server 2012及以上时,点击浏览 -> 修改,在属性选项卡中输入 RunProtectAdminGroupsTask ,在值字段输入 1。操作选择添加,然后点击输入,最后运行即可。
img

5:通过HOOK PasswordChangeNotify

PasswordChangeNotify 在微软官方文档中的名称为 PsamPasswordNotificationRoutine,是一个 Windows API。当用户重置密码时,Windows 会先检查新密码是否符合复杂性要求,如果密码符合要求,LSA 会调用 PasswordChangeNotify 函数在系统中同步密码。
当调用 PasswordChangeNotify 时,用户名和密码将以明文的形式传入。hacker 可以通过 Hook 技术,劫持 PasswordChangeNotify 函数的执行流程,从而获取传入的明文密码。

没复现。


权限维持-域后门
http://example.com/2024/01/19/权限维持-域后门/
Aŭtoro
zhattatey
Postigita
January 19, 2024
Lizenta