0x01 前言
域网络中,主机的本地管理员很少被使用,但是给网络安全却带来了很大的风险。攻击者如果获取了本地管理员的NTLM,不必破解,即可通过PTH攻击域内其他主机。为了解决这个问题,微软在2014年发布了KB2871997和KB2928120两个补丁,PTH方式失效。但是如果域内主机的本地管理员的口令比较简单,则可能被破解,口令仍然可被用于口令猜解或爆破的字典库、IPC或远程桌面登录等。
因此,微软在2015年发布了一个本地管理员口令解决方案LAPS(Local Administrator Password Solution),用来集中化管理域内主机本地管理员的口令。通过LAPS制作策略,强制管理域内主机的本地管理员口令,防止恶意攻击者利用本地管理员口令进行域内横向攻击。该方案包含客户端和服务器,分别安装于域内主机和域服务器。LAPS主要功能包括:
- 根据策略搜集本地管理员账号,设置符合密码策略的随机口令;
- 将新的口令上传到域服务器,并储存在域内对应的主机账号的属性中;
- 将新的过期日期更新到主机账号属性;
- 检查本地管理员账号的口令是否过期,如果口令过期,会产生新的随机口令,并更新AD中主机账号的相关属性。
LAPS提供了GUI和AdmPwd.PS脚本模块2种管理工具。安装完成LAPS后,需要使用AdmPwd.PS模块的Set-AdmPwdComputerSelfPermission命令,赋予某个OU或整个域内的主机具有设置自身属性的权限,图一所示,这是为了每个主机对象能自动存储口令明和口令过期时间。
图一 设置OU属性
在域服务器中,可通过GUI直接查看指定主机中本地管理员的口令明文,图二所示。有关LAPS的功能和使用介绍,请看参考文献[1]。
图二 LAPS UI方式查看口令明文及过期时间
0x02 服务器端的隐蔽后门
LAPS在域内的主机账号属性中增加了ms-Mcs-AdmPwd和ms-Mcs-AdmPwdExpirationTime两个属性。第1个属性存储本地管理员的口令明文,第2个属性存储口令的过期时间。这里也许有读者会疑问,为什么会储存明文口令,而不是某种密文形式的口令。
AdmPwd.PS模块的Find-AdmPwdExtendedRights命令,可检测域内哪些账号或组具备读取ms-Mcs-AdmPwd属性的权限。
在检测某个特定的域对象的AD权限时,有2个事情需要考虑:一是哪些域内主体可以赋予自身或其他域内主体这项AD权限;二是哪些已有的ACE包含了这项AD权限,这些ACE应用在哪些对象上。
在做第1个事情的检查时,Find-AdmPwdExtendedRights没有检测安全描述符的控制权。在第2个事情的检查中,该接口通过4个方面来决定结果:
- AD对象类型;
- ACE访问掩码;
- ACE对象类型;
- ACE继承的对象类型。
在AD对象类型检测时,Find-AdmPwdExtendedRights仅仅分析应用到OU或计算机的ACE,所有其他的容器对象都忽略,使用Set-AdmPwdComputerSelfPermission进行权限设置时的参数也是OU类型。攻击者可以在非OU容器对象上赋予自身读取ms-Mcs-AdmPwd属性的权限。系统默认的Computers(CN=Computers)就是一个非OU的Container容器,除域服务器之外的所有域内主机默认会被加入该容器。Find-AdmPwdExtendedRights不会分析该容器,所以攻击者如果在该容器上给自己添加权限(权限会通过继承方式到达主机对象),则工具不会检测出。
msImaging-PSPs类型容器不在检测分析范围,如果将计算机对象放至该类型的容器中,则可以规避被检测。图三是msImaging-PSPs类型的对象。
图三 msImaging-PSPs类型对象
如果赋予某个低权限用户关于该类型容器的完全权限,则可以控制容器中计算机的属性,包括ms-Mcs-AdmPwd属性。实验中,win7x86user是域内普通用户,NotOu为一个msImaging-PSPs类型容器,其中有一台机器win7x86cn,在NotOu上赋予了win7x86user对该容器的全部权限,容器中的对象win7x86cn继承了所有权限,见图四。但LAPS的Find-AdmPwdExtendedRights命令没有检测到,见图五。
图四 赋予win7x86user完全控制权
图五 Find-AdmPwdExtendedRights检测结果
上面的测试和实验表明,在安装有LAPS环境的域网络中,可以有效利用LAPS作为一个隐蔽的后门,赋予低权限用户随时读取高权限主机本地管理员口令明文的权限,从而快速获取高权限主机的控制权,进一步通过散列值获取等方式获取域控制权限。当然这一切的前提是已经获取了域控制权限。
0x03 客户端的隐蔽后门
LAPS在客户端仅仅部署了一个AdmPwd.dll文件,用于响应来自域服务器的密码更改策略,然后将口令明文以Kerberos加密方式存储至服务器中对应的主机账号的ms-Mcs-AdmPwd属性。LAPS起源于一个公开项目,通过对公开项目源码的分析,可以使用手动的方式模拟口令修改过程,图六是在客户端系统权限下修改口令并推送至服务器端的测试结果,2个红框表示连续2次修改口令,以进行前后对比。图七表示在服务器端查看连续2次修改口令后的结果,比对图六,结果正确。
图六 客户端系统权限下2次修改口令
图七 在服务器端使用LAPS UI查看2次修改口令后的结果
客户端在使用AdmPwd.dll文件时,Windows并没有对该文件进行完整性校验或者签名验证。因此一个被篡改过的DLL一样可以正常使用。所以如果攻击者根据公开源码编译一个功能类似的DLL,同时在DLL中添加部分功能,将修改后的口令明文写到指定位置。这可使攻击者随时都能获取口令明文,从而具备对客户端的完全控制权限。
根据LAPS的安装介绍说明,在客户端上安装有3种方式,一是客户端安装LAPS.x64.msi或LAPS.x86.msi;二是在客户端使用regsvr32.exe AdmPwd.dll安装。
如果以第二种方式在客户端安装LAPS,且AdmPwd.dll的目录为普通用户的可写目录,则普通用户可直接用伪造的DLL文件替换原来真实的DLL文件。可获取本地管理员的口令明文,获取本机的完全控制权,实现权限提升。
0x04 小结
LAPS是微软为了加强本地管理员的口令管理,提高网络安全性而部署的解决方案,但是方案中的一些瑕疵导致LAPS可以变成攻击者制作隐蔽后门的工具。不仅LAPS如此,许多其他软件亦是如此。随着产品的增多,安全性得到提升的同时,暴露给攻击者的攻击面同时也得到了扩大。安全之路任重道远。
发表评论
您还未登录,请先登录。
登录