mercredi 2 février 2011

Débuter avec les buffer overflows...

Je suis complètement débutant dans tout ce qui est exploitation, reverse et autres joyeusetés du même genre... alors je travaille pour m'améliorer en lisant beaucoup de documentation (notamment Hacking The Art of Exploitation)
Le problème c'est qu'aujourd'hui de nombreuses protections sont mises en places par défaut sur les différents systèmes, ce qui rend l'apprentissage bien plus compliqué. La moindre petite exploitation devient donc pour les débutants comme moi, infaisable...
Voilà donc quelques éléments qui peuvent faciliter la tâche à des fins d'apprentissages.

Pour commencer lors de la création du binaire vulnérable, il faut préciser au compilateur l'option -fno-stack-protector à gcc qui va empêcher la mise en place de code supplémentaire permettant de détecter les débordements de buffer.

# gcc vuln.c -o vuln -fno-stack-protector -ggdb3

Ensuite on va autoriser la création des fichiers core (on va leur donner un nom sexy et surtout s'assurer qu'il n'y a pas /dev/null dans /proc/sys/kernel/core_pattern) :

# sudo sysctl -w kernel.core_pattern=%e-%p-%t.core
kernel.core_pattern = %e-%p-%t.core
# ulimit -c 100000

Ensuite on va utiliser le programme execstack, pour rendre la pile de notre programme exécutable (désactivation du NX bit):

# readelf -l vuln
Elf file type is EXEC (Executable file)
Entry point 0x8048310
There are 8 program headers, starting at offset 52

Program Headers:
Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
PHDR 0x000034 0x08048034 0x08048034 0x00100 0x00100 R E 0x4
INTERP 0x000134 0x08048134 0x08048134 0x00013 0x00013 R 0x1
[Requesting program interpreter: /lib/ld-linux.so.2]
LOAD 0x000000 0x08048000 0x08048000 0x004b4 0x004b4 R E 0x1000
LOAD 0x000f14 0x08049f14 0x08049f14 0x00100 0x00108 RW 0x1000
DYNAMIC 0x000f28 0x08049f28 0x08049f28 0x000c8 0x000c8 RW 0x4
NOTE 0x000148 0x08048148 0x08048148 0x00044 0x00044 R 0x4
GNU_STACK 0x000000 0x00000000 0x00000000 0x00000 0x00000 RW 0x4
GNU_RELRO 0x000f14 0x08049f14 0x08049f14 0x000ec 0x000ec R 0x1

Section to Segment mapping:
Segment Sections...
00
01 .interp
02 .interp .note.ABI-tag .note.gnu.build-id .gnu.hash .dynsym .dynstr .gnu.version .gnu.version_r .rel.dyn .rel.plt .init .plt .text .fini .rodata .eh_frame
03 .ctors .dtors .jcr .dynamic .got .got.plt .data .bss
04 .dynamic
05 .note.ABI-tag .note.gnu.build-id
06
07 .ctors .dtors .jcr .dynamic .got
# execstack -s vuln
# readelf -l vuln
Elf file type is EXEC (Executable file)
Entry point 0x8048310
There are 8 program headers, starting at offset 52

Program Headers:
Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
PHDR 0x000034 0x08048034 0x08048034 0x00100 0x00100 R E 0x4
INTERP 0x000134 0x08048134 0x08048134 0x00013 0x00013 R 0x1
[Requesting program interpreter: /lib/ld-linux.so.2]
LOAD 0x000000 0x08048000 0x08048000 0x004b4 0x004b4 R E 0x1000
LOAD 0x000f14 0x08049f14 0x08049f14 0x00100 0x00108 RW 0x1000
DYNAMIC 0x000f28 0x08049f28 0x08049f28 0x000c8 0x000c8 RW 0x4
NOTE 0x000148 0x08048148 0x08048148 0x00044 0x00044 R 0x4
GNU_STACK 0x000000 0x00000000 0x00000000 0x00000 0x00000 RWE 0x4
GNU_RELRO 0x000f14 0x08049f14 0x08049f14 0x000ec 0x000ec R 0x1

Section to Segment mapping:
Segment Sections...
00
01 .interp
02 .interp .note.ABI-tag .note.gnu.build-id .gnu.hash .dynsym .dynstr .gnu.version .gnu.version_r .rel.dyn .rel.plt .init .plt .text .fini .rodata .eh_frame
03 .ctors .dtors .jcr .dynamic .got .got.plt .data .bss
04 .dynamic
05 .note.ABI-tag .note.gnu.build-id
06
07 .ctors .dtors .jcr .dynamic .got

Enfin on va désactiver l'ASLR:

# sudo sysctl -w kernel.randomize_va_space=0
kernel.randomize_va_space = 0

Ces petites modifications m'ont permis de tester quelques exploitations très simples. En espérant que ca en aidera certains :)

Update: Certaines options peuvent être ajoutées à gcc pour désactiver encore plus de sécurité et qui peut être utile lors de l'exploitation de format string (et qui permet aussi de se passer de execstack) :

# gcc vuln.c -w -O0 -ggdb -std=c99 -static -D_FORTIFY_SOURCE=0 -fno-pie -Wno-format -Wno-format-security -fno-stack-protector -z norelro -z execstack -o vuln

2 commentaires:

  1. Merci de penser aux débutants comme moi :-)

    RépondreSupprimer
  2. Salut et bien j'étais très content de trouver ses informations :) ,
    j'ai le même de M.erickson, mais par contre bien que j'ai utilisé t'est
    précieuses informations sa ne fonctionne toujours pas. :(

    Peut-être faute à ma distribution "archlinux" mais je trouve sa quand même bizarre????
    ou la faute au nouveau kernel 3.xxxx???
    Bref je cherche encore des choses à désactiver jusqu'à ce que sa veuille bien fonctionné,
    si jamais tu as un conseil même tardif, je suis preneur :) :) :) ....................

    RépondreSupprimer