[Chroot] Shellcode en Chroot i686 sous x86_64

Applications, problèmes de configuration réseau
Avatar de l’utilisateur
Distag
yeomen
Messages : 255
Inscription : dim. 03 avr. 2011, 15:58

[Chroot] Shellcode en Chroot i686 sous x86_64

Message par Distag » jeu. 03 mai 2018, 22:04

Bonjour,

Je me suis mis à suivre le livre "Techniques de hacking" de Jon Erickson, et je rencontre quelques problèmes pour exécuter correctement les exemples de shellcode (en tout cas le premier du livre) en Chroot d'un 32-bit sur un système 64-bit avec linux-4.16.6 (version actuelle).

Pour des raisons de petite configuration, j'ai préféré chrooter l'iso fournis avec le livre.

Avec le même binaire compilé avec le compilateur de l'iso dans l'environnement chroot, quand je lance l’exécution de l'exploit dans l'environnement chroot, rien ne se passe.
Alors que quand je lance l'image de l'iso via qemu, j'arrive à faire exécuter le shellcode.

Les 2 seules différences d’environnement que je voie sont le kernel et l’environnement chroot.

Donc j'aimerais savoir:
  • Quelles sont toutes les modifications significatives apportées au kernel depuis la version 2.6.12 pour contrer les shellcode? Comment les désactivés temporairement? [J'ai déjà trouvé sudo sysctl -w kernel.randomize_va_space=2]
  • Est-ce qu'un Chroot d'une image i686 sur un système x86_64 peut avoir un impact sur le fonctionnement d'un shellcode? Comment le solutionner?
Ce que j'ai fait et qui est reproductible:

Code : Tout sélectionner

wget http://examples.oreilly.com/9781593271442/hacking-live-1.0.iso
gpasswd -a distag kvm
qemu-img create qemu.raw 1500M
qemu-system-x86_64 -k fr -m 2048 -drive file=qemu.raw,format=raw -boot d -cdrom hacking-live-1.0.iso -net nic -net user -no-acpi #installation du ubuntu sur l'image et création d'un user 'reader'
sudo sysctl -w kernel.randomize_va_space=0 #pour désactiver temporairement une protection depuis linux 2.6.12 contre le shellcode 
sudo mount -o loop,offset=$((63*512)) qemu.raw /mnt
sudo mount -t proc /proc /mnt/proc/
sudo mount --bind /sys /mnt/sys/
sudo mount --bind /dev /mnt/dev/
sudo cp /etc/resolv.conf /mnt/etc/
sudo chroot /mnt /bin/bash
su reader
cd ~/booksrc
gcc -o notesearch notesearch.c
sudo chown root:root ./notesearch
sudo chmod u+s ./notesearch
gcc exploit_notesearch.c
for i in `seq 0 30 300`; do echo Trying offset $i; ./a.out $i; done
#ici cela ne marche pas
exit
exit
sudo umount --detach-loop --recursive /mnt/
sudo sysctl -w kernel.randomize_va_space=2
qemu-system-x86_64 -k fr -m 2048 -drive file=qemu.raw,format=raw -boot d -net nic -net user -no-acpi #on se log avec reader
cd ~/booksrc
for i in `seq 0 30 300`; do echo Trying offset $i; ./a.out $i; done
#et là cela marche, pourquoi?
x86_64 | KDE | Clavier Bépo

Avatar de l’utilisateur
Distag
yeomen
Messages : 255
Inscription : dim. 03 avr. 2011, 15:58

Re: [Chroot] Shellcode en Chroot i686 sous x86_64

Message par Distag » ven. 04 mai 2018, 11:53

J’ai un peu progressé.

Apparemment il faut que la stack du binaire avec la faille soit exécutable.

Code : Tout sélectionner

objdump --private-headers ./notesearch | grep "STACK off" -A1 #pour vérifier si on a bien 'flags rwx'
Sinon il faut recompiler avec l'option "-z execstack" de gcc l’exécutable avec la faille

Code : Tout sélectionner

man ld
	-z execstack
		Marks the object as requiring executable stack.

Code : Tout sélectionner

chroot: ld --version                                                                                
GNU ld version 2.17.50 20070103 Ubuntu

Code : Tout sélectionner

x86_64: ld --version
GNU ld (GNU Binutils) 2.30
Ce que je ne comprends toujours pas:
  • Pourquoi quand je virtualise avec qemu je n’en ai pas besoin, mais quand je chroote j'en ai besoin?
  • Comment activer par défaut "execstack" dans mon environnement sur le modèle de kernel.randomize_va_space?
Édit: Pour info, il y a aussi la taille de stack qui change. Elle est ni équivalente à celle d'un binaire 32bits sur i686 ni a celle d'un binaire 64bits sur x86_64. Un binaire 32bits sur x86_64 est émulé sur un kernel 64bits. La plage de mémoire de sa stack est donc différente i.e. fffdd000-ffffe000 (cat /proc/*/maps | grep "\[stack\]")
x86_64 | KDE | Clavier Bépo

Répondre