domingo, 25 de marzo de 2018

Instalando Docker en un dispositivo ARM

Todo el mundo que trabaja en el sector de las tecnologías de la información está al tanto del gran avance que fueron las máquinas virtuales, las cuales estaban controladas por hipervisores que simulaban el hardware sobre un sistema operativo anfitrion. Desde mi opinión, este avance ayudó a la migración de los servidores a grandes proveedores como Amazon Web Services, Microsoft Azure y mil y un derivados que ofrecian máquinas virtuales en "su nube" por un precio asequible que permitía disponer de diferentes localizaciones para los servidores.

Pero una máquina virtual es costosa en cuanto a que necesitas un sistema operativo host, un hipervisor que simule el hardware para las diferentes VM, y sobre estas montar cada una de ellas las diferentes aplicaciones. Eb cambio, los contenedores dan un paso más en cuanto a optimizar esta virtualización, compartiendo todos ellos el sistema operativo host y un "gestor" de contenedores (Docker) de forma que cada uno de los contenedores sólo contendrá los paquetes necesarios para la ejecución de la aplicación. Nos ahorramos la virtualización del hardware y tener un sistema operativo para cada uno.



No quiero dar más importancia a la definición de contenedores o justificación sobre su uso frente a las máquinas virtuales. Haciendo una simple busqueda en google encontrareis cientos de sitios con más y mejor literatura sobre Docker, contenedores y analisis pormenorizados sobre sus ventajas y desventajas frente a las VM, o incluso el uso de contenedores sobre VM (algo muy habitual), así que vamos a focalizarnos en una primera toma de contacto con Docker.

Requisistos previos


Para el experimiento de hoy, usaré una placa con ARMBIAN (https://www.armbian.com). Es importante tener presente que los requisitos a día de hoy de Docker para ARM es que la versión del Kernel sea la 3.10 o superior, lo cual me llevó a instalar en mi SBC la versión ARMBIAN 5.38 Server, con una Debian 9 Stretch (kernel 4.14.18-sunxi). Os comento esto porque puede que os deje instalarlo en una versión previa, pero al arrancar el servicio...falla.

Para ver la versión que tenemos usamos el comando uname -a:

josec@orangepiplus2e:~$ uname -a
Linux orangepiplus2e 4.14.14-sunxi #1 SMP Thu Jan 25 12:20:57 CET 2018 armv7l GNU/Linux

Instalación de Docker

Lo primero es asegurarnos que no tenemos una version previa de Docker instalada con el siguiente comando.

josec@orangepiplus2e:~$ sudo apt-get remove docker docker-engine docker.io
(...)
Package 'docker-engine' is not installed, so not removed
Package 'docker.io' is not installed, so not removed
Package 'docker' is not installed, so not removed
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.


Si lo están, los desinistalamos, repetimos hasta que nos indique no están instalados.

A continuación actualizamos los repositorios:


josec@orangepiplus2e:~$ sudo apt-get update

Y e instalamos las dependencias:

josec@orangepiplus2e:~$ sudo apt-get install apt-transport-https ca-certificates curl gnupg2 software-properties-common


Añadimos la clave del repositorio de Docker

josec@orangepiplus2e:~$ curl -fsSL https://download.docker.com/linux/$(. /etc/os-release; echo "$ID")/gpg | sudo apt-key add -

OK

Y el repositorio de Docker lo añadimos a su propio source.list:


josec@orangepiplus2e
:~$ echo "deb [arch=armhf] https://download.docker.com/linux/$(. /etc/os-release; echo "$ID") $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list


Y como resultado nos devuelve el repositorio que hemos añadido a nuesto apt:

deb [arch=armhf] https://download.docker.com/linux/debian      stretch stable

Y ya estaremos en condiciones de instalar el paquete docker-ce con apt con el comando:

josec@orangepiplus2e:~$ sudo apt-get install docker-ce
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following additional packages will be installed:
  libltdl7
Recommended packages:
  aufs-tools cgroupfs-mount | cgroup-lite
The following NEW packages will be installed:
  docker-ce libltdl7
0 upgraded, 2 newly installed, 0 to remove and 18 not upgraded.
Need to get 21.0 MB of archives.
After this operation, 94.4 MB of additional disk space will be used.
Do you want to continue? [Y/n] y
Get:1 http://cdn-fastly.deb.debian.org/debian stretch/main armhf libltdl7 armhf 2.4.6-2 [386 kB]
Get:2 https://download.docker.com/linux/debian stretch/stable armhf docker-ce armhf 17.12.0~ce-0~debian [20.6 MB]
Fetched 21.0 MB in 31s (676 kB/s)
(...)

Una vez instalado, para arrancar el servicio de docker:

josec@orangepiplus2e:~$ sudo service docker start

Y para pararlo:

josec@orangepiplus2e:~$ sudo service docker stop

Vemos la versión instalada con:

josec@orangepiplus2e:~$ docker --version

Docker version 17.12.0-ce, build c97c6d6

Una prueba rápida de que nuestro Docker funciona:

josec@orangepiplus2e:~$ sudo docker run armhf/hello-world
Unable to find image 'armhf/hello-world:latest' locally
latest: Pulling from armhf/hello-world
a0691bf12e4e: Pull complete 
Digest: sha256:9701edc932223a66e49dd6c894a11db8c2cf4eccd1414f1ec105a623bf16b426
Status: Downloaded newer image for armhf/hello-world:latest

Hello from Docker on armhf!
This message shows that your installation appears to be working correctly.
(...)

Instalación de Docker Compose en ARM

La mayoria de las veces, necesitamos crear una composicion de imagenes de Docker con diferentes aplicaciones cada una. Para eso se usa Docker Compose. Por ejemplo, una aplicación en varios contenedores para sus servicios web, otra para la base de datos y otra para gestionar la caché de ambos. Este será un ejemplo que veremos más adelante, pero si debemos tener presente que necesitamos Docker Compose para montar el entorno.

Lamentablemente, parece que desde Docker no tienen aún una solución para instalar de forma fácil Compose, por lo que recurrimos a un tercero para hacerlo: https://github.com/hypriot/arm-compose

Las instrucciones, que vienen indicadas en el propio GitHub, son bastante sencillitas. Partimos de la base que las dependencias para Docker-Compose son las mismas que para Docker, por lo que nos saltamos ese paso y comenzando por añadir el repo:

josec@orangepiplus2e:~$ echo "deb https://packagecloud.io/Hypriot/Schatzkiste/debian/ stretch main" | sudo tee /etc/apt/sources.list.d/hypriot.list

deb https://packagecloud.io/Hypriot/Schatzkiste/debian/ stretch main

Añadimos la clave:

josec@orangepiplus2e:~$ sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 37BBEE3F7AD95B3F
Executing: /tmp/apt-key-gpghome.a6vD4J6hxR/gpg.1.sh --keyserver keyserver.ubuntu.com --recv-keys 37BBEE3F7AD95B3F
gpg: key C2E73424D59097AB: public key "packagecloud ops (production key) <ops@packagecloud.io>" imported
gpg: Total number processed: 1

gpg:               imported: 1

Actualizamos:


josec@orangepiplus2e:~$ sudo apt-get update

Y finalmente instalamos:


josec@orangepiplus2e:~$ sudo apt-get install docker-compose

Y para ver que está instalado, consultamos la versión:

josec@orangepiplus2e:~sudo docker-compose --version

docker-compose version 1.8.0, build unknown

IMPORTANTE: Es necesario tener arrancado el servicio de Docker para poder usar Compose

Referencias


  • Instalación de Docker (Página Oficial): https://docs.docker.com/install
  • Automated build for docker-compose on ARM (GitHub): https://github.com/hypriot/arm-compose
  • ARMBIAN: https://www.armbian.com















domingo, 18 de marzo de 2018

Jugando con Metasploit y EternalBlue

En 2017 el grupo conocido como the Shadow Brokers expuso una de las filtraciones de seguridad más conocidas y dañinas hasta la fecha. Entre sus filtraciones se incluia un exploit zero-day de Microsoft Winows que se denominó ETERNALBLUE.330. Este fallo de seguridad en el servicio  SMB en los sistemas operativos desde Windows XP a Windows 2012, fue corregido por Microsoft en Marzo de 2017, pero no todos los usuarios del sistema operativo estaban actualizados cuando en abril de ese mismo año se produjo un ataque masivo del ransonware Wannacry que infectó aproximadamente a un cuarto de millón de equipos.

El post de hoy lo retomo de una serie de pruebas de concepto que realicé hace unos meses simulando un ataque que explotaba esta vulnerabilidad en un equipo conectado a un punto de acceso que hacia las veces de WAP e IDS (hablaré más sobre este tema en otro post).

El sistema victima, con IP 10.42.0.208 y sistema operativo Microsoft Windows 7 Professional SP1 (sin actualizaciones) estará conectado por WiFi a nuestro hotpot por su interfaz wlan0 (con ip 10.42.0.1) que analizará todo el tráfico entrante y saliente de nuestra intranet.

Por otro lado, nuestro punto de acceso se conectará a internet a través de un router ADSL/Fibra por su interfaz eth0 (con ip 192.168.1.144).

Partiremos de la premisa de que el equipo atacante ha conseguido conexión al mismo router ADSL que nuestro hotpot, por ejemplo, por cable ethernet o crackeando la WiFi original del router, obteniendo la IP 192.168.1.10. Tras un análisis previo determinó que existe una red 10.42.0.0/24 y que hay equipos conectados, entre los que encontramos a nuestra víctima, por lo que ya estaría en predisposición de realizar el ataque.



Desde el atacante, con una red distinta a la de la víctima, lo primero que debería hacer es establecer un enrutado a la subred 10.42.0.0 a través de la que es su puerta de enlace, 192.168.1.144 con el comando:


ip route add 10.42.0.0/24 via 192.168.1.144


Screenshot from 2017-08-25 20-56-27.png


Con Metasploit, haciendo uso de un scanner de la vulnerabilidad eternalblue (auxiliary/scanner/smb/smb_ms17_010) determinará que victima es vulnerable al ataque.

Screenshot from 2017-08-25 20-51-09.png

A continuación, para explotar la vulnerabilidad, el atacante utilizará el exploit exploit/windows/smb/ms17_010_eternalblue desde MSFCONSOLE. Rellenará los datos necesarios para su ejecución:


Screenshot from 2017-08-25 20-48-56.png

Y se ejecutará:


Screenshot from 2017-08-25 20-49-00.png

Y tras esto, tendremos control sobre la victima. ¿Detectó algo nuestro IDS Snort? Ante la realización del exploit, vemos como el IDS si ha detectado tráfico potencialmente peligroso y ha lanzado una alerta informando que se está explotando la vulnerabilidad ETERNALBLUE.

domingo, 11 de marzo de 2018

Setup de un IDS Snort en un dispositivo ARM (III): de fichero a base de datos con Barnyard2

Leer los archivos Unified2 de Snort es algo tedioso, sobre todo por el hecho de tener un formato específico para optimizar espacio y no ser en texto plano. Por otro lado, los fichero de Snort irán siendo borrados, y nosotros querremos tener un almacenamiento de la información más persistente que simple ficheros de texto, indexada y sobre la que poder realizar busquedas. Para esto, usamos Barnyard2, una herramienta de terceros que lee de los ficheros de Snort y nos lo almacena, por ejemplo, en una base de datos MySQL.

Prerequisitos: MySQL


Para la instalación simplemente ejecutaremos el comando apt-get con el paquete mysql-server, y tras esta, securizaremos la instalación con el comando mysql_secure_instalation.

sudo apt-get install mysql-server
sudo mysql_secure_installation

Finalmente, probaremos a arrancar y parar el servicio con los comandos:

# iniciar el servicio mysql
sudo service msyql start
# parar el servicio mysql
sudo service msyql stop


Instalación de Barnyard2


Como deciamos en la introducción, usaremos la herramienta Barnyard2 para poder exportar los ficheros de logs de Snort a base de datos.

Para su instalación necesitaremos previamente instalar las siguientes librerias:

sudo apt-get install -y mysql-server libmysqlclient-dev mysql-client autoconf libtool
sudo ln -s /usr/include/dumbnet.h /usr/include/dnet.h
sudo ldconfig


Una vez tenemos los prerequisistos, estaremos en disposición de proceder con su instalación:

wget https://github.com/firnsy/barnyard2/archive/master.tar.gz -O barnyard2-Master.tar.gz
tar zxvf barnyard2-Master.tar.gz
cd barnyard2-master
autoreconf -fvi -I ./m4
./configure --with-mysql --with-mysql-libraries=/usr/lib/x86_64-linux-gnu
make
sudo make install


Y tras la instalación probaremos si el software se ha instalado correctamente:


barnyard2 -V




El siguiente paso es la configuración de la herramienta. Para ello copiaremos el fichero de configuración de barnyard al directorio de Snort:


sudo cp ~/barnyard2-master/etc/barnyard2.conf /etc/snort/


Y crearemos los directorios y ficheros necesarios para el registro de logs en /var/log.


sudo mkdir /var/log/barnyard2
sudo chown snort.snort /var/log/barnyard2
sudo touch /var/log/snort/barnyard2.waldo
sudo chown snort.snort /var/log/snort/barnyard2.waldo


A continuación deberemos preparar la base de datos donde Barnyard2 escribirá los registros. Para ello, nos conectaremos a MySQL, crearemos una base de datos que llamaremos snort y ejecutaremos el script de creación que barnyard nos proporciona. Tras esto, crearemos un usuario y le concederemos permisos de lectura y escritura a la base de datos creada. Dicho usuario será que que usaremos en la configuración de Barnyard2.

mysql -u root -p
create database snort;
use snort;
source ~/snort_src/barnyard2-master/schemas/create_mysql
CREATE USER 'snort'@'localhost' IDENTIFIED BY ‘homeidsdbpassword’;
grant create, insert, select, delete, update on snort.* to 'snort'@'localhost';
exit


El último paso es la edición del fichero de configuración barnyard2.conf. En dicho fichero deberemos cambiaremos la linea 30 para que el fichero de configuración sid-msg.map sea sid-msg1.map:

config sid_file:            /etc/snort/sid-msg1.map


Este cambio se debe a que Barnyard2 interpreta estas reglas durante el arranque. Si el fichero contiene muchas reglas, el arranque se ralentiza mucho, llegando a tardar horas en sistemas con pocos recursos como los que estamos utilizando. Al no ser un requisito imprescindible, cambiamos este fichero por uno que siempre estará vacío, de tal forma forma que cuando PulledPork reescriba nuestro fichero sid-msg.map, el arranque de Barnyard2 no se verá afectado. Finalizamos la configuración añadiendo en la última línea del fichero el formato de la salida de barnyard2, que en nuestro caso es una base de datos MySQL con el usuario y base de datos que hemos creado en el paso anterior:


output database: log, mysql, user=snort password=homeidsdbpassword dbname=snort host=localhost sensor name=sensor01

Este fichero de configuración expone información sensible de conexión a nuestro SGBD, por lo que deberemos quitar los permisos de lectura a los usuarios no administradores.

sudo chmod o-r /etc/snort/barnyard2.conf


Para ejecutar Barnyard2 tendremos que escribir:


sudo barnyard2 -c /etc/snort/barnyard2.conf -d /var/log/snort -f snort.u2 -w /var/log/snort/barnyard2.waldo \
-g snort -u snort