Module: Sockit::V5::Connection

Included in:
Sockit
Defined in:
lib/sockit/v5/connection.rb

Instance Method Summary (collapse)

Instance Method Details

- (Object) build_v5_connection_request(host, port)

SOCKS v5 Client Connection Request field 1: SOCKS version number, 1 byte (must be 0x05 for this version) field 2: command code, 1 byte: 0x01 = establish a TCP/IP stream connection 0x02 = establish a TCP/IP port binding 0x03 = associate a UDP port field 3: reserved, must be 0x00 field 4: address type, 1 byte: 0x01 = IPv4 address 0x03 = Domain name 0x04 = IPv6 address field 5: destination address of 4 bytes for IPv4 address 1 byte of name length followed by the name for Domain name 16 bytes for IPv6 address field 6: port number in a network byte order, 2 bytes



21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# File 'lib/sockit/v5/connection.rb', line 21

def build_v5_connection_request(host, port)
  data = Array.new
  data << [config.version.to_i, 0x01, 0x00].pack("C*")

  if host =~ /^(\d+)\.(\d+)\.(\d+)\.(\d+)$/
    data << [0x01].pack("C*")
    data << [$1.to_i, $2.to_i, $3.to_i, $4.to_i].pack("C*")
  elsif host =~ /^[:0-9a-f]+$/
    data << [0x04].pack("C*")
    data << [$1].pack("C*")
  else
    data << [0x03].pack("C*")
    data << [host.length.to_i].pack("C*")
    data << host
  end
  data << [port.to_i].pack("n")

  data
end

- (Object) process_v5_connection_response(socket)

SOCKS v5 Server Connection Response field 1: SOCKS protocol version, 1 byte (0x05 for this version) field 2: status, 1 byte: 0x00 = request granted 0x01 = general failure 0x02 = connection not allowed by ruleset 0x03 = network unreachable 0x04 = host unreachable 0x05 = connection refused by destination host 0x06 = TTL expired 0x07 = command not supported / protocol error 0x08 = address type not supported field 3: reserved, must be 0x00 field 4: address type, 1 byte: 0x01 = IPv4 address 0x03 = Domain name 0x04 = IPv6 address field 5: destination address of 4 bytes for IPv4 address 1 byte of name length followed by the name for Domain name 16 bytes for IPv6 address field 6: network byte order port number, 2 bytes



63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
# File 'lib/sockit/v5/connection.rb', line 63

def process_v5_connection_response(socket)
  packet = socket.recv(4).unpack("C*")
  dump(:read, packet)
  socks_version = packet[0]
  result_code = packet[1]
  reserved = packet[2]
  address_type = packet[3]

  if result_code == 0x00
    log(:green, build_v5_result_code_message(result_code))
  else
    raise SockitError, build_v5_result_code_message(result_code)
  end

  address_length = case address_type
  when 0x01 then
    4
  when 0x03 then
    data = socket.recv(1).unpack("C*")
    dump(:read, data)
    data[0]
  when 0x04 then
    16
  end
  host = socket.recv(address_length).unpack("C*")
  dump(:read, host)

  port = socket.recv(2).unpack("n")
  dump(:read, port)

  [host.join('.'), port.join]
end