目标机上一台 MySQL 开着 3306,利用root 密码是据库进行弱口令——这种事在渗透测试里太常见了。Metasploit 自带的爆破 mysql_login 模块能直接拿字典怼上去,省得自己写脚本轮询。利用下面记录一次完整的据库进行爆破过程,包括踩到的爆破坑。
先确认 msf 环境正常。利用终端敲 msfconsole,据库进行等它加载完。爆破有时候第一次启动会卡在数据库连接那一步,利用如果报错说 PostgreSQL 没起来,据库进行执行 service postgresql start 再重开就行。爆破进去之后直接搜模块:
msf6 > search mysql_login 会看到一个 auxiliary/scanner/mysql/mysql_login,利用这就是据库进行要用的东西。use 进去,爆破show options 看一下需要填什么。默认 RHOSTS、USERNAME、PASS_FILE 这几个是关键。我一般习惯把 RHOSTS 设成目标 IP,USERNAME 先试 root,PASS_FILE 指向自己的字典路径。 msf 自带了一个密码字典在 /usr/share/metasploit-framework/data/wordlists/ 下面,但那个太简陋了,实际测试还是用自己的。
设置命令大概长这样:
msf6 auxiliary(scanner/mysql/mysql_login) > set RHOSTS 192.168.1.105 msf6 auxiliary(scanner/mysql/mysql_login) > set USERNAME root msf6 auxiliary(scanner/mysql/mysql_login) > set PASS_FILE /root/pass.txt msf6 auxiliary(scanner/mysql/mysql_login) > set STOP_ON_SUCCESS true msf6 auxiliary(scanner/mysql/mysql_login) > set THREADS 10 msf6 auxiliary(scanner/mysql/mysql_login) > run STOP_ON_SUCCESS 这个选项建议打开。默认是 false,意味着就算爆破了正确的密码它还会继续跑完整个字典,浪费时间不说,日志里还会混一堆失败记录。THREADS 看目标承受能力,内网环境开到 20 也没事,公网的话建议 5 到 10,太高容易被防火墙盯上。
跑起来之后屏幕上会滚动尝试记录。成功的那个会标绿,类似 [+] 192.168.1.105:3306 - Success: 'root:admin123'。如果字典跑完了都没结果,要么密码不在字典里,要么目标做了连接限制。MySQL 有个 max_connect_errors 参数,连续失败太多次会直接拉黑来源 IP,这时候得等或者换 IP。
有个细节值得说一下:mysql_login 模块默认走的是明文认证,如果目标 MySQL 版本是 8.0 以上,默认认证插件换成了 caching_sha2_password,这个模块有时候会报协议错误。解决办法是换用 mysql_auth 或者手动指定版本参数。我碰到过几次,日志里显示 Scanned 1 of 1 hosts (100% complete) 但一个结果都没有,抓包看是认证阶段就断了。
爆破成功只是第一步。拿到密码之后可以用 mysql -h 192.168.1.105 -u root -p 直接连上去,看看有没有写文件的权限。如果有 secure_file_priv 为空或者指向可写目录,那就能通过 SELECT ... INTO OUTFILE 写 webshell。当然这是后话,不在爆破本身范围内。
最后提一句防御视角。这种爆破能成功,根子上还是密码太弱加上没有登录失败锁定。MySQL 本身没有内置的 fail2ban 机制,得靠防火墙或者代理层做限制。另外别让 3306 裸奔在公网上,内网也尽量绑定 127.0.0.1 或者指定管理网段。我见过太多开发环境直接把 MySQL 暴露出去,root 密码设成 123456,这种不爆你爆谁。