elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Guía rápida para descarga de herramientas gratuitas de seguridad y desinfección


  Mostrar Mensajes
Páginas: 1 2 3 4 5 6 7 8 9 10 [11] 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 ... 29
101  Programación / Scripting / [RESUELTO] ejecutar recv() temporalmente | Python3 sockets en: 11 Agosto 2020, 13:16 pm
RESUELTO

El resultado fue crear en el cliente un nuevo subproceso donde este en escucha a la respuesta del mensaje OK o TooManyClients, y con cuya respuesta guardarla en un booleano en la clase Globals y con ello hacer el condicional.

Y en el servidor cuando se conecta un cliente almacena en la lista  list_clients, creada en la clase Globals, una sublista con el nombre del cliente "SockServicesX", la conexion, y el booleano (por defecto False).
Más tarde creo la clase Select_user que es para seleccionar la sublista correspondiente al cliente conectado y con ello usar esa información para eliminar el usuario (sublista) con user.remove_client() o check la conexión user.check(conn)


Dejo el código en el proximo post

En conclusión no puede haber dos funciones recv() en una misma conexion socket

Buenas, estoy haciendo una conexion socket con varios clientes... con un máximo de 3 clientes. La idea es
 la siguiente:

socket server completo
Código
  1. #!/usr/bin/python3
  2. # Server
  3. import socket, threading, os, sys, time
  4.  
  5. # globals variables
  6. class globals:
  7. PORT, NUMBER_CONNECTIONS = 2048, 3 #constants
  8. number_client = 0 # count clients number
  9.  
  10. ### CONNECTIONS CLIENTS PARALLEL ###
  11.  
  12. def client(connection, address, idle):
  13.  
  14. ADDRESS_CLIENT, PORT_CLIENT = address[0], address[1]
  15.  
  16. print("client "+str(idle)+" ["+str(ADDRESS_CLIENT)+"] connected by "+str(PORT_CLIENT))
  17. while True:
  18. data = connection.recv(1024)
  19.  
  20. if data.decode() == "exit" or data.decode() == "close":
  21. connection.sendall(b"GoodBye")
  22. print("Client "+str(idle)+" ["+str(ADDRESS_CLIENT)+":"+str(PORT_CLIENT)+"] left")
  23. globals.number_client-=1 # subtract client at count
  24. break
  25. elif data.decode() == "KeyboardInterrupt":
  26. print("[\033[0;31m*\033[0m] Connection interrupted with Client "+str(idle))
  27. globals.number_client-=1 # subtract client at count
  28. break
  29. else:
  30. connection.sendall(data)
  31.  
  32. #close the connection with client
  33. connection.close()
  34.  
  35. ### MAIN ###
  36. try:
  37. sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  38. sock.bind(("",globals.PORT))
  39. sock.listen(globals.NUMBER_CONNECTIONS)
  40. print("[\033[0;34m*\033[0m] Listening port "+str(globals.PORT)+"....")
  41. while True:
  42. conn, addr = sock.accept()
  43. # if he is fourth client o more, not connect it
  44. if not globals.number_client+1 > globals.NUMBER_CONNECTIONS:
  45. globals.number_client+=1 # add client at count
  46. idle="SockServices"+str(globals.number_client)
  47. socket_client = threading.Thread(target=client,name=idle,args=(conn, addr, idle))
  48. ;
  49. socket_client.start()
  50. else:
  51. conn.sendall(b"TooManyClients")
  52.  
  53. except KeyboardInterrupt:
  54. # close the server
  55. print("\n[\033[1;34m*\033[0m] Closing server....")
  56. sock.close()
  57. os.system("fuser -k -n tcp %s 2>&1" % globals.PORT)
  58.  

explicación

variables globales
Código
  1. # globals variables
  2. class globals:
  3. PORT, NUMBER_CONNECTIONS = 2048, 3 #constants
  4. number_client = 0 # count clients number
  5.  

Creo una conexion socket nomal. [globals es una clase con las variables que se van a utilizan en todo el script (también en dentro de funciones)]

Código
  1.  
  2. sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  3. sock.bind(("",globals.PORT))
  4. sock.listen(globals.NUMBER_CONNECTIONS)
  5. print("[\033[0;34m*\033[0m] Listening port "+str(globals.PORT)+"....")
  6. while True:
  7. conn, addr = sock.accept()
  8. # if he is fourth client o more, not connect it
  9. if not globals.number_client+1 > globals.NUMBER_CONNECTIONS:
  10. globals.number_client+=1 # add client at count
  11. idle="SockServices"+str(globals.number_client)
  12. socket_client = threading.Thread(target=client,name=idle,args=(conn, addr, idle));
  13. socket_client.start()
  14. else:
  15. conn.sendall(b"TooManyClients")
  16.  

Cuando corre el bucle si es 1º,2º o 3º cliente la variable globals.number_client con valor por defecto 0 es incrementado, y creo una idle que es el nombre SockServices mas el numero de cliente, después creo un hilo con nombre SockServices donde va a ejecutar la funcion client

Código:
		if not globals.number_client+1 > globals.NUMBER_CONNECTIONS:
globals.number_client+=1 # add client at count
idle="SockServices"+str(globals.number_client)
socket_client = threading.Thread(target=client,name=idle,args=(conn, addr, idle));
socket_client.start()

Si la condición no se cumple, significa que ya hay tres clientes y me envias al cliente con conexion denegada la palabra "TooManyClients"

Código
  1. else:
  2. conn.sendall(b"TooManyClients")
  3.  

socket client completo

Código
  1. #!/usr/bin/python3
  2. #client
  3. import socket, time, os, sys
  4.  
  5. # CONSTANTS
  6. ADDRESS, PORT = "127.0.0.1", 2048
  7.  
  8. sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
  9. sock.connect((ADDRESS, PORT))
  10. sock.settimeout(3)
  11.  
  12. while True:
  13. try:
  14. try:
  15. #receive server's data
  16. check = sock.recv(1024)
  17. except socket.timeout:
  18. pass
  19.  
  20. if check.decode() == "TooManyClients":
  21. print("[\033[0;31m*\033[0m] Too many clients connected")
  22. sock.close()
  23. sys.exit()
  24. else:
  25. print("[\033[0;32m*\033[0m] Connection established")
  26. pass
  27.  
  28. sock.setblocking(s)
  29. while True:
  30. #prompt terminal
  31. prompt = input("> ")
  32.  
  33. #receive server's data
  34. data = sock.recv(1024)
  35.  
  36. print(data.decode())
  37.  
  38. #Send prompt's data to server
  39. sock.sendall(prompt.encode())
  40.  
  41. if data.decode() == "GoodBye":
  42. print("[\033[0;34m*\033[0m] Closing connection....")
  43. break
  44. except KeyboardInterrupt:
  45. sock.sendall(b"KeyboardInterrupt")
  46. print("\n[\033[0;31m*\033[0m] Connection interrupted, closing connection....")
  47. break
  48. sock.close()
  49.  

explicación

Creo una conexion socket normal y me conecto al servidor

Código
  1. # CONSTANTS
  2. ADDRESS, PORT = "127.0.0.1", 2048
  3.  
  4. sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
  5. sock.connect((ADDRESS, PORT))
  6.  

Una vez hecha la conexion ejecuto el primer bucle while True, que lo ejecuto para saber si el cliente se puede conectar o no.
Primero recibo los datos del servidor

Código
  1. while True:
  2. try:
  3. #receive server's data
  4. data = sock.recv(1024)
  5.  

Sí lo que recibo es TooManyClients, le digo al cliente que no se puede conectar porque el foro de clientes está completo y cierro la conexion

Código
  1. if data.decode() == "TooManyClients":
  2. print("[\033[0;31m*\033[0m] Too many clients connected")
  3. sock.close()
  4. sys.exit()
  5.  

Si no recibo nada imprime que esto conectado al servidor y ejecuta el siguiente bucle.

Código
  1. else:
  2. print("[\033[0;32m*\033[0m] Connection established")
  3. pass
  4. while True:
  5. #prompt terminal
  6. prompt = input("> ")
  7.  
  8. print(data.decode())
  9.  
  10. #Send prompt's data to server
  11. sock.sendall(prompt.encode())
  12.  
  13. if data.decode() == "GoodBye":
  14. print("[\033[0;34m*\033[0m] Closing connection....")
  15. break
  16.  

Que el siguiente bucle ya podré enviar datos al servidor

problema

Como podeis ver en la imagen cuando me conecto, no me imprime el mensaje Connection establlished, sino que se queda como en escucha, en el cuarto intento de conexión (cuadro izquierdo abajo), me imprime el mensaje Too many clients connected

Creo que el problema esta en el lado cliente, en el primer while True, que esta recibiendo los datos

Código
  1. sock.connect((ADDRESS, PORT))
  2. while True:
  3. try:
  4. #receive server's data
  5. data = sock.recv(1024)
  6.  

El problema es que el recv() se queda en escucha y como no recibe nada... ya que el condicional if que valida el usuario en socket server no envia nada al cliente.

Código
  1. if not globals.number_client+1 > globals.NUMBER_CONNECTIONS:
  2. globals.number_client+=1 # add client at count
  3. idle="SockServices"+str(globals.number_client)
  4. socket_client = threading.Thread(target=client,name=idle,args=(conn, addr, idle));
  5. socket_client.start()
  6. else:
  7. conn.sendall(b"TooManyClients")
  8.  


Sí en la condicional if le envio un OK, y con esto, se me inicia pero si envio algo del cliente al servidor siempre me recibe el mensaje OK, y no GoodBye

Código
  1. if not globals.number_client+1 > globals.NUMBER_CONNECTIONS:
  2.                        conn.sendall(b"OK")
  3. globals.number_client+=1 # add client at count
  4. idle="SockServices"+str(globals.number_client)
  5. socket_client = threading.Thread(target=client,name=idle,args=(conn, addr, idle));
  6. socket_client.start()
  7. else:
  8. conn.sendall(b"TooManyClients")
  9.  


Como la idea de enviar el mensaje OK no funciona... me preguntaria si se podría en el cliente dejar de escuchar los datos a recibir recv(), hacer la condicional y después volver a escuchar los datos.. Se puede hacer esto con sock.setblocking()?
Código
  1. while True:
  2. try:
  3. #receive server's data
  4. data = sock.recv(1024)
  5. if data.decode() == "TooManyClients":
  6. print("[\033[0;31m*\033[0m] Too many clients connected")
  7. sock.close()
  8. sys.exit()
  9. else:
  10. print("[\033[0;32m*\033[0m] Connection established")
  11. pass
  12.  

Leí un post en stackoverflow, donde preguntaba como podía recibir datos con recv() un tiempo con select
https://stackoverflow.com/questions/2719017/how-to-set-timeout-on-pythons-socket-recv-method#answer-2721734

Yo lo que hice es lo siguiente:

importe el modulo select
Código
  1. import select

dentro del bucle cree una variable ready que le permite escuchar el rec() solo 2 segundos y cuando acabe estos segundos. Mientras pasa estos dos segundos, recibo los datos en la variable data y si data contiene TooManyClients la varibale booleana es False (por defecto es True).

Si la variable es True ejecutaré el pass y pasará al siguiente while y si es False me imprimira que hay demasiados clientes.

Código
  1. sock.setblocking(0)
  2. check = True
  3. while True:
  4. try:
  5. ready = select.select([sock], [],  [], 2)
  6. if ready[0]:
  7. #receive server's data
  8. data = sock.recv(1024)
  9. if data.decode() == "TooManyClients":
  10. check=False
  11. if check==False:
  12. print("[\033[0;31m*\033[0m] Too many clients connected")
  13. sock.close()
  14. sys.exit()
  15. else:
  16. print("[\033[0;32m*\033[0m] Connection established")
  17. pass
  18.  

Pero tengo dos problemas con esta solucion
  • Este script se ejecutará en sistemas Windows y Linux y en Windows el modulo select no funcionara
  • Cuando estoy ya conectado al servidor y envio un dato, este no me leé la variable data

Se puede en:

Código
  1. else:
  2. print("[\033[0;32m*\033[0m] Connection established")
  3. pass
  4.  
o en:
Código
  1. while True:
  2. #prompt terminal
  3. prompt = input("> ")
  4.  
  5. print(data.decode())
  6.  
  7. #Send prompt's data to server
  8. sock.sendall(prompt.encode())
  9.  
  10.  

Volver a activar el recv()? Y si se puede como?



actualizado

Buenas como mi idea es que recv() se ejecute temporalmente en el primer while True del cliente inserte lo siguiente:

Código
  1. sock.connect(...)
  2. sock.settimeout(3)
  3.  
  4. while True:
  5. try:
  6. try:
  7. #receive server's data
  8. check = sock.recv(1024)
  9. except socket.timeout:
  10. pass
  11.  

Durante 3 segundos me ejecuta el sock.recv() y cuando pasa el tiempo me salta la excepcion por la cual pasa al siguiente bucle, el problema esta en que lo que obtuve de recv() lo quisiera almacenar en una variable, teoricamente en check, pero cuando hago las condicionales check.decode() no me detecta cuya variable

Citar
Services
Traceback (most recent call last):
  File "./SockServices", line 16, in <module>
    check = sock.recv(1024)
socket.timeout: timed out

During handling of the above exception, another exception occurred:                                    

Traceback (most recent call last):
  File "./SockServices", line 18, in <module>
    print(check.decode())
102  Programación / Scripting / Re: Ayuda python en: 11 Agosto 2020, 11:33 am
Mira esta url: https://www.mclibre.org/consultar/python/lecciones/python-cadenas.html#caracteres-especiales , aquí tienes algunos caracteres especiales
103  Sistemas Operativos / GNU/Linux / Porque en los archivos .service los comandos se encriben con la ruta absoluta? en: 31 Julio 2020, 13:12 pm
Buenas, esto es más por curiosidad y conocimento que por algun problema o error...

Cuando voy a /lib/systemd/system/ donde estan todos los archivos .service que son controlados por systemd. Por que los archivos donde estan ExecStart, ExecStop,.. con el comando a ejecutar se ejecuta de esta manera:
Código:
ExecStart=/usr/sbin/vsftpd /etc/vsftpd.conf
y no de esta:
Código:
ExecStart=vsftpd /etc/vsftpd.conf

Si al final es lo mismo y se ejecuta....

Que es por estetica o por algo en concreto?

Código:
[Unit]
Description=vsftpd FTP server
After=network.target

[Service]
Type=simple
ExecStart=/usr/sbin/vsftpd /etc/vsftpd.conf
ExecReload=/bin/kill -HUP $MAINPID
ExecStartPre=-/bin/mkdir -p /var/run/vsftpd/empty

[Install]
WantedBy=multi-user.target

Gracias
104  Seguridad Informática / Hacking / Re: Incinera tu sitio WEB! en: 29 Julio 2020, 17:07 pm
También intenté verificar si el formulario de correos tiene inyección de cabeceras:

Código:

asunto=test%0a%0cReply-To:%20test@demo.com&mensaje=test%0a%0a.%0a&anonimo=on


Ya que mail() de php adjunta las cabeceras de manera plana separadas por saltos de línea \r\n, pero no se si realmente funcionó porque no puedo hacer que me llegue una copia del correo, asi que podrías validar tu mismo, si realiza el filtrado de saltos de línea o no.

Sí, el formulario es vulnerable a inyeccion de cabeceras, cuando heche un vistazo a mi correo, vi un correo recibido el 28 julio 9:23pm con el asunto "test Reply-To:test@demo.com | Cleanet". Y con el cuerpo: "test".

No se te envió porque esta programado para que se me envie a mi correo. Esto lo que hace es conectarse al gmail de mi cuenta (cleanet) y lo reenvia a la propia.
105  Seguridad Informática / Hacking / Re: Incinera tu sitio WEB! en: 29 Julio 2020, 13:10 pm
El formulario de contacto tiene un problema, actualmente para enviar un correo debes resolver un valor en AES.
Buenas no entiendo, que es un valor en AES, yo programé el envio de correo gracias a PHPMailer

Cita de: WHK
Ok, este hash de la cookie la he reutilizado varias veces y el servidor me sigue diciendo que el mensaje ha sido enviado, asi que esto puede provocar un abuso del servicio.
Con esto te refieres a que, un cliente puede escribir un mensaje enviarlo, y enviar este mensaje, sin cambiarlo, tantas veces como quiera? O a que te refieres? Y con el mismo hash AES?

Cita de: WHK
También pude ver un directory listing: https://cleanet.260mb.net/lang/ , esto no causa ningún problema, pero si puede dar problemas serios si tienes algún directorio oculto que no esté protegido, por ejemplo, alguna carpeta donde almacenes los mensajes del formulario de contacto o algún plugin de php de terceros que pueda ser llamado de manera directa, como por ejemplo: https://cleanet.260mb.net/plugins/PHPMailer-master/src/
Ok, esto ya lo solucioné, inserté en un archivo .htaccess la siguiente linea:
Código:
Options -Indexes
Así ya cuando accedes a la url https://cleanet.260mb.net/lang/ te arrojará un errro 403
106  Seguridad Informática / Hacking / Re: Incinera tu sitio WEB! en: 28 Julio 2020, 18:01 pm
Un .txt no es válido, sino que el DNS debe contener la palabra elhacker.net en el registro TXT. Al estar hosteado en 260MB supongo que no podrás cambiar esa información.

Saludos.
Ahh! Entiendo... En este caso no puedo porque tendría que tocar el servidor DNS... Y poner la siguiente regla por ejemplo:

cleanet        IN        TXT        elhacker

Tendría que hacer algo así?
107  Seguridad Informática / Hacking / Re: Incinera tu sitio WEB! en: 28 Julio 2020, 10:45 am
Me gusta la idea! He desarrollado mi web hace un tiempo y tengo curiosidad de que vulnerabilidades tengo.

Este sitio web esta hospeado en 260MB la url es https://cleanet.260mb.net
TXT: https://cleanet.260mb.net/hackme.txt
108  Programación / Scripting / Re: Script con archivos autoextraibles en: 27 Julio 2020, 17:28 pm
La idea es que entiendas el código, si tienes cualquier duda sobre ello, pregunta  ;-)
109  Programación / Scripting / Re: Script con archivos autoextraibles en: 26 Julio 2020, 20:33 pm
Claro que es posible, un archivo no es más que binario. Puedes comprimirlo, descomprimirlo, cifrarlo o lo que quieras.

Busca una librería de compresión y su documentación.
O un algoritmo e implementalo.
O invéntalo tu de 0.

Como dice nuestro compañero, un archivo es un binario. Yo hace más o menos un año o por allá en primero de grado medio de FP, quiera hacer un "backdoor", con conexion socket cliente-servidor. Donde el cliente podía subir un archivo de su escritorio local al servidor y viceversa. Una pena que perdiera ese códgo...

Por suerte el codigo esta en este foro: https://foro.elhacker.net/scripting/conexion_sockets_en_python_con_ip_publica-t493988.0.html;msg2194422
110  Programación / Scripting / Re: Función for (python), duda de "novato". en: 25 Julio 2020, 19:54 pm
Citar
¿Por qué si Indice = 0 todo va bien, pero si Indice = 1, la maquina me devuelve: "lista[Indice] *= 10
IndexError= list idex out of range "?
Porque al final de la lista, el la variable indice tendrá un numero mayor del indice existente.

para mostrar un elemento en la lista sería lo siguiente.
Código:
 lista = [1,2,3,4,5,6,7,8,9]
 lista[0] => output: 1
 lista[1] => output: 2
 lista[2] => output: 3
 lista[3] => output: 4
 lista[4] => output: 5
 lista[5] => output: 6
 lista[6] => output: 7
 lista[7] => output: 8
 lista[8] => output: 9
 lista[9] => IndexError= list idex out of range
Ya que en la posición 9 ya no hay ningun elemento

SI la lista fuera:
Código:
 lista = [1,2,3,4,5,6,7,8,9,10]
 lista[0] => output: 1
 lista[1] => output: 2
 lista[2] => output: 3
 lista[3] => output: 4
 lista[4] => output: 5
 lista[5] => output: 6
 lista[6] => output: 7
 lista[7] => output: 8
 lista[8] => output: 9
 lista[9] => 10
La posicion 9 tendría el valor 10, si ahora en esta lista pones un numero mayor este te saltará el error IndexError= list idex out of range

Esto lo tienes claro? Una vez entiendes esto... veamos tu codigo

Código:
#Modificar una lista.
lista = [1,2,3,4,5,6,7,8,9]
Indice = 0
for recorrer in lista:
    lista[Indice] *= 10
    Indice += 1
print(lista)

Este crea una lista y en la variable Indice el valor por defecto es 0. Después leemos todos los elementos de la lista con un bucle for
Código:
for recorrer in lista:
    lista[Indice] *= 10
    Indice += 1
El bucle para cada elemento ejecutará lo que haya dentro. así que:

Código:
    1º pasada:
           lista[0] *=10 # output 10
    2º pasada:
           lista[1] *=10 # output 20
    3º pasada:
           lista[2] *=10 # output 30
    ....
    9º pasada:
          lista[8] *=10 # output 90 (9*10)

Ahora pongamos la variable Indice como valor 1 por defecto
Código:
    1º pasada:
           lista[1] *=10 # output 20
    2º pasada:
           lista[2] *=10 # output 30
    3º pasada:
           lista[3] *=10 # output 40
    ....
    9º pasada:
          lista[9] *=10 # output ERROR IndexError= list idex out of range
Y como da un error, ya no puede acabar de ejecutar el script

Citar
¿Por qué es necesario el Indice en "lista[Indice] *= 10"?
Porque si no, no estas especificando ningún número para que pueda ejecutar la operacion.

Espero que te haya podido resolver tu duda!  :). Y suerte con tus estudios.
Páginas: 1 2 3 4 5 6 7 8 9 10 [11] 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 ... 29
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines