Playing with ptrace() for fun and profit



Documents pareils
Structure d un programme

Programmation système de commandes en C

Les vulnérabilités du noyau. LECORNET Olivier LEGROS Bruno VIGIER Nicolas Promo 2005

Exécutif temps réel Pierre-Yves Duval (cppm)

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

Plan global. Programmation système II. Socket du domaine UNIX. Plan. Socket UNIX, Terminaux, Async IO, Mémoire, ELF.

Programmation système en C/C++

Logiciel de base. Première année ENSIMAG

Communication par sockets

Cours Programmation Système

LEs processus coopèrent souvent pour traiter un même problème. Ces

1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3.

Processus! programme. DIMA, Systèmes Centralisés (Ph. Mauran) " Processus = suite d'actions = suite d'états obtenus = trace

Introduction aux Systèmes et aux Réseaux

ERESI : une plate-forme d analyse binaire au niveau noyau

Malicious debugger! Fred Raynal & Jean-Baptiste Bedrune Sogeti IS / ESEC. 14 mai 2007

Cours 6 : Tubes anonymes et nommés

Applications client/serveur TCP/IP - Sockets Rappels. C.Crochepeyre Applications CS 1

1. Fonctionnement de l Internet 2. Protocoles applicatifs 3. Programmation réseau

Initiation à la sécurité

SSTIC Désobfuscation automatique de binaires. Alexandre Gazet. Yoann Guillot. Et autres idyles bucoliques...

REALISATION d'un. ORDONNANCEUR à ECHEANCES

Le système de gestion des fichiers, les entrées/sorties.

DNS Server RPC Interface buffer overflow. Céline COLLUMEAU Nicolas BODIN

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

Temps Réel. Jérôme Pouiller Septembre 2011

Rappels réseaux TCP/IP

03/04/2007. Tâche 1 Tâche 2 Tâche 3. Système Unix. Time sharing

ERESI : une plate-forme d'analyse binaire au niveau noyau. The ERESI team

Cours de Système : Gestion de Fichiers

Session 8: Android File System

Les structures de données. Rajae El Ouazzani

Programmation impérative

SRS DAY: Problématique liée à la virtualisation

Programmation système I Les entrées/sorties

TRAVAUX PRATIQUES Programmation Système Langage C / Système UNIX. 2 e année Génie Informatique

Cahier des charges. driver WIFI pour chipset Ralink RT2571W. sur hardware ARM7

Synchro et Threads Java TM

Exercice sur les Dockers

Introduction aux buffer overflow, CS335

Programmation assembleur : aperçu

L3 informatique Réseaux : Configuration d une interface réseau

Introduction au langage C

Fiche Technique. Cisco Security Agent

Devoir Surveillé de Sécurité des Réseaux

Bases de programmation. Cours 5. Structurer les données

Architecture des ordinateurs

Programmation défensive

White Paper - Livre Blanc

Nouveaux outils de consolidation de la défense périmétrique

Réalisation d un OS 32 bits pour PC(x86)

IV- Comment fonctionne un ordinateur?

Filtrage IP MacOS X, Windows NT/2000/XP et Unix

Cours d Algorithmique-Programmation 2 e partie (IAP2): programmation 24 octobre 2007impérative 1 / 44 et. structures de données simples

TP réseaux 4 : Installation et configuration d'un serveur Web Apache

Archivage Messagerie Evolution pour usage HTML en utilisant Hypermail

Analyse de sécurité de logiciels système par typage statique

Qu'est-ce qu'un processus: Définitions

École Polytechnique de Montréal. Département de Génie Informatique et Génie Logiciel. Cours INF2610. Contrôle périodique.

Centre CPGE TSI - Safi 2010/2011. Algorithmique et programmation :

Dans le chapitre 1, nous associions aux fichiers ouverts des descripteurs de fichiers par lesquels nous accédions aux fichiers.

GlobalScape Secure FTP Server Buffer Overflow

Routeur Chiffrant Navista Version Et le protocole de chiffrement du Réseau Privé Virtuel Navista Tunneling System - NTS Version 3.1.

1/24. I passer d un problème exprimé en français à la réalisation d un. I expressions arithmétiques. I structures de contrôle (tests, boucles)

Débogage de code* Mardi 13 décembre Romaric DAVID Université de Strasbourg - Direction Informatique Pôle HPC. hpc.unistra.

VPN TLS avec OpenVPN. Matthieu Herrb. 14 Mars 2005

Prototype de canal caché dans le DNS

Vulnérabilités et sécurisation des applications Web

Introduction à la Programmation Parallèle: MPI

Manuel de System Monitor

Brefs rappels sur la pile et le tas (Stack. / Heap) et les pointeurs

Cours d Algorithmique et de Langage C v 3.0

Le traitement du temps

LINUX - Sécurité. Déroulé de l'action. - 3 jours - Contenu de formation

Les processus. Système L3, /39

Sécurité des bases de données Nicolas Jombart Alain Thivillon

Conventions d écriture et outils de mise au point

Programmation client-serveur sockets - RPC

Simple Database Monitoring - SDBM Guide de l'usager

Architecture des ordinateurs : Programmation des processeurs avec l'environnement «y86» (INF155)

Les techniques de protection du logiciel

Python Les fondamentaux du langage

Communication inter-processus (IPC) : tubes & sockets. exemples en C et en Java. F. Butelle

Les Audits. 3kernels.free.fr 1 / 10

Création d un «Web Worm»

le minimum pour communiquer par réseau (sans toutefois y comprendre grand chose)

Présentation OpenVZ. Marc SCHAEFER. 9 janvier 2009

Comment configurer Kubuntu

Cours de Programmation Impérative: Zones de mémoires et pointeurs

Anas Abou El Kalam Sécurité SSH SSH

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

Le langage C. Séance n 4

Architecture des ordinateurs

Introduction à l informatique en BCPST

Systèmes d exploitation

FTPS AVEC UNE APPLIANCE FAST360 EN COUPURE. Table des matières

Projet de programmation (IK3) : TP n 1 Correction

Gestion répartie de données - 1

Principales failles de sécurité des applications Web Principes, parades et bonnes pratiques de développement

Transcription:

sous GNU/Linux nicolas.bareil@eads.net EADS Corporate Research Center - DCR/STI/C SSI Lab SSTIC 2006

Il était une fois... Sous UNIX, ptrace() est le seul moyen de debuggage. User-space, Interface rigide et minimaliste, Privilège root non nécessaire, Éléguant ; D après la page de manuel de SunOS ptrace() est unique et mystérieux.

Plan ptrace() Prototype Options non documentées Accès à l espace d adressage 1 ptrace() 2 3

man ptrace ptrace() Prototype Options non documentées Accès à l espace d adressage Prototype #include <sys / ptrace. h> long ptrace (enum ptrace request request, pid t pid, void addr, void data ) ; Trois modes de traçage : Mode pas à pas, Par appel système, Traçage passif;

Actions classiques, documentées Prototype Options non documentées Accès à l espace d adressage Requête PTRACE_TRACEME PTRACE_ATTACH PTRACE_DETACH PTRACE_PEEKTEXT PTRACE_PEEKDATA PTRACE_PEEKUSR PTRACE_POKETEXT PTRACE_POKEDATA PTRACE_POKEUSR PTRACE_GETREGS PTRACE_SETREGS Signification Attachement à un processus Lecture mémoire Écriture mémoire Lecture des registres Écriture des registres

Manipulation des signaux Prototype Options non documentées Accès à l espace d adressage Signaux & ptrace() Un processus tracé est stoppé à la réception de chaque signal. Pour le traçeur, l arrêt semble être dû à un SIGTRAP. L option PTRACE_GETSIGINFO permet d en connaître plus sur la raison de la notification. typedef struct siginfo { int si_signo; /* numéro de signal */ int si_errno; int si_code; /* provenance : user? kernel?*/... } siginfo_t;

Manipulation des signaux Prototype Options non documentées Accès à l espace d adressage Signaux & ptrace() Un processus tracé est stoppé à la réception de chaque signal. Pour le traçeur, l arrêt semble être dû à un SIGTRAP. L option PTRACE_GETSIGINFO permet d en connaître plus sur la raison de la notification. typedef struct siginfo { int si_signo; /* numéro de signal */ int si_errno; int si_code; /* provenance : user? kernel?*/... } siginfo_t;

Manipulation des signaux Prototype Options non documentées Accès à l espace d adressage Signaux & ptrace() Un processus tracé est stoppé à la réception de chaque signal. Pour le traçeur, l arrêt semble être dû à un SIGTRAP. L option PTRACE_GETSIGINFO permet d en connaître plus sur la raison de la notification. typedef struct siginfo { int si_signo; /* numéro de signal */ int si_errno; int si_code; /* provenance : user? kernel?*/... } siginfo_t;

Protection anti-ptrace() Prototype Options non documentées Accès à l espace d adressage int stayalive ; void trapcatch ( int i ) { stayalive = 1; } int main( void ) {... stayalive = 1; signal (SIGTRAP, trapcatch ) ; while ( stayalive ) { stayalive = 0; k i l l ( getpid (), SIGTRAP) ; Anti-ptrace() Protection basée sur le fait qu un debugger classique ne peut pas différencier les signaux envoyés par le noyau ou par l utilisateur. do the work ( ) ; }...

Anti-anti-ptrace() ptrace() Prototype Options non documentées Accès à l espace d adressage Deux moyens de déterminer l origine du SIGTRAP : Manuel, fastidieux, non-portable Mode pas-à-pas? = bit single-step du processeur, Arrêter par point d arrêt matériel? = registres de debuggage ; Dans un appel système? Élégant, portable, classe quoi Utiliser ptrace(ptrace_getsiginfo, pid, NULL, &sig). = sig.si_code == SI_USER?

Prototype Options non documentées Accès à l espace d adressage Options de traçage : suivi des enfants Problème de fork() Solution basique : 1 À l appel à fork(), on surveille le code de retour, = on récupère ainsi le PID du fils 2 On s attache au nouveau processus, 3 On se met à le traçer ; Pwned! Race condition detected! Le scheduler peut laisser le fils exécuter des instructions avant de rendre la main au traceur.

Prototype Options non documentées Accès à l espace d adressage Options de traçage : suivi des enfants Problème de fork() Solution basique : 1 À l appel à fork(), on surveille le code de retour, = on récupère ainsi le PID du fils 2 On s attache au nouveau processus, 3 On se met à le traçer ; Pwned! Race condition detected! Le scheduler peut laisser le fils exécuter des instructions avant de rendre la main au traceur.

Follow me! ptrace() Prototype Options non documentées Accès à l espace d adressage Les options PTRACE_O_TRACEFORK & Co servent à régler ce problème : Attachement automatique au fils, Le noyau met le fils en état STOPPED avant même qu il soit déclaré RUNNABLE. ptrace (PTRACE SETOPTIONS, pid, NULL, PTRACE O TRACESYSGOOD) ;

Accès à l espace d adressage Prototype Options non documentées Accès à l espace d adressage Lecture d un mot mémoire errno = 0; ret = ptrace (PTRACE PEEKTEXT, pid, targetaddr,null) ; i f ( errno && ret == 1) { perror ("ptrace_peektext()" ) ; return 1; } Lecture de plusieurs octets char buf [BUFMAX] ; int fd = open("/proc/pid/mem", O RDONLY) ; pread (fd, buf, BUFMAX, offset ) ;

Accès à l espace d adressage Prototype Options non documentées Accès à l espace d adressage Lecture d un mot mémoire errno = 0; ret = ptrace (PTRACE PEEKTEXT, pid, targetaddr,null) ; i f ( errno && ret == 1) { perror ("ptrace_peektext()" ) ; return 1; } Lecture de plusieurs octets char buf [BUFMAX] ; int fd = open("/proc/pid/mem", O RDONLY) ; pread (fd, buf, BUFMAX, offset ) ;

Plan ptrace() Où placer les instructions? Interruption d appel système 1 ptrace() 2 3

Où injecter les instructions? Où placer les instructions? Interruption d appel système Objectifs Discrétion, Stabilité, Portabilité ; Les candidats sont : La pile, Padding des sections ELF, N importe où;

Injection n importe où ptrace() Où placer les instructions? Interruption d appel système On écrit directement sur les instructions pointées par eip. 1 Sauvegarde des octets d eip, 2 Écrasement par nos instructions, 3 Redémarrage du processus (PTRACE_CONT), 4 Restauration des anciennes instructions; Papa, réveille toi! k i l l (SIGTRAP, getpid ( ) ) ;

Injection n importe où ptrace() Où placer les instructions? Interruption d appel système On écrit directement sur les instructions pointées par eip. 1 Sauvegarde des octets d eip, 2 Écrasement par nos instructions, 3 Redémarrage du processus (PTRACE_CONT), 4 Restauration des anciennes instructions; Papa, réveille toi! k i l l (SIGTRAP, getpid ( ) ) ;

Injection dans la pile ptrace() Où placer les instructions? Interruption d appel système esp eip...... ret esp eip mov ebx, 1 add eax, 4 cmp eax, 42 mov ebx, 1 add eax, 4 cmp eax, 42 Code injecté Fig.: Avant l injection Fig.: Après injection

Injection dans la pile ptrace() Où placer les instructions? Interruption d appel système old eip...... ret eip eip est sauvegardé sur la pile, eip pointe sur *esp, Le shellcode se termine par un return = Retour aux instructions normales ; mov ebx, 1 add eax, 4 cmp eax, 42 Précautions = La pile doit être exécutable! Code injecté

Interruption d un appel système Où placer les instructions? Interruption d appel système L injection de code dans un processus interrompu dans un appel système peut poser des problèmes en fonction de leurs natures : Non-interruptibles, Interruptibles, pour les appels système lent Redémarrable manuellement (code de retour égal à EINT), Redémarrable automatiquement par le noyau ; Sh*t happens... Le redémarrage automatique est le cas le plus problématique car l injecteur n a aucun contrôle sur le noyau. = Décrémentation d eip de 2 octets.

Interruption d un appel système Où placer les instructions? Interruption d appel système L injection de code dans un processus interrompu dans un appel système peut poser des problèmes en fonction de leurs natures : Non-interruptibles, Interruptibles, pour les appels système lent Redémarrable manuellement (code de retour égal à EINT), Redémarrable automatiquement par le noyau ; Sh*t happens... Le redémarrage automatique est le cas le plus problématique car l injecteur n a aucun contrôle sur le noyau. = Décrémentation d eip de 2 octets.

Où placer les instructions? Interruption d appel système Shellcode : Le bon, la brute et le truand Le truand Toujours précéder votre shellcode de deux octets inertes (NOP) et faire pointer eip sur &(shellcode+2). La brute Faire les mêmes vérifications que le noyau avant d injecter. = Vérifier orig eax et eax. Le bon Utiliser l option adéquate de ptrace() : PTRACE_O_SYSGOOD.

Oasis is good! ptrace() Où placer les instructions? Interruption d appel système man PTRACE O TRACESYSGOOD L option PTRACE_O_SYSGOOD modifie si_code de la structure siginfo_t pour indiquer l interruption d un appel système. ptrace (PTRACE SETOPTIONS, pid, NULL, PTRACE O TRACESYSGOOD) ;... siginfo t sig ; ptrace (PTRACE GETSIGINFO, pid, NULL, &sig ) ; i f ( sig. si code & 0x80) printf ("was in a syscall\n" ) ;

Plan ptrace() Côté clair de la force Côté obscur de la force Cas pratique : Contournement de firewall 1 ptrace() 2 3

Technique de l oracle & Skype Côté clair de la force Côté obscur de la force Cas pratique : Contournement de firewall Oracle Jetez une question dans un puits et la réponse est renvoyée. Téléphone compatible Skype? Le chiffrement des paquets est réalisé par une fonction trop compliquée à reverser? Plutôt que de réécrire la fonction, utilisez la! À l aide de ptrace(), manipulez eip afin de n exécuter que la fonction de chiffrement. = Au retour de la routine, vous avez la réponse! Voir présentation de P. Biondi & F. Desclaux à BlackHatEurope06.

Protection anti-reverse engineering Côté clair de la force Côté obscur de la force Cas pratique : Contournement de firewall Première protection anti-debugging? Un processus ne peut-être traçé que par un seul debugger à la fois. Auto-traçage pour empêcher tout attachement ultérieur Réponse des analystes Émulation de l appel à ptrace() pour qu il n échoue jamais. Réponse à la réponse des analystes Lancement de deux processus qui se traçent mutuellement avec un dialogue permanent pour s assurer de la survie de l autre.

Protection anti-reverse engineering Côté clair de la force Côté obscur de la force Cas pratique : Contournement de firewall Première protection anti-debugging? Un processus ne peut-être traçé que par un seul debugger à la fois. Auto-traçage pour empêcher tout attachement ultérieur Réponse des analystes Émulation de l appel à ptrace() pour qu il n échoue jamais. Réponse à la réponse des analystes Lancement de deux processus qui se traçent mutuellement avec un dialogue permanent pour s assurer de la survie de l autre.

Protection anti-reverse engineering Côté clair de la force Côté obscur de la force Cas pratique : Contournement de firewall Première protection anti-debugging? Un processus ne peut-être traçé que par un seul debugger à la fois. Auto-traçage pour empêcher tout attachement ultérieur Réponse des analystes Émulation de l appel à ptrace() pour qu il n échoue jamais. Réponse à la réponse des analystes Lancement de deux processus qui se traçent mutuellement avec un dialogue permanent pour s assurer de la survie de l autre.

Évasion d environnement chrooté Côté clair de la force Côté obscur de la force Cas pratique : Contournement de firewall ch[ouc]root? Simple restriction de la racine du système de fichier d un processus. Contact extérieur possible : mémoire partagée, signaux... Pwned! Si on peut envoyer des signaux à des processus, on peut les traçer! = Injection d un shellcode permettant de s évader de la cage. Si /proc n est pas disponible, le bruteforcage de tous les PID est nécessaire.

Évasion d environnement chrooté Côté clair de la force Côté obscur de la force Cas pratique : Contournement de firewall ch[ouc]root? Simple restriction de la racine du système de fichier d un processus. Contact extérieur possible : mémoire partagée, signaux... Pwned! Si on peut envoyer des signaux à des processus, on peut les traçer! = Injection d un shellcode permettant de s évader de la cage. Si /proc n est pas disponible, le bruteforcage de tous les PID est nécessaire.

Évasion d environnement chrooté Côté clair de la force Côté obscur de la force Cas pratique : Contournement de firewall ch[ouc]root? Simple restriction de la racine du système de fichier d un processus. Contact extérieur possible : mémoire partagée, signaux... Pwned! Si on peut envoyer des signaux à des processus, on peut les traçer! = Injection d un shellcode permettant de s évader de la cage. Si /proc n est pas disponible, le bruteforcage de tous les PID est nécessaire.

Firewall applicatif ptrace() Côté clair de la force Côté obscur de la force Cas pratique : Contournement de firewall Définition ACLs basées sur l application. = Application autorisée == tremplin Objectifs d un programme malicieux : Injection d un connect() dans Mozilla, Récupération du descripteur de fichier, Transfert du descripteur de fichier au processus malicieux;

Côté clair de la force Côté obscur de la force Cas pratique : Contournement de firewall Processus malicieux Mozilla

Côté clair de la force Côté obscur de la force Cas pratique : Contournement de firewall connect() Processus malicieux Mozilla

Côté clair de la force Côté obscur de la force Cas pratique : Contournement de firewall connect() Transfert du descripteur de fichier Processus malicieux Mozilla

Côté clair de la force Côté obscur de la force Cas pratique : Contournement de firewall connect() Transfert du descripteur de fichier read() / write() Processus malicieux Mozilla

Contrainte ptrace() Côté clair de la force Côté obscur de la force Cas pratique : Contournement de firewall Figure de style imposée Réussir à faire passer toutes les applications à travers ce tunnel. Interception des bibliothèques dynamiques $ LD PRELOAD="/ home/ moi/ lib/ liberte. so" $ export LD PRELOAD $ wget http :// slashdot. org/

Surchage de connect() Côté clair de la force Côté obscur de la force Cas pratique : Contournement de firewall int connect ( int sockfd, struct sockaddr serv addr, socklen t addrlen ) { pid t pid = atoi ( getenv ("PTRACE_PWNED" ) ) ; socket (PF UNIX, SOCK STREAM, 0);... i f ( fork () == 0) { inject shellcode ( pid, serv addr ) ; exit ( 0 ) ; }... fd = receive fd ( unixfd ) ; dup2(fd, sockfd ) ; } return sockfd ;

Fonctionnalitée méconnue Côté clair de la force Côté obscur de la force Cas pratique : Contournement de firewall Transfert de descripteur de fichier Il est possible de transmettre un descripteur de fichier entre deux processus indépendants à travers une socket UNIX. struct cmsghdr ch ; struct msghdr msg; char ancillary [CMSG SPACE( sizeof ( fd ) ) ] ; ch = CMSG FIRSTHDR(&msg ) ; ch >cmsg level = SOL SOCKET; ch >cmsg type = SCM RIGHTS; ( int ) CMSG DATA(ch) = fd ; sendmsg( sockfd, &msg, 0);

Shellcode ptrace() Côté clair de la force Côté obscur de la force Cas pratique : Contournement de firewall Le shellcode : 1 Créé une socket UNIX vers le traceur, 2 Initie la connexion vers le serveur désiré, 3 Et envoie le descripteur de fichier. Ne gère pas encore l UDP.

Conclusion ptrace() Côté clair de la force Côté obscur de la force Cas pratique : Contournement de firewall ptrace() et ses limites Fonctions limitées, Portabilité impossible, Bugs historiques; L avenir L avenir se tourne vers les dtrace-like? Solution complétement kernel-space, Haut niveau, Scriptable ;

Des questions? ptrace() Côté clair de la force Côté obscur de la force Cas pratique : Contournement de firewall Merci de votre attention! Des questions?