pub mod adcs;
pub mod gpo;
pub mod resolver;
pub mod sessions;
use std::error::Error;
use rayon::prelude::*;
use crate::api::ADResults;
use crate::args::{CollectionMethod, Options};
use crate::modules::adcs::probe_enterpriseca_esc8;
use crate::modules::gpo::sysvol::collect_sysvol_targets;
pub async fn run_modules(common_args: &Options, ad: &mut ADResults) -> Result<(), Box<dyn Error>> {
if common_args.fqdn_resolver {
resolver::resolv::resolving_all_fqdn(
common_args.dns_tcp,
&common_args.name_server,
&mut ad.mappings.fqdn_ip,
&ad.computers,
)
.await;
}
if common_args.collection_method.does_sessions() {
sessions::run(common_args, &ad.users, &mut ad.computers).await?;
}
if !matches!(common_args.collection_method, CollectionMethod::DCOnly)
&& !matches!(common_args.collection_method, CollectionMethod::LdapOnly)
&& !ad.enterprisecas.is_empty()
{
log::info!(
"Starting ESC8 web enrollment probe on {} CA(s)...",
ad.enterprisecas.len()
);
ad.enterprisecas.par_iter_mut().for_each(|ca| {
let esc8 = probe_enterpriseca_esc8(ca.dns_host());
ca.apply_esc8(esc8.http_enrollment_endpoints);
});
}
if common_args.collection_method.does_gpo() {
let computer_scope = gpo::sysvol::ComputerGpoScope::from_gpos(&ad.gpos);
let sysvol = match collect_sysvol_targets(common_args, &computer_scope).await {
Ok(v) => v,
Err(e) => {
log::warn!("[gpo] SYSVOL collection failed: {e}");
Vec::new()
}
};
if !sysvol.is_empty() {
log::info!(
"[gpo] mapping {} GPO(s) to GPOChanges / UserRights",
sysvol.len()
);
gpo::apply_gpo(
&mut ad.ous,
&mut ad.domains,
&ad.users,
&ad.groups,
&mut ad.computers,
&sysvol,
&ad.mappings.dn_sid,
);
}
}
Ok(())
}