记录一次心脏滴血靶场实验过程

记录一次心脏滴血靶场实验过程

此文主要从几个方面记录本次心脏滴血的实验过程:

  1. 心脏滴血的攻击原理和效果

  2. 心脏滴血攻击过程复现

  3. 实验结果和现象分析

  4. 实验过程中遇到的问题以及解决方案

https://blog.csdn.net/caozhk/article/details/23738971

https://blog.csdn.net/yaofeiNO1/article/details/54428021

https://www.cnblogs.com/shengguang/p/11044899.html

1、心脏滴血的攻击原理和效果

1.1 攻击原理

心脏滴血攻击面向支持扩展心跳机制OpenSSL环境

​ a. OpenSSL环境:OpenSSL是SSL协议以及一系列加密算法的开源实现。

​ b. 扩展心跳机制:TLS(安全传输协议)位于传输层和应用层之间,提供数据安全加密。TLS心跳指的是用户向服务器发送数据包,服务器返回一个相同的数据包以确定彼此在线,以支持持续通信功能。DTLS(Datagram Transport Layer Security)数据包传输层安全协议。TLS不能用来保证UDP上传输的数据的安全,因此Datagram TLS试图在现存的TLS协议架构上提出扩展,使之支持UDP,即成为TLS的一个支持数据报传输的版本。DTLS1.0基于TLS1.1,DTLS1.2基于TLS1.2。

心脏滴血攻击的本质是内存缓冲区溢出漏洞

​ a. 用户向服务器发送的心跳数据中用两个字节表明有效负载数据长度,而服务器端OpenSSL将根据这个有效负载长度构造一个新的数据包会送给客户端用户。

​ b. OpenSSL在实现TLS和DTLS的心跳处理逻辑时,存在编码缺陷。OpenSSL的心跳处理逻辑没有检测心跳包中的长度字段是否和后续的数据字段相符合。这就可能造成缓冲区溢出,被攻击者利用。

​ c. 心脏出血漏洞主要通过攻击者模拟向服务器端发送自己编写的Heartbeat心跳数据包,主要是HeartbeatMessage的长度与payload的length进行匹配,若payload_length长度大于HeartbeatMessage的length,则会在服务器返回的response响应包中产生数据溢出,造成有用数据泄露。

1.2 攻击效果

攻击者可以利用缓冲区溢出,构造异常的数据包,来获取心跳数据所在的内存区域的后续数据。这些数据中可能包含了证书私钥,用户名,用户密码,用户邮箱等敏感信息。该漏洞允许攻击者从内存中读取多达64KB的数据。

2、心脏滴血攻击过程复现

2.1 实验环境

OpenSSL客户端:win10物理机

OpenSSL服务端:Ubuntu16.04虚拟机(Vmware+win10物理主机);OpenSSL初始版本1.0.2f

环境搭建目标:需要在虚拟机中搭建一个通过https安全协议的数据交互网站,同时虚拟机中的OpenSSL版本为含有心脏出血漏洞的版本。通过客户端即物理机命令行中运行心脏出血漏洞检测POC代码。

2.2 实验靶场环境搭建
2.2.1 更换OpenSSL版本

心脏出血漏洞必须在含有心跳扩展漏洞没有被修复的OpenSSL版本中存在。目前存在OpenSSL心血漏洞的OpenSSL版本有OpenSSL1.0.1,1.0.1a,1.0.1b,1.0.1c,1.0.1d,1.0.1e,1.0.1f,Beta 1 of OpenSSL1.0.2等。由于1.0.1f以及之后的OpenSSL可能被修复,因此实验过程我选择更为保守的1.0.1d版本的OpenSSL。

查看当前的OpenSSL版本;发现当前版本为1.0.2f
openssl version
安装指定版本OpenSSL,如1.0.1d
sudo apt-get install make
wget https://www.openssl.org/source/openssl-1.0.1d.tar.gz
tar -xzvf openssl-1.0.1d.tar.gz 
cd openssl-1.0.1d
sudo ./config
sudo make install
sudo ln -sf /usr/local/ssl/bin/openssl `which openssl` (This will create a sym link to the new binaries), 这一步可能失败,替换 ‘which openssl’ 为 /usr/local/bin/openssl 再试一次
openssl version -v
2.2.2 搭建Web环境(单独安装Linux)

由于需要在虚拟机中搭建一个通过https安全协议的数据交互网站,OpenSSL只是一个通信协议,并不能直接被用来检测心脏滴血漏洞。因此需要配置Linux网站环境。这里我选用的是LAMP环境(Linux操作系统,Apache网络服务器,MySQL数据库,Perl、PHP或者Python 编程语言)。

网上有一键安装LAMP环境的安装方法。这里为了更好的了解LAMP的工作原理和相关组件之间的关系,我选择手动单独安装各个LAMP组件。

a. 安装Apache

首先安装Apache:

sudo apt-get install apache2 

Apache启动和停止相关命令为:

启动:sudo apache2 start
停止:sudo apache2 stop
重新启动:sudo apache2 restart

验证Apache2是否安装成功的方法:浏览器中输入网址localhost查看是否为Apache it works的展示页面。

开启SSL模块:

sudo a2enmod ssl

创建证书:由于我们搭建环境主要为我们检测漏洞使用,所以我们只需要创建自签名证书即可。

sudo mkdir /etc/apache2/ssl
sudo /usr/sbin/make-ssl-cert /usr/share/ssl-cert/ssleay.cnf /etc/apache2/ssl/apache.pem
b. 编辑https配置

添加监听端口。编辑Apache端口配置(/etc/apache2/ports.conf)如果SSL缺省时加入443端口Listen 443。

设置site-enabled。安装完后,会在/etc/apache2/sites-available目录下生成一个缺省的default-ssl.conf文件。创建一个链接到sites-enabled目录:

ln -s /etc/apache2/sites-available/default-ssl.conf /etc/apache2/sites-enabled/001-ssl

修改配置文件。确认HTTP监听端口是否为80:

gedit /etc/apache2/sites-enabled/000-default.conf
c. 重启Apache服务
service apache2 stop
service apache2 start
d. 安装PHP5.6
sudo apt-get install php5.6
sudo apt-get install php5-gd

让Apache支持php5.6:

sudo apt-get install libapache2-mod-php5.6
e. 安装MySQL数据库

在这之前可以参考更换镜像源为国内清华或阿里源,增加下载速度。Linux系统换源

更新appt-get,防止直接安装MySQL有的软件包无法下载:

sudo apt-get update

安装MySQL客户端和服务端,软件安装中会让你输入root用户的密码,输入密码确认密码之后完成安装。

sudo apt-get install mysql-server mysql-client

判断MySQL数据库是否安装成功,下述命令查看是否处于运行状态。

sudo service mysql restart
sudo service mysql status

让Apache支持MySQL:

sudo apt-get install libapache2-mod-auth-pgsql
tips:这里我没有找到libapache2-mod-auth-mysql模块,然后就用pgsql替代了,结果可行。

让PHP支持MySQL,这里我在Linux安装了PHP5.6用于本次实验。

sudo apt-get install php5.6-mysql

登录MySQL数据库,输入mysql的root用户密码:

mysql -u root -p

由于心脏出血漏洞主要由于心跳机制的边界检测问题,所以我们要查看自己安装的openssl有没有开启心跳扩展机制:

/usr/bin/openssl s_client -connect 192.168.220.156/login.php:443 -tlsextdebug 2>&1| grep ‘TLS’
f. 测试环境是否搭建成功

使用gedit在“/var/www”下创建info.php文件,在其中编辑下述内容,然后在URL中访问该文件,即可验证。

<?php
phpinfo() 
?>
2.2.3 写一个简单的Web登陆网站
a. 创建数据库
mysql -u root -p;之后输入mysql密码
create database web1;
use web1;
create table test(user varchar(15),password varchar(16));
create table flag();
b. 在/var/www/html/目录下编写登陆界面index.html:
<!DOCTYPE HTML>
<html>
	<head>
		<meta charset="utf-8">
		<title>test heartbleed</title>
	</head>
	<body style="background-color: #006400">
		<h2 align="center" style="color: white">login system</h2>
		<form align="center" action="login.php" method="post" enctype="multipart/form-data">
			<p style="width: 100%;height: 30px;display: block;line-height: 200px;text-align: center;color:white;font-size:16px;">account:<input type="text" name="user" value="" max="10"></p>
			<p style="width: 100%;height: 30px;display: block;line-height: 200px;text-align: center;color:white;font-size:16px;">password:<input type="password" name="pass" value="" min="6" max="16"></p>
			<p style="width: 100%;height: 30px;display: block;line-height: 200px;text-align: center;"><input type="submit" name="submit" value="login"></p>
		</form>
	</body>
</html>
c. 编写后台处理程序login.php:
<?php
$mysql_server_name='localhost';
$mysql_username='root'; 
$mysql_password='leeham'; 
$mysql_database='web1'; 
$conn=mysqli_connect($mysql_server_name,$mysql_username,$mysql_password,$mysql_database);
if(!$conn)
{
    die("error:".mysqli_connect_error());
}

$user=$_POST['user'];
$pass=$_POST['pass'];
#$user="admin";
#$pass="admin";
echo $user;
echo $pass;
$sql="select * from test where user='$user' and password='$pass'";
$res=mysqli_query($conn,$sql);
$row=mysqli_fetch_array($res,MYSQLI_NUM);
if(!is_null($row))
{
	for($i=0;$i<count($row);$i++)
	{
		echo $row[$i];
		echo "<br>";
	}
}
else
{
	echo "登录失败!";
} 
?>
d. 本地测试Web

在URL中输入localhost即可测试本地搭建结果。

e. 外部测试

在进行攻击实验之前,需要保证外部物理机可以访问虚拟机内部的网站,因此需要关闭内部Linux的防火墙,然后查看虚拟机IP,以及监听该服务的端口号。从而测试内部网络服务是否能被外部访问,这里我从物理主机访问外部的方式为:

http://192.168.220.156:443
2.3 实验攻击过程

由于HeartBleed漏洞已经比较成熟,因此大多检测方法已经工具化,如线上平台检测法、已写好的POC或打包好的可执行程序等。

我尝试了上述的三种方法以及nmap。其中第一种未果,其他的测试结果截图为:

在这里插入图片描述
在这里插入图片描述在这里插入图片描述

3、实验结果和现象分析

结果并不想其他文章中描述的那样,更换了OpenSSL之后就可以成功复现心脏滴血漏洞,这里分析的几个原因有:

  • 这些测试工具直接可以保证通信过程中使用的是HTTPS嘛?而不是HTTP?
  • 可能是OpenSSL版本的更换只生效于应用层,而没有在内核层产生作用?

4、实验过程中遇到的问题和解决方案

Q:PHP代码不能被浏览器正确解析执行

A:PHP代码中的空格和TAB,以及各种空白,导致PHP代码不能正确运行。于是我将所有的代码都重新整理了一下,就可以了。但是目前并没有找到合理解释这个现象的原因。并且我并没有忘掉分号或者括号。

Q:无法连接MySQL数据库,PHP代码执行到连接数据库的时候会出错

A:是因为第一遍安装LAMP环境的时候,没有找到Apache支持Mysql的模块就没有安装,后来找了libapache2-mod-auth-pgsql模块,OK。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值