Servidor Socket de practica Bruteforce (Versión 2.0)

Iniciado por R.altk#6050, Abril 03, 2021, 07:22:47 PM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Abril 03, 2021, 07:22:47 PM Ultima modificación: Abril 03, 2021, 08:25:26 PM por R.altk#6050

                             

Hola, este es mi tercer post, en esta ocasión les traigo el Servidor con Socket 2.0 con mayor seguridad para experimentar y practicar tus broteforces.
≡¿Por que haces esto si no son buenos códigos?                                               
≡ .1 Hago esto para la gente que recién esta empezando en estos temas, así       
≡  experimentan y aprenden, no son tan buenos códigos por que no es necesario.
≡¿Harás otra parte con el servidor con mas seguridad?                                       
≡ .2 Posiblemente, todo depende de mi tiempo y ganas.
- Gracias a mi amigo M4 por darme permiso de usar la función de captcha, créditos para él.






Me lo intente currar un poco para que realmente les pueda ayudar, si comentan y dan su opinión lo agradecería mucho.
Si tienen algún problema con el código no duden en comentarme para que se los resuelva, posiblemente de error por la tabulación, aseguraos de ponerlos bien jeje
si gustan pueden poner en los comentarios que quieren que traiga la próxima vez, si se hacerlo y dispongo del tiempo se los puedo traer
Versión 1.0 del Servidor: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Código: php

#!/usr/bin/env python
import socket,os,random,string

host="0.0.0.0"
port=1879
password="connor" 

s=socket.socket(socket.AF_INET,  socket.SOCK_STREAM)
s.bind((host, port))

def clear(): #La famosa funcion
    if os.name == "nt":
        os.system("cls")
    else:
        os.system("clear")

clear()

print("{*} Servidor encendido.")
sgd = 1

def capcha():  #funcion del captcha < Creditos a M4
a=random.choices(string.ascii_uppercase, k=4)
print("Capcha solicitado "+"".join(a))
return a
while 1:
    s.listen(2)
    conn, addr = s.accept()
    clip = addr
    print("{*} Alguien se ha conectado al servidor: "+str(clip)+"\n")

    capvalue="".join(capcha())
    conn.send(capvalue.encode("utf8"))
    conn.send("\nCapcha> ".encode("utf8"))
    try:
        capclient=conn.recv(1024).decode("utf8")
        capclient=capclient.replace("\n","") 
        if str(capclient)==capvalue:
            print("{*} El usuario entro con el captcha correcto.")
            conn.send("{*} Captcha correcto\n".encode("utf8"))
            while True:
                conn.send("Pass> ".encode("utf8"))
                data=conn.recv(1024).decode("utf8")
                data=data.replace("\n", "")
                if data==password or str(data)==password:
                    conn.send("GG, pass correcta".encode("utf8"))
                    print("El usuario uso la contraseña correcta")
                    break
                else:
                    print("Un user fracaso al poner la contraseña: "+data+"\nIntento numero: "+str(sgd)+"\n")
                    sgd = sgd + 1
                    if sgd==5:
                        conn.send("{*} El Servidor se cierra por ataque de bruteforce".encode("utf8"))
                        print("{*} El servidor fue detenido por ataque de bruteforce\n")
                        print("{*} La IP del posible atacante: " + str(clip))
                        break
                        conn.close()
                        s.close()
                    else:
                        continue
                        conn.send("Contraseña incorrecta\n".encode("utf8"))
        else:
            print("El usuario ha fallado el capcha:"+ capclient)
            conn.send("Failed capcha\n".encode("utf8"))
            conn.close()
    except:
        print("El user se ha desconectado")
        conn.close()


Sé que no es el mejor código del mundo, pero sirve para practicar, el próxima hare algo que sea  mas parecido a un hacker de películas, ya verán jaja, quizás me tarde mas en terminarlo y etc.
Espero que te guste el código y adiós, cuidate.  ;) ;D


Edit: Si no sabes como hacer el cliente acá te dejo la base y te explico mas o menos de que va, en la proxima versión que haga explicare a detalle.

Código: php

import socket #Importamos Socket, es importante ya que sin eso basicamente no funcionaria nada

host="0.0.0.0" #Aca es donde ponemos la IP, ojo, tenes que poner la misma que pusiste en el servidor, pero igual es mejor dejarlo como esta

port="24" #Lo mismo con la IP, si quieren este pueden cambiarlo, si lo cambian y dice algo como "Permiso denegado" es que no les deja usar ese puerto

s=socket.socket(socket.AF_INET, socket.SOCK_STREAM) #Base del socket (no recomiendo tocar, pero si quieren pueden buscar mejores opciones)
s.connect((host, port)) #Esto da la orden que se tiene que conectar al puerto e ip



#Datos extras:
#Recomiendo usar nc para ver el servidor como se muestra en la primera imagen en kali linux, se usa de este modo: nc (IP) (PUERTO) ejemplo: nc 0.0.0.0 80
#Recomiendo que si tienen algun fallo o duda me lo dejen en los comentarios ya que se intentare echarles un cable
#Lo mas posible es que de error en los codigos por que quizas esten mal tabulados, ya que al copiar y pegar se modifican las tabulaciones para cualquier lado
#Recuerda que socket es un modulo del cual es algo complicado de usar, pero con tiempo y practica se puede dominar, no todo sale a la primera, lo mas probable es que de error al principio tu cliente
#Tambien recuerda que 0.0.0.0 es igual a localhost, es decir, tu amigo no podra ejecutar el servidor y vos hacer el bruteforce, para eso estan cosas como ngrok del cual podes buscar tutoriales
#de como usarlo, pero no recomiendo usarlo, ya que ngrok para hacer bruteforce al enviar muchas peticiones se cierra




Abril 29, 2023, 08:24:20 AM #1 Ultima modificación: Abril 29, 2023, 08:27:21 AM por desmon_hak
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
                             

Hola, este es mi tercer post, en esta ocasión les traigo el Servidor con Socket 2.0 con mayor seguridad para experimentar y practicar tus broteforces.
≡¿Por que haces esto si no son buenos códigos?                                               
≡ .1 Hago esto para la gente que recién esta empezando en estos temas, así     
≡  experimentan y aprenden, no son tan buenos códigos por que no es necesario.
≡¿Harás otra parte con el servidor con mas seguridad?                                     
≡ .2 Posiblemente, todo depende de mi tiempo y ganas.
                                   
[move]- Gracias a mi amigo M4 por darme permiso de usar la función de captcha, créditos para él.[/move]




Me lo intente currar un poco para que realmente les pueda ayudar, si comentan y dan su opinión lo agradecería mucho.
Si tienen algún problema con el código no duden en comentarme para que se los resuelva, posiblemente de error por la tabulación, aseguraos de ponerlos bien jeje
si gustan pueden poner en los comentarios que quieren que traiga la próxima vez, si se hacerlo y dispongo del tiempo se los puedo traer
Versión 1.0 del Servidor: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Código: python
#!/usr/bin/env python
import socket,os,random,string 

host="0.0.0.0" 
port=1879 
password="connor"  

s=socket.socket(socket.AF_INET,  socket.SOCK_STREAM) 
s.bind((host, port)) 

def clear(): #La famosa funcion
    if os.name == "nt":
        os.system("cls")
    else:
        os.system("clear")

clear()

print("{*} Servidor encendido.")
sgd = 1 

def capcha():  #funcion del captcha < Creditos a M4
	a=random.choices(string.ascii_uppercase, k=4)
	print("Capcha solicitado "+"".join(a))
	return a
while 1:
    s.listen(2) 
    conn, addr = s.accept()
    clip = addr 
    print("{*} Alguien se ha conectado al servidor: "+str(clip)+"\n") 

    capvalue="".join(capcha()) 
    conn.send(capvalue.encode("utf8")) 
    conn.send("\nCapcha> ".encode("utf8")) 
    try:
        capclient=conn.recv(1024).decode("utf8") 
        capclient=capclient.replace("\n","")  
        if str(capclient)==capvalue: 
            print("{*} El usuario entro con el captcha correcto.")
            conn.send("{*} Captcha correcto\n".encode("utf8")) 
            while True:
                conn.send("Pass> ".encode("utf8")) 
                data=conn.recv(1024).decode("utf8") 
                data=data.replace("\n", "") 
                if data==password or str(data)==password:
                    conn.send("GG, pass correcta".encode("utf8")) 
                    print("El usuario uso la contraseña correcta")
                    break
                else:
                    print("Un user fracaso al poner la contraseña: "+data+"\nIntento numero: "+str(sgd)+"\n") 
                    sgd = sgd + 1
                    if sgd==5:
                        conn.send("{*} El Servidor se cierra por ataque de bruteforce".encode("utf8"))
                        print("{*} El servidor fue detenido por ataque de bruteforce\n")
                        print("{*} La IP del posible atacante: " + str(clip))
                        break
                        conn.close()
                        s.close()
                    else:
                        continue
                        conn.send("Contraseña incorrecta\n".encode("utf8"))
        else:
            print("El usuario ha fallado el capcha:"+ capclient)
            conn.send("Failed capcha\n".encode("utf8"))
            conn.close()
    except:
        print("El user se ha desconectado")
        conn.close()

Sé que no es el mejor código del mundo, pero sirve para practicar, el próxima hare algo que sea  mas parecido a un hacker de películas, ya verán jaja, quizás me tarde mas en terminarlo y etc.
Espero que te guste el código y adiós, cuidate.  ;) ;D

Edit: Si no sabes como hacer el cliente acá te dejo la base y te explico mas o menos de que va, en la proxima versión que haga explicare a detalle.

Código: python
import socket #Importamos Socket, es importante ya que sin eso basicamente no funcionaria nada

host="0.0.0.0" #Aca es donde ponemos la IP, ojo, tenes que poner la misma que pusiste en el servidor, pero igual es mejor dejarlo como esta

port="24" #Lo mismo con la IP, si quieren este pueden cambiarlo, si lo cambian y dice algo como "Permiso denegado" es que no les deja usar ese puerto

s=socket.socket(socket.AF_INET, socket.SOCK_STREAM) #Base del socket (no recomiendo tocar, pero si quieren pueden buscar mejores opciones)
 s.connect((host, port)) #Esto da la orden que se tiene que conectar al puerto e ip


#Datos extras:
#Recomiendo usar nc para ver el servidor como se muestra en la primera imagen en kali linux, se usa de este modo: nc (IP) (PUERTO) ejemplo: nc 0.0.0.0 80
#Recomiendo que si tienen algun fallo o duda me lo dejen en los comentarios ya que se intentare echarles un cable
#Lo mas posible es que de error en los codigos por que quizas esten mal tabulados, ya que al copiar y pegar se modifican las tabulaciones para cualquier lado
#Recuerda que socket es un modulo del cual es algo complicado de usar, pero con tiempo y practica se puede dominar, no todo sale a la primera, lo mas probable es que de error al principio tu cliente
#Tambien recuerda que 0.0.0.0 es igual a localhost, es decir, tu amigo no podra ejecutar el servidor y vos hacer el bruteforce, para eso estan cosas como ngrok del cual podes buscar tutoriales
#de como usarlo, pero no recomiendo usarlo, ya que ngrok para hacer bruteforce al enviar muchas peticiones se cierra


Hola bro, un placer, me gustaría decirte que hay mejores maneras de limpiar la pantalla que usando el comando cls o clear, puedes investigar, sobre el modulo colorama que te permite hacer esto directamente y sin tener que averiguar en que plataforma se esta corriendo tu codigo. Tambien tengo que mencionar que uses las clausulas try-except de forma un poco irresponsable, quiero decir, cualquier error del tipo que sea que ocurra dentro de estas clausulas lo reportara como que el usuario fallo el catchap y le cierras la misma conexion. Esto no es correcto, ya que si por ejemplo, el cliente manda un buffer de mas de 1024 bytes, como tu en tu server has puesto.un .recv(1024), esto generara un error, y aunque el cliente haya acertado el catchap(cosa que no tendria sentido hacer un catchap mayor al que soporta el buffer de tu server), le procederas a cerrar la conexion independientemente de si acerto o lo fallo, simplemente por que no contemplas que tu codigo tenga la posibilidad de fallar alli. Mi recomendacion es que uses esta clausula de forma mas responsable especificando a except el tipo de error que quieres capturar, puedes capturar dos errores al mismo tiempo para solo tener que usar una clausula try-except a la vez con la misma funcionalidad en el except, lo que seria algo asi:
Código: python
try:
    # code
except (name_error1, name_error2):
    # code
Yo personalmente pienso que no es bueno usar try-catch tal como lo haces, pienso que es una mala practica y hace que no comprendas completamente los errores que se pueden generar en dicha porcion de codigo, ademas de que pones un comportamiento default para cualquier tipo de error que se genere en respuesta.

Ahora, otra cosa que podemos hacer para mejorar este codigo es hacer al servidor multithreading, ya que si un cliente se conecta al servidor y se queda hay esperando, y mientras, otro cliente intenta conectarse. El segundo cliente no podra establecer una conexion por que el servidor aun esta atendiendo al cliente1. Por esta parte podrias hacer uso del metodo .timeout si mal no recuerdo tmb, que te permite especificar cuanto tiempo puede estar un cliente conectado sin hacer nada, por defecto creo recordar que este valor es 0, por lo que es un tiempo indefinido, y esto se podria usar tmb para explotar tu servidor, ya que puedes establecer multiples conexiones contra tu servicio y hacer nada, lo que a la larga haria que el server no pueda aceptar mas conexiones y dejes a clientes reales sin la posibilidad de interactuar con tu servicio.
Tambien deberia haber un try-catch adecuado para bind ya que si el puerto que va a usar tu servicio ya esta siendo usado por otro,tu codigo dara un error en dicha linea.

Como curiosidad hay que decir que no es necesario que hagas esto:
Código: python
socket.socket(socket.AF_INET,  socket.SOCK_STREAM) 

 Puedes hacer esto simplemente que hace lo mismo ya que el constructor de socket toma esos valores por defecto:
Código: python
socket.socket() 
Si quisieras hacer una conexion UDP o de otro tipo, ahi si tendrias que meterle los valores necesarios al constructor para realizar un socket del tipo que quieres.

No es necesario que hagas esto:
Código: php
str(capclient)
Por que al usar el metodo .decode ya lo transforma a str.
Luego tambien, en un servidor algo mas real, bloquearias al usuario mediante su direccion IP y otros datos que este normalmente te reportaria, puedes hacer que tu servidor necesite tener registrado en una base de datos una serie de clientes con sus nombres para realizar una conexion exitosa, y que el cliente tenga que especificar su nombre para poder acceder y de caso contrario pues simplemente le cierras la conexion. Si el usuario falla la password podrias bloquearle la conexión por su nickname simplemente.
Espero haberte ayudado

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
                             

Hola, este es mi tercer post, en esta ocasión les traigo el Servidor con Socket 2.0 con mayor seguridad para experimentar y practicar tus broteforces.
≡¿Por que haces esto si no son buenos códigos?                                               
≡ .1 Hago esto para la gente que recién esta empezando en estos temas, así     
≡  experimentan y aprenden, no son tan buenos códigos por que no es necesario.
≡¿Harás otra parte con el servidor con mas seguridad?                                     
≡ .2 Posiblemente, todo depende de mi tiempo y ganas.
                                   
[move]- Gracias a mi amigo M4 por darme permiso de usar la función de captcha, créditos para él.[/move]




Me lo intente currar un poco para que realmente les pueda ayudar, si comentan y dan su opinión lo agradecería mucho.
Si tienen algún problema con el código no duden en comentarme para que se los resuelva, posiblemente de error por la tabulación, aseguraos de ponerlos bien jeje
si gustan pueden poner en los comentarios que quieren que traiga la próxima vez, si se hacerlo y dispongo del tiempo se los puedo traer
Versión 1.0 del Servidor: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Código: python
#!/usr/bin/env python
import socket,os,random,string 

host="0.0.0.0" 
port=1879 
password="connor"  

s=socket.socket(socket.AF_INET,  socket.SOCK_STREAM) 
s.bind((host, port)) 

def clear(): #La famosa funcion
    if os.name == "nt":
        os.system("cls")
    else:
        os.system("clear")

clear()

print("{*} Servidor encendido.")
sgd = 1 

def capcha():  #funcion del captcha < Creditos a M4
	a=random.choices(string.ascii_uppercase, k=4)
	print("Capcha solicitado "+"".join(a))
	return a
while 1:
    s.listen(2) 
    conn, addr = s.accept()
    clip = addr 
    print("{*} Alguien se ha conectado al servidor: "+str(clip)+"\n") 

    capvalue="".join(capcha()) 
    conn.send(capvalue.encode("utf8")) 
    conn.send("\nCapcha> ".encode("utf8")) 
    try:
        capclient=conn.recv(1024).decode("utf8") 
        capclient=capclient.replace("\n","")  
        if str(capclient)==capvalue: 
            print("{*} El usuario entro con el captcha correcto.")
            conn.send("{*} Captcha correcto\n".encode("utf8")) 
            while True:
                conn.send("Pass> ".encode("utf8")) 
                data=conn.recv(1024).decode("utf8") 
                data=data.replace("\n", "") 
                if data==password or str(data)==password:
                    conn.send("GG, pass correcta".encode("utf8")) 
                    print("El usuario uso la contraseña correcta")
                    break
                else:
                    print("Un user fracaso al poner la contraseña: "+data+"\nIntento numero: "+str(sgd)+"\n") 
                    sgd = sgd + 1
                    if sgd==5:
                        conn.send("{*} El Servidor se cierra por ataque de bruteforce".encode("utf8"))
                        print("{*} El servidor fue detenido por ataque de bruteforce\n")
                        print("{*} La IP del posible atacante: " + str(clip))
                        break
                        conn.close()
                        s.close()
                    else:
                        continue
                        conn.send("Contraseña incorrecta\n".encode("utf8"))
        else:
            print("El usuario ha fallado el capcha:"+ capclient)
            conn.send("Failed capcha\n".encode("utf8"))
            conn.close()
    except:
        print("El user se ha desconectado")
        conn.close()

Sé que no es el mejor código del mundo, pero sirve para practicar, el próxima hare algo que sea  mas parecido a un hacker de películas, ya verán jaja, quizás me tarde mas en terminarlo y etc.
Espero que te guste el código y adiós, cuidate.  ;) ;D

Edit: Si no sabes como hacer el cliente acá te dejo la base y te explico mas o menos de que va, en la proxima versión que haga explicare a detalle.

Código: python
import socket #Importamos Socket, es importante ya que sin eso basicamente no funcionaria nada

host="0.0.0.0" #Aca es donde ponemos la IP, ojo, tenes que poner la misma que pusiste en el servidor, pero igual es mejor dejarlo como esta

port="24" #Lo mismo con la IP, si quieren este pueden cambiarlo, si lo cambian y dice algo como "Permiso denegado" es que no les deja usar ese puerto

s=socket.socket(socket.AF_INET, socket.SOCK_STREAM) #Base del socket (no recomiendo tocar, pero si quieren pueden buscar mejores opciones)
 s.connect((host, port)) #Esto da la orden que se tiene que conectar al puerto e ip


#Datos extras:
#Recomiendo usar nc para ver el servidor como se muestra en la primera imagen en kali linux, se usa de este modo: nc (IP) (PUERTO) ejemplo: nc 0.0.0.0 80
#Recomiendo que si tienen algun fallo o duda me lo dejen en los comentarios ya que se intentare echarles un cable
#Lo mas posible es que de error en los codigos por que quizas esten mal tabulados, ya que al copiar y pegar se modifican las tabulaciones para cualquier lado
#Recuerda que socket es un modulo del cual es algo complicado de usar, pero con tiempo y practica se puede dominar, no todo sale a la primera, lo mas probable es que de error al principio tu cliente
#Tambien recuerda que 0.0.0.0 es igual a localhost, es decir, tu amigo no podra ejecutar el servidor y vos hacer el bruteforce, para eso estan cosas como ngrok del cual podes buscar tutoriales
#de como usarlo, pero no recomiendo usarlo, ya que ngrok para hacer bruteforce al enviar muchas peticiones se cierra


Hola bro, un placer, me gustaría decirte que hay mejores maneras de limpiar la pantalla que usando el comando cls o clear, puedes investigar, sobre el modulo colorama que te permite hacer esto directamente y sin tener que averiguar en que plataforma se esta corriendo tu codigo. Tambien tengo que mencionar que uses las clausulas try-except de forma un poco irresponsable, quiero decir, cualquier error del tipo que sea que ocurra dentro de estas clausulas lo reportara como que el usuario fallo el catchap y le cierras la misma conexion. Esto no es correcto, ya que si por ejemplo, el cliente manda un buffer de mas de 1024 bytes, como tu en tu server has puesto.un .recv(1024), esto generara un error, y aunque el cliente haya acertado el catchap(cosa que no tendria sentido hacer un catchap mayor al que soporta el buffer de tu server), le procederas a cerrar la conexion independientemente de si acerto o lo fallo, simplemente por que no contemplas que tu codigo tenga la posibilidad de fallar alli. Mi recomendacion es que uses esta clausula de forma mas responsable especificando a except el tipo de error que quieres capturar, puedes capturar dos errores al mismo tiempo para solo tener que usar una clausula try-except a la vez con la misma funcionalidad en el except, lo que seria algo asi:
Código: python
try:
    # code
except (name_error1, name_error2):
    # code
Yo personalmente pienso que no es bueno usar try-catch tal como lo haces, pienso que es una mala practica y hace que no comprendas completamente los errores que se pueden generar en dicha porcion de codigo, ademas de que pones un comportamiento default para cualquier tipo de error que se genere en respuesta.

Ahora, otra cosa que podemos hacer para mejorar este codigo es hacer al servidor multithreading, ya que si un cliente se conecta al servidor y se queda hay esperando, y mientras, otro cliente intenta conectarse. El segundo cliente no podra establecer una conexion por que el servidor aun esta atendiendo al cliente1. Por esta parte podrias hacer uso del metodo .timeout si mal no recuerdo tmb, que te permite especificar cuanto tiempo puede estar un cliente conectado sin hacer nada, por defecto creo recordar que este valor es 0, por lo que es un tiempo indefinido, y esto se podria usar tmb para explotar tu servidor, ya que puedes establecer multiples conexiones contra tu servicio y hacer nada, lo que a la larga haria que el server no pueda aceptar mas conexiones y dejes a clientes reales sin la posibilidad de interactuar con tu servicio.
Tambien deberia haber un try-catch adecuado para bind ya que si el puerto que va a usar tu servicio ya esta siendo usado por otro,tu codigo dara un error en dicha linea.

Como curiosidad hay que decir que no es necesario que hagas esto:
Código: python
socket.socket(socket.AF_INET,  socket.SOCK_STREAM) 

 Puedes hacer esto simplemente que hace lo mismo ya que el constructor de socket toma esos valores por defecto:
Código: python
socket.socket() 
Si quisieras hacer una conexion UDP o de otro tipo, ahi si tendrias que meterle los valores necesarios al constructor para realizar un socket del tipo que quieres.

No es necesario que hagas esto:
Código: php
str(capclient)
Por que al usar el metodo .decode ya lo transforma a str.
Luego tambien, en un servidor algo mas real, bloquearias al usuario mediante su direccion IP y otros datos que este normalmente te reportaria, puedes hacer que tu servidor necesite tener registrado en una base de datos una serie de clientes con sus nombres para realizar una conexion exitosa, y que el cliente tenga que especificar su nombre para poder acceder y de caso contrario pues simplemente le cierras la conexion. Si el usuario falla la password podrias bloquearle la conexión por su nickname simplemente.
Espero haberte ayudado

Hola hermano, buenos días. Este código era una beta de hace tiempo, mi manera de programar es primero hacerlo funcional y luego pulirlo al máximo;
Agradezco mucho tu corrección, es de gran ayuda, saludos bro!

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
                             

Hola, este es mi tercer post, en esta ocasión les traigo el Servidor con Socket 2.0 con mayor seguridad para experimentar y practicar tus broteforces.
≡¿Por que haces esto si no son buenos códigos?                                               
≡ .1 Hago esto para la gente que recién esta empezando en estos temas, así     
≡  experimentan y aprenden, no son tan buenos códigos por que no es necesario.
≡¿Harás otra parte con el servidor con mas seguridad?                                     
≡ .2 Posiblemente, todo depende de mi tiempo y ganas.
                                   
[move]- Gracias a mi amigo M4 por darme permiso de usar la función de captcha, créditos para él.[/move]




Me lo intente currar un poco para que realmente les pueda ayudar, si comentan y dan su opinión lo agradecería mucho.
Si tienen algún problema con el código no duden en comentarme para que se los resuelva, posiblemente de error por la tabulación, aseguraos de ponerlos bien jeje
si gustan pueden poner en los comentarios que quieren que traiga la próxima vez, si se hacerlo y dispongo del tiempo se los puedo traer
Versión 1.0 del Servidor: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Código: python
#!/usr/bin/env python
import socket,os,random,string 

host="0.0.0.0" 
port=1879 
password="connor"  

s=socket.socket(socket.AF_INET,  socket.SOCK_STREAM) 
s.bind((host, port)) 

def clear(): #La famosa funcion
    if os.name == "nt":
        os.system("cls")
    else:
        os.system("clear")

clear()

print("{*} Servidor encendido.")
sgd = 1 

def capcha():  #funcion del captcha < Creditos a M4
	a=random.choices(string.ascii_uppercase, k=4)
	print("Capcha solicitado "+"".join(a))
	return a
while 1:
    s.listen(2) 
    conn, addr = s.accept()
    clip = addr 
    print("{*} Alguien se ha conectado al servidor: "+str(clip)+"\n") 

    capvalue="".join(capcha()) 
    conn.send(capvalue.encode("utf8")) 
    conn.send("\nCapcha> ".encode("utf8")) 
    try:
        capclient=conn.recv(1024).decode("utf8") 
        capclient=capclient.replace("\n","")  
        if str(capclient)==capvalue: 
            print("{*} El usuario entro con el captcha correcto.")
            conn.send("{*} Captcha correcto\n".encode("utf8")) 
            while True:
                conn.send("Pass> ".encode("utf8")) 
                data=conn.recv(1024).decode("utf8") 
                data=data.replace("\n", "") 
                if data==password or str(data)==password:
                    conn.send("GG, pass correcta".encode("utf8")) 
                    print("El usuario uso la contraseña correcta")
                    break
                else:
                    print("Un user fracaso al poner la contraseña: "+data+"\nIntento numero: "+str(sgd)+"\n") 
                    sgd = sgd + 1
                    if sgd==5:
                        conn.send("{*} El Servidor se cierra por ataque de bruteforce".encode("utf8"))
                        print("{*} El servidor fue detenido por ataque de bruteforce\n")
                        print("{*} La IP del posible atacante: " + str(clip))
                        break
                        conn.close()
                        s.close()
                    else:
                        continue
                        conn.send("Contraseña incorrecta\n".encode("utf8"))
        else:
            print("El usuario ha fallado el capcha:"+ capclient)
            conn.send("Failed capcha\n".encode("utf8"))
            conn.close()
    except:
        print("El user se ha desconectado")
        conn.close()

Sé que no es el mejor código del mundo, pero sirve para practicar, el próxima hare algo que sea  mas parecido a un hacker de películas, ya verán jaja, quizás me tarde mas en terminarlo y etc.
Espero que te guste el código y adiós, cuidate.  ;) ;D

Edit: Si no sabes como hacer el cliente acá te dejo la base y te explico mas o menos de que va, en la proxima versión que haga explicare a detalle.

Código: python
import socket #Importamos Socket, es importante ya que sin eso basicamente no funcionaria nada

host="0.0.0.0" #Aca es donde ponemos la IP, ojo, tenes que poner la misma que pusiste en el servidor, pero igual es mejor dejarlo como esta

port="24" #Lo mismo con la IP, si quieren este pueden cambiarlo, si lo cambian y dice algo como "Permiso denegado" es que no les deja usar ese puerto

s=socket.socket(socket.AF_INET, socket.SOCK_STREAM) #Base del socket (no recomiendo tocar, pero si quieren pueden buscar mejores opciones)
 s.connect((host, port)) #Esto da la orden que se tiene que conectar al puerto e ip


#Datos extras:
#Recomiendo usar nc para ver el servidor como se muestra en la primera imagen en kali linux, se usa de este modo: nc (IP) (PUERTO) ejemplo: nc 0.0.0.0 80
#Recomiendo que si tienen algun fallo o duda me lo dejen en los comentarios ya que se intentare echarles un cable
#Lo mas posible es que de error en los codigos por que quizas esten mal tabulados, ya que al copiar y pegar se modifican las tabulaciones para cualquier lado
#Recuerda que socket es un modulo del cual es algo complicado de usar, pero con tiempo y practica se puede dominar, no todo sale a la primera, lo mas probable es que de error al principio tu cliente
#Tambien recuerda que 0.0.0.0 es igual a localhost, es decir, tu amigo no podra ejecutar el servidor y vos hacer el bruteforce, para eso estan cosas como ngrok del cual podes buscar tutoriales
#de como usarlo, pero no recomiendo usarlo, ya que ngrok para hacer bruteforce al enviar muchas peticiones se cierra


Hola bro, un placer, me gustaría decirte que hay mejores maneras de limpiar la pantalla que usando el comando cls o clear, puedes investigar, sobre el modulo colorama que te permite hacer esto directamente y sin tener que averiguar en que plataforma se esta corriendo tu codigo. Tambien tengo que mencionar que uses las clausulas try-except de forma un poco irresponsable, quiero decir, cualquier error del tipo que sea que ocurra dentro de estas clausulas lo reportara como que el usuario fallo el catchap y le cierras la misma conexion. Esto no es correcto, ya que si por ejemplo, el cliente manda un buffer de mas de 1024 bytes, como tu en tu server has puesto.un .recv(1024), esto generara un error, y aunque el cliente haya acertado el catchap(cosa que no tendria sentido hacer un catchap mayor al que soporta el buffer de tu server), le procederas a cerrar la conexion independientemente de si acerto o lo fallo, simplemente por que no contemplas que tu codigo tenga la posibilidad de fallar alli. Mi recomendacion es que uses esta clausula de forma mas responsable especificando a except el tipo de error que quieres capturar, puedes capturar dos errores al mismo tiempo para solo tener que usar una clausula try-except a la vez con la misma funcionalidad en el except, lo que seria algo asi:
Código: python
try:
    # code
except (name_error1, name_error2):
    # code
Yo personalmente pienso que no es bueno usar try-catch tal como lo haces, pienso que es una mala practica y hace que no comprendas completamente los errores que se pueden generar en dicha porcion de codigo, ademas de que pones un comportamiento default para cualquier tipo de error que se genere en respuesta.

Ahora, otra cosa que podemos hacer para mejorar este codigo es hacer al servidor multithreading, ya que si un cliente se conecta al servidor y se queda hay esperando, y mientras, otro cliente intenta conectarse. El segundo cliente no podra establecer una conexion por que el servidor aun esta atendiendo al cliente1. Por esta parte podrias hacer uso del metodo .timeout si mal no recuerdo tmb, que te permite especificar cuanto tiempo puede estar un cliente conectado sin hacer nada, por defecto creo recordar que este valor es 0, por lo que es un tiempo indefinido, y esto se podria usar tmb para explotar tu servidor, ya que puedes establecer multiples conexiones contra tu servicio y hacer nada, lo que a la larga haria que el server no pueda aceptar mas conexiones y dejes a clientes reales sin la posibilidad de interactuar con tu servicio.
Tambien deberia haber un try-catch adecuado para bind ya que si el puerto que va a usar tu servicio ya esta siendo usado por otro,tu codigo dara un error en dicha linea.

Como curiosidad hay que decir que no es necesario que hagas esto:
Código: python
socket.socket(socket.AF_INET,  socket.SOCK_STREAM) 

 Puedes hacer esto simplemente que hace lo mismo ya que el constructor de socket toma esos valores por defecto:
Código: python
socket.socket() 
Si quisieras hacer una conexion UDP o de otro tipo, ahi si tendrias que meterle los valores necesarios al constructor para realizar un socket del tipo que quieres.

No es necesario que hagas esto:
Código: php
str(capclient)
Por que al usar el metodo .decode ya lo transforma a str.
Luego tambien, en un servidor algo mas real, bloquearias al usuario mediante su direccion IP y otros datos que este normalmente te reportaria, puedes hacer que tu servidor necesite tener registrado en una base de datos una serie de clientes con sus nombres para realizar una conexion exitosa, y que el cliente tenga que especificar su nombre para poder acceder y de caso contrario pues simplemente le cierras la conexion. Si el usuario falla la password podrias bloquearle la conexión por su nickname simplemente.
Espero haberte ayudado

Hola hermano, buenos días. Este código era una beta de hace tiempo, mi manera de programar es primero hacerlo funcional y luego pulirlo al máximo;
Agradezco mucho tu corrección, es de gran ayuda, saludos bro!

O comprendo, entonces discúlpame por no haberlo interpretado como tal o por si lo habías indicado en alguno de tus pots, por no leerlo, a la proxima lo tengo en cuenta, sabiendo ya que eres tu :D