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