前言
前段时间博主在做学校内部项目的时候,项目需要暂时上线测试,没想到上线测试几天,MySQL 数据库数据就被恶意删除,但是当时我们没有太当回事,以为只是一次普通黑客攻击,恢复数据之后仍然可以正常使用。
但是当项目快结题,学校领导需要上午检查答辩时,早上我们查看项目数据库,居然整个数据库都崩掉了,基本恢复不了数据,搞得当天很尴尬。由于项目是内部项目,因此只有学校内部人员了解情况,纯粹是内部人员搞事情。
所以这次我吸取惨痛教训,总结经验,从攻击者如何入侵数据库,以及当我们遇到攻击如何快速抵御攻击、快速恢复正常服务,平时应该对数据库做哪些日常防护等等方面,进行全面细致的讲解
不过我自己毕竟不是专门做网络安全方面的,如果有什么错误、不足或是遗漏,还请大佬们在评论区指出 :kissing_heart:
注:本次演示系统
靶机:CentOS 7.9
攻击机:WSL2 kali
入侵攻击
介绍
首先我们知道 MySQL 数据库入侵有很多种方式,包括 MySQL 注入、MySQL 提权、MySQL 数据库 Root 账号 webshell 获取等等,下面将详细讲解数据库入侵攻击步骤
信息收集
端口扫描
我们可以使用 Nmap(Network Mapper) 进行端口扫描,MySQL 默认端口是 3306 端口,但也有自定义端口,我们可以使用如下命令进行端口探测,扫描之后我们就可以清楚地看到服务器上的服务及对应端口
常用命令:
nmap -T4 -A -v -Pn IP
#最常用的一种扫描
-T4 #设置时序,越高扫描越快
-A #启用操作系统检测,版本检测,脚本扫描和跟踪路由
-v #增加详细级别(使用-vv或更高级别以获得更好的效果)
-Pn #无ping扫描
# 特定端口扫描
nmap -p 3306 <ip>
# 全端口扫描
nmap 3306 <ip>
版本收集
MSF
我们可以使用 MSF(Metasploit)进行数据库版本信息的收集,从而发现相应的漏洞。它本身附带数百个已知软件漏洞,是一款专业级漏洞攻击工具。
注:MSF 内置 nmap 为 db_namp,但是需要启动 postgresql 服务才能使用
MSF 是一个免费的、可下载的框架,通过它可以很容易地获取、开发并对计算机软件漏洞实施攻击。
其中 msf 为总模块,其他均为分支模块。分支模块如下
- 辅 助 模 块 (Auxiliary,扫描器),扫描主机系统,寻找可用漏洞;
- 渗透攻击模块 (Exploits),选择并配置一个漏洞利用模块;
- 攻击载荷模块 (Payloads),选择并配置一个攻击载荷模块;
- 后渗透攻击模块 (Post),用于内网渗透的各种操作;
- 编 码 器 模 块 (Encoders),选择编码技术,绕过杀软(或其他免杀方式);
所有模块位置:/usr/share/metasploit-framework/modules/
使用如下命令安装 metasploit-framework 框架
sudo apt-get install metasploit-framework
启动 postgresql 数据库,并初始化 msf 数据库(没有数据库尽管可以正常使用,但是无法存储数据,会导致无法使用部分功能),postgresql 默认 5432 端口。
sudo service postgresql start
sudo msfdb init
检测是否安装成功
sudo msfconsole
# 查看连接状态
db_status
渗透步骤(Exploit)
search xxx #搜索某个漏洞
use xxx #使用某个漏洞利用模块
show options #查看配置选项
set payload #配置攻击载荷
exploit #执行渗透攻击
开始搜索
# 进入
sudo msfconsole
# 依次输入如下命令
# 扫描 MySQL 版本信息
use auxiliary/scanner/mysql/mysql_version
# 设置目标IP
set rhosts <ip>
# 运行所有模块
run
SQLMap
SQLMap 是一种用于自动化检测和利用 SQL 注入漏洞的开源工具。SQL Shell 命令是 SQLMap 中的一个特性,它可以让你在被攻击的数据库服务器上执行 SQL 语句。
常用命令
sqlmap -u URL --sql-shell
其中,URL 是你想要测试的目标网站的地址。当你运行这条命令时,SQLMap 将会尝试检测目标网站是否存在 SQL 注入漏洞,如果检测到漏洞,它会自动利用漏洞进入数据库服务器,并给你一个交互式的 SQL Shell。
在 SQL Shell 中,你可以输入任意的 SQL 语句,并查看执行结果。例如,你可以输入 SELECT * FROM users; 来查看数据库中所有用户的信息。
密码破解
暴力破解
MSF
使用指定密码字典 /tmp/password.txt 进行爆破,推荐:爆破字典
爆破所有用户密码
use auxiliary/scanner/mysql/mysql_login
set rhosts <ip>
set pass_file /tmp/password.txt
set user_file /tmp/username.txt
run
爆破根用户密码
use auxiliary/scanner/mysql/mysql_login
set rhosts <ip>
set pass_file /tmp/password.txt
set username root
run
针对此类问题,我们可以使用 字母+数字+符号 组成的强口令作为应对方法
但是扫描过程中我们会发现有时候会异常终止,出现错误Unable to Connect: Host 'XX' is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts'
这时候如果我们再次运行模块就会出现Unsupported target version of MySQL detected. Skipping
,无法继续爆破
这是因为同一个 IP 在短时间内产生太多连接数,超过数据库 max_connection_errors 的最大值,中断数据库连接而导致的阻塞
此时该 IP 会被拉入黑名单,如果是内部人员误操作,作为维护者我们可以使用下面的措施恢复服务
临时方法
# mysql -uroot -p
mysql> flush hosts;
永久方法
# vi /etc/my.cnf
max_connect_errors = 1000
# 或是
# mysql -uroot -p
set global max_connect_errors=1000;
当此值设置为10时,意味着如果某一客户端尝试连接此 MySQL 服务器,但是失败(如密码错误等等)10次,则 MySQL 会无条件强制阻止此客户端连接。如果希望重置此计数器的值,则必须重启 MySQL 服务器或者刷新。 当这一客户端成功连接一次 MySQL 服务器后,针对此客户端的 max_connect_errors会清零。但是不建议调大,这是应对密码爆破的有效手段。
作为攻击者我们可以使用如下方法解决上述问题
- 使用代理或VPN:通过使用代理服务器或虚拟私人网络(VPN)来隐藏真实IP地址,从而避免同 IP 登录次数过多的限制。使用不同 IP 轮流使用进行登录尝试,以避免单一IP被封禁
- 设置延迟和间隔:在爆破过程中设置适当的延迟和间隔,以降低登录次数并减少被封禁的风险。可以调整爆破工具的设置,使其在每次尝试登录后等待一段时间,例如几秒钟或几分钟。
Nmap
指定使用 Nmap 工具中的 mysql-brute 脚本对目标主机进行 MySQL 暴力破解
nmap --script=mysql-brute <ip>
其他
除了上面两个再推荐一个开源的暴力破解工具:Hydra
Hydra 是一款非常强大的暴力破解工具,它是由著名的黑客组织THC开发的一款开源暴力破解工具。Hydra 是一个验证性质的工具,主要目的是:展示安全研究人员从远程获取一个系统认证权限。
目前该工具支持以下协议的爆破:
AFP,Cisco AAA,Cisco身份验证,Cisco启用,CVS,Firebird,FTP,HTTP-FORM-GET,HTTP-FORM-POST,HTTP-GET,HTTP-HEAD,HTTP-PROXY,HTTPS-FORM- GET,HTTPS-FORM-POST,HTTPS-GET,HTTPS-HEAD,HTTP-Proxy,ICQ,IMAP,IRC,LDAP,MS-SQL,MYSQL,NCP,NNTP,Oracle Listener,Oracle SID,Oracle,PC-Anywhere, PCNFS,POP3,POSTGRES,RDP,Rexec,Rlogin,Rsh,SAP / R3,SIP,SMB,SMTP,SMTP枚举,SNMP,SOCKS5,SSH(v1和v2),Subversion,Teamspeak(TS2),Telnet,VMware-Auth ,VNC和XMPP。
常用命令
hydra -l root -P '/tmp/password.txt' <ip> mysql
参数介绍
-l 小写 指定用户名
-L 大写 指定用户名字典
-p 小写 指定密码
-P 大写 指定密码字典
-C 指定用户名:密码 字典
-M 指定目标ip列表文件
-t 同时运行的线程数
更多详细介绍大家可以直接从官网了解
文件包含
本地文件包含漏洞可以包含文件,通过查看文件代码获取数据库配置文件,进而读取数据库用户名和密码。
其他情况
嗅探
有些软件会将 IP 地址、数据库用户名和密码写进程序中,运行程序后,通过 Cain 软件进行嗅探,可以获取数据库密码。另外 MySQL客户端管理工具有的管理员会建立连接记录,这些连接记录保存了用户名、密码和连接 IP 地址或者主机名,通过配置文件或者嗅探可以获取用户名和密码。
DDoS 攻击
客户端请求连接数据库后,会提示客户端输入用户密码,如果客户端不输入密码,那么数据库服务端会在一个超时时间后,断开连接。也就是说,在服务端主动断开连接前,这个连接实际上需要占用一个 SLOT ,也就是max_connection 中的一个。
攻击者可以利用这个规则,并发的发起大量连接请求,但是不提供密码,等待服务端的超时,这样可以把max_connection 的连接都占用掉。
这种情况攻击者并不是为了获取数据库中信息,而仅仅只是为了攻击服务,使服务挂掉
不管我们是使用弱口令爆破、sqlmap 注入、还是网站中的明文配置信息、或是诸如其他漏洞方式,只要我们可以得到数据库的用户名和密码,就可以进入下一步
数据库提权
博主本身不是专业网络安全的,也没有做过系统的 PHP 开发,因此下面关于攻击方面的只简单讲下思路,后面着重讲如何防御
获取 Webshell
Webshell 是黑客经常使用的一种恶意脚本,其目的是获得服务器的执行操作权限,可以执行系统命令、窃取用户数据、删除web页面、修改主页等
可以基于 into oufile 写 shell ,但是需要满足如下条件
1、知道网站物理路径
可以使用 phpmyadmin 爆破,登录进去后我们获取网站的绝对路径来进行写 shell,利用log变量来猜测网站的绝对路径
2、高权限数据库用户
在一些Mysql小于5.5.51或小于5.6.32或小于5.7.14及衍生版本,我们都可以利用CVE-2016-6663、CVE-2016-6664组合对其进行测试提权。
利用CVE-2016-6663将www-data权限提升为mysql权限,利用CVE-2016-6664将Mysql权限提升为root权限
3、load_file() 开启 即 secure_file_priv 无限制
在 MySQL 5.5 之前 secure_file_priv 默认是空,这个情况下可以向任意绝对路径写文件
在 MySQL 5.5之后 secure_file_priv 默认是 NULL,这个情况下不可以写文件
可以使用 show global variables like '%secure_file_priv%';
查看
打开 my.cnf 文件,加入如下语句再重启服务器,即可修改 secure_file_priv 无限制
secure_file_priv=''
4、网站路径有写入权限
之后即可写入 shell, 然后菜刀、蚁剑进行连接。
服务器权限
UDF提权
UDF(user-defined function)是MySQL的一个拓展接口,也可称之为用户自定义函数,它是用来拓展MySQL的技术手段,可以说是数据库功能的一种扩展,用户通过自定义函数来实现在MySQL中无法方便实现的功能,其添加的新函数都可以在SQL语句中调用,就像调用一些系统函数如version()函数便捷。
MOF提权
现在通过mof文件来进行提权已经非常困难了,因为它支持提权版本只有2003和一些之前的版本。mof的提权原理为mof文件每五秒就会执行,而且是系统权限,我们通过mysql使用load_file 将文件写入/wbme/mof,然后系统每隔五秒就会执行一次我们上传的MOF。MOF当中有一段是vbs脚本,我们可以通过控制这段vbs脚本的内容让系统执行命令,进行提权。
启动项提权
MySQL的启动项提权,原理就是通过mysql把一段vbs脚本导入到系统的启动项下,如果管理员启动或者重启的服务器,那么该脚本就会被调用,并执行vbs脚本里面的命令。
如何防御
用户设置
严禁 root 用户外连,正常来讲,不仅仅是 root 不允许外连,有条件的情况下,mysql 服务端口都不要对外开放,只允许特定的内网 ip 段来连接,另外,所有的实际业务严禁直接用 root 用户身份来处理,强烈建议,不同的业务需求,创建对应的数据库普通账户来处理即可
对于密码设置,包含大小写、特殊字符、12位以上的随机密码,越随机越好
把 root 用户改个比较另类的名字,越看不出来是干啥的越好,不过一般作用不大,如果真的存在sql注入,随便用sql语句查下权限即可,另外,直接使用 sqlmap –is-dba (检测当前用户是否具有数据库管理员权限)同样也可以,不过这样做可以防爆破
配置分离
有条件,最好将应用和数据库进行分离,分离的好处在于可以让入侵者无法再正常读写文件,毕竟不在同一台机器上,因为数据库服务器上,根本没有web服务
限制权限
限制 MySQL 在系统中的各种权限(只能防止服务器被入侵,阻止不了数据库正常的增删改查),首先将 MySQ L服务以较低的系统权限运行,以防止他人利用该服务进行提权攻击。注意,这里的提权不是普通用户执行部分系统命令这样的行为,而是真实的将运行 MySQL 服务的系统伪用户权限提升到 root 权限。同时也需要严格控制住 MySQL 安装目录在本地文件系统中的权限
授权时,也可通过 shell 脚本自动对指定库中除管理或系统表之外的其他表进行一一单独授权,而管理表则单独授权给其他数据库用户。这样做的好处就是,此时即使存在 SQL 注入,也让入侵者没法通过跨表来查网站后台管理的账号和密码 hash。但缺点是如果业务逻辑比较复杂,这样做确实麻烦,可以尝试慢慢把业务整理拆分出来。虽然我们可以利用 MySQL 轻松将权限控制到表级别,但实际中还是非常建议“一站一库”,这样后续维护管理起来也非常方便规整。
其他
我们也需要利用各种实时日志分析平台,实时快速捕捉各种常见数据库攻击特征,例如 ELK、Splunk 等工具
注意对重要业务数据定时备份,或是直接配置主从同步。同时限制单用户连接数,防止 DDOS 攻击
定期去关注 MySQL 官方发布的高危补丁,适时修补漏洞
参考文章
教你一些MySQL数据库入侵及防御方法-腾讯云开发者社区-腾讯云 (tencent.com)
nmap端口扫描 | 狼组安全团队公开知识库 (wgpsec.org)
Metasploit漏洞利用框架 | 狼组安全团队公开知识库 (wgpsec.org)
mysql 弱口令暴力破解本地渗透测试 - 油虾条 - 博客园 (cnblogs.com)
千万不要再这样操作MySQL了,分分钟给你破解-腾讯云开发者社区-腾讯云 (tencent.com)