Elévation de privilège de script, wrapper

Je suis en train de faire des exercices en python, je commence relativement simple, pour tester des commandes, et je voulais donc jouer à modifier mon adresse MAC. Sur le principe, il suffit d'utiliser la commande ifconfig qui est maintenant déprécié au profit de ip sur Linux. Vous le savez très bien, les hackers changent leur adresse MAC pour imiter du matériel, contourner des sécurités. J'ai appris cela très jeune à 19 ans quand je piratais le wifi de mon voisin en WEP sur Backtrack. Je devais m'authentifier sur le réseau en imitant du matériel reconnu via l'adresse MAC qui limite la plage.

Comment changer l'adresse MAC?

ifconfig eth0 down
ifconfig eth0 hw ether 00:11:22:33:44:55
ifconfig eth0 up

Généralement cela s'appel eth0, pour ethernet et wlan0 pour wifi. Mais cela a changé, des règles à la cons et normes sont apparus. Avant ifconfig ne demandait pas de droit d'administrateur pour changer l'adresse MAC en root. Comment élever les privilèges de la commande ifconfig dans un script?

Tout d'abord faisons un petit script Python, qui demande l'interface et la nouvelle adresse MAC en utilisant le module subprocess qui permet d'invoquer des commandes systèmes.

mac_changer.py

#!/usr/bin/python

import subprocess

interface = input("Interface >")
new_mac = input("New MAC >")

print("[+] Changement d'adresse MAC pour " + interface " " en " + new_mac)

subprocess.call("ifconfig " + interface + " down", shell=True)
subprocess.call("ifconfig " + interface + " hw ether " + new_mac, shell=True)
subprocess.call("ifconfig " + interface + " up", shell=True)

Si vous éxecuter ce script vous allez avoir une erreur, car vous n'avez pas les privilèges root. La suite est d'expliquez les astuces comment élever les privilèges des scripts.

sudo

Tout d'abord la solution la plus simple est de tenter de lançer le script dans un terminal via sudo, tel que:

$ sudo python3 mac_changer.py

Utiliser le SUID bit

Le bit SUID permet à un programme d'être exécuté avec les permissions du propriétaire du fichier, plutôt qu'avec les permissions de l'utilisateur qui exécute le fichier. Voici comment vous pouvez configurer un script Python pour être exécuté avec les privilèges root :

Ecire un wrapper mywrapper.c en C qui lance le script Python

#include <stdlib.h>

int main() {
    system("python3 ~/python/mac_changer.py");
    return 0;
}

Compiler le wrapper

gcc -o mywrapper mywrapper.c

Changer le propriétaire de l'exécutable compilé en root via le bit SUID:

sudo chown root:root mywrapper
sudo chmod 4755 mywrapper

Permissions finales

  • 4 (SUID) : Set User ID bit.
  • 7 : Propriétaire a les permissions de lecture, écriture et exécution (rwx).
  • 5 : Groupe a les permissions de lecture et exécution (r-x).
  • 5 : Autres utilisateurs ont les permissions de lecture et exécution (r-x).

Maintenant, lorsque vous exécutez ./mywrapper, il exécutera mac_changer.py avec les privilèges root.

Utiliser bash et sudo

Si vous ne souhaitez pas modifier les permissions des fichiers, vous pouvez écrire un script Bash qui appelle votre script Python avec sudo:

Créer le script bash sudo-elevation.sh

#!/bin/bash

sudo python3 ~/python/mac_changer.py

Rendre executable le script

chmod +x sudo-elevation.sh

Exécuter le script bash

./sudo-elevation.sh

Sécurité

  • SUID : L'utilisation du bit SUID pour des scripts interprétés (comme des scripts Python) est déconseillée car elle peut poser des risques de sécurité. Les scripts interprétés peuvent être modifiés facilement et, si une faille de sécurité est présente, elle peut être exploitée pour exécuter du code arbitraire avec des privilèges root.

  • sudo dans un script Bash : Cette méthode est plus sûre et plus contrôlée. Vous pouvez configurer /etc/sudoers pour permettre à des utilisateurs spécifiques d'exécuter certains scripts sans mot de passe.

Pour éditer /etc/sudoers de manière sécurisée, utilisez visudo :

sudo visudo

Ajoutez la ligne d'execution sans mot de passe du script spécifique:

trivial ALL=(ALL) NOPASSWD: ~/sudo-elevation.sh

trivial est le username, en fonction de votre propre session utilisateur. Cela permet d'outre-passé la demande de mot de passe en root, mais demande d'éditer un fichier sécurisé pour l'execution du script.