View
24
Download
0
Category
Preview:
DESCRIPTION
http://www.gsdays.fr/wp-content/uploads/2012/06/GS-Days-Nicolas-RUFF-Analyse-dune-backdoor-.NET_.pdf
Citation preview
Une backdoor chinoise en .NET
Nicolas RUFF
nicolas.ruff()eads.net
Historique
??? Attaques cibles dans la nature
6 dcembre
2011
Publication de l'avis de scurit APSA11-04
http://www.adobe.com/support/security/advisories/apsa11-04.html
16 dcembre
2011
Publication du correctif Adobe Reader 9.4.7
10 janvier 2012
Publication du correctif Adobe Reader 10.1.2
Historique
Principe gnral de l'attaque
Un PDF malveillant est transmis par email
1
Le shellcode extrait un fichier excutable embarqu (en gnral chiffr par un XOR)
2
Le shellcode "nettoie" le PDF et l'ouvre nouveau
4 Le fichier excutable s'installe en
tant que rsident (backdoor)
3
Backdoor(s)
Poison Ivy: la plus courante http://www.poisonivy-rat.com/
Mais chaque "quipe" a ses techniques/outils
C:\> file scvhost.exe
scvhost.exe: PE32 executable (GUI) Intel 80386 Mono/.Net assembly,
for MS Windows
Backdoor(s)
Ca s'annonce long et pnible
Format .NET
Format PE + mtadonnes .NET
Loges dans l'ancienne "COM Directory"
Trs peu documentes pendant fort longtemps http://www.ntcore.com/files/dotnetformat.htm
Encore trs peu d'outils capables de les manipuler pefile, metasm, miasm
CFF Explorer, Phoenix Framework?,
Format .NET
Format .NET
Format .NET
Format .NET
Protections en .NET
Techniques anti-analyse "statique" Renommage des mthodes / classes / variables de classe / Obfscuation des constantes / chaines de caractres / Obfuscation du flot de contrle Code / objets srialiss
Techniques anti-analyse "dynamique"
Vrification du contexte d'excution Vrification de type Rflexion Signature
Protections en .NET
Techniques plus avances Code natif
Cryptographie
Activation en ligne
Cf. protecteurs commerciaux Xenocode, 9Rays,
Un binaire .NET reste plus difficile protger qu'un binaire natif Note: la compilation native est possible avec NGEN.EXE
Protection statique en .NET
Renommage
Une table contient tous les noms en instance unique Cf. format DEX utilis par Android
Il serait possible de renommer " la main"
mais il est ardu de renommer si la taille des chaines change
Rebel.NET est un "PoC"
Il faut crer un ".H" qui contient tous les renommages http://www.ntcore.com/rebelnet.php
Note: une fois le code import dans Visual Studio, il est trs simple de
le "refactoriser" mme s'il ne compile pas
Protection statique en .NET
Manipulation d'une assembly
"System.Reflection" ne semble pas fait pour a Difficult modifier du code existant Difficult sauvegarder le code modifi
"Mono.Cecil" est beaucoup plus puissant pour cette
tche http://www.mono-project.com/Cecil
surtout lorsqu'il est combin avec Reflexil
http://reflexil.net/
Protection statique en .NET
Cheat sheet pour Mono.Cecil + Reflexil
Note: Mono.Cecil n'a aucune documentation officielle
Fonctionne bien avec:
Classe, mthodes, variables de classe
Mais beaucoup plus de plomberie pour: Manipuler les variables locales
ad = Mono.Cecil.AssemblyDefinition.ReadAssembly(...)
md = Mono.Cecil.ModuleDefinition.ReadModule(...)
foreach td in md.Types
foreach fd in td.Fields
foreach md in td.Methods
foreach pd in md.Parameters
mb = md.Body
foreach vd in mb.Variables
Protection statique en .NET
La preuve qu'on peut faire partie du problme et de la solution
Protection statique en .NET
Obfuscation des constantes
Protection statique en .NET
Code masqu
Se trouve dans une ressource "chiffre"
La cl est fournie par un "gnrateur de constantes" fortement obfusqu
Dans ce cas, l'analyse dynamique est plus simple
Stream manifestResourceStream =
executingAssembly.GetManifestResourceStream("Resources.binary.resources");
Protection dynamique en .NET
Vrification de type dynamique
if (Assembly.GetCallingAssembly() == typeof(ProtectedClass.c000016).Assembly)) ...
Protection dynamique en .NET
Vrification que l'assembly n'est pas utilise comme rfrence depuis un projet tiers
Assembly executingAssembly = Assembly.GetExecutingAssembly();
Assembly callingAssembly = Assembly.GetCallingAssembly();
...
Protection dynamique en .NET
Vrification de la hauteur de pile d'appel StackTrace trace = new StackTrace(skipFrames, false);
...
StackFrame frame = trace.GetFrame(skipFrames);
MethodBase base2 = (frame == null) ? null : frame.GetMethod();
Type type = (base2 == null) ? null : base2.DeclaringType;
...
Protection dynamique en .NET
Utilisation de la cl de signature publicKeyToken = assemblyName.GetPublicKeyToken();
...
Protection dynamique en .NET
Aucun test boolen
Trop facile "patcher"
Au contraire, les rsultats sont intgrs dans le calcul d'une constante "magique"
Revue des outils
Il existe 3 possibilits:
System.Reflection
Mono.Cecil Capable d'ouvrir une assembly sans l'excuter
http://www.mono-project.com/Cecil#Differences_with_other_alternatives
Librairie "maison" En gnral non maintenu / non publique
Revue des outils
Analyse statique
Outil Avis
ILDASM / ILASM Fourni avec Visual Studio - ultrabasique
Spices.NET Commercial - peu adapt aux codes obfusqus
Reflector Commercial - bas sur System.Reflection - peu adapt aux codes obfusqus
dotPeek Successeur de Reflector - suivre
JustDecompile Successeur de Reflector - suivre
ILSpy Bien mais la 2.0 est encore mieux
Phoenix Framework Statut du projet chez Microsoft ?
SAE Parfait pour les codes obfusqus
de4dot Orient "protections commerciales"
Revue des outils
Analyse dynamique
Outil Avis
mDBG Bas sur ICorDbg* - PoC non maintenu
Outils Foundstone & al. Bas sur les API de performance - peut tre intressant dans certains cas - SAE offre globalement la mme fonctionnalit
WinDbg + SOS.DLL Puissant mais inutilisable avec du code obfusqu
ILSpy 2.0 Trs prometteur
PE Browse Dbg Logique de la GUI ... ?
DILE Non maintenu
..
Conclusion
Faire une backdoor en .NET n'tait pas une mauvaise ide
Les comptences et les outils sont plus rares que dans le monde natif
Recommended