Class: Rex::Post::Meterpreter::Extensions::Stdapi::Net::SocketSubsystem::UdpChannel
- Inherits:
-
Datagram
- Object
- Channel
- Datagram
- Rex::Post::Meterpreter::Extensions::Stdapi::Net::SocketSubsystem::UdpChannel
- Defined in:
- lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/udp_channel.rb
Instance Attribute Summary
Attributes inherited from Channel
#cid, #client, #cls, #flags, #params, #type
Class Method Summary collapse
-
.cls ⇒ Object
We are a datagram channel.
-
.open(client, params) ⇒ Channel
Open a new UDP channel on the remote end.
Instance Method Summary collapse
-
#initialize(client, cid, type, flags, packet, sock_params: nil) ⇒ UdpChannel
constructor
Simply initialize this instance.
-
#send(buf, flags, a = nil, b = nil) ⇒ Object
This function is called by Rex::Socket::Udp.sendto and writes data to a specified remote peer host/port via the remote end of the channel.
Methods inherited from Datagram
Methods included from SocketAbstraction
#_write, #cleanup, #dio_close_handler, #dio_write_handler
Methods inherited from Channel
_close, #_close, #_read, #_write, #cleanup, #close, #close_read, #close_write, #closed?, create, #dio_close_handler, #dio_handler, #dio_map, #dio_read_handler, #dio_write_handler, finalize, #flag?, #interactive, #read, request_handler, #synchronous?, #write
Methods included from InboundPacketHandler
#request_handler, #response_handler
Constructor Details
#initialize(client, cid, type, flags, packet, sock_params: nil) ⇒ UdpChannel
Simply initialize this instance.
64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 |
# File 'lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/udp_channel.rb', line 64 def initialize(client, cid, type, flags, packet, sock_params: nil) super(client, cid, type, flags, packet) lsock.extend(Rex::Socket::Udp) lsock.initsock lsock.extend(SocketInterface) lsock.extend(DirectChannelWrite) lsock.channel = self # rsock.extend( Rex::Socket::Udp ) rsock.extend(SocketInterface) rsock.channel = self unless sock_params.nil? @params = sock_params.merge(Socket.parameters_from_response(packet)) end end |
Class Method Details
.cls ⇒ Object
We are a datagram channel.
23 24 25 |
# File 'lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/udp_channel.rb', line 23 def self.cls CHANNEL_CLASS_DATAGRAM end |
.open(client, params) ⇒ Channel
Open a new UDP channel on the remote end. The local host/port are optional, if none are specified the remote end will bind to INADDR_ANY with a random port number. The peer host/port are also optional, if specified all default send(), write() call will sendto the specified peer. If no peer host/port is specified you must use sendto() and specify the remote peer you wish to send to. This effectivly lets us create bound/unbound and connected/unconnected UDP sockets with ease.
37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
# File 'lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/udp_channel.rb', line 37 def self.open(client, params) Channel.create(client, 'stdapi_net_udp_client', self, CHANNEL_FLAG_SYNCHRONOUS, [ { 'type' => TLV_TYPE_LOCAL_HOST, 'value' => params.localhost }, { 'type' => TLV_TYPE_LOCAL_PORT, 'value' => params.localport }, { 'type' => TLV_TYPE_PEER_HOST, 'value' => params.peerhost }, { 'type' => TLV_TYPE_PEER_PORT, 'value' => params.peerport } ], sock_params: params ) end |
Instance Method Details
#send(buf, flags, a = nil, b = nil) ⇒ Object
This function is called by Rex::Socket::Udp.sendto and writes data to a specified remote peer host/port via the remote end of the channel.
This should work just like a UDPSocket.send method
send(mesg, flags, host, port) => numbytes_sent click to toggle source send(mesg, flags, sockaddr_to) => numbytes_sent send(mesg, flags) => numbytes_sent
92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 |
# File 'lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/udp_channel.rb', line 92 def send(buf, flags, a = nil, b = nil) host = nil port = nil if a && b.nil? _, host, port = Rex::Socket.from_sockaddr(a) elsif a && b host = a port = b end addends = nil if host && port addends = [ { 'type' => TLV_TYPE_PEER_HOST, 'value' => host }, { 'type' => TLV_TYPE_PEER_PORT, 'value' => port } ] end _write(buf, buf.length, addends) end |