fix: more cleaning up for FreeBSD

This commit is contained in:
Andrew Rioux 2024-09-19 02:42:32 -04:00
parent f6428b92fe
commit 1dfd7e0499
Signed by: andrew.rioux
GPG Key ID: 9B8BAC47C17ABB94
12 changed files with 58 additions and 29 deletions

6
Cargo.lock generated
View File

@ -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",

13
flake.lock generated
View File

@ -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",

View File

@ -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;

View File

@ -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");

View File

@ -228,7 +228,7 @@ impl<T: Disabled> Interface<T> {
}
pub fn activate(mut self) -> error::Result<Interface<DevActivated>> {
if unsafe { dbg!(ffi::pcap_activate(self.dev)) } != 0 {
if unsafe { ffi::pcap_activate(self.dev) } != 0 {
Err(unsafe { ffi::pcap_geterr(self.dev) })?;
}

View File

@ -1,5 +0,0 @@
[toolchain]
channel = "stable"
components = []
targets = [ "x86_64-unknown-freebsd" ]
profile = "minimal"

View File

@ -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"] }

View File

@ -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 {

View File

@ -26,6 +26,7 @@ impl std::str::FromStr for TargetOs {
fn from_str(input: &str) -> Result<Self, Self::Err> {
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"),

View File

@ -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

View File

@ -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 }

View File

@ -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::<pcap_sys::DevDisabled>::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 {