AWS - Lambda Layers Persistence
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Lambdaレイヤーは、追加のコードやその他のコンテンツを含むことができる.zipファイルアーカイブです。レイヤーには、ライブラリ、カスタムランタイム、データ、または設定ファイルを含めることができます。
関数ごとに最大五つのレイヤーを含めることが可能です。関数にレイヤーを含めると、**内容は実行環境の/opt
**ディレクトリに抽出されます。
デフォルトでは、作成したレイヤーはあなたのAWSアカウントにプライベートです。レイヤーを他のアカウントと共有するか、レイヤーを公開することを選択できます。あなたの関数が異なるアカウントが公開したレイヤーを使用している場合、レイヤーが削除された後や、レイヤーへのアクセス権が取り消された後でも、あなたの関数はレイヤーのバージョンを引き続き使用できます。ただし、削除されたレイヤーバージョンを使用して新しい関数を作成したり、関数を更新したりすることはできません。
コンテナイメージとしてデプロイされた関数はレイヤーを使用しません。代わりに、イメージをビルドする際に、好みのランタイム、ライブラリ、およびその他の依存関係をコンテナイメージにパッケージします。
Pythonがlambdaで使用するロードパスは次のとおりです:
チェックしてみてください、第二および第三の位置は、lambda layersがファイルを解凍するディレクトリで占められています:/opt/python/lib/python3.9/site-packages
および/opt/python
もし攻撃者が使用されているlambda layerにバックドアを仕掛けたり、一般的なライブラリが読み込まれたときに任意のコードを実行するものを追加した場合、彼は各lambda呼び出しで悪意のあるコードを実行できるようになります。
したがって、要件は次のとおりです:
被害者のコードによって読み込まれるライブラリを確認する
カスタムコードを実行し、元のライブラリを読み込むためのlambda layersを持つ**プロキシライブラリを作成する。
この技術を悪用する際に、私は困難に直面しました:いくつかのライブラリは、あなたのコードが実行されるときにpythonランタイムにすでに読み込まれています。私はos
やsys
のようなものを見つけることを期待していましたが、json
ライブラリさえも読み込まれていました。
この永続性技術を悪用するためには、コードが実行されるときに読み込まれていない新しいライブラリを読み込む必要があります。
このようなpythonコードを使えば、lambda内のpythonランタイムにプリロードされたライブラリのリストを取得することができます:
そして、これはリストです(os
やjson
のようなライブラリがすでに存在することを確認してください)
そして、これはlambdaがデフォルトでインストールしているライブラリのリストです: https://gist.github.com/gene1wood/4a052f39490fae00e0c3
この例では、ターゲットコードが**csv
をインポートしていると仮定します。私たちはcsv
ライブラリのインポートにバックドアを仕掛ける**つもりです。
そのために、/opt/python/lib/python3.9/site-packages
にcsvというディレクトリを作成し、その中に**__init__.py
ファイルを置きます。
その後、lambdaが実行されてcsvを読み込もうとすると、私たちの__init__.py
ファイルが読み込まれ、実行されます**。
このファイルは以下を行う必要があります:
私たちのペイロードを実行する
元のcsvライブラリを読み込む
私たちは両方を次のように行うことができます:
Then, create a zip with this code in the path python/lib/python3.9/site-packages/__init__.py
and add it as a lambda layer.
You can find this code in https://github.com/carlospolop/LambdaLayerBackdoor
The integrated payload will 最初に呼び出されたとき、またはlambdaコンテナのリセット後にIAMクレデンシャルをサーバーに送信します(コードの変更またはコールドラムダ)、しかし他の技術も以下のように統合することができます:
AWS - Steal Lambda RequestsNote that it's possible to use 外部アカウントからのlambdaレイヤー。さらに、lambdaは権限がなくても外部アカウントのレイヤーを使用できます。 Also note that the lambdaが持てるレイヤーの最大数は5です。
Therefore, in order to improve the versatility of this technique an attacker could:
ユーザーの既存のレイヤーにバックドアを仕掛ける(外部のものは何もない)
自分のアカウントに レイヤーを作成し、**被害者アカウントにレイヤーを使用するアクセスを与え、被害者のLambdaに レイヤーを設定し、 権限を削除する。
Lambdaはレイヤーを使用し続けることができ、被害者はレイヤーのコードを簡単にダウンロードする方法がありません(ラムダ内でリバースシェルを取得することを除いて)
被害者は**aws lambda list-layers
を使用して外部レイヤーを確認できません**。
AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE) GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE)