Passwords en UNIX Como es bien sabido, la mayoría de los servidores conectados a la Red necesitan de un potente sistema operativo que permita gestionar la cantidad de procesos y usuarios que pueden encontrarse simultaneamente en el lugar. Para ello, los SSOO que más se emplean son aquellos basados en UNIX. Como objetivo inicial, se necesita entrar en el servidor, conectandonos a él como si se tratase de una máquina remota (telnet) pero debido a que se permite el acceso a multiples usuarios, los sistemas UNIX nos solicitaran un nombre de identificación acompañado de una clave. Dicho nombre debe encotrarse dado de alta en el sistema para que se pueda acceder. Cuando una persona desea entrar en una maquina, el proceso que se realiza en general es este: 1. Solicitar un login de acceso o nombre de usuario: en caso de que el nombre no sea correcto, el sistema no lo notificara para asi no dejar que la persona que entra sepa que accesos se encuentran dados de alta y cuales no. 2. Solicitar un password o palabra clave: en caso de que coincida con el que tiene asignado el login que se emplea, el sistema permitira el acceso. Los usuarios que se encuentran dados de alta en el sistema, asi como los passwords que emplean, se encuentran localizados en el fichero /etc/password. Por desgracia para algunos, y afortunadamente para otros, es tambien el punto mas debil. Este archivo esta compuesto de lineas o registros en las cuales cada linea se divide en siete campos con dos puntos (:), como ilustra el siguiente ejemplo: sandra:h34Sd3vc23: 105:100:Sandra 007:/u/sub5:/bin/sh campo 1: sandra username,nombre de usuario. el login que se emplea para acceder al ssitema. campo 2: h34Sd3vc23 encrypted password, contraseña encriptada. Si el campo contiene un asterisco (*) indica que la cuenta no se puede utilizar. Si todos los campos poseen el asterisco u otro signo significa que las claves estan en un archivo shadow. En caso de que no este, esta cuenta no posee ninguna contraseña de acceso. Dado su sistema de encriptación, el sistema operativo lo que hace es un vez que el usuario introduce el password, lo encripta y comprueba con el que se encuentra en este fichero. En caso de que sean iguales, el password introducido es correcto. Si los dos últimos caracteres de este campo van precedidos de una coma (,) esto indica la fecha en que expira el empleo de esta contraseña. campo 3: 105 UID, numero de usuario de sistema, puede ser de 0 a 60000. Por lo general se empieza a partir del 100. El UID con valor de 0 indica que la persona tiene nivel de superusuario, que es aquel que tiene todos los privilegios de acceso en el sistema. Ante de seguir, avisar que UNIX no identifica de quien es cada cosa por el nombre de usuario, sino por este campo. campo 4: 100 GID, numero del grupo al que pertenece el usuario, puede ser de 0 a 60000. El 0 tambien corresponde con el grupo de superusuario o root. Los usuarios del mismo grupo tienen el mismo nivel de privilegios para aquellos elementos que pertenezcan a su dominio. campo 5: Sandra 007 comment, informacion respecto al usuario (nombre completo, telefono...) campo 6: u/sub5 home directory, directorio donde se ubica al usuario. Su directorio de trabajo. campo 7: /bin/sh Shell o interprete de comandos empleado por el usuario. Dependiendo del que emplee podrá realizar unas acciones determinadas. Unix encripta las contraseñas mediante un mecanismo del kernel, crypt(3). Este es un algoritmo basado en el estandar de encriptacion de datos (DES) desarrollado por el Instituto Nacional de Estandares y Tecnologia (NIST). El estandar DES transforma la informacion de texto llano en datos encriptados llamado texto cifrado mediante el uso de un algoritmo especial y valor semilla llamado clave. No hay que confundir el comando crypt(3) con el crypt(1), este ultimo es mucho mas inseguro y esta basado en el dispositibo Enigma de la Segunda Guerra Mundial. En crypt(3) el texto llano se encripta en un grupo de ceros, posteriormente el texto cifrado resultante es encriptado de nuevo con el password del usuario como clave, repitiendose este proceso 25 veces. Una vez finalizado los 64 bits se dividen en 11 caracteres y se guardan en el archivo /etc/passwd o se guardan shadowed. Para "animar" un poco mas la cosa se utiliza lo que se denomina en criptologia como un "grano de sal", dato de variabilidad, etc.., se trata de un valor de 12 bits que utiliza para modificar el resultado de la funcion DES, esto es, un valor que puede variar de 0 a 4095. Asi que para cada contraseña posible existen 4096 formas de encriptacion y almacenamiento. Aqui teneis, tras peticion popular... las Librerias de Subrutinas en C del algoritmo DES des.zip 83kb Cuando utilizamos el programa /bin/passwd para introducir una nueva contraseña, dicho programa utiliza un "grano de sal" basado en la hora del sistema, la cual es utilizada para la funcion de calculo de la contraseña encriptada. Esta sal es guardada junto a la contraseña en el archivo /etc/passwd (en el caso de que no este shadow....). Asi que los dos primeros caracteres de una contraseña son en realidad el "grano de sal", esto es: E67hfr83cEr23 E6 son el "grano de sal", cuando de nuevo entremos al sistema y nos pida nuestro password el programa encriptara la palabra que le demos utilizando ese mismo "grano de sal" y posteriormente compara el resultado de esta encriptacion con el password almacenado comprobando si coinciden. Es decir, en ningun momento se desencripta el password, lo que hace el sistema es encriptar la palabra que le suministramos y comparar con el original. En realidad se puede decir, y estaria bien dicho, que un password una vez encriptado no se puede desencriptar...si, no estoy loca, es verdad... ¿entonces?... tranquilos, que no se pueda desencriptar no quiere decir que el password este seguro y no se pueda averiguar. El mecanismo que se utiliza para averiguar (no desencriptar) los passwords consiste en hacer encriptaciones de palabras (posibles passwords) y comparar estas encriptaciones con el original... si, ya se que parece dificil, pero da resultado. ¿De que depende el exito?...pues de la calidad del diccionario (fichero que contiene un conjunto de posibles passwords), del programa que se utilice, de la CPU, y de nuestra paciencia... Los programas buscadores de contraseñas son facilmente diseñables, en realidad uno sencillo puede crearse en menos de 30 lineas de codigo