AWS - Lambda Enum
Lambda
Amazon Web Services (AWS) Lambda は、サーバーのプロビジョニングや管理の必要なくコードを実行できる コンピュートサービス として説明されています。これは、コード実行に必要なリソースの割り当てを 自動的に処理 し、高可用性、スケーラビリティ、およびセキュリティなどの機能を確保することが特徴です。Lambda の重要な側面は、その価格モデルであり、使用したコンピュート時間に基づいてのみ課金 され、初期投資や長期的な義務が不要です。
Lambda を呼び出すには、好きなだけ頻繁に(Cloudwatch を使用して)呼び出すことが可能であり、URL エンドポイントを公開して呼び出したり、API Gateway 経由で呼び出したり、S3 バケットのデータの 変更 や DynamoDB テーブルの更新などの イベント に基づいて呼び出すことができます。
Lambda の コード は /var/task
に保存されます。
Lambda Aliases Weights
Lambda には 複数のバージョン が存在することがあります。 また、エイリアス を介して 複数のバージョン を公開することができます。エイリアス内で公開されている 各バージョン の 重み によって、どのエイリアスが呼び出しを受けるか が決まります(例えば、90%-10% など)。 エイリアスの 1つ のコードが 脆弱 である場合、脆弱な バージョンがエクスプロイトを受け取るまで リクエストを送信 することができます。
Resource Policies
Lambda リソースポリシーは、他のサービス/アカウントに Lambda を呼び出すアクセス権を与えることを可能にします。 例えば、URL を介して公開された Lambda に誰でもアクセスできるようにする ポリシーは次のとおりです:
また、API Gateway がそれを呼び出すことを許可するポリシーは次のとおりです:
Lambda Database Proxies
数百 の 同時 Lambda リクエスト がある場合、それぞれが データベースに接続して接続を閉じる 必要があると、うまく機能しません(Lambda はステートレスであり、接続を維持できません)。 そのため、Lambda 関数がデータベースインスタンスではなく RDS Proxy と対話する 場合、多くの同時接続をスケーリングするために必要な接続プーリングを処理します。これにより、Lambda アプリケーションは 既存の接続を再利用 でき、新しい接続を作成する必要がなくなります。
Lambda EFS Filesystems
データを保存および共有するために、Lambda は EFS にアクセスしてマウント することができ、Lambda はそれを読み書きすることができます。
Lambda Layers
Lambda レイヤー は、追加のコード やその他のコンテンツを含むことができる .zip ファイルアーカイブです。レイヤーにはライブラリ、カスタムランタイム、データ、または設定ファイルを含めることができます。
1つの関数に最大 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
Invoke a lambda
Manual
Lambda関数を手動で呼び出すには、aws-cliを使用します。以下のコマンドを実行してください。
このコマンドは、指定したLambda関数を呼び出し、その出力をoutput.txt
ファイルに保存します。
公開されたURLを介して
AWS Lambda関数がAPI GatewayまたはApplication Load Balancerを介して公開されている場合、URLを通じて関数を呼び出すことができます。これにより、関数のエンドポイントが外部に露出し、潜在的な攻撃ベクトルとなります。
Via AWS CLI
AWS CLIを使用してLambda関数を列挙することができます。以下のコマンドを使用して、Lambda関数のリストを取得します。
Via AWS SDK
AWS SDKを使用してLambda関数を列挙することも可能です。以下はPythonを使用した例です。
Permissions
Lambda関数の列挙には適切な権限が必要です。以下のIAMポリシーを持つユーザーまたはロールが必要です。
Summary
Lambda関数の列挙は、公開されたURL、AWS CLI、またはAWS SDKを使用して実行できます。適切な権限が必要であり、関数のエンドポイントが外部に露出している場合は注意が必要です。
Call Lambda function via URL
次に、実行可能なlambda関数を見つける時が来ました:
"Level6" という名前の lambda 関数が利用可能です。これを呼び出す方法を見つけましょう:
名前とIDがわかったので、名前を取得できます:
そして最後に関数を呼び出します(URLにID、Name、function-nameが表示されることに注意してください):https://s33ppypa75.execute-api.us-west-2.amazonaws.com/Prod/level6
URL:
https://<rest-api-id>.execute-api.<region>.amazonaws.com/<stageName>/<funcName>
他のトリガー
lambdaをトリガーできる他の多くのソースがあります
Privesc
次のページで、Lambdaの権限を悪用して特権をエスカレートする方法を確認できます:
AWS - Lambda Privesc認証されていないアクセス
AWS - Lambda Unauthenticated Accessポストエクスプロイト
AWS - Lambda Post Exploitation永続性
AWS - Lambda Persistence参考文献
Last updated