Commit Graph

16 Commits (558d007d8e8d8391c7faf340fe73cc996be57dc1)

Author SHA1 Message Date
RageLtMan c871ceea0a Implement consistent socket abstraction
In current nomenclature, Rex Sockets are objects created by calls
to Rex::Socket::<Transport>.create and Rex::Socket.create_...
When the LocalHost or Comm parameters are set to remotely routed
addresses (currently via Meterpreter sessions), Rex will create a
Channel which will abstract communications with the remote end of
the session. These channel based abstractions are called pivots,
and present in three separate flavors:
1 - TcpClientChannel, a fully abstracted, selectable Socket.
2 - TcpServerChannel, a virtual Channel which distributes client
channels.
3 - UdpChannel, a virtual Channel which provides common methods for
UDP socket operations, but is not a full (selectable) abstraction.

Unfortunately this differentiation results in inconsistent returns
from the aforementioned socket creation calls, as the call chain
creates parameters and supplies them to the create method on the
comm object referenced in the params. The comm object may be a
channel, and produce a virtual representation of a socket with
functional methods analogous to Sockets, but without a kernel FD.

This commit begins the work of ensuring that all calls for socket
creation return selectable Rex::Socket objects with semantics
familiar to Ruby developers who have not read into the details of
Rex::Socket and Rex::Post.

-----

Summary of changes:

Convert Rex::IO::StreamAbstraction to SocketAbstraction and use
the new mixin in StreamAbstraction and DatagramAbstraction. This
approach allows for common methods to reuse the abstraction data
flow, while initializing separate types of socket obects and an
optional monitor as needed.

In the Rex::Post::Meterpreter namespace, extract common methods
from Stream to a SocketAbstraction mixin, include that mixin in
Stream, and add Datagram with the dio_write handler override
exported from the current implementation of UdpChannel, also using
the mixin. This relies on the Rex::IO work above to implement the
proper type of socket abstraction to the Channel descendants.

In Rex::Post::Meterpreter::Extensions::Stdapi::Net, convert the
UdpChannel to inherit from the Rex::Post::Meterpreter::Datagram
class, implementing only the send method at this tier. Convert
create_udp_channel to return the local socket side of the datagram
abstraction presented analogous to the TcpClientChannel approach
used before.

-----

Notes and intricacies:

In order to implement recvfrom on the UDP abstraction, a shim layer
has been put in place to forward the sockaddr information from the
remote peer to the local UDP socketpair in the abstraction. This
information takes up buffer space in the UDP socket, and in order
to maintain compatibility with consumers, the dio_write_handler
pushes the data buffer, and in a separate send call, he sockaddr
information from the remote socket. On the abstraction side, the
recvfrom_nonblock call of the real UDPSocket has been overriden
via the mixed in module to call the real method twice, once for
the data buffer, and once for the packed sockaddr data. The Rex
level consumer for recvfrom calls the underlying nonblock method
and expects this exact set of returns (as opposed to what standard
library UDPSocket.recvfrom returns, which is a data buffer and an
Array of sockaddr data).

-----

Testing:
  Local and lab testing only so far.
  Test RC script to be added in GH comments.

-----

Issues:
  Currently, sendto on a remote socket does not appear to honor
LocalPort which causes DNS responses (#6611) to come from the
wrong port to remote clients being serviced over a pivot socket.
2016-03-21 03:32:52 -04:00
Jonathan 575072585f removed shebangs from files within rex 2013-11-07 18:51:59 -05:00
Tab Assassin 7e5e0f7fc8 Retab lib 2013-08-30 16:28:33 -05:00
HD Moore d656e3185f Mark all libraries as defaulting to 8-bit strings 2012-06-29 00:18:28 -05:00
Stephen Fewer e19633354b Bug fix for a rare edge case with channels. When creating a Rex::Post::Meterpreter::Stream instance we should initialize_abstraction() before super() as we can get a scenario where dio_write_handler() is called with data to write to the rsock but rsock has not yet been initialized. This happens if the channel is registered (client.add_channel(self) in Channel.initialize) to a session and a 'core_channel_write' request comes in before we have called self.initialize_abstraction()
git-svn-id: file:///home/svn/framework3/trunk@8386 4d416f70-5f16-0410-b530-b9f4589650da
2010-02-06 20:12:52 +00:00
HD Moore e731426666 Fixes #662. The socket pivoting is still not perfect, but this goes a long way
git-svn-id: file:///home/svn/framework3/trunk@7792 4d416f70-5f16-0410-b530-b9f4589650da
2009-12-10 05:40:26 +00:00
HD Moore 54c10c0c3d Fixes #623 and fixes #622, implements a number of changes to the core channel dispatch code, sets timeouts on unmatched responses, and handles tcp relay writes with a threaded/timeout wrapper to avoid delays.
git-svn-id: file:///home/svn/framework3/trunk@7753 4d416f70-5f16-0410-b530-b9f4589650da
2009-12-08 18:32:26 +00:00
Ramon de C Valle f124597a56 Code cleanups
git-svn-id: file:///home/svn/framework3/trunk@5773 4d416f70-5f16-0410-b530-b9f4589650da
2008-10-19 21:03:39 +00:00
HD Moore 88658064df /usr/bin/ruby vs /usr/bin/env ruby
git-svn-id: file:///home/svn/incoming/trunk@3242 4d416f70-5f16-0410-b530-b9f4589650da
2005-12-17 06:46:23 +00:00
Matt Miller 95f8210853 major doc update
git-svn-id: file:///home/svn/incoming/trunk@3029 4d416f70-5f16-0410-b530-b9f4589650da
2005-11-15 05:22:13 +00:00
Matt Miller 7eb2c68d58 fix interactive channels
git-svn-id: file:///home/svn/incoming/trunk@2833 4d416f70-5f16-0410-b530-b9f4589650da
2005-07-26 04:08:01 +00:00
Spoon M 7bbae355d6 mass require moving of /lib
git-svn-id: file:///home/svn/incoming/trunk@2690 4d416f70-5f16-0410-b530-b9f4589650da
2005-07-09 21:18:49 +00:00
Spoon M eab910e374 Hopefully this works, trying to move to the new skape code...
git-svn-id: file:///home/svn/incoming/trunk@2672 4d416f70-5f16-0410-b530-b9f4589650da
2005-07-08 00:30:10 +00:00
Matt Miller aeb885372d worked on the socket api some more, tcp client connections working
git-svn-id: file:///home/svn/incoming/trunk@2437 4d416f70-5f16-0410-b530-b9f4589650da
2005-04-21 06:32:01 +00:00
Matt Miller f4264ed7d5 moved registry/process around to be under sys, implemented process.memory and process attaching
git-svn-id: file:///home/svn/incoming/trunk@2377 4d416f70-5f16-0410-b530-b9f4589650da
2005-04-15 06:23:59 +00:00
Matt Miller 3338ebb82c more channel foo
git-svn-id: file:///home/svn/incoming/trunk@2376 4d416f70-5f16-0410-b530-b9f4589650da
2005-04-13 08:19:22 +00:00