Publicações

dCTF 2021: Discord PingPong

Investigando um binário Go de bot do Discord e recuperando o caminho até a flag do desafio.

Writeup original do desafio: Discord PingPong.md

Esse foi chato de configurar.

Ao executar o binário, ele imprimia:

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 qualquer coisa pelo stdin não parecia fazer nada.

Rodar file no binário mostrou:

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

Então, Go.

Uma busca rápida por um bot de Discord em Go me levou ao discordgo:

https://github.com/bwmarrin/discordgo

Esse repositório tem um exemplo de ping-pong:

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

Ele também correspondia a esta string do binário:

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

Isso foi útil para identificar o que eu estava olhando, mas não ajudou muito além disso. Argumentos passados ao bot eram ignorados.

Solução esperada

A solução esperada aparentemente era muito mais simples: rodar strings no arquivo discordbot, extrair o token da API do Discord, entrar ou consultar o servidor secreto do Discord e pegar a flag no canal secreto.

Como resolvi

Eu já tinha tentado strings, mas a saída era enorme e filtrar tudo manualmente teria sido doloroso.

Eu sabia que a biblioteca net/http do Go respeita variáveis de ambiente de proxy por padrão. Então abri o Burp, configurei as variáveis de ambiente de proxy HTTP e HTTPS no terminal para 127.0.0.1:8080, e adicionei o certificado CA do Burp Suite em /usr/local/share/ca-certificates.

Links úteis:

Depois disso, as requisições do bot apareceram no Burp. A partir daí, pude rodar o discordbot, pegar o token e recuperar a flag de um dos canais usando a API do Discord.

Não tirei screenshots, e configurar tudo de novo era trabalhoso o suficiente para eu deixar por aí.