转自: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