Muy buenas a todos!

Esta semana vuelvo con un viejo nuevo proyecto llamado PowerGram. En esta ocasión, se trata de un pequeño bot para Telegram escrito en PowerShell, que puede ejecutarse tanto en Windows como en Linux (o incluso en Mac OS). Con un funcionamiento totalmente trivial, nos permitirá realizar tareas sencillas como subir y descargar ficheros, ejecutar comandos y algunas cosas más.


Antes de comenzar con el artículo; sí, ya sé que dije que no traería nuevos proyectos en la entrada anterior. Pero nadie dijo nada de los viejos, no? 😜

Hace ya mucho tiempo que utilizo Telegram como herramienta de trabajo. Más allá de lo personal, existen muchísimos grupos relacionados con el hacking ético, tal y como mencionaba hackplayers hace ya unos añitos.

Además de la gran cantidad de recursos disponibles en Telegram y de las maravillosas comunidades que podemos encontrar, podemos hacer uso de esta aplicación de mensajería para muchas otras cosas. En nuestro caso particular, hoy hablaremos de los bots.

Existen muchas formas de crear un bot en Telegram, así como muchos proyectos que nos permiten utilizar fragmentos de código para cumplir nuestro propósito, o incluso, muchos bots creados y listos para funcionar en casi cualquier lenguaje: PHP, Python, Go..

Entonces, por qué crear uno más? 🤔

Bueno.. en primer lugar, como ya he comentado al principio del artículo, hace ya algunos años que escribí (en parte) esta herramienta. Como de costumbre, quería hacer las cosas por mí mismo, aprovechando los pocos proyectos escritos en PowerShell que hay al respecto.

Curiosamente, a día de hoy, todavía continúa siendo así. Básicamente, existen dos proyectos dignos de mención, a los que recomiendo encarecidamente echarles un vistazo.

En primer lugar, tenemos a PoshGram. Este proyecto dispone de diferentes cmdlets para PowerShell que nos permitirán realizar todo tipo de funciones, como enviar mensajes o documentos de una forma muy sencilla. Se trata del complemento ideal para montar nuestro propio bot desde cero o añadir estas funciones a otros proyectos escritos en PowerShell.

Por el contrario, si lo que buscamos es un bot listo para funcionar (o como dicen los ingleses, out of the box), nuestra elección será PSBoTelegram de Luís, a.k.a Cybervaca. En este caso, no solo se trata de un simple bot. Hablamos de un completo Command & Control que nos permitirá cargar scripts de PowerShell, ejecutar un keylogger, tomar capturas de pantalla y mucho más.

Como podéis ver, a pesar del denominador común en ambos proyectos, cada uno tiene una visión totalmente diferente y nos aporta diferentes sabores para que utilicemos lo que mejor nos convenga según la ocasión.

Ahora bien, imaginemos por un momento que necesitamos usar un bot (por el motivo que sea). Para empezar, no queremos programar desde cero, ni queremos demasiadas funciones. Además, buscamos algo ligero, que funcione en cualquier sistema operativo y que esté listo para funcionar.

Pues ahí es donde entra PowerGram. En su momento, se trataba de algo todavía más sencillo que lo que veréis a continuación. Pero con un poco de tiempo y paciencia, he añadido y arreglado algunas cosas, que lo convierten en un compañero ideal para nuestras necesidades.

A continuación, os dejo el enlace del proyecto en GitHub: https://github.com/JoelGMSec/PowerGram

Antes de comenzar, es imprescindible disponer de una cuenta de Telegram y crear un bot en la plataforma a través de @BotFather. Ya que existen muchos artículos y guías al respecto, no será necesario explicarlo una vez más en este post.

Ahora que ya conocemos la teoría, pasemos a la parte práctica 😋

En primer lugar, os explicaré el funcionamiento del bot en Linux y seguidamente en Windows. Como de costumbre, clonaremos el proyecto con el siguiente comando:

git clone https://github.com/JoelGMSec/PowerGram
cd PowerGram ; pwsh PowerGram.ps1 -h

Una vez descargado, consultaremos la ayuda para ver que nos ofrece la herramienta, utilizando el parámetro -h tal y como podemos ver a continuación:

Si es la primera vez que utilizas PowerShell en Linux, tendrás que instalarlo tal y como se indica en la documentación de Microsoft.

Seguidamente, utilizaremos cualquier editor de texto y añadiremos nuestro token en la variable que le corresponde:

Una vez introducido el token en cuestión, el programa podrá arrancar sin ningún tipo de problema. Si todo ha ido como debería, lanzaremos PowerGram con el parámetro -run y el bot quedará a la espera de recibir una orden para ejecutarla.

Por motivos de seguridad, he decidido añadir un paso más (ya que ahora, cualquiera podría ejecutar código en el sistema donde se esté ejecutando). De esta forma, el bot nunca aceptará órdenes de ningún usuario no autorizado.

Para añadir nuestro usuario a la lista blanca, abriremos un chat privado a nuestro recién creado bot y escribiremos /getid en la ventana de chat. De esta forma, el bot nos devolverá nuestro identificador único tal y como podemos ver en la siguiente imagen:

Por último, solo nos quedaría escribir nuestro Chat ID en la variable correspondiente, justo debajo de la anterior, donde habíamos introducido el token de nuestro bot de Telegram.

Ahora sí, con esto habríamos terminado nuestro setup y nuestro autómata virtual estaría totalmente preparado para recibir nuestras órdenes sin rechistar.

A continuación, cerraremos cualquier instancia de PowerGram que se esté ejecutando y volveremos a lanzarlo para cargar las nuevas variables que hemos introducido en su código. Una vez hecho esto, recibiremos un mensaje de bienvenida parecido a este:

Con esto, quedaría confirmado que nuestro bot está operativo. Ahora, veamos que nos puede ofrecer utilizando el comando /help en la ventana de chat:

Como podéis ver, no hay mucha variedad, pero lo esencial está cubierto. Ya que se trata de un bot de gestión, con esto deberíamos de tener suficiente para cubrir nuestras necesidades más básicas (si echas algo en falta, siempre estoy abierto a sugerencias).

Aunque la ayuda se explica por sí misma, veamos en detalle que nos ofrece PowerGram:

• /hi = Con este comando, sabremos si PowerGram está en ejecución
• /help = Muestra este mensaje de ayuda en la ventana de chat
• /wakeonlan = Enciende un PC de la misma red a través de WOL
• /upload = Este comando nos permitirá subir ficheros
• /download = Este comando nos permitirá descargar ficheros
• /exec = Ejecución de código remoto a través de PowerShell
• /getid = Nos devuelve nuestro Chat ID
• /kill = Cierra el proceso remoto de PowerGram

Como una imagen vale más que mil palabras, utilizaré cada uno de los comandos para no dejar lugar a dudas. Primero, comenzaré saludando al bot, así sabremos si está disponible o no:

Este comando nos servirá para saber si se ha perdido la comunicación con el bot, el proceso del mismo está «muerto» o continúa todo en orden. Como el comando de ayuda ya lo hemos visto, ahora pasaremos al wake on lan o WOL para los amigos.

Para aquellos que no estén familiarizados con este concepto, se trata de enviar un paquete especial con la MAC de un dispositivo para encenderlo de forma remota. Si está configurado correctamente (aunque el PC esté apagado), la tarjeta de red continuará estando encendida, permitiendo el encendido remoto a través de un «paquete mágico».

Es conocido por todos, que en Linux es muy fácil de hacer algo así. Instalas el paquete wakeonlan, lo ejecutas y listo. Pero.. qué sucede en Windows? Como no siempre las cosas son tan sencillas en la casa de Microsoft, he incorporado una función de PowerShell capaz de enviar este paquete mágico sin problemas, por lo que seremos capaz de encender un PC en nuestra lan de la misma forma.

Para ello, es tan sencillo como ejecutar el comando /wakeonlan seguido de la MAC del dispositivo que queremos encender. Si todo está configurado correctamente, se encenderá sin mayor dificultad:

Ahora, pasemos a la parte de los ficheros. Seguramente, esta parte es la más difícil de todas, ya que los conceptos se invierten en función del sentido de los datos. Si enviamos ficheros, indicaremos la ruta donde se subirá el mismo, mientras que si descargamos, la ruta que indicaremos, será desde donde se descargará este.

Además, si no indicamos ninguna ruta, los ficheros se descargarán o se subirán en el mismo directorio donde se esté ejecutando PowerGram, independientemente de si es la parte cliente o la parte servidor.

Primero, subiré un fichero utilizando el comando /upload sin indicar la ruta. Como os decía anteriormente, el fichero se subirá en la misma ruta donde se esté ejecutando el bot:

En cambio, si le indicamos la ruta a continuación del comando, el fichero se subirá en esa ruta (siempre que tengamos permisos de escritura en ese directorio), tal y como podemos ver a continuación:

Ahora, veamos que sucede con las descargas. Si utilizamos el comando /download sin indicar ninguna ruta, PowerGram buscará el fichero en el mismo directorio donde se está ejecutando el bot:

Por el contrario, si indicamos una ruta a continuación del comando, será ese fichero el que irá a buscar PowerGram, para mandárnoslo tras recibir la orden:

Para terminar, ya solo nos quedan un par de comandos más. En el caso de /exec podremos ejecutar comandos a través de PowerShell como si de una consola se tratase. Aunque existen algunas limitaciones con el output (tanto de tamaño como de formato), los comandos se ejecutarán sin ningún tipo de problema, a pesar de que no los veamos.

Para esta parte, he decidido hacerla desde Windows. Para ello, simplemente copiaremos el script «PowerGram.ps1» que estábamos usando y lo ejecutaremos en el sistema de Microsoft de la misma forma.

Por poner un ejemplo, podríamos listar directorios utilizando el comando ls u obtener la ruta actual de ejecución con pwd, tal y como podemos ver en la siguiente captura:

Por último, solo nos quedaría /kill que será el comando encargado de «matar» al bot en el otro extremo, cerrando el proceso de PowerGram de forma irreversible, finalizando así cualquier comunicación con nuestro pequeño asistente virtual:

Como hemos podido comprobar, PowerGram nos permite hacer pequeñas tareas básicas, que podrían ayudarnos a gestionar un PC de forma remota, o incluso, lo podríamos utilizar como backdoor durante nuestros ejercicios de Red Team.

En tal caso, es importante tener en cuenta que todas las peticiones se realizarán en GET, quedando así registradas en los logs de los servidores. De esta forma, serán mucho más fáciles de detectar que si las mismas fueran en POST.

Como conclusión final, la herramienta se encuentra en fase «beta» y es probable que se produzcan fallos en algunos escenarios. Si encuentras alguno, no dudes en hacérmelo saber 🙂

Espero que os haya gustado y os resulte útil en vuestras próximas auditorías.

Nos vemos en la próxima!