SDDL修改
能解析就能修改,线索
在官方issues中提到Dacl修改的步骤。在impacket中有没有相关库呢,example文件夹中ldap-shell下的do_write_gpo_dacl
有相关实现,代码如下,查询了Dacl后创建新的ace条目,将其添加到Dacl的数据末尾,之后执行修改操作。既然python可以,那么golang也可以。
修改
在golang中,我们也可以按照python的逻辑:
- 查询Dacl
- 创建Ace条目,将Ace添加到Dacl中
- 更新数据偏移
- 修改
相关代码我已经实现了。首先是查询域控的SDDL属性,按照上一节所述的格式解析之后,创建一个新的Ace条目,逻辑如下图函数所示。首先创建一个Ace结构体,(这里是硬编码)填充相关结构,设置Ace的扩展为ObjectType
,SID和ObjectType是可以指定的。
209行aceEntry.Update()
是将数据转换为字节结构保存,是为了后续转换为原始数据准备。
215行将ace条目写入到Dacl中的Ace数组中。之后要记得更新Dacl中的AceCount
、AclSize
。dacl.update()
也是更新了Dacl的原始数据。
Dacl的数据更新完毕后还要更新SrSecurityDescriptor
中的OffsetOwner
和OffsetGroup
,更新大小为我们添加的Ace的大小偏移+原来的偏移大小
最后,将修改完毕的数据转换为字节,并调用ldap的修改方法进行修改。
效果
先查询域控中哪些用户具有DCSync权限,如下图,存在用户john。
之后,我们再添加一个用户jim,脚本提示添加完成。
再次查询,jim用户具有DCSync权限