关于抓取明文密码的探究

基础知识

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接口。

在微软官方中对于Security Support Provider的解释如下所示

SSP

我们知道lsass.exewinlogin.exe进程是用来管理登录的两个进程,都包含在LSA(Local Security Authority)里面,它主要是负责运行windows系统安全策略。SSP在windows启动之后,会被加载到lsass.exe进程中,那么就衍生出了两种思路:

第一种思路就是删除一个任意的SSP DLL以便于与lsass进程进行交互,第二种思路则是直接伪造一个SSP的dll来提取用户登录时的明文密码

我们首先尝试对注册表进行修改,这里对应需要修改的注册表为HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\Security Packages,在mimikatz里面根据不同的系统位数提供了对应的dll,这里我们直接修改注册表里面的值即可

首先我们尝试一下任意位置直接加载dll,写一个修改注册表的代码,主要是使用RegOpenKeyWRegSetValueExW这两个api来实现

 

这里我把mimilib.dll放到C盘根目录下

注意一下这里需要用管理员权限启动否则会添加失败

可以看到这里我们已经修改成功

这里新建一个test用户来进行测试

当用户再次通过系统进行身份验证时,将创建一个名为 kiwissp 的新文件,该文件将记录帐户的凭据。默认情况下在以下路径

但是这里没有成功,可能是路径的问题

这里把mimilib.dll放到C:\Windows\System32文件目录下

修改注册表为mimilib.dll

在重新登录用户之后,就能够在System32目录下找到kiwissp.txt的明文文件

因为是登录就加载,所以如果想要删除只能清除注册表之后进行删除

另外mimikatz提供了一种更方便的方法,直接使用misc::memssp命令来直接注入,但是有一个缺点就是在重新启动之后不会持续存在

当用户再次通过系统进行身份验证时,会在C:\Windows\System32\mimilsa.log里面记录下明文密码

Hook PasswordChangeNotify

在上面的两种方法里面,都有或多或少的优缺点,在第一种方法中需要放置dll到system32目录下且需要修改注册表,但重启之后仍然有效,第二种方法虽然不需要直接修改注册表和放置dll,但是重启之后就会失效,而且使用mimikatz也需要考虑对抗杀软的问题。在这里有一种更方便且更隐蔽的方法就是hook PasswordChangeNotify这个api。

在修改密码时,用户输入新密码后,LSA 会调用 PasswordFileter 来检查该密码是否符合复杂性要求,如果密码符合要求,LSA 会调用 PasswordChangeNotify,在系统中同步密码。这个过程中会有明文形式的密码经行传参,只需要改变PasswordChangeNotify的执行流,获取到传入的参数,也就能够获取到明文密码。

还需要了解的相关背景知识如下:

  1. 函数PasswordChangeNotify存在于rassfm.dll

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

我们知道了在LSA调用PasswordChangeNotify的过程中密码是以明文的形式传输的,这里我们就可以通过Inline Hook的方式使用jmp跳转到我们自己的处理函数中,读取密码之后再还原到原地址继续传参。

这里已经有前辈写好了Inline Hook的代码:https://github.com/clymb3r/Misc-Windows-Hacking/blob/master/HookPasswordChange/HookPasswordChange/HookPasswordChange.cpp

我们简单的分析一下写的代码,首先创建一个vector容器,修改硬编码指向PasswordChangeNotifyHook函数的地址

首先保留rbx、rbp、rsi三个寄存器的值到堆栈里面,然后将字节码写入内存并还原被覆盖的指令,再跳转回原函数

然后再看下读取密码的这个函数,如果获取到密码,则在C:\windows\temp目录下创建一个passwords.txt来储存密码

这里使用session0注入来将dll注入lsass.exe,使用到ZwCreateThread这个内核函数,因为用一般的注入方式是不能够往系统进程中注入dll的。这里可以看到已经将我们的这个dll注入了lsass.exe进程

这里去更改一下密码

这里进行Inline hook之后应该是会把在传输中的明文密码保存到password.txt文件里面的,但是这里在目录下却没有找到,删除dll的时候也显示已经被打开,即已经注入到了进程空间里面,这里去搜索引擎里面看了一下,师傅们基本上都是使用的ps反射加载的方法来把dll注入到进程空间里面,而使用直接加载dll的师傅都没有成功抓取密码,这里研究半天也没搞出个所以然来,还是才疏学浅了。

那么这里我们再使用反射加载的方式进行尝试,利用Powershell tricks中的Process Injection将dll注入到lsass进程,项目地址如下

https://github.com/clymb3r/PowerShell/blob/master/Invoke-ReflectivePEInjection/Invoke-ReflectivePEInjection.ps1

这里首先更改powershell的执行策略为可加载脚本,再执行命令

1、Set-ExecutionPolicy bypass

2、Import-Module .\Invoke-ReflectivePEInjection.ps1

3、Invoke-ReflectivePEInjection -PEPath HookPasswordChange.dll -procname lsass     

修改密码过后即可在目录下看到抓取的明文密码

  • 30
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值