在了解内网渗透前,是很有必要去学习这些的。
Window密码存储地址

1 | %SystemRoot%\system32\config\sam |
Window密码存储过程
- 用户输入密码
- 程序将密码进行
NTLM算法加密为HASH值存储在SAM文件,并保存在本地SAM数据库
可以看看NTLM HASH值是怎么样的

1 | fuck NTLM加密后 8592e1331718673b0ee32df3c0153456 |
NTLM HASH的前者是LM HASH,简单来说就是LM算法比NTLM算法垃圾,然后被淘汰,所以比较新的操作系统的密码不容易被读取出来,而03、xp系统就是使用LM HASH所以我们可以直接内网渗透的时候读取到原文密码而不用去跑HASH。
Window登录过程
当我们登录window系统的时候,系统会读取SAM文件中的密码与我们输入的密码进行验证,如果正确则成功登录。在SAM文件中,我们的密码是NTLM HASH加密的,这样子在一定的情况下保障了密码的安全。
更详细的就是
用户开机输入密码 -> 系统会调用winlogon.exe接受用户输入的密码 -> 在lsass.exe进程将明文密码转换成NTLM HASH然后读取SAM数据库与用户名,如果正确将User SID和Group SID传到winlogon.exe准备登录,如果失败则提示密码错误
LSASS用于本地安全和登录策略
Window网络认证
工作组概念(需要了解):
工作组(Work Group)是最常见最简单最普通的资源管理模式,就是将不同的电脑按功能分别列入不同的组中,以方便管理。比如在一个网络内,可能有成百上千台工作电脑,如果这些电脑不进行分组,都列在“网上邻居”内,可想而知会有多么乱(恐怕网络邻居也会显示“下一页”吧)。为了解决这一问题,Windows 9x/NT/2000 才引用了“工作组”这个概念,比如一所高校,会分为诸如数学系、中文系之类的,然后数学系的电脑全都列入数学系的工作组中,中文系的电脑全部都列入到中文系的工作组中……如果你要访问某个系别的资源,就在“网上邻居”里找到那个系的工作组名,双击就可以看到那个系别的电脑了。
假设A主机与B主机同在一个工作组,A想登录B,那么A需要知道B的账号密码,且B需要开启SMB服务(PORT:445)。
SMB服务主要用于文件共享
NTLM协议
早期
SMB协议在网络上是明文传输的,后来出现了LM验证机制,但是他很简单所以可以被破解为明文,所以又推出了NTLM
NTLM是一种网络认证协议,它基于挑战(Chalenge)和响应(Response)机制的协议,只支持Window系统
挑战(Chalenge)和响应(Response)
NTLM认证分三步:协商、质询、验证
协商:用于确认双方协议版本(用于兼容各版本)
质询:客户端向服务端发送用户信息请求,服务端接受请求生成一个16位随机数(Challenge),使用用户名对应的NTLM HASH加密Challenge然后生成为Challenge1,然后发送给客户端,客户端接收到Challenge后将要登录的账户对应的NTLM HASH加密Challenge生成Respone并发送给服务端,服务端接受到客户端的Respone后,对比Challenge和Challenge是否相同,如果相同就认证成功
1 | Challen1 = NTLM HASH(Challenge) = Net NTLM Hash |
验证:质询完成后验证结果
NTLM v2协议
NTLM v1生成的随机数是8位、NTLM v2的有16位。
v1的加密算法是DES、v2的算法是HMAC-MD5
Pass The Hash(哈希传递)
在内网横向渗透中,攻击人员经常会抓取管理员的密码和NTLM HASH来进行横向渗透
哈希传递指不需要账户明文密码的情况下完成认证,使攻击人员在渗透中获取不到明文也可以进行登录。
哈希传递的要求
1、需要能访问目标服务器
2、需要传递被认证的用户名
3、需要传递被认证用户的NTLM HASH
相当于
web端的xss获取到的cookie,而不需要账户密码进行认证。
哈希传递原理
将用户名对应的NTLM HASH加密服务器给出的Chanllenge,生成一个Response给服务器来完成认证。
Kerberos域认证
活动目录(Active Directory)概念
Active Directory存储了有关网络对象的信息,让管理员和用户可以查找和使用执行信息
网络对象:存储用户、用户组、计算机、域、组织单位以及安全策略…
在一个机器上装上活动目录后,这个机器就是一个域控服务器
Kerberos认证协议
和NTLM一样都是认证协议,当他比NTLM安全
Kerberos的设计目标是通过密钥系统为客户机 / 服务器应用程序提供强大的认证服务。该认证过程的实现不依赖于主机操作系统的认证,无需基于主机地址的信任,不要求网络上所有主机的物理安全,并假定网络上传送的数据包可以被任意地读取、修改和插入数据。在以上情况下, Kerberos 作为一种可信任的第三方认证服务,是通过传统的密码技术(如:共享密钥)执行认证服务的。
简要大概地说一下Kerberos是如何工作的:
- 假设你要在一台电脑上访问另一个服务器(你可以发送
telnet或类似的登录请求)。你知道服务器要接受你的请求必须要有一张Kerberos的“入场券”。 - 要得到这张入场券,你首先要向验证服务器(
AS)请求验证。验证服务器会创建基于你的密码(从你的用户名而来)的一个“会话密钥”(就是一个加密密钥),并产生一个代表请求的服务的随机值。这个会话密钥就是“允许入场的入场券”。 - 然后,你把这张允许入场的入场券发到授权服务器(
TGS)。TGS物理上可以和验证服务器是同一个服务器,只不过它现在执行的是另一个服务。TGS返回一张可以发送给请求服务的服务器的票据。 - 服务器或者拒绝这张票据,或者接受这张票据并执行服务。
- 因为你从
TGS收到的这张票据是打上时间戳的,所以它允许你在某个特定时期内(一般是八小时)不用再验证就可以使用同一张票来发出附加的请求。使这张票拥有一个有限的有效期使其以后不太可能被其他人使用。
或者如下的理解:
- 客户机将明文密码、时间戳(使用
krbtgt密码hash作为密钥)进行NTLM哈希加密,发送给kdc(域控),kdc对用户进行检测,成功之后创建TGT(Ticket-Granting Ticket) - 将
TGT进行加密签名返回给客户机器,只有域用户krbtgt才能读取kerberos中TGT数据 - 然后客户机将
TGT发送给域控制器KDC请求TGS(票证授权服务)票证,并且对TGT进行检测 - 检测成功之后,将目标服务账户的
NTLM以及TGT进行加密,将加密后的结果返回给客户机。
白银票据(Silver Tickets)
特点:
不需要与KDC交互
需要目标服务器的NTLM HASH(有目标服务器的权限,但是不知道明文密码,就可以用NTLM HASH跳过服务器认证完成认证)
Server Session Key在未发送Ticket之前,服务器是不知道Server Session Key是什么的。 所以,一切凭据都来源于Server Hash
伪造白银票据
这里使用的是mimikatz.exe
1 | kerberos::list #列出票据 |
2 | kerberos::purge #清除票据 |
导出Server Hash
1 | mimikatz.exe "privilege::debug" "sekurlsa::logonpasswords" "exit" > pj.txt |
伪造票据
1 | mimikatz "kerberos::golden /domain:<域名> /sid:<域 SID> /target:<目标服务器主机名> /service:<服务类型> /rc4:<NTLM Hash> /user:<用户名> /ptt" exit |
白银票据防御
- 保证服务器
HASH不被获取 - 开启
PAC(特权属性证书保护,规定服务器必须将票据发送给kerberos服务并验证票据是否有效)1开启方法:2将注册表中HKEY_LOCAL_MACHINE\SYSTEM \ CurrentControlSet\Control\Lsa\Kerberos\Parameters的ValidateKdcPacSignature设置为1
黄金票据(Golden Tickets)
特点:
- 需要与
DC通信- 需要
krbtgt用户的HASH
1 | krbtgt HASH = KDC HASH |
暂未看透。待更新。