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]] [[package]]
name = "sparse-05-client" name = "sparse-05-client"
version = "0.5.0" version = "0.7.0"
dependencies = [ dependencies = [
"ansi_term", "ansi_term",
"anyhow", "anyhow",
@ -1335,7 +1335,7 @@ dependencies = [
[[package]] [[package]]
name = "sparse-05-common" name = "sparse-05-common"
version = "0.1.0" version = "0.7.0"
dependencies = [ dependencies = [
"ecies-ed25519", "ecies-ed25519",
"ed25519-dalek", "ed25519-dalek",
@ -1346,7 +1346,7 @@ dependencies = [
[[package]] [[package]]
name = "sparse-05-server" name = "sparse-05-server"
version = "0.5.0" version = "0.7.0"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"catconf", "catconf",

13
flake.lock generated
View File

@ -77,6 +77,18 @@
"type": "github" "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": { "libnl": {
"flake": false, "flake": false,
"locked": { "locked": {
@ -130,6 +142,7 @@
"crane": "crane", "crane": "crane",
"fenix": "fenix", "fenix": "fenix",
"flake-utils": "flake-utils", "flake-utils": "flake-utils",
"freebsd": "freebsd",
"libnl": "libnl", "libnl": "libnl",
"libpcap-src": "libpcap-src", "libpcap-src": "libpcap-src",
"nixpkgs": "nixpkgs", "nixpkgs": "nixpkgs",

View File

@ -29,15 +29,36 @@
url = "https://www.winpcap.org/install/bin/WpdPack_4_1_2.zip"; url = "https://www.winpcap.org/install/bin/WpdPack_4_1_2.zip";
flake = false; 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 outputs = { self, nixpkgs, flake-utils, crane, fenix, rust-overlay
, libpcap-src, libnl, winpcap }: , libpcap-src, libnl, winpcap, freebsd }:
flake-utils.lib.eachDefaultSystem (system: flake-utils.lib.eachDefaultSystem (system:
let let
pkgs = import nixpkgs { pkgs = import nixpkgs {
inherit system; inherit system;
overlays = [ (import rust-overlay) fenix.overlays.default ]; 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; [ buildTools = with pkgs; [
@ -156,16 +177,18 @@
devShells.default = craneLib.devShell { devShells.default = craneLib.devShell {
name = "sparse"; name = "sparse";
buildInputs = windowsBuildTools ++ [ rust-analyzer rustup ]; buildInputs = windowsBuildTools ++ [ rust-analyzer packer ];
SPARSE_BUILD_WINPCAP = "${winpcap}/Lib"; SPARSE_BUILD_WINPCAP = "${winpcap}/Lib";
SPARSE_BUILD_LIBPCAP = "${libpcap-src}"; SPARSE_BUILD_LIBPCAP = "${libpcap-src}";
SPARSE_BUILD_LIBNL = "${libnl}"; SPARSE_BUILD_LIBNL = "${libnl}";
FREEBSD_ISO = "${freebsd}";
}; };
packages = { packages = {
inherit sparse-05-linux-server sparse-05-windows-server 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; inherit sparse-c2-linux-beacon sparse-c2-server sparse-c2-client;

View File

@ -42,7 +42,6 @@ fn main() {
.define("DISABLE_TC", "ON") .define("DISABLE_TC", "ON")
.build(); .build();
// panic!("hahahahah test {}", dst.display());
println!("cargo:rustc-link-search=native={}/lib", dst.display()); println!("cargo:rustc-link-search=native={}/lib", dst.display());
println!("cargo:rustc-link-search=native={}/lib64", dst.display()); println!("cargo:rustc-link-search=native={}/lib64", dst.display());
println!("cargo:rustc-link-lib=static=pcap"); 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>> { 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) })?; 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] [package]
name = "sparse-05-client" name = "sparse-05-client"
version = "0.5.0" version = "0.7.0"
edition = "2021" edition = "2021"
[dependencies] [dependencies]
@ -12,7 +12,7 @@ libc = "0.2.147"
rand = "0.7" rand = "0.7"
rmp-serde = "1.1.2" rmp-serde = "1.1.2"
serde = { version = "1.0.188", features = ["derive"] } 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"] } structopt = { version = "0.3.26", features = ["paw"] }
tempfile = "3.8.0" tempfile = "3.8.0"
tokio = { version = "1.32.0", features = ["full"] } tokio = { version = "1.32.0", features = ["full"] }

View File

@ -10,6 +10,7 @@ pub fn print_capabilities(capabilities: &Capabilities, ip: &IpAddr) {
"\tOperating system: \t{}", "\tOperating system: \t{}",
match &capabilities.operating_system { match &capabilities.operating_system {
OperatingSystem::Linux => "Linux", OperatingSystem::Linux => "Linux",
OperatingSystem::FreeBSD => "FreeBSD",
OperatingSystem::Windows => "Windows", OperatingSystem::Windows => "Windows",
} }
); );
@ -57,7 +58,7 @@ pub fn print_capabilities(capabilities: &Capabilities, ip: &IpAddr) {
} }
); );
} }
OperatingSystem::Windows => { OperatingSystem::Windows | OperatingSystem::FreeBSD => {
println!( println!(
"\tAdmin user: \t\t{}", "\tAdmin user: \t\t{}",
match capabilities.root { match capabilities.root {

View File

@ -26,6 +26,7 @@ impl std::str::FromStr for TargetOs {
fn from_str(input: &str) -> Result<Self, Self::Err> { fn from_str(input: &str) -> Result<Self, Self::Err> {
match input { match input {
"linux" => Ok(Self::Linux), "linux" => Ok(Self::Linux),
"freebsd" => Ok(Self::FreeBSD),
"windows" => Ok(Self::Windows), "windows" => Ok(Self::Windows),
"windows-service" => Ok(Self::WindowsService), "windows-service" => Ok(Self::WindowsService),
_ => Err("could not parse target operating system"), _ => Err("could not parse target operating system"),

View File

@ -1,6 +1,6 @@
[package] [package]
name = "sparse-05-common" name = "sparse-05-common"
version = "0.1.0" version = "0.7.0"
edition = "2021" edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

View File

@ -1,6 +1,6 @@
[package] [package]
name = "sparse-05-server" name = "sparse-05-server"
version = "0.5.0" version = "0.7.0"
edition = "2021" edition = "2021"
[dependencies] [dependencies]
@ -13,7 +13,7 @@ libc = { version = "0.2.147" }
serde = { version = "1.0.188", features = ["derive"] } serde = { version = "1.0.188", features = ["derive"] }
rmp-serde = "1.1.2" rmp-serde = "1.1.2"
catconf = "0.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"] } ecies-ed25519 = { version = "0.5.1", features = ["serde"] }
packets = { path = "../../packets" } packets = { path = "../../packets" }
pcap-sys = { path = "../../pcap-sys", optional = true } pcap-sys = { path = "../../pcap-sys", optional = true }

View File

@ -34,7 +34,7 @@ impl Interface {
.ok_or(anyhow!("could not get an ethernet interface"))? .ok_or(anyhow!("could not get an ethernet interface"))?
} else { } else {
interfaces 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"))? .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( let mut interface = retry!(pcap_sys::Interface::<pcap_sys::DevDisabled>::new(
&interface_name &interface_name
)); ));
retry!(interface.set_buffer_size(1024)); retry!(interface.set_buffer_size(2048));
retry!(interface.set_non_blocking(false)); retry!(interface.set_non_blocking(false));
retry!(interface.set_promisc(false)); retry!(interface.set_promisc(false));
retry!(interface.set_timeout(10)); retry!(interface.set_timeout(10));
log::debug!("Configured raw listener interface");
let interface = retry!(interface.activate()); let interface = retry!(interface.activate());
log::debug!("Activated raw listener interface"); log::debug!("setting pcap filter");
if cfg!(linux) {
if cfg!(windows) {
retry!(interface.set_filter(&format!("udp port {port}"), true, None));
} else {
retry!(interface.set_filter(&format!("inbound and udp port {port}"), true, None)); 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"); log::debug!("Updated filter for listener interface");
if interface.datalink() != pcap_sys::consts::DLT_EN10MB { if interface.datalink() != pcap_sys::consts::DLT_EN10MB {