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:
- How do you add a certificate authority CA to Ubuntu?
- How to program Go to use a proxy when using a custom transport
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í.