AWS - Lambda Layers Persistence
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Ένα Lambda layer είναι ένα αρχείο .zip που μπορεί να περιέχει επιπλέον κώδικα ή άλλο περιεχόμενο. Ένα layer μπορεί να περιέχει βιβλιοθήκες, μια προσαρμοσμένη εκτέλεση, δεδομένα ή αρχεία ρυθμίσεων.
Είναι δυνατόν να συμπεριλάβετε έως πέντε layers ανά λειτουργία. Όταν συμπεριλαμβάνετε ένα layer σε μια λειτουργία, το περιεχόμενο εξάγεται στον φάκελο /opt
στο περιβάλλον εκτέλεσης.
Κατά προεπιλογή, τα layers που δημιουργείτε είναι ιδιωτικά για τον λογαριασμό σας AWS. Μπορείτε να επιλέξετε να μοιραστείτε ένα layer με άλλους λογαριασμούς ή να κάνετε το layer δημόσιο. Εάν οι λειτουργίες σας καταναλώνουν ένα layer που δημοσίευσε διαφορετικός λογαριασμός, οι λειτουργίες σας μπορούν να συνεχίσουν να χρησιμοποιούν την έκδοση του layer μετά την διαγραφή του, ή αφού ανακληθεί η άδειά σας για πρόσβαση στο layer. Ωστόσο, δεν μπορείτε να δημιουργήσετε μια νέα λειτουργία ή να ενημερώσετε λειτουργίες χρησιμοποιώντας μια διαγραμμένη έκδοση layer.
Οι λειτουργίες που αναπτύσσονται ως εικόνα κοντέινερ δεν χρησιμοποιούν layers. Αντίθετα, συσκευάζετε την προτιμώμενη εκτέλεση, τις βιβλιοθήκες και άλλες εξαρτήσεις στην εικόνα κοντέινερ όταν κατασκευάζετε την εικόνα.
Η διαδρομή φόρτωσης που θα χρησιμοποιήσει η Python στο lambda είναι η εξής:
Έλεγχος του πώς οι δεύτερες και τρίτες θέσεις καταλαμβάνονται από καταλόγους όπου οι lambda layers αποσυμπιέζουν τα αρχεία τους: /opt/python/lib/python3.9/site-packages
και /opt/python
Εάν ένας επιτιθέμενος καταφέρει να backdoor μια χρησιμοποιούμενη lambda layer ή προσθέσει μία που θα εκτελεί αυθαίρετο κώδικα όταν φορτώνεται μια κοινή βιβλιοθήκη, θα είναι σε θέση να εκτελεί κακόβουλο κώδικα με κάθε κλήση lambda.
Επομένως, οι απαιτήσεις είναι:
Έλεγχος βιβλιοθηκών που είναι φορτωμένες από τον κώδικα των θυμάτων
Δημιουργία μιας proxy βιβλιοθήκης με lambda layers που θα εκτελεί προσαρμοσμένο κώδικα και θα φορτώνει την αρχική βιβλιοθήκη.
Όταν εκμεταλλεύεστε αυτή την τεχνική, βρήκα μια δυσκολία: Ορισμένες βιβλιοθήκες είναι ήδη φορτωμένες στο runtime της python όταν εκτελείται ο κώδικάς σας. Περίμενα να βρω πράγματα όπως os
ή sys
, αλλά ακόμα και η βιβλιοθήκη json
ήταν φορτωμένη.
Για να εκμεταλλευτείτε αυτή την τεχνική επιμονής, ο κώδικας πρέπει να φορτώσει μια νέα βιβλιοθήκη που δεν είναι φορτωμένη όταν εκτελείται ο κώδικας.
Με έναν κώδικα python όπως αυτόν είναι δυνατόν να αποκτήσετε τη λίστα των βιβλιοθηκών που είναι προφορτωμένες μέσα στο runtime της python σε lambda:
Και αυτή είναι η λίστα (ελέγξτε ότι οι βιβλιοθήκες όπως το os
ή το json
είναι ήδη εκεί)
Και αυτή είναι η λίστα με τις βιβλιοθήκες που περιλαμβάνει η lambda εγκατεστημένες από προεπιλογή: https://gist.github.com/gene1wood/4a052f39490fae00e0c3
Σε αυτό το παράδειγμα ας υποθέσουμε ότι ο στοχευμένος κώδικας εισάγει csv
. Θα backdoor-άρουμε την εισαγωγή της βιβλιοθήκης csv
.
Για να το κάνουμε αυτό, θα δημιουργήσουμε τον φάκελο csv με το αρχείο __init__.py
μέσα σε μια διαδρομή που φορτώνεται από τη lambda: /opt/python/lib/python3.9/site-packages
Έτσι, όταν η lambda εκτελείται και προσπαθεί να φορτώσει csv, το αρχείο __init__.py
μας θα φορτωθεί και θα εκτελεστεί.
Αυτό το αρχείο πρέπει να:
Εκτελεί το payload μας
Φορτώνει την αρχική βιβλιοθήκη csv
Μπορούμε να κάνουμε και τα δύο με:
Then, create a zip with this code in the path python/lib/python3.9/site-packages/__init__.py
and add it as a lambda layer.
You can find this code in https://github.com/carlospolop/LambdaLayerBackdoor
The integrated payload will send the IAM creds to a server THE FIRST TIME it's invoked or AFTER a reset of the lambda container (change of code or cold lambda), but other techniques such as the following could also be integrated:
AWS - Steal Lambda RequestsNote that it's possible to use lambda layers from external accounts. Moreover, a lambda can use a layer from an external account even if it doesn't have permissions. Also note that the max number of layers a lambda can have is 5.
Therefore, in order to improve the versatility of this technique an attacker could:
Backdoor an existing layer of the user (nothing is external)
Create a layer in his account, give the victim account access to use the layer, configure the layer in victims Lambda and remove the permission.
The Lambda will still be able to use the layer and the victim won't have any easy way to download the layers code (apart from getting a rev shell inside the lambda)
The victim won't see external layers used with aws lambda list-layers
Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)