From 1dfd7e0499728728db624314d58eea0f85d3e19f Mon Sep 17 00:00:00 2001 From: Andrew Rioux Date: Thu, 19 Sep 2024 02:42:32 -0400 Subject: [PATCH] fix: more cleaning up for FreeBSD --- Cargo.lock | 6 ++-- flake.lock | 13 +++++++++ flake.nix | 29 +++++++++++++++++-- pcap-sys/build.rs | 1 - pcap-sys/src/lib.rs | 2 +- rust-toolchain.bsd.toml | 5 ---- sparse-05/sparse-05-client/Cargo.toml | 4 +-- .../src/commands/connect/commands/sysinfo.rs | 3 +- sparse-05/sparse-05-client/src/options.rs | 1 + sparse-05/sparse-05-common/Cargo.toml | 2 +- sparse-05/sparse-05-server/Cargo.toml | 4 +-- sparse-05/sparse-05-server/src/interface.rs | 17 +++++------ 12 files changed, 58 insertions(+), 29 deletions(-) delete mode 100644 rust-toolchain.bsd.toml diff --git a/Cargo.lock b/Cargo.lock index 858d063..8652435 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1316,7 +1316,7 @@ dependencies = [ [[package]] name = "sparse-05-client" -version = "0.5.0" +version = "0.7.0" dependencies = [ "ansi_term", "anyhow", @@ -1335,7 +1335,7 @@ dependencies = [ [[package]] name = "sparse-05-common" -version = "0.1.0" +version = "0.7.0" dependencies = [ "ecies-ed25519", "ed25519-dalek", @@ -1346,7 +1346,7 @@ dependencies = [ [[package]] name = "sparse-05-server" -version = "0.5.0" +version = "0.7.0" dependencies = [ "anyhow", "catconf", diff --git a/flake.lock b/flake.lock index 5932a7d..2d8aa37 100644 --- a/flake.lock +++ b/flake.lock @@ -77,6 +77,18 @@ "type": "github" } }, + "freebsd": { + "flake": false, + "locked": { + "narHash": "sha256-rKgZfcUDZpwF8Pi7Ybh+fSIRsVZshOgX5Qe2owMxKLQ=", + "type": "file", + "url": "https://download.freebsd.org/releases/ISO-IMAGES/14.1/FreeBSD-14.1-RELEASE-amd64-dvd1.iso" + }, + "original": { + "type": "file", + "url": "https://download.freebsd.org/releases/ISO-IMAGES/14.1/FreeBSD-14.1-RELEASE-amd64-dvd1.iso" + } + }, "libnl": { "flake": false, "locked": { @@ -130,6 +142,7 @@ "crane": "crane", "fenix": "fenix", "flake-utils": "flake-utils", + "freebsd": "freebsd", "libnl": "libnl", "libpcap-src": "libpcap-src", "nixpkgs": "nixpkgs", diff --git a/flake.nix b/flake.nix index 16512cd..dea2bc1 100644 --- a/flake.nix +++ b/flake.nix @@ -29,15 +29,36 @@ url = "https://www.winpcap.org/install/bin/WpdPack_4_1_2.zip"; flake = false; }; + + freebsd = { + url = + "https://download.freebsd.org/releases/ISO-IMAGES/14.1/FreeBSD-14.1-RELEASE-amd64-dvd1.iso"; + flake = false; + }; }; outputs = { self, nixpkgs, flake-utils, crane, fenix, rust-overlay - , libpcap-src, libnl, winpcap }: + , libpcap-src, libnl, winpcap, freebsd }: flake-utils.lib.eachDefaultSystem (system: let pkgs = import nixpkgs { inherit system; overlays = [ (import rust-overlay) fenix.overlays.default ]; + config.allowUnfree = true; + }; + + freebsdVm = pkgs.stdenv.mkDerivation { + name = "sparse-freebsd-vm"; + + buildInputs = with pkgs; [ qemu xz libguestfs ]; + + unpackPhase = '' + mkdir -p $out/vm + cp ${freebsd} $out/vm/freebsd.qcow2.xz + xz -d $out/vm/freebsd.qcow2.xz + ''; + + installPhase = "\n"; }; buildTools = with pkgs; [ @@ -156,16 +177,18 @@ devShells.default = craneLib.devShell { name = "sparse"; - buildInputs = windowsBuildTools ++ [ rust-analyzer rustup ]; + buildInputs = windowsBuildTools ++ [ rust-analyzer packer ]; SPARSE_BUILD_WINPCAP = "${winpcap}/Lib"; SPARSE_BUILD_LIBPCAP = "${libpcap-src}"; SPARSE_BUILD_LIBNL = "${libnl}"; + + FREEBSD_ISO = "${freebsd}"; }; packages = { inherit sparse-05-linux-server sparse-05-windows-server - sparse-05-windows-service sparse-05-client; + sparse-05-windows-service sparse-05-client freebsdVm; inherit sparse-c2-linux-beacon sparse-c2-server sparse-c2-client; diff --git a/pcap-sys/build.rs b/pcap-sys/build.rs index 0f80de9..465abe7 100644 --- a/pcap-sys/build.rs +++ b/pcap-sys/build.rs @@ -42,7 +42,6 @@ fn main() { .define("DISABLE_TC", "ON") .build(); - // panic!("hahahahah test {}", dst.display()); println!("cargo:rustc-link-search=native={}/lib", dst.display()); println!("cargo:rustc-link-search=native={}/lib64", dst.display()); println!("cargo:rustc-link-lib=static=pcap"); diff --git a/pcap-sys/src/lib.rs b/pcap-sys/src/lib.rs index 10a9cdc..c41403e 100644 --- a/pcap-sys/src/lib.rs +++ b/pcap-sys/src/lib.rs @@ -228,7 +228,7 @@ impl Interface { } pub fn activate(mut self) -> error::Result> { - if unsafe { dbg!(ffi::pcap_activate(self.dev)) } != 0 { + if unsafe { ffi::pcap_activate(self.dev) } != 0 { Err(unsafe { ffi::pcap_geterr(self.dev) })?; } diff --git a/rust-toolchain.bsd.toml b/rust-toolchain.bsd.toml deleted file mode 100644 index de79e7b..0000000 --- a/rust-toolchain.bsd.toml +++ /dev/null @@ -1,5 +0,0 @@ -[toolchain] -channel = "stable" -components = [] -targets = [ "x86_64-unknown-freebsd" ] -profile = "minimal" diff --git a/sparse-05/sparse-05-client/Cargo.toml b/sparse-05/sparse-05-client/Cargo.toml index d0071c4..0ca3c40 100644 --- a/sparse-05/sparse-05-client/Cargo.toml +++ b/sparse-05/sparse-05-client/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sparse-05-client" -version = "0.5.0" +version = "0.7.0" edition = "2021" [dependencies] @@ -12,7 +12,7 @@ libc = "0.2.147" rand = "0.7" rmp-serde = "1.1.2" serde = { version = "1.0.188", features = ["derive"] } -sparse-05-common = { version = "0.1.0", path = "../sparse-05-common" } +sparse-05-common = { version = "0.7.0", path = "../sparse-05-common" } structopt = { version = "0.3.26", features = ["paw"] } tempfile = "3.8.0" tokio = { version = "1.32.0", features = ["full"] } diff --git a/sparse-05/sparse-05-client/src/commands/connect/commands/sysinfo.rs b/sparse-05/sparse-05-client/src/commands/connect/commands/sysinfo.rs index 0fcddae..f3d36b4 100644 --- a/sparse-05/sparse-05-client/src/commands/connect/commands/sysinfo.rs +++ b/sparse-05/sparse-05-client/src/commands/connect/commands/sysinfo.rs @@ -10,6 +10,7 @@ pub fn print_capabilities(capabilities: &Capabilities, ip: &IpAddr) { "\tOperating system: \t{}", match &capabilities.operating_system { OperatingSystem::Linux => "Linux", + OperatingSystem::FreeBSD => "FreeBSD", OperatingSystem::Windows => "Windows", } ); @@ -57,7 +58,7 @@ pub fn print_capabilities(capabilities: &Capabilities, ip: &IpAddr) { } ); } - OperatingSystem::Windows => { + OperatingSystem::Windows | OperatingSystem::FreeBSD => { println!( "\tAdmin user: \t\t{}", match capabilities.root { diff --git a/sparse-05/sparse-05-client/src/options.rs b/sparse-05/sparse-05-client/src/options.rs index 1107d30..0533f1e 100644 --- a/sparse-05/sparse-05-client/src/options.rs +++ b/sparse-05/sparse-05-client/src/options.rs @@ -26,6 +26,7 @@ impl std::str::FromStr for TargetOs { fn from_str(input: &str) -> Result { match input { "linux" => Ok(Self::Linux), + "freebsd" => Ok(Self::FreeBSD), "windows" => Ok(Self::Windows), "windows-service" => Ok(Self::WindowsService), _ => Err("could not parse target operating system"), diff --git a/sparse-05/sparse-05-common/Cargo.toml b/sparse-05/sparse-05-common/Cargo.toml index 49f6179..4c36e79 100644 --- a/sparse-05/sparse-05-common/Cargo.toml +++ b/sparse-05/sparse-05-common/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sparse-05-common" -version = "0.1.0" +version = "0.7.0" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/sparse-05/sparse-05-server/Cargo.toml b/sparse-05/sparse-05-server/Cargo.toml index f930221..c43f510 100644 --- a/sparse-05/sparse-05-server/Cargo.toml +++ b/sparse-05/sparse-05-server/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sparse-05-server" -version = "0.5.0" +version = "0.7.0" edition = "2021" [dependencies] @@ -13,7 +13,7 @@ libc = { version = "0.2.147" } serde = { version = "1.0.188", features = ["derive"] } rmp-serde = "1.1.2" catconf = "0.1.2" -sparse-05-common = { version = "0.1.0", path = "../sparse-05-common" } +sparse-05-common = { version = "0.7.0", path = "../sparse-05-common" } ecies-ed25519 = { version = "0.5.1", features = ["serde"] } packets = { path = "../../packets" } pcap-sys = { path = "../../pcap-sys", optional = true } diff --git a/sparse-05/sparse-05-server/src/interface.rs b/sparse-05/sparse-05-server/src/interface.rs index a96dd20..f62d3a1 100644 --- a/sparse-05/sparse-05-server/src/interface.rs +++ b/sparse-05/sparse-05-server/src/interface.rs @@ -34,7 +34,7 @@ impl Interface { .ok_or(anyhow!("could not get an ethernet interface"))? } else { interfaces - .find(|eth| eth.starts_with("eth") || eth.starts_with("en")) + .find(|eth| eth.starts_with("eth") || eth.starts_with("en") || eth.starts_with("vtnet") || eth.starts_with("vmx")) .ok_or(anyhow!("could not get an ethernet interface"))? }; @@ -57,27 +57,24 @@ impl Interface { }}; } + log::debug!("opening interface {interface_name}..."); let mut interface = retry!(pcap_sys::Interface::::new( &interface_name )); - retry!(interface.set_buffer_size(1024)); + retry!(interface.set_buffer_size(2048)); retry!(interface.set_non_blocking(false)); retry!(interface.set_promisc(false)); retry!(interface.set_timeout(10)); - log::debug!("Configured raw listener interface"); - let interface = retry!(interface.activate()); - log::debug!("Activated raw listener interface"); - - if cfg!(windows) { - retry!(interface.set_filter(&format!("udp port {port}"), true, None)); - } else { + log::debug!("setting pcap filter"); + if cfg!(linux) { retry!(interface.set_filter(&format!("inbound and udp port {port}"), true, None)); + } else { + retry!(interface.set_filter(&format!("udp port {port}"), true, None)); } - log::debug!("Updated filter for listener interface"); if interface.datalink() != pcap_sys::consts::DLT_EN10MB {