Tutorial sur la programmation sécurisée

LinuxMag Cette série d'articles présente les failles de sécurité des programmes Set-UID root les plus communément exploitées. Outre la présentation des failles en elles-même, nous présentons les solutions qui permettent, dès la programmation, de les éviter.

article 1 : Introduction, UID/EUID, exécution de commandes externes
article 2 : Organisation de la mémoire, pile et fonctions, shellcode
article 3 : Buffer overflows
article 4 : Format bug
article 5 : Race conditions
article 6 : Scripts CGI

English version:
Introduction, UID/EUID, Escape shells
Memory, stack & functions, shellcodes
How to exploit buffer overflows and how to avoid them
What are format bug ?
Race conditions
CGI scripts

J'écris ces articles en collaboration avec Christophe Blaess et Frédéric Raynal.

Voici quelques tutoriaux sur les Buffer/Stack/Heap Overflows et differentes ressources

Aleph One, Phrack 49-14, Novembre 1996: Smashing The Stack For Fun And Profit, Aleph One
Mudge, 1997: How to Write Buffer Overflows
Universite du Wisconsin, Juin 1997Fuzz revisited: A Re-examination of the Reliability of Unix Utilities and Services
Nathan P.Smith, Juillet 1997: Stack Smashing Vulnerabilities in the Unix Operating System
Matt Conover/w00w00, Janvier 1999: Heap Overflows
klog, Phrack 55-08, Septembre 1999: Frame Pointer Overwrite
Mudge: Compromised-Buffer-Overflows, from Intel to SPARC Version 8
QuantumG: Overflow_tutorial
Solar Designer: Non-Executable User Stack

Programme d'exploitation générique des stack overflows

L'idée est de réunir dans un même programme:
- un shellcode realisant les fonctions exec et exit
- un générateur de code assembleur réalisant la demande les fonctions setuid, setgid
- la récupération de l'uid/gid portant le sticky bit
et de réaliser l'overflows via un argument ou via une variable d'environnement.

generic_exploit bsize offset align (var / novar) (force/noforce) prog2run target param
Les arguments:
- bsize: la taille du buffer réalisant l'overflow
- offset: la différence permettant l'éxecution du shellcode
- align: il permet de regler l'alignement des adresses, il vaut entre 0 et 3
- var/novar: le nom de la variable d'environnement utilisé pour l'overflow ou arg si l'overflow est passé par argument
- force/noforce: inclure un setuid/setgid dans le shellode ou non
- prog2run: le programme qui sera lancer par le shellcode
- target: le programme cible
- param: les arguments

generic_exploit.c

Quelques exploits pour la RedHat 5.0

slang-0.99.38-2 dosemu-0.66.7-1

Programme: /usr/bin/dos
Moyen: variable d'environnement TERM ou TERMINFO.
Remarques:
- dosemu utilise setreuid pour reduire les risques, il faut que le shellcode refasse un setuid par redevenir root.
- Si le shellcode execute un shell, on obtient un "I/O possible" lors de l'appui d'une touche. J'éxécute donc set_run_shell.c.
- Je n'ai pas reussi l'exploit avec TERMINFO

slang-0.99.38-2 mutt-0.85e-1

Programme: /usr/bin/mutt
Moyen: variable d'environnement TERM
Remarques:
- L'exploit devrait etre possible en utilisant TERMINFO.

Exploit pour la RedHat 6.1

man

Programme: /usr/bin/man
Moyen: variable d'environnement MANPAGER
./generic_exploit 5000 1500 3 MANPAGER force /bin/sh /usr/bin/man ls
Modifier l'alignement si besoin