Как обнаружить скрытые URL в PDF-файлах: руководство по анализу структуры документа

В PDF-документах могут быть встроены ссылки, которые не видны при обычном просмотре. Такие «скрытые» URL используются для перенаправления пользователей на опасные сайты, распространения вредоносного ПО или отслеживания активности. Обнаружить их можно, изучив внутреннюю структуру PDF.

Зачем искать скрытые ссылки

Скрытые URL не отображаются в визуальной части страницы, но они существуют в бинарном содержимом файла. Основные причины, по которым стоит их обнаружить:

  • Выявление фишинговых или вредоносных ссылок, которые могут быть активированы при взаимодействии с PDF.
  • Проверка документов на соответствие политике безопасности перед распространением.
  • Анализ поведения PDF для понимания того, как программы обрабатывают ссылки.
  • Обнаружение отслеживающих ссылок, которые могут передавать информацию о пользователе.

Понимание того, как и где ссылки хранятся в PDF, помогает выбрать правильный метод их обнаружения.

Как ссылки хранятся в PDF

PDF — это структурированный файл, содержащий объекты, описанные на языке PostScript. Ссылки обычно находятся в специальных типах объектов:

  • /URI — прямые URL-адреса, часто используемые для веб-переходов.
  • /Launch — команды для открытия внешних приложений или файлов.
  • /GoTo и /GoToR — переходы к другим страницам или документам.
  • JavaScript — скрипты, которые могут изменять ссылочные поля или перенаправлять пользователя.
  • Встроенные файлы — ссылки на прикрепленные файлы, которые могут содержать дополнительные URL.

Эти объекты записываются в файл в виде пар «ключ-значение». Даже если ссылка не отображается в визуальной части, её запись сохраняется в исходном коде.

Основные признаки скрытых URL

  • Вхождение слова «http://» или «https://» в нижнем регистре вместе с пробелами или нулевыми байтами.
  • Объекты типа /URI, /Launch, /GoToR, содержащие строковые данные, отличные от обычного текста.
  • Ссылки в JavaScript, которые используют eval или укороченные переменные для хранения адресов.
  • Необычная длина строковых объектов (более 50 символов), которые не соответствуют окружающему тексту.
  • Повторяющиеся шаблоны «http» в шестнадцатеричном представлении без явного HTML-тега.

Эти признаки помогают сфокусировать поиск, чтобы не тратить время на бессмысленные участки файла.

Пошаговый процесс обнаружения

Методика состоит из трёх этапов: поверхностного сканирования, глубокого анализа и проверки найденного.

  1. Поверхностное сканирование
    • Извлеките текстовые данные с помощью утилиты strings или аналогичного инструмента, чтобы найти явные URL.
    • Используйте pdftotext для преобразования PDF в обычный текст и выполните поиск по ключевым словам.
    • Глубокий анализ
      • Откройте PDF в шестнадцатеричном редакторе (например, HxD, hexedit) и найдите объекты типа /URI, /Launch, /GoToR.
      • Воспользуйтесь специализированными инструментами, такими как pdfinfo, pdfgrep или ExifTool, которые парсят структуру PDF.
      • Если PDF содержит JavaScript, выполните поиск строковых значений, которые могут быть адресами (например, «window.open», «href»).
      • Проверка
        • Сверьте найденные URL с известными доменами, чтобы исключить ложные срабатывания.
        • Проверьте, являются ли ссылки активными, с помощью безопасного браузера или инструмента, имитирующего переход.
        • Запишите местоположение каждой ссылки (номер объекта, смещение) для дальнейшего анализа.

        Каждый шаг опирается на предыдущий и позволяет систематически обнаружить даже хорошо замаскированные ссылки.

        Инструменты для автоматизированного обнаружения

        Автоматизация ускоряет процесс и снижает вероятность пропуска скрытых ссылок.

        Инструмент Основная функция Как им пользоваться
        pdfinfo (из poppler-utils) Выводит информацию о каталоге, объектах и метаданных. Выполните команду pdfinfo -box PDF.file, чтобы увидеть сырые объекты.
        pdfgrep Поиск строковых данных в PDF, включая URL. Введите pdfgrep -a «http» PDF.file для поиска строк, содержащих «http».
        ExifTool Читает метаданные и встроенные данные, может извлекать /URI. Запустите exiftool -b PDF.file, чтобы получить бинарное содержимое.
        pdfminer.six (Python) Парсит структуру PDF, позволяет искать объекты по типу. Напишите скрипт на Python с использованием PDFPage и PDFResourceManager для обхода объектов.

        Выбор инструмента зависит от требуемой глубины анализа и доступности командной строки.

        Ручное исследование с помощью шестнадцатеричного редактора

        Ручной подход полезен, когда автоматические инструменты не справляются с obfuscation или зашифрованным содержимым.

        1. Откройте PDF в шестнадцатеричном редакторе.
        2. Используйте функцию «Поиск» для ввода «/URI», «/Launch», «/GoTo» или «/GoToR» — это найдет объекты, содержащие ссылки.
        3. Прокрутите содержимое вокруг найденного объекта, чтобы увидеть строковые данные. Скрытые URL часто записаны в виде последовательности байтов, которая может быть закодирована в UTF-16LE или ASCII.
        4. Если объект закодирован с помощью фильтров (например, FlateDecode), расшифруйте его с помощью инструментов, которые умеют декодировать потоки. Многие редакторы предлагают команду «Декодировать выбранный поток».
        5. Проверьте таблицу cross-reference и трейлер, чтобы убедиться, что не пропущены ссылки, которые ссылаются на другие объекты.

        Ручная работа требует терпения, но позволяет увидеть всю структуру файла, включая скрытые ссылки, которые могут быть пропущены парсером.

        Особенности JavaScript в PDF

        Некоторые PDF содержат JavaScript, который динамически создает ссылки. Обнаружить такие ссылки можно, выполнив поиск скриптового кода.

        • Найдите тег