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에서 사용할 로드 경로는 다음과 같습니다:
Check how the second and third positions are occupy by directories where lambda layers uncompress their files: /opt/python/lib/python3.9/site-packages
and /opt/python
If an attacker managed to backdoor a used lambda layer or add one that will be executing arbitrary code when a common library is loaded, he will be able to execute malicious code with each lambda invocation.
따라서 요구 사항은 다음과 같습니다:
피해자의 코드에 의해 로드되는 라이브러리 확인
사용자 정의 코드를 실행하고 원래 라이브러리를 로드하는 lambda layers로 프록시 라이브러리 생성.
When abusing this technique I found a difficulty: Some libraries are already loaded in python runtime when your code gets executed. I was expecting to find things like os
or sys
, but even json
library was loaded.
In order to abuse this persistence technique, the code needs to load a new library that isn't loaded when the code gets executed.
With a python code like this one it's possible to obtain the list of libraries that are pre loaded inside python runtime in lambda:
그리고 이것은 목록입니다 (라이브러리 os
또는 json
이 이미 있는지 확인하십시오)
And this is the list of libraries that lambda includes installed by default: https://gist.github.com/gene1wood/4a052f39490fae00e0c3
In this example lets suppose that the targeted code is importing csv
. We are going to be backdooring the import of the csv
library.
For doing that, we are going to create the directory csv with the file __init__.py
on it in a path that is loaded by lambda: /opt/python/lib/python3.9/site-packages
Then, when the lambda is executed and try to load csv, our __init__.py
file will be loaded and executed.
This file must:
Execute our payload
Load the original csv library
We can do both with:
그런 다음, 이 코드를 python/lib/python3.9/site-packages/__init__.py
경로에 넣고 zip 파일을 생성한 후, 이를 lambda layer로 추가합니다.
이 코드는 https://github.com/carlospolop/LambdaLayerBackdoor에서 찾을 수 있습니다.
통합된 페이로드는 첫 번째 호출 시 또는 lambda 컨테이너가 리셋된 후 IAM 자격 증명을 서버로 전송합니다 (코드 변경 또는 콜드 람다), 그러나 다음과 같은 다른 기술도 통합될 수 있습니다:
AWS - Steal Lambda Requests외부 계정의 lambda layers를 사용할 수 있다는 점에 유의하십시오. 또한, lambda는 권한이 없더라도 외부 계정의 레이어를 사용할 수 있습니다. 또한 lambda가 가질 수 있는 최대 레이어 수는 5개입니다.
따라서 이 기술의 다재다능성을 향상시키기 위해 공격자는 다음과 같은 방법을 사용할 수 있습니다:
사용자의 기존 레이어에 백도어를 설치합니다 (외부는 없습니다)
자신의 계정에 레이어를 생성하고, 희생자 계정에 레이어 사용 권한을 부여하고, 희생자의 Lambda에 레이어를 구성한 후 권한을 제거합니다.
Lambda는 여전히 레이어를 사용할 수 있으며 희생자는 레이어 코드를 다운로드할 수 있는 쉬운 방법이 없습니다 (람다 내부에서 rev shell을 얻는 것을 제외하고)
희생자는 **aws lambda list-layers
**를 사용하여 외부 레이어를 볼 수 없습니다.
AWS 해킹 배우기 및 연습하기:HackTricks Training AWS Red Team Expert (ARTE) GCP 해킹 배우기 및 연습하기: HackTricks Training GCP Red Team Expert (GRTE)