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 deutsch und englisch zu finden, allerdings gilt wohl das RFC 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:
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):
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.
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 deutsch und englisch zu finden, allerdings gilt wohl das RFC 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:
#!/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:
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.