Publicaciones

dCTF 2021: Discord PingPong

Investigando un binario Go de un bot de Discord y recuperando el camino hacia la flag del reto.

Writeup original del reto: Discord PingPong.md

Este fue molesto de preparar.

Al ejecutar el binario imprimía:

Successfully connected to Discord API
Last message in #general is: Welcome to our secret server! Only trusted bots and users have access to the secret channels. Our secret plans have been moved from here to a secret channel.
Bot is now running.  Press CTRL-C to exit.

Enviar cualquier cosa por stdin no parecía hacer nada.

Al correr file sobre el binario:

discordbot: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, Go BuildID=_ZEAdEO-wvSQGBQYhkGM/xFUNbqa5yDNs4HrN4WQF/IfIgpWbUNMnt11lPcn7W/sNa0sC3hsaXC9dymZEeD, not stripped

Entonces, Go.

Una búsqueda rápida de un bot de Discord en Go me llevó a discordgo:

https://github.com/bwmarrin/discordgo

Ese repositorio tiene un ejemplo ping-pong:

https://github.com/bwmarrin/discordgo/blob/master/examples/pingpong/main.go

También coincidía con este string del binario:

Bot is now running. Press CTRL-C to exit.

Eso fue útil para identificar qué estaba mirando, pero no mucho más. Los argumentos pasados al bot eran ignorados.

Solución esperada

La solución esperada aparentemente era mucho más simple: correr strings sobre el archivo discordbot, extraer el token de la API de Discord, entrar o consultar el servidor secreto de Discord y obtener la flag del canal secreto.

Cómo lo resolví

Ya había probado strings, pero la salida era enorme y revisarla a mano habría sido doloroso.

Sabía que la librería net/http de Go respeta variables de entorno de proxy por defecto. Así que abrí Burp, configuré las variables de entorno HTTP y HTTPS proxy en mi terminal a 127.0.0.1:8080, y agregué el certificado CA de Burp Suite a /usr/local/share/ca-certificates.

Links útiles:

Después de eso, las solicitudes del bot aparecieron en Burp. Desde ahí, pude ejecutar discordbot, agarrar el token y recuperar la flag de uno de los canales usando la API de Discord.

No tomé screenshots, y volver a preparar todo era suficiente dolor como para dejarlo ahí.