[BBB] [GDB] Exploitation de binaire ARM

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

[BBB] [GDB] Exploitation de binaire ARM

Message par Distag » sam. 13 juil. 2019, 20:55

Bonjour,

Je suis actuellement un tutoriel sur l’ASM ARM et l’exploitation de binaire ARM (https://azeria-labs.com/writing-arm-assembly-part-1/), je suis en train de faire les challenges proposés (https://azeria-labs.com/part-3-stack-ov ... hallenges/).

J’ai fait jusqu’au 5ᵉ challenge sous l’OS original qui tournait sur mon BeagleBoneBlackrevC, c’est-à-dire bone-debian-9.5-iot-armhf-2018-10-07-4gb.img (https://debian.beagleboard.org/images/b ... 4gb.img.xz).

Pour des raisons de logiciels pas vraiment à jour sur la version de Debian, faisant planter GDB à l’erreur de segmentation, j’ai décidé d’installer mon OS préféré (https://archlinuxarm.org/platforms/armv ... bone-black) pour avoir les correctifs de ce bug par une version à jour du logiciel.

Sauf qu’il y a un problème maintenant sous Arch.

Sous GDB j’ai eu juste à changer une adresse pour que mon exploit sur le chalenge 5 remarche, mais ce n’est plus le cas en dehors de GDB avec ce même changement.

Je précise que j’ai désactivé l’ASLR et que le binaire fourni par le challenge n’a aucune protection.

Je ne comprends pas pourquoi mon exploit ne marche plus en dehors de GDB alors qu’il marchait sur le Debian de manière identique à l’extérieur de GDB comme dans GDB.

Je suppose qu’il doit surement avoir quelques choses qui change sur la stack entre l’environnement GDB et en dehors de GDB, mais cela me parait bizarre que les variables d’environnement dans GDB et en dehors soient différentes?! J’ai remarqué par exemple que python ne s’exécutait pas correctement par defaut, il lui manquait dans locale.conf LANG=en_US.UTF-8 pour afficher correctement certain caractère Unicode alors que locale.gen était correctement configuré

Est-ce qu’il y a des mesures de protection supplémentaire sur ArchlinuxARM d’activé par défaut? J’ai remarqué par exemple qu’il y avait systemd-auditd qui tournait dans le fond ce qu’il n’y a pas sur mon installation x86. Est-ce qu’il y a d’autre changement ou une documentation qui les listes?

Comment je résous cela? Merci d’avance
Dernière modification par Distag le mar. 16 juil. 2019, 21:09, modifié 1 fois.
x86_64 | KDE | Clavier Bépo

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

Re: [BBB] [GDB] [STACK] Exploitation de binaire ARM

Message par Distag » dim. 14 juil. 2019, 19:27

J’ai trouvé comment désactiver audit temporairement par:

Code : Tout sélectionner

sudo auditctl -e 0
La manière permanente ne semble pas marcher vu qu’au reboot il se réactive:

Code : Tout sélectionner

sudo systemctl disable auditd
Mais cela ne change rien à mon probleme.

J’ai fait un diff entre l’env de gdb (show env) et l’env locale, il n’y a que 3 variables qui changent:
  • $_
  • LINES=24
  • COLUMNS=96

J’ai export les 2 derrières mais cela ne change rien à mon problème.

J’ai aussi essayé de lancer les exécutables avec

Code : Tout sélectionner

env -i gdb -q ./stack5
env -i ./stack5 <<< $(echo $(cat shellcode.bin ; perl -e 'print "\xb0\xfa\xff\xbe"x7'))
Mais cela ne change rien au problème

J’ai revérifié que la stack était bien exécutable dans /proc/PID/map et c’est bien le cas.
x86_64 | KDE | Clavier Bépo

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

Re: [BBB] [GDB] [STACK] Exploitation de binaire ARM

Message par Distag » lun. 15 juil. 2019, 20:00

Kernels

Code : Tout sélectionner

Linux beaglebone 4.14.71-ti-r80 #1 SMP PREEMPT Fri Oct 5  23:50:11 UTC 2018 armv7l GNU/Linux
Linux alarm      5.1.15-1-ARCH  #1     PREEMPT Fri Jun 28 02:45:22 UTC 2019 armv7l GNU/Linux
x86_64 | KDE | Clavier Bépo

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

Re: [BBB] [GDB] Exploitation de binaire ARM

Message par Distag » mar. 16 juil. 2019, 20:50

Avec l’outil : https://github.com/slimm609/checksec.sh J’ai fait un "checksec --kernel" du debian ARM et du archlinux ARM

Les résultats du diff:
  • Sur Archlinux:

Code : Tout sélectionner

Protected symlinks:                     Enabled
Protected hardlinks:                    Enabled
Full reference count validation:        Enabled

Hardened Usercopy:                      Enabled
Hardened Usercopy Pagespan:             Disabled
Harden str/mem functions:               Enabled
Restrict /dev/kmem access:              Enabled
  • Sur Debian:

Code : Tout sélectionner

Protected symlinks:                     Disabled
Protected hardlinks:                    Disabled
Full reference count validation:        Disabled

Hardened Usercopy:                      Disabled
Restrict /dev/kmem access:              Disabled

Est-ce que cela pourrait avoir un lien avec mon problème? Suis-je obligé de recompiler le kernel pour désactiver tout cela? Ou il y a une commande du style sysctl pour switcher off temporairement ces protections?
x86_64 | KDE | Clavier Bépo

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

Re: [BBB] [GDB] Exploitation de binaire ARM

Message par Distag » mer. 17 juil. 2019, 20:59

Ce qui correspond à:
  • sudo sysctl fs.protected_symlinks=0
  • sudo sysctl fs.protected_hardlinks=0
  • CONFIG_REFCOUNT_FULL=y
  • CONFIG_HARDENED_USERCOPY=y
  • CONFIG_FORTIFY_SOURCE=y
  • # CONFIG_DEVKMEM is not set
Qui correspond aux documentations suivantes: C’est donc surement le CONFIG_FORTIFY_SOURCE=y la cause de mes soucis

Pour recompiler le noyau, je suis tombé sur ça https://archlinuxarm.org/forum/viewtopi ... 48&t=10089

J’ai été cherché le PKGBUILD du noyau parmi les PKGBUILD d’archlinuxarm (https://github.com/archlinuxarm/PKGBUILDs)
x86_64 | KDE | Clavier Bépo

benjarobin
Maître du Kyudo
Messages : 15406
Inscription : sam. 30 mai 2009, 15:48
Localisation : Lyon

Re: [BBB] [GDB] Exploitation de binaire ARM

Message par benjarobin » mer. 17 juil. 2019, 21:18

Bonjour,
Je ne vois pas comment CONFIG_FORTIFY_SOURCE=y peut être la cause de tes soucis.
Tu n'aurais pas le code source du chalenge ? Ou uniquement le binaire ? As tu analysé ce qui était fait ?
Zsh | KDE | PC fixe : core i7, carte nvidia | Portable : Asus ul80vt
Titre d'un sujet : [Thème] Sujet (état)

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

Re: [BBB] [GDB] Exploitation de binaire ARM

Message par Distag » mer. 17 juil. 2019, 21:45

Le stack5 de https://github.com/azeria-labs/ARM-challenges
Il ne fait que remplir un buffer avec gets via stdin.

Je ne vois que lui qui est un lien avec un buffer en userspace.
Detect overflows of buffers in common string and memory functions where the compiler can determine and validate the buffer sizes.
(https://cateee.net/lkddb/web-lkddb/FORTIFY_SOURCE.html)
x86_64 | KDE | Clavier Bépo

benjarobin
Maître du Kyudo
Messages : 15406
Inscription : sam. 30 mai 2009, 15:48
Localisation : Lyon

Re: [BBB] [GDB] Exploitation de binaire ARM

Message par benjarobin » mer. 17 juil. 2019, 22:59

Ah en effet s'il appel gets (qui utilise ce genre de fonction aujourd'hui...).
Généralement les buffers overflow sont fait depuis l'userspace et non depuis un syscall kernel.
Je pensais à un memcpy coté userspace, et dans ce cas là le kernel ne peut pas vraiment te protéger (à part le classique stack overflow)

Je viens de désassembler le programme, il n'a pas l'air de faire grand chose...

Code : Tout sélectionner

0001041c <main>:
   1041c:       e92d4800        push    {fp, lr}
   10420:       e28db004        add     fp, sp, #4
   10424:       e24dd048        sub     sp, sp, #72     ; 0x48
   10428:       e50b0048        str     r0, [fp, #-72]  ; 0xffffffb8
   1042c:       e50b104c        str     r1, [fp, #-76]  ; 0xffffffb4
   10430:       e24b3044        sub     r3, fp, #68     ; 0x44
   10434:       e1a00003        mov     r0, r3
   10438:       ebffffa1        bl      102c4 <gets@plt>
   1043c:       e1a00003        mov     r0, r3
   10440:       e24bd004        sub     sp, fp, #4
   10444:       e8bd8800        pop     {fp, pc}
Et le but est de juste faire ceci ?
Goal: overwrite PC and make it branch to your shellcode.
Le tableau à l'air d'être en stack et de taille 68
Zsh | KDE | PC fixe : core i7, carte nvidia | Portable : Asus ul80vt
Titre d'un sujet : [Thème] Sujet (état)

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

Re: [BBB] [GDB] Exploitation de binaire ARM

Message par Distag » jeu. 18 juil. 2019, 06:27

Dans mon premier post, j’aurais peut-être dû préciser:
J’ai fait jusqu’au 5ᵉ challenge inclu
Mon problème n’est pas l’exploitation du binaire. Il suffit juste d’écraser l’adresse dans $r11 par l'adresse dans $r11 -68 pour lancer le shellcode, mon shellcode fait 44 octets, j’écris en plus 7 x 4 = 28 octets, soit 72. Ce qui l’écrase dans GDB sur debian ou sur Arch. Mais pas en dehors de GDB sur Arch à partir un shell classique alors que c’est le cas sur debian. Je suppose donc que mon problème vient de l’environnement système. Je suppose que si ce n’est pas les variables d’environnement [tester plus haut], cela doit venir de la config du kernel.
x86_64 | KDE | Clavier Bépo

Répondre