use std::error::Error;
use ms_lsad::LsadClient;
use smb2_client::SmbClient;
#[tokio::main(flavor = "current_thread")]
async fn main() -> Result<(), Box<dyn Error>> {
let args: Vec<String> = std::env::args().collect();
if args.len() < 5 {
eprintln!(
"usage: {} <host> <domain> <user> <password>",
args.first().map(String::as_str).unwrap_or("enum_trusts")
);
std::process::exit(2);
}
let host = &args[1];
let domain = &args[2];
let user = &args[3];
let password = &args[4];
eprintln!("[+] connecting to \\\\{host}\\IPC$ as {domain}\\{user}");
let mut smb = SmbClient::connect(host).await?;
smb.login(host, domain, user, password).await?;
smb.tree_connect(&format!("\\\\{host}\\IPC$")).await?;
eprintln!("[+] opening \\PIPE\\lsarpc");
let pipe = smb.open_pipe("lsarpc").await?;
eprintln!("[+] binding MS-LSAD interface + LsarOpenPolicy2");
let mut client = LsadClient::bind(&mut smb, pipe).await?;
eprintln!("[+] calling LsarEnumerateTrustedDomains (opnum 13)");
let trusts = client.enumerate_trusts("").await?;
println!("=== {} trust(s) enumerated ===", trusts.len());
for t in &trusts {
println!(" {} {}", t.sid, t.name);
}
Ok(())
}