4.1. Introducción a explotación de servidores y hosts
4.1.1. Vulnerabilidades vs Exploits
La sección de Escaneo de Vulnerabilidades (Vuln Scanning) del bloque de escaneo de redes y servicios ha servido de introducción al concepto de vulnerabilidad informática. Las vulnerabilidades sugieren un conjunto de debilidades en el sistema de seguridad de una red informática que pueden ser aprovechados por diferentes tipos de ataques informáticos con diferentes fines. En términos generales, la vulnerabilidad en un servicio de red está relacionada con una mala ejecución del código del software, sea del tipo que sea, derivado probablemente de un fallo en la programación (bug en argot informática). Se llama Exploit al paquete de datos, software o técnica que se aprovecha de esta vulnerabilidad produciendo así un error no deseado y generando así una amenaza o brecha de seguridad que podría afectar tanto al servidor como al dispositivo cliente en un servicio de red.
Teniendo en cuenta que en la red informática operan los sistemas de hardware, software y usuarios, el vector de ataque puede realizarse a través de diferentes medios, lo que viene a representar diferentes formas de explotación. En esta sección se va a tratar de forma específica la explotación (o Exploits) del tipo RCE o Remote Code Execution (Ejecución remota de código). Estos son los exploits más populares y permiten ejecutar código arbitrario en el sistema de destino sin tener acceso previo y explotar la vulnerabilidad, normalmente producida por un bug en el software de un servicio de red que opera en un puerto. En la mayoría de manuales, se suele empezar con estos Exploits y alguna herramienta modular como Metasploit que permita manejarlos pues es la mejor manera de introducirse en esta temática. Además, suele ser el siguiente paso a probar una vez escaneados los servicios y puertos de una red.
El tipo de bug más habitual en un software de servicio de red para llevar una explotación por RCE es el de desbordamiento de búfer (en inglés buffer overflow). Resumiendo mucho, este bug se produce cuando el software de servicio no controla bien la cantidad de datos que deben copiarse a una zona de búffer. Un búffer es un espacio de memoria del dispositivo en el que se almacenan datos de forma temporal. Existen diferentes formas de detectar esta vulnerabilidad, principalmente mediante operaciones de ingeniería inversa y la técnica de fuzzing, que consiste en enviar paquetes de datos aleatorios a un software de servicio. Comprender el funcionamiento del desbordamiento de búfer y otras vulnerabilidades similares (format string, integer overflow, etc.) y lograr crear un código desde cero (Exploit) que consiga generar la brecha de seguridad, queda más allá del objetivo de este capítulo pero se retomará en el próximo tema (se requiere nociones de computación, debugging, compilación, programación, etc.).
A continuación un cuadro que detalla la relación con algunos ejemplos entre tipo de bug, una vulnerabilidad asociada y el tipo de amenaza que puede representar:
Este tipo de Exploits constituyen una fuente de negocio y son un filón para todo tipo de organizaciones gubernamentales o criminales que logran el suficiente grado de investigación para dar con una vulnerabilidad en algún servicio de red común, tarea que no resulta nada sencilla y que actualmente requiere invertir muchos recursos. El infame Exploit MS17-10 EternalBlue SMB Remote fue desarrollado supuestamente por la agencia estatal NSA de los Estados Unidos y durante tiempo ocultado su conocimiento al público general.
En todo caso, normalmente el Exploit es producido de forma específica para un software de servicio de red y deben tenerse en cuenta estos 4 factores como mínimo: arquitectura de la computadora, software de sistema operativo, protocolo de servicio de red y marca del software y la versión. Es decir, un Exploit para un determinado tipo de marca de servicio en Windows no va funcionar en un Linux (lo habitual).
La corrección de un bug en el software de produce mediante la liberación de nuevas versiones de este. También es común que algunas organizaciones consigan desarrollar Exploits para vulnerabilidades en un software específico no conocidas públicamente y que pueden suponer una brecha de seguridad a nivel internacional una vez empiezan a utilizarse y para los cuales los desarrolladores de software deben afanarse en desarrollar las medidas de seguridad. A este tipo de Exploits se les denomina Exploit Zero Day y su distribución suele estar relacionado con organizaciones criminales o estatales que persiguen fines de lucro o efectuar acciones de espionaje contra diferentes sujetos. En todo caso, la mayoría de grandes empresas tecnológicas como Google, Amazon así como empresas dedicadas exclusivamente al sector, tienen departamentos de gran envergadura que destinan sus esfuerzos a anticipar el reconocimiento de vulnerabilidades para informar a los productores de software. Como ya se ha indicado en apartados anteriores, las vulnerabilidades son registradas a nivel internacional (sistema CVE). Del mismo modo, existen bases de datos de Exploits que se verán en siguientes puntos como es Exploit-Database (https://www.exploit-db.com/).
4.1.2. Payload vs Shell y Postexplotación
La brecha de seguridad que supone una vulnerabilidad puede ser aprovechada por el atacante para ejecutar una secuencia de software en la máquina vulnerable, normalmente con fines malintencionados, siendo el Exploit el componente vehicular que permite ejecutar dicho software. Este software malintencionado (que no es el Exploit) puede ser un virus, un troyano o simplemente algún tipo de instrucción orientada a un determinado fin que signifique el mal funcionamiento de la máquina u otro tipo de acciones (recopilar información, crear un nuevo usuario, robo de datos, bloqueo del servidor, etc.). A este código malicioso se le denomina payload o carga útil.
Una de las formas de payload más común es aquel que proporciona una interfaz de línea de comandos del host o dispositivo vulnerable de forma remota, con el fin de obtener el control de la máquina y realizar acciones posteriores. En la siguiente imagen se muestra la obtención de una consola de línea de comandos para hacerse con el control de un servidor vulnerable, después de combinar un Exploit conocido y un payload cuya función es obtener dicha consola. En este caso el host afectado es un servidor Linux cuyo servicio de Java RMI es vulnerable.
Se suele llamar shell (y por ende al payload) a la consola de línea de comandos obtenida de forma remota tal y como se muestra en la imagen anterior. También es habitual usar el término shellcode, aunque en este caso es más correcto referirse con este nombre al conjunto de instrucciones en hexadecimal del payload y que está en el código del Exploit, normalmente en lenguaje C. Posteriormente, el código del payload (shellcode) se ejecuta en un sistema de memoria denominado pila de ejecución del software vulnerable por la acción del Exploit. Aunque ciertamente muchas veces el propósito de la shellcode sea precisamente obtener la shell y de ahí la confusión de términos. Se verá en detalle este proceso en el siguiente bloque de ingeniería de software y creación de malware.
Así como un Exploit está diseñado para una determinada vulnerabilidad, teniendo en cuenta la arquitectura de computadora de la máquina, el sistema operativo y tipo de servicio de red, los payloads también son codificados ateniendo a los anteriores factores. Describiéndolo en términos vagos, como es de suponer el Exploit y el payload se combinan para llevar a cabo la tarea de alterar el funcionamiento de ejecución del software del servicio y que este ejecute el código del payload, ya sea para obtener una shell u otro objetivo. Además, un Exploit puede combinarse con más de un payload así como un payload específico funcionar con diferentes Exploits como se verá en la práctica.
Existen diferentes tipos de payloads ateniendo a sus características y pensando en el escenario en el que deben actuar. Por ejemplo existen cuestiones tales como el tamaño en bytes que debe ocupar el payload en el código de programación del Exploit y que tienen que ver con los sistemas de detección de la máquina vulnerable. En los casos en los que el payload está diseñado para obtener una shell, el código del payload en el Exploit puede incluir una única instrucción para que la máquina vulnerable realice una petición de descarga de la shell en un servidor remoto (el del atacante o depende de la infraestructura del ataque) y que esta shell sea ejecutada en una 2ª etapa en la pila.
A este tipo de payloads se les denomina staged pues están compuestos de dos partes (stager que sería la conexión y stage que sería la shell en sí), además también serían del tipo reverse (inverso) pues la máquina vulnerable realiza una conexión remota para descargar la shell. Esto puede generar problemas de privacidad en la incursión, aunque existen formas de ocultar la identidad en estos casos con las herramientas y una infraestructura adecuada (se verá en otro bloque). En otras ocasiones el payload solo debe realizar una tarea concreta, en esta ocasión se denominan singles. Toda esta información será ampliada después de realizar las prácticas correspondientes y ver cómo operan realmente los payloads. El siguiente diagrama resume de forma muy simplificada el funcionamiento de un payload con función reversa del tipo staged para obtener una shell:
Uno de los módulos de Metasploit Framework es el de los payloads, permitiendo usar diferentes tipos en combinación con Exploits y adaptados a diferentes circunstancias en función de la máquina vulnerable (arquitectura CPU, sistema operativo, servicio de red empleado…). La especialidad de los payloads de Metasploit son las shells, aunque de entre todas las opciones disponibles destaca el payload propio meterpreter. Meterpreter proporciona una shell interactiva desde el cual un atacante puede explorar la máquina de destino y ejecutar código remoto para todo tipo de tareas de postexplotación.
Las tareas de postexplotación incluyen un rango importante de acciones en el servidor vulnerable para concluir de forma determinante la explotación de una red informática, en función del objetivo propuesto. Entre las tareas de postexplotación estarían el escalado de privilegios de usuario del proceso de ejecución de la shell, el reconocimiento y explotación de la red a la que pertenece el host explotado con el fin de obtener información de los equipos del sistema y extender el proceso de explotación a estos, generar una puerta trasera o persistencia para retomar el proceso de explotación si es necesario, la limpieza de cualquier rastro generado por la incursión y también todos aquellos que determinen el objetivo del ataque: hacerse con información y ficheros, alterar los registros del sistema, descargar malware al equipo explotado, etc.
A través de una shell es la forma habitual de implementar las técnicas de postexplotación. También cabe destacar que existe un conjunto de Exploits dedicados a estas tareas y que son específicos para vulnerabilidades conocidas en los Sistemas Operativos más habituales como son Android, Windows o Linux y que tienen que ver con el sistema de implementación de usuarios, la gestión de recursos de la memoria de estos SO o el formato de ejecución de procesos del sistema, entre otros. También son denominados exploits locales. Metasploit también tiene un módulo de postexplotación que permite seleccionar un rango de exploits locales para ejecutar a través de una shell o meterpreter y realizar las tareas típicas de postexplotación.
Volviendo a los payloads, otra de las características de Metasploit es la capacidad para generar payloads del tipo shell (incluido meterpreter) en diferentes formatos de fichero y extensión, que pueden ser ejecutados de forma directa en una máquina y para diferentes sistemas operativos y servicios. Sin entrar en detalles todavía, cuando estos payloads son ejecutados en un servidor por algún proceso o por la interacción de un usuario, este servidor realiza una conexión remota hacia un servidor de la infraestructura del atacante para que así el atacante obtenga una shell, similar a como funciona el proceso de un payload staged (ver arriba) pero sin la intervención de un Exploit.
Msfvenom es la extensión de Metasploit que permite generar este tipo de payloads, y se utiliza a través de la consola de línea de comandos. En este bloque se va a enseñar el manejo de Msfvenom aunque se volverá a ver en otras secciones pues su uso suele estar relacionado con la implementación de malware a través de diferentes formas de explotación en la que también intervienen técnicas de ingeniería social, spoofing, ataques del lado del cliente o a páginas web, etc. Aunque el payload generado por Msfvenom tiene como objetivo casi siempre obtener una shell, es habitual aunque no del todo preciso describirlo como un troyano, aunque más bien estaría en la categoría de malware.
4.1.3. Pentesting y Metasploit vs Ingeniería de software inversa
A lo largo de este bloque se va a aprender a manejar principalmente Metasploit Framework, que es la herramienta para aprendizaje de pentesting más conocida, así como otras herramientas similares cuyo objetivo es familiarizarse con el uso de Exploits ya conocidos y generar diferentes formas de payloads y otro tipo de malware.
Con la información del bloque de Information Gathering and Scanning y las nociones de los puntos anteriores debería ser suficiente para aprender a realizar técnicas de pentesting con el fin de hallar vulnerabilidades en una red informática y realizar un proceso de explotación de un sistema con las herramientas que se van a describir. Este proceso debe acomodar otras técnicas como son las de evasión de sistemas de detección de intrusiones y antivirus o los métodos de ocultación de identidad. Además también es importante poder realizar prácticas en Internet (WAN), requiriendo de una configuración adicional. No obstante es preferible asimilar paulatinamente estas técnicas que serán introducidas en este bloque y serán ampliadas en otros. También hay que mencionar el uso preferiblemente de un laboratorio a través la virtualización de sistemas operativos o las diferentes versiones de Metasploitable.
La mayoría de manuales y cursos de aprendizaje para realizar pruebas de penetración en un sistema informático (pentesting) no abarcan los conceptos técnicos explicativos de una vulnerabilidad y como crear un Exploit específico. Esto se considera un tema más de Ingeniería Inversa en la que ya se requieren conocimiento avanzados en temas informáticos como es programación, compilación, arquitectura de ejecución de software en una CPU y sus sistemas de almacenamiento de información, etc.
En esta fase de aprendizaje se debe suspender temporalmente la referencia a conceptos técnicos demasiado complejos que forman parte de la Ingeniería de Software y computación (stack, pila, debugging, buffer, lenguaje ensamblador, etc.) con la promesa que el siguiente bloque se dará cuenta de ello aun siendo una mera introducción al tema. Del mismo modo hay que tener en cuenta que solo Metasploit tiene integrado más de 1000 exploits para diferentes vulnerabilidades y es imposible detenerse en la explicación de cada una de ellas, aunque para ello existe suficiente material bibliográfico en Internet para quien quiera profundizar.