ptrace() Injection de code Applications pratiques Playing with ptrace() for fun and profit Injection de code sous GNU/Linux Nicolas Bareil nicolas.bareil@eads.net EADS Corporate Research Center - DCR/STI/C SSI Lab SSTIC 2006 Nicolas Bareil Playing with ptrace() for fun and profit
ptrace() Injection de code Applications pratiques Il ´ etait une fois. . . Sous UNIX, ptrace() est le seul moyen de debuggage. User-space, Interface rigide et minimaliste, Privil` ege root non n´ ecessaire, ´ El´ eguant ; D’apr` es la page de manuel de SunOS ptrace() est unique et myst´ erieux. Nicolas Bareil Playing with ptrace() for fun and profit
ptrace() Prototype Injection de code Options non document´ ees Applications pratiques Acc` es ` a l’espace d’adressage Plan ptrace() 1 Injection de code 2 Applications pratiques 3 Nicolas Bareil Playing with ptrace() for fun and profit
ptrace() Prototype Injection de code Options non document´ ees Applications pratiques Acc` es ` a l’espace d’adressage man ptrace Prototype #include < sys / ptrace . h > long ptrace ( enum ptrace request request , pid t pid , void ∗ addr , void ∗ data ) ; Trois modes de tra¸ cage : Mode pas ` a pas, Par appel syst` eme, Tra¸ cage passif ; Nicolas Bareil Playing with ptrace() for fun and profit
ptrace() Prototype Injection de code Options non document´ ees Applications pratiques Acc` es ` a l’espace d’adressage Actions classiques, document´ ees Requˆ ete Signification PTRACE_TRACEME Attachement ` a un processus PTRACE_ATTACH PTRACE_DETACH PTRACE_PEEKTEXT Lecture m´ emoire PTRACE_PEEKDATA PTRACE_PEEKUSR PTRACE_POKETEXT ´ Ecriture m´ emoire PTRACE_POKEDATA PTRACE_POKEUSR Lecture des registres PTRACE_GETREGS ´ PTRACE_SETREGS Ecriture des registres Nicolas Bareil Playing with ptrace() for fun and profit
ptrace() Prototype Injection de code Options non document´ ees Applications pratiques Acc` es ` a l’espace d’adressage Manipulation des signaux Signaux & ptrace() Un processus trac´ e est stopp´ e ` a la r´ eception de chaque signal. Pour le tra¸ ceur, l’arrˆ et semble ˆ etre dˆ u ` a 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´ ero de signal */ int si_errno ; int si_code ; /* provenance : user ? kernel ?*/ ... } siginfo_t ; Nicolas Bareil Playing with ptrace() for fun and profit
ptrace() Prototype Injection de code Options non document´ ees Applications pratiques Acc` es ` a l’espace d’adressage Manipulation des signaux Signaux & ptrace() Un processus trac´ e est stopp´ e ` a la r´ eception de chaque signal. Pour le tra¸ ceur, l’arrˆ et semble ˆ etre dˆ u ` a 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´ ero de signal */ int si_errno ; int si_code ; /* provenance : user ? kernel ?*/ ... } siginfo_t ; Nicolas Bareil Playing with ptrace() for fun and profit
ptrace() Prototype Injection de code Options non document´ ees Applications pratiques Acc` es ` a l’espace d’adressage Manipulation des signaux Signaux & ptrace() Un processus trac´ e est stopp´ e ` a la r´ eception de chaque signal. Pour le tra¸ ceur, l’arrˆ et semble ˆ etre dˆ u ` a 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´ ero de signal */ int si_errno ; int si_code ; /* provenance : user ? kernel ?*/ ... } siginfo_t ; Nicolas Bareil Playing with ptrace() for fun and profit
ptrace() Prototype Injection de code Options non document´ ees Applications pratiques Acc` es ` a l’espace d’adressage Protection anti- ptrace() int s tayal i ve ; void trapcatch ( int i ) { s tayal i ve = 1; } int main ( void ) { Anti- ptrace() . . . Protection bas´ ee sur le fait s tayal i ve = 1; qu’un debugger classique signal ( SIGTRAP , trapcatch ) ; ne peut pas diff´ erencier les signaux envoy´ es par le while ( s tayal i ve ) { s tayal i ve = 0; noyau ou par l’utilisateur. k i l l ( getpid () , SIGTRAP ) ; do the work ( ) ; } . . . Nicolas Bareil Playing with ptrace() for fun and profit
ptrace() Prototype Injection de code Options non document´ ees Applications pratiques Acc` es ` a l’espace d’adressage Anti-anti- ptrace() Deux moyens de d´ eterminer l’origine du SIGTRAP : Manuel, fastidieux, non-portable Mode pas-` a-pas ? = ⇒ bit single-step du processeur, Arrˆ eter par point d’arrˆ et mat´ eriel ? = ⇒ registres de debuggage ; Dans un appel syst` eme ? ´ El´ egant, portable, classe quoi Utiliser ptrace(PTRACE_GETSIGINFO, pid, NULL, &sig) . = ⇒ sig.si_code == SI_USER ? Nicolas Bareil Playing with ptrace() for fun and profit
ptrace() Prototype Injection de code Options non document´ ees Applications pratiques Acc` es ` a l’espace d’adressage Options de tra¸ cage : suivi des enfants Probl` eme de fork() Solution basique : ` A l’appel ` a fork() , on surveille le code de retour, 1 = ⇒ on r´ ecup` ere ainsi le PID du fils 2 On s’attache au nouveau processus, 3 On se met ` a le tra¸ cer ; Pwned ! Race condition detected ! Le scheduler peut laisser le fils ex´ ecuter des instructions avant de rendre la main au traceur. Nicolas Bareil Playing with ptrace() for fun and profit
ptrace() Prototype Injection de code Options non document´ ees Applications pratiques Acc` es ` a l’espace d’adressage Options de tra¸ cage : suivi des enfants Probl` eme de fork() Solution basique : ` A l’appel ` a fork() , on surveille le code de retour, 1 = ⇒ on r´ ecup` ere ainsi le PID du fils 2 On s’attache au nouveau processus, 3 On se met ` a le tra¸ cer ; Pwned ! Race condition detected ! Le scheduler peut laisser le fils ex´ ecuter des instructions avant de rendre la main au traceur. Nicolas Bareil Playing with ptrace() for fun and profit
ptrace() Prototype Injection de code Options non document´ ees Applications pratiques Acc` es ` a l’espace d’adressage Follow me ! Les options PTRACE_O_TRACEFORK & Co servent ` a r´ egler ce probl` eme : Attachement automatique au fils, Le noyau met le fils en ´ etat STOPPED avant mˆ eme qu’il soit d´ eclar´ e RUNNABLE . ptrace ( PTRACE SETOPTIONS , pid , NULL , PTRACE O TRACESYSGOOD ) ; Nicolas Bareil Playing with ptrace() for fun and profit
ptrace() Prototype Injection de code Options non document´ ees Applications pratiques Acc` es ` a l’espace d’adressage Acc` es ` a l’espace d’adressage Lecture d’un mot m´ emoire 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 ) ; Nicolas Bareil Playing with ptrace() for fun and profit
ptrace() Prototype Injection de code Options non document´ ees Applications pratiques Acc` es ` a l’espace d’adressage Acc` es ` a l’espace d’adressage Lecture d’un mot m´ emoire 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 ) ; Nicolas Bareil Playing with ptrace() for fun and profit
ptrace() O` u placer les instructions ? Injection de code Interruption d’appel syst` eme Applications pratiques Plan ptrace() 1 Injection de code 2 Applications pratiques 3 Nicolas Bareil Playing with ptrace() for fun and profit
ptrace() O` u placer les instructions ? Injection de code Interruption d’appel syst` eme Applications pratiques O` u injecter les instructions ? Objectifs Discr´ etion, Stabilit´ e, Portabilit´ e ; Les candidats sont : La pile, Padding des sections ELF, N’importe o` u ; Nicolas Bareil Playing with ptrace() for fun and profit
ptrace() O` u placer les instructions ? Injection de code Interruption d’appel syst` eme Applications pratiques Injection n’importe o` u On ´ ecrit directement sur les instructions point´ ees par eip . 1 Sauvegarde des octets d’ eip , ´ Ecrasement par nos instructions, 2 3 Red´ emarrage du processus ( PTRACE_CONT ), 4 Restauration des anciennes instructions ; Papa, r´ eveille toi ! k i l l ( SIGTRAP , getpid ( ) ) ; Nicolas Bareil Playing with ptrace() for fun and profit
ptrace() O` u placer les instructions ? Injection de code Interruption d’appel syst` eme Applications pratiques Injection n’importe o` u On ´ ecrit directement sur les instructions point´ ees par eip . 1 Sauvegarde des octets d’ eip , ´ Ecrasement par nos instructions, 2 3 Red´ emarrage du processus ( PTRACE_CONT ), 4 Restauration des anciennes instructions ; Papa, r´ eveille toi ! k i l l ( SIGTRAP , getpid ( ) ) ; Nicolas Bareil Playing with ptrace() for fun and profit
Recommend
More recommend