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

Documents pareils