SOCKS5 Client in Python3 - Fehler im Handshake

wolfsjunge

Neu angemeldet
Registriert
18 Juli 2013
Beiträge
43
Guten Tag zusammen,

ich möchte gerne in dem asyncio Modul von Python3 SOCKS5 Unterstützung einbauen und arbeite mich daher (trotz des Ungleichgewichts zwischen Schwierigkeit des Unterfangens und meinen Fähigkeiten) in die SOCKS5 Spezifikation ein. Sie ist auf Wikipedia in und zu finden, allerdings gilt wohl als Maßstab.

Ich wollte zunächst einfach feststellen, ob ich in Python einen primitiven Clientprototypen zusammenbauen kann, der nichts anderes tut als den SOCKS5 Handshake zu vollziehen. Ich nehme eine laufende Instanz von Tor als Socks Server. Hier mein Code:
Code:
Expand Collapse Copy
#!/usr/bin/env python3

import sys
import struct
import socket

VER = 0x05
CMD_CONNECT = 0x01
RSV = 0x00

ADDR_IPV4 = 0x01

METHOD = [0x00]
NR_METHODS = len(METHOD)

auth_str = bytes([VER, NR_METHODS, 0x00])  # standard für tor ist NO AUTH

s = socket.socket()

s.connect(("127.0.0.1", 9050))

s.send(auth_str)
resp = s.recv(1024)

if resp[1] == 0xff:
    print("Could not connect.")
    sys.exit(0)

elif resp[1] == 0x00:
    print("No auth was accepted")

s.send(resp)

port_packed = struct.pack('!H', 80)
connection_request = bytes(
    [VER, CMD_CONNECT, RSV, ADDR_IPV4, 64, 15, 112, 182]) + port_packed
print("Connection request: {}" .format(connection_request))

s.send(connection_request)

resp = s.recv(1024)
print("Antwort: {}". format(resp))

Zunächst einige ich mich mit dem Proxy darauf, dass keine Authentifizierung notwendig ist, danach schicke ich meine Verbindungsanfrage. Der Aufbau dieser Anfrage sieht wie folgt aus (kopiert aus dem RFC 1928):
Code:
Expand Collapse Copy
The SOCKS request is formed as follows:

        +----+-----+-------+------+----------+----------+
        |VER | CMD |  RSV  | ATYP | DST.ADDR | DST.PORT |
        +----+-----+-------+------+----------+----------+
        | 1  |  1  | X'00' |  1   | Variable |    2     |
        +----+-----+-------+------+----------+----------+

     Where:

          o  VER    protocol version: X'05'
          o  CMD
             o  CONNECT X'01'
             o  BIND X'02'
             o  UDP ASSOCIATE X'03'
          o  RSV    RESERVED
          o  ATYP   address type of following address
             o  IP V4 address: X'01'
             o  DOMAINNAME: X'03'
             o  IP V6 address: X'04'
          o  DST.ADDR       desired destination address
          o  DST.PORT desired destination port in network octet
             order

Wie man sieht, schicke ich VER = 5, CMD_CONNECT = 1, das reservierte Nullbyte, den Wert für IPv4, IPV4_ADDR = 1, danach die IP und Port 80 in Network Byte Order. Die zurückgegebenen Bytes am Anfang der Antwort, \x05\x01, hingegen geben an, dass ein "General Socks server failure" aufgetreten ist.

Ich habe das Programm jemand anderem zur Prüfung gegeben, mit dem gleichen Ergebnis. Was habe ich also falsch gemacht? Ich kann keinen Fehler erkennen.

Vielen Dank für eure Hilfe.
 
Zurück
Oben