Class: Rex::Proto::SunRPC::Client

Inherits:
Object
  • Object
show all
Defined in:
lib/rex/proto/sunrpc/client.rb

Overview

XXX: CPORT!

Constant Summary collapse

AUTH_NULL =
0
AUTH_UNIX =
1
PMAP_PROG =
100000
PMAP_VERS =
2
PMAP_GETPORT =
3
CALL =
0

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(opts) ⇒ Client

Returns a new instance of Client


35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# File 'lib/rex/proto/sunrpc/client.rb', line 35

def initialize(opts)
  self.rhost   = opts[:rhost]
  self.rport   = opts[:rport]
  self.program = opts[:program]
  self.version = opts[:version]
  self.timeout = opts[:timeout] || 20
  self.context = opts[:context] || {}
  self.proto   = opts[:proto]

  if self.proto.downcase !~ /^(tcp|udp)$/
    raise ::Rex::ArgumentError, 'Protocol is not "tcp" or "udp"'
  end

  @pport = nil

  @auth_type = AUTH_NULL
  @auth_data = ''

  @call_sock = nil
end

Instance Attribute Details

#call_sockObject

Returns the value of attribute call_sock


31
32
33
# File 'lib/rex/proto/sunrpc/client.rb', line 31

def call_sock
  @call_sock
end

#contextObject

Returns the value of attribute context


31
32
33
# File 'lib/rex/proto/sunrpc/client.rb', line 31

def context
  @context
end

#pportObject

Returns the value of attribute pport


31
32
33
# File 'lib/rex/proto/sunrpc/client.rb', line 31

def pport
  @pport
end

#programObject

Returns the value of attribute program


30
31
32
# File 'lib/rex/proto/sunrpc/client.rb', line 30

def program
  @program
end

#protoObject

Returns the value of attribute proto


30
31
32
# File 'lib/rex/proto/sunrpc/client.rb', line 30

def proto
  @proto
end

#rhostObject

Returns the value of attribute rhost


30
31
32
# File 'lib/rex/proto/sunrpc/client.rb', line 30

def rhost
  @rhost
end

#rportObject

Returns the value of attribute rport


30
31
32
# File 'lib/rex/proto/sunrpc/client.rb', line 30

def rport
  @rport
end

#should_fragmentObject

Returns the value of attribute should_fragment


33
34
35
# File 'lib/rex/proto/sunrpc/client.rb', line 33

def should_fragment
  @should_fragment
end

#timeoutObject

Returns the value of attribute timeout


31
32
33
# File 'lib/rex/proto/sunrpc/client.rb', line 31

def timeout
  @timeout
end

#versionObject

Returns the value of attribute version


30
31
32
# File 'lib/rex/proto/sunrpc/client.rb', line 30

def version
  @version
end

Instance Method Details

#authnull_createObject


97
98
99
100
# File 'lib/rex/proto/sunrpc/client.rb', line 97

def authnull_create
  @auth_type = AUTH_NULL
  @auth_data = ''
end

#authunix_create(host, uid, gid, groupz) ⇒ Object


102
103
104
105
106
107
108
109
110
# File 'lib/rex/proto/sunrpc/client.rb', line 102

def authunix_create(host, uid, gid, groupz)
  raise ::Rex::ArgumentError, 'Hostname length is too long' if host.length > 255
# 10?
  raise ::Rex::ArgumentError, 'Too many groups' if groupz.length > 10

  @auth_type = AUTH_UNIX
  @auth_data =
    Rex::Encoder::XDR.encode(0, host, uid, gid, groupz) # XXX: TIME! GROUPZ?!
end

#call(procedure, buffer, maxwait = self.timeout) ⇒ Object


78
79
80
81
82
83
84
85
86
87
88
89
90
# File 'lib/rex/proto/sunrpc/client.rb', line 78

def call(procedure, buffer, maxwait = self.timeout)
  buf =
    Rex::Encoder::XDR.encode(CALL, 2, @program, @version, procedure,
      @auth_type, [@auth_data, 400], AUTH_NULL, '')+
    buffer

  if ! @call_sock
    @call_sock = make_rpc(@proto, @rhost, @pport)
  end

  send_rpc(@call_sock, buf)
  recv_rpc(@call_sock, maxwait)
end

#createObject

XXX: Add optional parameter to have proto be something else


57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
# File 'lib/rex/proto/sunrpc/client.rb', line 57

def create()
  proto_num = 0
  if @proto.eql?('tcp')
    proto_num = 6
  elsif @proto.eql?('udp')
    proto_num = 17
  end

  buf =
    Rex::Encoder::XDR.encode(CALL, 2, PMAP_PROG, PMAP_VERS, PMAP_GETPORT,
      @auth_type, [@auth_data, 400], AUTH_NULL, '',
      @program, @version, proto_num, 0)

  sock = make_rpc(@proto, @rhost, @rport)
  send_rpc(sock, buf)
  ret = recv_rpc(sock)
  close_rpc(sock)

  return ret
end

#destroyObject


92
93
94
95
# File 'lib/rex/proto/sunrpc/client.rb', line 92

def destroy
  close_rpc(@call_sock) if @call_sock
  @call_sock = nil
end

#portmap_req(host, port, rpc_vers, procedure, buffer) ⇒ Object

XXX: Dirty, integrate some sort of request system into create/call?


113
114
115
116
117
118
119
120
121
122
123
# File 'lib/rex/proto/sunrpc/client.rb', line 113

def portmap_req(host, port, rpc_vers, procedure, buffer)
  buf = Rex::Encoder::XDR.encode(CALL, 2, PMAP_PROG, rpc_vers, procedure,
    AUTH_NULL, '', AUTH_NULL, '') + buffer

  sock = make_rpc('tcp', host, port)
  send_rpc(sock, buf)
  ret = recv_rpc(sock)
  close_rpc(sock)

  return ret
end