update rocksock.py to latest

This commit is contained in:
mickael
2019-01-06 04:53:20 +00:00
parent c661047381
commit 1f33a632fb

View File

@@ -56,6 +56,9 @@ class RocksockException(Exception):
def get_error(self):
return self.error
def get_errortype(self):
return self.errortype
def reraise(self):
import sys
ei = sys.exc_info()
@@ -161,13 +164,18 @@ class Rocksock():
self.sock = None
self.timeout = timeout
def _failed_proxy(self, pnum):
if pnum < 0: return -1
if pnum >= len(self.proxychain)-1: return -1
return pnum
def connect(self):
af, sa = self._resolve(self.proxychain[0].hostinfo, True)
try:
x = af+1
except TypeError:
raise RocksockException(-3, "unexpected problem resolving DNS, try again", errortype=RS_ET_GAI)
raise RocksockException(-3, "unexpected problem resolving DNS, try again", failedproxy=self._failed_proxy(0), errortype=RS_ET_GAI)
# print "GOT A WEIRD AF"
# print af
# raise RocksockException(-6666, af, errortype=RS_ET_GAI)
@@ -177,9 +185,9 @@ class Rocksock():
try:
self.sock.connect((sa[0], sa[1]))
except socket.timeout:
raise RocksockException(RS_E_HIT_TIMEOUT)
raise RocksockException(RS_E_HIT_TIMEOUT, failedproxy=self._failed_proxy(0))
except socket.error as e:
raise RocksockException(e.errno, errortype=RS_ET_SYS)
raise RocksockException(e.errno, errortype=RS_ET_SYS, failedproxy=self._failed_proxy(0))
for pnum in xrange(1, len(self.proxychain)):
curr = self.proxychain[pnum]
@@ -192,7 +200,7 @@ class Rocksock():
except ssl.SSLError as e:
reason = self._get_ssl_exception_reason(e)
#if hasattr(e, 'library'): subsystem = e.library
raise RocksockException(RS_E_SSL_GENERIC, reason, errortype=RS_ET_SSL)
raise RocksockException(RS_E_SSL_GENERIC, failedproxy=reason, errortype=RS_ET_SSL)
except socket.error as e:
raise RocksockException(e.errno, errortype=RS_ET_SYS)
except Exception as e:
@@ -221,9 +229,9 @@ class Rocksock():
def canread(self):
return select.select([self.sock], [], [], 0)[0]
def send(self, buf):
def send(self, buf, pnum=-1):
if self.sock is None:
raise RocksockException(RS_E_NO_SOCKET)
raise RocksockException(RS_E_NO_SOCKET, failedproxy=self._failed_proxy(pnum))
return self.sock.sendall(buf)
def _get_ssl_exception_reason(self, e):
@@ -233,7 +241,7 @@ class Rocksock():
elif hasattr(e, 'args'): s = e.args[0]
return s
def recv(self, count=-1):
def recv(self, count=-1, pnum=-1):
data = ''
while count:
try:
@@ -241,15 +249,15 @@ class Rocksock():
if n >= 1024*1024: n = 1024*1024
chunk = self.sock.recv(n)
except socket.timeout:
raise RocksockException(RS_E_HIT_TIMEOUT)
raise RocksockException(RS_E_HIT_TIMEOUT, failedproxy=self._failed_proxy(pnum))
except ssl.SSLError as e:
s = self._get_ssl_exception_reason(e)
if s == 'The read operation timed out':
raise RocksockException(RS_E_HIT_READTIMEOUT)
raise RocksockException(RS_E_HIT_READTIMEOUT, failedproxy=self._failed_proxy(pnum))
else:
raise RocksockException(RS_E_SSL_GENERIC, s, errortype=RS_ET_SSL)
raise RocksockException(RS_E_SSL_GENERIC, failedproxy=s, errortype=RS_ET_SSL)
if len(chunk) == 0:
raise RocksockException(RS_E_REMOTE_DISCONNECTED)
raise RocksockException(RS_E_REMOTE_DISCONNECTED, failedproxy=self._failed_proxy(pnum))
data += chunk
if count == -1: break
else: count -= len(chunk)
@@ -318,7 +326,7 @@ class Rocksock():
buf += '\0\0\0\x01'
else:
af, sa = self._resolve(dest, True)
if af != socket.AF_INET: raise RocksockException(RS_E_SOCKS4_NO_IP6)
if af != socket.AF_INET: raise RocksockException(RS_E_SOCKS4_NO_IP6, failedproxy=-1)
buf += self._ip_to_bytes(sa[0])
buf += '\0'
if v4a: buf += dest.hostinfo.host + '\0'
@@ -326,18 +334,18 @@ class Rocksock():
def _connect_socks4(self, header, pnum):
self.send(header)
res = self.recv(8)
res = self.recv(8, pnum=pnum)
if len(res) < 8 or ord(res[0]) != 0:
raise RocksockException(RS_E_PROXY_UNEXPECTED_RESPONSE, pnum-1)
raise RocksockException(RS_E_PROXY_UNEXPECTED_RESPONSE, failedproxy=self._failed_proxy(pnum))
ch = ord(res[1])
if ch == 0x5a:
pass
elif ch == 0x5b:
raise RocksockException(RS_E_TARGETPROXY_CONNECT_FAILED, pnum-1)
raise RocksockException(RS_E_TARGETPROXY_CONNECT_FAILED, failedproxy=self._failed_proxy(pnum))
elif ch == 0x5c or ch == 0x5d:
return RocksockException(RS_E_PROXY_AUTH_FAILED, pnum-1)
return RocksockException(RS_E_PROXY_AUTH_FAILED, failedproxy=self._failed_proxy(pnum))
else:
raise RocksockException(RS_E_PROXY_UNEXPECTED_RESPONSE, pnum-1)
raise RocksockException(RS_E_PROXY_UNEXPECTED_RESPONSE, failedproxy=self._failed_proxy(pnum))
def _setup_socks5_header(self, proxy):
buf = '\x05'
@@ -349,21 +357,21 @@ class Rocksock():
def _connect_socks5(self, header, pnum):
self.send(header)
res = self.recv(2)
res = self.recv(2, pnum=pnum)
if len(res) != 2 or res[0] != '\x05':
raise RocksockException(RS_E_PROXY_UNEXPECTED_RESPONSE, pnum-1)
raise RocksockException(RS_E_PROXY_UNEXPECTED_RESPONSE, failedproxy=self._failed_proxy(pnum))
if res[1] == '\xff':
raise RocksockException(RS_E_PROXY_AUTH_FAILED, pnum-1)
raise RocksockException(RS_E_PROXY_AUTH_FAILED, failedproxy=self._failed_proxy(pnum))
if ord(res[1]) == 2:
px = self.proxychain[pnum-1]
if px.username and px.password:
pkt = '\x01%c%s%c%s'%(len(px.username),px.username,len(px.password),px.password)
self.send(pkt)
res = self.recv(2)
res = self.recv(2, pnum=pnum)
if len(res) < 2 or res[1] != '\0':
raise RocksockException(RS_E_PROXY_AUTH_FAILED, pnum-1)
else: raise RocksockException(RS_E_PROXY_AUTH_FAILED, pnum-1)
raise RocksockException(RS_E_PROXY_AUTH_FAILED, failedproxy=self._failed_proxy(pnum))
else: raise RocksockException(RS_E_PROXY_AUTH_FAILED, failedproxy=self._failed_proxy(pnum))
dst = self.proxychain[pnum]
numeric = self._isnumericipv4(dst.hostinfo.host)
if numeric:
@@ -373,20 +381,20 @@ class Rocksock():
pkt = '\x05\x01\x00%c%s%c%c'% (1 if numeric else 3, dstaddr, dst.hostinfo.port / 256, dst.hostinfo.port % 256)
self.send(pkt)
res = self.recv()
res = self.recv(pnum=pnum)
if len(res) < 2 or res[0] != '\x05':
raise RocksockException(RS_E_PROXY_UNEXPECTED_RESPONSE, pnum-1)
raise RocksockException(RS_E_PROXY_UNEXPECTED_RESPONSE, failedproxy=self._failed_proxy(pnum))
ch = ord(res[1])
if ch == 0: pass
elif ch == 1: raise RocksockException(RS_E_PROXY_GENERAL_FAILURE, pnum-1)
elif ch == 2: raise RocksockException(RS_E_PROXY_AUTH_FAILED, pnum-1)
elif ch == 3: raise RocksockException(RS_E_TARGETPROXY_NET_UNREACHABLE, pnum-1)
elif ch == 4: raise RocksockException(RS_E_TARGETPROXY_HOST_UNREACHABLE, pnum-1)
elif ch == 5: raise RocksockException(RS_E_TARGETPROXY_CONN_REFUSED, pnum-1)
elif ch == 6: raise RocksockException(RS_E_TARGETPROXY_TTL_EXPIRED, pnum-1)
elif ch == 7: raise RocksockException(RS_E_PROXY_COMMAND_NOT_SUPPORTED, pnum-1)
elif ch == 8: raise RocksockException(RS_E_PROXY_ADDRESSTYPE_NOT_SUPPORTED, pnum-1)
else: raise RocksockException(RS_E_PROXY_UNEXPECTED_RESPONSE, pnum-1)
elif ch == 1: raise RocksockException(RS_E_PROXY_GENERAL_FAILURE, failedproxy=self._failed_proxy(pnum))
elif ch == 2: raise RocksockException(RS_E_PROXY_AUTH_FAILED, failedproxy=self._failed_proxy(pnum))
elif ch == 3: raise RocksockException(RS_E_TARGETPROXY_NET_UNREACHABLE, failedproxy=self._failed_proxy(pnum))
elif ch == 4: raise RocksockException(RS_E_TARGETPROXY_HOST_UNREACHABLE, failedproxy=self._failed_proxy(pnum))
elif ch == 5: raise RocksockException(RS_E_TARGETPROXY_CONN_REFUSED, failedproxy=self._failed_proxy(pnum))
elif ch == 6: raise RocksockException(RS_E_TARGETPROXY_TTL_EXPIRED, failedproxy=self._failed_proxy(pnum))
elif ch == 7: raise RocksockException(RS_E_PROXY_COMMAND_NOT_SUPPORTED, failedproxy=self._failed_proxy(pnum))
elif ch == 8: raise RocksockException(RS_E_PROXY_ADDRESSTYPE_NOT_SUPPORTED, failedproxy=self._failed_proxy(pnum))
else: raise RocksockException(RS_E_PROXY_UNEXPECTED_RESPONSE, failedproxy=self._failed_proxy(pnum))
def _connect_step(self, pnum):
@@ -407,11 +415,11 @@ class Rocksock():
elif prev.type == RS_PT_HTTP:
dest = self.proxychain[pnum]
self.send("CONNECT %s:%d HTTP/1.1\r\n\r\n"%(dest.hostinfo.host, dest.hostinfo.port))
resp = self.recv()
resp = self.recv(pnum=pnum)
if len(resp) <12:
raise RocksockException(RS_E_PROXY_UNEXPECTED_RESPONSE, pnum-1)
raise RocksockException(RS_E_PROXY_UNEXPECTED_RESPONSE, failedproxy=self._failed_proxy(pnum))
if resp[9] != '2':
raise RocksockException(RS_E_TARGETPROXY_CONNECT_FAILED, pnum-1)
raise RocksockException(RS_E_TARGETPROXY_CONNECT_FAILED, failedproxy=self._failed_proxy(pnum))
if __name__ == '__main__':