Module: Sockit::V5::Connection
- Included in:
- Sockit
- Defined in:
- lib/sockit/v5/connection.rb
Instance Method Summary (collapse)
-
- (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.
-
- (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.
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, (result_code)) else raise SockitError, (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 |