上周Tim Tomes在Pauldotcom博客上发表了一篇关于使用MySQL枚举文件和目录的文章。一看到这篇文章,我就认为它非常适合自动化[1],因此我为其编写了一个Metasploit模块[2]。
Tim已经很好地解释了扫描的工作原理,因此我仅补充在测试模块时发现的几个要点。
首先,如果启用了严格模式,MySQL会抛出关于尝试将过多数据挤入小空间或错误数据类型的错误,这没关系——如果它成功获取数据并尝试挤入,就意味着文件存在。
要使此功能正常工作,您唯一需要的权限是FILE权限。根据MySQL规则,该权限必须作为全局选项授予,而不是授予单个数据库。如果您想测试,可以使用以下命令设置用户:
1
2
3
4
5
|
mysql> grant file on *.* to filetest identified by 'xxx';
Query OK, 0 rows affected (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
|
如果要检查的文件存在但MySQL用户无法读取(例如/etc/shadow),则MySQL会报告该文件不存在,我未能找到解决方法。
最后,至少在Linux上,目录不需要尾部斜杠。如下例所示,/tmp和/tmp/都被识别为目录。
非常感谢Juan Vazquez帮助我完成了以正确格式将文件提交到仓库的过程。使用Git比我们过去仅向票务系统提交文件要困难得多,但经过几次尝试后,它开始变得有意义。
该模块名为auxiliary/scanner/mysql/mysql_file_enum,现已纳入主Metasploit仓库,您只需更新即可获取。以下是实际操作示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
msf auxiliary(mysql_file_enum) > show options
Module options (auxiliary/scanner/mysql/mysql_file_enum):
Name Current Setting Required Description
---- --------------- -------- -----------
DATABASE_NAME test yes 要使用的数据库名称
FILE_LIST /tmp/files yes 要枚举的目录列表
PASSWORD xxx no 指定用户的密码
RHOSTS 127.0.0.1 yes 目标地址范围或CIDR标识符
RPORT 3306 yes 目标端口
TABLE_NAME gUtLyhCi yes 要使用的表名 - 警告:如果表已存在,其内容将被破坏
THREADS 1 yes 并发线程数
USERNAME root yes 认证用户名
msf auxiliary(mysql_file_enum) > run
[+] 127.0.0.1:3306 - /tmp是目录且存在
[+] 127.0.0.1:3306 - /tmp/是目录且存在
[+] 127.0.0.1:3306 - /etc/是目录且存在
[+] 127.0.0.1:3306 - /etc/passwd是文件且存在
[*] 已完成1台主机的扫描(100%完成)
[*] 辅助模块执行完成
|
[1] 正如我之前所说,您不必会编码才能成为渗透测试员,但在这种情况下,它确实很有帮助。
[2] 最近有人写博客抱怨Metasploit正在接管漏洞利用市场,并迫使每个人在框架中编写漏洞利用程序。我将此编写为Metasploit模块的原因不是被迫,而是因为这意味着其他人已经完成了所有艰苦的工作,包括用户输入、样式化输出和访问库。