Le Max De Culture

French Flag English Flag

Le Max De Culture

Exploitation de la faille de la fonction system()

Auteur : BIGMAC

04 Août 2019

Après s’être attaquer au faille de chemin sur Windows, attaquons-nous à la faille de la fonction system() sur linux !

Tout d’abord, qu’est-ce que la fonction system() ?

La fonction system est une fonction en c/c++ permettant d’exécuter des commandes systèmes sur l’OS sur lequel vous exécutez votre programme ! Jusque-là rien d’exceptionnel, elle peut par exemple exécuter ce genre de commande avec ce type de programme basique :

Effectivement la commande montrera les fichiers et dossier de la session linux. En fait, elle exécute la commande ls.

Comment fonctionne cette fonction system() ?

Cette fonction fonctionne comme la fonction pour retrouver un fichier sur Windows (voir autre article) à peu de chose près. Je vous explique :

Imaginons que la fonction system, comme dans l’exemple ci-dessus, exécute ls. La fonction system() va chercher ls de cette façon :

/usr/ ---------------- → non disponible, on continue à chercher dans le prochain dossier
/bin/ ---------------- → disponible, donc on l’exécute.

Et pour savoir dans quel dossier chercher, la fonction system() s’aide de la variable $PATH :

Et là vous vous dites « c’est super simple on a qu’à mettre un fichier ls dans un dossier usr comme ça il sera exécuté grâce à la fonction $PATH».

Effectivement mais ce sera un peu plus subtile, étant donné que nous ne pouvons pas écrire un fichier dans /usr/, minimun de sécurité, et que nous voulons réussir cette faille avec un minimum de droits.

Après la théorie, attaquons l’exploitation !

Comment l’exploiter ?

Il va exécuter normalement la fonction ls. Nous devons donc créer un « faux » programme ls.

Etant donné que nous ne pouvons pas écrire notre fichier ls dans /usr/ nous allons le créer dans /tmp/ un dossier accessible de tous

Puis nous y écrirons une phrase aléatoire.

Bien ! Maintenant il va falloir que notre fichier ai des permissions pour s’exécuter (et oui linux est comme même un peu plus sécurisé que Windows 😉)

Nous avons le fichier ls, les permissions, le fichier est bien placé il ne reste plus qu’à modifier le plus important : la variable $PATH.

Dans ce cas, on souhaite que $PATH cherche d’abord dans notre dossier avant de chercher dans les autres dans le but que notre fichier soit exécuté, on va donc modifier :

Nous passerons donc de cette variable :

À celle-ci :

Bien ! Maintenant que nous avons fini notre préparation d’exploitation il n’y a plus qu’à l’exécuter.

Et voilà ! Opération réussi.

On a donc vu que system() était exploitable, maintenant il faut savoir contrer cette faille.

Comment s’en protéger ?

Si vous faites un programme en C, privilégiez la fonction exec() plutôt que system(). exec() ne va pas chercher dans les dossier les fichiers à exécuter comme system() mais elle crée son propre processus, un peu comme si elle ouvrait sa fenêtre de terminal toute seule.

Source