Notes

☁️ Cloud & K8s

Cloud & conteneurs : Docker, Kubernetes, Azure DevOps, Terraform state abuse, checks IaC, OWASP CI/CD.

Cloud & K8s

Notes cloud, conteneurs et CI/CD (données de lab).

Docker (bases)

docker build . -t mon_image
docker run -p 8080:80 nginx
docker network create --driver bridge mon-bridge
docker run -dit --name alpine1 --network mon-bridge alpine
docker exec alpine1 ping -c 1 alpine2
# Registry local minikube
eval $(minikube docker-env)
docker build . --tag localhost:5000/ma_premiere_image
docker push localhost:5000/ma_premiere_image
curl http://localhost:5000/v2/_catalog

Kubernetes (Kube)

kubectl whoami
kubectl auth can-i --list
kubectl get <ressource> <nom> -o yaml
kubectl get pods
crane auth x.x.x -u xxxx -p xxxx
crane pull image /tmp/mg.tar

Azure CLI (DevOps)

az devops login
az pipelines list --query "[].{name:name,id:id}" -o table
az devops security group list --project "Pentest"
az devops security group membership list --id <GROUP_ID> -o table
az devops security permission list --id "Pipeline/<PIPELINE_ID>" --subject "<USER_ID>"

Scénarios d’attaque Azure DevOps / CI-CD

  1. Lire des variables cachées à travers les pipelines : injecter echo $(var) | base64 (ou rev) dans un header curl d’un step.

  2. Attribuer des rôles sur une ressource (souscription Azure) via un pipeline privilégié :

    az role assignment create --assignee <ID> --role "Contributor" --scope "<scope>"
  3. Accéder à un repo secret que l’utilisateur ne peut pas lire mais le pipeline oui :

    curl -H "Authorization: Bearer $(System.AccessToken)" https://dev.azure.com/{org}/{project}/_apis/git/repositories?api-version=7.1

    ou déclarer resources: repositories: - repository: secret et checkout: secret.

  4. Build validation activée → exécuter du code via pre-merge pull request.

  5. Tests non isolés pouvant modifier des fichiers de build → monter en read-only / isoler dans des conteneurs.

  6. Service connection garantie à tous les pipelines → restreindre par branch control (allowed branches: main).

Bypass de restrictions : changer le trigger vers main (auto) ou vers une nouvelle branche pour contourner les politiques de reviewers. Solution : restrictions (checks) sur les service connections / variables et branch control.

Références : Azure DevOps Privilege Escalation: Pipeline Shenanigans (Anniek van der Peijl), Azure DevOps security – Lessons learned (Björn Sundling).

Terraform state file → prise de contrôle pipeline (study case)

Si un red teamer peut modifier uniquement le fichier terraform.state d’un bucket S3 :

  • Suppression de ressources : insérer une ressource factice pointant vers l’ID réel à détruire, ou modifier un attribut non-updatable in place → Terraform propose de détruire/recréer.
  • Exécution de code : publier un custom provider malveillant (fonction New() qui fait un GET vers un webhook) puis référencer ce provider dans le state (registry.terraform.io/<user>/terrarizer). Le code s’exécute dès terraform init, même sans apply.

Mitigations : figer (pin) les providers hors pipeline (image immuable), sécuriser le state (permissions/KMS pour que seul le pipeline y écrive), activer le state locking (DynamoDB), stocker le lock dans un emplacement séparé, utiliser un rôle read-only pour terraform plan.

Détection de vulnérabilités IaC (Checkov / Terra)

Exemples de checks Azure fréquents :

Check Risque Fix
CKV_AZURE_10 / 9 SSH/RDP ouverts (source_address_prefix = "*") Restreindre à un CIDR de confiance
CKV_AZURE_113 SQL server public public_network_access_enabled = false
CKV_AZURE_23/24 SQL sans auditing Ajouter azurerm_mssql_server_extended_auditing_policy
CKV_AZURE_3 Storage sans HTTPS enable_https_traffic_only = true
CKV_AZURE_35 Storage réseau ouvert network_rules { default_action = "Deny" }
CKV_AZURE_120 App Gateway sans WAF waf_configuration { enabled = true, firewall_mode = "Prevention" }

AKS (Kubernetes managé)

azure_policy add-on, désactiver le dashboard, activer OMS agent (logging), chiffrement disque (disk_encryption_set_id), private_cluster_enabled = true, network_policy (azure/calico), api_server_authorized_ip_ranges, RBAC (role_based_access_control { enabled = true }).

App Services / VM / Key Vault / Storage

App Services : min_tls_version = "1.2", ftps_state = "Disabled", https_only = true, managed identity, auth AAD. VM : disable_password_authentication = true + admin_ssh_key, chiffrement OS disk. Key Vault : network_acls default_action = "Deny", purge_protection_enabled = true, soft_delete_retention_days = 90, clés HSM et expiration. Storage : chiffrement disque/CMK, default_action = "Deny", logging queue, min_tls_version = "TLS1_2".

LLM (prompt injection)

  • Poser la même question plusieurs fois, changer les mots (password, secret).
  • Injection de commande : ;ls, $(ls), indirect prompt injection.
  • XSS indirect/direct avec des "quotes".

OWASP Top 10 CI/CD Security Risks

CICD-SEC-1 Insufficient Flow Control · SEC-2 Inadequate IAM · SEC-3 Dependency Chain Abuse · SEC-4 Poisoned Pipeline Execution (PPE) · SEC-5 Insufficient PBAC · SEC-6 Insufficient Credential Hygiene · SEC-7 Insecure System Configuration · SEC-8 Ungoverned 3rd-Party Services · SEC-9 Improper Artifact Integrity Validation · SEC-10 Insufficient Logging & Visibility.

Outils d’audit K8s / Cloud

  • kube-bench, kube-scan, kube-hunter, Polaris, kubeaudit
  • Chef Inspec + cis-kubernetes-benchmark
  • rbac-police (PaloAltoNetworks)
  • ScoutSuite : python3 scout.py Azure --cli