domingo, 12 de agosto de 2012

Escaneo de red, detección de hosts, puertos y servicios con Nmap (I de III)

Introducción

Nmap es una herramienta de escaneo de redes, muy útil y popular utilizada principalmente en auditorias de seguridad, aunque también es útil para el día a día en la administración de redes y sistemas, ayudando a la  detección, auditoria e inventariado de equipos en red (las redes deben ser de nuestra propiedad y/o disponer de los permisos necesarios para no estar infringiendo la ley...).

Permite realizar escaneo de redes y  detectar los hosts activos, que puertos tiene abiertos, versiones de los servicios que corren en los puertos,  estimar que sistema operativo tienen, etc. El alcance de este post es mostrar solo los principales tipos de escaneo mas básico y las técnicas de  detección de sistema operativo y servicios abiertos, para uso mas avanzado y aplicado a la detección de vulnerabilidades por favor revisad la pagina de nmap y otros posts mas especializados en la red.  

Un poco de teoría ...

Para entender las técnicas empleadas para el escaneo de hosts y puertos , es importante conocer el proceso de conexión TCP three way handshake  y el protocolo de control de mensajes ICMP (Internet Control Message Protocol). 

Three way handshake (conexión TCP) 

Este proceso de conexiones TCP, está basado en el intercambio de tres tipos de paquetes especiales en el siguiente orden SYN (1), SYN-ACK(2) y ACK(3).


En primer lugar el host A enviará un paquete SYN para pedir establecer una conexión al host B, el host B responderà con un SYN-ACK para comunicar al host A que ha recivido la petición de inicio de conexión, por útlimo cuando el host A reciva el paquete SYN-ACK del host B le responderá confirmando que lo ha recibido correctamente con un paquete ACK, una vez finalizado estos tres pasos la conexión TCP quedará establecida.
  • host A --> SYN --> host B (para iniciar sesión host A envia paquete SYN a host B)
  • host A <-- SYN-ACK <--host B (host B responde con un SYN-ACK al host A conforme ha recibido la petición de inicio de sesión)
  • host A -->ACK--> host B (host A confirma finalmente la recepción del SYN-ACK estableciendo la conexión TCP)

ICMP (Internet Control Message Protocol) 

ICMP gestiona mensajes de control en el protocolo IP de la capa de red del modelo OSI. Aunque trabaja en la capa de red principalmente, las aplicaciones ping y traceroute permiten ejecutar directamente peticiones ICMP des de la capa de aplicación. Algunos ejemplos de mensajes ICMP son la gestión de mensajes tipo echo request echo, echo reply, time exceeded, etc, que ayudan a reportar posibles errores en rutas, informan de saltos (hops) entre routers, etc

Instalación 

Para instalar nmap en distribuciones Debian y Ubuntu
sudo apt-get install nmap
Y en distros CentOs y Red Hat
sudo yum install nmap

Detectando hosts y  puertos 

Scan TCP-Connect() [-sT]

Es el método de escaneo utilizado por defecto en nmap, y realiza el proceso "three way handshake" completo, usando la llamada al sistema connect() para iniciar una conexión TCP con un host remoto. Si connect () falla, es que el host destino está caído o el puerto está cerrado.


Este método es muy efectivo para detectar  con certeza que puertos TCP hay realmente abiertos en los hosts conectados a la red, el inconveniente es que este tipo de escaneo es fácilmente detectable por  Firewalls modernos y software de detección de intrusos, que bloquearan nuestra IP origen, y registraran logs de nuestras conexiones. También indicar que con esta técnica solo se detectan puertos TCP (para UDP se usan otras técnicas). 

Ejemplo escaneo toda la red privada de clase C 192.168.1/24

sudo nmap -sT 192.168.1/24 (o también sudo nmap 192.168.1/24)
Ejemplo escaneo al único host 192.168.1.1

sudo namp -sT 192.168.1.1 (o también sudo nmap 192.168.1.1)
Ejemplo escaneo del rango 192.168.1.0 al 192.168.1.30

sudo nmap -sT 192.168.1.1-30 (o también sudo nmap 192.168.1.1-30)
NOTA: Las opciones de escaneo a red, hots y rango son aplicables a todas las difernetes opciones de escaneo de namp

Scan SYN-Stealth [-sS]

En lugar de utilizar el proceso de conexión TCP completo "three way handshake", el escaneo SYN-Stealth solo envia paquetes SYN a los puertos del host destino y resta a la espera de recibir el SYN-ACK conforme el puerto está abierto.

Si se recive el SYN-ACK, se da por hecho que el puerto está abierto y finalmente se envía un paquete RST en lugar del ACK, para anular la conexión TCP y evitar así que se establezca la conexión TCP completa y queden en los logs rastros de conexiones establecidas.

Aunque esta técnica no deja logs de conexiones completas en Firewalls (evolución y mejora respecto al escaneo -sT) algunos sistemas de detección son capaces de bloquear este tipo de trafico.

Ejemplo escaneo al host 192.168.1.32 (también se puede hacer por host o rango aplicando la sintaxis de los ejemplos anteriores con -sT)
sudo nmap -sS 192.168.32

Ping Scan [-sP] 

Se utiliza para ver que equipos están conectados a la red, sin tener en cuenta que puertos y servicios están corriendo.

Inicialmente nmap manda un "ICMP ECHO REQUEST" (petición de ping) a la dirección IP indicada, sino recibe el "ICMP ECHO REPLY" (respuesta de ping ), entonces intenta un envío de ping TCP para descartar si el protocolo ICMP esta bloqueado por algun Firewall o es que realmente la IP a la que se lanzan los pings no esta conectada a la red.




Ejemplo escaneo toda la red privada de clase C 192.168.1/24 (tambien se puede hacer por host o rango aplicando la sintaxis de los ejemplos anteriores con -sT) 
sudo nmap -sP 192.168.1/24

UDP Scan [-sU]

El escaneo de puertos UDP suele ser poco común excepto para la detección concreta de servicios sobre UDP y posibles troyanos, para detectar puertos UDP, nmap lanza paquetes UDP vacíos (con 0 bytes) a los puertos de la ip destino y resta a la espera de recibir un mensaje ICMP Port Unreachable (puerto inalcanzable) se considera que el puerto esta cerrado de lo contrario se asume que está abierto. 




Es importante tener en cuenta que algunos Firewalls bloquean el trafico ICMP de salida, de esta manera se pueden dar falsos positivos al no recibir nunca el mensaje de ICMP Port Unreachable y considerar abiertos puertos que realmente no lo están.



También es importante tener en cuenta que la mayoría de sistemas operativos a excepción de Microsoft limitan la generación masiva de mensajes ICMP Port Unreachable, y esto puede ralentizar muchísimo el tiempo de escaneo.



Ejemplo escaneo del rango de IPs 192.168.1 a la 192.168.1.20 (tambien se puede hacer por host o rango aplicando la sintaxis de los ejemplos anteriores con -sT)
sudo nmap -sU 192.168.1-20
Hasta aquí la primera parte del post "Escaneo de red, detección de hosts, puertos y servicios con Nmap", en la segunda parte se mostraran las técnicas para obtener el sistema operativo y versiones de los servicios corriendo en los puertos 

lunes, 6 de agosto de 2012

Crear usuarios SCP, SFTP en entornos restringidos con scponly

Introducción


Una buena alternativa y mucho mas segura que el clásico ftp , para dar acceso a usuarios en entornos restringidos (enjaulados o "chrooted") a nuestros sistemas  es instalar el paquete scponly.

Scponly es una shell restringida que permite a los usuarios acreditados ejecutar solo  comandos sftp o scp en sus directoros home (mediante Winscp por ejemplo) , de manera que tampoco puedan navegar por otros directorios fuera de su home enjaulada.

Otra ventaja es que podemos llegar a  automatizar el acceso sin password agregando nosotros como administradores, la clave pública .ssh/id_dsa.pub del equipo remoto cliente en el fichero  ~/.ssh/authorized_keys del home del usuario creado con scponly en el  servidor (el usuario solo tendrá permisos de escritura en un directorio en concreto por defecto "incoming"), del mismo modo que lo haríamos para hacer login por ssh sin contraseña

Instalación de scponly con enjaulado "chrooted"


Para instalar scponly en un equipo con linux RHEL 5 y disponer de la funcionalidad enjaulado "chrooted" (no lo he provado con otras distros), necesitamos bajarnos el paquete e instalarlo manualmente.

Mediante instalación vía repositorio con yum install scponly,  dispondríamos también de scponly  pero sin funcionalidad de enjaulado o chroot ( o al menos yo no supe  hacerlo)

Descargamos el paquete de la url https://github.com/scponly/scponly/wiki/Download en un directorio p.e '/opt' y lo guardamos con el nombre scponly.tar.gz con la opción 'wget -O'
makara@kimakara:~$ cd /opt
kimakara@kimakara:~$sudo wget -O scponly.tar.gz http://sourceforge.net/projects/scponly/files/latest/download?source=files
Descomprimimos el paquete tar.gz
kimakara@kimakara:/opt$ sudo tar xzvf scponly.tar.gz
Vamos al directorio descomprimido de scponly
kimakara@kimakara:/opt$ cd scponly-20110526
Procedemos a instalar el paquete con la opción de enjaulado
kimakara@kimakara:/opt/scponly-20110526$ sudo ./configure --enable-chrooted-binary
kimakara@kimakara:/opt/scponly-20110526$ sudo make
kimakara@kimakara:/opt/cscponly-20110526$ sudo make install
Comprobamos el exit code si es 0, para ver si se ha realizado correctamente la instalación (no es necesario este paso siempre y cuando la instalación no haya dado errores)
kimakara@kimakara:/opt/cscponly-20110526$ echo $? 
Nos aseguramos de que las shells '/usr/local/sbin/scponlyc' y '/usr/local/bin/scponly' estan en el fichero /etc/shells, sinó las añadimos manualemnte con un editor (por ejemplo con vim) dejando el contenido del fichero /etc/shells de manera similar a:
bin/sh
/bin/bash
/sbin/nologin
/bin/tcsh
/bin/csh
/bin/ksh
/usr/local/sbin/scponlyc
/usr/local/bin/scponly

Crear un usuario enjaulado


Previo a crear el primer usuario con scponlyc hay que crear el Jail con 'make jail' en el directorio donde descomprimimos el paquete tar.gz de scponly en nuestro caso /opt/scponly-20110526
kimakara@kimakara:/opt/scponly-20110526$ sudo make jail
IMPORTANTE: Si la salida del comando anterior os da un error tipo "this script requires the program useradd or pw to add your chrooted scponly user." provad de ejecutarlo como root con "sudo su -", o revisad que vuestro $PATH incluya el path donde useradd está ubicado por ejemplo ejecutando whereis useradd y agregar y exportar la variable editando el .bash_profile  

Si todo va bien, la salida del comando anterior nos generará el siguiente menú ( ademas de mostrarnos otros datos de salida):
Username to install [scponly](aqui ponemos el nombre del nuevo user)

home directory you wish to set for this user [/home/kimakara_sftp] (definimos el path que queremos o dejamos el por defecto) 

name of the writeable subdirectory [incoming] (definimos un nombre para el subdirectorio con permisos de escritura o lo dejamos el por defecto con nombre "incoming")


 New UNIX password: (definir password para el user creado)
Retype new UNIX password: (reescribir el password anterior)
Si nuestro sistema es de 64 bits necesitoms copiar los siguientes ficheros  al home del usuario enjaulado
cp /lib64/ld-linux-x86-64.so.* /home/USUARIO/lib64/
cp /lib64/libnss_files.so.2 /home/USUARIO/lib64/
Editamos el fichero '/home/USUARIO/etc/ld.so.conf' del usuario creado y comentamos o eliminamos la primera línia "include ld.so.conf.d/*.conf" y agregamos '/lib/64' y '/usr/lib64' dejando el fichero de la siguiente manera:
##include ld.so.conf.d/*.conf
/lib64
/usr/lib64

Creamos el directorio '/dev/null' encapsulado:
mkdir /home/USUARIO/dev
mknod /home/USUARIO/dev/null c 1 3
chmod 666 /home/USUARIO/dev/null
Finalmente montamos el directorio de ficheros del sistema que deseamos el usuario tenga acceso sobre "/home/USUARIO/incoming" ejectuando un 'mount -o rw, bind ...' y probamos que las directorios estén "linkados"
mount -o rw,bind /carpeta /home/USUARIO/qq type none (rw,bind)
Para que los directorios se monten automáticamente tras el reinicio del servidor editamos el fichero /etc/fstab y añadimos la siguiente línea al final
/directorio_servidor /home/USUARIO/incoming none rw,bind 1 5
Ya podemos probar el acceso mediante un cliente sftp, es importante que el cliente tenga habilitado el retraso scp como por ejemplo Winscp en la siguiente imagen


Mas información en:


Espero que la información aportada pueda ser de utilidad, cualquier corrección, sugerencia, aportación o alternativa será siempre de gran utilidad!

Saludos!

jueves, 2 de agosto de 2012

SSH, sftp y scp a través de Proxy HTTP con corckscrew

Escenario


Si vuestro trafico de salida a Internet pasa por un Proxy HTTP y este no os permite realizar conexiones sftp, scp, o ssh, podéis probar a instalar corckscrew siempre y cuando el servidor proxy sea alguno de los siguientes:
  • Gauntlet
  • CacheFlow
  • JunkBuster
  • Squid
  • Apache mod_proxy
Corckscrew es un paquete que permite realizar túneles ssh a través de un proxy http, os lo podéis descargar de aquí (por el momento la última versión es la 2.0).

Las indicaciones siguientes son para equipos Linux, aunque también se puede instalar en equipos Windows con Cygwin

 

Instalación de corckscrew 


Para instalar corckscrew en un equipo con linux:

Descargamos el paquete en un directorio temporal por ejemplo
makara@kimakara:~$ cd /tmp
kimakara@kimakara:~$ wget http://www.agroman.net/corkscrew/corkscrew-2.0.tar.gz
Descomprimimos el paquete tar.gz
kimakara@kimakara:/tmp$ tar xzvf corkscrew-2.0.tar.gz
Vamos al directorio descomprimido de corckscrew
kimakara@kimakara:/tmp$ cd corkscrew-2.0/
Procedemos a instalar el paquete
kimakara@kimakara:/tmp/corkscrew-2.0$ ./configure
kimakara@kimakara:/tmp/corkscrew-2.0$ sudo make
kimakara@kimakara:/tmp/corkscrew-2.0$ sudo make install

Configuración de ssh para uso de corckscrew


Una vez instalado el paquete necesitamos modificar el fichero de configuración de ssh. 

Para hacerlo de forma global, habilitando el uso de túneles ssh, sftp y scp para todos los usuarios del sistema, debemos editar el fichero /etc/ssh/ssh_config con nuestro editor favorito de la manera siguiente:

Ejemplo de fichero /etc/ssh/ssh_config para habilitar conexiones ssh a cualquier host (los últimos campos "usuario_proxy":"password_proxy" se pueden obviar si el proxy no requiere credenciales)
 Host *
 ProxyCommand /usr/local/bin/corkscrew "ip_proxy" "puerto_proxy" "ip_host_destino" "puerto_host_destino" "usuario_proxy":"password_proxy"
Ejemplo de fichero /etc/ssh/ssh_config para habilitar conexiones ssh a un host concreto (los últimos campos "usuario_proxy":"password_proxy" se pueden obviar si el proxy no requiere credenciales)
Host "ip_host_destino"
 ProxyCommand /usr/local/bin/corkscrew "ip_proxy" "puerto_proxy" "ip_host_destino" "puerto_host_destino" "usuario":"password"
 
En entornos donde solo nos interese habilitar conexiones que usen túneles ssh a ciertos usuarios en concreto, crearemos o editaremos el fichero ~/.ssh/config
(donde "~" es el $HOME de cada usuario) con el mismo contenido que en los ejemplos anteriores.

Si las instalación de corckscrew y las configuraciones son correctas podréis establecer conexiones ssh a través de vuestro proxy http.

Mas información en:


Espero que la información aportada pueda ser de utilidad, cualquier corrección, sugerencia, aportación o alternativa será siempre de gran utilidad!

Saludos!