domingo, noviembre 26, 2017

Killing Bots: How to hack your company using your Telegram Bot #Telegram

Hoy en día se han puesto de moda los bots en Telegram, y es verdad que puede que nos faciliten algunas tareas. Tenemos bots para consultar los horarios del Tram, para obtener la previsión meteorológica, para consultar el precio de cualquier producto en Amazon, ejecutar un ping, convertir archivos multimedia, analizar URLS maliciosas con servicios como Virus Total, administrar servidores, crear y controlar una botnet y casi cualquier cosa que nos podamos imaginar se puede encontrar por Github o en la tienda de bots StoreBot.

Figura 1:  Killing Bots: How to hack your company using your Telegram Bot

Está claro, que estos bots son muy útiles, y en ocasiones divertidos y entretenidos, ya que incluso existen algunos con los que podemos jugar en los chats grupales con nuestros amigos, entre otras cosas.


Figura 2: Ejecutar un nmap remotamete vía un bot de Telegram


Cualquier usuario puede crear y/o programar un bot. Para los que no son desarrolladores, existen varias aplicaciones web para hacerlo de forma gráfica e intuitiva sin necesidad de programar, como puede ser ‘Manybot’, aunque esta opción obviamente tiene sus limitaciones.

Figura 3: Manybot

Para los que están dispuestos a quemar sus dedos y volverse locos a base de escribir código, hay una infinidad de posibilidades, pero esto puede traer de la mano algunos problemas en cuanto a la escritura de código seguro. Sobre todo, porque muchas de estas personas despliegan los bots en sus propios ordenadores de forma local, o peor aún, empresas que los utilizan para dar soporte a sus clientes, estando estos alojados en sus propios servidores.

¿Problemas?

Sí. Hay algunos bots que para realizar sus funciones deben ejecutar comandos en el sistema en el cual están corriendo, por ejemplo, como uno de los que hemos citado anteriormente. Un bot para hacer ping debe ejecutar el comando en el servidor a partir de los parámetros que envíe el usuario que lo utilice.

Si este bot está mal programado, es decir, con una exclusiva visión de funcionalidad dejando de lado la seguridad y las buenas prácticas, cosa por desgracia muy habitual, puede ser perfectamente un vector de entrada para poder tomar el control completo del sistema en el que corre (Command Injection).

En el caso que queremos mostraros hoy, vamos a crear un escenario (entorno controlado) como el que acabamos de describir. Desgraciadamente, es un escenario perfectamente posible en un entorno real.

Caso hipotético:

A un administrador de sistemas que hace labores de todo tipo como informático en una pequeña empresa, se le encarga el desarrollo de un bot para Telegram, que servirá para dar soporte a los clientes de dicha empresa. Entre las diversas funcionalidades que se requieren, hay una que permite que los usuarios ejecuten un ping a cualquier dominio. Este sysadmin, decide programarlo en Python y hostearlo en el servidor de la propia empresa. El programa ejecutará el comando ‘ping’ a partir de los parámetros que le lleguen desde el bot. Esto es un ejemplo, puede ser cualquier otro lenguaje de programación y otra funcionalidad que ejecute algún comando a través de los parámetros enviados por el usuario.

Figura 4;: Bot ejecuta comando /ping google.es

Este administrador de sistemas, sabe lo justo de programación y no se ha leído los libros de Hacking Web Technologies ni el de Hacking Web: SQL Injection, por lo que no ha sanitizado correctamente la entrada de parámetros. Ha tenido un fallo a la hora de programar dicha funcionalidad y no ha controlado correctamente que los parámetros que recibe no sean maliciosos o malignos.

Figura 5: Fragmento de código vulnerable en desarrollo Python del bot

Para que lo descrito anteriormente sea posible, se debe ejecutar un comando en el sistema, por lo tanto, vamos a probar concatenando otro comando a continuación para comprobar si es vulnerable a Command Injection, de esta forma:

Figura 6: Inyección de un comando ls -l

Como vemos, al concatenar el comando, el mismo se ha ejecutado sin ningún problema. Y mejor, el resultado se nos muestra en pantalla perfectamente.

Recolección de información y explotación

El usuario sobre el que corre el bot no tiene privilegios, pero podemos recopilar bastante información y ejecutar diferentes comandos. Aunque tampoco nos vamos a conformar simplemente con esto, ya que estamos aquí.

Figura 7: Inyección de un comando uname -a

Concatenando el comando ‘uname –a’, vemos que corre sobre un ‘Ubuntu 14.04’ con el Kernel4.4.0-31-generic’. Con buscar un poco en Google , podremos comprobar, que es vulnerable a diferentes técnicas de escalación de privilegios.  Como sabéis, esto se puede hacer también con un herramienta escrita en Python llamada AutoLocalPriviligeEscalation que permite saber qué exploits son válidos para cada versión del kernel de Linux sin fortificar.

Figura 8: Podríamos inyectar la ejecución de auto_searchsploit si lo clonamos antes de su GitHub

Para tener un mayor control sobre el sistema que estamos tratando de comprometer, en vez de inyectar los comandos de elevación de privilegios a través de el bot, vamos a intentar obtener una shell en el mismo. Para ello, se nos ocurrió utilizar Netcat.

Obtención de una shell remota a través del Bot de Telegram

En nuestra máquina Kali Linux, vamos a poner netcat a la escucha de una conexión, para conectarnos desde la víctima. Con esto conseguiríamos una shell reversa, ya que la conexión sería establecida por parte del sistema vulnerado usando como vector de ataque al bot.

Figura 9: Netcat escuchando en el puerto 4444 en la máquina Kali Linux del atacante

A continuación, desde el bot, vamos a ejecutar el comando que se conectará al atacante. Pudimos comprobar que dicho comando NO requiere de privilegios.

Figura 10: Inyección de comando netcat. Si nc no está en el servidor habría que descargarlo.

También debemos redirigir STDIN y STDERR a /dev/null y añadir ‘&’ al final para que corra en segundo plano y no deje en pausa la ejecución del bot. Tras esto, podemos observar, que se ha establecido una conexión por parte de la máquina víctima.

Figura 11: Shell obtenida en la máquina Kali Linux del atacante

Una vez hemos obtenido la shell, podemos comenzar a ejecutar comandos. Como podéis ver, hemos conseguido a través de un bot vulnerable de Telegram, acceder a un sistema y obtener una shell en el mismo. Pero al estar corriendo sobre un usuario sin privilegios, tenemos grandes limitaciones.

Figura 12: Ejecución de comandos en el sistema. Aún no privilegiado

Para ello, debemos encontrar la manera de conseguir una escalación de privilegios. Como vimos anteriormente con el ‘uname –a’ podemos ver detalles del sistema como la versión del sistema operativo, versión del kernel, entre otras cosas.

Escalación de privilegios final con DirtyCow

Para escalar privilegios, podemos buscar información sobre vulnerabilidades conocidas para la versión específica del sistema que estamos atacando en este caso, un Ubuntu 14.04 usando la herramienta AutoLocalPriviligeEscalation. Con ell nos encontramos con que nuestra víctima corre una de las versiones vulnerables a ‘Dirty COW’, uno de los últimos exploits de escalación de privilegios para el kernel de Linux. Este exploit aprovecha una vulnerabilidad en el manejo de la memoria, causando un problema de condición de carrera, permitiendo así que podamos escribir en zonas de memoria, que en teoría deben ser de sólo lectura.


Figura 13: Ejemplo de explotación de DirtyCow


Descargamos el exploit desde un repositorio de Github en la máquina atacante. En nuestro caso metemos el zip en un servidor web Apache que hemos levantado. En un entorno real, un atacante podría utilizar un servidor propio, en el que almacenaría todo el malware que va a utilizar para comprometer un sistema determinado.

Figura 14: Publicación de exploit dirtycow en servidor Apache del atacante

Desde netcat, descargamos con ‘wget’ el zip en la máquina víctima y lo movemos a la carpeta /tmp, para que no esté a la vista y así evitar que la víctima pueda verlo. La shell que nos da netcat tiene sus limitaciones. Por ejemplo, no se puede hacer un ‘ssh’ o un ‘su’, también se presentan dificultades a la hora de tratar de editar archivos y no muestra los STDERR. Por lo tanto, también tendremos problemas a la hora de obtener la shell con root, tras explotarlo. Por supuesto, pasar un dirtycow.zip por la red podría hacer saltar los controles de seguridad e IDS, así que el zip mejor pásalo con password u ofuscado de alguna otra forma en un proyecto de Ethical Hacking real.

Ahora tendríamos que descomprimirlo, compilarlo y ejecutarlo, pero como acabamos de comentar, desde la terminal de netcat no es posible alguna de esas tareas. Primero tenemos que ‘upgradear’ la shell para obtener una terminal más completa en la que poder manejarnos mejor. Tenemos diversas posibilidades para esto, pero una muy sencilla es ejecutar una línea en Python que nos saque una pseudoterminal (pty). Haciendo uso de la librería pty, simplemente tenemos que llamar al método .spawn y añadir ‘bin/bash’ para obtener la shell.

Figura 15: Upgradeando la shell

Ya podemos observar el prompt en nuestra consola. Hay más formas de hacer esto, cabe la posibilidad de que, a diferencia de en este escenario, la víctima no tenga instalado Python, por tanto, deberíamos recurrir a otros métodos.

Figura 16: Extrayendo el contenido del exploit
Ahora hay que explotar el sistema para conseguir la escalación de privilegios que tanto anhelamos y así podernos hacer con el control del mismo. Extraemos el zip previamente descargado y movido a /tmp en la máquina víctima con ‘unzip’ como se ve en la imagen superior, y luego compilarlo, como se ve en la imagen siguiente.

Figura 17: Compilando DirtyCow

Y finalmente ejecutarlo con la opción ‘-s’ para un proceso más rápido y automático porque el exploit podría dejar bloqueado el sistema. Se puede observar, que hemos obtenido privilegios de superusuario, lo que quiere decir que poseemos control absoluto del sistema.

Figura 18: Ejecución de DirtyCow

Podríamos ir dejando backdoors para poder acceder de nuevo en próximas ocasiones, pero esto ya entraría en la fase de post-explotación de un proyecto de Ethical Hacking y nosotros solamente pretendemos mostrar lo que podría llegar a ocurrir simplemente porque a un programador se le olvide (o no tenga en cuenta) la seguridad desde el diseño. El resto de posibilidades, ya queda a la imaginación de cada lector.

Notas Finales sobre la seguridad de los bots de Telegram

En Github podemos encontrar una gran cantidad de bots o módulos hechos por la comunidad, los cuales ofrecen distintas funcionalidades. Aquí hay que tener especial cuidado ya que muchos de ellos son potencialmente vulnerables, y si lo descargamos y usamos alegremente, pueden acarrear problemas como los descritos anteriormente.

Ahora imaginemos en nuestro supuesto caso, que este es el servidor central de la pequeña empresa, y en él, están almacenadas las bases de datos, documentos e información confidencial de la misma. Podríamos robar dicha información, incluso hacer un DoS en los servicios que corre, por no hablar de técnicas de ‘pivoting’ y comprometer otros equipos de la red en caso de que el servidor no se encuentre en una DMZ con unos sistemas de seguridad acorde a las necesidades.

Algunas pocas recomendaciones podrían ser:
• Controlar el tamaño de los parámetros que se pasan a través del bot. Dado que solamente es un dominio debe ser máximo uno. 
• Controlar que los comandos se ejecuten solamente por los admins o personal autorizado. En Telegram cada usuario tiene un ID único, que puede usarse para evitar que otros usuarios ejecuten el mismo. 
• Usar una expresión regular para verificar y comprobar, que el parámetro efectivamente es un dominio y no otra cosa. 
• Usar funciones propias del lenguaje en el que se haya implementado el bot para mejorar la seguridad. En Python se puede usar shlex.quote(s). 
Figura 19: JSON con las peticiones del bot
• También se nos ocurre, que si sospechas que alguien está intentando hacerte un command injection, puedes apagar el bot y revisar las últimas peticiones realizadas a través del servidor de telegram, que se guardan durante 24 horas. Para ello puede ir al navegador y escribir: https://api.telegram.org/bot[token]/getUpdates donde se debe reemplazar el token del bot en [token] y si nos fijamos recibiremos un JSON con las peticiones pendientes y datos adicionales del posible atacante.
Conclusiones de este trabajo

Es conveniente reflexionar sobre las buenas prácticas y la visión de seguridad a la hora de diseñar e implementar un software, no prestando atención exclusivamente a la parte funcional. Es un matiz que hay que tener en cuenta desde el diseño. En muchos centros de enseñanza donde se aprende a programar esto apenas se tiene en cuenta o se deja en segundo plano, trayendo de la mano una gran inconsciencia por parte de los desarrolladores a la hora de crear sus aplicaciones. Finalmente, os dejamos una PoC en vídeo de todo este proceso de explotación:

Figura 20: Killing Bots: How to hack your company using your Telegram Bot

Autores: Adrián Fernández (@adrianfa5) y Mauricio Trujillo (@fm_trujillo) Estudiantes de Seguridad Informática y coorganizadores de @bitupalicante

No hay comentarios:

Publicar un comentario