Uso de Empire Framework contra sistemas Windows.

septiembre 2, 2019 1 comentario

Empire es un framework muy interesante que incluye varios elementos de post-explotación enfocados a sistemas windows utilizando PowerShell, así como sobre sistemas GNU/Linux comprometidos utilizando Python. Cada uno de dichos elementos en Empire cuentan con varios mecanismos interesantes para la transferencia y ejecución de “stagers” en la máquina comprometida, siguiendo un modelo muy similar al que sigue Metasploit Framework a la hora de generar sesiones. Las comunicaciones entre el atacante y víctima son cifradas, algo que también comparte Metasploit Framework a la hora de utilizar payloads del tipo “meterpreter” y además, permite ejecutar instrucciones en PowerShell sobre un sistema windows aunque en dicho sistema no tenga el ejecutable “powershell.exe”. Los módulos de post-explotación incluidos en Empire son fáciles de desplegar y de utilizar, algunos de los cuales permiten la ejecución de keyloggers para el “espiar” las actividades del usuario, nuevamente algo muy parecido a lo que nos encontramos en los payloads del tipo meterpreter de Metasploit Framework . Empire también tiene la capacidad de ejecutar comandos en memoria, lo que significa que al no ser instrucciones que requieren acceso a unidades de almacenamiento persistente, tienen mayores probabilidades de no ser detectadas por AVs u otros mecanismos de seguridad que puedan estar en ejecución en el sistema comprometido.

Empire Framework asiste al pentester en las labores de elevación de privilegios, reconocimiento de red y de sistemas alcanzables, movimientos laterales entre hosts (pivoting) y la recolección de credenciales o cualquier detalle informativo que pueda resultar interesante. Empire consigue éste objetivo partiendo de 3 componentes principales: Listeners, Stagers y Agents.

– Listeners: Proceso en la máquina del atacante y que espera conexiones por parte de las víctimas.

– Stager: Instrucciones que envía el atacante a la víctima.

– Agents: Se trata del componente que mantiene la conexión entre la víctima y el atacante desde el sistema comprometido. Es el encargado de recibir cada stager enviado por el atacante y ejecutarlo.

Instalación de Empire

Hay 2 formas de instalar Empire, la más “clásica” consiste clonar el repositorio del proyecto, el cual se encuentra ubicado en: https://github.com/EmpireProject/Empire

git clone https://github.com/EmpireProject/Empire.git

sudo ./setup/install.sh

sudo ./empire

Durante el proceso de instalación, se solicitará establecer una contraseña que será utilizada posteriormente entre el agente y listener.

La otra alternativa consiste en utilizar la imagen de Docker que se encuentra preparada para dicho propósito.

docker pull empireproject/empire

Una vez instalada la herramienta, basta simplemente con ejecutar el comando “./empire” y comenzará el proceso de carga de listeners, módulos, stagers y todo el entorno del framework.

Empire cuenta con un interprete de comandos para utilizar las funcionalidades principales de la herramienta. Como se puede apreciar en la imagen anterior, al iniciar Empire se enseña el número total de módulos cargados, número de listeners que se encuentran activos y los agentes en ejecución en alguna máquina remota.

Los comandos básicos se pueden apreciar rápidamente ejecutando el comando “help”, no obstante los más importantes inicialmente son aquellos que permiten interactuar con los diferentes elementos del framework, especialmente los listeners y módulos. Para enseñar los Listeners que se encuentran actualmente activos, basta simplemente con ejecutar el comando “listeners” y para utilizar alguno de los  disponibles en el framework, ejecutar el comando “uselistener”. El interprete de Empire permite auto-completar con la tecla “tab” lo cual resulta extremadamente útil y práctico a la hora de interactuar con los elementos de la herramienta.

Una vez seleccionado uno de los listeners disponibles, es posible ejecutar el comando “info” para obtener información de las opciones de dicho listener y a continuación, cada una se puede establecer con el comando “set option value”.

Una vez iniciado el listener es el momento de seleccionar un stager existente con el comando “usestager stager”. Por ejemplo “usestager windows/launcher_bat”. Posteriormente se deben definir sus propiedades, del mismo modo que se ha explicado antes para los Listeners, en éste caso concreto, siempre será necesario establecer la propiedad “Listener” con el nombre del listener que se ha iniciado en el paso anterior, el comando a ejecutar es “set Listener nombre-listener”.

Si se ha utilizado el stager “windows/launcher_bat”, una vez el fichero “.bat” sea transmitido y ejecutado sobre el sistema Windows comprometido, se podrá obtener una conexión reversa en Empire y se podrá ver que en la consola aparece un nuevo agente habilitado.

Un agente es como una sesión en Metasploit Framework, lo que significa que el siguiente paso consiste en interactuar con él para llevar a cabo el proceso de post-explotación. Hay que tener en cuenta que Empire no es un framework de explotación como sí lo es Metasploit Framework, con lo cual el proceso de iniciar una conexión reversa tras ejecutar un agente en un sistema remoto tiene que llevarse a cabo después de que el sistema haya sido comprometido y sea posible ejecutar instrucciones sobre él, en el caso de la figura anterior, por ejemplo, ha sido la ejecución de un fichero “.bat”. Una alternativa en el proceso de explotación podría consistir en utilizar técnicas de ingeniería social y “forzar” de alguna manera a un usuario del sistema objetivo a ejecutar el fichero .bat que se ha generado desde Empire u otra podría ser la explotación de alguna vulnerabilidad en el sistema objetivo, subir el .bat y ejecutarlo.

Para interactuar con un agente se debe utilizar el comando “interact”, tal como se puede apreciar en la siguiente imagen.

Existen varios módulos disponibles en Empire que se encuentran en el contexto de cada uno de los agentes disponibles, dichos módulos se centran en la extracción de información y en la elevación de privilegios. Uno de los elementos más interesantes para conseguir el propósito de elevar privilegios sobre un sistema windows es “PowerUp” el cual contiene múltiples módulos para identificar y explotar servicios vulnerables, registros del sistema y cualquier oportunidad de elevar privilegios. Todos los módulos de PowerUp se encuentran incluidos en “privesc/powerup/*” y uno de los más útiles es precisamente “powershell/privesc/powerup/allchecks” ya que realiza todas las pruebas de PowerUp contra el sistema.

ByPass UAC con Empire

Como seguramente el lector ya sabe, el mecanismo UAC (User Account Control) se ha implementado a partir de Windows Vista y se caracteriza por contar con 3 niveles de integridad que separan los permisos que tienen los usuarios del sistema sobre los recursos: Alto, Medio y Bajo. La mayoría de aplicaciones y servicios que ejecuta un usuario se encuentran en el nivel medio, en donde se incluyen los privilegios estándar para el acceso a recursos comunes, pero evidentemente no es posible ejecutar actividades administrativas para las que es requerido estar en el nivel “alto”. En los últimos años han surgido varias técnicas de “ByPass UAC” que permiten escapar del nivel “Medio” y moverse directamente al nivel “Alto” de UAC. Dichas técnicas incluyen, entre otras cosas, la inyección de librerías dinámicas que intenten realizar el proceso de elevación o la ejecución del programa “wscript.exe” / “cscript.exe” con un fichero manifest malicioso ubicado en C:\Windows para lanzar instrucciones con un nivel de integridad UAC alto. Estas técnicas se encuentran disponibles en Metasploit Framework con sus correspondientes módulos de Post-Exploitation como en Empire por medio del comando “bypassuac” disponible en cada uno de los agentes del framework.

Como se puede apreciar en la figura anterior, se ha lanzado el módulo “bypassuac” directamente en el contexto del agente, el cual no tiene privilegios administrativos sobre el sistema. Dicho módulo recibe como argumento el nombre de un listener en ejecución, en éste caso se puede utilizar el mismo listener que se ha iniciado anteriormente a la hora de obtener una conexión reversa con el agente. Hay que tener en cuenta que todos los módulos en Empire se ejecutan en segundo plano, por lo tanto es posible seguir interactuando con la herramienta y en la medida de que los módulos lanzados van recuperando información o generando algún tipo de traza, van apareciendo en la consola, lo que a veces puede confundir un poco. En la imagen anterior se puede ver que tras la ejecución del módulo “bypassuac” se ha generado un nuevo agente, el cual, al listarlo en la herramienta, aparece con un “*” en la columna de “Username” lo que significa que dicho usuario puede ejecutar comandos como administrador.

Mimikatz con Empire

Mimikatz (o Kiwi) es una herramienta muy conocida en el mundo de la post-explotación en sistemas Windows, permite extraer información sensible de la memoria del sistema concretamente detalles relacionados con cuentas de usuarios y credenciales. Se trata de una herramienta que se encuentra disponible en Metasploit Framework en forma de módulo externo, sin embargo en el caso de Empire también se encuentra disponible entre los módulos disponibles para cada uno de los agentes. Para poder usar el módulo “mimikatz” en Empire, es necesario tener privilegios administrativos, por lo tanto es necesario tener un agente con permisos elevados, ya sea un usuario administrador o que el proceso del agente se encuentre en el nivel “Alto” de UAC, esto es importante para que Mimikatz pueda leer registros e información en la memoria del sistema operativo, sino se cumple con este requisito la herramienta no puede extraer prácticamente nada de la memoria.

Como se puede apreciar en la imagen anterior, Mimikatz ha sido capaz de extraer información interesante del sistema, incluyendo nombres de usuarios y contraseñas en texto plano.

Empire es una alternativa interesante que es fácil de utilizar, flexible y a día de hoy funciona bastante bien. Si el lector se encuentra interesado en temas de post-explotación de sistemas y busca participar en algún proyecto basado en Python para mejorar sus habilidades, probablemente Empire será una muy buena opción.

Un saludo y Happy Hack.

Adastra.

Formaciones para el segundo semestre del 2019 en Securízame

agosto 29, 2019 1 comentario

Como algunos de vosotros ya sabéis, llevo un tiempo colaborando con Securízame en los cursos presenciales de Hacking y RedTeam, así como en la certificación RTCP. Llevamos un tiempo elaborando y actualizando los contenidos de estas formaciones y estamos muy contentos de ver los progresos que han tenido nuestros estudiantes, a título personal me resulta muy satisfactorio el hecho de haber tenido alumnos sin ningún conocimiento previo en seguridad informática y ver su evolución a lo largo de las formaciones. Evidentemente, como siempre he dicho, es importante que los alumnos tengan una buena predisposición para el estudio y ganas de aprender, afortunadamente en prácticamente todos los casos me he encontrado con personas que realmente están interesadas en su aprendizaje, en afianzar sus habilidades para mejorar profesionalmente. Por otro lado, también estamos muy contentos con la certificación RTCP, la cual está teniendo un impacto y aceptación tremendo entre profesionales y empresas del sector al tratarse de la primera certificación española 100% práctica en un entorno real. RTCP marca diferencias importantes con respecto a otras certificaciones tan conocidas y valoradas como la OSCP, una de ellas es que el examen es completamente práctico, presencial y enfocado al mundo real. Qué quiere decir esto? Que no es como un CTF cualquiera, que no te vas a encontrar preguntas de selección múltiple, ni tampoco te vamos a pedir que crees un exploit para una vulnerabilidad de Buffer Overflow simple en un sistema windows XP, como ocurre en la OSCP. Consideramos que esto puede estar muy bien en el mundo académico, pero no en el mundo empresarial en donde existen firewalls, sistemas de detección de intrusos, aplicaciones actualizadas, AVs, etc. La certificación la enfocamos a ese tipo de situaciones, a las que un pentester profesional se tiene que enfrentar en su día a día, esto significa que no es una certificación fácil de conseguir pero del mismo modo, se traduce a que el poseedor de dicha certificación REALMENTE tiene conocimientos sobre el tema, que es precisamente lo que buscan las empresas y por los perfiles que más se paga.

Como algunos ya sabéis, el pack de formaciones completo está compuesto por un curso básico, avanzado, entrenamiento y finalmente la certificación, sin embargo un alumno puede optar por adquirir uno o ambos cursos, el entrenamiento o presentarse directamente al examen de certificación, en este sentido no hay ninguna restricción.

Para este segundo semestre del 2019 hemos incluido algunos cambios y mejoras, en primer lugar hemos actualizado algunos contenidos del curso avanzado y además, vamos a incluir algunas máquinas del entrenamiento (las más sencillas). Luego, en el entrenamiento que se hará un mes después del curso avanzado, el último día hemos decidido plantearos como reto resolver el examen RTCP anterior (cada nueva convocatoria del RTCP incluye un examen diferente al de la convocatoria anterior), es decir, que desde el entrenamiento ya vais a saber cómo es la filosofía del examen y podréis ir más preparados. La idea es que antes de finalizar el entrenamiento, intentéis resolver el examen de la versión anterior del RTCP y tras un tiempo prudencial, explicaros la solución.

Finalmente recordaros que la primera formación comienza en pocas semanas, concretamente el día 20 de septiembre empezamos con el curso básico de Hacking y aún nos quedan plazas, pocas pero aún hay, así que si estás interesado no dudes en apuntarte.

Un saludo y Happy Hack.

Adastra.

Seguridad en ElasticSearch: Indices y búsquedas – Parte II

agosto 25, 2019 3 comentarios

En la primera parte de esta serie se han explicado las características funcionales incluidas en ES y los diferentes mecanismos de instalación. Ahora es el momento de comprender cómo funciona ES a la hora de crear índices, tipos y documentos, así como los endpoints disponibles en la API Rest para realizar búsquedas. La API Rest de ES es extensa y compleja, por lo tanto en estos posts solo se intentará cubrir las cuestiones relacionadas con la forma de realizar búsquedas, configuración de nodos/clusters, así como algunos complementos y medidas que pueden ayudar a mejorar la seguridad de una instancia de ES.

En primer lugar, hay que tener en cuenta que ES es bastante parecido a otros gestores de bases de datos no relacionales como MongoDB, especialmente en el sentido de que no hay una estructura fija. Esto significa que a diferencia de una base de datos relacional con tablas, las cuales están compuestas por un conjunto de columnas con restricciones en tipos de datos, relaciones con otras tablas (claves foráneas), longitudes, campos obligatorios, etc. En ES este tipo de estructuras y jerarquías a la hora de almacenar información son un poco diferentes. Para que esta idea quede clara, se expone el siguiente ejemplo:
En una base de datos relacional, se podría crear una tabla de usuarios, la cual estará compuesta por campos tales como: “nombre”, ”edad”, “genero”, “rol” y “fechaNacimiento”. A la hora de realizar una inserción de un registro en dicha tabla, se debe incluir como mínimo, un valor para todos aquellos campos que sean obligatorios y no se podría crear un registro que tenga un campo que no se encuentre definido en la tabla, es decir, no se podría crear un registro que incluya un campo llamado “direccionUsuario” dado que este campo no está en la definición de la tabla. Esto, en el mundo de ES no es así, ya que cada registro que es conocido como un document almacenado en un index y type concretos, no necesariamente tiene una estructura de campos fija, de hecho, se trata simplemente de estructuras JSON que pueden tener “cualquier cosa”, incluso elementos con múltiples valores como arrays, comportamiento que podría servir para crear relaciones de composición entre diferentes bloques de información, tal como se pretende hacer con las claves foráneas en una base de datos relacional. Los documentos en ES, desde el punto de vista técnico pueden estar compuestos por estructuras de datos no homogéneas, aunque evidentemente a la hora de diseñar un sistema es altamente recomendable definir una estructura base que será utilizada para la creación de registros en un nodo o cluster de ES. Dicho esto, es el momento de ver cómo crear índices, tipos y documentos.

¿Cómo crear registros en una instancia o cluster de ES?

Como se ha explicado en el post anterior a éste, para interactuar con una instancia o cluster de ES es necesario utilizar la API Rest que se encuentra disponible en cualquier nodo en ejecución. Se puede utilizar cualquier cliente HTTP para realizar peticiones contra dicha API Rest, desde CURL, wget, Postman hasta un objeto HttpConnection en Java o la librería “requests” de Python. El cliente empleado no es tan importante como conocer los endpoints disponibles y cómo se deben invocar de forma correcta. Probablemente la creación de índices es la labor más importante en ES y también, de las más sencillas tal como se puede apreciar en la siguiente imagen:

Utilizando Postman se ha creado un índice llamado “articulos”, con un tipo llamado “noticia” y un documento con identificador “2019001”. Si se quisiera comparar esta estructura con algo más familiar, como una base de datos relacional, “articulos” sería un esquema en la base de datos, “noticia” una tabla y “2019001” la clave primaria del registro insertado y luego, la estructura JSON que viaja en el cuerpo de la petición contiene los valores del registro propiamente dicho, cada uno en el campo que le corresponde. Sencillo, no?

Bien, esto es la operación de inserción pero también se puede gestionar el índice, tipos y documentos con operaciones CRUD (Create, Read, Update, Delete) tal como se puede apreciar a continuación.

Operación de lectura: Petición HTTP GET: http://ES_IP:ES_PORT/index/type/id

Operación de actualización: Petición HTTP POST: http://ES_IP:ES_PORT/index/type/id

Operación de borrado: Petición HTTP DELETE: http://ES_IP:ES_PORT/index/type/id

Gestionar índices en ES no es una labor compleja pero si vital para el correcto funcionamiento del sistema, ya que evidentemente es “el core” de la información y sobre los cuales trabajan otros endpoints de la API Rest disponibles en ES. Ahora que se ha visto cómo crear, obtener, actualizar y eliminar índices en ES, es el momento de hablar de búsquedas sobre estás estructuras de datos.

¿Cómo realizar búsquedas en ES?

Nuevamente es necesario utilizar la API Rest para realizar búsquedas contra ES. Dado que ES al igual que Lucene, se han creado precisamente para realizar búsquedas rápidas y potentes, no es de extrañar que ésta sea también una de sus características más complejas y difíciles de controlar. En este post solamente se explicará el proceso de búsquedas simples con el endpoint “_search”. En el próximo se hablará sobre la ejecución de búsquedas más complejas con múltiples filtros, paginación, acceso a mapeos, etc.

En primer lugar, el endpoint “_search” se pude utilizar directamente contra todos los índices disponibles en ES o contra uno concreto, nuevamente se puede utilizar Postman o cualquier cliente HTTP para realizar peticiones como las siguientes:

http://ES_HOST:ES_PORT/_search

Búsqueda sobre todos los índices disponibles en ES.

http://ES_HOST:ES_PORT/articulos/_search

Búsqueda sobre todos los documentos disponibles en el índice “articulos”.

http://ES_HOST:ES_PORT/articulos,negocios/_search

Búsqueda sobre todos los documentos disponibles en los índices “articulos” y “negocios”.

http://ES_HOST:ES_PORT/a*,n*/_search

Búsqueda sobre todos los documentos disponibles en los índices que empiezan por “a” y “n”.

http://ES_HOST:ES_PORT/articulos/noticia/_search

Búsqueda sobre todos los documentos disponibles en el índice “articulo” y tipo “noticia”.

http://ES_HOST:ES_PORT/_all/noticia,test/_search

Búsqueda sobre todos los documentos disponibles en todos los índices que tengan los tipos “noticia” y “test”.

http://ES_HOST:ES_PORT/articulos/noticia/_search?q=constitución

Búsqueda sobre todos los documentos disponibles en el índice “articulo” y tipo “noticia” aquellos cuyos en los que al menos un campo tenga la palabra “constitución”, o que se asemeje (esto se verá en el siguiente post).

Se trata de algunas de las peticiones más simples que se pueden ejecutar con ES y el endpoint “_search”, teniendo en cuenta que ahora mismo solamente se aplican filtros sobre índices y tipos, aún no se ha visto cómo filtrar por campos o paginar y además, las búsquedas anteriores se pueden hacer simplemente utilizando método HTTP GET. Como se verá en el siguiente post, esto se puede complicar bastante más dada la flexibilidad del motor de búsqueda y su potencia a la hora realizar consultas rápidas sobre volúmenes grandes de información.

Un saludo y Happy Hack.

Adastra.

Seguridad en ElasticSearch: Introducción – Parte I

agosto 23, 2019 3 comentarios

ElasticSearch se ha convertido poco a poco en una solución muy utilizada para el procesamiento de grandes volúmenes de datos. Está pensado principalmente para que las búsquedas sean rápidas y altamente personalizables, un modelo perfecto para la implementación de soluciones basadas en Big Data. ElasticSearch (ES) es un producto que cuenta con una API Rest muy completa para gestionar los índices y documentos, además cuenta con un sistema de complementos que permite extender sus funcionalidades. A pesar de ser un producto que lleva en el mercado varios años y que se ha posicionado muy bien, la seguridad en las instancias de ES a día de hoy es un tema delicado y en muchas ocasiones no es tan sencillo de configurar. Las instancias de ES por defecto no tienen ningún mecanismo de protección a “miradas indiscretas” y la cosa empeora aún más cuando múltiples instancias de ES funcionan en modo “cluster”. No obstante, antes de empezar a explicar estás cuestiones es importante entender el funcionamiento de ES, un poco de historia y sus características principales. Ese será el objetivo de éste post.

ElasticSearch un motor de búsqueda orientado a documentos, basado en Apache Lucene. Mantenido por su desarrollador principal hasta la creación de Elasticsearch.com (http://elasticsearch.com/) en 2012. Actualmente se encuentra bajo desarrollo y mejora continua por dicha empresa, bajo licencia OpenSource Apache 2.

Sus características fundamentales son las siguientes:

  • Orientado a documentos: JSON’s, Basado en Apache Lucene.
  • No se utilizan esquemas como en una base de datos relacional, de hecho, ES puede ser considerado como un motor de base de datos no relacional.
  • Distribuido: Escala dinámicamente y permite la integración de múltiples instancias. Los datos se encuentran replicados en cada nodo por medio de shards primarios y copias, evitando de esta forma la perdida de información en el caso de que un nodo se corrompa o exista un fallo en disco.
  • Multi-Tenant: Permite operar sobre múltiples índices a la vez
  • Centrado en API’s: Expone todas sus funcionalidades vía APIs REST
  • Búsquedas estructuradas y no estructuradas: Permite el uso de varios tipos de filtros, llegando a un nivel de granularidad en las búsquedas bastante preciso, pero también complejo.
  • Agregaciones / facetas: Permite la definición de características comunes en conjuntos de datos (documentos ES). Similar a las funciones de agregación disponibles en SQL estándar
  • Soportado por múltiples lenguajes de programación: Al tener una API Rest que permite la gestión de todas las características del sistema, es fácil crear clientes en prácticamente cualquier lenguaje de programación.
  • Elastic Search se compone de dos capas que se encuentran completamente desacopladas y tienen su propia gestión independiente:
    • Sistema distribuido: Implementa las funciones de gestión necesarias para los nodos de un cluster y el mantenimiento de sus datos. Los objetivos de esta capa se centran en el desempeño, la escalabilidad, alta disponibilidad y la tolerancia a fallos gracias al sistema de shards.
    • Motor de búsqueda: Proporciona las funcionalidades de indexación y búsqueda de documentos.

Una vez entendidas sus características principales, merece la pena mencionar la terminología básica para que luego sea más fácil de entender lo que se explicará en los próximos posts.

Cluster: Se trata de un conjunto de instancias de ES que comparten mismo nombre de cluster (propiedad cluster.name). No obstante, un cluster puede estar compuesto por un único nodo. Cuando se inicia una instancia de ES, si no se ha indicado las direcciones IP o hostnames correspondientes al conjunto de instancias “maestro”. También hay que tener en cuenta que cuando se inicia una instancia de ES por primera vez, si no se indica en la configuración la ubicación de los nodos master, es la propia instancia la que actuará como master en los próximos reinicios de la instancia, en tales casos es necesario volver a instalar y configurar la instancia desde cero tal como se verá en un próximo post.

NOTA: Al parecer en ES no creen en el lenguaje inclusivo ni son “100% feminist compliant” ya que usan términos como maestro y esclavo, espero que alguna/algune/alguni no se sienta ofendida/ofendide/ofendidi.

Nodo: Se refiere simplemente a una instancia de ES en ejecución.

Índices: Se trata de una colección de varios documentos (estructuras JSON), que no necesariamente tienen una estructura común. Comparable a los esquemas de una base de datos relacional.

Tipos: Colección de varios documentos de similar estructura. Comparable a tablas de bases de datos

Shard: Espacio de almacenamiento físico de cada uno de los documentos de un índice. También se le suele llamar “Shard Primario” para distinguir entre el “shard” principal y las replicas que se generan en otros nodos del cluster.

Replica: Copia de un shard que permite la replicación de la información. Gracias a este mecanismo ES cumple con los requisitos de alta disponibilidad y tolerancia a fallos. Por defecto, las replicas de un shard no se almacenan en el mismo nodo si hay un entorno de cluster.

Bien, teniendo claros estos términos y considerando que el objetivo de estos posts es que se puedan poner en práctica, lo primero es saber cómo instalar una instancia de ES, que tal como se podrá ver a continuación es bastante sencillo.

Instalación de ES

La instalación de una instancia de ES es un proceso muy simple y no requiere demasiado esfuerzo. Básicamente hay 3 alternativas: 1. instalarlo como servicio del sistema con los típicos gestores de paquetes en sistemas basados en Debian (apt-get) o RedHat (yum). 2. Utilizar una imagen de docker preparada o con Elastic Cloud (https://www.elastic.co/es/cloud/elasticsearch-service/signup). 3. Descargar el fichero tar.gz del sitio oficial, descomprimir y ejecutar el binario correspondiente (https://www.elastic.co/es/downloads/elasticsearch).

Cualquiera de las 3 alternativas es valida, no obstante, como ocurre con muchos otros productos de software que se pueden instalar desde código fuente (tercera opción), en mi opinión es mucho más cómodo, fácil de gestionar (no se instala un servicio systemd directamente en el SO), más fácil de configurar ya que todos los ficheros y binarios están en la misma ruta donde se ha descomprimido y lo mejor, se puede abrir el fichero de configuración ubicado en el directorio “config” y realizar los cambios que sean oportunos. En mi opinión, es mejor seguir la tercera alternativa para entender como funciona el sistema y luego plantarse incluirlo como un servicio en un entorno de producción.

Una vez descargado y descomprimido el fichero “tar.gz” basta con dirigirse al directorio “bin” y desde una terminal ejecutar el comando “elasticsearch”. Con esto, ya tenemos una instancia de ES con los valores de configuración por defecto y todo preparado para empezar a almacenar información.

Cuando se inicia una instancia de ES se podrán ver muchas trazas indicando que el nodo se encuentra levantado y como se verá un otro post, cada nodo puede estar en uno de tres posibles estados “RED”, “YELLOW”, “GREEN”. Los estados simplemente indican cómo se encuentran los shards para los índices que se han creado en la instancia. Por otro lado, también se puede ver que el servicio de ES por defecto se vincula únicamente a la interfaz de red local en el puerto 9200. Para comprobar que se encuentra correctamente instalado, basta simplemente con abrir un navegador web y lanzar una petición HTTP GET contra dicho puerto en local.

Partiendo de una instancia en ejecución, lo siguiente es comenzar a crear índices y comprobar el funcionamiento de ES. Partiendo de este conocimiento sobre el sistema, es posible comenzar a hablar de seguridad y tanto buenas como malas prácticas de configuración. Serán cosas que se verán en próximos posts.

Un saludo y Happy Hack.

Adastra.

Monitorizar conexiones y desconexiones contra un servidor OpenVPN con Python.

agosto 10, 2019 Deja un comentario

Hola a todos. He vuelto. 🙂

Las próximas semanas tendré algo de tiempo libre y he decidido dedicarlo a este espacio, escribiré algunos artículos sobre seguridad que tengo pendientes desde hace mucho tiempo y que ahora, me dispongo a compartir con todos vosotros. Vamos a por uno sencillo primero!

Una de las características más interesantes que tiene OpenVPN es precisamente la posibilidad de ejecutar scripts ante determinados eventos, por ejemplo, es posible indicar en el fichero de configuración que se ejecute un programa determinado cuando un usuario se conecta o desconecta. Dicho programa puede ser un script escrito en Python, por ejemplo, que se encargará de recopilar la información de la conexión que ha establecido el cliente. Esto puede tener varios usos, entre los que se incluyen la monitorización de las conexiones de los usuarios, forzar a que los clientes se conecten únicamente desde ubicaciones concretas, limitar el número de conexiones con el mismo certificado o OVPN, etc. En resumen, permite un buen nivel de control sobre los usuarios y las conexiones realizadas contra el servidor. Ahora, esto cómo se hace?

Configuración de OpenVPN con “script-security”

La directiva de configuración “script-security” es precisamente la que permite la ejecución de scripts y otros programas externos desde el proceso en ejecución de OpenVPN. Sin embargo, está opción no está exenta de riesgos y problemas de seguridad potenciales, tal como se puede leer en la documentación oficial de OpenVPN:

–script-security level [method]

This directive offers policy-level control over OpenVPN’s usage of external programs and scripts. Lower level values are more restrictive, higher values are more permissive. Settings for level:0 — Strictly no calling of external programs.
1 — (Default) Only call built-in executables such as ifconfig, ip, route, or netsh.
2 — Allow calling of built-in executables and user-defined scripts.
3 —Allow passwords to be passed to scripts via environmental variables (potentially unsafe).The method parameter indicates how OpenVPN should call external commands and scripts. Settings for method:

execve — (default) Use execve() function on Unix family OSes and CreateProcess() on Windows.
system —Use system() function (deprecated and less safe since the external program command line is subject to shell expansion).

The –script-security option was introduced in OpenVPN 2.1_rc9. For configuration file compatibility with previous OpenVPN versions, use: –script-security 3 system”

Evidentemente, si se utiliza ésta opción en el fichero de configuración o como argumento a la hora de levantar el servicio hay que tener en cuenta, como mínimo lo siguiente:

1. Si se establece el método “2”, sería recomendable eliminar los permisos de lectura y escritura en los scripts que se ejecutarán por medio de OpenVPN, ya que si un atacante consigue acceso local y dichos scripts permiten su edición por parte de usuarios con permisos bajos, existe la posibilidad de que elevar privilegios en el sistema.

2. Evitar usar el método “3” ya que se pueden producir fugas de información sensible a la hora de establecer credenciales en variables de entorno.

Es una opción de configuración con la que hay que tener cuidado, sin embargo cuando se siguen los criterios anteriores es posible utilizarla sin riesgo. Esta opción únicamente le indica a OpenVPN que desde el proceso se podrán lanzar scripts o comandos externos, sin embargo con esto no es suficiente para indicar cuáles serán dichos scripts y cómo se deben ejecutar. Para ello existen otras opciones de configuración en las que se especifican precisamente estos detalles, tales como “up”, “client-connect” o “client-disconnect”. Dichas opciones se pueden incluir en el fichero de configuración utilizado para levantar el proceso de OpenVPN, por ejemplo:

script-security 2
client-connect "/usr/bin/python /home/adastra/connection.py"
client-disconnect "/usr/bin/python /home/adastra/disconnection.py"

Tal como el nombre de la opción indica, estos scripts se van a ejecutar en el momento en el que un cliente se conecte o desconecte, lo que nos permite hacer cosas simples pero interesantes, como por ejemplo registrar en una base de datos los detalles relacionados con las conexiones de los usuarios (fecha, ubicación, duración de la conexión, etc.). Se trata de información que se almacena en el momento en el que el evento ocurre en forma de variables de entorno, por lo tanto, lo que se debe de hacer en estos scripts es simplemente leer el valor de dichas variables de entorno antes de que dejen de estar disponibles. El siguiente script en Python nos permite hacer precisamente esto, con muy pocas líneas y prácticamente ningún esfuerzo.

connection.py:

import posix,time;
with open('/tmp/conn.out','w') as fd:
    fd.write(posix.environ['trusted_ip'])
    fd.write(posix.environ['common_name'])

Con esto simplemente se escriben los valores de las variales “trusted_ip” y “common_name” en un fichero de texto en el directorio “/tmp”. Evidentemente existen otras variables de entorno que se pueden consultar, como por ejemplo la IP dentro de la VPN que se le ha asignado al cliente (ifconfig_pool_remote_ip).

No obstante, lo más normal es que esta información se almacene en una base de datos, para demostrar esto, el siguiente script se encargará del registro de las conexiones en una base de datos PostgreSQL, por lo tanto será necesario utilizar una librería como “psycopg2”.

import psycopg2
import posix
common_name = posix.environ['common_name']
trusted_ip = posix.environ['trusted_ip']


class Database():
	def __init__(self, dbName="database_openvpn", dbUser="postgres", dbServer="127.0.0.1", dbPort=5432, dbPass="postgres"):
		self.connection = psycopg2.connect("dbname='%s' user='%s' host='%s' port='%s'  password='%s'" %(dbName, dbUser, dbServer, dbPort, dbPass))
		self.cursor = self.connection.cursor()

	def execute(self, createInstruction, params=None):
		self.cursor.execute(createInstruction, params)
		self.connection.commit()
		id = self.cursor.fetchone()[0]
		return id

	def create(self, createInstruction, params=None):
		self.cursor.execute(createInstruction, params)
		self.connection.commit()

	def select(self, selectInstruction, params=None):
		self.cursor.execute(selectInstruction,params)
		return self.cursor.fetchall()

	def close(self):
		self.cursor.close()
		self.connection.close()

if __name__ == "__main__":
	db = None
	try:
		db = Database()
		db.create("CREATE TABLE IF NOT EXISTS user(id serial primary key, common_name varchar NOT NULL);")	
		db.create("CREATE TABLE IF NOT EXISTS addresses(id SERIAL PRIMARY KEY, address varchar(255) NOT NULL,user_id integer REFERENCES user(id));")
		db.create("CREATE TABLE IF NOT EXISTS connections(id SERIAL PRIMARY KEY, date_connection TIMESTAMP NOT NULL, date_disconnection TIMESTAMP, address_id integer REFERENCES addresses(id));")

		from datetime import datetime
		fechaActual = datetime.now()
		timeStampActual = psycopg2.Timestamp(fechaActual.year, fechaActual.month, fechaActual.day, fechaActual.hour, fechaActual.minute, fechaActual.second)
		with open('/tmp/trazas-connect','w') as fd:
			fd.write("Conexion de cliente %s desde %s \n" %(common_name, trusted_ip))
			users = db.select("select id from user where common_name = %s", (common_name,))
			userid = 0
			if len(users) < 0:
				fd.write("\nUsuario registrado previamente en la base de datos")
				userid = users[0][0]
				fd.write("\nIdentificador de usuario: %s " %(str(userid)))

			else:
				fd.write("\nUsuario NO registrado previamente en la base de datos")
				userid = db.execute("insert into user(common_name) values(%s) RETURNING id", (common_name,))
				fd.write("\nUsuario insertado en BD con identificador: %s" %(str(userid)))
				addressid = db.execute("insert into addresses(address, user_id) values(%s, %s) RETURNING id", (trusted_ip, userid,))
				fd.write("\nDirección insertada en BD con identificador: %s" %(str(addressid)))
				connid = db.execute("insert into connections(date_connection, address_id) values(%s, %s) RETURNING id", (timeStampActual, addressid,))
				fd.write("\nConexion insertada en BD con identificador: %s" %(str(connid)))
				fd.write("\nProceso de registro finalizado correctamente.")
				fd.write("\n-----------------------------------------\n\n")

	finally:
		if db is not None:
			db.close()

Este sería el script de registro, en donde se almacenan las conexiones de los usuarios y un par de detalles básicos. En este programa se verifica si el usuario se encuentra almacenado en base de datos y si está, no se procede a almacenar nada en la base de datos. El script en realidad es bastante simple, sin embargo tiene bastantes líneas de código, las cuales como se puede apreciar, en su mayoría sirven para depurar. El motivo de esto es que a día de hoy (o mejor, hasta donde llegan mis conocimientos en OpenVPN) no hay manera de depurar los programas externos que se lanzan desde el proceso de OpenVPN y si por lo que sea, dichos programas, como por ejemplo este script, lanza una excepción no controlada, el servidor rechazará la conexión con el cliente, este es otro de los motivos por los que hay que tener mucho cuidado a la hora de utilizar esta característica. Por ejemplo, suponiendo que la base de datos “database_openvpn” no se encuentre creada o que directamente el servicio de PostgreSQL se encuentre detenido, en tales casos el script lanzará una excepción y si no se controla adecuadamente, supondrá que ningún cliente se va a poder conectar a la VPN.
Ahora bien, si la opción “client-connect” permite indicar un script que se lanzará justo en el momento en el que un usuario se conecta, la opción “client-disconnect” hace lo mismo pero al reves, cuando el cliente envia la señal de cierre de conexión. Siguiendo la lógica del script anterior, el script de desconexión se encargará de realizar una operación DELETE/UPDATE sobre cada una de las tablas relacionadas. Este sería el contenido de dicho script:

import posix
import psycopg2

common_name = posix.environ['common_name']
trusted_ip  = posix.environ['trusted_ip']

class Database():
    def __init__(self, dbName="database_openvpn", dbUser="postgres", dbServer="127.0.0.1", dbPort=5432, dbPass="postgres"):
        self.connection = psycopg2.connect("dbname='%s' user='%s' host='%s' port='%s' password='%s'" %(dbName, dbUser, dbServer, dbPort, dbPass))
        self.cursor = self.connection.cursor()
        
    def execute(self, createInstruction, params=None):
        self.cursor.execute(createInstruction, params)
        self.connection.commit()

    def select(self, selectInstruction, params=None):
        self.cursor.execute(selectInstruction,params)
        return self.cursor.fetchall()

    def close(self):
        self.cursor.close()
        self.connection.close()
    
        
if __name__ == "__main__":
	db = None
	try:
		db = Database()
		from datetime import datetime
		fechaActual = datetime.now()
		timeStampActual = psycopg2.Timestamp(fechaActual.year, fechaActual.month, fechaActual.day, fechaActual.hour, fechaActual.minute, fechaActual.second)
		with open('/tmp/trazas-disconnect','w') as fd:			
			conn = db.select("select c.id from user u, addresses a, connections c where (u.id = a.user_id and c.address_id = a.id) and u.common_name = %s and a.address = %s and c.date_disconnection IS NULL", (common_name, trusted_ip,) )
			connid = 0
			fd.write("\nProceso de desconexion iniciado para el usuario %s " %(common_name))
			if len(conn) > 0:
				connid = conn[0][0]
				fd.write("\nIdentificador de conexion a actualizar %s " %(str(connid)))
				db.execute("UPDATE connections SET date_disconnection = %s where id = %s", (timeStampActual, connid,))
			fd.write("\nProceso de desconexion del usuario %s finalizado correctamente" %(common_name))
			fd.write("\n-----------------------------------------------\n\n")
	except:
		fd.write("\nSe ha producido una excepción\n")
	finally:
		if db is not None:
			db.close()

Con esto ya se tendría un sistema para la gestión de conexiones en VPN, algo que serviría para monitorizar la actividad del servidor y las conexiones/desconexiones que realizan los usuarios.
Eres libre de utilizar estos scripts y modificarlos a tu gusto para realizar pruebas o incluso para implementarlos en tu propio servicio de OpenVPN

Un saludo y Happy Hack.

Adastra.

Seguridad informática en 50 días – YOUR hacker way

marzo 4, 2019 2 comentarios

logo_small

Hace un par de semanas participé por primera vez en la MorterueloCON y aunque mi visita fue muy rápida, la charla que iba a presentar era especialmente interesante por dos motivos: Era la primera vez que la daba y sin ser una charla 100% técnica, creo que era relevante y de interés para los asistentes del evento, en su gran mayoría gente joven que está en esa etapa de la vida en la que no tienen muy claro qué estudiar.
No iba a darles ánimos, ni palmaditas en la espalda, ni a darles “motivación” o decirles que tienen mucho talento o que para el 202X van a tener trabajo asegurado en la ciberseguridad porque se van a requerir millones y millones de expertos. No, es más, es probable que alguno de los asistentes después de ver la charla se lo piense dos veces antes de empezar una carrera como ingeniero informático o afines. Lo que les conte es mucho más cercano a la realidad y a lo que se van a enfrentar si deciden seguir este camino. En primer lugar, ser informático o “hacker” no es tan guay como lo pintan, requiere mucho esfuerzo y sacrificio, no es algo que se consigue de un día a otro y no, usar Metasploit o similares no te convierte en un hacker. En definitiva, ser hacker, NO ES LO QUE TE HAN VENDIDO. Nadie te garantiza que vas a tener un trabajo fijo altamente remunerado para el 202X por mucho que algunos se empeñen en repetirlo constantemente. En mi charla insistí bastante en dos cosas que considero fundamentales: Características personales y competencias básicas. Es probable que la informática no sea lo tuyo, a lo mejor después de un análisis personal determinas que te gusta más el derecho, la psicología, las matemáticas o la biología. Entiendo que algunos pensáis que estudiar informática es la mejor opción porque es lo que supuesta demanda el mercado (con lo que sea que signifique eso), pero en mi opinión, la mejor opción es aquello que REALMENTE TE LLAMA, aquello con lo que sientes más afinidad o se te da mejor y digo esto por una razón muy sencilla: Si se te da bien algo y eres bueno en tu profesión, podrás acceder a mejores oportunidades laborales sin abanadonar el enfoque de tu carrera profesional. Si eres bueno en algo, significa casi con total seguridad que has dedicado tiempo en perfeccionar tus habilidades y esto, amigo mio, no lo hace alguien que no siente pasión por su profesión, sea cual sea.
Ahora bien, en la charla me he centrado en proponer una serie de lecciones en modo autodidacta, en las cuales los asistentes tendrían una idea general de los conocimientos básicos que en mi opinión se deben adquirir para dedicarse a la seguridad informática. En las diapositivas indico cómo debe ser cada lección en cuanto a tópicos a estudiar, además incluyo una recopilación de recursos en Internet para cada lección como material de apoyo. Creo que con esto y un poco de dedicación, una persona tendrá una buena base de las cosas que deberá aprender o bien, para decidir con más información si la informática es lo que realmente le gusta o no.

Como lo prometido es deuda, a continuación dejo un enlace para que podáis descargar las diapositivas, espero que os sean útiles. Por último, agradecer a todos los integrantes de MorterueloCON por la invitación, espero volver nuevamente el año que viene y quedarme al menos un par de días.  🙂

HACKER WAY IN 50 LECCIONES

Un saludo y Happy Hack!
Adastra.

CURSOS ONLINE DE CIBERSEGURIDAD QUE SECURÍZAME TIENE PARA EL BLACK FRIDAY

noviembre 22, 2018 Deja un comentario

Llega otra vez ese día ya tan tradicional, en el que año tras año las tiendas y empresas se vuelven locas y tiran la casa por la ventana ofreciéndole a sus clientes los mejores descuentos en diversos productos y servicios: el Black Friday.
Securízame, una de las empresas líderes en España en servicios de ciberseguridad y formación especializada, tanto online como presencial, se une a la fiebre del Black Friday 2018, y pone en oferta exclusiva para esta fiesta de precios bajos todos sus cursos online, con un descuento que sólo se da una vez al año.

De la mano de su CEO Lorenzo Martínez Rodríguez, esta empresa lleva 6 años brindando a sus clientes y alumnos su amplia experiencia en este sector, contando siempre con el respaldo de una plantilla de profesores altamente cualificada.
Securízame ofrece una magnífica oportunidad de formación a todos aquellos, amateurs y profesionales, interesados en aprender y mejorar su preparación profesional, en seguridad informática en general o en especialidades como hacking ético, análisis forense, peritaje, python y hardening.

Los cursos de Securízame han sido cuidadosamente planificados para dar a sus alumnos la máxima efectividad y calidad, tanto en contenido como en atención profesional y directa con los profesores de cada área de conocimiento, interactuando con dinamismo para compartir su experiencia y pericia, maximizando así el rendimiento de las cualidades de cada estudiante.

La plataforma ofrece un extenso abanico de cursos online en varias categorías relacionadas con informática y ciberseguridad, y en esta fecha tan especial mejora sus precios aún más, para permitir que quien así lo desee, tenga un aliciente para comenzar o continuar su formación profesional.

Además de los cursos online que presentan el descuento especial por Black Friday, Securízame proporciona la opción de hacer cursos presenciales en sus oficinas ubicadas en Madrid, o bien en las instalaciones de alguna organización que contrate formación privada, donde se puede aprender de mano de los mejores y practicar habilidades dependiendo de la temática del curso.
De igual manera, Securízame ha desarrollado dos certificaciones especializadas en ciberseguridad 100% prácticas que ponen a prueba las habilidades de los profesionales que las realizan. IRCP (Incident Response Certified Professional) y RTCP (Red Team Certified Professional), se han convertido en un reto en el que los expertos demuestran sus conocimientos y capacidades reales, aplicándolos en entornos 100% prácticos y corporativos en análisis forense para respuesta ante incidentes y hacking ético, respectivamente.

A pesar de que el descuento de Black Friday no aplica para las formaciones presenciales ni para las certificaciones mencionadas anteriormente, Securízame siempre tiene descuentos para alumnos, estudiantes universitarios, desempleados, profesionales colegiados en Ingeniería Informática, etc.

Para quien tenga interés en mejorar sus conocimientos en ciberseguridad, puede ver el amplio catálogo ofertado por Securízame en la siguiente página web

¡Así pueden aprovechar el descuento especial del 25% por el Black Friday en TODOS los CURSOS ONLINE!

Para poder hacerlo válido, tan solo se debe introducir el código promocional “BLACKFRIDAY2018” en el campo correspondiente al momento de hacer el registro en el curso seleccionado, y se aplicará automáticamente dicha rebaja. Los packs de cursos mencionados anteriormente también cuentan con el mismo descuento.

¡Esta es una oportunidad única de hacer formaciones en cibeserguridad de excelente calidad a un precio inigualable!

Esta oferta solo es válida durante el día 23 de Noviembre de 2018, de 00:00 a 23:59:59 en horario peninsular de España.

La formación online de Securízame no tiene una fecha de inicio determinada, sino que empieza cuando el alumno desee. Esto quiere decir que se puede aprovechar la oferta de Black Friday y hacer la compra del curso deseado, pero no es obligatorio empezarla ese mismo día.

En el momento de hacer el registro y el pago, se debe indicar el código promocional BLACKFRIDAY2018, especificando en el campo observaciones cuándo se quiere iniciar el curso. Así Securízame preparará el material para la fecha que el alumno haya seleccionado, que puede ser hoy, mañana, en dos semanas, algunos meses o incluso en 2019. ¡Así no se pierde la oportunidad de aprovechar este descuento especial!

Si se busca una excelente formación online en hacking ético, análisis forense, Python o securización de sistemas operativos e infraestructuras, es el momento de aprovechar el Black Friday con Securízame.

Para más información u orientación sobre los cursos, se puede contactar con Securízame a través de su página web (https://www.securizame.com/contacto/), o bien en el mail contacto@securizame.com

A %d blogueros les gusta esto: