Module: Rex::Proto::Proxy::Socks4a::Client::Relay

Defined in:
lib/rex/proto/proxy/socks4a.rb

Overview

A mixin for a socket to perform a relay to another socket.

Instance Method Summary collapse

Instance Method Details

#relay(relay_client, relay_sock) ⇒ Object

Relay data coming in from relay_sock to this socket.


165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
# File 'lib/rex/proto/proxy/socks4a.rb', line 165

def relay( relay_client, relay_sock )
  @relay_client = relay_client
  @relay_sock   = relay_sock
  # start the relay thread (modified from Rex::IO::StreamAbstraction)
  @relay_thread = Rex::ThreadFactory.spawn("SOCKS4AProxyServerRelay", false) do
    loop do
      closed = false
      buf    = nil

      begin
        s = Rex::ThreadSafe.select( [ @relay_sock ], nil, nil, 0.2 )
        if( s == nil || s[0] == nil )
          next
        end
      rescue
        closed = true
      end

      if( closed == false )
        begin
          buf = @relay_sock.sysread( 32768 )
          closed = true if( buf == nil )
        rescue
          closed = true
        end
      end

      if( closed == false )
        total_sent   = 0
        total_length = buf.length
        while( total_sent < total_length )
          begin
            data = buf[total_sent, buf.length]
            sent = self.write( data )
            if( sent > 0 )
              total_sent += sent
            end
          rescue
            closed = true
            break
          end
        end
      end

      if( closed )
        @relay_client.stop
        ::Thread.exit
      end
    end
  end

end