golang将SDDL字符串转换为用户友好JSON格式的插件库gosddl的使用
Golang将SDDL字符串转换为用户友好JSON格式的插件库gosddl的使用
概述
GoSDDL是一个将SDDL(安全描述符定义语言)字符串转换为用户友好JSON格式的Golang库。SDDL包含四个部分:所有者(Owner)、主要组(Primary Group)、DACL(自主访问控制列表)和SACL(系统访问控制列表)。
该转换器有两种工作模式:
- 直接模式
- 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)
}
注意事项
- gosddl库会自动将SID转换为易读的账户名(如果系统可以解析)
- 权限掩码会被转换为十六进制格式,便于查看
- 该库支持大多数常见的SDDL特性,但可能不支持某些非常特殊的SDDL格式
- 在处理大量SDDL字符串时,建议重用解析器实例以提高性能
gosddl库为Go开发者提供了一种简单的方式来处理和转换Windows安全描述符,使得安全审计和权限分析变得更加方便。