- •Отзывы и пожелания
- •Список опечаток
- •Нарушение авторских прав
- •Предисловие
- •Кому адресована эта книга
- •О чем идет речь в книге
- •Как извлечь максимум из книги?
- •Загрузка примеров
- •Загрузка цветных изображений
- •Условные обозначения
- •Атаки на веб-приложения. Введение
- •Правила применения оружия
- •Вопросы конфиденциальности данных
- •Очистка
- •Инструментарий тестировщика
- •Kali Linux
- •Альтернативы Kali Linux
- •Прокси-сервер
- •Burp Suite
- •Zed Attack Proxy
- •Облачная инфраструктура
- •Дополнительные источники
- •Упражнения
- •Резюме
- •Глава 2
- •Эффективное обнаружение
- •Типы тестирования
- •Построение карты сети
- •Masscan
- •hatWeb
- •Nikto
- •CMS-сканеры
- •Эффективная атака методом полного перебора
- •Средства сканирования
- •Постоянное картирование контента
- •Обработка полезной нагрузки
- •«Полиглот»
- •Запутывание (обфускация) кода
- •Дополнительные источники
- •Упражнения
- •Резюме
- •Глава 3
- •Легкая добыча
- •Анализ сети
- •Ищем вход
- •Определение учетных данных
- •Есть способ получше
- •Очистка
- •Дополнительные ресурсы
- •Резюме
- •Глава 4
- •Продвинутые способы атаки с использованием метода полного перебора
- •Распыление подбора пароля
- •Спросим LinkedIn
- •Метаданные
- •Кассетная бомба
- •За семью прокси-серверами
- •ProxyCannon
- •Резюме
- •Глава 5
- •Внедрение файлов
- •Удаленное внедрение файлов
- •Локальное внедрение файлов
- •Внедрение файла для удаленного выполнения кода
- •Резюме
- •Обнаружение и эксплуатация уязвимостей в приложениях с помощью внешних сервисов
- •Распространенный сценарий
- •Командно-контрольный сервер
- •Центр сертификации Let’s Encrypt
- •INetSim
- •Подтверждение
- •Асинхронное извлечение данных
- •Построение выводов на основе анализа данных
- •Резюме
- •Расширение функциональных возможностей Burp Suite
- •Нелегальная аутентификация и злоупотребление учетными записями
- •Швейцарский нож
- •Запутывание кода
- •Collaborator
- •Открытый сервер
- •Выделенный сервер Collaborator
- •Резюме
- •Глава 8
- •Вредоносная сериализация
- •Использование десериализации
- •Атака на пользовательские протоколы
- •Анализ протокола
- •Эксплойт для осуществления атаки
- •Резюме
- •Практические атаки на стороне клиента
- •Правила ограничения домена
- •Совместное использование ресурсов разными источниками
- •Межсайтовый скриптинг
- •Постоянный XSS
- •DOM-модели
- •Межсайтовая подделка запроса
- •BeEF
- •Перехват
- •Атаки с применением методов социальной инженерии
- •Кейлоггер
- •Закрепление в системе
- •Автоматическая эксплуатация
- •Туннелирование трафика
- •Резюме
- •Практические атаки на стороне сервера
- •Внутренние и внешние ссылки
- •Атаки XXE
- •Атака billion laughs
- •Подделка запроса
- •Сканер портов
- •Утечка информации
- •«Слепой» XXE
- •Удаленное выполнение кода
- •Резюме
- •Глава 11
- •Атака на API
- •Протоколы передачи данных
- •SOAP
- •REST
- •Аутентификация с помощью API
- •Базовая аутентификация
- •Ключи API
- •Токены на предъявителя
- •Postman
- •Установка
- •Вышестоящий прокси-сервер
- •Среда выполнения
- •Коллекции
- •Запуск коллекции
- •Факторы атаки
- •Резюме
- •Глава 12
- •Атака на CMS
- •Оценка приложения
- •WPScan
- •sqlmap
- •Droopescan
- •Arachni
- •Взлом кода с помощью бэкдора
- •Закрепление в системе
- •Утечка учетных данных
- •Резюме
- •Глава 13
- •Взлом контейнеров
- •Сценарий уязвимости в Docker
- •Осведомленность о ситуации
- •Взлом контейнера
- •Резюме
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
||
|
|
|
C |
|
E |
|
|
|
|
|
|
|
C |
|
E |
|
|
|
||||||
|
|
X |
|
|
|
|
|
|
|
|
|
X |
|
|
|
|
|
|
||||||
|
- |
|
|
|
|
|
d |
|
|
|
- |
|
|
|
|
|
d |
|
||||||
|
F |
|
|
|
|
|
|
|
t |
|
|
F |
|
|
|
|
|
|
|
t |
|
|||
|
D |
|
|
|
|
|
|
|
|
i |
|
|
D |
|
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
|
|
r |
|
|
|
|
|
|
|
|
|
r |
||||
P |
|
|
|
|
NOW! |
|
o |
P |
|
|
|
|
|
NOW! |
o |
|||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
BUY |
|
|
|||||||||
w Click |
to |
BUY 194 Глава 8.Вредоносная сериализация |
w Click |
to |
|
|
|
|
|
|
||||||||||||||
|
|
|
|
|
|
|
|
m |
|
|
|
|
|
|
|
m |
||||||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
|
|
||
|
w |
|
|
|
|
|
|
|
|
|
o |
|
|
w |
|
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
g |
.c |
|
|
. |
|
|
|
|
g |
.c |
|
|||||||
|
|
p |
|
|
|
|
|
|
|
|
|
|
p |
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
e |
Эксплуатация уязвимостей десериализации в PHP-приложениях, внутрен- |
|
|
|
e |
|
||||||||||
|
|
|
df |
|
|
n |
|
|
|
|
|
|
|
|
df |
|
|
n |
|
|
|
|
||
|
|
|
|
-xcha |
|
|
|
|
|
|
|
|
|
|
-x cha |
|
|
|
|
|
нееустройствокоторыхнеизвестно,–делонепростое,посколькутребуетопре- деленных знаний об исходном коде. Нам нужна правильная цепочка гаджетов для выполнения нашего кода. По этой причине атаки на приложения обычно используют гаджеты из сторонних библиотек, которые использовались разработчикамиприложений.Исходныйкодэтихбиблиотекболеедоступен,чтопозволяет нам отслеживать код и создавать цепочку гаджетов, которая поможет воспользоваться уязвимостью.
Packagist – это репозиторий для PHP-библиотек и фреймворков, обычно используемый разработчиками приложений: https://
packagist.org.
Для упрощения процесса разработки Composer, менеджер зависимостей для PHP, предоставляет приложениям возможность автоматически загружать библиотеки с помощью простого однострочника. Это означает, что приложения могут содержать код библиотеки,следовательно,и гаджеты POP,когда выполняется уязвимый метод unserialize().
Composer можно найти на странице https://getcomposer.org.
Атака на пользовательские протоколы
Так же как и PHP, Java предоставляет возможность обрабатывать объекты для удобной передачи или хранения. В тех случаях когда сериализованные в PHP данные представляют собой простые строки, в Java используется несколько иной подход. Сериализованный Java-объект представляет собой поток байтов с заголовком и содержимым, разбитым на блоки. Возможно, его нелегко прочитать, но он выделяется при записи пакетов или в журналах прокси-сервера в виде значений в кодировке Base64. Поскольку это структурированный заголовок, первые несколько байтов эквивалента Base64 будут одинаковыми для каждого потока.
Поток сериализованных объектов в Java всегда начинается с магических байтов: 0xAC 0xED, за которыми следует номер версии из двух байтов: 0x00 0x05.Остальныебайтывпотокебудутописыватьобъектиегосодержимое.Все, что нам действительно нужно, чтобы обнаружить это на практике, – это первые два шестнадцатеричных байта ac ed, а остальная часть потока, вероятно, будет сериализованным объектом.
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
||
|
|
|
C |
|
E |
|
|
|
|
|
|
|
C |
E |
|
|
|
|||||||
|
|
X |
|
|
|
|
|
|
|
|
|
X |
|
|
|
|
|
|
||||||
|
- |
|
|
|
|
|
d |
|
|
|
- |
|
|
|
|
|
d |
|
||||||
|
F |
|
|
|
|
|
|
|
t |
|
|
F |
|
|
|
|
|
|
|
t |
|
|||
|
D |
|
|
|
|
|
|
|
|
i |
|
|
D |
|
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
|
|
r |
|
|
|
|
|
|
|
|
|
r |
||||
P |
|
|
|
|
|
NOW! |
|
o |
P |
|
|
|
|
|
NOW! |
o |
||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||
|
|
|
|
|
BUY |
|
|
|
Атака на пользовательские протоколы 195 BUY |
|
|
|||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||
w Click |
to |
|
|
|
|
|
|
|
|
|
|
|
|
to |
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
m |
w Click |
|
|
|
|
|
|
|
m |
|||||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
|
|
||
|
w |
|
|
|
|
|
|
|
|
|
o |
|
|
w |
|
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
g |
.c |
|
|
. |
|
|
|
|
g |
.c |
|
|||||||
|
|
p |
|
|
|
|
|
|
|
|
|
|
p |
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
e |
Программист Ник Блур (Nick Bloor) разработал удивительно уязвимое при- |
|
|
e |
|
|||||||||||
|
|
|
df |
|
|
n |
|
|
|
|
|
|
|
|
df |
|
|
n |
|
|
|
|
||
|
|
|
|
-xcha |
|
|
|
|
|
|
|
|
|
|
-x cha |
|
|
|
|
|
ложение под названием DeserLab, которое демонстрирует проблемы десериализации в приложениях, реализующих пользовательские протоколы TCP. DeserLab не является типичным приложением в том смысле, что он не может быть напрямую подключен к сети, но может использоваться веб-прило жениями.DeserLabпомогаетпродемонстрировать,какэксплуатироватьошибки десериализации в Java,чтобы вызвать хаос.
DeserLab и исследования Ника Блура можно найти на странице https://github.com/NickstaDB.
Технику,которуюмырассмотрим,оченьлегкоможно использоватьдляатак на базе HTTP-протокола. Приложения нередко считывают сериализованные объекты Java из куки-файлов или параметров URL-адреса.В конце концов,облегчение межпроцессного или межсерверного взаимодействия является одним из основных преимуществ сериализации. В случае с веб-приложениями перед передачей этиданные обычно кодируются в Base64,что позволяетлегко обнаружить их в журналах прокси-серверов.Сериализованные в Java объекты, закодированные в Base64, обычно начинаются со строки rO0ABX, которая декодируется в 0xACED0005, или ранее упомянутых магических байтов и номера версии.
Чтобы запустить новый экземпляр DeserLab, можно вызвать JAR-файл, используя параметр –server, и указать IP-адрес и порт для прослушивания. Для легкости будем использовать имя сайта deserlab.app.internal для подключения к уязвимому приложению, после того как оно будет готово к запуску. Будем использовать двоичный файл java для запуска компонента сервера
DeserLab на целевой машине DeserLab.
root@deserlab:~/DeserLab-v1.0# java -jar DeserLab.jar -server 0.0.0.0 4321
[+] DeserServer started, listening on 0.0.0.0:4321
Анализ протокола
DeserLab – это простое приложение, которое предоставляет сервисы хеширования строк и доступно пользовательскому клиенту, встроенному в файл DeserLab.jar. После запуска компонента сервера DeserLab на целевой машине можем запустить компонент клиента на нашей машине, используемой для осуществления атаки, kali, применив опцию –client.
root@kali:~/DeserLab-v1.0# java -jar DeserLab.jar -client deserlab.app.internal 4321
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
NOW! |
o |
||||
|
|
|
|
|
|
|||||
|
|
|
|
|
|
|
||||
w Click |
to |
BUY 196 Глава 8.Вредоносная сериализация |
||||||||
|
|
|
|
|
|
m |
||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
|
|
e |
|
|
|
|
|
|
[+] DeserClient started, connecting to deserlab.app.internal:4321 |
||||||
|
|
|
|
|
n |
|
|
|
||
|
|
|
|
-xcha |
|
|
|
|
[+] Connected, reading server hello packet...
[+] Hello received, sending hello to server...
[+] Hello sent, reading server protocol version...
[+] Sending supported protocol version to the server...
[...]
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
После соединения клиента и сервиса и обмена приветствиями между ними клиент запроситданные для отправки на сервер для обработки.Можно ввести тестовые данные и наблюдать ответ.
root@kali:~/DeserLab-v1.0# java -jar DeserLab.jar -client deserlab.app.internal 4321
[+]DeserClient started, connecting to deserlab.app.internal:4321
[+]Connected, reading server hello packet...
[+]Hello received, sending hello to server...
[+]Hello sent, reading server protocol version...
[+]Sending supported protocol version to the server...
[+]Enter a client name to send to the server:
name
[+]Enter a string to hash: string
[+]Generating hash of "string"...
[+]Hash generated: b45cffe084dd3d20d928bee85e7b0f21
Втерминале серверного компонента приложения выводится журнал другой сторонывзаимодействия.Обратитевнимание наобмен приветствиямимежду клиентом и сервером и обмен сообщениями,где присутствуетслово name.Это пригодится, когда мы будем создавать свой эксплойт.
[+]Connection accepted from 10.0.2.54
[+]Sending hello...
[+]Hello sent, waiting for hello from client...
[+]Hello received from client...
[+]Sending protocol version...
[+]Version sent, waiting for version from client...
[+]Client version is compatible, reading client name...
[+]Client name received: name
[+]Hash request received, hashing: string
[+]Hash generated: b45cffe084dd3d20d928bee85e7b0f21
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
||
|
|
|
C |
|
E |
|
|
|
|
|
|
|
C |
E |
|
|
|
|||||||
|
|
X |
|
|
|
|
|
|
|
|
|
X |
|
|
|
|
|
|
||||||
|
- |
|
|
|
|
|
d |
|
|
|
- |
|
|
|
|
|
d |
|
||||||
|
F |
|
|
|
|
|
|
|
t |
|
|
F |
|
|
|
|
|
|
|
t |
|
|||
|
D |
|
|
|
|
|
|
|
|
i |
|
|
D |
|
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
|
|
r |
|
|
|
|
|
|
|
|
|
r |
||||
P |
|
|
|
|
|
NOW! |
|
o |
P |
|
|
|
|
|
NOW! |
o |
||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||
|
|
|
|
|
BUY |
|
|
|
Атака на пользовательские протоколы 197 BUY |
|
|
|||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||
w Click |
to |
|
|
|
|
|
|
|
|
|
|
|
|
to |
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
m |
w Click |
|
|
|
|
|
|
|
m |
|||||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
|
|
||
|
w |
|
|
|
|
|
|
|
|
|
o |
|
|
w |
|
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
g |
.c |
|
|
. |
|
|
|
|
g |
.c |
|
|||||||
|
|
p |
|
|
|
|
|
|
|
|
|
|
p |
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
e |
Поскольку используется протокол TCP,то мыдолжны перехватыватьтрафик |
|
|
e |
|
|||||||||||
|
|
|
df |
|
|
n |
|
|
|
|
|
|
|
|
df |
|
|
n |
|
|
|
|
||
|
|
|
|
-xcha |
|
|
|
|
|
|
|
|
|
|
-x cha |
|
|
|
|
|
с помощью Wireshark или tcpdump, а не Burp или ZAP. Запустив Wireshark, можем собирать и проверять поток данных TCP нашего взаимодействия с сервером DeserLab, как показано на рисунке.
Рис.8.7. Поток данных по протоколу TCP
Можно увидеть весь диалог в формате шестнадцатеричного дампа, проанализировав pcap-файл,сгенерированный нашим анализатором пакетов.На предыдущем рисунке отправленные данные – это поток, обозначенный свет- ло-серым цветом, а более темная часть– это ответ сервера.
Хотя данные могут быть немного сложными для чтения, у каждого байта свое предназначение. Можно увидеть знакомый заголовок ac ed и различные входные данные, отправленные клиентом, такие как name и string. Вы также заметите,что строковое значение–это сериализованный объектHashRequest. Это класс Java, реализуемый как сервером, так и клиентом. Сериализация ис-
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
||
|
|
|
C |
|
E |
|
|
|
|
|
|
C |
|
E |
|
|
|
||||||
|
|
X |
|
|
|
|
|
|
|
|
X |
|
|
|
|
|
|
||||||
|
- |
|
|
|
|
|
d |
|
|
- |
|
|
|
|
|
d |
|
||||||
|
F |
|
|
|
|
|
|
|
t |
|
|
F |
|
|
|
|
|
|
|
t |
|
||
|
D |
|
|
|
|
|
|
|
|
i |
|
|
D |
|
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
r |
|
|
|
|
|
|
|
|
|
r |
||||
P |
|
|
|
|
NOW! |
o |
P |
|
|
|
|
|
NOW! |
o |
|||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
BUY |
|
|
|||||||||
w Click |
to |
BUY 198 Глава 8.Вредоносная сериализация |
w Click |
to |
|
|
|
|
|
|
|||||||||||||
|
|
|
|
|
|
|
m |
|
|
|
|
|
|
|
m |
||||||||
w |
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
|
|
||
|
w |
|
|
|
|
|
|
|
|
o |
|
|
w |
|
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
g |
.c |
|
|
. |
|
|
|
|
g |
.c |
|
||||||
|
|
p |
|
|
|
|
|
|
|
|
|
p |
|
|
|
|
|
|
|
||||
|
|
|
|
|
пользуется для создания объекта, который вычислит хеш заданного ввода и |
|
|
|
e |
|
|||||||||||||
|
|
|
df |
|
|
n |
e |
|
|
|
|
df |
|
|
n |
|
|||||||
|
|
|
|
-xcha |
|
|
|
|
|
|
|
|
|
-x cha |
|
|
|
|
|
сохранит его в одном из своих свойств. Пакеты, которые мы только что перехватили, представляют собой сериализованное представление этого объекта, передаваемого от клиента к серверу и наоборот.
Сериализованный сервером объект также содержит одно дополнительное свойство: сгенерированный хеш.
Когда сервер получает сгенерированный клиентом сериализованный объект,содержащий введенную строкудля хеширования,ондесериализуетбайты, поступающие по сети, и попытается преобразовать их в класс HashRequest.
Поскольку DeserLab имеет открытый исходный код, можем проанализироватьпроцессдесериализации на серверном компоненте,посмотрев его исходный код, размещенный на GitHub.
[...]
oos = new ObjectOutputStream(clientSock.getOutputStream());
//Read a HashRequest object
request = (HashRequest)ois.readObject();
//Генерируем хеш. request.setHash(generateHash(request.getData()));
oos.writeObject(request); [...]
Мы видим, что данные считываются с клиента с помощью объекта ObjectInputStream(ois). Это просто причудливый термин для данных, поступающих от клиента,которые мы наблюдали при захвате пакетов Wireshark. Следующим шагом является попытка преобразовать данные, считанные из ois, к структуре данных HashRequest. Ссылка на новый объект HashRequest сохраняется в переменной request, которую затем можно использовать как обычный объект в памяти. Сервер получит входное значение строки, подлежащей десериализации путем вызова метода getData(), вычисления хеша и сохраненияегообратновобъектспомощьюметодаsetHash(). МетодsetHash доступен с помощью класса HashRequest, и все, что он делает,– это заполняет свойство хеша внутри объекта. Затем данные сериализуются и записываются обратно в сетевой поток с помощью метода writeObject().
Все это прекрасно работает, но данный код основан на опасных предположениях. Предполагается, что данные, поступающие от ненадежного источника (злоумышленника), на самом деле являются объектом HashRequest. Если данные – это нечто иное, чем то, что может быть безопасно преобразовано к HashRequest, Java сгенерирует исключение, и когда мы это обнаружим, будет уже слишком поздно.