SDDL修改

能解析就能修改,线索

在官方issues中提到Dacl修改的步骤。在impacket中有没有相关库呢,example文件夹中ldap-shell下的do_write_gpo_dacl有相关实现,代码如下,查询了Dacl后创建新的ace条目,将其添加到Dacl的数据末尾,之后执行修改操作。既然python可以,那么golang也可以。

image-1

修改

在golang中,我们也可以按照python的逻辑:

  • 查询Dacl
  • 创建Ace条目,将Ace添加到Dacl中
  • 更新数据偏移
  • 修改

相关代码我已经实现了。首先是查询域控的SDDL属性,按照上一节所述的格式解析之后,创建一个新的Ace条目,逻辑如下图函数所示。首先创建一个Ace结构体,(这里是硬编码)填充相关结构,设置Ace的扩展为ObjectType,SID和ObjectType是可以指定的。

209行aceEntry.Update()是将数据转换为字节结构保存,是为了后续转换为原始数据准备。

215行将ace条目写入到Dacl中的Ace数组中。之后要记得更新Dacl中的AceCountAclSizedacl.update()也是更新了Dacl的原始数据。

image-2

Dacl的数据更新完毕后还要更新SrSecurityDescriptor中的OffsetOwnerOffsetGroup,更新大小为我们添加的Ace的大小偏移+原来的偏移大小

image-3

最后,将修改完毕的数据转换为字节,并调用ldap的修改方法进行修改。

image-4

效果

先查询域控中哪些用户具有DCSync权限,如下图,存在用户john。

image-5

之后,我们再添加一个用户jim,脚本提示添加完成。

image-6

再次查询,jim用户具有DCSync权限

image-7