为了搭建用于测试heartbleed漏洞(CVE-2014-0160)的环境,于是乎做了这个博文里搭建的环境,不是太难,但由于不太懂,也耗了几天时间,下面开始。
环境:win7(32bit)+apache2.2.25+openssl1.0.1b
整体过程:先安装带ssl模块(httpd-2.2.25-win32-x86-openssl-0.9.8y.msi),然后将openssl升级到1.0.1b(直接安装openssl的win32版本,然后拷贝相关的文件到apache相关模块下),然后利用网上的python测试脚本进行测试。
第一部分:Apache的安装方面:
基本就是一路next,主要需要注意的就是正确设置Network Domain和Server Name这两项,如果想远程也能访问,这里就填你的ip地址,比如我填的就是自己的ip:115.156.x.x,如果只想本地测试,那么就填localhost就可以了。
p.s.关于这个的解释请参考:http://blog.sina.com.cn/s/blog_6013f66201019wj0.html
apache安装好后需要修改配置文件的相关设置
修改httpd.conf(在 [Apache安装目录]/conf下)三处:
1.DocumentRoot "D:/www"(这个蓝色的可以自己设置,就是http将要访问的文件的位置,可以根据自己的设置来修改,下面第2点一样)
2.<Directory "D:/www">
3.<IfModule dir_module>
DirectoryIndex index.html index.htm(这个是默认的访问文件,具体可google,不解释)
</IfModule>
第二部分:openssl的配置
ssl需要的文件在如下的位置:(安装了apache之后就会有)
[Apache安装目录]/modules/ mod_ssl.so
[Apache安装目录]/bin/ openssl.exe, libeay32.dll, ssleay32.dll
[Apache安装目录]/conf/ openssl.cnf
----------
创建SSL证书(关于数字签名,证书相关的知识我在最后给出了相关的科普链接)
----------
1. 打开cmd, cd到apache安装目录的bin目录
2. 运行openssl
openssl req -config ..\conf\openssl.cnf -new -out my-server.csr(注意, my-server是自己起的名字, 以下步骤中提到my-server的也是自己起的名字)
(注意,其实我自己把ip搞错了的,应该是192.168.138.151我上面的这个是网络地址,搞错了,还要到后面配置文件去修改,这个大家注意下。)
好,下面还有要填写的:
3. 运行
openssl rsa -in privkey.pem -out my-server.key此时要输入密码, 就是步骤2中设定的密码:
4. 运行
openssl x509 -in my-server.csr -out my-server.cert -req -signkey my-server.key -days 4000
这将创建一个4000天后才过期的证书(注意一下,这里的my-server.cert最好改成my-server.crt,后来实验配置发现不换也可以,换了之后完成步骤5后就会有两个crt文件,但是最后在浏览器中导入的证书应该是5中生成的xxx.der.crt文件,而不是这里的my-server.crt,因为我实验了几次,我也被自己搞昏了,所以如果你发现你的https最后总是出现证书问题,不妨把这里重新运行一遍,改下这个,把cert改成crt,然后最后在浏览器中导入的时候把这个crt的也导入,注意,如果这里改了,那么第5步也要相应的改)
5. 运行
openssl x509 -in my-server.cert -out my-server.der.crt -outform DER
(结果上面有,在dos下不会有任何回应,主要是产生文件的)
全部运行过后这些命令会在bin文件夹中生成6个文件:
.cnt(这个文件不知道怎么滴,没有) privkey.pem my-server.der.crt my-server.csr my-server.key my-server.cert将这些文件移到 conf/ssl目录中(如果不存在这个目录就创建一个(这个步骤中放到其他的目录也可以 关键是记住文件的位置, 在接下来的设置中会用到,所以就不要瞎整,免得给自己找麻烦)
2. 去掉下面设置行前面的# (在2.0.x版本中没有这一项)
Include conf/extra/httpd-ssl.conf
3.修改以下信息:(这是单独配置httpd-ssl.conf文件,在conf/extra目录下)
3.1. 修改这一段:
<VirtualHost _default_:443>
# General setup for the virtual host
DocumentRoot "D:/wwws" (主要是该这个目录,这个目录就是https要访问的目录,尽量与http要访问的目录区别开,可以自己设置)
ServerName 192.168.138.151:443
ServerAdmin [email protected]
(p.s.参考了:http://forums.devside.net/index.php?topic=70.0)
3.2.增加:(使访问https有访问权限)
<Directory "D:/wwws">
Options +Indexes FollowSymLinks +ExecCGI
AllowOverride AuthConfig FileInfo
Order allow,deny
Allow from all
</Directory>
(位置的话,在配置文件中找到 </Directory>,然后最好就是把上面的代码放在这个的后面)
(p.s.参考:http://www.cyberciti.biz/faq/apache-403-forbidden-error-and-solution/)
3.3. 更改如下设置.:([apache安装目录]是指Apache的安装目录, 比如c:/Apache; my-server的两个文件就是前一个步骤制作的文件, 文件的位置就是这些文件在磁盘中的位置 (在2.0.x版本中这些设置仍然在 httpd.conf文件中进行)
找到以下相关代码并对应修改即可:
SSLMutex default
SSLCertificateFile "[Apache安装目录]/conf/ssl/my-server.der.crt"(最好也和前面的一样 改成my-server.crt)
SSLCertificateKeyFile "[Apache安装目录]/conf/ssl/my-server.key"
----------
测试
----------
1. 保存设置文件
2. 在开始菜单中运行Apache的Test Configuration工具, 检查设置文件是否正确
3. 重新启动Apache 2.2.x
4. 顺利启动之后, 在浏览器中输入 https://localhost 看看是否可以访问, 如果可以访问, 则设置成功!
(ip请无视,此处按照上面的应该是https://192.168.138.151)
当然,可以不会一下就成功,比如地址栏可以出现一片红色,然后那个右边钥匙那里提示证书不正确之类的:(比如下面这样)
那么就还要在浏览器中导入上面我们拷贝到ssl文件夹里面的crt文件,步骤如下:
1.打开ie浏览器,然后打开那个internet选项:
2.点击证书,然后进入这个:
在上面圈出的两个地方都要在下面的“导入”按钮中导入前面我们生成的my-server.der.crt文件,完成后确定,然后关闭浏览器,再次用https://192.168.138.151访问,就发现地址栏是白色的,没有什么提示了,表示证书已经被浏览器信任了,这样就OK了。
----------
升级openssl
----------
以上就是apache2.2.25在win32(32bit)下配置openssl-0.9.8y的全部过程,接下来我们还要将openssl升级到1.0.1b,因为只要1.0.1a-f才有heartbleed漏洞,其实很简单,两步:
1.安装Win32_OpenSSL_v1.0.1b.exe
2.把openssl的bin目录下的libeay32.dll,ssleay32.dll,openssl.exe拷贝到[apache安装目录]/bin/下(注意,直接不能覆盖,要先去关掉apache的服务才能覆盖)
完成后再用cmd进入[apache安装目录]/bin/下,输入命令:openssl version,查看openssl版本,发现已经更新:
至于那句warning,我也不知道是咋回事,但是这是在win下运行,查看linux下的配置也没用,而且我们apache自己有openssl的配置,在[apache安装目录]/conf/extra/http-ssl.conf,所以应该没有什么影响(主要是后面的攻击可以正常进行)
----------
利用python重现heartbleed漏洞
----------
利用网上的python来重新攻击,拷贝ssltest.py至d盘下,然后运行:
进入d盘运行 (ip继续无视,按照上面的设置应该是192.168.138.151)
python ssltest.py 115.156.236.202即可看到结果:(中间内容太多,仅截取最后的提示)
开始部分因为DOS下无法拉到最上面,来看一下在linux下的一个截图,基本一样:
能到3ff0表示基本已经能获取到内存中客户端请求后的大片内存区数据了(64kb),攻击成功。
好,到此基本就结束了,环境搭建也基本完成,我将相关的资料上传到了这里,包括上面用的文件,httpd-2.2.25-win32-x86-openssl-0.9.8y.msi是从官方网站上下载的,后面的那个openssl是网上下载的(地址:https://code.google.com/p/cntc2/downloads/detail?name=Win32_OpenSSL_v1.0.1b.exe&can=2&q=),官网已经没有1.0.1a-f的win版下载了(见:http://slproweb.com/products/Win32OpenSSL.html)
----------
后续
----------
后面如果还有更新的进展,比如如何利用openssl官方给的tar.gz包来编译生成lib文件等我会继续跟进,但是搭建环境的这个过程基本就是上面的了,希望对有需要的人有帮助。
本文主要参考了:
1.http://www.cnblogs.com/rockin/articles/943668.html
(基本是按照这个来做的,但是还有一些细节需要注意,里面提到的一个连接(windows安装基于Apache的SVN服务器(包括SSL配置)):http://www.uml.org.cn/pzgl/200804038.asp)
2.http://www.sunzhenghua.com/wamp-config-ssl-https(但是按这个来没有成功,没去找原因,毕竟是个套件,所以后来单独安装apache后再做的)
3.http://blog.wangzhan.360.cn/?p=165 比想象中更恐怖!OpenSSL“心血”漏洞深入分析(这个主要是关于漏洞的分析以及上面的python文件的一个解释)
4.关于本实验中数字签名,证书的一些命令的解释可参考:
http://dufei.blog.51cto.com/382644/90532
http://www.360doc.com/content/11/0813/16/3837165_140113234.shtml
以及电子工业出版社的 密码学原理与实践(第三版)的P92页,P353页中相关的解释(不过感觉我上面的命令好像没有涉及到ca相关东西,现在还没弄太明白)