AWS - Lambda Enum
Reading time: 12 minutes
tip
AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE)
Azureハッキングを学び、実践する:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricksをサポートする
- サブスクリプションプランを確認してください!
- **💬 Discordグループまたはテレグラムグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- HackTricksおよびHackTricks CloudのGitHubリポジトリにPRを提出してハッキングトリックを共有してください。
Lambda
Amazon Web Services (AWS) Lambdaは、サーバーの提供や管理を必要とせずにコードを実行できる コンピュートサービスとして説明されています。これは、コード実行に必要なリソースの割り当てを自動的に処理する能力によって特徴付けられ、高可用性、スケーラビリティ、およびセキュリティなどの機能を保証します。Lambdaの重要な側面は、その価格モデルであり、料金は使用されたコンピュート時間のみに基づいています。これにより、初期投資や長期的な義務が不要になります。
Lambdaを呼び出すには、好きなだけ頻繁に(Cloudwatchを使用して)呼び出すことができ、URLエンドポイントを公開して呼び出したり、API Gateway経由で呼び出したり、S3バケット内のデータの変更やDynamoDBテーブルの更新などのイベントに基づいて呼び出すことができます。
Lambdaのコードは**/var/task
**に保存されています。
Lambda Aliases Weights
Lambdaは複数のバージョンを持つことができます。
また、エイリアスを介して1つ以上のバージョンを公開することができます。エイリアス内で公開されている各バージョンの重みは、どのエイリアスが呼び出しを受けるかを決定します(例えば90%-10%など)。
1つのエイリアスのコードが脆弱である場合、脆弱なバージョンがエクスプロイトを受け取るまでリクエストを送信できます。
Resource Policies
Lambdaリソースポリシーは、他のサービス/アカウントにLambdaを呼び出すアクセスを与えることを可能にします。
例えば、これはURLを介して公開されたLambdaに誰でもアクセスを許可するポリシーです:
また、これはAPI Gatewayが呼び出すことを許可するものです:
Lambda Database Proxies
数百の同時Lambdaリクエストがある場合、各リクエストがデータベースに接続して接続を閉じる必要があると、うまくいきません(Lambdaはステートレスで、接続をオープンに保つことができません)。
そのため、Lambda関数がRDS Proxyと対話する場合、データベースインスタンスの代わりに、同時Lambda関数によって作成された多くの接続をスケーリングするために必要な接続プーリングを処理します。これにより、Lambdaアプリケーションは既存の接続を再利用でき、新しい接続を各関数呼び出しのために作成する必要がなくなります。
Lambda EFS Filesystems
データを保持し、さらには共有するために、LambdasはEFSにアクセスしてマウントすることができ、Lambdaはそこから読み書きできるようになります。
Lambda Layers
Lambdaのレイヤーは、追加のコードや他のコンテンツを含むことができる.zipファイルアーカイブです。レイヤーにはライブラリ、カスタムランタイム、データ、または設定ファイルを含めることができます。
関数ごとに最大5つのレイヤーを含めることが可能です。関数にレイヤーを含めると、**内容は実行環境の/opt
**ディレクトリに抽出されます。
デフォルトでは、作成したレイヤーはあなたのAWSアカウントにプライベートです。レイヤーを他のアカウントと共有したり、レイヤーを公開することを選択できます。異なるアカウントが公開したレイヤーを関数が使用する場合、関数はレイヤーが削除された後や、レイヤーへのアクセス権が取り消された後もレイヤーのバージョンを使用し続けることができます。ただし、削除されたレイヤーバージョンを使用して新しい関数を作成したり、関数を更新したりすることはできません。
コンテナイメージとしてデプロイされた関数はレイヤーを使用しません。代わりに、イメージをビルドする際に、好みのランタイム、ライブラリ、および他の依存関係をコンテナイメージにパッケージ化します。
Lambda Extensions
Lambda拡張は、さまざまな監視、可視性、セキュリティ、およびガバナンスツールと統合することによって関数を強化します。これらの拡張は、Lambdaレイヤーを使用した.zipアーカイブまたはコンテナイメージデプロイメントに含まれる形で追加され、内部および外部の2つのモードで動作します。
- 内部拡張は、ランタイムプロセスと統合し、言語固有の環境変数やラッパースクリプトを使用してその起動を操作します。このカスタマイズは、Java Correto 8および11、Node.js 10および12、.NET Core 3.1などのさまざまなランタイムに適用されます。
- 外部拡張は、別のプロセスとして実行され、Lambda関数のライフサイクルに合わせて動作を維持します。これらは、Node.js 10および12、Python 3.7および3.8、Ruby 2.5および2.7、Java Corretto 8および11、.NET Core 3.1、およびカスタムランタイムなどのさまざまなランタイムと互換性があります。
Enumeration
aws lambda get-account-settings
# List functions and get extra config info
aws lambda list-functions
aws lambda get-function --function-name <function_name>
aws lambda get-function-configuration --function-name <function_name>
aws lambda list-function-event-invoke-configs --function-name <function_name>
## Check for creds in env vars
aws lambda list-functions | jq '.Functions[].Environment'
## Download & check the source code
aws lambda get-function --function-name "<func_name>" --query 'Code.Location'
wget -O lambda-function.zip <url-from-previous-query>
# Get Lambda URL (if any)
aws lambda list-function-url-configs --function-name <function_name>
aws lambda get-function-url-config --function-name <function_name>
# Get who has permissions to invoke the Lambda
aws lambda get-policy --function-name <function_name>
# Versions and Aliases
aws lambda list-versions-by-function --function-name <func_name>
aws lambda list-aliases --function-name <func_name>
# List layers
aws lambda list-layers
aws lambda list-layer-versions --layer-name <name>
aws lambda get-layer-version --layer-name <name> --version-number <ver>
aws lambda get-layer-version-by-arn --arn <name> #Get external ARNs
# List other metadata
aws lambda list-event-source-mappings
aws lambda list-code-signing-configs
aws lambda list-functions-by-code-signing-config --code-signing-config-arn <arn>
ラムダを呼び出す
手動
# Invoke function
aws lambda invoke --function-name FUNCTION_NAME /tmp/out
## Some functions will expect parameters, they will access them with something like:
## target_policys = event['policy_names']
## user_name = event['user_name']
aws lambda invoke --function-name <name> --cli-binary-format raw-in-base64-out --payload '{"policy_names": ["AdministratorAccess], "user_name": "sdf"}' out.txt
公開されたURLを介して
aws lambda list-function-url-configs --function-name <function_name> #Get lambda URL
aws lambda get-function-url-config --function-name <function_name> #Get lambda URL
URL経由でLambda関数を呼び出す
さて、実行可能なLambda関数を見つける時が来ました:
aws --region us-west-2 --profile level6 lambda list-functions
「Level6」と呼ばれるラムダ関数が利用可能です。呼び出し方を見てみましょう:
aws --region us-west-2 --profile level6 lambda get-policy --function-name Level6
名前とIDがわかったので、名前を取得できます:
aws --profile level6 --region us-west-2 apigateway get-stages --rest-api-id "s33ppypa75"
最後に、関数にアクセスして呼び出します(ID、Name、function-nameがURLに表示されることに注意してください): https://s33ppypa75.execute-api.us-west-2.amazonaws.com/Prod/level6
URL:
https://<rest-api-id>.execute-api.<region>.amazonaws.com/<stageName>/<funcName>
その他のトリガー
他にも多くのソースがlambdaをトリガーできます。
.png)
プライバシー昇格
次のページでは、Lambdaの権限を悪用して権限を昇格させる方法を確認できます:
認証されていないアクセス
AWS - Lambda Unauthenticated Access
ポストエクスプロイテーション
AWS - Lambda Post Exploitation
永続性
参考文献
- https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-concepts.html#gettingstarted-concepts-layer
- https://aws.amazon.com/blogs/compute/building-extensions-for-aws-lambda-in-preview/
tip
AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE)
Azureハッキングを学び、実践する:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricksをサポートする
- サブスクリプションプランを確認してください!
- **💬 Discordグループまたはテレグラムグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- HackTricksおよびHackTricks CloudのGitHubリポジトリにPRを提出してハッキングトリックを共有してください。