Archivo

Entradas Etiquetadas ‘Seguridad Informática’

Primeros pasos en pfSense

Jueves, 15 de septiembre de 2011 Sin comentarios

Antes de empezar con cualquier tipo de explicación, vamos a ver un poco de que se trata pfSense.

pfSense es un sistema basado en FreeBSD de código abierto, el cual cumple las funciones de Firewall y Router. Este sistema, permite una gran variedad de paquetes los cuales complementan sus funcionalidades y permiten que sea sumamente versátil. Para ver un poco más de dicho sistema, pueden ingresar a la web oficial http://www.pfsense.org/. En la misma figuran diferentes en laces con documentación, el foro de soporte, etc.

¿Qué requisitos mínimos de Hardware se necesitan para pfSense?

  • CPU – 100 Mhz Pentium
  • RAM – 128 MB
  • Lectora de CD o puerto USB
  • 1 GB de espacio en Disco

Para efectuar la descarga del LiveCD podemos recurrir al siguiente link el cual además nos permite descargar una imagen ya armada de VMware con el pfSense instalado.

Nosotros vamos a centrarnos en la instalación y configuración inicial del LiveCD. Mejor que muchas palabras confusas es mejor un video, por lo que paso a dejarles el mismo a continuación.

Una de las utilidades que siempre buscamos a la hora de instalar este tipo de sistemas, es la de control, poder brindar un nivel más amplio de seguridad, ya sea en nuestras casas para impedir que los integrantes de la familia naveguen por lugares prohibidos o bien en las empresas efectuar la misma acción para con los empleados.
Para ello pfSense posee dentro de sus paquetes el squid y squidGuard, quienes actúan como proxy y filtrado de contenidos.

¿Como funciona esta herramienta? Vamos con otro video-tutorial.

Por el momento eso es todo, les recomiendo navegar un poco más por la web oficial y el foro de soporte para buscar más funcionalidades que se adapten a sus necesidades. Posee además un manual el cual se puede adquirir en Amazon como complemento.

Un saludo y espero sea de su agrado!

Command line – Linea de comandos

Martes, 9 de agosto de 2011 Sin comentarios

Moviéndose a través del Sistema

 

 

En el Sistema Operativo podemos encontrar rutas absolutas, (si inician desde el directorio Raíz “/”), o relativas, (si inician desde el directorio actual).

Ejemplos:

Suponiendo que estamos situados en el directorio /home/user:

Absoluta: /home/user/Escritorio/archivo

Relativa: /Escritorio/archivo

En cualquier Sistema Operativo estructurado hay ciertas utilidades que nos permiten navegar a través del sistema. Veamos cuales son y cómo utilizarlas.

Comandos del Sistema Operativo:

ls (List): Es uno de los comandos más utilizados del sistema ya que se utiliza para listar el contenidos de los directorios.

Sintaxis: la [opción] [directorio o archivos]

Algunos de las opciones más utilizadas son:

Nombre Acción
-a Lista los archivos ocultos. Comienzan siempre con . (punto)
-l Lista los permisos de los archivos, nombre del propietario, del grupo, el tamaño en bytes, fecha de modificación y si es un link.
-F Coloca al lado de cara archivo un * si es un archivo ejecutable o una / si es un directorio.

Crear un archivo (touch): touch [options] <archivo>

Consultar los manuales de los comandos del sistema (man): En el caso de no saber las opciones que tiene un comando, podemos consultar los manuales del mismo en el propio Sistema Operativo.

Sintaxis: man <comando>

Copiar Archivos (cp copy”): Este comando tiene dos utilidades. Puede copiar un archivo a un directorio o bien copiar el contenido de un archivo a otro archivo, destruyendo el contenido de este último y colocando la información del archivo copiado. Para que se entienda mejor, si tenemos un “archivo1” y lo copiamos a un “archivo2”, el contenido de “archivo2” es destruido y reemplazado por el contenido de “archivo1”

Sintaxis: cp [opciones] [directorio o archivo origen] [directorio o archivo destino]

Algunos de las opciones más utilizadas:

Nombre Acción
-d No respetar la ubicación del Link simbólico
-f Ejecuta la acción sin pedir confirmación
-p Mantiene los atributos del archivo
-R Copia recursivamente
-l Interactivo, pregunta antes de sobrescribir

Renombrar y mover ficheros (mvmove”): Este comando sirve para mover los archivos o directorios de lugar o cambiarles el nombre.

Sintaxis: mv [opciones] [archivo origen] [archivo destino]

Algunas de las opciones más utilizadas:

Nombre Acción
-f No le pregunta al usuario antes de efectuar la acción
-i Le pregunta al usuario antes de efectuar algún cambio.

Eliminación de Ficheros (rmremove”): Este comando sirve para eliminar archivos.

Sintaxis: rm [opciones] [archivos]

Algunas de las opciones más comunes:

Nombre Acción
-f Borra el archivo sin pedir confirmación
-i Borra el archivo pero pide confirmación
-r Borra los archivos recursivamente

Eliminar directorios (remove directory “rmdir”): Este comando sirve para eliminar los directorios, pero solo si los mismos se encuentran vacíos. En el caso que alguno se encuentre con contenido, se deberá usar “rm -rf”.

Sintaxis: rmdir [directorio]

Crear directorios (make directory “mkdir”): Con este comando podremos crear el directorio que queramos.

Sintaxis: mkdir [directorio]

El sistema nos da una serie de herramientas para poder buscar los archivos que necesitamos, veamos a continuación los ejemplos.

find: Cuando necesitamos buscar un archivo o directorio, utilizamos este comando, permite utilizar varios criterios, seleccionando el directorio de búsqueda.

Sintaxis: find <directorio> <archivo o directorio a buscar> [opciones]

Ejemplo: find / -type f –user 502-exec rm –rf {} \;

Opciones más communes:

Nombre Acción
-type Especifica el tipo de archivo
-name Especifica el nombre del archivo a buscar
-print Imprime los archivos que encuentra
-perm modo Los permisos de los archivos son los indicados por modo
-atime n Archivo accedido en las últimas n*24 horas
-ctime Archivos cambiados en las últimas n*24 horas
-amin n Archivos accedidos en los últimos n minutos
-cmin n Archivos cambiados los últimos n minutos
-empty Archivos vacíos
-mmin n Archivos modificados en los últimos n minutos
-mtime n Archivos modificados en las últimas n*24 horas
-size n [bloque] Archivos que tiene al menos n bloques/caracteres/kilobytes
-exec comando \; Por cada archivo que encuentra ejecuta comando

Cómo saber quien está en el sistema: who [opciones]

Tenemos además una serie de herramientas que nos permiten leer la información contenida en un archivo y son las siguientes:

cat <archivo>: Muestra en pantalla el contenido del archivo indicado, si se indica más de un archivo, en pantalla se muestra la concatenación de los archivos indicados. Si el archivo supera la cantidad de líneas de pantalla, recorrerá automáticamente todo el contenido hasta el final. Para ver el contenido por página se utiliza el comando more.

more <archivo>: Vuelca el contenido de uno o más archivos, adecuando su presentación al número de líneas de la terminal. Permite ver desde el comienzo e ir bajando a mano hasta el final, pero si queremos volver al comienzo del archivo no nos deja. Para poder hacer esto debemos recurrir al comando less.

less <archivo>: Aquí podemos recorrer el contenido del archivo de principio a fin.

Donde estamos parados? Para esto existe el comando pwd (Print Work Directory).

Sintaxis: pwd

Buscar el PATH de un comando (which): Devuelve el path completo del comando mencionado, escaneando los directorios definidos en la variable PATH.

Sintaxis: which <comando>

whereis: localiza los binarios y manuales del comando marcado

Sintaxis: whereis <comando>

Opciones más comunes:

Nombre Acción
-l Muestra el i-nodo
-h Muestra tamaño legible
-n Lista los UIDs y GUDs
-R Muestra recursivamente el contenido del directorio
-S Ordena por Sistema de Archivos
-t Ordena por tiempo de modificación
-u Muestra el tiempo del último acceso.

Comando dd (duplícate disk): Este comando copia un archivo con un tamaño de bloque variable.

Sintaxis: dd if(input file)=origen  of(output file)=destino

Ejemplo:

Haciendo una imagen iso de un cd:

# dd if=/dev/cdrom of=/home/usuario/miiso.iso

O también sirve para clonar particiones del disco duro o nuestro disco rígido completo.

# dd if=/dev/hdxa of=/dev/hdyb (cloner partición)
# dd if=/dev/hdx of=/dev/hdy (cloner disco completo)

Por último tenemos links los cuales se dividen en duro y simbólico, los cuales vamos a ver a continuación.

Link Simbólico (Soft-link): Apuntan a un archivo por su nombre, esto permite que los enlaces apunten a archivos localizados en otras particiones o unidades de red. Esto lo hace creando un nuevo i-nodo que apunta a la misma área de datos.

Sintaxis: ln –s <archivo> <nombre del link>

Ejemplo: ln –s lilo.conf  lilo

Link Duro (Hard-link): Un enlace duro es un nombre adicional para el mismo i-nodo y como tal el número de referencia aumenta en uno por cada enlace duro.

Sintaxis: ln <archivo> <archivo.link>

Ejemplo: ln lilo.conf lilo.link

Con eso terminamos los comandos más utilizados para movernos por el Sistema Operativo, lo próximo será indagar un poco en el manejo de procesos.

Por si quieren descargar la versión en pdf, la dejo en el siguiente link:

Un saludo!

 

Shell Scripting

Martes, 2 de agosto de 2011 Sin comentarios

Shell Scripting

¿Qué es la Shell?

La Shell no es más ni menos que un intérprete de comandos, el cual le permite al usuario interactuar con el Sistema Operativo. Existen varios tipos de Shell:

Bourne Shell = sh

Bourne-Again Shell =  bash

Korn Shell = ksh

C SHell = csh

Para identificar las Shells que tenemos disponibles, debemos ver el contenido del archive /etc/shells.

# cat /etc/shells

¿Qué es un Script?

Es un archivo de texto ejecutable, que contiene una serie de comandos pre-definidos. Sirve para automatizar tareas, ya que se pueden configurar secuencias que ejecuten diversas tareas sin la intervención del usuario, más que para ejecutar el Script. El único requisito es que el archivo posea privilegios de ejecución. Microsoftianamente es como crear un .bat pero mucho más potente y versátil.

Todos los comandos escritos en el archivo serán ejecutados en el mismo orden en el cual fueron plasmados.

Recuerden que en Linux la ejecución de comandos no depende de la extensión sino de los permisos, por lo que no es necesario agregar la misma, pero por un tema organizativo, se le suele agregar la extensión “.sh”.

 

Lo primero que vamos a ver antes de comenzar a trabajar con la Shell son una serie de comandos los cuales utilizaremos para hablarle al Sistema Operativo.

 

#: Todo lenguaje de programación ofrece la posibilidad de colocar comentarios para que las personas que abran el código entiendan de forma más rápida lo que el programador quiso plasmar.

echo: Es un comando que sirve para imprimir en pantalla. Esto implica que si queremos que se muestre el mensaje “Hola Mundo” deberemos escribir: echo “Hola Mundo”.

chmod: Comando que sirve para cambiar la máscara de permisos de un archivo, osea, quienes queremos que puedan ejecutarlo, leerlo o escribirlo.

who: Sirve para ver quien está conectado en ese momento quien está en el sistema.

date: Muestra el día.

Hay muchos comandos más y todos pueden ser utilizados por un Script.

¿Qué otras cosas podemos integrar al Script?

Comprendiendo lo que son las VARIABLES. La información puede ser almacenada en la RAM. La memoria RAM está dividida en pequeños sectores y cada sector tiene un número único llamado Dirección de Memoria que es utilizado para guardar nuestra información. El lenguaje de programación, permite asignarle un nombre, (alfanumérico), a esa dirección en memoria llamada “VARIABLE”.

Para hacer esto debemos definirla de la siguiente manera:

VARIABLE=variable

Y para que el Shell llame a dicha variable, debemos colocar el símbolo $ delante del nombre de la variable creada, en este caso sería “$VARIABLE”.

EJ:

edad=23
#!/bin/sh
echo “Que edad tengo?”
echo $edad (Esto mostrará en pantalla el número 23)

En Linux existen dos tipos de variables:

 

Locales: Pueden ser accedidas solo por la Shell que ejecutó el Script.

Exportada: Puede ser accedida por ambas Shell y cualquier proceso hijo que sea iniciado por esa Shell.

Los comandos set, (lista todas las variables) y env, (muestra solo las variables exportadas) sirven para listar las variables definidas.

Si queremos hacer que una VARIABLE creada por nosotros sea global, debemos ejecutar el comando export. Por ejemplo si tenemos la variable $nombre, podemos ejecutar “export nombre”. Podemos verificar que se haya integrado correctamente ejecutando “env | grep nombre”.

 

Varibables pre-definidas Significado
DISPLAY Utilizado por X para identificar donde correr una aplicación cliente
HISTFILE Ruta al historial de bash de los Usuarios
HOME Ruta al directorio personal del Usuario
LOGNAME El nombre utilizado para iniciar sesión
PATH Lista los directorios donde se encuentran los ejecutables utilizados por la Shell
PWD Directorio de trabajo en el cual se encuentra parado el Usuario
SHELL La Shell utilizada
TERM

BASH

BASH_VERSION

La emulación de Terminal actual

Nombre del Shel l utilizado

Versión del Shell utilizado

 

También podemos encontrar Variables Especiales:


Variables Especiales Significado
$! Contiene el Número de Proceso(PID) del último Proceso
$$ Contiene el Número de Proceso (PID) de la Shell
$? Contiene el valor que regresó la última orden ejecutada. (0=Exitosa, 1=Falló)

 

Pasaje de Argumentos:

Los Scripts pueden recibir parámetros en la línea de comandos. Los parámetros recibidos se guardan en una serie de variables que el Script puede consultar. Estas Variables tienen los siguientes nombres:

 

Variable Significado
$0 Contiene el nombre con el que se ha invocado el Script
$1 – $20 Contiene los valores de los parámetros/argumentos recibidos con la invocación
$* Contiene todos los parámetros juntos en una única cadena
$# Contiene e número de parámetro que ha recibido el Script
$? Devuelve 0 si la ejecución fue correcta

 

Además de todas estas utilidades, tenemos la posibilidad de insertar en la ejecución de un Script, lo que un usuario tipea en la línea de comandos. Dicha opción se llama READ. Lo que hace es leer una línea de entrada del usuario y la asigna a una o más variables de la Shell. Detiene el Script y hasta que por línea de comandos no sea ingresado ningún valor por el usuario, el programa estará detenido.

 

Ejemplo:

#!/bin/sh
echo “Cuál es su nombre?”
read nombre
clear
echo “Su nombre es $nombre”

También puede aceptar más de una a la vez.

Ejemplo:

#!/bin/sh
echo “Cuál es tu nombre y edad?”
read nombre edad
echo “Tu nombre es $nombre y tienes $edad años!”

Input (Entrada), Output (Salida), Redirection (Redireccionar):

Los sistemas basados en UNIX generalmente abren tres archivos descriptivos básicos, para permitirle a un proceso la entrada (stdin) y salida (stdout).

stdout redirection: La información va de izquierda a derecha. Osea, toma el resultado que sale del comando ejecutado en primera instancia y lo plasma en un archivo. EJ: “# fdisk –l > particiones.txt”

El operador “>>” añade al final del archivo el contenido de la salida del comando.

stdin redirection: En este caso la información va de derecha a izquierda. El operador “<” solo puede ser utilizado en stdin. EJ: “fdisk /dva/hda < instructions”. Si instructions posee alguna de las letras p, m, y q, fdisk mostrará la tabla de particiones de /dev/hda.

stderr redirection: stdin, stout y stderr están representados por 0, 1 y 2 respectivamente. EJ: “comando 2> /dev/null”

Pipes: Son un mecanismo por el cual la salida de un programa se puede enviar como la entrada de otro. Cada programa individual, puede ser encadenado para convertirse en herramientas más potentes. Las pipes están representadas por el símbolo “|”.

EJ:

# comando1 | comando2

# cat /etc/passwd | less (Cat muestra el contenido del archivo, y al sr enviado a less, nos permite navegar por todo el contenido).

Pero… ¿Para qué conformarnos solo con esto? Como todo buen lenguaje de programación la Shell posee estructuras de control (if, then, else, case, etc) y ciclos (for, while , etc)

Comando IF:

If en la Shell solo puede evaluar comandos por lo que no podríamos evaluar los valores de las variables, sin el comando test, el cual también pertenece a la Shell. El mismo devuelve 0 de ser verdadero o 1 si es falso.

Ejemplifiquemos:

#!/bin/sh
echo “Ingresa un número”
read numero
if test $numero = 1 (Siempre la expresión debe estar separada por espacios sino da error)
then
echo “El número ingresado es correcto”  (Se ejecuta solo si test devuelve como resultado 0)
else
echo “El número ingresado es incorrecto” (Se ejecuta solo si test da como resultado 1)
fi (Se utiliza para terminar if)

Otra forma de escribir test es colocando entre corchetes la condición a evaluar y si quisiéramos poner en la misma línea el then, deberemos colocar luego de la expresión test punto y coma “;”.

Ejemplo:

#!/bin/sh
echo “Ingresa un número”
read numero
if [ $numero = 1 ]; then
echo “El número ingresado es correcto”
else
echo “El número ingresado es incorrecto”
fi

Efectuando comprobaciones:

Comprobaciones de cadena:

 

Parámetro Significado
-z cadena Verdadero si la longitud de la cadena es 0
-n cadena Verdadero si la longitud de la cadena no es 0. Es decir, si existe cadena
cadena1 = cadena2 Verdadero si cadena1 y cadena2 son idénticas
cadena1 ¡= cadena2 Verdadero si cadena1 y cadena2 no son idénticos
cadena1 Verdadero si cadena1 no es una cadena nula

 

Comprobaciones de enteros:

 

Parámetro Significado
n1 –eq n2 Verdadero si n1 y n2 son iguales
n1 –ne n2 Verdadero si n1 y n2 no son iguales
n1 –gt n2 Verdadero si n1 es mayor a n2
n1 –ge n2 Verdadero si n1 es mayor o igual que n2
n1 –lt n2 Verdadero si n1 es menor a n2
n1 –le n2 Verdadero si n1 es menor o igual que n2

 

Ejemplo:

#!/bin/bash
clear
numero1=4
echo ­n ”Ingrese un número : ”
read numero2
if [ $numero2 ­ge $numero1 ]; then
echo “El numero $numero2 es mayor o igual a $numero1”
else
echo “El numero $numero1  es mayor o igual a $numero2”
fi

Ejemplo 2 (operaciones):

#!/bin/bash
echo ­n ” Ingrese el primer número : ”
read numero1
echo ­n ” Ingrese el segundo número : ”
read numero2
numero3=$[ $numero1 * $numero2 ]
echo ”Resultado :$numero3″

Comprobaciones de archivos:

 

Parámetro Significado
-a Verdadero si existe el archivo
-r Verdadero si existe el archivo y puede leerse
-w Verdadero si existe el archivo y puede escribirse
-x Verdadero si existe el archivo y es ejecutable
-f Verdadero si existe el archivo y es un archivo regular
-d Verdadero si existe el archivo y es un directorio
-h Verdadero si existe el archivo y es un enlace simbólico
-c Verdadero si existe el archivo y es un archivo de caracteres especiales

 

Ejempllo:

 

#!/bin/bash
echo –n “Escriba el archivo que desea verificar : “
read archivo
if [ ­a $archivo ]; then
echo “Existe el archivo.”
if [ ­r $archivo ]; then
echo “el archivo puede leerse”
fi
if [ ­w $archivo ]; then
echo “El archivo se puede escribir”
fi
if [ ­x $archivo ]; then
echo “El archivo se puede ejecutar”
fi
if [ ­d $archivo ]; then
echo “El archivo es un directorio”
fi
else
echo “Archivo inexistente : $archivo”
fi

La sentencia case:

Se utiliza cuando tenemos que hacer varios if para hacer una misma comprobación. Siempre se inicia con case y se termina con el comando esac.

Ejemplo:

#!/bin/bash
echo ” Ingrese alguna opcion ”
echo ” 1 Borrar Pantalla”
echo ” 2 donde estoy ”
echo ” 3 Salir ”
echo ­n ” opcion: ”
read opcion
case $opcion in
1) clear;;
2) pwd;;
3) exit;;
*) echo “ Opcion Incorrecta “
esacecho ” toque una tecla para continuar”

read

 

La sentencia for:

Toma una lista de cadenas y las asigna a una variable.

La sintaxis del comando es:

For [nombre de la variable] in [lista de opciones]; do

done

Ejemplo1:

#!/bin/bash
for i in `ls *.sh`; do           # “`” son las comillas simples de ejecución.
if [ ­x $i ]; then
echo “el fichero $i es ejecutable.”
fi
done

Ejemplo2:

if [ $# -eq 0 ]
then
echo "Error - Number missing form command line argument"
echo "Syntax : $0 number"
echo "Use to print multiplication table for given number"
exit 1
fi
n=$1
for i in 1 2 3 4 5 6 7 8 9 10
do
echo "$n * $i = `expr $i \* $n`"
done

La sentencia while:

El bucle while se ejecutará siempre que la condición que evaluamos sea verdadera. Se puede usar la palabra clave break para abandonar el bucle en cualquier punto de la ejecución. Con la palabra clave continue el bucle continúa con la siguiente interacción y se salta el resto del cuerpo del bucle.

while [ condicion ]

do

comandos

done

Ejemplo con script variable.sh:

#!/bin/sh
clear
i=0
var1=4
echo -n “Ingrese una variable : ”
read var2
while [ $var2 -ge $var1 ]; do
echo $var2
i=`expr $i + 1`
if [ $i -eq 4 ]; then
break
fi
done

Bueno con esto ya tenemos todo lo necesario para armar los scripts más potentes y automatizar tareas tediosas. Espero que la guía sea de su agrado.

Web: http://www.nicolasventre.com/

Twitter: http://twitter.com/#!/nicolasventre

Facebook: http://www.facebook.com/profile.php?id=1159047781

Linkedin: http://ar.linkedin.com/in/nicolasventre

Si quieren descargar el contenido en formato PDF que se ve más lindo les dejo el link:

Un saludo!

Linux Filesystem – Atributos

Miércoles, 15 de junio de 2011 Sin comentarios

Luego de vario tiempo de ausencia, me puse a pensar que nota podría resultar interesante para los lectores. Luego de varios cafés, charlas y cerveza con papas de por medio, les doy la siguiente guía.

Una de las cualidades más importantes del Sistema Operativo Linux es la cualidad que se le puede dar a un archivo. Cuando hablamos de cualidad estamos hablando del “atributo” que le damos a dicho archivo.

Antes de llegar a los atributos en cuestión vamos a hacer un pequeño repaso por una serie de permisos que podemos darles a los archivos y carpetas para facilitarnos algunas tareas y mejorar la seguridad de otras:

Dentro del sistema, tenemos la posibilidad de utilizar los permisos SUID (Set User ID). Este permiso especial se le asigna a un ejecutable permitiendo que siempre dicho programa corra con los privilegios del propietario del dicho archivo. Tiene un valor simbólico s o numérico de 4000.

Por ejemplo si tenemos un archivo que tiene los permisos 511 y le aplicamos los permisos SUID de la siguiente manera:

ls -l (del archivo passwd)

-r-x–x–x 1 root root 18992 Jun 15 2011 /usr/bin/passwd

Opción 1: # chmod u+s /usr/bin/passwd
Opción 2: # chmod 4511 /usr/bin/passwd

Luego de dicho parámetro los permisos listados se verán de la siguiente manera:

ls -l (del archivo passwd)

-r-s–x–x 1 root root 18992 Jun 15 2011 /usr/bin/passwd

Hay que tener siempre cuidado con los archivos a los cuales aplicamos este permiso ya que puede terminar siendo contraproducente.

También tenemos el permiso SGID (Set Group ID). Asigna permisos especiales a un archivo o carpeta.

  • Archivo: Cualquier usuario puede ejecutarlo como si fuera parte del grupo.
  • Carpeta: Cambia el grupo propietario usado para los archivos posteriormente creados en dicho directorio por cualquier usuario al de dicho directorio.

El valor simbólico es s y en octal 2000.

Opción 1: chmod 2755 /home/data
Opción 2: chmod g+s /bin/wc

Por último en permisos tenemos el conocido Sticky bit con un valor simbólico t y un octal de 1000. Este permiso también es aplicado a archivos y carpetas.

  • Archivos: Hace que el archivo o ejecutable sea cargado en memoria para ser posteriormente accedido de manera más rápida.
  • Carpeta: Previene que un usuario elimine un archivo del cual no es propietario.

Opción 1: chmod 1666 /data/store.txt
Opción 2: chmod o+t /bin/bash

Ya comentado esto, podemos pasar a los atributos de los archivos. Junto con los permisos estándar no hay otro sistema utilizable para cambiar la forma en la que un archivo puede ser utilizado. Los atributos no son mostrados con el comando “ls”. Para ello debemos utilizar el comando “lsattr” y para asignar o quitar atributos el comando “chattr”. Los atributos que podemos agregar, o quitar son:

  • A: La fecha del último acceso no es actualizada.
  • a: El archivo solo puede ser abierto en modo adjuntar para escritura. Suele ser util para evitar que intrusos remuevan rastros de sus pasos.
  • c: Establece que el archivo es automáticamente comprimido por el Kernel.
  • D: Cuando el directorio con este atributo es modificado, los cambios son escritos de forma sincrónica en el disco. Es similar a la opción del comando mount “dirsync”, pero aplicado al subconjunto de ficheros.
  • d: Establece que el fichero no sea candidato para ser respaldado cuando es ejecutado el programa dump.
  • i: Con este atributo el archivo no puede ser, modificado, eliminado, renombrado ni linkeado y tampoco puede escribirse datos en el mismo. Ni siquiera por el usuario root, si o si, debe eliminarse dicho atributo para hacer cualquier acción mencionada sobre el archivo.
  • j: En los sistemas de archivo ext3, cuando se monta con las opciones “data=ordered” o “data=writeback” se establece que el registro por diario. Cuando el sistema es montado por defecto con la opción “data=journal” este atributo no tiene efecto.
  • s: Cuando un archivo con este atributo es borrado, los bloques del disco son reemplazados con ceros, de modo que los datos no puedan ser recuperados.
  • S: Cuando se aplica al archivo los datos son escritos en el disco de forma sincrónica, es equivalente a la opción “sync” del comando mount. Al ser utilizado no se cachea la información escribiendo la misma directamente en el disco de forma más rápida.
  • T: Solo se puede utilizar en Kernels 2,6,x. Está diseñado para indicar la parte superior de las jerarquías del directorio. El sistema de archivos sitúa los directorios más cerca permitiendo un uso más rápido del árbol de directorios.
  • t: El archivo con este atributo no tendrá un fragmento de bloque parcial al final del archivo combinado con otros archivos.
  • u: Cuando un archivo con este atributo es borrado, su contenido es salvado. Esto permite al usuario deshacer este borrado.

Teniendo en cuenta todas estas posibilidades, podemos configurar de una forma mucho más personalizada el como queremos que funcionen los archivos y carpetas dentro de nuestro sistema.

Espero que les haya sido de utilidad.

Cualquier consulta me la pueden enviar a info@nicolasventre.com

Saludos!

Manual de Nmap – Auditoría de Seguridad

Miércoles, 4 de mayo de 2011 2 comentarios

Como les comente en el post anterior, en esta oportunidad vamos a hablar un poco de nmap como auditoría de seguridad.

¿Que es nmap?

Es una Herramienta de código abierto diseñada para analizar grandes redes como así también equipos individuales. Con sus diferentes parámetros identifica Equipos, Sistemas Operativos, Servicios, etc.

Los resultados de los análisis los muestra como Puertos Interesantes, haciendo una descripción del número de puerto, el estado del mismo, tipo de servicio y versión de la aplicación. El estado para los puertos pueden ser 4:

  • Open(Abierto): Esto indica que la aplicación de la máquina remota se encuentra esperando conexiones en el puerto indicado.
  • Closed(Cerrado): Esto indica que no hay ninguna aplicación escuchando en dicho puerto.
  • Filtered(Filtrado): Indica que un cortafuegos, filtro u otro obstáculo en la red está bloqueando el acceso a ese puerto, por lo que nmap no puede ver si dicho puerto se encuentra abierto o cerrado.
  • Unfiltered(Sin Filtrado): Responden a los sondeos de nmap, pero no puede determinar si se encuentran abiertos o cerrados.

Ya sabiendo esto podemos empesar a ver de que forma hacer los análisis para sacar información sobre el rango de IP que elijamos trabajar. En mi caso el rango será algo bien genérico “192.168.1.0/24”.

Si lanzamos solamente el parámetro nmap <Dirección_IP>, nos va a arrojar un resultado parecido a esto:

Starting Nmap 5.51 ( http://nmap.org ) at 2011-05-03 21:30 Hora estßndar de Argentina
Nmap scan report for 192.168.1.10
Host is up (0.0063s latency).
Not shown: 992 filtered ports
PORT STATE SERVICE
135/tcp open msrpc
139/tcp open netbios-ssn
445/tcp open microsoft-ds
554/tcp open rtsp
2869/tcp open icslap
3389/tcp open ms-term-serv
5357/tcp open wsdapi
10243/tcp open unknown
MAC Address: **:**:**:**:**:** (Asustek Computer)

Nmap done: 1 IP address (1 host up) scanned in 4.48 seconds

Podemos ver que nos lista una serie de puertos que se encuentran abiertos en dicha pc y 992 filtrados. Vamos a ver ahoria que sucede cuando le agregamos dós argumentos:

C:\Windows\system32>nmap -sS -sV 192.168.1.10

Starting Nmap 5.51 ( http://nmap.org ) at 2011-05-03 21:50 Hora estßndar de Argentina
Nmap scan report for 192.168.1.10
Host is up (0.0015s latency).
Not shown: 992 filtered ports
PORT STATE SERVICE VERSION
135/tcp open msrpc Microsoft Windows RPC
139/tcp open netbios-ssn
445/tcp open netbios-ssn
554/tcp open rtsp?
2869/tcp open http Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
3389/tcp open microsoft-rdp Microsoft Terminal Service
5357/tcp open http Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
10243/tcp open http Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
MAC Address: **:**:**:**:**:** (Asustek Computer)
Service Info: OS: Windows

Service detection performed. Please report any incorrect results at http://nmap.org/submit/ .

Nmap done: 1 IP address (1 host up) scanned in 87.35 seconds

Podemos ver que esta secuencia de argumentos nos facilitan más información.

-sS: Este argumento no llega a completar las conexiones TCP. Esta técnica es conosida como sondeo abierto por no completar dicha conexión. Envía un paquete SYN como si fuera a establecer una conexión, si recibe un paquete SYN/ACK indica que el puerto esta escuchando y si recibe un paquete RST indica que no hay nada escuchando el puerto, también puede figurar cerrado si no recibe respuesta luego de varios intentos o si recibe un error del tipo ICMP no alcanzable.

-sV: También puede utilizarse el argumento -A, ya que -sV sirve solo para detectar las versiones de los programas que estan escuchando sobre dichos puertos, en cambio -A además de detectar dichas versiones lista la versión del Sistema Operativo. Esta información puede obtenerla gracias a una base de datos que posee nmap llamada nmap-services-probes quien se encarga de ahcer las consultas a los distintos servicios

Podemos también seleccionar un rango de IP’s a analizar utilizando los bits de la mascara de red para indicar el rango a analizar de la siguiente manera:

nmap 192.168.1.0/24: Esto analizará todas las IP que los coinsidan con los primeros 24 bits de la mascara de red. La más pequeña permitida es /1 y la más grande /32. Además de esto se pueden omitir rangos de IP por cada uno de los cuatro octetos. Por ejemplo si marcamos nmap 192.168.1.1-254, de esta forma estaría obiandome, basandome en el hecho de que el rango sea /24, la dirección de red y la de broadcast. Como les dije se puede aplicar a los cuatro octetos, por ejemplo si ponemos 0-255.0-255.1.1, se van a analizar todas las direcciones de internet que terminen en .1.1.

En algunos casos podemos toparnos con un cortafuegos y tenemos la necesidad de intentar evadirlos, para ello nmap nos facilita algunos argumentos los cuales pueden ayudarnos a lograrlo y son los siguientes:

-f o –mtu: -f lo que hace es fragmentar paquetes en paquetes más pequeños. La idea de dividir la cabecera en varios paquetes, es dificultar, sistemas de detección de instrusos y otros sistemas detecten lo que estamos haciendo. Tengan en cuenta que algunos programas tienen probnblemas para manejar estos paquetes tan pequeños. Nmap dividira el paquete en 8 bytes o menos despúes de la cabecera si lo utilizamos una sola vez, pero si volvemos a utilizarla los dividira en 16 bytes. También se puede establecer el tamaño a mano con el comando mtu, no utilicen -f si utilizan mtu. El tamaño de mtu debe ser multiplo de 8.

También se pueden utilizar señuelos para que el IDS no sepa de cual proviene el verdadero ataque. El comando a utilizar es nmap -D señuelo1,señielo2,señuelo3,etc <IP>, señuelo debe ser la ip ficticia.

Muchos cortafuegos están configurados para permitir el tráfico de los puertos conosidos en lugar de utilizar pasarelas a nivel aplicación o los modulos del cortafuegos que realizan un análisis del protocolo. Las configuraciones más comunes son que si la comunicación viene hacia el puerto “X” se permite el tráfico entrante desde estos puertos. Nmap ofrese las opciones –source-port o -g (son lo mismo) para aprovechar estos descuidos. Colo cando los puertos nmap enviará los paquetes a través de los puertos indicados. Ejemplo: nmap –source-port 21 192.168.1.10.

Para generar un log podemos utilizar además la opción -oX y guardarlo en formato .xml. El parámetro para este comando es nmap -oX <ruta\nombre.xml> 192.168.1.10 y nos genera un fichero bastante interesante para agregar a un informe.

Por último la opción -v aumenta el detalle que se muestra en pantalla mientras se efectúa el scan.

Por esta ocación creoq ue ya se dió un parámetro bastante amplio para que todos lean un poco más y vayan probando en sus propias casas con máquinas virtuales. Obviamente el programa en si posee muchos más argumentos pero eso tendrán que indagar un poco e ir viéndolo. Les dejo un resumen:

Descubrimiento:

nmap -PN 192.168.1.10 # no hagas ping
nmap -PS 192.168.1.10 # ping tcp syn
nmap -PA 192.168.1.10 # ping tcp ack
nmap -PU 192.168.1.10 # ping udp
nmap -PY 192.168.1.10 # ping sctp init
nmap -PE 192.168.1.10 # ping icmp echo
nmap -PP 192.168.1.10 # ping icmp timestamp
nmap -PM 192.168.1.10 # ping icmp address mask
nmap -PO 192.168.1.10 # ping protocolo ip
nmap -PP 192.168.1.10 # ping arp
nmap —traceroute 192.168.1.10 # traceroute

Escaneo:

nmap -sP 192.168.1.10 # solo ping
nmap -sS 192.168.1.10 # tcp syn
nmap -sT 192.168.1.10 # tcp connect (three-way-handshake)
nmap -sU 192.168.1.10 # udp
nmap -sN 192.168.1.10 # tcp null
nmap -sF 192.168.1.10 # tcp fin
nmap -sA 192.168.1.10 # tcp ack
nmap -sX 192.168.1.10 # tcp christmas tree (fin + push + urg)
nmap –scanflags URGACKPSHRSTSYNFIN 192.168.1.10 # tcp a medida
nmap -F 192.168.1.10 # escaneo rápido (los 100 puertos más conocidos)
nmap –top-ports 192.168.1.10 # los 10 puertos más conocidos
nmap -p http,https 192.168.1.10 # nombre de puertos
nmap -p 1-80 192.168.1.10 # rango de puertos
nmap -p U:1-50,T:51-100 192.168.1.10 # rango de puertos por protocolo
nmap -p “*” -r 192.168.1.10 # todos los puertos secuencialmente

Detección:

nmap -O 192.168.1.10 # sistema operativo
nmap -sV 192.168.1.10 # versión de los servicios

Evasión:

nmap -f 192.168.1.10 # fragmentar en paquetes ip de 8 bytes
nmap –mtu 16 192.168.1.10 # fragmentar en paquetes ip de 16 bytes
nmap -D RND:5 192.168.1.10 # genera 5 @ip aleatorias (señuelos)
nmap -sI 192.168.1.20 192.168.1.10 # escaneo utilizando un zombie
nmap –source-port 80 192.168.1.10 # puerto de origen 80
nmap –data-length 40 bytes 192.168.1.10 # añade 40 bytes
nmap –spoof-mac 0 192.168.1.10 # utiliza una @mac de origen aleatoria

Logs:

nmap -oN ft.txt 192.168.1.10 # fichero de texto
nmap -oX fx.xml 192.168.1.10 # fichero xml

Nos vemos en el próximo post y espero les haya sido de utilidad.