5465 Total CVEs
26 Years
GitHub
README.md
Rendering markdown...
POC / mock-metadata-server.js JS
/**
 * Mock AWS Instance Metadata Service (IMDS)
 *
 * Simulates http://169.254.169.254/latest/meta-data/
 * Used to demonstrate SSRF impact - credential theft from cloud environments
 */

import express from 'express';

const app = express();
const PORT = 8888;

// Log all requests
app.use((req, res, next) => {
  console.log(`[METADATA] ${req.method} ${req.path}`);
  next();
});

// Simulate IAM role listing
app.get('/latest/meta-data/iam/security-credentials/', (req, res) => {
  console.log('[METADATA] >>> Listing IAM roles');
  res.type('text/plain').send('vulnerable-ec2-role');
});

// Simulate credential retrieval - THE MONEY SHOT
app.get('/latest/meta-data/iam/security-credentials/vulnerable-ec2-role', (req, res) => {
  console.log('[METADATA] >>> CREDENTIALS LEAKED! <<<');
  res.json({
    Code: 'Success',
    LastUpdated: '2026-01-14T10:00:00Z',
    Type: 'AWS-HMAC',
    AccessKeyId: 'AKIAIOSFODNN7EXAMPLE',
    SecretAccessKey: 'wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY',
    Token: 'FwoGZXIvYXdzEBYaDKSampleSessionToken...truncated',
    Expiration: '2026-01-14T16:00:00Z'
  });
});

// Other metadata endpoints
app.get('/latest/meta-data/instance-id', (req, res) => {
  res.send('i-0123456789abcdef0');
});

app.get('/latest/meta-data/local-ipv4', (req, res) => {
  res.send('10.0.0.42');
});

app.get('/latest/meta-data/public-ipv4', (req, res) => {
  res.send('54.123.45.67');
});

// Catch-all
app.get('*', (req, res) => {
  res.send('metadata-endpoint-response');
});

app.listen(PORT, () => {
  console.log('='.repeat(50));
  console.log('MOCK AWS METADATA SERVICE');
  console.log('='.repeat(50));
  console.log(`[*] Listening on http://127.0.0.1:${PORT}`);
  console.log('[*] Simulates: http://169.254.169.254');
  console.log('[*] Waiting for SSRF requests...');
  console.log('');
});