Skip to main content

rusthound_ce/objects/
common.rs

1use std::collections::HashMap;
2
3use ldap3::SearchEntry;
4use log::trace;
5use serde_json::{json,value::Value};
6use serde::{Deserialize, Serialize};
7
8
9/// LdapObject structure
10pub trait LdapObject {
11   // Ldap object structure (User,Group,Computer...) to JSON
12   fn to_json(&self) -> Value;
13
14   // Get values
15   fn get_object_identifier(&self) -> &String;
16   fn get_is_acl_protected(&self) -> &bool;
17   fn get_aces(&self) -> &Vec<AceTemplate>;
18   fn get_spntargets(&self) -> &Vec<SPNTarget>;
19   fn get_allowed_to_delegate(&self) -> &Vec<Member>;
20   fn get_links(&self) -> &Vec<Link>;
21   fn get_contained_by(&self) -> &Option<Member>;
22   fn get_child_objects(&self) -> &Vec<Member>;
23   // Only for computer objects
24   fn get_haslaps(&self) -> &bool;
25
26   // Get mutable value
27   fn get_aces_mut(&mut self) -> &mut Vec<AceTemplate>;
28   fn get_spntargets_mut(&mut self) -> &mut Vec<SPNTarget>;
29   fn get_allowed_to_delegate_mut(&mut self) -> &mut Vec<Member>;
30
31   // Edit values
32   fn set_is_acl_protected(&mut self, is_acl_protected: bool);
33   fn set_aces(&mut self, aces: Vec<AceTemplate>);
34   fn set_spntargets(&mut self, spn_targets: Vec<SPNTarget>);
35   fn set_allowed_to_delegate(&mut self, allowed_to_delegate: Vec<Member>);
36   fn set_links(&mut self, links: Vec<Link>);
37   fn set_contained_by(&mut self, contained_by: Option<Member>);
38   fn set_child_objects(&mut self, child_objects: Vec<Member>);
39   fn set_owner_rights_flags(&mut self, _any: bool, _any_inherited: bool);
40}
41
42/// LocalGroup structure
43#[derive(Debug, Clone, Deserialize, Serialize, Default)]
44pub struct LocalGroup {
45   #[serde(rename = "ObjectIdentifier")]
46   object_identifier: String,
47   #[serde(rename = "Name")]
48   name: String,
49   #[serde(rename = "Results")]
50   results: Vec<Member>,
51   #[serde(rename = "LocalNames")]
52   local_names: Vec<String>,
53   #[serde(rename = "Collected")]
54   collected: bool,
55   #[serde(rename = "FailureReason")]
56   failure_reason: Option<String>,
57}
58
59impl LocalGroup {
60   // New Local Group.
61   pub fn new() -> Self { 
62      Self { 
63         ..Default::default()
64      }
65   }
66
67   // Immutable access.
68   pub fn object_identifier(&self) -> &String {
69      &self.object_identifier
70   }
71   pub fn results(&self) -> &Vec<Member> {
72      &self.results
73   }
74   pub fn local_names(&self) -> &Vec<String> {
75      &self.local_names
76   }
77   pub fn collected(&self) -> &bool {
78      &self.collected
79   }
80   pub fn failure_reason(&self) -> &Option<String> {
81      &self.failure_reason
82   }
83
84   // Mutable access.
85   pub fn object_identifier_mut(&mut self) -> &mut String {
86      &mut self.object_identifier
87   }
88   pub fn name_mut(&mut self) -> &mut String {
89      &mut self.name
90   }
91   pub fn results_mut(&mut self) -> &mut Vec<Member> {
92      &mut self.results
93   }
94   pub fn local_names_mut(&mut self) -> &mut Vec<String> {
95      &mut self.local_names
96   }
97   pub fn collected_mut(&mut self) -> &mut bool {
98      &mut self.collected
99   }
100   pub fn failure_reason_mut(&mut self) -> &mut Option<String> {
101      &mut self.failure_reason
102   }
103}
104
105/// Session structure
106#[derive(Debug, Clone, Deserialize, Serialize)]
107pub struct Session {
108   #[serde(rename = "Results")]
109   results: Vec<UserComputerSession>,
110   #[serde(rename = "Collected", default = "default_true")]
111   collected: bool,
112   #[serde(rename = "FailureReason")]
113   failure_reason: Option<String>,
114}
115
116impl Default for Session {
117   /// Default values for Session structure.
118   fn default() -> Session {
119      Session {
120         results: Vec::new(),
121         collected: true,
122         failure_reason: None,
123       }
124   }
125}
126
127impl Session {
128   // New session.
129   pub fn new() -> Self { 
130      Self { 
131         collected: true,
132         ..Default::default()
133      }
134   }
135
136   // Immutable access.
137   pub fn results(&self) -> &Vec<UserComputerSession> {
138      &self.results
139   }
140   pub fn collected(&self) -> &bool {
141      &self.collected
142   }
143   pub fn failure_reason(&self) -> &Option<String> {
144      &self.failure_reason
145   }
146
147   // Mutable access.
148   pub fn results_mut(&mut self) -> &mut Vec<UserComputerSession> {
149      &mut self.results
150   }
151   pub fn collected_mut(&mut self) -> &mut bool {
152      &mut self.collected
153   }
154   pub fn failure_reason_mut(&mut self) -> &mut Option<String> {
155      &mut self.failure_reason
156   }
157}
158
159/// UserSID to ComputerSID Session link structure
160#[derive(Debug, Clone, Deserialize, Serialize, Default)]
161pub struct UserComputerSession {
162   #[serde(rename = "UserSID")]
163   user_sid: String,
164   #[serde(rename = "ComputerSID")]
165   computer_sid: String,
166}
167
168impl UserComputerSession {
169   // New User Computer Session.
170   pub fn new() -> Self { 
171      Self { 
172         ..Default::default()
173      }
174   }
175
176   // Immutable access.
177   pub fn user_sid(&self) -> &String {
178      &self.user_sid
179   }
180   pub fn computer_sid(&self) -> &String {
181      &self.computer_sid
182   }
183
184   // Mutable access.
185   pub fn user_sid_mut(&mut self) -> &mut String {
186      &mut self.user_sid
187   }
188   pub fn computer_sid_mut(&mut self) -> &mut String {
189      &mut self.computer_sid
190   }
191   
192}
193
194/// Session structure
195#[derive(Debug, Clone, Deserialize, Serialize, Default)]
196pub struct UserRight {
197   #[serde(rename = "Privilege")]
198   privilege: String,
199   #[serde(rename = "Results")]
200   results: Vec<Member>,
201   #[serde(rename = "LocalNames")]
202   local_names: Vec<String>,
203   #[serde(rename = "Collected", default = "default_true")]
204   collected: bool,
205   #[serde(rename = "FailureReason")]
206   failure_reason: Option<String>,
207}
208
209impl UserRight {
210   // New User Right.
211   pub fn new() -> Self { 
212      Self { 
213         ..Default::default()
214      }
215   }
216
217   // Immutable access.
218   pub fn privilege(&self) -> &String {
219      &self.privilege
220   }
221   pub fn results(&self) -> &Vec<Member> {
222      &self.results
223   }
224   pub fn local_names(&self) -> &Vec<String> {
225      &self.local_names
226   }
227   pub fn collected(&self) -> &bool {
228      &self.collected
229   }
230   pub fn failure_reason(&self) -> &Option<String> {
231      &self.failure_reason
232   }
233
234   // Mutable access.
235   pub fn privilege_mut(&mut self) -> &mut String {
236      &mut self.privilege
237   }
238   pub fn results_mut(&mut self) -> &mut Vec<Member> {
239      &mut self.results
240   }
241   pub fn local_names_mut(&mut self) -> &mut Vec<String> {
242      &mut self.local_names
243   }
244   pub fn collected_mut(&mut self) -> &mut bool {
245      &mut self.collected
246   }
247   pub fn failure_reason_mut(&mut self) -> &mut Option<String> {
248      &mut self.failure_reason
249   }
250}
251
252
253/// DCRegistryData structure
254#[derive(Debug, Clone, Deserialize, Serialize)]
255pub struct DCRegistryData {
256   #[serde(rename = "CertificateMappingMethods")]
257   certificate_mapping_methods: Option<RegistryData>,
258   #[serde(rename = "StrongCertificateBindingEnforcement")]
259   strong_certificate_binding_enforcement: Option<RegistryData>,
260}
261
262impl Default for DCRegistryData {
263   fn default() -> DCRegistryData {
264      DCRegistryData {
265         certificate_mapping_methods: None,
266         strong_certificate_binding_enforcement: None,
267      }
268   }
269}
270
271/// RegistryData structure
272#[derive(Debug, Clone, Deserialize, Serialize, Default)]
273pub struct RegistryData {
274   #[serde(rename = "Value")]
275   value: i8,
276   #[serde(rename = "Collected", default = "default_true")]
277   collected: bool,
278   #[serde(rename = "FailureReason")]
279   failure_reason: Option<String>,
280}
281
282impl RegistryData {
283   // New RegistryData.
284   pub fn new() -> Self { 
285      Self {
286         collected: true,
287         ..Default::default()
288      }
289   }
290}
291
292/// Function to return default value for struct.
293pub fn default_true() -> bool {
294   true
295}
296
297/// Member structure
298#[derive(Debug, Clone, Deserialize, Serialize, Default)]
299pub struct Member {
300   #[serde(rename = "ObjectIdentifier")]
301   object_identifier: String,
302   #[serde(rename = "ObjectType")]
303   object_type: String,
304}
305
306impl Member {
307   // New member.
308    pub fn new() -> Self {
309      Self { 
310         object_identifier: "SID".to_string(),
311         ..Default::default()
312      }
313   }
314
315   // Immutable access.
316   pub fn object_identifier(&self) -> &String {
317      &self.object_identifier
318   }
319   pub fn object_type(&self) -> &String {
320      &self.object_type
321   }
322
323   // Mutable access.
324   pub fn object_identifier_mut(&mut self) -> &mut String {
325      &mut self.object_identifier
326   }
327   pub fn object_type_mut(&mut self) -> &mut String {
328      &mut self.object_type
329   }
330}
331
332/// Well-known SID of OWNER RIGHTS. An ACE granting rights to it applies to
333/// whoever currently owns the object, making ownership an escalation path.
334const OWNER_RIGHTS_SID: &str = "S-1-3-4";
335
336/// `sid_maker` prefixes well-known SIDs with the domain name, so a plain
337/// equality test is not enough.
338fn is_owner_rights_sid(sid: &str) -> bool {
339    sid == OWNER_RIGHTS_SID || sid.ends_with(&format!("-{OWNER_RIGHTS_SID}"))
340}
341
342/// AceTemplate structure
343#[derive(Debug, Clone, Deserialize, Serialize, Default)]
344pub struct AceTemplate {
345   #[serde(rename = "PrincipalSID")]
346   principal_sid: String,
347   #[serde(rename = "PrincipalType")]
348   principal_type: String,
349   #[serde(rename = "RightName")]
350   right_name: String,
351   #[serde(rename = "IsInherited")]
352   is_inherited: bool,
353   #[serde(rename = "InheritanceHash")]
354   inheritance_hash: String,
355   #[serde(rename = "IsPermissionForOwnerRightsSid")]
356   is_permission_for_owner_rights_sid: bool,
357   #[serde(rename = "IsInheritedPermissionForOwnerRightsSid")]
358   is_inherited_permission_for_owner_rights_sid: bool,
359}
360
361impl AceTemplate {
362   // New ACE object.
363   pub fn new(
364      principal_sid: String,
365      principal_type: String,
366      right_name: String,
367      is_inherited: bool,
368      inheritance_hash: String,
369   ) -> Self {
370      // Both OWNER RIGHTS flags follow from the trustee SID and the inherited
371      // bit, so they are computed here rather than in a later pass.
372      let is_owner_rights = is_owner_rights_sid(&principal_sid);
373      Self {
374         principal_sid,
375         principal_type,
376         right_name,
377         is_inherited,
378         inheritance_hash,
379         is_permission_for_owner_rights_sid: is_owner_rights,
380         is_inherited_permission_for_owner_rights_sid: is_owner_rights && is_inherited,
381      }
382   }
383
384   // Immutable access.
385   pub fn principal_sid(&self) -> &String {
386      &self.principal_sid
387   }
388   pub fn principal_type(&self) -> &String {
389      &self.principal_type
390   }
391   pub fn right_name(&self) -> &String {
392      &self.right_name
393   }
394   pub fn is_inherited(&self) -> &bool {
395      &self.is_inherited
396   }
397   pub fn inheritance_hash(&self) -> &String {
398      &self.inheritance_hash
399   }
400   pub fn is_permission_for_owner_rights_sid(&self) -> bool {
401      self.is_permission_for_owner_rights_sid
402   }
403   pub fn is_inherited_permission_for_owner_rights_sid(&self) -> bool {
404      self.is_inherited_permission_for_owner_rights_sid
405   }
406
407   // Mutable access.
408   pub fn principal_sid_mut(&mut self) -> &mut String {
409      &mut self.principal_sid
410   }
411   pub fn principal_type_mut(&mut self) -> &mut String {
412      &mut self.principal_type
413   }
414   pub fn right_name_mut(&mut self) -> &mut String {
415      &mut self.right_name
416   }
417   pub fn is_inherited_mut(&mut self) -> &mut bool {
418      &mut self.is_inherited
419   }
420   pub fn inheritance_hash_mut(&mut self) -> &mut String {
421      &mut self.inheritance_hash
422   }
423}
424
425/// Link structure
426#[derive(Debug, Clone, Deserialize, Serialize)]
427pub struct Link {
428   #[serde(rename = "IsEnforced")]
429   is_enforced: bool,
430   #[serde(rename = "GUID")]
431   guid: String,
432}
433
434impl Link {
435   // New object.
436   pub fn new(is_enforced: bool, guid: String) -> Self { Self { is_enforced, guid } }
437   
438   // Immutable access.
439   pub fn is_enforced(&self) -> &bool {
440      &self.is_enforced
441   }
442   pub fn guid(&self) -> &String {
443      &self.guid
444   }
445 
446   // Mutable access.
447   pub fn is_enforced_mut(&mut self) -> &mut bool {
448      &mut self.is_enforced
449   }
450   pub fn guid_mut(&mut self) -> &mut String {
451      &mut self.guid
452   }
453}
454
455/// GPOChange structure
456#[derive(Debug, Clone, Deserialize, Serialize, Default)]
457pub struct GPOChange {
458   #[serde(rename = "LocalAdmins")]
459   local_admins: Vec<Member>,
460   #[serde(rename = "RemoteDesktopUsers")]
461   remote_desktop_users: Vec<Member>,
462   #[serde(rename = "DcomUsers")]
463   dcom_users: Vec<Member>,
464   #[serde(rename = "PSRemoteUsers")]
465   psremote_users: Vec<Member>,
466   #[serde(rename = "AffectedComputers")]
467   affected_computers: Vec<Member>,
468}
469
470impl GPOChange {
471   // New GPOChanges.
472   pub fn new() -> Self { 
473      Self {
474         ..Default::default()
475      } 
476   }
477
478   // Imutable access.
479   pub fn local_admins(&self) -> &Vec<Member> {
480      &self.local_admins
481   }
482   pub fn remote_desktop_users(&self) -> &Vec<Member> {
483      &self.remote_desktop_users
484   }
485   pub fn dcom_users(&self) -> &Vec<Member> {
486      &self.dcom_users
487   }
488   pub fn psremote_users(&self) -> &Vec<Member> {
489      &self.psremote_users
490   }
491   pub fn affected_computers(&self) -> &Vec<Member> {
492      &self.affected_computers
493   }
494
495   // Mutable access.
496   pub fn local_admins_mut(&mut self) -> &mut Vec<Member> {
497      &mut self.local_admins
498   }
499   pub fn remote_desktop_users_mut(&mut self) -> &mut Vec<Member> {
500      &mut self.remote_desktop_users
501   }
502   pub fn dcom_users_mut(&mut self) -> &mut Vec<Member> {
503      &mut self.dcom_users
504   }
505   pub fn psremote_users_mut(&mut self) -> &mut Vec<Member> {
506      &mut self.psremote_users
507   }
508   pub fn affected_computers_mut(&mut self) -> &mut Vec<Member> {
509      &mut self.affected_computers
510   }
511}
512
513/// SPNTarget structure
514#[derive(Debug, Clone, Deserialize, Serialize)]
515pub struct SPNTarget {
516   #[serde(rename = "ComputerSID")]
517   computer_sid: String,
518   #[serde(rename = "Port")]
519   port: i32,
520   #[serde(rename = "Service")]
521   service: String,
522}
523
524impl SPNTarget {
525   // New object.
526   pub fn new() -> Self { 
527      Self { 
528         computer_sid: "SID".to_string(), 
529         port: 1433, 
530         service: "SQLAdmin".to_string()
531      } 
532   }
533
534   // Immutable access.
535   pub fn computer_sid(&self) -> &String {
536      &self.computer_sid
537   }
538   pub fn port(&self) -> &i32 {
539      &self.port
540   }
541   pub fn service(&self) -> &String {
542      &self.service
543   }
544
545   // Mutable access.
546   pub fn computer_sid_mut(&mut self) -> &mut String {
547      &mut self.computer_sid
548   }
549   pub fn port_mut(&mut self) -> &mut i32 {
550      &mut self.port
551   }
552   pub fn service_mut(&mut self) -> &mut String {
553      &mut self.service
554   }
555}
556
557/// Final JSON structure
558#[derive(Debug, Clone, Deserialize, Serialize, Default)]
559pub struct FinalJson{
560   data: Vec<Value>,
561   meta: Meta,
562}
563
564impl FinalJson  {
565   // New FinalJson.
566   pub fn new(data: Vec<Value>, meta: Meta) -> Self { 
567      Self {
568         data,
569         meta
570      }
571   }
572   // Imutable access.
573   pub fn data(&self) -> &Vec<Value> {
574      &self.data
575   }
576   pub fn meta(&self) -> &Meta {
577      &self.meta
578   }
579
580   // Mutable access.
581   pub fn data_mut(&mut self) -> &mut Vec<Value> {
582      &mut self.data
583   }
584   pub fn meta_mut(&mut self) -> &mut Meta {
585      &mut self.meta
586   }
587}
588
589/// Meta data for final JSON structure
590#[derive(Debug, Clone, Deserialize, Serialize, Default)]
591pub struct Meta {
592   methods: i32,
593   #[serde(rename = "type")]
594   mtype: String,
595   count: i32,
596   version: i8,
597   collectorversion: String
598}
599
600impl Meta {
601   // New Meta.
602   pub fn new(
603      methods: i32,
604      mtype: String,
605      count: i32,
606      version: i8,
607      collectorversion: String
608   ) -> Self { 
609      Self { 
610         methods,
611         mtype,
612         count,
613         version,
614         collectorversion
615      } 
616   }
617   
618   // Imutable access.
619   pub fn methods(&self) -> &i32 {
620      &self.methods
621   }
622   pub fn mtype(&self) -> &String {
623      &self.mtype
624   }
625   pub fn count(&self) -> &i32 {
626      &self.count
627   }
628   pub fn version(&self) -> &i8 {
629      &self.version
630   }
631
632   // Mutable access.
633   pub fn methods_mut(&mut self) -> &mut i32 {
634      &mut self.methods
635   }
636   pub fn mtype_mut(&mut self) -> &mut String {
637      &mut self.mtype
638   }
639   pub fn count_mut(&mut self) -> &mut i32 {
640      &mut self.count
641   }
642   pub fn version_mut(&mut self) -> &mut i8 {
643      &mut self.version
644   }
645}
646
647
648/// Function to parse and replace value for unknown object.
649pub fn parse_unknown(result: SearchEntry, _domain: &str) -> serde_json::value::Value  {
650
651   let _result_dn = result.dn.to_uppercase();
652   let _result_attrs: HashMap<String, Vec<String>> = result.attrs;
653   let _result_bin: HashMap<String, Vec<Vec<u8>>> = result.bin_attrs;
654   
655   let unknown_json = json!({
656       "unknown": null,
657   });
658
659   // Debug for current object
660   trace!("Parse Unknown object: {}", _result_dn);
661   // for (key, value) in &_result_attrs {
662   //    println!("  {:?}:{:?}", key, value);
663   // }
664   // //trace result bin
665   // for (key, value) in &_result_bin {
666   //    println!("  {:?}:{:?}", key, value);
667   // }
668
669   unknown_json
670}