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

 

 


Tema destacado: ¿Eres nuevo? ¿Tienes dudas acerca del funcionamiento de la comunidad? Lee las Reglas Generales


  Mostrar Mensajes
Páginas: 1 2 [3] 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 ... 29
21  Programación / Scripting / Re: Ctrl+C en windows me lo detecta pero no sale del script | Python3 en: 10 Enero 2022, 10:25 am
Buenos dias!
Solución
Ya esta resuelto. Puede que no sea la mejor opcion, ni la más adecuada, pero me veo obligado ha hacerlo así pues Windows tiende a matar los procesos.

Así como lo queria hacer tendría que funcionar para mis ojos, pero la realidad es que no, y no se porque (en Linux funcionaria....).

Lo que hice es añadir el HandlerSignals() justo despues de crear el socket (dentro del __createSocket, despues del listen)

main.py:
Código
  1. #!/usr/bin/python3
  2. import sys,socket,urllib3,time,multiprocessing, threading
  3. from sources.ClientListener import ClientListener
  4. from sources.handlerSignals import HandlerSignals
  5. from sources.utils import logFile, Hosts, getIpAddress, Notify
  6. from sources.Server import Server
  7. from sources.Requests import Requests
  8.  
  9. class SocketServer:
  10.    def __init__(self,**kwargs):
  11.        try:
  12.            # [...]
  13.            self.__createSocket()
  14.  
  15.        # When the service shutdown successfully
  16.        except (KeyboardInterrupt, SystemExit,GeneratorExit) as err:
  17.                None
  18.  
  19.        finally:
  20.            try:
  21.                self.sock.close()
  22.            except:
  23.                None
  24.            Notify("Turnning off ClassAdminS",logFile().message("Good Bye. What you have a good day :)", True, "INFO"))
  25.  
  26.    def __createSocket(self):
  27.        self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  28.        self.sock.bind(("",self.PORT))
  29.        self.sock.listen(self.CLIENTS)
  30.        HandlerSignals(self.sock)
  31.        Notify("Start ClassAdminS",logFile().message(f"Good days :D. I am listenning {self.CLIENTS} clients by port {self.PORT}.",True,"INFO"))
  32.        self.__handlerClients()
  33.  
  34. if __name__=="__main__":
  35.    SocketServer(args=sys.argv)
  36.  

La diferencia es que la funcion HnadlerSignals(sock) coge como parametro la variable que contiene el objecto socket.

handlerSignals.py
Código
  1. import signal, platform
  2. class HandlerSignals:
  3.    def __init__(self,sock):
  4.        self.sock = sock
  5.        signal.signal(signal.SIGTERM,self.shutdown)
  6.        # shutdown signal in Windows
  7.        if platform.system().upper()=="WINDOWS":
  8.            import win32api
  9.            win32api.SetConsoleCtrlHandler(self.shutdownWin, True)
  10.  
  11.    def shutdownWin(self,a):
  12.        self.sock.close()
  13.  
  14.    def shutdown(self,code,msg):
  15.        raise SystemExit
  16.  
La gran diferencia de handlerSignals.py con el anterior es que, al hacer Ctrl+C y llamar a la funcion shutdownWin(), este cierra el socket y me muestra el Notify de el try/except/finally del main.py.

Así me funciona correctamente, aunque no se si es muy buena practica,pero me funciona.

Hay que tener en cuenta que el HandlerSignals() debe estar justo después de la declaración de la variable self.sock. Yo lo pongo despues del self.sock.listen().

https://imgur.com/gallery/B2VR7Lp

¿Porque tan pesado con el Ctrl+C en CMD?
Por dos cosas:
  • Pues para salir limpiamente y correctamente
  • Pues este script lo ejecuto como servicio con NSSM

NSSM al parar un servicio, implicitamente hace un Ctrl+C y espera una reaccion. Si no hay reaccion este se cierra forzosamente y muestra el siguiente mensaje.
https://imgur.com/gallery/n5UO4sL

Ahora si el script detecta el Ctrl+C en CMD....
https://imgur.com/gallery/qLnBGOi

En el NSSM este es configurado así
https://imgur.com/gallery/ZEwvmOq

Gracias por vuestra atencion! ;-)
22  Programación / Scripting / Ctrl+C en windows me lo detecta pero no sale del script | Python3 en: 9 Enero 2022, 18:45 pm
Buenas,
Feliz año  ;D

Estoy con un socket servidor que al estar corriendo quiero que si el usuario hace Ctrl+C en el CMD este sale limpiamente (con un SIGINT).

main.py
Código
  1. from sources.handlerSignals import HandlerSignals
  2. class SocketServer:
  3.    def __init__(self,**kwargs):
  4.        try:
  5.            HandlerSignals()
  6.            # [...]
  7.  
  8.        # When the service shutdown successfully
  9.        except (KeyboardInterrupt, SystemExit,GeneratorExit) as err:
  10.            print("KeyboardInterrupt")
  11.            None
  12.  
  13.        finally:
  14.            try:
  15.                self.sock.close()
  16.            except:
  17.                None
  18.            print("Turnning off ClassAdminS")
  19.            sys.exit(0)
  20.  
  21.    # continue code
  22. if __name__=="__main__":
  23.    SocketServer(args=sys.argv)
  24.  

El HandlerSignals() esta en una carpeta 'sources' en el archivo handlerSignals
  -main.py
  |
  - sources/
      \-- handlerSignals.py


handlerSignals.py
Código
  1. import signal, sys, platform
  2. class HandlerSignals:
  3.    def __init__(self):
  4.        signal.signal(signal.SIGTERM,self.shutdown)
  5.  
  6.        # shutdown signal in Windows
  7.        if platform.system().upper()=="WINDOWS":
  8.            import win32api
  9.            win32api.SetConsoleCtrlHandler(self.shutdownWin, True)
  10.  
  11.    def shutdownWin(self,a):
  12.        print("Ctrl+c")
  13.        raise SystemExit
  14.  
  15.    def shutdown(self,code,msg):
  16.        raise SystemExit
  17.  


Como se puede ver si el sistema es Windows, se ejecuta
Citar
win32api.SetConsoleCtrlHandler(self.shutdownWin, True)
Que esta en escucha de Ctrl+C en windows CMD. Así que al ser presionado se llama a la funcion shutdownWin que este imprime "Ctrl+C" y lanza una excepcion SystemExit.

Que esta excepcion teoricamente es recogida por main.py que y sale de la terminal.

Pero no ocurre eso. Al lanzarse el SystemExit no imprime "KeyboardInterrupt". Y no se porque pasa....


https://imgur.com/gallery/x5jxQhM

Parece como si la excepcion no se pueda pasar al main.py

Como lo puedo solucionar...? Gracias por vuestra atencion.
23  Programación / Scripting / Re: Consulta MySQL desde una función en: 9 Enero 2022, 18:24 pm
Buenas!! Feliz año!

Y si llamas a mostrarCliente() en el finally de la funcion crearCliente(). Y en el mostrarCliente() reutilizas la variable cur.
Código
  1. import pymysql
  2.  
  3. con = pymysql.connect(host='sql11.freemysqlhosting.net',
  4.                             user='sql11459959',
  5.                             password='kcF1ibf3Me',
  6.                             database='sql11459959',
  7.                             charset='utf8mb4',
  8.                             cursorclass=pymysql.cursors.DictCursor)
  9.  
  10. def crearCliente():
  11.    try:
  12.        cur = con.cursor()
  13.        crearCliente = "INSERT INTO test1(name,email) VALUES ('prueba', 'prueba')"
  14.        cur.execute(crearCliente)
  15.        con.commit()
  16.  
  17.        #con.close()
  18.  
  19.        print("Se guardo correctamente")
  20.    except:
  21.        print ("Error")
  22.  
  23.    finally:
  24.        try:
  25.            mostrarCliente(con,cur)
  26.        except:
  27.            None
  28.  
  29.  
  30. def mostrarCliente(con,cur):
  31.    try:
  32.        mostrarCliente = "SELECT * FROM test1 WHERE id = 19"
  33.        cur.execute(mostrarCliente)
  34.        rows = cur.fetchall()
  35.        print("El cliente es:", rows)
  36.    except:
  37.        print("Error2")
  38.  
  39.    finally:
  40.        try:
  41.            con.close()
  42.        except:
  43.            None
  44.  
  45.  
  46.  
  47.  
  48. crearCliente()
  49. print ("Se ha guardado")
  50.  

No he probado el codigo...

Epero haberte ayudado :))
24  Programación / Scripting / Re: Consulta MySQL desde una función en: 23 Diciembre 2021, 20:49 pm
Buenas!
Disculpa las molestias cuando hice el finally que dentro hay otro try, debe de haber un except no otro finally, por la cual se debe quedar así
Código
  1.   finally:
  2.      try:
  3.          cursor.close()
  4.          db.close()
  5.      except:
  6.         None
  7.  
Pues queremos que si hay conexion se cierre y sino no hace nada.
Además da error porque requiere del modulo pymysql, cuyo modulo no has importado en ningun sitio
Código
  1. import pymysql
  2.  

Si no lo tienes instalado, lo puedes instalar haceindo
Citar
pip3 install pymysql

Buenas fiestas, y espero que te haya ayudado y te salga...Suerte  :D
25  Programación / Scripting / Re: Consulta MySQL desde una función en: 23 Diciembre 2021, 12:37 pm
Buenos dias!

RECOMENDACION: Elimina los datos de conexion de DB, ya que han sido probados, no te interesa que cualquiera pueda entrar. Auque no sea relevante para ti, y solo es de prueba. Además esta entrando como root y algúien podría eliminar la DB del hosting y liartela....

Con tu permiso, he entrado en tu DB y he comprobado que funciona correctamente. (solo he insertado unos datos en la tabla test1 y lo he vaciado sus registros)

 No habia caido en que al hacer la funcion crearCliente()
Código
  1. def crearCliente():
  2. crearCliente = "INSERT INTO test1(name,email) VALUES ('prueba','prueba')"  
  3. ttk.Label(mainframe, text="Haz creado un cliente").grid(column=40, row=150, sticky=W)
  4.  

No lo estas ejecutando en ninguna DB . Pues indicas el SQL pero no haces nada con el. Primero deberias de crear la conexion (como lo hicistes en conexion.py) y después ejecutar la variable crearCliente. Quedaria algo así

Código
  1. def crearCliente():
  2.   try:
  3.        db = pymysql.connect(....)
  4.        cursor = db.cursor()
  5. crearCliente = "INSERT INTO test1(name,email) VALUES ('prueba','prueba')"
  6.        cursor.execute(crearCliente)
  7. ttk.Label(mainframe, text="Haz creado un cliente").grid(column=40, row=150, sticky=W)
  8.   except:
  9.        ttk.Label(mainframe, text="Error en la DB").grid(column=40, row=150, sticky=W)
  10.   finally:
  11.      try:
  12.          cursor.close()
  13.          db.close()
  14.      finally:
  15.         None
  16.  

Ademas pondría un try/catch por si hay algun error en el SQL/conexion,etc....

Además le añado un finally para asegurar que siempre se me cierra la conexion, de un error o no.

Espero haberte ayudado y  felices fiestas  ;D
26  Programación / Scripting / Re: Consulta MySQL desde una función en: 22 Diciembre 2021, 20:09 pm
Bunos dias!

Me alegro que hayas podido mejorar en crear la tabla con PK y id autoincrementado.
Por lo que veo, esta todo bién. Me gustaría ver el archivo conexion.py pues puede que este fallando algo.

Ten en cuenta que si estas trabajando con un Web Hosting, este en su panel te dará la direccion al que tienes que ir. Puedo intuir que deberia estar así actualmente tu conexion.py
Código
  1. import pymysql
  2.  
  3. # Abre conexion con la base de datos
  4. db = pymysql.connect(host='freemysqlhosting.net',
  5.                             user='root',
  6.                             password='root',
  7.                             database='test',
  8.                             charset='utf8mb4',
  9.                             cursorclass=pymysql.cursors.DictCursor)
  10. # [...]
  11.  

Esto es un ejemplo, para saberlo tendrías que mirar en tu CPanel de tu proveedor de Hosting web. Un ejemplo sería:

https://imgur.com/gallery/itKoNsD

Ten en cuenta: que es este caso el host es 260mb.net pero para conexion con DB es sql113.260mb.net. Puede que el tuyo también sea algo así.

Espero haberte ayudado! Buenas fiestas y que te lo pases bien! :laugh: ;D
27  Programación / Scripting / Re: Consulta MySQL desde una función en: 20 Diciembre 2021, 20:53 pm
Buenos dias.
¿Porque falla y como solucionarlo?
Código
  1. # Seleccionador base de datos
  2. def crearCliente():
  3.    crearCliente1 = "INSERT INTO test(id,name,email) VALUES ('5','prueba','prueba')"
  4.  

El problema esta en la sentencia SQL.
La sintaxis es correcta pero los tipos de datos asociados de la columna no cuadran.

El id es una columna PRIMARY KEY, que identifica ese registro en concreto. Este normalmente es auto incremental que por cada insert que tu hagas este se incrementa.
El tipo de dato para un id autoincrementado es INT.

Como es INT (integer=entero), es un numero, por la cual no puedes añadir en el VALUES un '5', sino un 5.

El '5' no es igual a 5.
'5' con comillas simples ( ' ) o comillas dobles ( " ) significa que es un VARCHAR(), texto
5 (sin comillas) es un numero.


Propuesta de mejora

Configuraria en el gestor de bases de datos que la columna id fuera autoincrementado.

Yo no se como creas las tablas...si lo haces por interfaz grafica o SQL. Pero en SQL sería....
Código
  1. CREATE TABLE test1 (
  2.    id INT NOT NULL AUTO_INCREMENT,
  3.    name VARCHAR(20) NOT NULL,
  4.    email VARCHAR(100) NOT NULL,
  5.    CONSTRAINT test_PK PRIMARY KEY (id)
  6. );
  7.  

Si es AUTOINCREMENT no hace falta que insertes el 5 cuando hacer el INSERT.

Código
  1. INSERT INTO test(name,email) VALUES ('prueba','prueba');
  2.  
Recomendacion de seguridad
Yo no recomiendo como programador de esta app, que este ataque a la base de datos con el usuario root.
El usuario ROOT es el que tiene más privilegios, por lo cual tiene también acceso a las otras DB, este no se suele usar para desarollo.
Crea otro usuario especifico y este que unicamente tenga acceso a la DB especifica test.
Código
  1. CREATE USER 'test'@'localhost' IDENTIFIED BY 'root';
  2. GRANT ALL PRIVILEGES ON test.* TO 'test'@'localhost';
  3.  
La ultima sentencia le doy todos los permisos al usuario test que tenga acceso a la DB test.
28  Seguridad Informática / Seguridad / Re: ¿Porque el comando shred hace tantas iteraciones (minimo 3) para un borrado seguro? | Seguridad en: 15 Diciembre 2021, 12:07 pm
De venir, viene en la BIOS.
No necesariamente más tiempo, si al menos más complejo, que esto luego redunde en más tiempo o no es otra cosa, aunque puede asumirse que suele ser así.

Lo que en realidad incide es en la incapacidad de recuperación exhaustiva en el sentido de completitud, es decir no será un rescate tan riguroso, y por tanto quedarán más lagunas sin poder ser resueltas (independientemente del tiempo empleado, pero en efecto a más tiempo se le dedique más probable que se rescaten datos).
Entiendo ok, muchas gracias a los dos.
29  Seguridad Informática / Seguridad / Re: ¿Porque el comando shred hace tantas iteraciones (minimo 3) para un borrado seguro? | Seguridad en: 15 Diciembre 2021, 00:34 am
Más dudas.....
Como hago un eliminado seguro de un carpeta...
yo lo hago así
Código:
find ./carpeta -exec shred -uzv -n 10 {} +

Lo hago con find y shred, pero shred tiene internamente la posibilidad de eliminar de manera recursiva.....por curiosidad.....


Gracias por vuestra atencion y tiempo. Buenas noches.
30  Seguridad Informática / Seguridad / Re: ¿Porque el comando shred hace tantas iteraciones (minimo 3) para un borrado seguro? | Seguridad en: 15 Diciembre 2021, 00:23 am
Buenas! Si no he entendido mal de tu respuesta @XSStringManolo...  :D
Imagínate que eres pintor, pintas con spray desde 1 metro de distancia y tienes un cuadro. Pintaste un cuadro de rojo y lo quieres borrar escribiéndole uno verde encima. Le das una pasada de spray verde y habrás pintado una buena parte del rojo que había debajo, pero no lo pintaste todo. Es decir, ahora tienes rojo y verde mezclados. Si vuelves a darle otro chorro de spray desde un metro, habrás pintsod un poco mas del rojo de verde. Cuantas mas veces le des al spray, mas acabaras tapando el rojo con verde.

Cuando yo hago el shred -zu -n 10, tu similitud sería hacer como 10 pintadas en el cuadro....eso lo entiendo

Que pasa si solo le das una pintada y tapas bastante del rojo?
Esto sería el caso de que hiciera 1 pintada: shred -z -n 0. (por defecto hay uno, por la cual hago 0 pasadas opcionales + 1 que se hará por defecto)

Pues que pueden quedar las esquinas sin pintar, asique el que investigue, al ver las 4 esquinas y saber que es común pintar cuadrados, sabrá que a pesar de que pintaste de verde, antes había un cuadrado rojo ahí.
Si yo solo le hago una pasada, en un archivo que contiene 700K
Código:
%PDF-1.4
%����
1 0 obj
<</Creator (Mozilla/5.0 \(X11; Linux x86_64\) AppleWebKit/537.36 \(KHTML, like Gecko\) Chrome/96.0.4664.45 Safari/5>
/Producer (Skia/PDF m96)
/CreationDate (D:20211212130932+00'00')
/ModDate (D:20211212130932+00'00')>>
endobj
3 0 obj
<</ca 1
/BM /Normal>>
endobj
13 0 obj
<</Type /XObject
/Subtype /Image
/Width 140
/Height 245
/ColorSpace /DeviceRGB
/BitsPerComponent 8
/Filter /DCTDecode
/ColorTransform 0
/Length 5982>> stream
����^@^PJFIF^@^A^A^A^@x^@x^@^@��^@C^@
^G^G    ^G^F
        ^H      ^K^K
^L^O^Y^P^O^N^N^O^^^V^W^R^Y$ &%# #"(-90(*6+"#2D26;=@@@&0FKE>J9?@=��^@C^A^K^K^K^O^M^O^]^P^P^]=)#)====================>
....
y al ejecutar shred -z -n 0, este me sobrescribiria el fichero a
Código:
^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^...
que cuando más pasadas son más caracteres (^@) me genera....Estos caracteres random (sin ningun sentido) que unicamente sirve para "tapar"/sobreescribir los sectores de este archivo....
Haciendo que sea más dificil obtener el archivo original intactamente...


https://imgur.com/gallery/B5SJe2I

Por la cual si un perito forense obtiene este sector (todo el recuadro), unicamente vera el archivo corrupto o deformado....o que incluso se puede leer/abrir....

Al final, tu no escribes directamente en memoria, delegas en el sistema que lo haga él por eficiencia
Claro no lo escribes fisicamente sino que modificas los datos a la tabla de sistema de archivos, tanto el nombre como los datos. Y ya el sistema se encarga.

El formateo que hace por ejemplo windows, lo único que hace es borrar el sistema de ficheros y algunos archivos internos.
Esto cuando pasa, en un formateo rápido o formateo normal?





De hecho en los discos duros, hay una opción (típicamente no dispoonible/accesible al usuario), que permite indicar 'la fuerza' con que el disco duro escribe los datos. Cuanto más fuerte, más dificulta la lectura bajo él, pero también más fácil deja esa impresión para ser leída posteriormente, además, cuanto más fuerza se aplique con cada escritura, más se deteriora el disco,

Esto te refieres a los discos HDD, y como se puede acceder a esta opción no disponible por el usuario? En linux

Naturalmente no es asequible a cualquiera acceder al contenido previo, pero con paciencia (mucha paciencia) y la tecnología adecuada (un osciloscopio sería suficiente), pueden leerse varias copias previas (dicen que hasta 5), aunque asumo que esto último depende mucho de la tecnología empleada. Si no tienes registradas chorrocientas patentes, o eres multimillonario, ten por seguro que nadie va a perder tiempo en revisar lo que tenías escrito en tu disco duro, primeor porque no hay tanta gente que tenga la tecnología adecuada y segundo porque quienes la tienen la dedican a casos donde sea menester (que los contraten o ellos se autoempleen legal o ilegalmente).

En pocas palabrás, dices que cuando más sobreescrituras haces, más tiempo la persona interesada en sacar la informacion del HDD/SDD tardará en sacar la información e incluso este puede venir deformado.....Es así?


La salida que te ofrece, señala claramente en cada pasada el tipo de patrón utilizado...
luego lo que hace también es cambiar el nombre del fichero varias veces, antes de borrarlo de la tabla de ficheros (eliminación software), así también intenta que ni el nombre del mismo sea fácil de recuperar... para ser honestos, el nombre debiera ser remplazado primero por otro con la misma longitud que tiene el nombre actual... ahí me parece que empieza por uno mucho mas corto a la vista del nombre original (me edito, los '0' seguidos ocupan menos espacio y seguramente haya la misma cantidad de ceros que caracteres tiene el fichero.log).
Fíjate que en cada ocasión va acortando el nombre en un caracter menos.
Ok muchas gracias, ahora entiendo un poco mejor su significado.


Gracias a los dos @XSStringManolo y @Serapis, por la gran nivel de detalle al que se me ha respondido la duda. Muchas gracias.

Os he escrito así como más o menos lo he entendido y las dudas que me han surgido.

Muchas gracias por vuestro tiempo y honestidad.  :D
Páginas: 1 2 [3] 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 ... 29
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines