Reverse Engineering sur plateforme libre
Transcription
Reverse Engineering sur plateforme libre
Introduction Monitoring Dynamique Statique Conclusion Reverse Engineering sur plateforme libre @r00tbsd - Paul Rascagneres malware.lu 09 Juillet 2012 @r00tbsd - Paul Rascagneres Reverse Engineering Introduction Monitoring Dynamique Statique Conclusion Plan 1 Introduction 2 Monitoring 3 Dynamique 4 Statique 5 Conclusion @r00tbsd - Paul Rascagneres Reverse Engineering Introduction Monitoring Dynamique Statique Conclusion Malware.lu Présentation du projet malware.lu. Liste des mainteneurs : @r00tbsd - Paul Rascagneres (moi) @y0ug - Hugo Caron @r00tbsd - Paul Rascagneres Reverse Engineering Introduction Monitoring Dynamique Statique Conclusion Some numbers Le projet en quelques chiffres: 1 197 405 Samples 20 articles 700 utilisateurs 659 followers sur twitter (@malwarelu) @r00tbsd - Paul Rascagneres Reverse Engineering Introduction Monitoring Dynamique Statique Conclusion Introduction But de la presentation: décrire les outils et fonctionnalités libres permettant d’analyser le fonctionnement interne du programme démontrer que le reverse peut être accessible le fun !! @r00tbsd - Paul Rascagneres Reverse Engineering Introduction Monitoring Dynamique Statique Conclusion Article de loi Extrait du nouvel article Art. L. 335-3-1 introduit l’article 22 du DADVSI : I. - Est puni de 3 750 EUR d’amende le fait de porter atteinte sciemment, à des fins autres que la recherche, à une mesure technique effica ce telle que définie à l’article L. 331-5, afin d’altérer la protection d’une œuvre par un décodage, un décryptage ou toute autre intervention personnelle destinée à contourner, neutraliser ou supprimer un mécanisme de protection ou de contrôle, (...) II. - Est puni de six mois d’emprisonnement et de 30 000 EUR d’amende le fait de procurer ou proposer sciemment à autrui, directement ou in directement, des moyens conçus ou spécialement adaptés pour porter atteinte à une mesure technique efficace (...) IV. - Ces dispositions ne sont pas applicables aux actes réalisés à des fins de recherche (...) ou de sécurité informatique, dans les limit es des droits prévus par le présent code. @r00tbsd - Paul Rascagneres Reverse Engineering Introduction Monitoring Dynamique Statique Conclusion ltrace & strace Ces deux outils sont des outils de debugage permettant de surveiller les appels système. 1 2 3 4 5 6 7 8 9 10 11 12 13 r o o t b s d @ a l i e n : ˜ $ l t r a c e i d | more l i b c s t a r t m a i n ( 0 x8049210 , 1 , 0 x b f d f b d 3 4 , 0 x804bf60 , 0 x 8 0 4 b f c 0 <u n f i n i s h e d . . . > i s s e l i n u x e n a b l e d ( 0 , 0 x5f85a76 d , 0 x 9 f 8 1 c 2 5 5 , 0 , 4096) = 0 s t r rc h r (” id ” , ’/ ’) = NULL s e t l o c a l e ( 6 , ”” ) = ” en US . UTF−8” bi ndte xtdomai n ( ” c o r e u t i l s ” , ”/ usr / share / l o c a l e ” ) = ”/ u s r / s h a r e / l o c a l e ” textdomain ( ” c o r e u t i l s ” ) = ” coreutils ” c x a a t e x i t ( 0 x804a710 , 0 , 0 , 0 x b f d f b d 3 4 , 0 x b f d f b c 9 8 ) = 0 g e t o p t l o n g ( 1 , 0 x b f d f b d 3 4 , ” agnruGZ ” , 0 x0804c 720 , NULL ) = −1 geteuid () = 1000 getuid () = 1000 getegid () = 1000 getgid () = 1000 ltrace @r00tbsd - Paul Rascagneres Reverse Engineering Introduction Monitoring Dynamique Statique Conclusion ltrace & strace Second exemple permettant de limiter seulement à un appel système précis 1 r o o t b s d @ a l i e n : ˜ $ l t r a c e −e s t r l e n 2 strlen (”. ”) 3 s t r l e n ( ” Confe re nc e . pdf ” ) 4 s t r l e n ( ” C o n f e r e n c e . nav ” ) 5 s t r l e n ( ” C o n f e r e n c e . ps ” ) 6 strlen (” ltrace ”) 7 s t r l e n ( ” png2e ps ” ) ls = = = = = = 1 14 14 13 6 7 ltrace2 @r00tbsd - Paul Rascagneres Reverse Engineering Introduction Monitoring Dynamique Statique Conclusion ptrace ptrace() est un appel système dont l’objectif est de debugger des programmes. Son fonctionnement est le suivant: ptrace() s’attache à un processus si les droits sont bons, le traceur devient le père du processus le parent peut prendre le controle du fils à la demande 1 #i n c l u d e <s y s / p t r a c e . h> 2 l o n g p t r a c e ( enum ptrace request request \ 3 , p i d t p i d , v o i d ∗addr , v o i d ∗ d a t a ) ; ptrace @r00tbsd - Paul Rascagneres Reverse Engineering Introduction Monitoring Dynamique Statique Conclusion ptrace Exemple d’utilisation: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 #i n c l u d e #i n c l u d e #i n c l u d e #i n c l u d e #i n c l u d e <s y s / p t r a c e . h> <s y s / t y p e s . h> <s y s / w a i t . h> <u n i s t d . h> <s y s / r e g . h> i n t main ( ) { pid t child ; long o r ig ea x ; child = fork ( ); i f ( c h i l d == 0) { p t r a c e (PTRACE TRACEME , 0 , NULL , NULL ) ; e x e c l ( ” / b i n / l s ” , ” l s ” , NULL ) ; } else { w a i t (NULL ) ; o r i g e a x = p t r a c e (PTRACE PEEKUSER , c h i l d , 4 ∗ ORIG EAX , NULL ) ; p r i n t f ( ”The c h i l d made a ” ” s y s t e m c a l l %l d \n ” , o r i g e a x ) ; p t r a c e (PTRACE CONT , c h i l d , NULL , NULL ) ; } return 0; } example.c @r00tbsd - Paul Rascagneres Reverse Engineering Introduction Monitoring Dynamique Statique Conclusion ptrace 1 r o o t b s d @ a l i e n : ˜ $ . / e xam pl e 2 The c h i l d made a s y s t e m c a l l 11 example L’appel système 11 est execve(). Cet outil a été utilisé pour reverser Skype et créer skypy. Afin de bypasser des checksum interne à Skype. @r00tbsd - Paul Rascagneres Reverse Engineering Introduction Monitoring Dynamique Statique Conclusion LD PRELOAD LD PRELOAD est un variable particulière sous Linux, elle permet de paramétrer un chemin vers une librarie qui sera utilisée en priorité. @r00tbsd - Paul Rascagneres Reverse Engineering Introduction Monitoring Dynamique Statique Conclusion LD PRELOAD Exemple d’utilisation: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 # cat s o f t . c #i n c l u d e <s t d i o . h> i n t main ( ) { p r i n t f ( ” p i d : %u\n” , g e t p i d ( ) ) ; return (0); } # gc c s o f t . c −o s o f t # ./ s oft p i d : 43562 # cat getpid . c #i n c l u d e <s y s / s y s c a l l . h> #i n c l u d e <s y s / t y p e s . h> #i n c l u d e <u n i s t d . h> #i n c l u d e <s t d i o . h> p i d t getpid ( void ) { p r i n t f ( ” H e l l o World ! \ n ” ) ; r e t u r n s y s c a l l ( SYS getpid ) ; } # gc c −f P I C −s h a r e d −o g e t p i d . s o g e t p i d . c # e x p o r t LD PRELOAD=./ g e t p i d . s o # ./ s oft H e l l o World ! p i d : 44834 @r00tbsd - Paul Rascagneres Reverse Engineering Introduction Monitoring Dynamique Statique Conclusion SystemTap SystemTap est un outil d’intrumentation de code dynamique developpé par Red Hat. Basé sur un système de sonde au niveau kernel. Exemple d’un script permettant de lister les connexions entrantes: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 #! / u s r / b i n / e nv s t a p probe be gi n { p r i n t f ( ”%6s %16s %6s %6s %16s \n ” , ”UID” , ”CMD” , ”PID ” , ”PORT” , ”IP SOURCE ” ) } probe k e r n e l . f u n c t i o n ( ” t c p a c c e p t ” ) . r e t u r n ? , kernel . function (” inet csk accept ” ). return ? { sock = $ r e t u r n i f ( s o c k != 0) p r i n t f ( ”%6d %16 s %6d %6d %16s \n ” , u i d ( ) , e xe c nam e ( ) , p i d ( ) , i n e t g e t l o c a l p o r t ( sock ) , i n e t g e t i p s o u r c e ( sock ) ) } stap @r00tbsd - Paul Rascagneres Reverse Engineering Introduction Monitoring Dynamique Statique Conclusion Analyse réseau Généralement bien connus de tous, des outils tel que tcpdump, ethereal ou wireshark permettent de faire des captures réseaux. Ces outils sont également à classer avec les outils de monitoring de processus permettant des analyses de reverse. @r00tbsd - Paul Rascagneres Reverse Engineering Introduction Monitoring Dynamique Statique Conclusion Analyse des dumps memoire Les images mémoires peuvent être utilisé pour analyser le fonctionnement d’un binaire a un instant donné. Pour faire les dumps nous pouvons utiliser VirtualBox. 1 r o o t b s d @ ˜ $ V i r t u a l B o x −−dbg −−s t a r t v m <VM name> 2 3 . pgmphystofile filename VirtualBox @r00tbsd - Paul Rascagneres Reverse Engineering Introduction Monitoring Dynamique Statique Conclusion Analyse des dumps memoire Pour faire l’analyse il existe deux outils volatility (pour l’analyse de dump Windows) et volatility (pour Linux). Demo @r00tbsd - Paul Rascagneres Reverse Engineering Introduction Monitoring Dynamique Statique Conclusion ATTENTION Jusqu’a présent nous avons évité d’évoquer de l’ASM... La suite des slides pourrait heurter la sensibilité des anti-ASM. @r00tbsd - Paul Rascagneres Reverse Engineering Introduction Monitoring Dynamique Statique Conclusion Reverse dynamique L’analyse dynamique consiste à auditer le programme pendant son fonctionnement ou à utiliser les fonctions que celui-ci fournit. Nous allons voir 4 méthodes: Sandbox via Cuckoo gdb & winegdb VirtualBox & gdb ripper metasm @r00tbsd - Paul Rascagneres Reverse Engineering Introduction Monitoring Dynamique Statique Conclusion Sandbox via Cuckoo Le principe des sandboxes (ou bac a sable) est de créer un environnement virtuel où faire tourner l’application pour logguer son fonctionnement. Ce type de produit est très courant dans l’analyse de malware. En effet il est pas souhaitable de faire tourner des logiciels à riques sur sa machine. Il existe une sandbox libre appelée cuckoo. Cuckoo utilise virtualbox pour gérer son environnement virtuel. @r00tbsd - Paul Rascagneres Reverse Engineering Introduction Monitoring Dynamique Statique Conclusion Sandbox via Cuckoo Demo @r00tbsd - Paul Rascagneres Reverse Engineering Introduction Monitoring Dynamique Statique Conclusion gdb & winegdb Ces deux outils sont des debuggers. Ils permettent de voir l’etat des registres ainsi que le cas assembleur en cours d’execution. Ces outils permettent l’execution des programmes instructions apres instruction. @r00tbsd - Paul Rascagneres Reverse Engineering Introduction Monitoring Dynamique Statique Conclusion gdb & winegdb gdb cheat sheet help : list gdb commands info break : list breakpoints info registers : liste registers value break [function—address] : add a breakpoint disas : show asm continue : continue executinf until next breakpoint stepi : Step to next instruction (will step into function) nexti : Execute next instruction (will NOT enter function) @r00tbsd - Paul Rascagneres Reverse Engineering Introduction Monitoring Dynamique Statique Conclusion gdb & winegdb Demo @r00tbsd - Paul Rascagneres Reverse Engineering Introduction Monitoring Dynamique Statique Conclusion VirtualBox & gdb Lors de reverse d’application Windows, il est parfois nécessaire d’utiliser l’OS Windows, l’émulation ne suffit pas. Pour illustrer notre exemple, nous allons utiliser le malware Flame. Dispo a cette adresse: http://www.malware.lu/_download.php?hash=bdc9e04388bda8527b398a8c34667e18 @r00tbsd - Paul Rascagneres Reverse Engineering Introduction Monitoring Dynamique Statique Conclusion VirtualBox & gdb Le principe est le suivant: nous allons lancer VirtualBox avec comme OS guest Windows. Dans cet OS nous installons cygwin et gdb serveur. Nous lancons le malware avec gdb serveur. Depuis la machine maitre, nous nous connectons à distance à la machine virtuelle. L’interet de cette méthode est de pouvoir scripter notre analyse via le support python de gdb. @r00tbsd - Paul Rascagneres Reverse Engineering Introduction Monitoring Dynamique Statique Conclusion VirtualBox & gdb Flame a une fonction d’obfuscation des chaines de caractère: 0x1000E431. Il nous est facile d’identifier les chaines de caractere qui sont envoyées à cette fonction (via un script python et distorm3). Une fois cette liste récuperée, nous pouvons utiliser le malware lui-même via gdb pour les décoder. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 use r@m al ware −l u ˜ $ g d b s e r v e r . e x e h o s t : 1 2 3 4 bdc 9e 04388 b da 8 5 2 7 b 39 8 a 8 c 3 4 66 7 e 1 8 P r o c e s s / c y g d r i v e / c / bdc 9e 04388b d a 8 5 27 b 3 9 8 a 8c 3 4 6 6 7 e 1 8 c r e a t e d ; p i d = 732 L i s t e n i n g on p o r t 1234 use r@m al ware −l u ˜ $ gdb ( gdb ) t a r g e t re m ote 1 9 2 . 1 6 8 . 5 6 . 1 0 1 : 1 2 3 4 Remote d e b u g g i n g u s i n g 1 9 2 . 1 6 8 . 5 6 . 1 0 1 : 1 2 3 4 0 x7c91120f i n ?? ( ) ( gdb ) s o u r c e s c r i p t / g d b f l a m e d e c o d e 1 . py ( gdb ) f l a m e D e c o d e 1 B r e a k p o i n t 1 a t 0 x1000e 442 B r e a k p o i n t 2 a t 0 x1000e 476 ( gdb ) s h e l l he ad r e s u l t D e c o d e 1 . t x t 0 x10256c 54 vsmon . e x e 0 x10256c 74 z l c l i e n t . e x e 0 x10256c 98 ProductName 0 x10256c b8 ZoneAlarm 0 x10256c d8 vsmon . e x e 0 x10256cf8 z l c l i e n t . exe @r00tbsd - Paul Rascagneres Reverse Engineering Introduction Monitoring Dynamique Statique Conclusion Ripper metasm Malware.lu a developpé un outil permettant de ripper du code basé sur le framework metasm. Metasm est un framework ruby destiné a la manipulation de ficher executable binaire. Il permet la compilation de fichiers sources, le désassemblage, le debuggage ou encore l’analyse de shellcode. @r00tbsd - Paul Rascagneres Reverse Engineering Introduction Monitoring Dynamique Statique Conclusion Ripper metasm Nous avons utiliser ce framework afin de pouvoir ripper directement du code sans comprendre l’ASM mais uniquement le prototype. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 #! / u s r / b i n / e nv r u b y # i n c l u d e t h e m agi c r i p p e r r e q u i r e ” r i p p e r . rb ” # a l o o p t o g e t e ac h e nc ode d s t r i n g f o r a i n [ 0 x1AE88 , 0x1AEF0 , 0 x1AF54 , 0x1AF88 , 0x1AFEC , 0 x1B020 , 0 x1B084 ] s r c F i l e = F i l e . open (ARGV [ 0 ] , ’ r ’ ) s r c F i l e . s e e k ( a , IO : : SEEK SET ) s t r i n g = s r c F i l e . s y s r e a d ( 0 x20 ) # ARGV [ 0 ] i n t h e b i n a r y t o r i p # 0 x403034 i s t h e a d r e s s o f t h e f u n c t i o n u s e t o d e c o d e s t r i n g # ” unsi gne d i n t decode ( ) ; ” i s the prototype of the f u n c t i o n decode ( ) # e ac h [ ] , [ ] , [ ] , [ ] a r e n o t u s e d i n t h i s e xam pl e # s t r i n g c o n t a i n t h e e nc ode d s t r i n g and must be s t o r e i n e c x s p e c s = [ Spe c . new (ARGV [ 0 ] , 0 x403034 , ” u n s i g n e d i n t d e c o d e ( ) ; ” , [ ] , [ ] , \ [] , [] , string )] w o r k e r = R i p p e r . new ( s p e c s ) worker . runne r . decode ( ) puts s t r i n g end to rip.rb @r00tbsd - Paul Rascagneres Reverse Engineering Introduction Monitoring Dynamique Statique Conclusion Ripper metasm L’execution dans le cas d’un botnet (herpesnet). 1 2 3 4 5 6 7 8 9 10 11 12 rootbsd@malware . l u$ . / decode . rb db6779d497cb5e22697106e26eebfaa8 gpresultl h t t p : / / dd . z e r o x c o d e . n e t / h e r p n e t / 74978 b 6 e c c 6 c 1 9 8 3 6 a 1 7 a 3 c 2 c d 0 8 4 0 b 0 h t t p : / /www. z e r o x c o d e . n e t / h e r p n e t f t p . ze roxc ode . net h t t p : / / f r k 7 . mine . nu / h e r p n e t / upload@zeroxcode . net uppit hwfqfqooatstwuuhhtstshwq esstttubbb Nfusheapfzk to rip.bash @r00tbsd - Paul Rascagneres Reverse Engineering Introduction Monitoring Dynamique Statique Conclusion L’analyse statique consiste a analyser le code assembleur par simple ”lecture”. Metasm est egalement très efficace pour de l’analyse statique. Demo @r00tbsd - Paul Rascagneres Reverse Engineering Introduction Monitoring Dynamique Statique Conclusion Cette conférence a pour but de montrer les solutions open source qui permettent de faire du reverse engineering. Cette discipline mal aimée est souvent nécessaire pour diverses raisons comme rendre les choses interopérables mais egalement dans l’analyse de logiciels malveillants. L’analyse peut aller de l’utilisation simple d’outil tout fait et grand public qu’a des sessions de reverse d’ASM durant des jours ;). @r00tbsd - Paul Rascagneres Reverse Engineering