metasploit-framework/lib/rex/post/dispatch_ninja/client.rb

85 lines
1.5 KiB
Ruby

#!/usr/bin/env ruby
require 'rex/post/dispatch_ninja/file'
require 'rex/post/dispatch_ninja/file_stat'
require 'rex/post/dispatch_ninja/process'
require 'rex/post/dispatch_ninja/dir'
module Rex
module Post
module DispatchNinja
class Client
private
attr_accessor :sock
public
def initialize(sock)
self.sock = sock
checksig()
end
# Get a File-like class
def file
brand(Rex::Post::DispatchNinja::File)
end
# Get a File::Stat-like class
def filestat
brand(Rex::Post::DispatchNinja::FileStat)
end
# Get a Process-like class
def process
brand(Rex::Post::DispatchNinja::Process)
end
# Get a Dir-like class
def dir
brand(Rex::Post::DispatchNinja::Dir)
end
def sendmodule(name)
name = 'lib/Rex/Post/DispatchNinja/modules/' + name
data = ::IO.readlines(name, '')[0]
sockwrite([data.length].pack('V'))
sockwrite(data)
end
def checksig
if !select( [ sock ], nil, nil, 2)
puts "Possible sync problem?"
else
sig = sockread(4)
if sig != "AAAA"
puts "Sig #{sig} didn't match"
end
end
end
def sendfilename(dir)
dir += "\x00" # null terminate filename for easy syscall
sockwrite( [ dir.length ].pack('V') )
sockwrite(dir)
end
# do true full read/write, blocking. So if I say read 4 bytes, I'll
# block until I get all 4 bytes
def sockwrite(data)
sock.write(data)
end
def sockread(len)
return sock.read(len)
end
protected
def brand(klass)
klass = klass.dup
klass.client = self
return klass
end
end
end; end; end # DispatchNinja/Post/Rex