Windows认证


Windows 认证

Windows 本地认证

本地认证基础

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

这个SAM文件中保留了计算机本地所有用户的凭证信息,可以理解为是一个数据库。

NTLM(NT LAN Manager) Hash

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

NTLM Hash——产生

admin => 209c6174da490caeb422f3fa5a7ae634

  1. admin -> hex(16进制编码) = 61646d69e
  2. 61646d69e -> unicode = 610064006d0069006e00
  3. 610064006d0069006e00 -> MD4 = 209c6174da490caeb422f3fa5a7ae634

本地认证流程

  • Windows Logon Process(即winlogon.exe是Windows NT用户登陆程序,用于管理用户登录和退出。
  • LSASS是微软Windows系统的安全机制。用于本地安全和登陆策略。

LM Hash

  • 将所有小写字母转换为大写字母
  • 123ABC //未达到7个字符
  • 将密码转化为16进,分两组,填充为14个字符,空余位使用0x00字符填补
  • 31323341424300000000000000将密码分割为两组7个字节的块
  • 31323341424300 000000000000 //16进制
  • 将每组转化为比特流,不足56Bit则在左边加0
  • 31323341424300 -> (转换为二进制)
    • 11000100110010001100110100001010000100100001100000000->(补足56Bit)
    • 00110001001100100011001101000001010000100100001100000000
  • 将比特流按照7比特一组,分出8组,末尾加0

由于后者都为0,结果可想而知,那就都是0;

  • 将每组比特流转换为16进制作为被加密的值,使用DES加密,字符串 “KGS!@#$%”为Key(0x4B47532140232425),得到8个结果 ,每个 结果转换为16进制。
  • -> 00110000100110001000110001101000000101000001001000001100 00000000
  • ->30988C6814120C00 -> DES(30988C6814120C00) -> 48-D7-EB-91- 2F-5E-69-7C
  • 由于我们的密码不超过7字节,所以后面的一半是固定的:
  • AA-D3-B4-35-B5-14-04-EE
  • 连接两个DES加密字符串。这是LM哈希。
  • 48-D7-EB-91-2F-5E-69-7C-AA-D3-B4-35-B5-14-04-EE

Windows网络认证

在内网渗透中,经常遇到工作组环境,而工作组环境是一个逻辑上的网络环境(工作区),隶属于工作组的机器之间无法互相建立一个完美的信任机制,只能点对点,是比较落后的认证方式,没有信托机构。

假设A主机与B主机属于同一个工作组环境,A想访问B主机上的资料,需要将一个存在于B主机上的账户凭证发送至B主机,经过认证才能够访问B主机上的资源。

这是我们接触比较多的SMB共享文件的案例,SMB的默认端口是445。

早期SMB协议在网络上传输明文口令。后来出现 LAN Manager Challenge/Response 验证机制,简称LM,它是如此简单以至很容易就被破解,现在又有了NTLM v2 以及Kerberos。

Challenge/Response

第一步:协商

  • 客户端主要在这一步向服务器确认协议的版本,是v1还是v2。不止者一点点

第二步:质询完整过程:

  1. 客户端向服务器端发送用户信息(用户名)请求
  2. 服务器接受到请求,生成一个16位的随机数,被称之为“Challenge”, 使用登录用户名对应的NTLM Hash加密Challenge(16位随机字符),生成Challenge1。同时,生成Challenge1后,将Challenge(16位随机字符)发送给客户端。//Net NTLM Hash = NTLM Hash(Challenge)
  3. 客户端接受到Challenge后,使用将要登录到账户对应的NTLM Hash加密Challenge生成Response,然后将Response发送至服务器端。

第三步:验证

  • 服务器端收到客户端的Response后,比对Chanllenge1与Response是否相等,若相等,则认证通过。

使用另外一种方式解读:

  1. Server接收到Client发送的用户名后,判断本地账户列表是否有用户名share_user,
    • 如果没有,返回认证失败;
    • 如果有,生成Chanllenge,并且从本地查找share_user对 应的NTLM Hash,使用NTLM Hash加密Chanllenge,生成一 个Net-NTLM Hash存在内存中,并将Chanllenge发送给Client。
  2. Client接收到Chanllenge后,将自己提供的share_user的密码转换为NTLM Hash,使用NTLM Hash加密Chanllenge,这个结果叫Response,表现形式是Net-NTLM Hash,最后将Response发送给Server。
  3. Server接收到Client发送的Response,将Response与之前的Net-NTLM Hash进行比较,如果相等,则认证通过。

注意:

  1. Chanllenge是Server产生的一个16字节的随机数,每次认证都不同
  2. Response的表现形式是Net-NTLM Hash,它是由客户端提供的密码Hash加密Server返回的Chanllenge产生的结果。

NTLM v2

NTLM v1与NTLM v2最显著的区别就是Challenge与加密算法不同,共同点就是加密的原料都是NTLM Hash。

下面细说一下有什么不同:
Challage:NTLM v1的Challenge有8位,NTLM v2的Challenge为16
Net-NTLM Hash:NTLM v1的主要加密算法是DES,NTLM v2的主要加密算法是HMAC-MD5
//Responder、smbexec

Pass The Hash

在内网渗透中,我们经常会需要抓取管理员的密码、NTLM Hash,通过搜集这些信息有助于我们扩大战果,尤其是在域环境下

  • 什么是哈希传递?
    哈希传递是能够在不需要账户明文密码的情况下完成认证的一个技术。

  • 哈希传递的作用?
    解决了我们渗透中获取不到明文密码、破解不了NTLM Hash而又想扩大战果的问题。

必要条件

  • 哈希传递需要被认证的主机能够访问到服务器(废话)
  • 哈希传递需要被传递认证的用户名
  • 哈希传递需要被传递认证用户的NTLM Hash

原理分析

要完成一个NTLM认证,第一步需要客户端将自己要参与认证的 用户名发送至服务器端,等待服务器端给出的Challenge⋯⋯
屏幕快照 2019-07-07 上午11.18.54
其实哈希传递就是使用用户名对应的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

Kerberos域认证

Active Directory(活动目录)的概念

Windows提供了为企业管理资产、服务、网络对象进行组织化的管理,这非常符合企业架构的管理模式。而承载这些管理机制的就是活动目录服务。如果要搭建一个域,就需要安装活动目录服务。

活动目录服务以域名来划分域的边界,域外就不属于管理范围了,也就是说,一个域对应一个域名,域之间也可以相互信任。

Active Directory存储了有关网络对象的信息,并且让管理员和用户能够轻松地查找和使用这些信息。Active Directory使用了一种 结构化的数据存储方式,并以此作为基础对目录信息进行合乎逻辑的分层组织

网络对象分为:用户、用户组、计算机、域、组织单位以及安全策略等。

Active Directory(活动目录)的概念

  • 服务器及客户端计算机管理:管理服务器及客户端计算机账户, 所有服务器及客户端计算机加入域管理并实施组策略。
  • 用户服务:管理用户域账户、用户信息、企业通讯录(与电子邮件系统集成)、用户组管理、用户身份认证、用户授权管理等,按省实施组管理策略。
  • 资源管理:管理打印机、文件共享服务等网络资源。
  • 桌面配置:系统管理员可以集中的配置各种桌面配置策略,如: 用户使用域中资源权限限制、界面功能的限制、应用程序执行特征限制、网络连接限制、安全配置限制等。
  • 应用系统支撑:支持财务、人事、电子邮件、企业信息门户、办公自动化、补丁管理、防病毒系统等各种应用系统。

在域中,网络对象可以相互访问,但是在真实情况中,需要对某些部门的计算机进行限制,例如:销售部门不能访问技术部门的服务器。

这个中间就需要Kerberos认证协议来验证网络对象间的权限。

域认证体系 - Kerberoes

Kerberos 是一种网络认证协议,其设计目标是通过密钥系统为客户机/服务器应用程序提供强大的认证服务。该认证过程的实现不依赖于主机操作系统的认证,无需基于主机地址的信任,不要求网络上所有主机的物理安全,并假定网络上传送的数据包可以被任意地读取、修改和插入数据。在以上情况下,Kerberos作为一种可信任的第三方认证服务,是通过传统的密码技术(如:共享密钥)执行认证服务的。

域认证所参与的角色

Kerberos的标志是三只狗头,狗头分别代表以下角色:

  • Client
  • Server
  • KDC(Key Distribution Center) = DC(Domain Controller)

域认证所参与的角色

  • AD(Account database):存储所有client的白名单,只有存在于白名单的client才能顺利申请到TGT
  • Authentication Service:为client生成TGT的服务
  • Ticket Granting Service:为client生成某个服务的ticket


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

域认证粗略流程

  1. client向kerberos服务请求,希望获取访问server的权限。 kerberos得到了这个消息,首先得判断client是否是可信赖的,也就是白名单黑名单的说法。这就是AS服务完成的工作,通过在AD中存储黑名单和白名单来区分client。成功后,返回AS返回TGT给client。
  2. client得到了TGT后,继续向kerberos请求,希望获取访问server的权限。kerberos又得到了这个消息,这时候通过client消息中的TGT,判断出了client拥有了这个权限,给了client访问server的权限ticket。
  3. client得到ticket后,终于可以成功访问server。这个ticket只是针对这个server,其他server需要向TGS申请。

第一步 Session Key 与 Ticket Granting Ticket

第二步 Session Key 与 Ticket Granting Ticket

第三步 Server Session Key 与 Ticket

白银票据

白银票据的特点:

  1. 不需要与KDC进行交互
  2. 需要目标服务的NTLM Hash

在第三步认证中的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:

  • kerberos::list #列出票据
  • kerberos::purge # 清除票据

由于白银票据需要目标服务器的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

白银票据(Silver Tickets)防御

  1. 尽量保证服务器凭证不被窃取
  2. 开启PAC (Privileged Attribute Certificate) 特权属性证书保护 功能,PAC主要是规定服务器将票据发送给kerberos服务,由kerberos服务验证票据是否有效。
    开启方式:
    将注册表中HKEY_LOCAL_MACHINE\SYSTEM \ CurrentControlSet\Control\Lsa\Kerberos\Parameters中的ValidateKdcPacSignature设置为1

黄金票据(Golden Tickets)

黄金票据特点:

  1. 需要与DC通信
  2. 需要krbtgt用户的hash
    PS:这里的krbtgt hash就是之前讲的KDC Hash

注意:这里的krbtgt hash就是之前讲的KDC Hash

黄金票据(Golden Tickets)-MSF kiwi

使用meterpreter中的kiwi模块: load kiwi


黄金票据(Golden Tickets) - 伪造

伪造票据:

mimikatz “kerberos::golden /domain:<域名> /sid:<域SID> /rc4:<KRBTGT NTLM Hash> /user:<任意用户名> /ptt" exit

Tickets 总结

  • 黄金票据:从攻击面来看,获取krbtgt用户的hash后,可以在域中 进行持久性的隐藏,并且日志无法溯源,但是需要拿到DC权限, 使用黄金票据能够在一个域环境中长时间控制整个域。
  • 从防御角度来看,需要经常更新krbtgt的密码,才能够使得原有的 票据失效。最根本的办法是不允许域管账户登录其他服务器。
  • 白银票据:从攻击面来看,伪造白银票据的难度比伪造黄金票据的 难度较小,因为一个域中的服务器如果对外的话,非常容易被入侵, 并且容易被转储Server。
  • 从防御角度来看,需要开启PAC认证,但这会降低认证效率,增加 DC的负担,最根本的还是要加固服务器本身对外的服务。

Windows Access Token

Windows Access Token简介

Windows Token其实叫Access Token(访问令牌),它是一个描述进程或者线程安全上下文的一个对象。不同的用户登录计算机后,都会生成一个Access Token,这个Token在用户创建进程或者线程 时会被使用,不断的拷贝,这也就解释了A用户创建一个进程而该进程没有B用户的权限。

Access Token种类:

  • 主令牌
  • 模拟令牌

一般情况下,用户双击运行一个程序,都会拷贝“explorer.exe”的Access Token。
当用户注销后,系统将会使主令牌切换为模拟令牌,不会将令牌清除,只有在重启机器后才会清除。

Access Token的组成

  • 用户帐户的安全标识符(SID)
  • 用户所属的组的SID
  • 用于标识当前登录会话的登录SID
  • 用户或用户组所拥有的权限列表
  • 所有者SID
  • 主要组的SID
  • 访问控制列表
  • 访问令牌的来源
  • 令牌是主要令牌还是模拟令牌
  • 限制SID的可选列表
  • 目前的模拟等级
  • 其他统计数据

Windows Access Token – SID (Security Identifiers)安全标识符

安全标识符是一个唯一的字符串,它可以代表一个账户、一个用户 组、或者是一次登录。通常它还有一个SID固定列表,例如 Everyone这种已经内置的账户,默认拥有固定的SID。

SID的表现形式:

  • 域SID-用户ID
  • 计算机SID-用户ID
  • SID列表都会存储在域控的AD或者计算机本地账户数据库中。

Windows Access Token产生过程

每个进程创建时都会根据登录会话权限由LSA(Local Security Authority)分配一个Token(如果CreaetProcess时自己指定了 Token, LSA会用该Token, 否则就用父进程Token的一份拷贝。

Windows Access Token令牌假冒实战

当用户注销后,系统将会使主令牌切换为模拟令牌,不会将令牌清除,只有在重启机器后才会清除。
可以使用多种工具查看目前系统上存在的模拟令牌:

  • Incognito
  • Powershell - Invoke-TokenManipulation.ps1
  • Cobalt Strike - steal_token

案例(针对某跨国企业的一次渗透测试 获取DC权限):
http://blog.360ec.net/archives/32/

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

Windows Access Token令牌假冒防御

禁止Domain Admins登录对外且未做安全加固的服务器,因为一旦服务器被入侵,域管理员的令牌可能会被攻击者假冒,从控制DC。

如果想清除假冒,重启服务器即可。


文章作者: Geekby
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Geekby !
 上一篇
Redis基于主从复制的RCE利用方式 Redis基于主从复制的RCE利用方式
Redis基于主从复制的RCE利用方式在2019年7月7日结束的WCTF2019 Final上,LC/BC的成员Pavel Toporkov在分享会上介绍了一种关于redis新版本的RCE利用方式,比起以前的利用方式来说,这种利用方式更为通
2019-07-15
下一篇 
HTB 靶机 Netmon-Windows WP HTB 靶机 Netmon-Windows WP
Netmon-Windowshttps://www.hackthebox.eu/home/machines/profile/177IP: 10.10.10.152 nmap 扫描Starting Nmap 7.70 ( https://n
2019-06-10
  目录