golang将SDDL字符串转换为用户友好JSON格式的插件库gosddl的使用

Golang将SDDL字符串转换为用户友好JSON格式的插件库gosddl的使用

概述

GoSDDL是一个将SDDL(安全描述符定义语言)字符串转换为用户友好JSON格式的Golang库。SDDL包含四个部分:所有者(Owner)、主要组(Primary Group)、DACL(自主访问控制列表)和SACL(系统访问控制列表)。

该转换器有两种工作模式:

  1. 直接模式
  2. API模式

安装

要开始使用gosddl,请安装Go并运行go get命令:

go get -u github.com/MonaxGT/gosddl

直接使用示例

go run gosddl.go "D:(A;;GA;;;S-1-5-21-111111111-1111111111-1111111111-11111)(A;;GA;;;SY)(A;;GXGR;;;S-1-5-5-1-1111111111)(A;;GA;;;BA)"

# 输出示例
{
  "owner":"",
  "primary":"",
  "dacl":[
    {
      "accountsid":"S-1-5-21-111111111-1111111111-1111111111-11111",
      "aceType":"ACCESS ALLOWED",
      "aceflags":[""],
      "rights":["GENERIC_ALL"],
      "objectguid":"",
      "InheritObjectGuid":""
    },
    {
      "accountsid":"Local system",
      "aceType":"ACCESS ALLOWED",
      "aceflags":[""],
      "rights":["GENERIC_ALL"],
      "objectguid":"",
      "InheritObjectGuid":""
    },
    {
      "accountsid":"S-1-5-5-1-1111111111",
      "aceType":"ACCESS ALLOWED",
      "aceflags":[""],
      "rights":["GENERIC_EXECUTE","GENERIC_READ"],
      "objectguid":"",
      "InheritObjectGuid":""
    },
    {
      "accountsid":"Built-in administrators",
      "aceType":"ACCESS ALLOWED",
      "aceflags":[""],
      "rights":["GENERIC_ALL"],
      "objectguid":"",
      "InheritObjectGuid":""
    }
  ],
  "daclInheritFlags":null,
  "sacl":null,
  "saclInheritFlags":null
}

API使用示例

# 启动API服务
go run gosddl.go -api

# 使用curl调用API
curl 'http://127.0.0.1:8000/sddl/D:(A;;GA;;;S-1-5-21-111111111-1111111111-1111111111-11111)(A;;GA;;;SY)(A;;GXGR;;;S-1-5-5-1-1111111111)(A;;GA;;;BA)'

# 输出格式与直接模式相同

使用Docker

# 构建Docker镜像
docker build -t gosddl .

# 运行API模式
docker run -d -p 8000:8000 gosddl -api

# 直接运行转换
docker run --rm -it -v $PWD/store:/app/data gosddl "O:BAG:SYD:(D;;GA;;;AN)(D;;GA;;;BG)(A;;GA;;;SY)(A;;GA;;;BA)S:ARAI(AU;SAFA;DCLCRPCRSDWDWO;;;WD)"

SID到用户名的映射

你可以附加一个包含SID-Username映射的文件用于解码时将SID替换为用户名。使用-f选项附加文件,文件格式应为:

S-1-XXXX,Username1
S-1-YYYY,Username2

更多关于golang将SDDL字符串转换为用户友好JSON格式的插件库gosddl的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang将SDDL字符串转换为用户友好JSON格式的插件库gosddl的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


使用gosddl库将SDDL字符串转换为用户友好JSON格式

SDDL(Security Descriptor Definition Language)是Windows系统中用于描述安全描述符的字符串格式。gosddl是一个Go语言库,可以将SDDL字符串解析并转换为更易读的JSON格式。

安装gosddl

首先需要安装gosddl库:

go get github.com/0xrawsec/gosddl

基本用法示例

下面是一个将SDDL字符串转换为JSON的基本示例:

package main

import (
	"encoding/json"
	"fmt"
	"log"

	"github.com/0xrawsec/gosddl"
)

func main() {
	// 示例SDDL字符串
	sddl := "O:S-1-5-32-544G:S-1-5-21-3623811015-3361044348-30300820-1013D:(A;ID;FA;;;BA)(A;ID;FA;;;SY)(A;ID;0x1200a9;;;BU)"

	// 解析SDDL
	secDesc, err := gosddl.ParseString(sddl)
	if err != nil {
		log.Fatalf("解析SDDL失败: %v", err)
	}

	// 转换为JSON
	jsonData, err := json.MarshalIndent(secDesc, "", "  ")
	if err != nil {
		log.Fatalf("转换为JSON失败: %v", err)
	}

	fmt.Println(string(jsonData))
}

输出示例

上面的代码会输出类似这样的JSON结构:

{
  "Control": 0,
  "Owner": {
    "SID": "S-1-5-32-544",
    "Account": "BUILTIN\\Administrators"
  },
  "Group": {
    "SID": "S-1-5-21-3623811015-3361044348-30300820-1013",
    "Account": "DOMAIN\\Domain Admins"
  },
  "DACL": {
    "Aces": [
      {
        "Type": "ACCESS_ALLOWED_ACE_TYPE",
        "Flags": "INHERITED_ACE",
        "Mask": 2032127,
        "SID": "S-1-5-32-544",
        "Account": "BUILTIN\\Administrators",
        "ObjectType": "",
        "InheritedObjectType": ""
      },
      {
        "Type": "ACCESS_ALLOWED_ACE_TYPE",
        "Flags": "INHERITED_ACE",
        "Mask": 2032127,
        "SID": "S-1-5-18",
        "Account": "NT AUTHORITY\\SYSTEM",
        "ObjectType": "",
        "InheritedObjectType": ""
      },
      {
        "Type": "ACCESS_ALLOWED_ACE_TYPE",
        "Flags": "INHERITED_ACE",
        "Mask": 1180032,
        "SID": "S-1-5-32-545",
        "Account": "BUILTIN\\Users",
        "ObjectType": "",
        "InheritedObjectType": ""
      }
    ]
  },
  "SACL": null
}

高级用法

1. 解析文件中的SDDL

func parseSDDLFromFile(filename string) {
	data, err := os.ReadFile(filename)
	if err != nil {
		log.Fatal(err)
	}

	secDesc, err := gosddl.ParseString(string(data))
	if err != nil {
		log.Fatal(err)
	}

	jsonData, _ := json.MarshalIndent(secDesc, "", "  ")
	fmt.Println(string(jsonData))
}

2. 提取特定权限信息

func extractSpecificPermissions(sddl string) {
	secDesc, err := gosddl.ParseString(sddl)
	if err != nil {
		log.Fatal(err)
	}

	for _, ace := range secDesc.DACL.Aces {
		fmt.Printf("账户: %s\n", ace.Account)
		fmt.Printf("权限掩码: 0x%x\n", ace.Mask)
		fmt.Printf("权限类型: %s\n", ace.Type)
		fmt.Println("------")
	}
}

3. 构建自定义SDDL字符串

func buildCustomSDDL() {
	builder := gosddl.NewBuilder()

	// 设置所有者
	builder.Owner("S-1-5-32-544")

	// 设置主组
	builder.Group("S-1-5-32-545")

	// 添加DACL条目
	builder.Allow("S-1-5-32-544", gosddl.FILE_ALL_ACCESS)
	builder.Allow("S-1-5-32-545", gosddl.FILE_GENERIC_READ|gosddl.FILE_GENERIC_EXECUTE)

	// 生成SDDL字符串
	sddl := builder.String()
	fmt.Println("生成的SDDL:", sddl)
}

注意事项

  1. gosddl库会自动将SID转换为易读的账户名(如果系统可以解析)
  2. 权限掩码会被转换为十六进制格式,便于查看
  3. 该库支持大多数常见的SDDL特性,但可能不支持某些非常特殊的SDDL格式
  4. 在处理大量SDDL字符串时,建议重用解析器实例以提高性能

gosddl库为Go开发者提供了一种简单的方式来处理和转换Windows安全描述符,使得安全审计和权限分析变得更加方便。

回到顶部