转自:http://hi.baidu.com/freeners/blog/item/ab950513a5efe70c4a90a78c.html

这次为了研究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