Cloud - AWS
AWSome Pentesting Cheatsheet
- Created by pop3ret
ARN
A number to identify an object in AWS
Example
- Field -> ARN
- Field -> Type, most of time will be AWS
- Field -> service, in this case IAM
- Field -> User ID
- Field -> entity identifier
IAM
- It's assumed that we have gain access to the AWS Credentials
- We can see if we have permissions using Amazon's policy simulator
- Always look for policies and roles with the * symbol.
- See which user do not have MFA enabled
- User enumeration in IAM Panel and group enumeration
- We can also enumerate roles from the same interface
- Root user is super admin
Configure AWS cli
Or configure it using a profile
The credential file is located in ~/.aws/credentials
Listing IAM access Keys
1. Enumerating IAM users
Checking credentials for the user
Listing IAM Users
Listing the IAM groups that the specified IAM user belongs to
Listing all managed policies that are attached to the specified IAM user
Listing the names of the inline policies embedded in the specified IAM user
2. Enumerating Groups IAM
Listing IAM Groups
Listing all managed policies that are attached to the specified IAM Group
Listing the names of the inline policies embedded in the specified IAM Group
3. Enumerating Roles
Listing IAM Roles
Listing all managed policies that are attached to the specified IAM role
Listing the names of the inline policies embedded in the specified IAM role
4. Enumerating Policies
Listing of IAM Policies
Retrieving information about the specified managed policy
Listing information about the versions of the specified manages policy
Retrieving information about the specific version of the specified managed policy
Retrieving the specified inline policy document that is embedded on the specified IAM user / group / role
aws iam get-user-policy --user-name user-name --policy-name policy-name
aws iam get-group-policy --group-name group-name --policy-name policy-name
aws iam get-role-policy --role-name role-name --policy-name policy-name
5. Exploitation Scenario
General Guidelines
- AWS token compromised (Developer machine, phishing etc) and we as attackers will gonna use it.
Enumerating the owner of the key and initial compromise
Or specifing a profile
If you have the password of the root account instead of key, log in
Or use the IAM in case the account is not the root
The account id can be cathered using the sts get caller command.
Privilege Escalation
- Privilege escalation on AWS is based on misconfigurations, if we have more permissions than necessary, its possible to obtain higher privileges.
Study Case
- A user was compromised with the List Policy and Put User Policy permissions, an attacker could leverage this Put User privilege to add an inline administrator to itself, making it administrator of the instance.
Exploitation
- Getting the IAM user
- Listing policies attached to a user
- Retrieving information about a specific policy
If there are more than one version of the policy, we can also list them
Now we can finally retrieve the contents of the policy
It's important to use the command above to check the information about the default policy
- Escalation
If we have the PutUserPolicy is enabled, we can add an inline administrator policy to our user.
Administrator policy example
{
"Version": "2021-10-17",
"Statement" : [
{
"Effect":"Allow",
"Action": [
"*"
],
"Resource":[
"*"
]
}
]
}
Attaching this policy into our user
aws iam put-user-policy --user-name example_username --policy-name example_name --policy-document file://AdminPolicy.json
Listing inline policies of our user
Listing a restricted resource (Example S3)
Interesting Permissions
- iam:AttachUserPolicy -> Attach a policy to a user
- iam:AttachGroupPolicy -> Attach a policy to a group
- iam:AttachRolePolicy -> Attach a policy to a role
- iam:CreateAccessKey -> Creates a new access key
- iam:CreateLoginProfile -> Creates a new login profile
- iam:UpdateLoginProfile -> Update an existing login profile
- iam:PassRole and ec2:RunInstances -> Creates an EC2 instance with an existing instance profile
- iam:PutUserPolicy -> Create/Update an inline policy
- iam:PutGroupPolicy -> Create/Update an inline policy for a group
- iam:PutRolePolicy -> Create/Update an inline policy for a role
- iam:AddUserToGroup -> Add an user to a group
- iam:UpdateAssumeRolePolicy and sts:AssumeRole -> Update the AssumeRolePolicyDocument of a role
- iam:PassRole,lambda:CreateFunction and lambda:InvokeFunction -> Pass a role to a new lambda function and invoke it
- lambda:UpdateFunctionCode -> Update the code of an existing lambda function
Persistence & Backdooring
- Suppose we have two users, the user A has permissions to create Access Keys to user B, this misconfig allows us to create an access key for user B and persist our access.
Creating a new access key for another user
Configuring AWS cli for the new user
Remember, an user can have the maximum of 2 access keys.
Testing the credential
Accessing more credentials
- It's possible to assume other roles with the sts:AssumeRole permission (Example: An user doesn't have access to an s3 instance, but it has this permission, we can easily assume other roles if we are in the trust relashionship, increasing our access in the instance)
Listing managed policies attached to a user
Retrieving information about a specific policy
Listing information about the version of the policy
Retrieving information about a specific version
Listing IAM roles
Listing trust relationship between role and user (Which roles we can assume)
Listing all managed policies attached to the specific IAM role
Retrieving information about the specified version of the policy
Getting temporary credentials for the role
Configuring AWS cli with newer credentials (On Linux)
Getting information about the temporary credential
S3 - Simple Storage System
- Storage system that allows users to store and retrieve data.
- List,Get,Put and Delete operations can be performed on the objects of the bucket
- Buckets are global, meaning that they are available to all regions
- It's possible to bruteforce the bucket name and region in the URL
- Its possible to apply ACL's to bucket and object level and bucket policies for bucket level
- There is also time limited URL's and identity-based policies
- Identity policies are enumerated using IAM commands
Enumeration
Listing all buckets in aws account
Getting information about a specific bucket
Getting information about a specific bucket policy
Getting the Public Access Block configuration for an S3 bucket
Listing all objects in a specific bucket
Getting ACL information about a specific object
Data Exfiltration
- It's possible to brute-force files in the bucket
- If the bucket is misconfigured, we can read data through web browser, cli/api or time-based URL.
Public Access
- Just enter the URL in the browser
Authenticated User
Time-Based Url
- Generate a time-based url for an object
- Userful if the object is not public
Lambda & API Gateway
- Serverless event-driven platform
- Runs code in response to events and automatically manages computing resources required by that code
- Can trigger from other AWS services or call directly from the API Gateway
- A lambda function is a piece of code that is executed whenever is triggered by an event from an event source
- API Gateway is an AWS service for creating, publishing, maintaining, monitoring and securing REST, HTTP and WebSocket API
- API Gateway can be used to trigger lambda functions in a synchronous (api gateway), asynchronous (event) or stream (Poll Based) way.
- If we found a lambda function that access an S3 (Example) its possible to change its code and gain access to the files.
- If API Gateway is used, we can enumerate the API to see how its possible to invoke the lambda function (Craft the URL).
Enumeration
Listing All lambda functions
Listing information about a specific lambda function
- This command enables us to download the source code of the lambda function
Listing policy information about the function
- We can get information like who can execute this functions, ID and other information with this command
Listing the event source mapping information about a lambda function
Listing Lambda Layers (Depedencies)
Listing full information about a lambda layer
Listing Rest API'S
Listing information about a specific API
Listing information about endpoints
Listing information about a specific endpoint
Listing method information for the endpoint
- Test various methods to see if the API supports it.
Listing all versions of a rest api
Getting informatin about a specific version
Listing API KEYS
Getting information about a specific API Key
Initial Access
- It's possible to get RCE through API Gateway if it executes commands.
- If you can execute commands, there is a way to retrieve keys from the API Gateway, just use
env
, configureaws cli
and proceed with the exploitation.
Credential Access
Getting credentials from Lambda can be done in 2 ways
- Keys in the source code
- Keys in the environment variables
These keys can be gathered using SSRF, RCE and so on.
Getting credentials using RCE
Getting credentials using SSRF
Getting credentials using SSRF and wrappers
Getting credentials from lambda environment variables (cli)
- It's important to enumerate the functions first with
aws lambda list-functions
Persistence
- If the user has sufficient rights in the lambda function, it's possible to download the source code, add a backdoor to it and upload. Every time the lambda executes, the malicious code will also execute.
- Always try to update the code of layers (dependencies) instead of the actual lambda code, this way our backdoor will be difficult to detect.
Checking which user is executing
Checking all managed policies attached to the user
Checking informations about a specific policy
Listing all lambda functions
Listing information about the specified lambda
- Download and analyze the codes
Listing policy information about the specific lambda function
- We can grab informations like id, who can invoke and other details with this command (Helps to build the query to execute the lambda function).
Listing Rest API'S
Listing information about a specific API
Listing information about endpoints
Listing information about a specific endpoint
Listing method information for the endpoint
- Test various methods to see if the API supports it.
Listing all versions of a rest api
Getting informatin about a specific version
Uploading the backdoor code to aws lambda function
Invoke the Function
Where
- API-ID -> uj3948ie
- Region -> us-east-2
- Resource (Endpoint) -> EXAMPLE
- Method -> Get
- Stage (Version) -> default
- API-Key -> None
All these details are gathered during the enumeration.
Privilege Escalation
- If we have a user with PassRole and CreateFunction roles and also AttachRolePolicy role in a Lambda Function, its possible to create a function with a code that changes the lambda role to admin then the user to Administrator.
Create a lambda function and attach a role to it
aws lambda create-function --function-name my-function --runtime python3.7 --zip-file fileb://my-function.zip --handler my-function.handler --role ARN --region region
- Inside the function's code, we will add the administrator permission to the role and to the user
Example code to add the permissions
import boto3
import json
def handler(event,context)
iam = boto3.client("iam")
iam.attach.role.policy(RoleName="name",PolicyArn="arn",)
iam.attach.user.policy(UserName="name",PolicyArn="arn",)
return {
'statusCode':200
'body':json.dumps("Pwned")
}
Invoke a lambda function
Listing managed policies to see if the change worked
AWS Secret Manager
- AWS Service that encrypts and stores secrets
- Transparently decrypts and returns in plaintext
- KMS used to store keys (AWS Key and Customer Managed Key)
- Asymmetric and Symmetric keys can be created using KMS
Enumeration
Listing all secrets stored by Secret Manager
Listing information about a specific secret
Getting policies attached to the specified secret
Listing keys in KMS
Listing information about a specific key
Listing policies attached to a specific key
Getting full information about a policy
- Shows who can access the keys
Credential Exfiltration
- If the user has access to Secret Manager, it can decrypt the secrets using the web, cli or API
Listing policies attached to a user
Retrieving information about a specific version of the policy
- Here we can see the permissions
Listing all secrets stored by the Secret Manager
Listing information about a specific secret
- Here we get the secret Key Id to describe the secret
Getting resource-based policy attached to a specific secret
Getting the secret value
- Retrieves the actual value
KMS
- If we compromised as an example an S3 with an encrypted file, we can decrypt it using the keys stored in KMS.
Listing a specific key
Listing policies attached to a specified key
- Here we can see who can access the key, the description of it and so on
Listing full information about a policy
- Run the previous command in all keys to see who can access it
Decrypt the secret using the key
- There is no need to specify the key information because this information is embedded in the encrypted file
Containers
Divided into three categories
- Registry -> Secure place to store container images (ECR)
- Orchestration -> Configure when and where the containers run (ECS, EKS)
- Compute -> Use to do computing-related tasks (EC2, Fargate)
- Is it possible to create a backdoor image and add to a EKS cluster
- Always look how VPC's are communicating with each other, maybe is possible to pivot through the EKS VPC from other VPC and compromise the entire cluster
Initial Access
- The initial access can be done by exploiting some RCE in web app to get access to the container, afterwards it's possible to compromise the EC2.
After the RCE, we can list all secrets in EKS
Getting the secret information from EKS
- It's also possible to do sandbox escaping (Tool:
deepce
)
Enumeration
ECR
Listing all repositories in container registry
Listing information about repository policy
Listing all images in a specific repository
Listing information about an image
ECS
Listing all ECS clusters
Listing information about a specific cluster
Listing all services in a specified cluster
Listing information about a specific service
- This command shows the logs of the service
Listing tasks in a specific cluster
Listing information about a specific task
- Also shows information about network, userful if trying to pivot
Listing all containers in a specified cluster
EKS
Listing all EKS clusters
Listing information about a specific cluster
Listing all node groups in a specified cluster
Listing specific information about a node group in a cluster
Listing Fargate in a specified cluster
Listing information about a fargate profile in a cluster
Persistence
- It's possible to modify an existing docker image with a backdoor, when this image is used it will trigger our team server.
Enumerating the user
Listing manager policies attached to the IAM role
Getting information about the version of the managed policy
Getting information about the repositories in container registry
Listing all images in the repository
Listing information about an image
Authenticate the docker daemon to ECR
aws ecr get-login-password --region region | docker login --username AWS --password-stdin ecr_address
Building images with backdoor
Tagging the docker image
Pushing the image to ECR
EC2
- AMI, images used to create virtual machines
- It's possible to create a malicious image to compromise users
- We can access an instance using SSH Keys, EC2 Instance Connect, Session Manager
- The SSH Key method is permanent, we need to gather the private key to connect to the instance
- EC2 Instance connect is an IAM right that we can add to a user, enabling us to temporarily connect to an instance
- Session manager only work in browser and it does not need SSH Key
- Windows machines can be accessed by using RDP, Session Manager
- Security Groups acts as a virtual firewall to control inbound and outbound traffic, acts at the instance level, not the subnet level.
Enumeration
Listing information about all instances
Listing information about a specific region
Listing information about specific instance
Extracting UserData attribute of specified instance
This command gathers the metadata from the instance, like commands or secrets. The output is base64 encoded
Listing roles of an instance
Exploitation
- Initial access can happen by RCE or SSRF
- Metadata can be used to exfiltrate information from the instance
Remote code execution
AWS Metadata
If we have remote code execution or SSRF, we can grab metadata information
Grabbing the keys to access the instance
curl http://169.254.169.254/latest/meta-data/identity-credentials/ec2/security-credentials/ec2-instance
Grabbing the keys in metadata version 2
TOKEN=`curl
X PUT "http://169.254.169.254/latest/ api /token" H "X-aws-ec2-metadata-token-ttl-seconds: 21600"`
&& curl H "X-aws-ec2-metadata-token: $TOKEN" v http://169.254.169.254/latest/meta-data/
AWS Userdata
Version 1
Version 2
TOKEN=`curl
X PUT "http://169.254.169.254/latest/ api /token" H "X-aws-ec2-metadata-token-ttl-seconds: 21600"`
&& curl H "X-aws-ec2-metadata-token: $TOKEN" v http://169.254.169.254/latest/user-data/
Privilege Escalation
- One approach to get a shell in an instance is to put a reverse shell in UserData attribute, when the instance is launched, we will have the connection.
- Another approach happens when we have the iam:PassRole and iam:AmazonEC2FullAccess permissions, we can add an administrator role to the compromised EC2 instance and access aws services.
Getting information about the key
Getting policies attached to the IAM user
Getting information about a specific policy version
To attach a role to an EC2 instance, we can use the RCE to grab the ID
Listing instance profiles
Attach an instance profile to an EC2 instance
Credential Access
- We can grab the credentials by abusing metadata (Web Application with SSRF,RCE and so on)
After the initial access
- Enumerate the key (Role)
- If there are roles associated with the key, we can grab the credentials by issuing a request to the metadata endpoint (v1 or v2)
- Configure the aws cli
Or use environment variables.
Persistence
- All the persistence techniques works here, SSH persistence, vim backdoor and so on.
SSH Persistence example
- Generate SSH Key pair
- Add public key to authorized_keys
- Use the private key to connect
Elastic Block Store
- Block storage system used to store persistent data
- It's possible to attach this drive to EC2 and increase the storage (Like and HD, but scalable).
- It's possible to create a snapshot (It will be saved on S3) and create a volume from this snapshot.
- It's possible to attach the snapshot (Backup of BS) to an EC2 instance
- Snapshots can be used as volumes or AMI's
Enumeration
Enumerating EBS volumes
- If the volume is available, it can be attached to an EC2 instance
- Check if the EBS is encrypted
Enumerating Snapshots
- Also check if the snapshot is encrypted
Exploitation & Data Exfiltration
- Create a snapshot of an EC2 instance, create a volume from snapshot and attach to other EC2 instance.
- User need to have IAM permissions on EC2
- Maybe we don't have the right to access the instance but have rights to create a snapshot and attach it to another machine.
Creating a snapshot of a specified volume
Listing snapshots
Creating a volume from a snasphot
- The volume needs to be in the same availability zone as the instance we have access
Attaching the volume to an instance
aws ec2 attach-volume --volume-id VolumeID --instance-id InstanceID --device /dev/sdfd -> Can be other value
Mounting the volume
After mounting, we will have access to the disk.
RDS - Relational Database Service
- Service to use, operate and scale relational databases in AWS (MariaDB, MySQL and similar)
- The access is done by using password, password+IAM or password+kerberos
- It's possible to restrict access using restrictions such as specific EC2 or lambda or use network-level restrictions such as vpc, ip.
- RDS Proxy hadles the traffic between the application and the database, it enables the enforcing of IAM permissions and use secrets manager to store credentials.
Enumeration
Listing information about clusters in RDS
Listing information about RDS instances
- IAMDatabaseAuthenticationEnabled: false -> Need password to access the instance
Listing information about subnet groups in RDS
Listing information about database security groups in RDS
Listing information about database proxies
Data exfiltration
- If the instance is in a security group or VPC, we need to compromise it first to access the database (For example, we compromise an EC2 instance in the same VPC, then its possible to connect)
List instances in RDS
List information about the specified security group
Password-based authentication
IAM Based authentication
1. Identify the user
2. List all policies attached to a role
3. Get information about a specific version of a policy
4. Get a temporary token from the RDS
- To be easier, we can put it in a variable
TOKEN=$(aws rds generate-db-auth-token --hostname hostname --port port --username username --region region)
5. Connect to the DB using the token
SSO & Other Services
Single Sign On (SSO)
- Used to manage access to multiple AWS accounts and applications centrally.
- Provide users a way to interact with all services and applications through one place
- Can be used to manage access and user permissions to all AWS accounts
- The identity source can use AWS SSO's identity store or external identity store (Okta, SAML and similar)
CloudTrail
- Log monitoring service, allows us to continuously monitor and retain account activity related to actions in our AWS account
- Provide event history of AWS account activity, SDKs, command line tools and other services
- Commonly used to detect unusual behavior in AWS account
- Pacu automatically changes the user agent to deceive the logs of cloudtrail
Userful Commands
List trails
Disabling CloudTrail
Disable monitoring of events from global events
Disable CloudTrail on specific regions
aws cloudtrail update-trail --name example_trail --no-include-global-service-event --no-is-multi-region --region=eu-west
AWS Shield
- Used to protect services from Denial of Service Attacks
- There are 2 versions, the standard and the Advanced
AWS Waf
- Used to protect applications against common web application attacks
- Common WAF bypasses can be tested against it
- To detect a WAF, we can use
wafw00f
AWS Inspector
- Automated security assessment service that helps improve the security and compliance of applications on AWS
- Works with an agent
AWS Guard Duty
- Threat detection service that monitors for malicious activity and unauthorized behavior
- Works by collecting and analyzing logs
Virtual Private Cloud
- Used to create an isolated infrastructure within the cloud, including subnets and so on.
- If the VPC has an internet gateway, means it is a public subnet
- Every VPC can have Network ACL's
Routing Tables
A set of rules to determine where the traffic will be directed, comes in the form of Destination and Target, defined as follows
DESTINATION TARGET
IP local -> VPC Internal
IP igw -> Internet Gateway
IP nat -> NAT Gateway
IP pcx -> VPC Peering
IP vpce -> VPC Endpoint
IP vgw -> VPN Gateway
IP eni -> Network Interface
- VPC Internal -> Internal IP, no internet connection
- Internet Gateway -> Used to access the internet
- NAT Gateway -> Does the NAT between machines, allows one-way connection to the internet
- VPC Peering -> Allows the communication between 2 VPC's
- VPC Endpoint -> Used to access aws services without internet connection (Internet Gateway)
- VPN Gateway -> Used to expand the cloud to on premises and vice-versa
- Network Interface -> Network Interfaces
Enumeration
Listing VPC's
Listing VPC's specifying the region
Listing VPC information by ID
Listing subnets
Listing subnets by VPC-id
Listing routing tables
Listing routing tables by VPC-id
Listing Network ACL's
Lateral Movement and Pivoting
- We can abuse VPC peering to do lateral movement
Scenario
- There are 3 VPC's -> A,B,C
- A can access B through peering and B access C. We can use VPC B as a peering pivot to access VPC C from VPC A.
- The lateral movement can be done if we gather keys or other machines
- Always enumerate the subnets to see in which subnet we can access other VPC's