# AWS - Elastic Beanstalk Enum

{{#include ../../../banners/hacktricks-training.md}}

## Elastic Beanstalk

Amazon Elastic Beanstalk fournit une plateforme simplifiée pour **déployer, gérer et mettre à l'échelle des applications et services web**. Il prend en charge une variété de langages de programmation et de frameworks, tels que Java, .NET, PHP, Node.js, Python, Ruby et Go, ainsi que des conteneurs Docker. Le service est compatible avec des serveurs largement utilisés, y compris Apache, Nginx, Passenger et IIS.

Elastic Beanstalk offre un moyen simple et flexible de **déployer vos applications dans le cloud AWS**, sans avoir à se soucier de l'infrastructure sous-jacente. Il **gère automatiquement** les détails de la **provisionnement** de capacité, de l'**équilibrage de charge**, de la **mise à l'échelle** et de la **surveillance** de la santé des applications, vous permettant de vous concentrer sur l'écriture et le déploiement de votre code.

L'infrastructure créée par Elastic Beanstalk est gérée par des **Groupes d'Autoscaling** dans **EC2** (avec un équilibreur de charge). Ce qui signifie qu'à la fin de la journée, si vous **compromettez l'hôte**, vous devez connaître EC2 :

{{#ref}}
aws-ec2-ebs-elb-ssm-vpc-and-vpn-enum/
{{#endref}}

De plus, si Docker est utilisé, il est possible d'utiliser **ECS**.

{{#ref}}
aws-eks-enum.md
{{#endref}}

### Application & Environnements

Dans AWS Elastic Beanstalk, les concepts d'une "application" et d'un "environnement" servent des objectifs différents et ont des rôles distincts dans le processus de déploiement.

#### Application

- Une application dans Elastic Beanstalk est un **conteneur logique pour le code source, les environnements et les configurations de votre application**. Elle regroupe différentes versions de votre code d'application et vous permet de les gérer en tant qu'entité unique.
- Lorsque vous créez une application, vous fournissez un nom et une **description, mais aucune ressource n'est provisionnée** à ce stade. C'est simplement un moyen d'organiser et de gérer votre code et les ressources associées.
- Vous pouvez avoir **plusieurs versions d'application** au sein d'une application. Chaque version correspond à une version spécifique de votre code, qui peut être déployée dans un ou plusieurs environnements.

#### Environnement

- Un environnement est une **instance provisionnée de votre application** fonctionnant sur l'infrastructure AWS. C'est **là où le code de votre application est déployé et exécuté**. Elastic Beanstalk provisionne les ressources nécessaires (par exemple, instances EC2, équilibreurs de charge, groupes d'auto-scaling, bases de données) en fonction de la configuration de l'environnement.
- **Chaque environnement exécute une seule version de votre application**, et vous pouvez avoir plusieurs environnements pour différents objectifs, tels que le développement, les tests, la mise en scène et la production.
- Lorsque vous créez un environnement, vous choisissez une plateforme (par exemple, Java, .NET, Node.js, etc.) et un type d'environnement (par exemple, serveur web ou travailleur). Vous pouvez également personnaliser la configuration de l'environnement pour contrôler divers aspects de l'infrastructure et des paramètres de l'application.

### 2 types d'Environnements

1. **Environnement de Serveur Web** : Il est conçu pour **héberger et servir des applications web et des API**. Ces applications gèrent généralement les requêtes HTTP/HTTPS entrantes. L'environnement de serveur web provisionne des ressources telles que des **instances EC2, des équilibreurs de charge et des groupes d'auto-scaling** pour gérer le trafic entrant, gérer la capacité et garantir la haute disponibilité de l'application.
2. **Environnement de Travailleur** : Il est conçu pour traiter des **tâches en arrière-plan**, qui sont souvent des opérations longues ou gourmandes en ressources qui ne nécessitent pas de réponses immédiates aux clients. L'environnement de travailleur provisionne des ressources comme des **instances EC2 et des groupes d'auto-scaling**, mais il **n'a pas d'équilibreur de charge** car il ne gère pas directement les requêtes HTTP/HTTPS. Au lieu de cela, il consomme des tâches à partir d'une **file d'attente Amazon Simple Queue Service (SQS)**, qui agit comme un tampon entre l'environnement de travailleur et les tâches qu'il traite.

### Sécurité

Lors de la création d'une application dans Beanstalk, il y a 3 options de sécurité très importantes à choisir :

- **Paire de clés EC2** : Ce sera la **clé SSH** qui pourra accéder aux instances EC2 exécutant l'application.
- **Profil d'instance IAM** : C'est le **profil d'instance** que les instances auront (**privilèges IAM**).
- Le rôle généré automatiquement s'appelle **`aws-elasticbeanstalk-ec2-role`** et a des accès intéressants sur tous les ECS, tous les SQS, DynamoDB elasticbeanstalk et elasticbeanstalk S3 en utilisant les politiques gérées par 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).
- **Rôle de service** : C'est le **rôle que le service AWS** utilisera pour effectuer toutes les actions nécessaires. A ma connaissance, un utilisateur AWS ordinaire ne peut pas accéder à ce rôle.
- Ce rôle généré par AWS s'appelle **`aws-elasticbeanstalk-service-role`** et utilise les politiques gérées par AWS [AWSElasticBeanstalkEnhancedHealth](https://us-east-1.console.aws.amazon.com/iam/home#/policies/arn:aws:iam::aws:policy/service-role/AWSElasticBeanstalkEnhancedHealth) et [AWSElasticBeanstalkManagedUpdatesCustomerRolePolicy](https://us-east-1.console.aws.amazon.com/iamv2/home?region=us-east-1#/roles/details/aws-elasticbeanstalk-service-role?section=permissions)

Par défaut, **la version de métadonnées 1 est désactivée** :

<figure><img src="../../../images/image (103).png" alt=""><figcaption></figcaption></figure>

### Exposition

Les données de Beanstalk sont stockées dans un **bucket S3** avec le nom suivant : **`elasticbeanstalk-<region>-<acc-id>`** (si elles ont été créées dans la console AWS). À l'intérieur de ce bucket, vous trouverez le **code source de l'application** téléchargé.

L'**URL** de la page web créée est **`http://<webapp-name>-env.<random>.<region>.elasticbeanstalk.com/`**

> [!WARNING]
> Si vous obtenez un **accès en lecture** sur le bucket, vous pouvez **lire le code source** et même trouver des **identifiants sensibles** dessus.
>
> Si vous obtenez un **accès en écriture** sur le bucket, vous pourriez **modifier le code source** pour **compromettre** le **rôle IAM** que l'application utilise la prochaine fois qu'elle est exécutée.

### Énumération
```bash
# Find S3 bucket
ACCOUNT_NUMBER=<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 <app_name> --environment-name <env_name>
aws elasticbeanstalk describe-environment-resources --environment-name <env_name> # Get env info such as SQS used queues
aws elasticbeanstalk describe-instances-health --environment-name <env_name> # Get the instances of an environment

# Get events
aws elasticbeanstalk describe-events
```
### Accès non authentifié

{{#ref}}
../aws-unauthenticated-enum-access/aws-elastic-beanstalk-unauthenticated-enum.md
{{#endref}}

### Persistance

{{#ref}}
../aws-persistence/aws-elastic-beanstalk-persistence.md
{{#endref}}

### Élévation de privilèges

{{#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}}
