Fase de explotación de vulnerabilidades (Exploitation)
La fase de explotación de vulnerabilidades se realiza después de realizar la fase de escaneo.
Tras la identificación de vulnerabilidades en los servicios localizados en las fases anteriores, el siguiente paso es explotarlas con el objetivo de mostrar el riesgo real de la vulnerabilidad en base a la confidencialidad, integridad y disponibilidad de la información.
Para ello se utilizarán herramientas específicas de explotación que se aprovecharán de ciertos vectores de ataque para realizar el compromiso inicial en un sistema remoto.
El siguiente gráfico muestra la cadena de explotación en la que trabajaremos para conseguir el compromiso de un sistema remoto.
Vectores de ataque
Aunque el vector más común de ataque consiste en la explotación de una vulnerabilidad, no es el único vector que nos puede dar acceso a un equipo remoto. A continuación, realizamos una enumeración de los más importantes:
- Explotación de una vulnerabilidad conocida: Es el vector de ataque más común utilizado para la explotación. En este caso, los atacantes tras realizar una fase de enumeración y de escaneo completa, localizan la presencia de algún sistema que se encuentre afectado por una vulnerabilidad conocida. De esta manera se hace uso de un exploit específico, junto con un payload, para la vulnerabilidad concreta que nos permitiría ejecutar órdenes no autorizadas en el sistema remoto.
- Ejecución de un programa malintencionado (Malware): También conocido como malware consiste en generar un payload o shellcode en un formato ejecutable o camuflado dentro de un programa legítimo. Este programa se puede distribuir de distintas maneras a las víctimas, pero siempre está condicionado a un factor de ingeniería social para que la víctima ejecute el malware. Por ejemplo, esconder el payload en una macro de Excel y enviar un correo masivo a los empleados de una compañía engañándolos para que crean que en el Excel está la relación de subidas salariales.
- Contraseñas por defecto o poco robustas: Este es un vector de acceso muy común debido a que cierto software y dispositivos de red se despliegan con una contraseña por defecto establecida por el fabricante. Si esta contraseña no se modifica, puede ser utilizada por un atacante para ingresar en el sistema. Por otro lado, el establecimiento de contraseñas catalogadas como inseguras, o muy fáciles de adivinar, también entrarían dentro de esta categoría. Además, un atacante podría utilizar técnicas de fuerza bruta junto con un diccionario de posibles contraseñas para conseguir las credenciales de acceso.
- Ejecución remota de comandos: Esta vulnerabilidad puede encontrarse cuando se auditan aplicaciones web, móviles, APIS, etc. Y se descubre que abusando de una determinada funcionalidad legítima se puede llegar a ejecutar comandos en el servidor remoto.
Concepto de Exploit
Un exploit es un software, pequeña aplicación o script que permite aprovecharse de un defecto de seguridad (Configuración incorrecta en el sistema, contraseñas débiles o por defecto) o explotar un fallo en el sistema (Fallo en el software, sistema o dispositivo afectado que pueda dar lugar a un problema de seguridad).
La ejecución satisfactoria de un exploit puede generar una serie de riesgos de seguridad:
- Denegación o degradación del servicio
- Corrupción de información
- Corrupción de la configuración del sistema o servicio
- Acceso no autorizado
- Escalada de privilegios
A modo general un exploit pueden catalogarse según los distintos grupos:
Explotables de manera remota
La explotación se hace sobre un sistema remoto al que no se tiene acceso de manera previa.
- Explotables en el lado del servidor (Server-side): Son aquellos exploits que tienen por objetivo comprometer un servicio que se ejecuta en modo servidor
- Explotables en el lado del cliente (Client-side): Los exploits de esta categoría afectan al software y programas que se ejecutan en el lado del cliente (programas ofimáticos, navegadores web, clientes de correo).
Necesitamos disponer de privilegios de acceso en el sistema afectado
- Exploits de escalada de privilegios: Son exploits que se ejecutan de manera local con el objetivo de conseguir un mayor nivel de acceso en el sistema.
- Exploit: Es el código encargado de explotar la vulnerabilidad mediante la ejecución de instrucciones en la víctima afectada por la vulnerabilidad.
- Payload: Es el código o set de instrucciones que se ejecutan una vez explotada la vulnerabilidad y permite ejecutar código no autorizado en el cliente, como por ejemplo la ejecución de una shellcode.
Una vez completada la fase de escaneo de vulnerabilidades disponemos de una serie de posibles vulnerabilidades en los sistemas objetivo. En esta fase de explotación se ha de buscar si existe un exploit público, o en su defecto una Prueba de concepto, para la vulnerabilidad concreta que queremos explotar. Para ello se puede hacer uso de las siguientes herramientas.
- exploit-db
- Github
Aunque GitHub se utiliza como repositorio de código fuente, normalmente también podemos localizar pruebas de concepto de vulnerabilidades, e incluso exploits totalmente funcionales.
- searchsploit
Es una herramienta disponible para sistemas Linux. Realiza búsquedas de exploits disponibles en una copia local de la Base de Datos mantenida por exploit-db. Además, también te indica dónde se encuentra la copia local del exploit para poder modificarlo y utilizarlo para comprometer el equipo remoto.
- Metasploit:
Concepto de payload
Un payload es la porción de código o instrucciones que se ejecuta inmediatamente después del exploit y que obliga a la víctima a realizar una serie de operaciones. Atendiendo a cómo se transmita este payload a la víctima podemos agrupar los payloads en dos categorías:
- Non-staged: Se denominan payloads autocontenidos, normalmente se corresponden con la ejecución de un comando muy específico en la víctima para añadir un usuario en el sistema remoto, añadir un usuario a un grupo privilegiado, establecer una conexión secundaria entre víctima y auditor.
- Staged: En este caso el payload se transmite en varias partes con la finalidad de evitar posibles bloqueos que pudieran realizarse debido a los dispositivos de seguridad existentes en la red. La primera parte que se inyecta en la víctima corresponde a una pequeña porción de código que es ejecutado y espera al envío de la segunda parte del payload. La segunda parte del payload se corresponde con un payload más avanzado como pudiera ser una shellcode avanzada, un servidor de VNC para controlar el sistema remoto, etc.
Shellcode
Una shellcode es un tipo especial de payload que normalmente inicia una Shell de comandos, más o menos avanzada, a través de la cual el auditor puede controlar la máquina comprometida.
Las shellcodes son un tipo determinado de payload (Es decir, existen payloads que no son shellcodes). Dependiendo de la posición del auditor en el sistema objetivo podemos agruparlas en las siguientes categorías:
- Local: Se utilizan cuando el auditor dispone de acceso a un equipo pero con un acceso limitado y utiliza una vulnerabilidad concreta para ejecutar una shellcode específica que le pudiera proporcionar una escalada de privilegios y obtener un mayor nivel de acceso en el sistema local.
- Remota: Este tipo de shellcode se utilizan cuando un atacante no dispone de acceso previo al equipo remoto y al ejecutarse la shellcode se establece un canal de comunicación remoto entre el auditor y la víctima.
- Bind: Cuando este tipo de shellcodes son ejecutadas en la víctima se inicia un servidor de conexión abriendo un puerto en el equipo comprometido. En este tipo de shellcodes el atacante establece la conexión con el puerto que se ha levantado en la víctima. Sólo son funcionales si nos encontramos en la misma red local que la víctima y no existe ningún firewall que impida la comunicación con el puerto recién levantado en la víctima.
- Reverse: En este tipo de shellcodes no se inicia ningún servicio en la máquina víctima. Al contrario, es el auditor el que levanta un servidor a la escucha en un puerto determinado y el shellcode en la víctima inicia la conexión en el equipo del auditor y en el puerto apropiado. Dado que en este tipo de shellcode es la víctima quien inicia la conexión en caso de existir algún tipo de dispositivo firewall la conexión no se vería afectada.
- Abrir conexiones de red.
- Transferir archivos entre dos equipos.
- Realizar escaneos de puertos.
- Establecer shells en un equipo remoto.
- Redirigir conexiones.
- Abrir puertas traseras.
- En la versión ncat, permite cifrar la conexión.
- Abrir un puerto para recibir una conexión
- -n: para que no se realicen búsquedas DNS, su uso no es imprescindible.
- -1: indica que se abra un listener.
- -v: modo verbose para que muestre más información, tampoco es necesario.
- -p: para indicar el puerto en el que escuchará el listener.
- Apertura de shells con netcat
- -e: indica el programa que se ejecutará al iniciar la conexión.