crypto

FunkyOracle

Punkty: 290
Rozwiązań: 11

W ramach programu Cybertarcza Antykryzysowa, ugrupowanie Plaintekst i Sekrety udostępniło obywatelom serwis szyfrujący. Pomimo głośnej krytyki jest on obecnie dostępny pod:

nc ecsc21.hack.cert.pl 25738

Eksperci wykazali, że szyfrowanie używa algorytmu AES CBC ze stałym wektorem inicjalizującym oraz kluczem. Organizacja utrzymuje, że pomimo tego, bezpieczeństwo zapewnia poufność tych parametrów. Z racji braku środków unijnych do dokończenia wszystkich kamieni milowych, zrezygnowano również z implementacji paddingu.

Komunikacja z serwisem odbywa się prostym protokołem TLV:

-----------------------------------------------------
| TYPE | LENGTH | VALUE                             |
-----------------------------------------------------
| 1B   | 1B     | LENGTH BYTES                      |
-----------------------------------------------------

Uważni obserwatorzy ponadto zaobserwowali fragment kodu na portalu wklejmnie.pl:

#define TYPE_ENC_REQ 0x01
#define TYPE_DEC_REQ 0x02
#define TYPE_ENC_RSP 0x11
#define TYPE_DEC_RSP 0x22
#define TYPE_ERR 0xee

typedef struct type_len_value {
  uint8_t type;
  uint8_t length;
  uint8_t value[300];
} tlv_t;

struct enc_space {
  uint8_t ciphertext[64];
  uint8_t plaintext[64];
};


int handle(tlv_t *msg){

  struct enc_space es;
  memset(&es, 0, sizeof(es));

  if (msg->type == TYPE_ENC_REQ) {
    size_t copy_size = msg->length > 64 ? 64 : msg->length;
    memcpy(es.plaintext, msg->value, copy_size);
    aes_encrypt(es.plaintext, es.ciphertext, msg->length);

    msg->type = TYPE_ENC_RSP;
    msg->length = copy_size;
    memcpy(msg->value, es.ciphertext, copy_size);
  }
  else if (msg->type == TYPE_DEC_REQ) {
    size_t copy_size = msg->length > 64 ? 64 : msg->length;
    memcpy(es.ciphertext, msg->value, copy_size);
    aes_decrypt(es.ciphertext, es.plaintext, msg->length);

    msg->type = TYPE_DEC_RSP;
    msg->length = copy_size;
    memcpy(msg->value, es.plaintext, copy_size);
  }

  return 0;
}

Dodatkowo, grupa pewnych dzieciaków z 3ciego piętra twierdzi, że udało jej się przełamać zabezpieczenia tarczy i wykraść ważne sekrety z serwera aplikacji. Opublikowali wiadomość, mówiącą że jeśli nadpisze się 8 bajtów za przestrzenią kryptograficzną wartością: 0x00005555555553f6 serwer zróci wcześniej wspomniany sekret (nie ma potrzeby łamać ASLR, to tylko statyczna wartość).

--------------
|            |
| CIPHERTEXT |
| 64B        |
|            |
--------------
|            |
| PLAINTEXT  |
| 64B        |
|            |
--------------
| 8B  | PTR  |
--------------

Czy uda Ci się potwierdzić ich teorię?!

Format flagi: ecsc21{litery_cyfry_i_znaki_specjalne}.
W razie wątpliwości lub pytań dotyczących konkursu zapraszamy na naszego Discorda: https://discord.gg/D825Xe8k.

Aby wysłać flagę, musisz się zalogować.