Фахівці зійшлися в думках: сьогодні безпеку корпоративних мереж знаходиться під великою загрозою, хакерам вдалося проникнути за периметр локальних мереж. Цього разу з бойового арсеналу вони вибрали найбільш уразлива ланка в безпеці - веб-додатки.
REMOTE_ADDR: 20.20.20.20
REMOTE_PORT: 37938
REMOTE_HOST: proxy.isp.com
У найпростішому вигляді схему підключення корпоративного користувача можна уявити як ланцюг з 4-х систем:
На цьому наші пошуки не закінчилися, продовжимо вивчати змінну
$ _SERVER.
Крім вже описаних даних, в змінних сервера можуть зберігатися заголовки X-Forwarded-For і Via. Вони є службовими і формуються проміжними серверами в міру транспортування запиту. Ці поля в подальшому використовуються для ідентифікації клієнта, що послав запит, щоб потім доставити йому відповідь сервера.
В результаті ми отримали:
X-FORWARDED-FOR: 192.168.10.5, 10.10.10.10
VIA: 1.1 proxy.intranet.com (squid / 2.6.STABLE9), 1.0 proxy.isp.com (squid / 2.6.STABLE9)
Тепер, нам відомо, що proxy.isp.com дійсно належить провайдеру. Якщо подивитися на значення VIA в заголовку, то видно, що пакет проходить через proxy.intranet.com, а вже потім через proxy.isp.com. Також можна додати, що обидві проксі працюють по порту 3128 і використовують squid 2.6.
Java applet
Для виконання аплета додаємо наступний код в наш скрипт go2intranet.php:
Аплет виводить дані в консоль віртуальної машини Ява:
Цей код ідентичний з:
Але буде вважатися безпечним для систем контролю вмісту. Але що якщо у клієнта відключена віртуальна машина
Java?
Firefox і Java
Цей метод запропонував вже відомий нам з минулої статті Jeremiah Grossman. Але він не став оригінальним в цьому плані. Виявляється, ще першовідкривачі даного методу підмітили, що не обов'язково створювати нове з'єднання, оскільки ви вже знаходитеся на сторінці і воно вже встановлено:
Cross Site Tracing
Атакуючий може використовувати об'єкт XmlHttpConnection, для того щоб робити POST- і GET-запити на зламаний їм сервер. У нього також є можливість додавати свої заголовки в запит, але X-Forwarded-For і Via генеруються проксі-сервером, а тому на момент підключення вони невідомі і доступні тільки веб-сервера. Як же дізнатися, які дані отримує сервер? Відповідь на це питання лежить в документації HTTP-протоколу. Як описано в стандарті, крім методів POST і GET, існують і інші. Деякі з них можна зустріти лише на папері, але є і такі, які можу допомогти нам з рішенням даного завдання.
В результаті responseText містить повний текст нашого запиту, який можна легко витягти, щоб отримати виключно потрібні нам значення:
Як бачите, якщо в запиті передаються цікавлять нас дані (X-Forwarded-For і Via), атакуючий має широкий спектр інструментарію, щоб з легкістю дістати їх. Але, як вже говорилося раніше, ці поля можуть бути відсутні. Якщо користувач для виходу в Інтернет використовує анонімний проксі-сервер, від них не залишиться й сліду. Що може зробити хакер, для того щоб обійти проксі?
Flash XMLSocket
Практично всі програмні засоби, доступні з браузера, використовують його настройки при мережевому обміні даними. Оскільки проксі-сервер налаштовується в ньому ж, то все підключення повинні робитися через нього. Так воно і є, за винятком деяких об'єктів, які ігнорують проксі сервер. Один з таких об'єктів - XMLSocket, реалізований у
Flash.
Metasploit Decloaking Engine
Дуже гарне рішення нашої задачі запропонував проект Metasploit. Демонстрація використовує кілька варіантів тестування, щоб більш точно визначити мережеву конфігурацію клієнта. Найцікавіше в цьому рішенні - це визначення DNS-сервера провайдера, який надає доступ в Інтернет.
Ініціювати такий запит дуже просто, достатньо послатися на ресурс з домену, наприклад, на зображення:
У демонстрації від Metasploit так і робиться. Але крім цього, таким же чином створюються запити з java. Політика безпеки в java блокує створення підключення до іншого хосту (hacker.com і 347205.hacker.com - це різні сайти), але DNS lookup все ж відбувається.
Комплексне рішення
Залежно від ситуації, хакер може застосувати ті чи інші методи. Кожен із способів специфічний, тому в деяких випадках доведеться відмовитися від деяких з них. Наприклад, варіант з використанням PHP буде працювати навіть через малюнок:
Решта проканати через підключення віддаленого скрипта:
Так може виглядати PHP-код, який об'єднує техніку Ява-сканування і отримання інформації з заголовків сервера:
Таким буде код Java-аплета:
Для прикладів під FireFox необхідно визначати ім'я браузера:
І в такому дусі реалізувати комплексну перевірку.
Для кінцевих користувачів можна лише порадити використовувати анонімні проксі, відключити підтримку Java і Flash. Не сама райдужна перспектива, зате корисна штука для дотримання корпоративної безпеки.
Покажи цю статтю друзям: