# AWS - Elastic Beanstalk Enum
{{#include ../../../banners/hacktricks-training.md}}
## Elastic Beanstalk
Amazon Elastic Beanstalk fornisce una piattaforma semplificata per **il deployment, la gestione e la scalabilità di applicazioni e servizi web**. Supporta una varietà di linguaggi di programmazione e framework, come Java, .NET, PHP, Node.js, Python, Ruby e Go, oltre a contenitori Docker. Il servizio è compatibile con server ampiamente utilizzati, tra cui Apache, Nginx, Passenger e IIS.
Elastic Beanstalk offre un modo semplice e flessibile per **deployare le tue applicazioni nel cloud AWS**, senza la necessità di preoccuparsi dell'infrastruttura sottostante. Gestisce **automaticamente** i dettagli della **provisioning** della capacità, del **bilanciamento** del carico, della **scalabilità** e del **monitoraggio** della salute dell'applicazione, permettendoti di concentrarti sulla scrittura e sul deployment del tuo codice.
L'infrastruttura creata da Elastic Beanstalk è gestita da **Autoscaling** Groups in **EC2** (con un bilanciatore di carico). Ciò significa che alla fine della giornata, se **comprometti l'host**, dovresti sapere riguardo a EC2:
{{#ref}}
aws-ec2-ebs-elb-ssm-vpc-and-vpn-enum/
{{#endref}}
Inoltre, se viene utilizzato Docker, è possibile utilizzare **ECS**.
{{#ref}}
aws-eks-enum.md
{{#endref}}
### Applicazione & Ambienti
In AWS Elastic Beanstalk, i concetti di "applicazione" e "ambiente" servono a scopi diversi e hanno ruoli distinti nel processo di deployment.
#### Applicazione
- Un'applicazione in Elastic Beanstalk è un **contenitore logico per il codice sorgente, gli ambienti e le configurazioni della tua applicazione**. Raggruppa diverse versioni del codice della tua applicazione e ti consente di gestirle come un'unica entità.
- Quando crei un'applicazione, fornisci un nome e **una descrizione, ma nessuna risorsa viene provisionata** in questa fase. È semplicemente un modo per organizzare e gestire il tuo codice e le risorse correlate.
- Puoi avere **più versioni dell'applicazione** all'interno di un'applicazione. Ogni versione corrisponde a un rilascio specifico del tuo codice, che può essere deployato in uno o più ambienti.
#### Ambiente
- Un ambiente è un'**istanza provisionata della tua applicazione** che gira sull'infrastruttura AWS. È **dove il codice della tua applicazione viene deployato ed eseguito**. Elastic Beanstalk provisiona le risorse necessarie (ad es., istanze EC2, bilanciatori di carico, gruppi di auto-scaling, database) in base alla configurazione dell'ambiente.
- **Ogni ambiente esegue una singola versione della tua applicazione**, e puoi avere più ambienti per scopi diversi, come sviluppo, testing, staging e produzione.
- Quando crei un ambiente, scegli una piattaforma (ad es., Java, .NET, Node.js, ecc.) e un tipo di ambiente (ad es., server web o worker). Puoi anche personalizzare la configurazione dell'ambiente per controllare vari aspetti dell'infrastruttura e delle impostazioni dell'applicazione.
### 2 tipi di Ambienti
1. **Web Server Environment**: È progettato per **ospitare e servire applicazioni web e API**. Queste applicazioni gestiscono tipicamente richieste HTTP/HTTPS in arrivo. L'ambiente del server web provisiona risorse come **istanze EC2, bilanciatori di carico e gruppi di auto-scaling** per gestire il traffico in arrivo, gestire la capacità e garantire l'alta disponibilità dell'applicazione.
2. **Worker Environment**: È progettato per elaborare **compiti in background**, che sono spesso operazioni che richiedono tempo o risorse eccessive che non richiedono risposte immediate ai client. L'ambiente worker provisiona risorse come **istanze EC2 e gruppi di auto-scaling**, ma **non ha un bilanciatore di carico** poiché non gestisce direttamente le richieste HTTP/HTTPS. Invece, consuma compiti da una **coda Amazon Simple Queue Service (SQS)**, che funge da buffer tra l'ambiente worker e i compiti che elabora.
### Sicurezza
Quando crei un'app in Beanstalk ci sono 3 opzioni di sicurezza molto importanti da scegliere:
- **EC2 key pair**: Questa sarà la **chiave SSH** che potrà accedere alle istanze EC2 che eseguono l'app.
- **IAM instance profile**: Questo è il **profilo dell'istanza** che le istanze avranno (**privilegi IAM**).
- Il ruolo generato automaticamente si chiama **`aws-elasticbeanstalk-ec2-role`** e ha accesso interessante su tutto ECS, tutto SQS, DynamoDB elasticbeanstalk e elasticbeanstalk S3 utilizzando le politiche gestite da AWS: [AWSElasticBeanstalkWebTier](https://us-east-1.console.aws.amazon.com/iam/home#/policies/arn:aws:iam::aws:policy/AWSElasticBeanstalkWebTier), [AWSElasticBeanstalkMulticontainerDocker](https://us-east-1.console.aws.amazon.com/iam/home#/policies/arn:aws:iam::aws:policy/AWSElasticBeanstalkMulticontainerDocker), [AWSElasticBeanstalkWorkerTier](https://us-east-1.console.aws.amazon.com/iam/home#/policies/arn:aws:iam::aws:policy/AWSElasticBeanstalkWorkerTier).
- **Service role**: Questo è il **ruolo che il servizio AWS** utilizzerà per eseguire tutte le azioni necessarie. A quanto ne so, un utente AWS normale non può accedere a quel ruolo.
- Questo ruolo generato da AWS si chiama **`aws-elasticbeanstalk-service-role`** e utilizza le politiche gestite da AWS [AWSElasticBeanstalkEnhancedHealth](https://us-east-1.console.aws.amazon.com/iam/home#/policies/arn:aws:iam::aws:policy/service-role/AWSElasticBeanstalkEnhancedHealth) e [AWSElasticBeanstalkManagedUpdatesCustomerRolePolicy](https://us-east-1.console.aws.amazon.com/iamv2/home?region=us-east-1#/roles/details/aws-elasticbeanstalk-service-role?section=permissions)
Per impostazione predefinita, **la versione dei metadati 1 è disabilitata**:
### Esposizione
I dati di Beanstalk sono memorizzati in un **bucket S3** con il seguente nome: **`elasticbeanstalk--`** (se è stato creato nella console AWS). All'interno di questo bucket troverai il **codice sorgente dell'applicazione** caricato.
L'**URL** della pagina web creata è **`http://-env...elasticbeanstalk.com/`**
> [!WARNING]
> Se ottieni **accesso in lettura** sul bucket, puoi **leggere il codice sorgente** e persino trovare **credenziali sensibili** in esso.
>
> Se ottieni **accesso in scrittura** sul bucket, potresti **modificare il codice sorgente** per **compromettere** il **ruolo IAM** che l'applicazione sta utilizzando la prossima volta che viene eseguita.
### Enumerazione
```bash
# Find S3 bucket
ACCOUNT_NUMBER=
for r in us-east-1 us-east-2 us-west-1 us-west-2 ap-south-1 ap-south-2 ap-northeast-1 ap-northeast-2 ap-northeast-3 ap-southeast-1 ap-southeast-2 ap-southeast-3 ca-central-1 eu-central-1 eu-central-2 eu-west-1 eu-west-2 eu-west-3 eu-north-1 sa-east-1 af-south-1 ap-east-1 eu-south-1 eu-south-2 me-south-1 me-central-1; do aws s3 ls elasticbeanstalk-$r-$ACCOUNT_NUMBER 2>/dev/null && echo "Found in: elasticbeanstalk-$r-$ACCOUNT_NUMBER"; done
# Get apps and URLs
aws elasticbeanstalk describe-applications # List apps
aws elasticbeanstalk describe-application-versions # Get apps & bucket name with source code
aws elasticbeanstalk describe-environments # List envs
aws elasticbeanstalk describe-environments | grep -E "EndpointURL|CNAME"
aws elasticbeanstalk describe-configuration-settings --application-name --environment-name
aws elasticbeanstalk describe-environment-resources --environment-name # Get env info such as SQS used queues
aws elasticbeanstalk describe-instances-health --environment-name # Get the instances of an environment
# Get events
aws elasticbeanstalk describe-events
```
### Accesso non autenticato
{{#ref}}
../aws-unauthenticated-enum-access/aws-elastic-beanstalk-unauthenticated-enum.md
{{#endref}}
### Persistenza
{{#ref}}
../aws-persistence/aws-elastic-beanstalk-persistence.md
{{#endref}}
### Privesc
{{#ref}}
../aws-privilege-escalation/aws-elastic-beanstalk-privesc.md
{{#endref}}
### Post Exploitation
{{#ref}}
../aws-post-exploitation/aws-elastic-beanstalk-post-exploitation.md
{{#endref}}
{{#include ../../../banners/hacktricks-training.md}}