AWS - Lambda Privesc
lambda
Weitere Informationen zu Lambda finden Sie unter:
pageAWS - Lambda Enumiam:PassRole
, lambda:CreateFunction
, (lambda:InvokeFunction
| lambda:InvokeFunctionUrl
)
iam:PassRole
, lambda:CreateFunction
, (lambda:InvokeFunction
| lambda:InvokeFunctionUrl
)Benutzer mit den Berechtigungen iam:PassRole
, lambda:CreateFunction
und lambda:InvokeFunction
können ihre Privilegien eskalieren.
Sie können eine neue Lambda-Funktion erstellen und ihr eine vorhandene IAM-Rolle zuweisen, wodurch der Funktion die mit dieser Rolle verbundenen Berechtigungen gewährt werden. Der Benutzer kann dann Code für diese Lambda-Funktion schreiben und hochladen (zum Beispiel mit einem Reverse-Shell).
Sobald die Funktion eingerichtet ist, kann der Benutzer deren Ausführung auslösen und die beabsichtigten Aktionen durch Aufrufen der Lambda-Funktion über die AWS-API ausführen. Auf diese Weise kann der Benutzer effektiv Aufgaben indirekt über die Lambda-Funktion ausführen und dabei mit dem Zugriffsniveau arbeiten, das der mit ihr verbundenen IAM-Rolle gewährt wurde.\
Ein Angreifer könnte dies missbrauchen, um eine Reverse-Shell zu erhalten und das Token zu stehlen:
Du könntest auch die Berechtigungen der Lambda-Rolle missbrauchen, die in der Lambda-Funktion selbst definiert sind. Wenn die Lambda-Rolle ausreichend Berechtigungen hatte, könntest du sie nutzen, um dir Administratorrechte zu gewähren:
Es ist auch möglich, die Rollenberechtigungen der Lambda auszulesen, ohne eine externe Verbindung zu benötigen. Dies wäre nützlich für Netzwerkisolierte Lambdas, die für interne Aufgaben verwendet werden. Wenn unbekannte Sicherheitsgruppen Ihre Reverse-Shells filtern, ermöglicht Ihnen dieses Code-Stück, die Berechtigungen direkt als Ausgabe der Lambda auszulesen.
Potenzielle Auswirkungen: Direktes Privilege Escalation auf die angegebene Lambda-Service-Rolle.
Beachten Sie, dass selbst wenn es interessant aussieht, lambda:InvokeAsync
allein nicht die Ausführung von aws lambda invoke-async
ermöglicht. Sie benötigen auch lambda:InvokeFunction
.
iam:PassRole
, lambda:CreateFunction
, lambda:AddPermission
iam:PassRole
, lambda:CreateFunction
, lambda:AddPermission
Wie im vorherigen Szenario können Sie sich die Berechtigung lambda:InvokeFunction
erteilen, wenn Sie die Berechtigung lambda:AddPermission
haben.
Potenzielle Auswirkungen: Direktes Privilegien-Eskalation zum angegebenen Lambda-Dienstrollen.
iam:PassRole
, lambda:CreateFunction
, lambda:CreateEventSourceMapping
iam:PassRole
, lambda:CreateFunction
, lambda:CreateEventSourceMapping
Benutzer mit den Berechtigungen iam:PassRole
, lambda:CreateFunction
und lambda:CreateEventSourceMapping
(und möglicherweise dynamodb:PutItem
und dynamodb:CreateTable
) können indirekt Privilegien eskalieren, selbst ohne lambda:InvokeFunction
.
Sie können eine Lambda-Funktion mit bösartigem Code erstellen und ihr eine vorhandene IAM-Rolle zuweisen.
Anstatt die Lambda direkt aufzurufen, richtet der Benutzer eine vorhandene DynamoDB-Tabelle ein oder nutzt sie, indem er sie über ein Ereignisquellen-Mapping mit der Lambda verknüpft. Diese Einrichtung stellt sicher, dass die Lambda-Funktion automatisch ausgelöst wird, wenn ein neuer Eintrag in der Tabelle erfolgt, entweder durch die Aktion des Benutzers oder einen anderen Prozess, wodurch die Lambda-Funktion indirekt aufgerufen und der Code mit den Berechtigungen der übergebenen IAM-Rolle ausgeführt wird.
Wenn DynamoDB bereits in der AWS-Umgebung aktiv ist, muss der Benutzer nur die Ereignisquellenzuordnung für die Lambda-Funktion einrichten. Wenn DynamoDB jedoch nicht verwendet wird, muss der Benutzer eine neue Tabelle mit aktiviertem Streaming erstellen:
Jetzt ist es möglich, die Lambda-Funktion mit der DynamoDB-Tabelle zu verbinden, indem Sie ein Ereignisquellen-Mapping erstellen:
Mit der Lambda-Funktion, die mit dem DynamoDB-Stream verknüpft ist, kann der Angreifer die Lambda indirekt auslösen, indem er den DynamoDB-Stream aktiviert. Dies kann erreicht werden, indem er einen Eintrag in die DynamoDB-Tabelle einfügt:
Potenzielle Auswirkungen: Direkter Privilege Escalation zum angegebenen Lambda-Service-Roll.
lambda:AddPermission
lambda:AddPermission
Ein Angreifer mit dieser Berechtigung kann sich selbst (oder anderen) beliebige Berechtigungen gewähren (dies generiert ressourcenbasierte Richtlinien, um Zugriff auf die Ressource zu gewähren):
Potenzielle Auswirkungen: Direktes Privilegien-Eskalation zum Lambda-Service-Rolle durch Berechtigung zur Änderung des Codes und Ausführung.
lambda:AddLayerVersionPermission
lambda:AddLayerVersionPermission
Ein Angreifer mit dieser Berechtigung kann sich selbst (oder anderen) die Berechtigung lambda:GetLayerVersion
gewähren. Er könnte auf die Ebene zugreifen und nach Schwachstellen oder sensiblen Informationen suchen.
Potenzielle Auswirkungen: Direkter Privilege Escalation zum verwendeten Lambda-Service-Rolle.
lambda:UpdateFunctionConfiguration
lambda:UpdateFunctionConfiguration
Einführung
Lambda Layers ermöglicht es, Code in Ihre Lambda-Funktion einzuschließen, ihn jedoch getrennt zu speichern, sodass der Funktionscode klein bleiben kann und mehrere Funktionen Code teilen können.
Innerhalb von Lambda können Sie die Pfade überprüfen, von denen aus Python-Code mit einer Funktion wie der folgenden geladen wird:
Diese sind die Orte:
/var/task
/opt/python/lib/python3.7/site-packages
/opt/python
/var/runtime
/var/lang/lib/python37.zip
/var/lang/lib/python3.7
/var/lang/lib/python3.7/lib-dynload
/var/lang/lib/python3.7/site-packages
/opt/python/lib/python3.7/site-packages
/opt/python
Zum Beispiel wird die Bibliothek boto3 aus /var/runtime/boto3
(4. Position) geladen.
Ausnutzung
Es ist möglich, die Berechtigung lambda:UpdateFunctionConfiguration
zu missbrauchen, um eine neue Schicht zu einer Lambda-Funktion hinzuzufügen. Um beliebigen Code auszuführen, muss diese Schicht einige Bibliothek enthalten, die die Lambda importieren wird. Wenn Sie den Code der Lambda lesen können, könnten Sie dies leicht finden. Beachten Sie auch, dass es möglich ist, dass die Lambda bereits eine Schicht verwendet und Sie die Schicht herunterladen und Ihren Code hinzufügen könnten.
Angenommen, die Lambda verwendet beispielsweise die Bibliothek boto3, dies erstellt eine lokale Schicht mit der neuesten Version der Bibliothek:
Du kannst ./lambda_layer/boto3/__init__.py
öffnen und die Hintertür im globalen Code hinzufügen (zum Beispiel eine Funktion zum Exfiltrieren von Anmeldeinformationen oder zum Erhalten einer Reverse-Shell).
Dann zippe das ./lambda_layer
Verzeichnis und lade die neue Lambda-Schicht hoch in dein eigenes Konto (oder in das des Opfers, aber dafür hast du möglicherweise keine Berechtigungen).
Beachte, dass du einen Python-Ordner erstellen musst und die Bibliotheken darin platzieren musst, um /opt/python/boto3
zu überschreiben. Außerdem muss die Schicht mit der Python-Version kompatibel sein, die von der Lambda verwendet wird, und wenn du sie in dein Konto hochlädst, muss sie in der gleichen Region sein:
Jetzt machen Sie die hochgeladene Lambda-Schicht für jedes Konto zugänglich:
Und fügen Sie die Lambda-Schicht der Opfer-Lambda-Funktion hinzu:
Der nächste Schritt wäre entweder die Funktion selbst aufzurufen, falls wir dazu in der Lage sind, oder darauf zu warten, dass sie auf herkömmliche Weise aufgerufen wird - was die sicherere Methode ist.
Eine unauffälligere Möglichkeit, diese Schwachstelle auszunutzen, findet sich in:
pageAWS - Lambda Layers PersistencePotenzielle Auswirkungen: Direkter Privilege Escalation zum verwendeten Lambda-Service-Rolle.
?iam:PassRole
, lambda:CreateFunction
, lambda:CreateFunctionUrlConfig
, lambda:InvokeFunctionUrl
?iam:PassRole
, lambda:CreateFunction
, lambda:CreateFunctionUrlConfig
, lambda:InvokeFunctionUrl
Vielleicht können Sie mit diesen Berechtigungen eine Funktion erstellen und sie aufrufen, indem Sie die URL aufrufen... aber ich konnte keinen Weg finden, um es zu testen, also lassen Sie mich wissen, wenn Sie es tun!
Lambda MitM
Einige Lambdas erhalten sensible Informationen von den Benutzern in Parametern. Wenn Sie RCE in einer davon erhalten, können Sie die Informationen exfiltrieren, die andere Benutzer an sie senden, überprüfen Sie dies in:
pageAWS - Steal Lambda RequestsReferenzen
Last updated