|
|
|
@ -453,20 +453,25 @@ class Gateway():
|
|
|
|
|
json.dump(config, file, indent=4, sort_keys=True)
|
|
|
|
|
|
|
|
|
|
#===============================================================================
|
|
|
|
|
def check_ssh(self, ip, port, password, contimeout = 2, timeout = 3):
|
|
|
|
|
err = 0
|
|
|
|
|
def check_tcp_connect(self, ip, port, contimeout = 2, retobj = False):
|
|
|
|
|
sock = None
|
|
|
|
|
ssh = None
|
|
|
|
|
start_time = datetime.datetime.now()
|
|
|
|
|
while datetime.datetime.now() - start_time <= datetime.timedelta(seconds = contimeout):
|
|
|
|
|
try:
|
|
|
|
|
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
|
|
|
|
sock.settimeout(0.5)
|
|
|
|
|
sock.connect((ip, port))
|
|
|
|
|
if retobj:
|
|
|
|
|
return sock
|
|
|
|
|
break
|
|
|
|
|
except Exception as e:
|
|
|
|
|
except Exception:
|
|
|
|
|
sock = None
|
|
|
|
|
pass
|
|
|
|
|
return True if sock else False
|
|
|
|
|
|
|
|
|
|
def check_ssh(self, ip, port, password, contimeout = 2, timeout = 3):
|
|
|
|
|
err = 0
|
|
|
|
|
ssh = None
|
|
|
|
|
sock = self.check_tcp_connect(ip, port, contimeout, retobj = True)
|
|
|
|
|
if not sock:
|
|
|
|
|
err = -1
|
|
|
|
|
if password and err == 0:
|
|
|
|
@ -491,9 +496,11 @@ class Gateway():
|
|
|
|
|
pass
|
|
|
|
|
return err
|
|
|
|
|
|
|
|
|
|
def detect_ssh(self, verbose = 1, interactive = True, contimeout = 2, aux_port = 122):
|
|
|
|
|
def _detect_ssh(self, verbose = 1, interactive = True, contimeout = 2, aux_port = 0):
|
|
|
|
|
ip_addr = self.ip_addr
|
|
|
|
|
ssh_port = self.ssh_port
|
|
|
|
|
if aux_port == 0 and self.model_id > 0 and self.model_id < 22:
|
|
|
|
|
aux_port = 122 # exploit for "misystem/c_upload" (connect.py)
|
|
|
|
|
if ssh_port == aux_port:
|
|
|
|
|
aux_port = 22
|
|
|
|
|
passw = self.passw
|
|
|
|
@ -503,10 +510,11 @@ class Gateway():
|
|
|
|
|
return ssh_port # OK
|
|
|
|
|
if ret == -1:
|
|
|
|
|
ssh_port = 0
|
|
|
|
|
portlist = []
|
|
|
|
|
if ssh_port:
|
|
|
|
|
portlist = [ ssh_port, aux_port ]
|
|
|
|
|
else:
|
|
|
|
|
portlist = [ aux_port ]
|
|
|
|
|
portlist.append(ssh_port)
|
|
|
|
|
if aux_port and aux_port != ssh_port:
|
|
|
|
|
portlist.append(aux_port)
|
|
|
|
|
plist = []
|
|
|
|
|
for i, port in enumerate(portlist):
|
|
|
|
|
ret = self.check_ssh(ip_addr, port, None, contimeout = contimeout)
|
|
|
|
@ -526,7 +534,7 @@ class Gateway():
|
|
|
|
|
if psw is None:
|
|
|
|
|
if not interactive:
|
|
|
|
|
continue
|
|
|
|
|
psw = input("Enter password for root: ")
|
|
|
|
|
psw = input('Enter password for "root" user: ')
|
|
|
|
|
for i, port in enumerate(plist):
|
|
|
|
|
ret = self.check_ssh(ip_addr, port, psw, contimeout = contimeout)
|
|
|
|
|
if ret >= 0:
|
|
|
|
@ -542,7 +550,29 @@ class Gateway():
|
|
|
|
|
passw = None
|
|
|
|
|
if verbose >= 2:
|
|
|
|
|
print("Can't found valid SSH server on IP {}".format(ip_addr))
|
|
|
|
|
return -2
|
|
|
|
|
return -2
|
|
|
|
|
|
|
|
|
|
def detect_ssh(self, verbose = 1, interactive = True, contimeout = 2, aux_port = 0):
|
|
|
|
|
ssh_port = self._detect_ssh(verbose, interactive, contimeout, aux_port)
|
|
|
|
|
if ssh_port > 0:
|
|
|
|
|
return ssh_port
|
|
|
|
|
err = ssh_port
|
|
|
|
|
telnet_en = self.check_telnet(timeout = contimeout, verbose = 0)
|
|
|
|
|
if not telnet_en:
|
|
|
|
|
return err
|
|
|
|
|
passw = 'root'
|
|
|
|
|
tn = self.get_telnet(verbose = 0, password = passw)
|
|
|
|
|
if not tn and self.xqpassword:
|
|
|
|
|
passw = self.xqpassword
|
|
|
|
|
tn = self.get_telnet(verbose = 0, password = passw)
|
|
|
|
|
if not tn:
|
|
|
|
|
return err
|
|
|
|
|
self.use_ssh = False
|
|
|
|
|
self.passw = passw
|
|
|
|
|
ftp_en = self.check_tcp_connect(self.ip_addr, 21, contimeout = 1)
|
|
|
|
|
if ftp_en:
|
|
|
|
|
self.use_ftp = True
|
|
|
|
|
return 23
|
|
|
|
|
|
|
|
|
|
def ssh_close(self):
|
|
|
|
|
try:
|
|
|
|
|