miércoles, 27 de noviembre de 2013

Si ICMP pudiera hablar

De seguro conoces el protocolo de mensajes de control de Internet ICMP, y sabes que se trata de un protocolo para la gestión y control de errores del protocolo IP que permite verificar la situación de los dispositivos de interconexión de una red basada en el protocolo de Internet.

Imagen 1: Estructura del Mensaje ICMP (fuente: Astorino Networks) 

También habrás escuchado que es utilizado como un canal encubierto para "exfiltrar" información en entornos mal gestionados, dado que no puede ser controlado por un Firewall tradicional por tratarse de un subprotocolo de la capa de red (capa 3 del modelo OSI) y no de la capa de transporte (capa 4), razón por la cual no tiene asociado un puerto TCP/UDP.

Exfiltrar: palabra utilizada para definir la práctica desarrollada por atacantes (internos generalmente) para sacar información utilizando mecanismos por fuera del control de los sistemas de seguridad habilitados en una organización.

Su principal herramienta de gestión es el comando PING existente en cada sistema operativo. Dependiendo del sistema, el comando envía un paquete de datos conformado por diferentes caracteres para verificar el funcionamiento del protocolo.

Con ocasión de la cuarta versión del BarCamp Security Edition y calentando para los retos propuestos por los encargados del evento en cada una de las 12 ciudades participantes, he compartido una captura de trafico en el servicio en la nube CloudShark que busca medir las habilidades de los nuevos participantes en el BCSE y prepararlos para los retos que se publicarán el próximo sábado 30 de Noviembre a nivel nacional.

¿Crees que tienes la respuesta? Compártela en los comentarios junto al procedimiento que utilizaste para conseguirla.

Te esperamos en el BCSE, será un evento sin igual y con bastantes premios para los asistentes.

miércoles, 6 de noviembre de 2013

Controlando la Planta Nuclear de Springfield desde la casa de Homero: Libmodbus + Python + C

De seguro alguien te dijo que existía un protocolo de comunicaciones de facto para sistemas de control Industriales, conocido como Modbus con más de 30 años de existencia y creado originalmente para implementarse en ambientes cerrados donde la confidencialidad no era una necesidad importante pues el riesgo era mínimo.

Y también conoces al Jefe de Seguridad de la Planta Nuclear de Springfield "Homero Simpson" quién durante un tiempo tuvo la necesidad de controlar desde su casa algunas de las tareas de la planta nuclear.

Figura 1: Homero Simpson - Jefe de Seguridad, Planta Nuclear

Modbus es un protocolo de comunicación serial que transmite la información en claro sin ningún mecanismo de ocultación y usando controles de redundancia cíclica para garantizar la integridad del paquete. Utiliza códigos predefinidos que permiten reconocer el tipo de paquete transmitido su origen y destino y funciona en dominios de broadcast que permiten a todos los equipos conectados recibir el paquete pero solamente el destinatario lo procesará.

Diseñaremos una Unidad Terminal Remota (RTU), haciendo uso de una Raspberry, libmodbus y una aplicación servidor creada en C, así como el paquete WiringPI para controlar los puertos GPIO usando lenguaje C. Vamos a simular la famosa planta nuclear donde usaremos los puertos GPIO para (Des)activar algún sistema en la planta gestionada por una aplicación servidor.

por otro lado, haciendo uso de PyModbus y una aplicación cliente vamos a proponer un servicio de acceso desde el cómodo hogar de Homero que se comunique con la estación servidor y realice las peticiones para controlar los servicios en la planta.

Modbus-server.c es una aplicación que habilitará el servicio Modbus en el puerto 1502 y de acuerdo a las peticiones simplemente activará o desactivará un servicio en el puerto GPIO 7 de la raspberry.

en primer lugar instalamos la librería sobre la plataforma Wheezy Raspbian de Raspberry 


sudo apt-get install libmodbus5 libmodbus-dev

Descargamos el paquete WiringPI y lo instalamos usando git:

git clone git://git.drogon.net/wiringPicd wiringPi  
git pull origin 
./build

Ahora que tenemos las herramientas para usar modbus y acceder a los puertos GPIO mediante programación en C vamos a diseñar nuestro script, basados en el código de Stéphane Raimbault:

#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <modbus.h>
#include <inttypes.h>
#include <wiringPi.h>
enum {
    TCP,
    RTU
};
int main(int argc, char *argv[])
{
    int socket;
    modbus_t *ctx;
    modbus_mapping_t *mb_mapping;
    int rc;
    int use_backend;
    int nPort = 1502;
    wiringPiSetup();
    pinMode (7, OUTPUT);
    use_backend = TCP;
 ...
        printf("Waiting for TCP connection on Port %i \n",nPort);
        ctx = modbus_new_tcp("127.0.0.1", nPort);
        socket = modbus_tcp_listen(ctx, 1);

        modbus_tcp_accept(ctx, &socket);
        printf("TCP connection started!\n");
    mb_mapping = modbus_mapping_new(MODBUS_MAX_READ_BITS, 0,
                                    MODBUS_MAX_READ_REGISTERS, 0);
    if (mb_mapping == NULL) {
        fprintf(stderr, "Failed to allocate the mapping: %s\n",
                modbus_strerror(errno));
        modbus_free(ctx);
        return -1;
    }
    for(;;) {
        uint8_t query[MODBUS_TCP_MAX_ADU_LENGTH];
        rc = modbus_receive(ctx, query);
        if (rc >= 0) {
            printf("Received: %" PRIu8 "\n",query[9]);
            if (query[9]==10)
            {
               digitalWrite  (7,HIGH);
               printf ("--- Port 7 set to 1\n");
            }
            if (query[9]==11)
            {
               digitalWrite (7,LOW);
               printf ("--- Port 7 set to 0\n");
            }
            printf("Replying to request.\n");
            modbus_reply(ctx, query, rc, mb_mapping);
        } else {
            /* Connection closed by the client or server */
            //break;
        }
    }
    printf("Quit the loop: %s\n", modbus_strerror(errno));
    modbus_mapping_free(mb_mapping);
    close(socket);
    modbus_free(ctx);
    return 0;
}

Del lado del cliente mgpio-client.py es una aplicación que se conecta con el servidor y envía mediante el protocolo modbus las peticiones para activar o desactivar el servicio. Por supuesto tenemos una etapa previa de acceso con una petición de usuario y contraseña, pero aunque no es el objetivo de esta práctica hablaremos más adelante de las debilidades de algunos sistemas de control o PLC respecto a la seguridad de acceso.

En primer lugar instalamos PiModbus, la librería que nos permitirá usar la pila del protocolo desde código Phyton:

svn checkout http://pymodbus.googlecode.com/svn/trunk/ pymodbus-read-only
cd pymodbus-read-only
python setup.py install
Ahora creamos el código para enviar las peticiones con los valores específicos:

import os
from pymodbus.client.sync import ModbusTcpClient
...
client = ModbusTcpClient('192.168.0.7',1502)
option = 0
while not option == 3:
   os.system('clear')
   print """   Control Menu
   1. Enable System
   2. Disable System
   3. Exit
   """
   option = int(input("Select your option: "))
   rq = client.write_coil(9+option, True)
client.close()
print """Leaving the system ...
   ...
   ...
   Thanks Mr.Homer you deserve a beer"""



Como se observa, la conexión se realiza usando Modbus sobre TCP lo que permite realizar la administración sobre una red amplia como Internet, garantizando el acceso al servicio desde diferentes locaciones... haciendo más fácil la tarea de Homero y la labor de implementación de, digamos .. Carl y Lenny.

Controlando la Planta Nuclear de Springfield desde la casa de Homero: Libmodbus + Python + C 
Controlando la Planta Nuclear de Springfield desde la casa de Homero: La Prueba de Concepto
Controlando la Planta Nuclear de Springfield desde la casa de Homero: Análisis con Wireshark
Controlando la Planta Nuclear de Springfield desde la casa de Homero: Evil Flanders

martes, 5 de noviembre de 2013

CVE-2013-3906 Una vulnerabilidad de imágenes TIFF introducidas en documentos Word

De seguro has escuchado hablar de las vulnerabilidades de Día 0 y de algunas de ellas dirigidas a la suite de ofimática Microsoft Office. Pues el día de hoy, Microsoft ha publicado un post sobre una vulerabilidad detectada en el medio Oriente y Sur de Asia consistente en debilidad de gráficos, distribuidos mediante documentos de Word de tal forma que aparenta ser un documento de importancia (Recordemos que la Ingeniería Social juega un gran papel en este tipo de ataques) pero que al ser ejecutado produce un "Crash" en el sistema ejecutando una aplicación especialmente configurada en el equipo para habilitar ejecución remota de comandos o posiblemente automatizar tareas de "espionaje" en el sistema operativo.

Figura 1: Crash del sistema por la explotación de la vulnerabilidad 0Day

De acuerdo a la publicación de Microsoft, se trata de una debilidad de las gráficas TIFF y que además incluye técnicas para evadir métodos de seguridad como ASLR y DEP de tal forma que en equipos donde la seguridad no es suficiente puede correr sin complicaciones.

Para hacer frente a esta nueva vulnerabilidad, Microsoft a publicado un "Security Advisor" para mitigar el riesgo y ha confirmado que su herramienta para control de técnicas anti ASLR y DEP, conocida como EMET es capaz de contener las técnicas de evasión y evitar el ataque.

Figura 2: kit de herramientas de experiencia de mitigación mejorada EMET
Además, mientras se publica una actualización de seguridad que solucione el problema, es recomendable deshabilitar el Codec de TIFF creando la siguiente llave en el registro de Windows 

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Gdiplus\DisableTIFFCodec = 1

Esto evitará que se ejecute el codec de reproducción de imágenes TIFF en la suite de Microsoft o cualquier aplicación de Windows, Microsoft recomienda verificar sus aplicaciones cuando sea necesario ejecutar este codec pues no funcionarán correctamente.

Las versiones vulnerables son las previas a Office 2013:

 Office 2003 Affected
 Office 2007 Affected
 Office 2010 Affected only on Windows XP/Windows Server2003
 Office 2013 Not affected

Espero que esto ayude a asegurar aún más tu entorno de trabajo especialmente si tienes comunicación directa y constante con el Dalai Lama ;)

lunes, 4 de noviembre de 2013

Shodan no es el único enemigo de las Infraestructuras Críticas

De Seguro conoces la Turbina de Búsqueda ShodanHQ, has hecho algunas consultas y te has encontrado con maquinas publicadas que pueden tener debilidades de configuración por defecto, Banners irresponsablemente redactados ..... e incluso vulnerabilidades de día 1337 ;)

Figura 1: configuraciones por defecto, indexadas por Shodan

Figura 2: Banner interesante indexado por Shodan

Figura 3: Vulnerabilidad de día 1337 indexadas por Shodan

Y al ver todas estas repuestas hiciste la consulta de rigor sobre los servicios que administras o provees, o, aquellos pertenecientes a la organización donde estas trabajando y con un poco de suerte la respuesta fue:

Figura 4: Consultas sin resultados indexados por Shodan

Pues lamentablemente la tarea no esta lista. El no estar indexado por Shodan no quiere decir que: "si estas conectado a Internet, nadie te encontrará". 

Realizar un escaneo masivo es una tarea que ha venido mejorando, especialmente en el último año con la aparición de herramientas como ZMap o MASSCAN pero puede hacerse de forma sencilla, incluso didáctica haciendo uso de DNMAP (Distributed NMAP Framework), un servicio basado en arquitectura Cliente/Servidor, que recibe peticiones de los clientes conectados y entrega un rango de direcciones IP para agilizar el trabajo de escaneo de un amplio grupo de equipos o puertos.

En 2012, Paulino Calderon @calderpwn haciendo uso de DNMAP e invirtiendo un aproximado de USD 20 y 12 estaciones cliente, consiguió identificar todos los equipos terminales y otros servidores publicados en el puerto 80 del proveedor Colombiano de Telecomunicaciones UNE, con una cifra superior a 15 millones de direcciones IP y en un tiempo aproximado de 22 horas:

Figura 5: Routers encontrados en el proveedor UNE por CalderPWN

Aunque se trata de una búsqueda sencilla de servidores HTTP (Puerto 80) en cada una de las IP consultadas, podemos evaluar que para aumentar el número de puertos objeto de la consulta podemos recurrir a un mayor tiempo de proceso, o mantener el mismo tiempo aumentando el número de equipos cliente.

Recuerdas los tipos de escaneos que puede realizar NMAP (-sS, -sT, -sU, -sC, etc) y el creciente número de scripts que garantizan una identificación más precisa de servicios y debilidades, entonces ¿aún crees que ocultarte de shodan será suficiente?