diff --git a/pkg/js/generated/go/libldap/ldap.go b/pkg/js/generated/go/libldap/ldap.go index fc4841acc..c45d237a9 100644 --- a/pkg/js/generated/go/libldap/ldap.go +++ b/pkg/js/generated/go/libldap/ldap.go @@ -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 }, diff --git a/pkg/js/libs/ldap/adenum.go b/pkg/js/libs/ldap/adenum.go index 3c1363603..074a15828 100644 --- a/pkg/js/libs/ldap/adenum.go +++ b/pkg/js/libs/ldap/adenum.go @@ -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 } diff --git a/pkg/js/libs/ldap/utils.go b/pkg/js/libs/ldap/utils.go new file mode 100644 index 000000000..0d95de50b --- /dev/null +++ b/pkg/js/libs/ldap/utils.go @@ -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() +}