domingo, 20 de enero de 2013

Ubuntu server I

Esta semana un amigo me facilitó un par de ordenadores de empresa que iban a ir directamente a la basura. No eran grandes joyas, la verdad, además exceptuando un par de discos duros de no mas de 40 gigas cada uno (eso si, de conexión en caliente) y algún lector de cd utilizable había poco que rascar así que se me ocurrió la idea de montarme un pequeño servidor para ir dando caña al html (lenguaje que usan las páginas de internet) y montarme mi web con su dominio, su servidor ftp, sql y lo que se me vaya ocurriendo. Aparte de la más que suficiente motivación de trastear e ir aprendiendo poco a poco es una forma más que útil de poder ver las pelis en casa de algún colega sin necesidad de cargar con el disco duro portátil y tener completa disposición de determinadas herramientas cuando no estoy delante de mi ordenador.
Procurando todavía no meterme con soluciones alternativas (Cannonical ha de estar orgullosa de mi...) me decanto por Ubuntu Server en su versión 12.04. La instalación es sencilla, basta con grabar la imagen e introducirla en el lector de la máquina que queremos empiece a funcionar como servidor. Tras varias pantallas en las que se nos pedirá una partición o disco integro para el sistema, el nombre del pc, el del usuario y su contraseña nos preguntará que servicios deseamos incluir en la instalación. Para instalar un servidor web con apache, mysql y php, seleccionaremos LAMP. Ya que no disponía de pantalla ni monitor la solución obvia pasa por seleccionar también openSSH server que nos permitirá manejar el servidor desde otro pc. También seleccioné SAMBA para compartir de forma más cómoda mis archivos en la red local.
Tras concretar la contraseña de mySQL y alguna otra cosilla, la instalación procederá al copiado de archivos y terminará pidiendo un reinicio del sistema. Cuando rearranque lo primero que debemos hacer es configurar su lugar en la red ya que por defecto, la instalación habilita el uso del cliente DHCP para que sea el router quien se encargue de administrar una dirección IP válida a la máquina dentro de nuestra red. Esto está muy bien y automatiza el proceso de identificación pero en un servidor no es muy útil ya que los servicios DHCP harán que la IP del servidor pueda variar dificultando el acceso al mismo. Lo que vamos a hacer ahora es otorgar una IP estática en la configuración de la red de la máquina y deshabilitar el cliente DHCP.
Arrancamos y cuando Ubuntu server termina su carga nos dará una pantalla de identificación de terminal. Tras logearnos con nuestro nombre de usuario y contraseña modificaremos el archivo de configuración ubicado en /etc/network/interfaces. Como con todos los ficheros de configuración que cambiemos, recomiendo (sobre todo al usuario inexperto en el código a tratar) realizar antes una copia de seguridad del archivo. Ya que todas las acciones que realizaremos requieren privilegios de administrador primero teclearemos un sudo su para hacer permanentes los permisos loggeandonos como root:
sudo su
cp /etc/network/interfaces /etc/network/interfacesOLD
Una vez realizada la copia usaremos el editor "nano" para reescribir el fichero interfaces.
nano /etc/network/interfaces
En la última línea encontraremos la configuración de nuestra tarjeta ethernet, algo como esto:

iface eth0 inet dhcp

Que manda a la tarjeta funcionar por dhcp. Lo sustituiremos el siguiente texto:

address 192.168.0.104 #IP del servidor
netmask 255.255.255.0 #Máscara de subred
gateway 192.168.0.1 #IP de tu router
nameserver 208.67.222.222,208.67.220.220 #Dirección de tus servidores DNS

Las direcciones introducidas aquí son las mias, esto no quiere decir que puedan servirle a alguien más. Has de configurarlo acorde con tu red, recuerda que puedes averiguar tu ip con el comando "ifconfig"
Una vez hecho esto guardamos los cambios (CTRL+O) y salimos (CTRL+X). Ya solo queda reiniciar el servicio para que los cambios tengan efecto:
/etc/init.d/networking restart
Así cada vez que apaguemos el servidor y arranquemos estaremos seguros de tener la IP que le acabamos de especificar en el archivo de configuración.

En este momento ya se puede volver a desconectar la pantalla y el teclado y volver al pc de siempre para iniciar la configuración desde la consola por medio de Securit Shell o bien podemos continuar como estamos.

Para acceder a nuestro servidor desde otro pc abrimos una terminal y llamamos a securit shell indicándole el puerto de conexión el nombre del usuario con el que nos loggearemos y la dirección IP de la máquina con la que queremos establecer comunicación. En mi caso el puerto es distinto porque lo he cambiado manualmente para ponérselo más difícil (solo muy poco) a cualquier atacante que rastree mi red dándole un valor alto al que los escáneres rápidos no suelen llegar. Para una primera interacción el puerto estándar es el 22 así que la orden a introducir es esta:
ssh -p 22 (nombre usuario)@(IP máquina)
Se nos pedirá la contraseña del usuario y si todo va bien el prompt de la terminal cambiará por el de la máquina a la que hemos accedido. En ese momento, todas las órdenes que tecleemos serán ejecutadas directamente en nuestro servidor.

Para el próximo post (prometo que no volveré a tardar 11 dias) configuraremos el servidor samba y web además de añadir un demonio de ftp.
Hasta la próxima!

miércoles, 9 de enero de 2013

Nmap, escaneando la red

La herramienta que quiero tratar hoy es una de las mas importantes y eficaces en cuanto al fingerprint se refiere. Cuando se quiere hacer una prueba de seguridad (pentest) en una red el primer paso suele ser recabar información de nuestro objetivo, a esto se le llama information gathering o fingerprint. Debemos saber a que nos enfrentamos, que servicios se ejecutan en la máquina que tenemos por víctima, los puertos abiertos, que sistema está corriendo en ella etc... Aquí es donde entra Nmap. Nmap es un escáner de redes que puede facilitarnos increíblemente esta tarea mandando determinados paquetes de verificación cuyas respuestas serán interpretadas dándonos detalles tipo que puertos y servicios se están ejecutando, sistema operativo, versiones... Además, nos solo se que ahí ya que esta herramienta tiene un poderoso motor de scripts que puede ir desde opciones para intentar un bruteforce hasta
Para empezar, podemos instalarlo directamente de los repositorios de Ubuntu con un:
sudo apt-get install nmap
O bien podemos descargarnos la última versión de código fuente desde aquí. En esa página también aparecen las instrucciones para su instalación así que no las escribiré aquí.

Nmap requiere privilegios de root así que lo primero que haremos será un sudo su para no repetir cada sudo. EN principio es fácil de usar, no requiere mas que una llamada al programa seguido del objetivo a escanear, que puede ser un ip: 127.0.0.1 varias separadas por un espacio (127.0.0.1 192.168.0.100) o un rango de estas (192.168.0-1.*). También admite nombres de dominio (google.com, localhost).
  El comando nmap localhost cargaría un análisis básico sobre nuestra máquina local cuya salida solamente marcará los puertos abiertos de uso mas común con los servicios que corren en ellos. Ahora bien, si añadimos parámetros podemos hacer que nmap nos detalle más su búsqueda. Por ejemplo, añadiremos -A para detallar el sistema operativo, las versiones y un traceroute, -T5 para habilitar un método mas rápido y ruidoso y ampliaremos el rango de puertos TCP al máximo con -p 1-65535, a ver que sucede.
nmap -A -p 1-65535 -T5 localhost
La información de salida se ha ampliado enormemente, dándonos lo indicado por medio de los flags extra. Aquí dejo una guía con todos los argumentos de nmap y su uso. Aunque la mayoría de las veces solo usaremos un puñado, conviene darles un repaso.

TÉCNICAS BÁSICAS DE SCANEO:
·                     Escanear un solo objetivo - nmap [target]
·                     Escanear múltiples objetivos - nmap [target1,target2,etc]
·                     Escanear una lista de objetivos - nmap -iL [list.txt]
·                     Escanear un rango de hosts - nmap [range of IP addresses]
·                     Escanear una subred completa - nmap [IP address/cdir]
·                     Explorar hosts aleatorios - nmap -iR [number]
·                     Excluyendo los objetivos de un scan - nmap [targets] –exclude [targets]
·                     Excluyendo los objetivos mediante una lista - nmap [targets] –excludefile [list.txt]
·                     Realizar una exploración agresiva - nmap -A [target]
·                     Escanear un objetivo IPv6 - nmap -6 [target]


OPCIONES AVANZADAS DE SCANNEO:
·                     TCP SYN Scan - nmap -sS [target]
·                     TCP connect scan - nmap -sT [target]
·                     UDP scan - nmap -sU [target]
·                     TCP Null scan - nmap -sN [target]
·                     TCP Fin scan - nmap -sF [target]
·                     Xmas Scan - nmap -sX [target]
·                     Escaneo TCP ACK - nmap -sA [target]
·                     Custom TCP scan - nmap -scanflags [flags] [target]
·                     Exploración protocolo IP - nmap -sO [target]
·                     Enviar paquetes Ethernet - nmap -send-eth [target]
·                     Enviar paquetes IP - nmap -send-ip [target]

OPCIONES DE SCANNEO DE PUERTOS:
·                     Realizar un análisis rápido - nmap -F [target]
·                     Escanear puertos específicos - nmap -p [Puertos] [target]
·                     Escanear puertos por nombre - nmap -p [nombre del puerto] [target]
·                     Escanea los puertos de protocolo - nmap -sU-sT-p U: [puertos], T: [puertos] [target]
·                     Analizar todos los puertos - nmap -p "*" [target]
·                     Escanea los puertos principales - nmap -top-ports [número] [target]
·                     Realice un escaneo de puertos secuencial - nmap -r [target]

OPCIONES DE DESCUBRIMIENTO:
·                     Realizar solamente una exploración de ping - nmap-sP [target]
·                     No hacer ping - nmap -PN [target]
·                     TCP SYN Ping - nmap -PS [target]
·                     Ping TCP ACK - nmap -PA [target]
·                     UDP ping - nmap -PU [target]
·                     Ping SCTP ​​Init - nmap -PY [target]
·                     Eco ICMP ping - nmap -PE [target]
·                     Ping ICMP Timestamp - nmap -PP [target]
·                     Ping ICMP de máscara de dirección - nmap -PM [target]
·                     Ping protocolo IP - nmap -PO [target]
·                     ARP ping - nmap -PR [target]
·                     Traceroute - nmap -traceroute [target]
·                     Fuerza resolución DNS inversa - nmap -R [target]
·                     Deshabilitar resolución DNS inversa - nmap -n [target]
·                     Alternative DNS lookup - nmap -system-dns [target]
·                     Especifique manualmente los servidores DNS - nmap -dns-servers [servers] [target]
·                     Crear una lista de host - nmap -SL [target]



DETECCIÓN DE VERSIÓN:
·                     Detección del sistema operativo - nmap -O [target]
·                     Enviar Fingerprints TCP/IP - www.nmap.org/submit/
·                     Tratar de adivinar un desconocido - nmap –osscan-guess [target]
·                     Servicio de detección de versión - nmap -sV [target]
·                     Solución de problemas de las exploraciones versión - nmap -sV-version-trace [target]
·                     Realizar un análisis RPC - nmap -sR [target]

Para el usuario mas acostumbrado a las unidades gráficas, o que sienta que todo esto le supera, quizá pueda facilitar el habituarse a estas opciones el uso de Zenmap, descargable desde la misma web de nmap.
Antes de concluir, voy a donar un pequeño script en bash que hace un año ideamos un par de colegas y yo y que es bastante útil a la hora de hacer escáneres masivos buscando un servicio concreto para vulnerarlo o lo que sea:
     #/bin/bash
   
    menumsg() {
   
         echo -n "Inroduce Subnet (Ex: 192.168.1.0/24)"
         read target
     echo "Introduce el proceso a olisquear"
     read proceso
     echo "Introduce el puerto sobre el que deseas buscar el proceso"
     read puerto
         echo "Deseas olisquear:$target en busca de $proceso ? [y/n]"
         read proceed
   
    }
   
    menumsg
   
    if [ $proceed = yes ] || [ $proceed = y ] ; then
   
       
         exec nmap -p $puerto  $target -oG - | grep open > primerpaso
         awk '{ printf $2; }' primerpaso > primeralista
         echo "Primer Paso ejecutado, continuamos[y/n]?"
         read continuamos
         
            if [ $continuamos = yes ] || [ $continuamos = y ] ; then
   
              nmap -v -p $puerto -sV -iL primeralista -oG - | grep $proceso > segundopaso
              awk '{ printf $2; }' segundopaso > segundalista
              cp segundalista Resultado.txt
         
            elif [ $continuamos = no ] || [ $continuamos = n ] ; then
                    cp primeralista Resultado.txt
                 
            fi    
    elif [ $proceed = no ] || [ $proceed = n ] ; then
       
         menumsg
    fi    
   
    echo "Revisa Resultado.txt para revision"
   
    exit



Es bastante simple de entender, no obstante, lo que hace es pedir un objetivo (Ips) un servicio y puerto. Pasa el nmap sobre ese puerto y genera, primero una lista con los resultados de puerto abierto y una segunda filtrando las ip con el proceso.

Por hoy es todo. Hasta la próxima!

lunes, 7 de enero de 2013

Tomando contacto con la consola en linux II

En la entrada anterior aprendimos a movernos por las carpetas desde la terminal y a visualizar su contenido con cd y ls. En este post quiero mostrar como abrir archivos, dar privilegios de super usuario, instalar programas y actualizar el equipo usando la terminal.
Para ello abrimos el menú de inicio (puede hacerse pulsando la tecla de windows que hay entre el CTRL y el ALT izquierdos) y buscamos y ejecutamos la terminal.
Cuando tratamos con la consola, la mayoría de las veces, no contamos con el ratón ni un entorno intuitivo que nos de pistas sobre como llamar a un programa en un menú. Cuando nos desenvolvemos en la consola solo contamos con el teclado y hemos de aprender a escribir los nombres de los programas necesarios para leer documentos, ver fotografías... en resumen, para comunicarnos con la máquina. Como ejemplo, vamos a crear un archivo con un texto de muestra, usando un programa de edición de escritura simple para la terminal, llamado "nano". Lo primero vamos a ejecutar el programa, para ello basta con escribir su nombre tras el prompt:
nano
 Lo que aparece a continuación es el entorno de trabajo del programa. Obviamente, quizá al usuario recién llegado de Microsoft Office no le parezca nada atractivo y esto es porque no es ese su objetivo. Es un editor rápido y simple que con el uso de sistemas bajo terminales de comandos se hará muy útil por simpleza ligereza y rapidez.
Escribamos un texto de prueba y siguiendo la pequeña ayuda de la parte inferior del programa, presionamos CTRL+O (el apóstrofe ^ significa CTRL) y en esa misma parte se abrirá un pequeño diálogo para introducir el nombre del archivo sobre el que guardaremos los cambios. Por ejemplo "prueba.txt".
Presionamos la tecla intro para aceptar y CTRL+X para salir del editor y volver al prompt de la consola.
Si ahora quisiéramos ver lo que contiene el archivo, no bastaría simplemente con poner su nombre. Como he comentado antes necesitamos indicar al sistema que hacer con el ya que por si mismo, no tiene permisos de ejecución (no es un programa en si) y aunque los tuviese, el sistema no sabría que hacer con él al no contener código de máquina. Para abrirlo tendremos que llamar primero a un editor de texto o visor de documentos, en este caso, seguiremos con otro programa aunque bien podríamos volver a utilizar nano, hay otra herramienta aún más rápida y simple para ver texto sin formato: "cat". Escribimos tras el prompt:
cat prueba.txt
Esto se repite con casi todos los archivos no ejecutables, es decir, que dependen de otro programa para ser abiertos.

Hay ocasiones en las que un usuario común no podrá ejecutar determinado programa u orden por los privilegios concedidos de este. Esto son protocolos de seguridad establecidos en linux para evitar o minimizar el daño que pueda provocar cualquier tipo de malware (virus, gusanos, troyanos...). Uno de estas órdenes, de uso muy usual en Ubuntu, es apt-get que sirve para refrescar la caché de programas y actualizaciones disponibles tanto como para instalar o desinstalar software de Ubuntu. Cuando actualizamos, instalamos o configuramos software desde el escritorio, normalmente usamos el centro de software de Ubuntu o Moun que nos pedirá una contraseña de administración antes de cualquier cambio. En la consola hemos de hacerlo escribiendo el comodín "sudo" antes de llamar al programa que actualizará nuestra caché para comprobar si existen actualizaciones de seguridad importantes; apt-get update
sudo apt-get update
Se nos pedirá la contraseña y tras aceptar pulsando intro se nos mostrarán las conexiones y el tráfico de datos que ejecuta el programa, preguntando a los servidores preconfigurados, cuales son los nombres y dependencias de los nuevos paquetes si los hay y con apt-get upgrade, descargaremos e instalaremos las actualizaciones necesarias.
sudo apt-get upgrade
Cuando vamos a necesitar el estatus de super usuario en una sesión más larga que un par de comandos, por no llamar a sudo en cada línea, se emplea sudo su que tras la contraseña nos dará privilegios hasta cerrar la consola o bien hasta que tecleemos exit.
 En principio puede y de hecho parece costoso aprender toda una serie de comandos para funcionar eficientemente con la consola. Es cierto, requiere tiempo y ganas, no obstante, los resultados que se obtienen siendo constante en su manejo bien merecen la pena ya que llega un momento que tan siquiera se hecha en falta un entorno gráfico y el control del ordenador llega a ser casi total.
Paciencia. Paciencia y leer probar y tocar lo que se os ocurra. Normalmente la mayoría de los comandos traen documentación que nos será de tremenda utilidad para entenderlos y llegar a controlarlos, haciendo una llamada al directorio de manuales con "man" seguido de un comando, se nos mostrará la documentación de este y si nos parece demasiado, quiza un "--help" tras él pueda resolvernos dudas. Aquí dejo una lista de comandos de uso mas cotidiano.
  
Comandos básicos en linux .pdf

Es todo por hoy. ¡A darle caña!

jueves, 3 de enero de 2013

Tomando contacto con la consola en linux I

En principio la idea era escribir una entrada que familiarizara a los usuarios primerizos de Ubuntu con el entorno gráfico Gnome (su escritorio y aplicaciones gráficas) pero más allá de unas breves referencias a su menú de inicio y el centro de software, no veo productivo el hacerlo ya que todo es demasiado intuitivo y basta con leer las breves descripciones que se nos muestran con la mera experimentación. De momento, prefiero iniciar al lector en el funcionamiento del sistema utilizando la herramienta más poderosa de este, la consola de comandos. Todas las tareas que hacemos habitualmente en nuestro ordenador (a nivel usuario al menos) son realizadas por programas con entorno gráfico que dan ordenes, en forma de comandos a la terminal de Ubuntu, esto quiere decir que todas las tareas se pueden ejecutar desde la linea de comandos e incluso a un nivel de control mayor del que suele darse con programas de interfaz gráfica.
Con esta entrada pretendo dar a conocer los comandos de uso mas cotidiano mientras trabajamos con la linea de comandos de linux-debian asi como el funcionamiento de las carpetas y archivos en dicho entorno.
Para empezar abriremos la consola en Ubuntu haciendo click en el menu de inicio (primer botón en la barra de tareas de la derecha en el escritorio de Gnome Unity, preinstalado en la versión 12.04) y buscando el programa llamado "terminal". Lo que nos encontramos al ejecutarlo es una pantalla negra con un conjunto de caracteres blancos llamado "prompt" seguido de un cuadro, blanco también, parpadeante esperando que demos instrucciones por medio del teclado.


El prompt es lo que nos indica que la consola está esperando instrucciones además de darnos información sobre dónde estamos, en vez de ser los que en antiguos sistemas msDOS o en la linea de comandos de Windows es C:\ que nos indicaba la carpeta raíz del disco llamado C: aquí cambia mostrándonos en primer lugar, el nombre del usuario que está usando la comandera, seguido de un arroba y el nombre de la máquina sobre la que se ejecuta. Lo que sigue a los dos puntos va a marcarnos el directorio o la carpeta sobre la cual estamos operando, además de otro carácter que nos muestra los derechos o privilegios que disponemos. En este caso el atajo representado con "~" nos señala que la carpeta actual es el "home" o carpeta personal del usuario con el que funcionamos, es decir, "chaosnet". Si cambiamos de directorio este se será sustituido por un, por ejemplo, "/etc/dpkg/" o la ruta de cual sea nuestro punto de acción. El siguiente símbolo es "$". Este solo puede variar a "#" y nos indican el poder que tenemos a la hora de ejecutar acciones que requieren permisos especiales, o, lo que es lo mismo, si somos "root" o super usuario. Si lo somos, el final del prompt, mostrará # y si no, $.
Bien, ahora vamos a aprender a desplazarnos por los directorios, a crear, eliminar, ejecutar y cambiar permisos de los archivos. Estos comandos son básicos y conviene habituarse a ellos si queremos manejarnos desde la terminal. Cada comando en linux suele tener un montón de atributos que especifican y concretan su acción y normalmente pueden verse y estudiarse añadiendo un simple "--help" despues del comando que queremos estudiar. El primero que tocaremos será ls. ls tiene como función detallar los archivos y directorios que se encuentran en la carpeta sobre la que actuamos.
Si tecleamos ls --help se nos mostrarán todas las funciones del comando pero de momento nos bastará con un ls para que veamos como nos detalla el contenido de la carpeta.
En la terminal por defecto de ubuntu, cuando leemos un directorio con ls se nos muestran las carpetas en color azúl, los archivos sin permisos de ejecución (los que tendremos que abrir con otro programa, ya entraremos en detalles más adelante) como documentos de texto etc... ,en blanco, verde para archivos ejecutables (programas), el rojo es para ficheros comprimidos y el magenta para los archivos de imagen. Hay otros pero son menos usuales y, de todas formas están definidos en la variable LS_COLORS y pueden cambiarse en /etc/DIR_COLORS (creo recordar) pero eso no viene al caso, el estándar predefinido suele ser este.
Para navegar entre directorios, ir de uno a otro, se usa el comando cd seguido de el nombre del directorio al que queremos acceder. Es posible subir varios niveles de una vez si separamos los nombres de los directorios con sus correspondientes barras, por ejemplo "cd directorio1/directorio2" siempre que la ruta sea correcta (es decir, que exista el directorio2 dentro del directorio1) y también dirigirnos a una ruta fuera de el directorio en que nos encontramos, por ejemplo desde /home/chaosnet/ ir a /dev, simplemente marcando la ruta deseada después de el comando cd. Para retroceder un nivel, ir al directorio predecesor se usa la clave .. tras cd: "cd .."

Por hoy es todo. Para mañana continuamos con la apertura de archivos, la creación y eliminación y una lista de comandos de utilidad.

¡Hasta otra!