viernes, 8 de noviembre de 2013

Hacking ético en GNU/Linux Parte I: Conociendo el sistema

Hoy doy comienzo una serie de post donde vamos a destripar el sistema GNU/Linux y las herramientas más significativas para penetrar en él.

Siempre desde el punto de vista ético, ya que, si conocemos el sistema y sus vulnerabilidades, nos podremos proteger.

1.Usuarios en GNU/Linux


Es muy importante saber los tipos de usuarios y cómo administrarlos para poder securizar un servidor en GNU/Linux. El usuario más importante es root.

¿Por qué es tan importante?


Un usuario normal puede tener limitaciones en lo que puede o no hacer dentro del sistema, pero el usuario root tiene el poder.

Veamos con más detalle los tres tipos de cuentas que tenemos que tener siempre presentes en la administración del sistema:


root: Es el administrador del sistema.

sistema: Son usuarios que se utilizan para acceder a dispositivos o para ejecutar determinados servicios (daemons)

normal: Son los usuarios "reales" del sistema, los que pueden acceder a él, disponer de un shell (intérprete de comandos). Pueden disponer de acceso a determinadas partes del sistema, mediante la utilización de "grupos".


En el fichero donde se guarda toda la información de los usuarios es /etc/passwd. Si editamos el fichero


# nano /etc/passwd

podemos ver: 




Veamos una línea del fichero: 



  

mary --> Es el nombre del usuario, tiene que ser único en la máquina local.

x -->  Antes se guardaba la contraseña cifrada aquí, pero ahora se utiliza el fichero /etc/shadow.  "x" indica que la contraseña está guardada en ese fichero para mayor seguridad. Solo es accesible por el usuario root, a diferencia del /etc/passwd, que ha de poder ser leído por todos los usuarios.

1000 --> Es el identificador de usuario (UID). Este identificador es único en el sistema y se ocupa de mantener un rastro de qué archivos pertenecen al usuario.

100 --> Es el identificador del grupo (GID). Este identificador es único en el sistema y se ocupa de mantener el rastro de qué archivos pertenecen a ese grupo en particular.

mary --> es un campo donde se guarda información del usuario, son cuatros campos pero en este caso están vacios.

/home/mary --> Contiene el directorio de inicio del usuario, donde estarán sus archivos y configuración personal.

/bin/bash --> Contiene el shell por defecto que utilizara el usuario para ejecutar instrucciones del ordenador.

Si editamos el /etc/shadow:

# nano /etc/shadow



 Veamos una línea del fichero:



mary --> El nombre de la cuenta de usuario, que es la misma que ocupa en /etc/passwd.

$6$fxDI..... --> Es la contraseña cifrada. Es el hash resultante al pasar la contraseña por el método MD5 o SHA. Este segundo método, SHA, es el utilizado por Arch Linux por defecto y se considera más seguro que MD5.

15571 --> Último cambio de contraseña.

0 --> El mínimo de días que se permite un cambio en la clave. Si tenemos 0, permite la modificación siempre.

99999 -->  Este valor representa el máximo de días para exigir un cambio de contraseña.


2. Grupos en GNU/Linux


Los grupos se guardan en el fichero /etc/group.  

Al igual que los ficheros de usuarios y contraseñas, cada una de las líneas contiene información, en este caso, contendrá información sobre un grupo específico:


mary:x:1000:archninfa,matrix,cron

mary --> El nombre del grupo

x --> La x nos indica que la contraseña esta cifrada y se guarda en otro fichero etc/gshadow

1000 --> es el identificador del grupo (GID)

archninfa, matrix, tron --> Los nombres de los usuarios separados por comas que forman parte del grupo.

3.¿Permitir o Denegar?

El administrador tiene que establecer los permisos que tendrán los usuarios de cada fichero y directorio.

Con el comando ls -l podemos ver el contenido de un directorio, mostrando los diferentes permisos, pertenecia a usuarios, etc. de los archivos contenidos en él.

# ls -l 





drwxr-xr-x --> los permisos

4 --> El número de enlaces

mary --> El dueño

users --> El grupo

4096 --> El número de bytes que contiene el archivo o directorio

sep 13 21:07 --> La fecha y hora de la última modificación

directorio o archivo --> El nombre


Veamos  como más detalle 




Tipos de archivos

--> Un archivo normal
d --> Un directorio
l --> Un enlace simbólico
s --> Socket
b --> Dispositivo de bloque
c --> Dispositivo de carácter

Permisos

--> permiso de lectura
w --> permiso de escritura
--> permiso de ejecución

En el ejemplo podemos ver que es un directorio, con permisos de lectura/escritura/ejecución para el dueño, lectura y ejecución tanto para el grupo, como para otros usuarios.

El permiso de ejecución en un directorio indica que se puede acceder a él. En un archivo normal, indicaría que puede ser ejecutado por el sistema.

Para manejar los permisos el administrador tiene los siguientes comandos:

chown usuario archivo cambia el dueño de un archivo.
chgrp group archivo modifica el grupo dueño.
chmod permisos archivo cambia los permisos del archivo.
Además de los permisos anteriores, tenemos unos que nos interesa conocer.

 Nota: los permisos anteriores se pueden escribir en octal, con valores entre 000 y 777. Y los que voy a explicar ahora los SUID(4000) , SGID(2000) y bit permanencia(1000) entre 0000 y 7000.

SUID o setuid.-  Al ejecutar el fichero, se hará con los mimos permisos que el usuario que lo creó, mientras dure la ejecución del proceso. Ejemplo: Si el administrador del sistema crea un ejecutable y le activa el bit SUID, cualquier usuario que lo ejecute lo hace con permiso root hasta que el programa finalice.

SGID.- Es similar al anterior, pero para el grupo, es decir, mientras dure la ejecución del proceso, se hará con los permisos del grupo al que pertenece el archivo.

Bit de permanencia.-  Activando este bit sobre el directorio, los usuarios no podrán remover los ficheros que no le pertenezcan. Basta con añadir 1000 a los permisos en notación octal con chmod.

Lo que nos interesa cuando estemos dentro de un sistema es identificar si existen archivos con los bits SUID o SGID y para qué podemos utilizarlos.



Siguiéndole la huella a la víctima: Footprinting

En este apartado tenemos que buscar toda la información de la víctima que nos sirva de ayuda para lanzar distintos ataques: direcciones IP, cuentas de correo de los usuarios, nombres de máquinas, tipos de servidores, ..etc. 

Footprinting podemos decir que es la primera fase de un test de penetración.

¿Qué es eso? 

 En pocas palabras la busqueda de vulnerabilidades internas y externas de los sistemas de información de la empresa que estamos auditando, y de ese modo saber el grado de acceso que tendría un atacante con malas intenciones.

Comenzamos:

Lo primero que tenemos que mirar es los distintos servicios de red públicos, luego consultar la base de datos pública Whois, y los más importante es conocer toda la información de los DNS del dominio de la víctima.

Podemos utilizar muchas herramientas, pero yo voy a utilizar Dig.
Dig(Domain Informaation Groper) es una herramienta muy potente para interrogar los servicios DNS, mostrándonos las respuestas detalladamente.


Esta herramienta se utiliza por los administradores de red para investigar problemas con el servicio DNS. Nosotros la utilizaremos de igual manera, pero para obtener información.

Su sintaxis, para un uso simple, es:

# dig [@servidor]<nombre>  [tipo]

[@servidor]: Es el servidor de DNS al que queremos consultar. Por defecto se utilizarán los servidores especificados en /etc/resolv.conf.
[opciones]


<nombre>:
nombre de dominio cuya IP queremos resolver.


[tipo]:
tipo de consulta. Los valores que podemos especificar son:

  • A: IP del servidor que aloja al dominio (por defecto).
  • NS: servidores DNS.
  • MX: servidores de correo.
  • ANY: todas las anteriores.
  • AAAA: IP en IPv6 .
Una muestra de la ejecución de esta aplicación es:


Para hacer una consulta por IP en lugar de nombre de dominio, la consulta se realizará con la opción -x:

$ dig -x IP

Si tenemos un  servidor de nombres y no está bien configurado, esto permite una transferencia de zona, es decir,  al no tener ninguna restricción, podemos hacer una transferencia de zona y podremos obtener una lista completa de todos los subdominios y, así, obtener más información del dominio. Por ejemplo: información de las redes internas o servicios accesibles por Web.

Si el servidor esta bien configurado y  tiene sus restricciones para transferir zonas, no obtendremos nada. Para comprobarlo, utilizaremos la siguiente sintaxis:


$ dig [@servidor_nombres_primario] [zona o dominio] AXFR

Por defecto, BIND, el servidor DNS que utilizamos en GNU/Linux, permite la transferencia de zonas, hay que tener esto presente si estamos utilizándolo para restringirlo.


CONTINUARÁ ...



3 comentarios: