2010-06-30 17:37
这次为了研究MySQL yaSSL库证书解析栈溢出漏洞的扫描方法,搭建了一个环境,将此过程中的折腾记录一下。
[0x01] MySQL对SSL的支持 MySQL支持SSL有两种方式,一种是使用OpenSSL,另一种是使用yassl. 使用openssl需要先安装openssl,而使用yassl就不必了,该源码已经包含在mysql的源码里了。yassl是一种潜入式的形式存在。 [0x02] Linux下源码安装MySQL数据库以支持SSL shell> groupadd mysql shell> useradd -g mysql mysql shell> gunzip < mysql-VERSION.tar.gz | tar -xvf - shell> cd mysql-VERSION shell> ./configure --prefix=/usr/local/mysql --with-yassl 注意: yassl 与 openssl不能并存,二者只能选其一 shell> make shell> make install shell> cp support-files/my-medium.cnf /etc/my.cnf shell> cd /usr/local/mysql shell> chown -R mysql . shell> chgrp -R mysql . shell> bin/mysql_install_db --user=mysql shell> chown -R root . shell> chown -R mysql var shell> bin/mysqld_safe --user=mysql & 执行到此,基本上已经完成一半了,现在mysql已经支持ssl了,但是还不能用,需要配置一下。 [0x03] 配置MySQL启用SSL 假定你已经有了相关的证书。证书的制作后面介绍。 1)修改配置文件my.cnf 认证机构证书 ssl-ca=/etc/mysql/ca.pem 服务器证书 ssl-cert=/etc/mysql/cert.pem 客户证书 ssl-key=/etc/mysql/key.pem 2)重启服务 这个时候应该已经大功告成了,可以用客户端来连接访问了。 [0x04] 检察数据库是否支持ssl 1) 检察二进制文件是否支持ssl shell> mysqld --ssl --help [error] mysqld: unknown option '--ssl' 如果二进制文件不支持ssl的话,将提示错误信息。 2) 检测运行中的mysqld是否支持SSL mysql> show variables like '%ssl%' have_ssl yes have_openssl yes 可以通过执行以上命令来检查have_ssl或have_openssl是否为yes。 have_ssl是在5.0.38版本中增加的,该版本之后,have_openssl是作为have_ssl的别名存在。兼容以前的版本。 [0x05] 用mysql使用ssl连接访问 shell> mysql --ssl-ca=ca.pem --ssl-cert=cert.pem --ssl-key=key.pem 此时,只能从本地访问,如果从另一台主机访问还需要开通相应权限。 [0x06] 修改初始密码 1) set password mysql> set password for 'root'@'localhost' = password('xxxx'); mysql> set password for ''@'localhost' = password('xxx'); 2) update mysql> update mysql.user set password = password( 'xxx' ) where user ='root'; mysql> update mysql.user set password = password( 'xxx' ) where user=''; mysql> flush privileges; 3) mysqladmin shell> mysqladmin -u root password "xxxx" shell> mysqladmin -u root -h xxx.com password "xxxx" [0x07] 新增用户 1) mysql> create user 'guodaxing'@'%' identified by 'xxxx'; mysql> grant all privileges on *.* to 'guodaxing'@'%' with grant option; [0x08] Windows MySQL支持SSL 我安装了mysql的windows版二进制程序,这个好像已经编译了yassl,只需要修改下配置就可以了。与linux上的配置类似,修改下my.ini文件。 第一次安装的是5.0.X版本的mysql,成功! 第二次安装的是5.1.X版本的mysql,配置好之后重启数据库,连上后查看ssl是否起来了,结果只看到了配置里证书的配置路径,have_ssl和have_openssl均为disable, 怀疑是不是编译的时候没有支持yassl,后来查看到使用手册里解释have_ssl为disable表示该功能也有,但是没有启用,后来排查发现是证书的路径写错了导致的,修改后一切正常。 [0x09] 漏洞验证 intevydis的blog里提供了一个PoC http://intevydis.com/mysql_overflow1.py.txt http://intevydis.blogspot.com/2010/01/mysq-yassl-stack-overflow.html 在linux上自动启动mysql会启动mysqld_safe,该程序会调用mysqld,执行poc的时候mysqld_safe并不会崩溃,但mysqld会崩溃,不影响另一个客户端的访问,mysqld_safe好像会再fork一个mysqld。 在windows上mysqld_nt以服务形式存在,当客户端访问时就会生产一个服务线程,执行PoC会导致mysql服务崩溃。 [0x0A] 参考资料 http://www.netexpertise.eu/en/freeradius/mysql-traffic-encryption-with-openssl.html |