LAPS
0x01 前提
有一天在路上莫名奇妙捡到一个webshell,既然是爆Ju那就爆久一点,然后我就随手转存下lsass内存。
代码语言:javascript复制tasklist /svc | findstr "lsass.exe"rundll32.exe C:windowsSystem32comsvcs.dll, MiniDump pid lsass.dmp full
然后再随手导出一哈本地hash好了。
代码语言:javascript复制reg save hklmsam sam.hivreg save hklmsystem system.hiv
不错拿到了我们喜欢的p@ssw0rd
密码,好家伙这不是我自己电脑密码吗?难道这台机器的主人暗恋我?哪有这么巧合的事?!于是我随手一个smb爆破,wmi爆破,好家伙给我爆出来30台机器,这波不是发个大财?然后一想我自己的小域环境不也这样?这可不行,我自己一台一台改?我懒得搞被撸了算了,要不用组策略比如sysvol?这样搞那我还不如不管了。于是我发现了有个东西叫做LAPS
0x02 LAPS是什么
Microsoft 本地管理员密码解决方案 (LAPS为) Active Directory 中的每台计算机提供自动本地管理员帐户管理。安装在每台计算机上的客户端组件会生成一个随机密码,更新关联 AD 计算机帐户上的(新)LAPS密码属性,并在本地设置密码。LAPS配置通过组策略进行管理,该组策略提供密码复杂性、密码长度、密码更改的本地帐户名称、密码更改频率等值。
简单点来说,很多管理员都喜欢用一个密码,那么我一个pth到域控那ntds拿下了,所以LAPS就为每台机器的本地管理员用户设置不同的随机的密码来解决这个问题,LAPS会把每台计算机的本地管理员账户存储在Active Directory中,然后通过计算机相应的属性进行保护,计算机可以在 Active Directory 中更新自己的密码数据,并且域管理员可以向授权用户或组授予读取访问权限。
LAPS的工作是如何的?
LAPS其实可以理解为一条GPO,它会隔一段时间去执行一些操作:
•检查密码是否过期•当密码过期或者说过期前生成一个新的密码•通过密码策略来验证新密码•向Active Directory发送密码,并且把计算机的属性发送过去一起存储•向Active Directory说明密码下次到期的时间,将属性发送过去一起存储•更改管理员的密码
0x03 安装LAPS
[自己去下载吧] https://www.microsoft.com/en-us/download/details.aspx?id=46899,
这里[参考]https://www.opss.cn/1377.html。
Ir9UIg.png
Ir9cZT.png
导入LAPS PowerShell 模块,扩展AD架构增加LAPS扩展
代码语言:javascript复制Import-Module AdmPwd.PS #导入LAPS PowerShell 模块Update-AdmPwdADSchema #扩展AD架构增加LAPS扩展
Ir92oF.png
Ir9fJJ.png
Ir9osx.png
Ir9XJH.png
Ir9jWd.png
IrCCef.png
去掉这个
IrCiTS.png
创建一下OU,组和用户
IrCeln.png
把MSSQL添加到PWAdmin组
IrCMwT.png
然后创建一个计算机OU,把mssql添加进计算组这个OU,点击mssql然后右键移动到计算机即可。
查询“计算机”这个OU有哪些用户组有扩展权限,从下面可以看出一个system和域管理员组可以访问这个OU的扩展权限
代码语言:javascript复制Find-AdmPwdExtendedrights -identity 计算机 | Format-Table
IrC1kF.png
设置“计算机”这个OU上的电脑拥有扩展属性权限,ms-Mcs-AdmPwd – 以明文形式存储密码;ms-Mcs-AdmPwdExpirationTime – 存储重置密码的时间。设置计算机这个OU的电脑对上面两个扩展拥有读写权限
代码语言:javascript复制Set-AdmPwdComputerSelfPermission -OrgUnit 计算机
然后设置允许读取“计算机”这个OU上的管理员账号和密码的用户组。
代码语言:javascript复制Set-AdmPwdReadPasswordPermission -OrgUnit 计算机 -AllowedPrincipals PWAdmin #设置PWAdmin用户组可以读取“计算机”这个OU里面的本地管理员账号和密码
然后设置允许重置“计算机”这个OU上的管理员账号和密码的用户组
代码语言:javascript复制Set-AdmPwdResetPasswordPermission -OrgUnit 计算机 -AllowedPrincipals PWAdmin #设置PWAdmin用户组可以重置“计算机”这个OU里面的本地管理员账号和密码
然后配置GPO,让客户端通过GPO来更新本地管理员密码
创建LAPS的GPO然后把计算机链接到这个GPO
IrCJp9.png
IrCYlR.png
然后编辑
IrCt61.png
然后就是给客户端安装了,只需要第一个
IrCam6.png
IrCDte.png
然后重启该机器。再验证LAPS
PowerShell查看本地管理员密码,为本地计算机名称
代码语言:javascript复制Get-AdmPwdPassword -ComputerName <computername>
IrCypd.png
IrCc6I.png
那既然这样子了,我每台机器密码都不一样了,你总pth不动了把,而且我更新密码的时候流量也是加密的。但是这个明文存储挺让我难受的。
0x04 检查是否安装了LAPS
检查DLL是否存在
代码语言:javascript复制Get-ChildItem 'c:program filesLAPSCSEAdmpwd.dll'
检查DLL的数字签名
代码语言:javascript复制Get-AuthenticodeSignature 'c:program filesLAPSCSEAdmpwd.dll'
也可以检查CN=ms-Mcs-AdmPwd,CN=Schema,CN=Configuration,DC=redteam,DC=local
是否存在CN=ms-Mcs-AdmPwd
IrCgXt.png
0x05 获取LAPS值
IrCRnP.png
IrCOBV.png
IrPAHK.png