Servidor.py
Código:
#!/usr/bin/env python
#-*- coding:utf-8 -*-
#Se importa el módulo
"""
FUNCIONA EL DOWNLOAD -F
FUNCIONA EL DOWNLOAD -D
"""
import socket, os, getpass, shutil, shlex, commands, tarfile, subprocess, numpy
from pexpect import pxssh
import signal
from subprocess import Popen, PIPE
name_host_server = getpass.getuser()
carpeta_actual_server = os.getcwd()
#instanciamos un objeto para trabajar con el socket
ser = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server = "192.168.8.100" #inti
port = 8000
def handler(signum, frame):
os.system("fuser -k -n tcp %s" % port)
signal.signal(signal.SIGTSTP, handler)
#Puerto y servidor que debe escuchar
ser.bind((server, port))
#Aceptamos conexiones entrantes con el metodo listen. Por parámetro las conexiones simutáneas.
ser.listen(1)
#Instanciamos un objeto cli (socket cliente) para recibir datos
cli, addr = ser.accept()
while True:
#creamos comandos especiales para el servidor-cliente
recibido = cli.recv(1073741824) # 1GB
cd_recibido = recibido.startswith("cd")
text_recibido = recibido.startswith("-t")
ventana_error_recibido = recibido.startswith("-m --error") #ok
ventana_info_recibido = recibido.startswith("-m --info") #ok
ventana_input_recibido = recibido.startswith("-m --input") #ok
ventana_question_recibido = recibido.startswith("-m --question") #ok
ventana_warning_recibido = recibido.startswith("-m --alert") #ok
ventana_notification_recibido = recibido.startswith("-m --notification") #ok
descargar_archivo = recibido.startswith("download -f")
descargar_carpeta = recibido.startswith("download -d")
recibido_eliminar_tmp = recibido.startswith("Eliminar download")
copiar_archivo_listo = recibido.startswith("copy -f ready")
copiar_carpeta_listo = recibido.startswith("copy -d ready")
sudo = recibido.startswith("sudo")
instalar = recibido.startswith("install ready")
desinstalar = recibido.startswith("uninstall ready")
fb = recibido.startswith("fb")
#ejecucion de cuyos comandos
if text_recibido == 1:
texto_filtro = recibido.replace("-t ","")
print(texto_filtro)
cli.send(texto_filtro)
elif cd_recibido == 1:
texto_filtro = recibido.replace("cd ","")
os.chdir(texto_filtro)
cli.send(texto_filtro)
elif ventana_input_recibido == 1:
texto_filtro = recibido.replace("-m --input ","")
comando = commands.getoutput("zenity --entry --title '' --text %s --display :0" % texto_filtro)
cli.send(comando)
elif ventana_error_recibido == 1:
texto_filtro = recibido.replace("-m --error ","")
comando = commands.getoutput("zenity --error --title '' --text %s --display :0" % texto_filtro)
cli.send(comando)
elif ventana_info_recibido == 1:
texto_filtro = recibido.replace("-m --info ","")
comando = commands.getoutput("zenity --info --title '' --text %s --display :0" % texto_filtro)
cli.send(comando)
elif ventana_notification_recibido == 1:
texto_filtro = recibido.replace("-m --notification ","")
comando = commands.getoutput("zenity --notification --title '' --text %s --display :0" % texto_filtro)
cli.send(comando + "\n")
elif ventana_warning_recibido == 1:
texto_filtro = recibido.replace("-m --alert ","")
comando = commands.getoutput("zenity --warning --title '' --text %s --display :0" % texto_filtro)
cli.send(comando)
elif ventana_question_recibido == 1:
texto_filtro = recibido.replace("-m --question ","")
comando = commands.getoutput("zenity --question --title '' --text %s --display :0" % texto_filtro)
cli.send(comando)
elif recibido == "python":
cli.send("error sintaxis")
elif recibido == "nano":
cli.send("error sintaxis")
elif descargar_archivo == 1:
archivo_filtro = recibido.replace("download -f ","")
lista_nombre_archivo = archivo_filtro.split("/")
ultimo_item_lista = len(lista_nombre_archivo)
item_nombre = ultimo_item_lista - 1
nombre_archivo = lista_nombre_archivo[item_nombre]
nombre_archivo1 = "".join(nombre_archivo.split())
abrir_archivo = open(archivo_filtro,"rb")
archivo_bin = abrir_archivo.read()
cli.send("download -f ready|"+ nombre_archivo1+"|"+ archivo_bin)
elif descargar_carpeta == 1:
filtro = recibido.replace("download -d ","")
lista = filtro.split("/")
directorio = len(lista) -1
directorio_fin = lista[directorio]
directorio_fin1 = "".join(directorio_fin.split())
destino_gz = "/tmp/"+directorio_fin1
ruta_comprimida = "/tmp/"+directorio_fin1+".tar.bz2"
archivo_gz = shutil.make_archive(destino_gz, "bztar",filtro)
archivo = open(ruta_comprimida,"rb")
archivo_bin = archivo.read()
cli.send("download -d ready |"+archivo_bin+" | "+ruta_comprimida)
elif recibido_eliminar_tmp:
filtro = recibido.replace("Eliminar download ","")
os.system("shred -u "+filtro)
elif copiar_archivo_listo == 1:
filtro = recibido.replace("copy -f ready |","")
lista = filtro.split(" | ")
archivo = lista[0]
destino = lista[1]
nombre = lista[2]
ruta = destino+"/"+nombre
abrir = open(ruta,"w")
abrir.write(archivo)
cli.send("\033[1;32m"+"[+]"+"\033[1;37m"+" Archivo copiado correctamente a"+"\033[1;31m"+":"+"\033[1;37m"+ruta)
abrir.close()
elif copiar_carpeta_listo == 1:
filtro = recibido.replace("copy -d ready |","")
lista = filtro.split(" | ")
archivo = lista[0]
destino = lista[1]
carpeta = lista[2]
ruta = "/tmp/"+carpeta+".tar.bz2"
abrir = open(ruta,"w")
abrir.write(archivo)
abrir.close()
os.system("mkdir "+destino+"/"+carpeta)
extraer_destino = destino+"/"+carpeta
desempaquetar = tarfile.open(ruta)
desempaquetar.extractall(path=extraer_destino)
os.system("shred -u "+ruta)
cli.send("Eliminar copy "+ruta)
#si no hay comandos especiales para ejecutar, se ejecutará los comandos de linux
elif sudo == 1:
filtro_c = recibido.replace("sudo ","")
filtro = recibido.split(" | ")
comando = filtro[0]
contrasena = filtro[1]
command = commands.getoutput("echo "+contrasena+" | sudo -u root -S "+comando)
elif instalar == 1:
filtro = recibido.replace("install ready ","")
lista = filtro.split(" | ")
comando = lista[0]
contrasena = lista[1]
comando = commands.getoutput("echo "+contrasena+" | sudo -u root -S apt-get install -y "+comando)
elif desinstalar == 1:
filtro = recibido.replace("uninstall ready ","")
lista = filtro.split(" | ")
comando = lista[0]
contrasena = lista[1]
comando = commands.getoutput("echo "+contrasena+" | sudo -u root -S apt-get --purge remove -y "+comando)
elif fb == 1:
s = pxssh.pxssh()
ssh = recibido.replace("fb ","")
lista = ssh.split()
localhost = lista[0]
usuario = lista[1]
comando = commands.getoutput("crunch 1 12 abcdefghijklmnoprstuvwxyzABCDEFGHIJKLMNOPRSTUVWXYZ0123456789 -c 100")
dic = comando.split("\n")
del dic[0:7]
for diccionario in dic:
try:
s.login(localhost,usuario,diccionario)
cli.send("La contrasena es: "+diccionario)
break;
except:
cli.send("Buscando contrasena: "+diccionario)
else:
salida = commands.getoutput(recibido)
cli.send(salida + "\n")
if ser == True:
print("Conexion cerrada")
#Cerramos la instancia del socket cliente y servidor
cli.close()
ser.close()
Y el cliente.py
Código:
#!/usr/bin/env python
#-*- coding:utf-8 -*-
#Variables
import socket, os, signal, sys, tarfile, shutil, getpass
host = "192.168.8.100" #casa
port = 8000
def handler(signum, frame):
os.system("fuser -k -n tcp %s" % port)
sys.exit()
signal.signal(signal.SIGTSTP, handler)
obj = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#Conexion con el servidor. Parametros: IP (puede ser del tipo 192.168.1.1 o localhost), Puerto
obj.connect((host, port))
name_host_server = socket.gethostname()
carpeta_actual_server = os.getcwd()
print("\033[1;32m"+"[+]"+"\033[1;37m"+" conexion establecida")
#Creamos un bucle para retener la conexion
while True:
#Instanciamos una entrada de datos para que el cliente pueda enviar mensajes
mens = raw_input("\033[1;31m"+host+"\033[1;32m"+"@"+name_host_server+":"+"\033[1;37m"+"$ ")
if mens == "close":
os.system("fuser -k -n tcp %s" % port)
break
#Con el metodo send, enviamos el mensaje
obj.send(mens)
data = obj.recv(1073741824)
descargar_archivo = data.startswith("download -f ready")
descargar_carpeta_listo = data.startswith("download -d ready")
copiar_archivo = mens.startswith("copy -f")
copiar_carpeta = mens.startswith("copy -d")
eliminar_copiar_carpeta = data.startswith("Eliminar copy")
sudo = mens.startswith("root")
instalar = mens.startswith("install")
desinstalar = mens.startswith("uninstall")
#descargar un archivo del servidor al cliente
if descargar_archivo == 1:
ruta = raw_input("ruta absoluta, donde se descargará el archivo >>\n")
archivo_filtro = data.replace("download -f ready|","")
lista_archivo = archivo_filtro.split("|")
nombre_archivo = lista_archivo[0]
restante = nombre_archivo+"|"
archivo_filtro2 = archivo_filtro.replace(restante,"")
crear_ruta = ruta+"/"+nombre_archivo
archivo_descargar = open(crear_ruta,"a")
archivo_descargar.write(archivo_filtro2)
archivo_descargar.close()
print("\033[1;32m"+"[+]"+"\033[1;37m"+"archivo descargado correctamente")
#copiar un archivo del cliente al servidor
elif descargar_carpeta_listo == 1: #descargar carpeta del servidor al cliente
ruta = raw_input("ruta absoluta donde descargarás el directorio >>\n")
filtro = data.replace("download -d ready |","")
lista = filtro.split(" | ")
archivo = lista[0]
ruta_tmp = lista[1]
lista_ruta = ruta_tmp.split("/")
ultimo = len(lista_ruta) -1
nombre = lista_ruta[ultimo]
nombre_dir = nombre.split(".")
nombre_directorio = nombre_dir[0]
abrir = open(ruta_tmp,"w")
abrir.write(archivo)
abrir.close()
os.system("mkdir "+ruta+"/"+nombre_directorio)
desempaquetar = tarfile.open(ruta_tmp)
desempaquetar.extractall(path=ruta+"/"+nombre_directorio+"/")
eliminar = open(ruta_tmp,"w")
eliminar.write("00000000")
eliminar.close()
os.system("shred -u "+ruta_tmp)
obj.send("Eliminar download "+ruta_tmp)
print("\033[1;32m"+"[+]"+"\033[1;37m"+"carpeta descargada correctamente")
elif copiar_archivo == 1:
destino_servidor = raw_input("ruta absoluta, donde se copiará el archivo al servidor >>\n")
filtro = mens.replace("copy -f ","")
abrir = open(filtro,"rb")
leer = abrir.read()
lista = filtro.split("/")
lon_lista = len(lista)
ultim_lista = lon_lista-1
nombre = lista[ultim_lista]
nombre1 = "".join(nombre.split())
obj.send("copy -f ready |"+leer+" | "+destino_servidor+" | "+nombre1)
elif copiar_carpeta == 1:
destino_servidor = raw_input("ruta absoluta, donde se copiará la carpeta al servidor >>\n")
filtro = mens.replace("copy -d ","")
lista = filtro.split("/")
lon_lista = len(lista)
ultim_lista = lon_lista-1
directorio = lista[ultim_lista]
directorio1 = "".join(directorio.split())
tmp = "/tmp/"+directorio1
tar = "/tmp/"+directorio1+".tar.bz2"
comprimir = shutil.make_archive(tmp,"bztar",filtro)
abrir = open(tar,"rb")
leer = abrir.read()
obj.send("copy -d ready |"+leer+" | "+destino_servidor+" | "+directorio1)
print("\033[1;32m"+"[+]"+"\033[1;37m"+" Directorio copiado correctamente")
elif eliminar_copiar_carpeta == 1:
filtro = data.replace("Eliminar copy ","")
os.system("shred -u "+filtro)
elif sudo == 1:
contrasena = getpass.getpass("Contraaseña del usuario root: ")
mensaje = mens.replace("root ","")
obj.send("sudo "+mensaje+" | "+contrasena)
elif instalar == 1:
contrasena = getpass.getpass("Contraseña del usuario root: ")
mensaje = mens.replace("install ","")
obj.send("install ready "+mensaje+" | "+contrasena)
while data == "error sudo install":
contrasena = getpass.getpass("Contraseña del usuario root: ")
pass
elif desinstalar == 1:
contrasena = getpass.getpass("Contraseña del usuario root: ")
mensaje = mens.replace("uninstall ","")
obj.send("uninstall ready "+mensaje+" | "+contrasena)
elif mens == "man":
print("""
"""+"\033[1;31m"+"""-t"""+"\033[1;37m"+""" [texto] : Envía un mensaje por la terminal.\n
"""+"\033[1;31m"+"""-m --error"""+"\033[1;37m"+""" "[texto]" : Muestra un diálogo de error.\n
"""+"\033[1;31m"+"""-m --info"""+"\033[1;37m"+""" "[texto]" : Muestra un diálogo de información.\n
"""+"\033[1;31m"+"""-m --input"""+"\033[1;37m"+""" "[texto]" : Muestra un diálogo de entrada de texto.\n
"""+"\033[1;31m"+"""-m --question"""+"\033[1;37m"+""" "[texto]" : Muestra un diálogo de pregunta.\n
"""+"\033[1;31m"+"""-m --alert"""+"\033[1;37m"+""" "[texto]" : Muestra un diálogo de alerta.\n
"""+"\033[1;31m"+"""-m --notification"""+"\033[1;37m"+""" "[texto]" : Muestra un diálogo de notificación.\n
"""+"\033[1;31m"+"""download -f"""+"\033[1;37m"+""" [ruta del archivo del servidor a descargar] : Descarga un archivo del servidor al cliente.\n
Cuando lo ejecutes, te preguntará donde quieres que se guarde el archivo.\n
"""+"\033[1;31m"+"""$"""+"\033[1;37m"+""" download -f /home/administrador/Imágenes/cleanet.png
ruta absoluta, donde se descargará el archivo """+"\033[1;31m"+""">>"""+"\033[1;37m"+"""
/home/administrador/Escritorio\n
[!]
"""+"\033[1;31m"+"""download -d"""+"\033[1;37m"+""" [ruta del directorio del servidor a descargar] : Descarga un directorio del servidor al cliente.\n
Cuando lo ejecutes, te preguntará donde quieres que se guarde el directorio.\n
"""+"\033[1;31m"+"""$"""+"\033[1;37m"+""" download -d /home/administrador/scripts\n
ruta absoluta, donde descargarás el directorio """+"\033[1;31m"+""">>"""+"\033[1;37m"+"""
/home/administrador/Escritorio\n
"""+"\033[1;31m"+"""copy -f"""+"\033[1;37m"+""" [ruta del archivo del cliente para copiarlo al servidor] : copia un archivo del cliente al servidor.\n
Cuando lo ejecutes, te preguntará donde quieres que se guarde el archivo.\n
"""+"\033[1;31m"+"""$"""+"\033[1;37m"+""" copy -f /home/administrador/conexion.py\n
ruta absoluta, donde se copiará el archivo al servidor"""+"\033[1;31m"+""">>"""+"\033[1;37m"+"""
/home/administrador/Documentos\n
"""+"\033[1;31m"+"""copy -d"""+"\033[1;37m"+""" [ruta del directorio del cliente para copiarlo al servidor] : copia un directorio del cliente al servidor.\n
Cuando lo ejecutes, te preguntará donde quieres que se guarde el archivo.\n
"""+"\033[1;31m"+"""$"""+"\033[1;37m"+""" copy -d /home/administrador/actividades \n
ruta absoluta, donde se copiará el archivo al servidor"""+"\033[1;31m"+""">>"""+"\033[1;37m"+"""
/home/administrador/Documentos \n
[!] Cuando se haga una transferencia de archivo el tamaño máximo es de 1GB
[!] Al introducir las rutas, no deben de tener un '/' al final
""")
else:
print(data)
#Cerramos la instancia del objeto servidor
obj.close()
#Imprimimos la palabra Adios para cuando se cierre la conexion
print("Conexion cerrada")
En el servidor.py, la variable server lo pongo vacio y le asigno el puerto 8000
Código:
import socket, os, getpass, shutil, shlex, commands, tarfile, subprocess, numpy
from pexpect import pxssh
import signal
from subprocess import Popen, PIPE
name_host_server = getpass.getuser()
carpeta_actual_server = os.getcwd()
#instanciamos un objeto para trabajar con el socket
ser = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server = "" #inti
port = 8000
def handler(signum, frame):
os.system("fuser -k -n tcp %s" % port)
signal.signal(signal.SIGTSTP, handler)
#Puerto y servidor que debe escuchar
ser.bind((server, port))
#Aceptamos conexiones entrantes con el metodo listen. Por parámetro las conexiones simutáneas.
ser.listen(1)
Código:
import socket, os, signal, sys, tarfile, shutil, getpass
host = "127.0.0.1" #casa
port = 8000
def handler(signum, frame):
os.system("fuser -k -n tcp %s" % port)
sys.exit()
signal.signal(signal.SIGTSTP, handler)
obj = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#Conexion con el servidor. Parametros: IP (puede ser del tipo 192.168.1.1 o localhost), Puerto
obj.connect((host, port))
name_host_server = socket.gethostname()
carpeta_actual_server = os.getcwd()
print("\033[1;32m"+"[+]"+"\033[1;37m"+" conexion establecida")
El funcionamiento va bien, en LAN, pero mi objetivo, es que funcione a traves de ip's publicas (WAN), (siempre y cuando el cliente-servidor esten encendidos). Para ello me informe de que se necesitaba abrir puertos en mi router.
Yo tengo un HUAWEI B315, aquí la imagen del puerto abierto:
https://drive.google.com/file/d/1i2-nF3wRkw8H93MIIXdY9O6OMBZrcDGO/view?usp=sharing
Una vez hecho este paso, modifique un el codigo cliente-servidor para la conexion.
Servidor.py
Código:
import socket, os, getpass, shutil, shlex, commands, tarfile, subprocess, numpy
from pexpect import pxssh
import signal
from subprocess import Popen, PIPE
name_host_server = getpass.getuser()
carpeta_actual_server = os.getcwd()
#instanciamos un objeto para trabajar con el socket
ser = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server = "85.119.xxx.xxx" #inti
port = 8000
def handler(signum, frame):
os.system("fuser -k -n tcp %s" % port)
signal.signal(signal.SIGTSTP, handler)
#Puerto y servidor que debe escuchar
ser.bind((server, port))
#Aceptamos conexiones entrantes con el metodo listen. Por parámetro las conexiones simutáneas.
ser.listen(1)
#Instanciamos un objeto cli (socket cliente) para recibir datos
cli, addr = ser.accept()
Cliente.py
Código:
import socket, os, signal, sys, tarfile, shutil, getpass
host = "176.87.xxx.xxx" #casa
port = 8000
def handler(signum, frame):
os.system("fuser -k -n tcp %s" % port)
sys.exit()
signal.signal(signal.SIGTSTP, handler)
obj = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#Conexion con el servidor. Parametros: IP (puede ser del tipo 192.168.1.1 o localhost), Puerto
obj.connect((host, port))
name_host_server = socket.gethostname()
carpeta_actual_server = os.getcwd()
print("\033[1;32m"+"[+]"+"\033[1;37m"+" conexion establecida")
El caso es que lo probé (ambos PC's encendidos) y no me funcionaba, me daba el error
Servidor
Citar
Traceback (most recent call last):
File "servidor.py", line 22, in <module>
ser.bind((server, port))
File "/usr/lib/python2.7/socket.py", line 228, in meth
return getattr(self._sock,name)(*args)
socket.error: [Errno 99] Cannot assign requested address
File "servidor.py", line 22, in <module>
ser.bind((server, port))
File "/usr/lib/python2.7/socket.py", line 228, in meth
return getattr(self._sock,name)(*args)
socket.error: [Errno 99] Cannot assign requested address
Cliente
Citar
Traceback (most recent call last):
File "servidor.py", line 22, in <module>
ser.bind((server, port))
File "/usr/lib/python2.7/socket.py", line 228, in meth
return getattr(self._sock,name)(*args)
socket.error: [Errno 99] Cannot assign requested address
File "servidor.py", line 22, in <module>
ser.bind((server, port))
File "/usr/lib/python2.7/socket.py", line 228, in meth
return getattr(self._sock,name)(*args)
socket.error: [Errno 99] Cannot assign requested address
El caso, es que lo que puede estar pasando es que, el router de mi casa tiene el puerto abierto, pero el otro posiblemente no lo tenga?
Gracias de antemano!!