在了解内网渗透前,是很有必要去学习这些的。
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 |
暂未看透。待更新。