rusthound_ce/enums/
sid.rs1use std::error::Error;
2use regex::Regex;
3use log::{trace,error};
4use crate::enums::secdesc::LdapSid;
5
6pub fn is_sid(input: &String) -> Result<bool, Box<dyn Error>> {
8 let regex = Regex::new(".*S-1-5.*")?;
9 Ok(regex.is_match(input))
10}
11
12pub fn sid_maker(sid: LdapSid, domain: &String) -> String {
14 trace!("sid_maker before: {:?}",&sid);
15
16 let sub = sid.sub_authority.iter().map(|x| x.to_string()).collect::<Vec<String>>().join("-");
17
18 let result = format!("S-{}-{}-{}", sid.revision, sid.identifier_authority.value[5], sub);
19
20 let final_sid = {
21 if result.len() <= 16 {
22 format!("{}-{}", domain.to_uppercase(), result.to_owned())
23 } else {
24 result
25 }
26 };
27
28 trace!("sid_maker value: {}",final_sid);
29 if final_sid.contains("S-0-0"){
30 error!("SID contains null bytes!\n[INPUT: {:?}]\n[OUTPUT: {}]", &sid, final_sid);
31 }
32
33 return final_sid;
34}
35
36pub fn objectsid_to_vec8(sid: &String) -> Vec<u8>
38{
39 sid.as_bytes().iter().map(|x| *x).collect::<Vec<u8>>()
40}
41
42pub fn _decode_guid(raw_guid: &Vec<u8>) -> String
46{
47 let raw_guid = raw_guid.iter().map(|x| x & 0xFF).collect::<Vec<u8>>();
50 let rev = | x: &[u8] | -> Vec<u8> { x.iter().map(|i| *i).rev().collect::<Vec<u8>>()};
51
52 let str_guid = format!(
54 "{}-{}-{}-{}-{}",
55 &hex_push(&raw_guid[0..4]),
56 &hex_push(&rev(&raw_guid[4..6])),
57 &hex_push(&rev(&raw_guid[6..8])),
58 &hex_push(&raw_guid[8..10]),
59 &hex_push(&raw_guid[10..16]),
60 );
61
62 str_guid
63}
64
65pub fn hex_push(blob: &[u8]) -> String {
68 blob.iter().map(|x| format!("{:X}", x)).collect::<String>()
70}
71
72pub fn bin_to_string(raw_guid: &Vec<u8>) -> String
74{
75 let raw_guid = raw_guid.iter().map(|x| x & 0xFF).collect::<Vec<u8>>();
81 let rev = | x: &[u8] | -> Vec<u8> { x.iter().map(|i| *i).collect::<Vec<u8>>()};
82
83 let str_guid = format!(
84 "{}-{}-{}-{}-{}",
85 &hex_push(&raw_guid[12..16]),
86 &hex_push(&raw_guid[10..12]),
87 &hex_push(&raw_guid[8..10]),
88 &hex_push(&rev(&raw_guid[6..8])),
89 &hex_push(&rev(&raw_guid[0..6]))
90 );
91
92 return str_guid
93}
94pub fn decode_guid_le(raw_guid: &Vec<u8>) -> String {
96 let str_guid = format!(
98 "{:02X}{:02X}{:02X}{:02X}-{:02X}{:02X}-{:02X}{:02X}-{:02X}{:02X}-{:02X}{:02X}{:02X}{:02X}{:02X}{:02X}",
99 raw_guid[3], raw_guid[2], raw_guid[1], raw_guid[0], raw_guid[5], raw_guid[4], raw_guid[7], raw_guid[6], raw_guid[8], raw_guid[9], raw_guid[10], raw_guid[11], raw_guid[12], raw_guid[13], raw_guid[14], raw_guid[15] );
105
106 str_guid
107}