in theory will parse certuitl for you
This commit is contained in:
7
certify_parser/Cargo.lock
generated
Normal file
7
certify_parser/Cargo.lock
generated
Normal file
@@ -0,0 +1,7 @@
|
||||
# This file is automatically @generated by Cargo.
|
||||
# It is not intended for manual editing.
|
||||
version = 3
|
||||
|
||||
[[package]]
|
||||
name = "certify_parser"
|
||||
version = "0.1.0"
|
||||
8
certify_parser/Cargo.toml
Normal file
8
certify_parser/Cargo.toml
Normal file
@@ -0,0 +1,8 @@
|
||||
[package]
|
||||
name = "certify_parser"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
[dependencies]
|
||||
174
certify_parser/src/main.rs
Normal file
174
certify_parser/src/main.rs
Normal file
@@ -0,0 +1,174 @@
|
||||
use std::fs;
|
||||
use std::env;
|
||||
|
||||
struct certificate{
|
||||
writedacl: bool,
|
||||
full: bool,
|
||||
client_auth: bool,
|
||||
enrollee_supplies_subject: bool,
|
||||
ca: String,
|
||||
template_name: String,
|
||||
|
||||
}
|
||||
|
||||
struct enterpriseca{
|
||||
ca_name: String,
|
||||
manage_ca: bool,
|
||||
}
|
||||
|
||||
|
||||
fn parse_enterprise_ca(certificate_texts: &str, groups: &Vec<&str>) -> enterpriseca{
|
||||
let ca_name = certificate_texts.split("Enterprise CA Name").collect::<Vec<&str>>()[1].split("\n").collect::<Vec<&str>>()[0].split(":").collect::<Vec<&str>>()[1].trim_end().trim_start().to_owned();
|
||||
println!("{ca_name}");
|
||||
let manageca_lines: Vec<&str> = certificate_texts.split("\n").collect();
|
||||
let mut manageca_groups: Vec<&str> = Vec::new();
|
||||
for line in manageca_lines{
|
||||
if line.contains("Allow"){
|
||||
if line.contains("ManageCA"){
|
||||
let group = line.split("\n").collect::<Vec<&str>>()[0].split(" ").collect::<Vec<&str>>()[24];
|
||||
manageca_groups.push(group);
|
||||
}
|
||||
}
|
||||
}
|
||||
let mut manageca = false;
|
||||
for group in groups{
|
||||
if manageca_groups.contains(&group){
|
||||
manageca = true;
|
||||
}
|
||||
}
|
||||
|
||||
let enterpriseca = enterpriseca{ca_name: ca_name, manage_ca: manageca};
|
||||
return enterpriseca;
|
||||
}
|
||||
|
||||
fn parse_certificates(certificate_texts: Vec<&str>, groups: &Vec<&str>) -> Vec<certificate>{
|
||||
let mut certificates: Vec<certificate> = Vec::new();
|
||||
for certificate in certificate_texts{
|
||||
let mut client_auth = false;
|
||||
let mut enrollee_supplies_subject = false;
|
||||
let mut write_owner_groups: Vec<&str> = Vec::new();
|
||||
let mut writedacl_groups: Vec<&str> = Vec::new();
|
||||
let mut fullcontrol_groups: Vec<&str> = Vec::new();
|
||||
let certificate_name = certificate.split("\n").collect::<Vec<&str>>()[0].split(":").collect::<Vec<&str>>()[0].trim_end().trim_start();
|
||||
println!("{certificate_name}");
|
||||
let ca_name = certificate.split("Template Name").collect::<Vec<&str>>()[0].split("\n").collect::<Vec<&str>>()[0].split(":").collect::<Vec<&str>>()[1].trim_end().trim_start();
|
||||
if certificate.contains("Client Authentication"){
|
||||
client_auth = true;
|
||||
}
|
||||
if certificate.contains("ENROLLEE_SUPPLIES_SUBJECT"){
|
||||
enrollee_supplies_subject = true;
|
||||
}
|
||||
let permissions = certificate.split("Permissions").collect::<Vec<&str>>()[1];
|
||||
let mut current_permission = "unknown";
|
||||
for line in permissions.split("\n"){
|
||||
if line.contains("\\"){
|
||||
if line.contains(":"){
|
||||
let line_split: Vec<&str> = line.split(":").collect();
|
||||
let group = line_split[1].split("S").collect::<Vec<&str>>()[0].trim_end().trim_start();
|
||||
current_permission = line_split[0];
|
||||
if current_permission.contains("WriteOnwer"){
|
||||
write_owner_groups.push(group);
|
||||
}
|
||||
else if current_permission.contains("WriteDacl"){
|
||||
writedacl_groups.push(group);
|
||||
}
|
||||
else if current_permission.contains("Full Control"){
|
||||
fullcontrol_groups.push(group);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
let mut writedacl = false;
|
||||
let mut full = false;
|
||||
for group in groups{
|
||||
writedacl = write_owner_groups.contains(group) || writedacl_groups.contains(group);
|
||||
full = fullcontrol_groups.contains(group);
|
||||
}
|
||||
let new_certificate = certificate{writedacl: writedacl, full: full, client_auth: client_auth, enrollee_supplies_subject: enrollee_supplies_subject, template_name: certificate_name.to_owned(), ca: ca_name.to_owned()};
|
||||
certificates.push(new_certificate);
|
||||
}
|
||||
return certificates;
|
||||
}
|
||||
fn main() {
|
||||
print!("
|
||||
_ __ __ __ ______ __ _ ____ ____
|
||||
| | / /__ / /________ ____ ___ ___ / /_____ / ____/__ _____/ /_(_) __/_ __ / __ \\____ ______________ _____
|
||||
| | /| / / _ \\/ / ___/ __ \\/ __ `__ \\/ _ \\ / __/ __ \\ / / / _ \\/ ___/ __/ / /_/ / / / / /_/ / __ `/ ___/ ___/ _ \\/ ___/
|
||||
| |/ |/ / __/ / /__/ /_/ / / / / / / __/ / /_/ /_/ / / /___/ __/ / / /_/ / __/ /_/ / / ____/ /_/ / / (__ ) __/ /
|
||||
|__/|__/\\___/_/\\___/\\____/_/ /_/ /_/\\___/ \\__/\\____/ \\____/\\___/_/ \\__/_/_/ \\__, /____/_/ \\__,_/_/ /____/\\___/_/
|
||||
");
|
||||
let args: Vec<String> = env::args().collect();
|
||||
if args.len() < 2{
|
||||
print!("
|
||||
USAGE:
|
||||
certify_parser /path/to/certify/output/text/file /path/to/list/of/user/groups
|
||||
");
|
||||
}
|
||||
else{
|
||||
let user_groups: Vec<&str> = Vec::new();
|
||||
let certificates: Vec<certificate> = Vec::new();
|
||||
let group_string = fs::read_to_string(&args[2]).expect("error reading groups file");
|
||||
let certify_output_string = fs::read_to_string(&args[1]).expect("error reading certify file");
|
||||
let certificate_texts: Vec<&str> = certify_output_string.split("[*] Available Certificates Templates :").collect::<Vec<&str>>()[1].split("CA Name").collect();
|
||||
let enterprise_cas = certify_output_string.split("[*] Available Certificates Templates :").collect::<Vec<&str>>()[0];
|
||||
let group_string_lines: Vec<&str> = group_string.split("\n").collect();
|
||||
println!("gathering user groups from text file...");
|
||||
for line in group_string_lines{
|
||||
if line.len()>0{
|
||||
let line_split:Vec<&str> = line.split(" ").collect();
|
||||
let group_name = line_split[0];
|
||||
println!("{group_name}");
|
||||
}
|
||||
}
|
||||
println!("groups gathered successfully");
|
||||
println!("gathering certificate information...");
|
||||
let enterpriseca = parse_enterprise_ca(&enterprise_cas, &user_groups);
|
||||
let certificates = parse_certificates(certificate_texts, &user_groups);
|
||||
println!("DONE PARSING! {} Certificate Templates Discovered!!!", certificates.len());
|
||||
println!("\n\n\n\n\n\n");
|
||||
if enterpriseca.manage_ca == true{
|
||||
println!("we Can Manage The CA!!!!!!!");
|
||||
println!("{}",enterpriseca.ca_name);
|
||||
println!("\n\n\n");
|
||||
}
|
||||
println!("collecting certificates into useful groupings...\n\n\n");
|
||||
let mut full_control: Vec<certificate> = Vec::new();
|
||||
let mut writedacl: Vec<certificate> = Vec::new();
|
||||
let mut enrollee_supplies: Vec<certificate> = Vec::new();
|
||||
for certificate in certificates{
|
||||
if certificate.client_auth{
|
||||
if certificate.full{
|
||||
full_control.push(certificate);
|
||||
}
|
||||
else if certificate.writedacl{
|
||||
writedacl.push(certificate);
|
||||
}
|
||||
else if certificate.enrollee_supplies_subject{
|
||||
enrollee_supplies.push(certificate);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
if full_control.len()>0{
|
||||
println!("here are the client auth templates we have full control over!\n");
|
||||
for certificate in full_control{
|
||||
println!("CA:{}\nName{}", certificate.ca, certificate.template_name);
|
||||
}
|
||||
println!("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
|
||||
}
|
||||
if writedacl.len()>0{
|
||||
println!("here are the client auth templates we have writedacl to");
|
||||
for certificate in writedacl{
|
||||
println!("CA:{}\nName{}", certificate.ca, certificate.template_name);
|
||||
}
|
||||
println!("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
|
||||
}
|
||||
if enrollee_supplies.len()>0{
|
||||
println!("here are the client auth templates where enrolee supplies alt name");
|
||||
for certificate in enrollee_supplies{
|
||||
println!("CA:{}\nName{}", certificate.ca, certificate.template_name);
|
||||
}
|
||||
println!("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user