内网渗透-windows认证

前言:全国HW刚结束,加强一波内网概念,去年11月红队成绩并不理想,这次必拿下好成绩。

0x00 本地认证

本地认证基础知识

在本地登录Windows的情况下,操作系统会使用用户输入的密码作为凭证去与系统中的密码进行验证,但是操作系统中的密码存储在哪里呢?
%SystemRoot%system32configsam

当我们登录系统的时候,系统会自动地读取SAM文件中的“密码”与我们输入的“密码”进行比对,如果相同,证明认证成功!
这个SAM文件中保留了计算机本地所有用户的凭证信息,可以理解为是一个数据库。
上面认证的过程只是粗略的说法,整个认证过程并没有那么简单,从操作系统的角度来看,还是需要铺垫很多概念的。

Windows本身不保存明文密码,只保留密码的Hash。
Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入(又叫做预映射pre-image)通过散列算法变换成固定长度的输出,该输出就是散列值。
这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来确定唯一的输入值。简单的说
就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。为了保证存储的不是明文,从而采用Hash,但是密码Hash也需要特定的生成算法以及表现形式。

NTLM Hash与NTLM

在Windows中,密码Hash目前称之为NTLM Hash,其中NTLM全称是:“NT LAN Manager”。
这个NTLM是一种网络认证协议,与NTLM Hash的关系就是:* NTLM网络认证协议是以NTLM Hash作为根本凭证进行认证的协议。
也就是说,NTLM与NTLM Hash相互对应。
在本地认证的过程中,其实就是将用户输入的密码转换为NTLM Hash与SAM中的NTLM Hash进行比较。

NTLM Hash的产生

假设我的密码是admin,那么操作系统会将admin转换为十六进制,经过Unicode转换后,再调用MD4加密算法加密,这个加密结果的十六进制就是NTLM Hash。

admin -> hex(16进制编码) = 61646d696e
61646d696e -> Unicode = 610064006d0069006e00
610064006d0069006e00 -> MD4 = 209c6174da490caeb422f3fa5a7ae634

本地认证流程

winlogon.exe -> 接收用户输入 -> lsass.exe -> (认证)
首先,用户注销、重启、锁屏后,操作系统会让winlogon显示登录界面,也就是输入框,接收输入后,将密码交给lsass进程,这个进程中会存一份明文密码,将明文密码加密成NTLM Hash,对SAM数据库比较认证。
○ Windows Logon Process(即 winlogon.exe),是Windows NT 用户登 陆程序,用于管理用户登录和退出。
○ LSASS用于微软Windows系统的安全机 制。它用于本地安全和登陆策略。

LM Hash

在NTLM协议问世之前,它对前身就是LM(LAN Manager)协议。
LM与NTLM协议的认证机制相同,但是加密算法不同。
目前大多数的Windows都采用NTLM协议认证,LM协议已经基本淘汰了。

0x01 网络认证
NTLM 协议
Chalenge/Response

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。

需掌握NTLM、NTLM Hash、LM、LM Hash、Net NTLM Hash的概念
NTLM是一种网络认证协议,是以HTLM Hash作为根本凭据进行认证的协议。
NTLM Hash:先hex(16)进制,而后unicode转换,再MD4加密算法加密。
与之对应,LM和LM Hash关系一样,只不过LM被遗弃
而在HTLM 协议中,经过NTLM Hash加密(16位随机值)的结果称为Net NTLM Hash

Pass The Hash
·哈希传递
哈希传递是能够在不需要账户密码的情况下完成认证的一个技术
·哈希传递的作用
解决了获取不了明文密码,拿到NTLM Hash无法破解,而又想扩大战果

需注意,server每次生成的challenge都会变化
pass the hash的工具:
·smbmap
·CrackMapEXEC
·Smbexec
·Metasploit

0x02 Kerberos域认证

Active Directory(活动目录)概念

Windows提供了为企业管理资产、服务、网络对象进行组织化的管理,这非常符合企业架构的管理模式。而承载这些管理机制的就是活动目录服务。如果要搭建一个域,就需要安装活动目录服务,当然,这个不在我们的讨论范围。
活动目录服务以域名来划分域的边界,域外就不属于管理范围了,也就是说,一个域对应一个域名,域之间也可以相互信任。
• Active Directory存储了有关网络对象的信息,并且让管理员和用 户能够轻松地查找和使用这些信息。Active Directory使用了一种 结构化的数据存储方式,并以此作为基础对目录信息进行合乎逻 辑的分层组织。
• 网络对象分为:用户、用户组、计算机、域、组织单位以及安全 策略等。

Active Directory(活动目录)功能

• 软件集中管理,统一推送软件,统一安装网络打印机等。利用软件发布策略分发软件,可以让用户自由选择安装软件。
• 帐号集中管理,所有帐号均存在服务器上,方便对帐号的重命令/重置密码。
• 环境集中管理,利用AD可以统一客户端桌面,IE,TCP/IP等设置。
• 增强安全性,统一部署杀毒软件和扫毒任务,集中化管理用户的计算机权限、统一制订用户密码策略等,可监控网络,资料统一管理。
• 更可靠,更少的宕机时间。如:利用AD控制用户访问权限,利用群集、负载均衡等技术对文件服务器进行容灾设定,更可靠,宕机时间更少。
• 活动目录为Microsoft统一管理的基础平台,其它isa,exchange,sms等服务都依赖于这个基础平台。

域中,网络对象可以互相访问,真实情况下,需要对某些进行限制,这个中间就需要kerberos认证协议来验证网络对象的权限

域认证体系 - Kerbroes

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

域认证所参与的角色 (三只狗头)

kerberos标志是三只狗头,代表:
·Client
·Sever
·KDC(Key Distribution Center)= DC(Domain Controller)
Kerberos认证协议的基础概念:
票据(Ticket):是网络对象互相访问的凭证。TGT(Ticket Granting Ticket):入场券,通过入场券能够获得票据,是一种临时凭证的存在。(类似于cookie)
KDC负责管理票据,认证票据,分发票据,但是KDC不是一个独立的服务,它由以下服务组成:
·Authentication Service:为client生成TGT的服务
·Ticket Granting Service:为Client生成某个服务的ticket
另外还需要介绍一个类似于本机SAM的一个数据库:AD,全称为account database,存储所有client的白名单,只有存在于白名单的client才能顺利申请到TGT。
物理层看,AD和KDC均为域控制器

域认证粗略流程

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.clinet得到ticket后,终于可以成功访问server。这个ticket只是针对这个server,其他server需要向TGS申请

域认证

首先,客户端需要发送自己的身份信息到KDC,身份信息中包含用户名,KDC根据用户名在AD中寻找是否在白名单中,然后根据用户名提取到对应的NTLM Hash
KDC此时生成一个随机字符串,叫session key,使用用户名对应的NTLM Hash加密session Key,叫做AS数据,使用KDC中某个用户的NTLM Hash加密session key和客户端的信息,生成TGT
·Session Key用于客户端向TGS服务通信
·域内所有网络对象的凭证都在AD中保存
·KDC中某个用户指的是Krbtgt
数据结构:

TGT的到期时间为8个小时,如果超过了8小时,还需要重新申请TGT,不能之间进入下一步获取Ticket
Kerberos是一个假设网络环境不安全的情况下能够正常进行认证工作的协议
第一步中,KDC返回的TGT客户端是无法进行解密的,因为它没有KDC Hash,如果有,我们就可以伪造黄金票据

第二步客户端需要提供TGT与第一步中使用自己NTLM Hash解密出来的Session Key加密的客户端信息跟时间戳
如果假设这个数据被中间人窃听到,也无法在短时间内破解,因为KDC会校验时间戳

KDC接收到TGT与其他内容后,会首先解密TGT,只有KDC可以解密TGT,从TGT中提取到Session Key,再使用Session Key解密其他内容,解密出来的内容同TGT中的信息进行校验来确认客户端是否受信

验证通过后,就会生成一个新的Session Key,我们称之为Sever Session Key,这个Server Session Key,这个Sever Session Key主要用于和放服务器通信,同时还会生成一个Ticket,也就是最后的票据了。

Ticket组成:

Server Hash:这个Hash是在AD中服务器计算机的NTLM Hash

在第三步里,客户端向服务器请求,需要提供Ticket,Sever Session Key加密的客户端信息与时间戳
·Ticket客户端无法解密
·服务器端通过解密Ticket解密Sever Session Key(Client info + Timestamp)
·比较时间长度
校验通过后,认证成功,该票据会一直存在于客户端内存中

白银票据(Silver Tickets)

白银票据特点:
·不需要与KDC进行交互
·需要目标服务的NTLM hash
在第三步认证中的Ticket的组成:
Ticket = Sever Hash(Sever Session Key + Client info + End Time)
当拥有Sever Hash时,我们可以伪造一个不经过KDC认证的一个Ticket
Sever Session Key在未发送Ticket之前,服务器是不知道sever Session Session Key是什么。所以,一切青桔都来源于Sever Hash

伪造白银票据(Silver Tickets)

首先需要导出Sever Hash:
mimikatz.exe "privilege::debug” "sekurlsa::logonpasswords" "exit" > log.txt
伪造票据:
mimikatz “kerberos::golden /domain:<域名> /sid:<域 SID> /target:<目标服务器主机名> /service:<服务类型> /rc4: /user:<用户名> /ptt" exit
other:
·kerberos::list #列出票决
·kerberos::purge #清楚票据
由于白银票据需要目标服务器的Hash,所以没办法生成对应域内 所有服务器的票据,也不能通过TGT申请。因此只能针对服务器 上的某些服务去伪造,伪造的服务类型列表如下:

白银票据(Silver Tickets)演示

mimikatz抓取

白银票据(Silver Tickets)防御

·尽量保证服务器凭证不被窃取
·开启PAC服务(Privileged Attribute Certificate)特权属性证书保护功能,PAC主要是规定服务器将票据发送给kerberos服务,由kerberos服务验证票据是否有效
开启方式:
将注册表中
HKEY_LOCAL_MACHINESYSTEM CurrentControlSetControlLsaKerberosParameters
中的ValidatekdcpacSignature设置为1

黄金票据(Golden Tickets)

黄金票据特点:
·需要与DC通信
·需要krbtgt用户的hash
这里的krbtgt hash就是之前讲的KDC hash

黄金票据(Golden Tickets)-MSF kiwi

使用meterpreter中的Wiki模块:
load kiwi 创建票据---注入到内存中---使用wmic在目标服务器上创建一个进程

黄金票据(Golden Tickets) - 伪造

伪造票据:
mimikatz “kerberos::golden /domain:<域名> /sid:<域SID> /rc4: /user:<任意用户名> /ptt" exit

黄金票据(Golden Tickets) - 演示

伪造黄金票据访问域内任意服务器服务

Tickets 总结

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

0x03 Windows Access Token

Windows Access Token 简介

Windows Token其实叫Access Token(访问令牌),它是一个描 述进程或者线程安全上下文的一个对象。不同的用户登录计算机后, 都会生成一个Access Token,这个Token在用户创建进程或者线程 时会被使用,不断的拷贝,这也就解释了A用户创建一个进程而该 进程没有B用户的权限。
Access Token种类:
• 主令牌
• 模拟令牌
一般情况下,用户双击运行一个程序,都会拷贝“explorer.exe”的Access Token。
当用户注销后,系统将会使主令牌切换为模拟令牌,不会将令牌清除,只有在重启机器后才会清除。

Windows 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

Windows Access Token令牌假冒实战

meterpreter > getsystem
meterpreter > load incognito meterpreter > list_tokens –u
Delegation Tokens Available ============================== NT AUTHORITYLOCAL SERVICENT AUTHORITYNETWORK SERVICENT AUTHORITYSYSTEM PAYLOADSAdministrator PAYLOADSw7
meterpreter > impersonate_token "PAYLOADSAdministrator”
[+] Delegation token available
[+] Successfully impersonated user PAYLOADSAdministrator

Windows Access Token令牌假冒防御

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

0x04 知识点总结

简单阐述了Pass the hash,silver Tickets,Impersonation Token的原理,主要是内网中维持权限,以及提权。

参考倾旋的博客

https://payloads.online/archivers/2018-11-30/1

原文地址:https://www.cnblogs.com/SnowSec/p/14709049.html