¿Se pueden pasar por alto las contraseñas de software mediante ingeniería inversa?

41

Digamos, tengo privilegios de administrador en mi sistema operativo (Windows o lo que sea). Cuando se instala y ejecuta el software XYZ , eso significa que hay comunicación entre el sistema operativo y XYZ y el sistema operativo se ejecuta y ve todo lo que hace XYZ .

Aquí está mi percepción de las contraseñas (como las contraseñas .zip):

¿Es posible alterar la lógica del software para ejecutar el comando en lugar de otro comando? Si es así, ¿entonces nada puede ser protegido de las grietas?

    
pregunta T.Todua 10.12.2016 - 19:05
fuente

11 respuestas

80

En resumen, sí, puedes modificar el ejecutable, usar un depurador, etc. para alterar la lógica del código que se está ejecutando.

Pero, eso puede no ser suficiente.

Para usar su ejemplo de "contraseñas .zip", los archivos protegidos con contraseña usan la contraseña para obtener una clave de cifrado. A menos que proporcione una contraseña correcta, la clave generada será incorrecta, e incluso si la modifica para usar una clave incorrecta, no descifra correctamente el archivo ZIP.

Otro escenario podría involucrar un ejecutable setuid que se ejecuta con privilegios más altos. Puede ejecutarlo bajo un depurador, o copiarlo a su cuenta de usuario y hacer cambios, pero todo lo que logrará es ejecutarlo con los permisos de su usuario, lo que anulará las posibilidades de explotación.

    
respondido por el Alexander O'Mara 10.12.2016 - 19:21
fuente
42

Bueno, tu percepción de las contraseñas .zip no es precisa. El enfoque, también utilizado por muchos otros programas es siempre ejecutar un algoritmo de descifrado y obtener un resultado, incluso antes de que el programa llegue a la decisión de "buena o mala contraseña". El truco es que el descifrado produce basura en cualquier contraseña excepto una buena que "mágicamente" (o más bien - matemáticamente) calcula los datos adecuados. Entonces, el programa no sabe cuál es la contraseña correcta.

El momento "bueno o malo" en el que desea piratear solo verifica si el resultado es basura. No es mucho beneficio anular eso.

    
respondido por el kubanczyk 10.12.2016 - 20:51
fuente
21

Sí y No .

Ya que nadie ha creado un ejemplo de la vida real (no relacionado con la computadora), lo intentaré aquí:

Imagínate tratando de abordar un vuelo. Necesitas una tarjeta de embarque, o los tíos de seguridad no te dejarán pasar. Si tiene acceso al sistema y puede modificarlo (digamos que es el CEO), ¿puede pasar por alto la seguridad? ¡Sí! Usted puede:

  • Eliminar los tipos de seguridad (eliminar todo el componente de autenticación)
  • Pídales a los muchachos que dejen entrar a todos (quite el cheque "si el pasajero tiene una tarjeta de embarque válida")
  • Pídales a los muchachos que den acceso si alguien presenta una tarjeta de embarque especial (agregue una nueva regla de validación para permitir credenciales falsas)

Ahora, otro escenario: un montón de cajas fuertes se almacenan en un banco. Para abrir una caja fuerte, necesita una llave física para activar la cerradura.

¿Puedes sacar el truco anterior? Sí puedes, pero no ayudará. No es como si el tipo de seguridad que está allí tiene acceso a todas las cajas fuertes, no tiene la llave de ninguna de las cajas fuertes. Puedes vencerlo, pero él no solo posee lo que es necesario (la llave física) para abrir las cerraduras.

Puedes intentar seleccionar el bloqueo (fuerza bruta), pero consumirías mucho tiempo (la matemática de las claves de cifrado modernas dice que necesitas miles de millones de años para desbloquearlo, incluso si tienes todas las computadoras del mundo). haciéndolo por ti). Así que ahí está: en este diseño (cifrado de datos), la única forma de obtener los datos almacenados es mediante una clave, lo que hace que sea imposible omitirla.

    
respondido por el kevin 12.12.2016 - 12:20
fuente
18

Claro, el software puede hacer lo que usted programe para hacer.

Como ejemplo trivial, si me proporcionaron un programa de Python que comprobó una contraseña:

password = raw_input('Enter your password: ')
if password != 'oh-so-secret':
    sys.exit(1)

do_secure_thing()

Simplemente podría cambiarlo para que no me importe cuál es la contraseña:

password = raw_input('Enter your password: ')

do_secure_thing()

(En este caso, también podría ver qué es la contraseña de texto simple codificada e ingresarla).

Con las aplicaciones binarias, debes descompilarlas antes de poder modificar la fuente, pero hay muchos descompiladores para lenguajes comunes.

Por eso existe firma de código .

Ahora, si este no es su propio sistema, sus opciones pueden ser un poco más limitadas. En la mayoría de los sistemas similares a Unix, los ejecutables generalmente se almacenan con permisos de solo lectura y ejecución para usuarios no root; por lo tanto, si no es root, no puede modificar el ejecutable de destino. Hay otros métodos menos directos que puedes probar, pero si fallas, estás pensando en moverte a un vector diferente.

Por ejemplo, un keylogger registrará las contraseñas que ingresa el usuario, lo que le permitirá reutilizarlos por su cuenta más adelante.

Otro método de ataque que no requiere modificar la fuente de un programa es modificar la ruta de carga de la biblioteca dinámica de manera que el programa utilice una llamada de biblioteca que usted haya escrito, en lugar de la que espera. Si usan una biblioteca externa, cargada dinámicamente para la administración de contraseñas, y esa biblioteca tiene una función verify_password() que devuelve un booleano, puede escribir su propio verify_password() que siempre devuelve true, y cargarlo en su lugar.

La distinción real que cambia la respuesta de "sí" a "no" es si la contraseña no es realmente una contraseña, sino una clave de cifrado. Si los datos están encriptados, entonces no importa lo que hagan los programas externos, los datos que aún están encriptados hasta que el algoritmo de descifrado se alimenta con la clave adecuada.

    
respondido por el Xiong Chiamiov 10.12.2016 - 19:38
fuente
5

Suponga que tiene una aplicación que almacena datos en un archivo de texto (o una pequeña base de datos), pero para acceder al archivo desde la aplicación debe ingresar una contraseña o usar un proceso especial. Simplemente puede abrir el archivo de texto (o db) desde el directorio de archivos usando el sistema operativo (no se requiere ingeniería inversa). Esto solía ocurrir mucho en programas más antiguos (juegos, especialmente).

Es por eso que las aplicaciones que esperan estar seguras toman medidas para proteger los datos del propio sistema operativo. Como cifrar los datos u ofuscarlos para que sea difícil de usar.

    
respondido por el schroeder 10.12.2016 - 19:36
fuente
3

Depende de cómo el software XYZ utiliza la contraseña para producir la acción deseada y con qué tipo de datos trabaja.

Si observamos el algoritmo abstracto del programa XYZ sería:

  1. Pida al usuario que ingrese la contraseña.
  2. Haga algo con la contraseña ingresada por el usuario.
  3. Producir resultados deseables (o realizar acciones deseables).

Por lo tanto, su pregunta puede reducirse al paso # 3 :

¿Es posible producir un resultado deseable (o realizar una acción) sin utilizar el programa XYZ?

Hay muchas variantes posibles aquí, pero el punto principal es que el software XYZ realiza pasos particulares para producir el resultado.

Si se puede crear un programa ABC que puede producir el mismo resultado en un tiempo razonable sin necesidad de una contraseña, se puede omitir XYZ .

Eso indicaría que toda la "protección" se implementa en el programa XYZ .

Si la creación de dicho programa ABC no es posible, la protección se basa en un algoritmo que requiere la contraseña independientemente de qué programa esté intentando usarlo .

Ejemplo 1 : una cuenta de sistema operativo sin privilegios no puede establecer una contraseña para otro usuario, ya que el sistema operativo la impone. Así que el sistema operativo en este caso es XYZ . Pero se puede iniciar el equipo desde una unidad de inicio y sobrescribir el archivo que contiene las contraseñas, ya que el sistema operativo original no funciona en este momento, por lo tanto, no puede imponer la protección. Por lo tanto, pudimos producir un resultado deseable sin utilizar el programa XYZ .

Ejemplo 2 : en el segundo ejemplo, la unidad del sistema del sistema operativo está correctamente encriptada con un fuerte algoritmo de cifrado. Si arrancamos la computadora con una unidad de arranque para intentar evitar el sistema operativo original, descubriremos que no podemos lograr nuestro objetivo, ya que no podemos acceder al archivo que contiene las contraseñas. Reside en una partición que debe descifrarse primero, pero no sabemos la contraseña. Un intento de forzar con fuerza el proceso de descifrado no traería el resultado deseable en el corto plazo, por lo que en este caso no fue posible omitir el programa XYZ ni ningún otro programa con funcionalidad similar, ya que el los datos subyacentes requieren la contraseña .

    
respondido por el VL-80 11.12.2016 - 19:44
fuente
3

La contraseña zip no es un ejemplo de lo que estás pensando. Pero muchas cosas son , en particular las versiones de "prueba" que están limitadas en tiempo o conjunto de características.

Recuerdo un par de artículos en una revista de programación (podría haber sido Lenguaje informático ) explicando cómo hacer eso y cómo frustrar los intentos de hacer eso a su código, respectivamente.

Sé de casos en los que fue literalmente tan simple como encontrar la declaración de comparación y cambiar la condición de salto, es decir, cambiar un byte, para evitar la verificación real.

Esto es a veces el caso ahora si el autor simplemente escribió la línea de código como parte del programa. Pero para las claves de activación y similares, ha surgido toda una industria y el autor puede incluir un kit que ofusca la prueba real y dificulta el funcionamiento del programa si se hacen intentos de solucionarlo utilizando técnicas comunes que son familiares para el código de depuración del programador. .

    
respondido por el JDługosz 12.12.2016 - 08:23
fuente
2

Todo depende de cómo funciona el sistema cuando se decodifica la contraseña.

Se está imaginando un sistema de contraseña de tipo "log in" muy básico que podría ser infiltrado. Sin embargo, hay algo parecido a los archivos ZIP, y los sitios web utilizan varios métodos para combatir a las personas que solo editan el sistema para obligar a revelar la contraseña.

Una forma es el uso de MD5 junto con 'salt' para agregar a la seguridad; esto funciona en el hecho de que la contraseña se convierte en un código irreconocible que no se puede devolver. Un ejemplo básico de lo que sucede es lo siguiente. sigue

El sistema solicita una contraseña, por ejemplo, CONTRASEÑA El sistema agrega "sal" a la contraseña, por ejemplo, 1234 (la contraseña es ahora PASSWORD1234) El sistema usa MD5 en la contraseña con salt - la mayoría de la gente sabrá que PASSWORD por sí misma generará el código MD5 319f4d26e3c536b5dd871bb2c52e3178 sin embargo, con la sal "1234" agregada a la contraseña, el MD5 se convierte en 579f276ad2a77fd1698c38e en este caso. p>

En este punto, el sistema aún no ha comprobado si esa contraseña era válida o no, luego pasa este nuevo código a otra sección del programa que decide si el código MD5 coincide o no con lo que se espera si aparece. el archivo (la contraseña inicial se ha descartado de la memoria).

Para que alguien se infiltre en este tipo de contraseña, necesitarán obtener la contraseña inicial que se ingresó primero, y luego averiguar si el programa permitió o no que se abriera el archivo. En una pieza de software en una computadora, es posible obtener la contraseña y luego verificar si el archivo se abrió y obtener la contraseña de esta manera, sin embargo, si la contraseña se envía como sal MD5 + a otro servidor ( por ejemplo, a través de javascript y PHP) se vuelve mucho más complicado porque una computadora tiene la contraseña en su memoria que convierte y el servidor php tiene solo la contraseña de sal md5 + que no se puede volver a convertir.

Además de eso, otro método utilizado es tomar la contraseña y codificarla dentro de los datos de alguna manera. Así es como funcionan los archivos zip. Por ejemplo, tengo un archivo con el siguiente texto ...

el zorro marrón rápido salta sobre el perro perezoso

Le doy una contraseña de una letra de! ok, sé que es un poco simple, pero este es un ejemplo simple: ¡la computadora podría convertir eso! en su equivalente ASCII y reste el código ASCII de cada letra para codificarlo: ¡el código ASCII para! es 33 y el código ascii para t es 116 y 116 - 33 = 83, que es el código ascii para una letra mayúscula S, de modo que cuando los datos están cifrados, la línea anterior termina almacenada como

SGD PTHBJ AQNVM ENW ITLOR NUDQ SGD K @ YX CNF

ahora, si alguien está tratando de desencriptar este mensaje, no sabe si tiene la contraseña correcta, ¡si ingresó la contraseña de # en lugar de! obtendrían el siguiente mensaje devuelto

vjg swkem dtqyp hqz lworu qxgt vjg nc | {fqi

lo que no tiene ningún sentido, por lo que la mayoría de los sistemas realmente comprueban la validez de una contraseña, pero la modifican inicialmente para que no pueda ser pirateada por alguien que simplemente desvía el resultado. La única vez que esto falla a veces es cuando alguien crea su propio sitio web o programa falso y consigue que el usuario ingrese inicialmente su contraseña en el programa o sitio web falso y, por supuesto, muchos sitios web ahora están evitando eso al usar tokens de autenticación que generan contraseñas especiales que solo son válidas por aproximadamente 5 minutos a la vez (por ejemplo, la clave inteligente HSBC).

    
respondido por el user1784974 12.12.2016 - 12:47
fuente
1

La pregunta necesita aclaración. Su comprensión de cómo se lee un archivo zip protegido por contraseña es incorrecta. Como han señalado otros, un archivo zip está cifrado (los datos están codificados) y la contraseña es la clave para descifrar.

Lo que está describiendo (una redirección de la ejecución del código a través de la ingeniería inversa del flujo de código) funcionaría para anular el "control de acceso" que impone el programa.

Entonces, a tu pregunta original:

  

¿Es posible alterar la lógica del software para ejecutar el comando?   de otro comando? Si es así, entonces nada puede ser protegido de   agrietamiento?

Es ciertamente posible alterar la lógica del software para ejecutar comandos, omitiendo el control de acceso para hacer algo que el programa podría hacer, a través de ingeniería inversa. Sin embargo, eso no es compatible con su segunda afirmación de que "nada puede protegerse contra el craqueo". El archivo zip encriptado es un buen ejemplo de dónde su control sobre el código no le permite obtener el contenido del archivo.

En ese caso, la clave no es un controlador de acceso que le impide ejecutar una ruta de código, sino un componente necesario para obtener los datos de texto sin formato. Nada que ver con el control de flujo del programa.

    
respondido por el JesseM 13.12.2016 - 01:51
fuente
-3

Esto se llama básicamente cracking y se puede hacer usando un depurador. Hay saltos condicionales como je, jne, jnz, etc. que se pueden detener para lograr esto. Los tutoriales de inversión de Lena en tuts4 deben ser un buen comienzo.

    
respondido por el jammy47 11.12.2016 - 23:11
fuente
-4

El proceso que podría describirse mejor como "ingeniería inversa" sería un Timing Attack , que implica analizar el tiempo tomado para verificar una contraseña. De hecho, es posible ralentizar el procesamiento de un algoritmo y contar la cantidad de tics del procesador necesarios para rechazar una contraseña. A medida que adivine más letras correctamente, demorará más en rechazarlo, por lo que puede guiarse en sus conjeturas.

Esto no es solo una situación hipotética; este ataque se ha utilizado contra SSL y algunas versiones de Unix.

    
respondido por el kokociel 13.12.2016 - 05:27
fuente

Lea otras preguntas en las etiquetas