move DecodeSID to utils.go making it a generic function exposed by the module

This commit is contained in:
5amu 2024-01-21 17:57:23 +01:00
parent c703fffe80
commit 642c99bcff
3 changed files with 40 additions and 32 deletions

View File

@ -17,6 +17,7 @@ func init() {
// Functions
"JoinFilters": func(f ...string) string { return lib_ldap.JoinFilters(f...) },
"NegativeFilter": func(f string) string { return lib_ldap.NegativeFilter(f) },
"DecodeSID": func(s string) string { return lib_ldap.DecodeSID(s) },
// Var and consts
"FilterIsPerson": func() string { return lib_ldap.FilterIsPerson },

View File

@ -146,37 +146,6 @@ func (c *LdapClient) GetADUserKerberoastable() ([]ADObject, error) {
return c.FindADObjects(JoinFilters(FilterIsPerson, FilterAccountEnabled, FilterHasServicePrincipalName))
}
func decodeSID(b []byte) string {
revisionLvl := int(b[0])
subAuthorityCount := int(b[1]) & 0xFF
var authority int
for i := 2; i <= 7; i++ {
authority = authority | int(b[i])<<(8*(5-(i-2)))
}
var size = 4
var offset = 8
var subAuthorities []int
for i := 0; i < subAuthorityCount; i++ {
var subAuthority int
for k := 0; k < size; k++ {
subAuthority = subAuthority | (int(b[offset+k])&0xFF)<<(8*k)
}
subAuthorities = append(subAuthorities, subAuthority)
offset += size
}
var builder strings.Builder
builder.WriteString("S-")
builder.WriteString(fmt.Sprintf("%d-", revisionLvl))
builder.WriteString(fmt.Sprintf("%d", authority))
for _, v := range subAuthorities {
builder.WriteString(fmt.Sprintf("-%d", v))
}
return builder.String()
}
func (c *LdapClient) GetADDomainSID() (string, error) {
r, err := c.Search(FilterServerTrustAccount, "objectSid")
if err != nil {
@ -190,5 +159,5 @@ func (c *LdapClient) GetADDomainSID() (string, error) {
if len(r[0]["objectSid"]) < 1 {
return "", fmt.Errorf("could not grab DomainSID")
}
return decodeSID([]byte(r[0]["objectSid"][0])), nil
return DecodeSID(r[0]["objectSid"][0]), nil
}

38
pkg/js/libs/ldap/utils.go Normal file
View File

@ -0,0 +1,38 @@
package ldap
import (
"fmt"
"strings"
)
func DecodeSID(s string) string {
b := []byte(s)
revisionLvl := int(b[0])
subAuthorityCount := int(b[1]) & 0xFF
var authority int
for i := 2; i <= 7; i++ {
authority = authority | int(b[i])<<(8*(5-(i-2)))
}
var size = 4
var offset = 8
var subAuthorities []int
for i := 0; i < subAuthorityCount; i++ {
var subAuthority int
for k := 0; k < size; k++ {
subAuthority = subAuthority | (int(b[offset+k])&0xFF)<<(8*k)
}
subAuthorities = append(subAuthorities, subAuthority)
offset += size
}
var builder strings.Builder
builder.WriteString("S-")
builder.WriteString(fmt.Sprintf("%d-", revisionLvl))
builder.WriteString(fmt.Sprintf("%d", authority))
for _, v := range subAuthorities {
builder.WriteString(fmt.Sprintf("-%d", v))
}
return builder.String()
}