关于NTLM的初步了解
今天看见一篇Nosferatu – Lsass NTLM 身份验证后门文章,学习一下,做个总结。
我最后也没去复现,目前的水平暂时还不能全部理解。
因此这篇文章将只是对里面我不懂的名词做一个了解与说明。
0x01 大致情况
DLL被注入到lsass进程中,并将开始挂钩身份验证WinAPI调用。目标函数是MsvpPasswordValidate(),位于NtlmShared.dll。为了不被检测到,被钩住的函数会调用原函数,并允许正常的身份验证流程。只有在看到身份验证失败后,挂钩才会将实际的NTLM哈希值与后门哈希值交换出来进行比较。
Nosferatu必须被编译为64位DLL,而且必须在具备SeDebugPrivilege权限的命令行下才能使用DLL注入器来注入,也可以使用MavInject来注入。
MavInject 808 /INJECTRUNNING Inject.dll
可以使用Procexp看到它的加载
使用Impacket的登录示例:
略
限制:在Active Directory环境中,通过RDP、runas或锁屏进行的身份验证不能与密码一起工作。但使用SMB、WinRM和WMI进行认证仍然是可以的。
在非ad环境中,身份验证适用于所有方式。
注意:本地简单复现了一下,发现只有当前编译的这台Win10可注入成功,其他Win10和Win08/12/16等均注入失败,就这样,自己去测试下吧。
0x02 NTLM认证原理
SAM:
安全帐户管理器,是Windows操作系统管理用户帐户的安全所使用的一种机制。用来存储 Windows 操作系统密码的数据库文件,为了避免明文密码泄漏SAM文件中保存的是明文密码在经过一系列算法处理过的Hash值被保存的Hash分为LMHash、NTLMHash。当用户进行身份认证时会将输入的Hash值与SAM文件中保存的Hash值进行对比。
SAM文件保存于 %SystemRoot%\system32\config\sam 中,在注册表中保存在 HKEY_ LOCAL_MACHINE\SAM\SAM,HKEY_ LOCAL _MACHINE\SECURITY\SAM 。在正常情况下SAM文件处于锁定状态不可直接访问、复制、移动,仅有system用户权限才可以读写该文件。
本地用户认证
Windows在进行本地登录认证时操作系统会使用用户输入的密码作为凭证去与系统中的密码进行对比验证。通过 winlogon.exe 接收用户输入传递至 lsass.exe 进行认证。
winlogon.exe用于在用户注销、重启、锁屏后显示登录界面。 Isass.exe 用于将明文密码变成NTLM Hash的形式与SAM数据库比较认证。
Windows本身不保存明文密码,只保留密码的Hash。
winlogon.exe -> 接收用户输入 -> lsass.exe -> (认证)
首先,用户注销、重启、锁屏后,操作系统会让winlogon显示登录界面,也就是输入框,winlogon接收输入后,将密码交给lsass进程,这个进程中会存一份明文密码,将明文密码加密成NTLM Hash,对SAM数据库比较认证。
NTLM Hash与NTLM
在Windows中,密码Hash目前称之为NTLM Hash,其中NTLM全称是:“NT LAN Manager”。
NTLM是一种网络认证协议,与NTLM Hash的关系就是:NTLM 网络认证协议是以 NTLM Hash 作为根本凭证进行认证的协议。也就是说,NTLM与NTLM Hash 相互对应。在本地认证的过程中,其实就是将用户输入的密码转换为 NTLM Hash 与 SAM 中的 NTLM Hash 进行比较。
NTLM Hash产生方式
1.先将用户的密码转化为十六进制格式。
2.将十六进制格式的密码进行 Unicode 编码。
3.使用 MD4 摘要算法对 Unicode 编码数据进行 Hash 计算。
假设我的密码是admin,那么操作系统会将admin转换为十六进制,经过Unicode转换后,再调用MD4加密算法加密,这个加密结果的十六进制就是NTLM Hash。
1 | 1 admin -> hex(16进制编码) = 61646d696e |
网络认证
在内网渗透中,经常遇到工作组环境,而工作组环境是一个逻辑 上的网络环境(工作区),隶属于工作组的机器之间无法互相建 立一个完美的信任机制,只能点对点,是比较落后的认证方式, 没有信托机构。
假设A主机与B主机属于同一个工作组环境,A想访问B主机上的资料,需要将一个存在于B主机上的账户凭证发送至B主机,经过认证才能够访问B主机上的资源。
这是我们接触比较多的SMB共享文件的案例,SMB的默认端口是445。
早期SMB协议在网络上传输明文口令。后来出现 LAN Manager Challenge/Response 验证机制,简称LM,它是如此简单以至很容易就被破解,现在又有了NTLM以及Kerberos。
NTLM是一种网络认证协议,它是基于挑战(Chalenge)/响应(Response)认证机制的一种认证模式。
这个协议只支持Windows。
NTLM的认证过程分为三步:type1(协商),type2(质询),type3(身份验证)
NTLM V2协议
NTLM v1与NTLM v2最显著的区别就是 Challenge 与加密算法不同,共同点就是加密的原料都是NTLM Hash。
不同:
Challage:NTLM v1的Challenge有8位,NTLM v2的Challenge为16位。
Net-NTLM Hash:NTLM v1的主要加密算法是DES,NTLM v2的主要加密算法是HMAC-MD5。
v2版本相较于v1安全性更高,在网络中应用较多。
0x03 SeDebugPrivilege权限
Windows的访问控制模型主要分为:Access Token、Login Session、安全描述符
Access Token
访问令牌是Windows操作系统用描述进程或者线程安全上下文的一个对象。主要有两种类型:授权令牌和模拟令牌。
授权令牌,也叫主令牌,是由windows内核创建并分配给进程的默认访问令牌,每一个进程有一个主令牌,它描述了与当前进程相关的用户帐户的安全上下文。用于交互式登录(如rdp登录访问)。
模拟令牌,所在进程的主令牌会自动附加到当前的线程上,作为线程的安全上下文。而线程可以运行在另一个非主令牌的访问令牌下执行,而这个令牌被称为模拟令牌。用于非交互式的会话(利用WMI进行远程访问)。
主令牌与进程相关,模拟令牌与模拟令牌的线程相关。
注:两种令牌会在系统重启或者关机后才会全部清除,不然将会一直在内存中存留。也就是说,如果机器不关机或者重启的话,就会存在散落的令牌。在系统注销后,具有授权令牌的用户会变为模拟令牌Ilmpersonation Token,但依然有效。默认情况下,当前用户只能看到当前用户自己和比自己权限低的所有访问令牌。
令牌中的特权是一个用户或租在本地计算机执行各种系统相关操作(比如关闭计算机、装载设备驱动程序、改变系统时间)的权限。