Lab Overview

实验环境下载:https://seedsecuritylabs.org/Labs_16.04/Networking/DNS_Rebinding/

在这个实验中模拟的物联网设备是一个恒温器,用于控制室内温度。要成功设置温度,客户端需要能够与物联网服务器交互。由于物联网设备在防火墙后面,外部机器不能与物联网设备交互,因此不能控制恒温器。为了击败防火墙保护,攻击代码必须首先进入内部网络。这并不难,当来自内部网络的用户访问攻击者的网站时,攻击者的代码(JavaScript代码)实际上是从用户的浏览器中运行的,因此在受保护的内部网络中运行。然而,由于浏览器实现的沙箱保护,攻击者的代码仍然不能与物联网设备交互,即使它现在在内部网络中。

这个实验的目标是使用DNS重绑定攻击来绕过沙箱保护,这样攻击者的javascript代码就可以成功地从设备获得必要的信息,并使用这些信息来获得温度测量的一个非常高的值。

本实验涵盖以下主题:

• DNS server setup

• DNS rebinding attack

• Attacks on IoT devices

• Same Origin Policy

我们的攻击目标是防火墙后面的一个物联网设备。我们不能从外部直接访问这个物联网设备。我们的目标是让内部用户运行我们的JavaScript代码,这样我们就可以使用DNS重新绑定攻击与物联网设备交互。

许多物联网设备都有一个简单的内置web服务器,因此用户可以通过web api与这些设备交互。通常,这些物联网设备由防火墙保护,它们不能从外部直接访问。由于这种类型的保护,许多物联网设备没有实现强大的身份验证机制。如果攻击者能够找到与它们交互的方法,就很容易危及其安全性。

我们使用一个简单的webserver来模拟这种易受攻击的物联网设备,该服务器提供两个api:密码和温度。物联网设备可以设置室温。为此,我们需要向服务器的温度API发送一个HTTP请求;请求应该包括两部分数据:目标温度值和密码。密码是定期更改的秘密,但可以使用密码API获取。因此,要成功设置温度,用户首先需要获得密码,然后将密码附加到温度API中。密码不是用于身份验证的;它用于抵抗跨站请求伪造(CSRF)攻击。没有这种保护,一个简单的CSRF攻击就足够了;没有必要使用更复杂的DNS重新绑定攻击。为了简单起见,我们硬编码了密码;在实际系统中,密码将定期重新生成。

LabEnvironment

在这个实验室中,我们将使用三台机器,分别称为用户VM、本地DNS服务器和攻击者VM。为了简单起见,我们使用VirtualBox中的NAT网络适配器将这些虚拟机放在同一个网络上。在现实世界中,它们不在同一个网络上。我们还假设运行在用户VM上的设备在防火墙后面,因此攻击者VM不能直接访问物联网设备。这个实验室的设置相当复杂,因为我们需要配置三个VM并在它们上运行多个服务器,包括一个IoT web服务器(在用户VM上)、一个web服务器和一个DNS服务器(在攻击者VM上)以及一个DNS服务器(在本地DNS服务器上)

LabTasks

Task1: Configure the User VM 

Step1. 减少Firefox的DNS缓存时间。为了减少DNS服务器的负载并加快响应时间,Firefox浏览器缓存DNS结果。默认情况下,缓存的过期时间为60秒。这意味着我们的DNS重新绑定攻击需要等待至少60秒。为了让我们的实验更轻松,我们把时间减少到10秒或更少。在URL字段中输入about:config。单击警告页面后,我们将看到首选项名称及其值的列表。搜索dnsCache,找到以下条目并将其值更改为10:

更改后,应该退出Firefox浏览器,并重新启动;否则,更改将不会生效。

Step 2. 改变/etc/hosts.我们需要将以下条目添加到/etc/hosts文件中。我们将使用www.seedIoT32.com作为物联网web服务器的名称。此服务器可以运行在不同的VM上,但为了简单起见,我们在用户VM上运行物联网服务器(其IP地址为192.168.43.175):

Step3.  Local DNS Server 。我们需要配置用户VM以使用特定的本地DNS服务器。这是通过将本地DNS服务器设置为解析器配置文件(/etc/resolv.conf)中的第一个名称服务器条目来实现的。一个挑战是所提供的VM使用动态主机配置协议(DHCP)来获取网络配置参数,如IP地址、本地DNS服务器等。DHCP客户机将用DHCP服务器提供的信息覆盖/etc/resolv.conf文件。

要将信息导入/etc/resolv.conf而不用担心DHCP,一种方法是将以下条目添加到/etc/resolvconf/resolv.conf.d/head文件(192.168.43.78为本地DNS服务器的IP地址):

头文件的内容将预先写入动态生成的解析器配置文件。通常,这只是一个注释行(/etc/resolv.conf中的注释来自这个头文件)。在进行更改之后,我们需要运行以下命令使更改生效:

Step 4. Testing 。配置用户VM之后,使用dig命令从您选择的主机名获取IP地址。从这个响应中,请提供证据证明这个响应确实来自你们的服务器。如果找不到证据,说明配置不成功。

 Task2: Start the IoT server on the User VM 

在此任务中,我们将在用户VM上启动物联网服务器。通过web服务器,用户可以与物联网设备通信。

Step 1. 安装 Flask. 我们使用Flask web框架来开发物联网服务器     sudo pip3 install Flask==1.1.1

Step 2. Start the IoT server. 物联网服务器代码包含在user_vm.zip,可以从实验室的网站上下载。解压缩文件后,进入user_vmf文件夹,通过运行准备好的脚本start IoT .sh或直接运行“flask run”启动物联网服务器。需要注意的是,我们使用端口8080作为物联网服务器(该端口号在实验室设置中是硬编码的;将其更改为不同的数字将破坏实验室设置)。

Step 3. Testing the IoT server 。要测试物联网服务器,请将浏览器指向用户VM上的以下URL。如果一切都设置正确,我们应该能够看到一个恒温器。我们也可以通过拖动滑动条来改变温度设置。

 Task3: Start the attack web server on the Attacker VM 

在本实验室中,只能从防火墙后访问物联网设备,即,仅来自实验设置中的用户VM。将恶意代码发送到用户虚拟机上的一种典型方式是让用户访问我们的网站,这样放置在web页面上的JavaScript代码就可以进入用户虚拟机上。在这个任务中,我们将启动一个web服务器来托管这些web页面。

Step 1. 安装 Flask。 我们的恶意web服务器也是基于Flask web框架开发的。

Step 2. Start the attacker’s web server 。攻击者的服务器代码包含在attacker_vm.zip,可以从实验室的网站上下载。解压缩文件后,进入attacker_vm文件夹,通过运行准备好的脚本start_webserver.sh或直接运行“flask run”来启动web服务器。

Step3. Testing the Attacker’s web server.

Task4: Configure the DNS server on the Attacker VM 

攻击者VM也充当了attacker32.com域名的命名服务器。BIND9服务器已经在攻击者VM上运行,我们需要为它准备一个区域文件。一个示例区域文件包含在attackr_vm文件夹中。我们应该相应地更改区域文件,并将其复制到/etc/bind文件夹中。

将以下区域条目添加到/etc/bind/name .因此上面的区域文件将由BIND9服务器使用。

如果一切都设置正确,我们可以尝试以下dig命令,看看我们得到的响应是否与我们放在区域文件中的响应相同

Task5: Configure the Local DNS Server

在本地DNSserver上,我们设置attacker32.com域的转发记录,因此每当本地 DNS 服务器收到此域内主机的 DNS 查询时,它只需将 DNS 查询发送到指定转发记录的 IPaddress,而不是前往 root server 和the .com server,以找出attacker32.com域的名称服务器的位置。

要将此类记录添加到本地 DNS 服务器,我们需要将以下行添加到 /etc/bind/named.conf

在用户机上测试,dig成功:

Task6. Understanding the Same-Origin Policy Protection

同源策略是一种约定,它是浏览器最核心也最基本的安全功能。浏览器的同源策略,限制了来自不同源的“document”或脚本,对当前“document”读取或设置某些属性。影响“源”的因素有:host(域名或IP地址,如果是IP地址则看做是一个根域名)、子域名、端口、协议。在浏览器中,<script>、<img>、<iframe>、<link>等标签都可以跨域加载资源,而不受同源策略的限制,但是浏览器限制了JavaScript的权限,使其不能读、写返回的内容。

attacker_vm的change界面

单击click之后,user_vm的温度并不会改变

user_vm的change界面

单击click之后,user_vm的温度变为99℃

Task7. Defeat the Same-Origin Policy Protection

击败同源的主要想法保护来自这样一个事实:策略执行基于主机名,而不是IP地址,所以只要我们使用www.attacker32.com的URL,我们遵守SOP的政策,但这并不意味着我们是限制与www.attacker32.com web服务器进行通信。

在用户的浏览器向www.attacker32.com发送请求之前,它首先需要知道www.attacker32.com的IP地址。一个DNS请求将从用户的机器发出。如果IP地址没有缓存在本地DNS服务器上,一个DNS请求最终会被发送到attacker32.com的nameserver,它运行在攻击者的VM上。因此,攻击者可以决定在响应中放入什么。

Step 1: Modify the JavaScript code. 在攻击者虚拟机中,在www.attacker32.com:8080/change中运行的JavaScript代码存储在以下文件中:attacker_vm/rebind_malware/templates/js/change.js。由于该页面来自www.attacker32.com服务器,根据同源策略,只能与同一服务器交互。因此,我们需要将代码的第一行从http://www.seediot32.com:8080更改为以下内容:

Step2: Conduct the DNS rebinding 。我们的JavaScript代码发送请求到www.attacker32.com,请求将返回到攻击者VM。这不是我们想要的,我们希望将请求发送到iot服务器。这可以通过DNS重新绑定技术实现。我们首先映射 www. attacker32.com 为攻击者VM的IP地址,这样用户可以从http: //www.attacker32.com/change获得实际页面。在我们点击网页上的按钮之前,我们重新映射www.attacker32.com主机名到iot服务器的IP地址,按钮触发的请求将到达iot服务器。这正是我们想要的。

修改好相应文件进行刷新:

同源策略是浏览器的一个安全功能,不同源的客户端脚本在没有明确授权的情况下,不能读写对方资源。所以xyz.com下的js脚本采用ajax读取abc.com里面的文件数据是会被拒绝的。同源策略限制了从同一个源加载的文档或脚本如何与来自另一个源的资源进行交互。这是一个用于隔离潜在恶意文件的重要安全机制。不受同源策略限制的1. 页面中的链接,重定向以及表单提交是不会受到同源策略限制的。2. 跨域资源的引入是可以的。但是js不能读写加载的内容。如嵌入到页面中的<script src="..."></script>,<img>,<link>,<iframe>等

Task8. Launch the Attack 

使用用户机访问下列url:

每当10秒倒计时为0,温度将会被设定为88度:

【SEED Labs】DNS Rebinding Attack Lab的更多相关文章

  1. 【SEED Labs】Public-Key Infrastructure (PKI) Lab

    Lab Overview 公钥加密是当今安全通信的基础,但当通信的一方向另一方发送其公钥时,它会受到中间人的攻击.根本的问题是,没有简单的方法来验证公钥的所有权,即,给定公钥及其声明的所有者信息,如何 ...

  2. 【SEED Labs】TCP Attacks Lab

    Lab Overview 实验环境下载:https://seedsecuritylabs.org/Labs_16.04/Networking/TCP_Attacks/ 本实验涵盖以下课题: • TCP ...

  3. 利用Dnspod api批量更新添加DNS解析【python脚本】 - 推酷

    利用Dnspod api批量更新添加DNS解析[python脚本] - 推酷 undefined

  4. 【Linux】DNS服务-BIND从服务器、缓存服务器及转发服务器配置(三)

    环境 操作系统:CentOS 6.5 DNS软件:bind(安装参照:[Linux]DNS服务-BIND基础配置(二)) BIND从服务器 从服务器就是在bind的主配置文件中添加从域example. ...

  5. 转 DNS原理及其解析过程【精彩剖析】

    DNS原理及其解析过程[精彩剖析] http://369369.blog.51cto.com/319630/812889/   DNS原理及其解析过程 精彩剖析         网络通讯大部分是基于T ...

  6. DNS原理及其解析过程【精彩剖析】

    DNS原理及其解析过程[精彩剖析] 2012-03-21 17:23:10 标签:dig wireshark bind nslookup dns 原创作品,允许转载,转载时请务必以超链接形式标明文章 ...

  7. 【前端安全】JavaScript防http劫持与XSS

    作为前端,一直以来都知道HTTP劫持与XSS跨站脚本(Cross-site scripting).CSRF跨站请求伪造(Cross-site request forgery).但是一直都没有深入研究过 ...

  8. 【安全开发】Android安全编码规范

    申明:本文非笔者原创,原文转载自:https://github.com/SecurityPaper/SecurityPaper-web/blob/master/_posts/2.SDL%E8%A7%8 ...

  9. 【前端安全】JavaScript防http劫持与XSS (转)

    作为前端,一直以来都知道HTTP劫持与XSS跨站脚本(Cross-site scripting).CSRF跨站请求伪造(Cross-site request forgery).但是一直都没有深入研究过 ...

随机推荐

  1. [SD心灵鸡汤]007.每月一则 - 2015.11

    1.不要因为世界太过复杂,而背叛了你的单纯. 2.人的一生要疯狂一次,无论是为一个人,一段情,一段路途或一个梦想. 3.时间真的很神奇,你永远不知道它会如何改变你.换句话说:以前难吃的蔬菜.苦涩的啤酒 ...

  2. 几个值得学习的Java博客

    谈面试时从写一个单例开始究竟能问多深及终极解决方案  提到了<深入理解java虚拟器><java并发编程实践> 美团点评的技术博客:MySQL索引原理及慢查询优化 https: ...

  3. web selenium 小笔记

    常用库导入 from selenium import webdriver #导入webdriver模块 from selenium.webdriver.common.by import By # XP ...

  4. 以太坊智能合约开发框架Truffle

    前言 部署智能合约有多种方式,命令行的浏览器的渠道都有,但往往跟我们程序员的风格不太相符,因为我们习惯了在IDE里写了代码然后打包运行看效果. 虽然现在IDE中已经存在了Solidity插件,可以编写 ...

  5. conda虚拟环境安装

    一.背景 需要学习mxnet,建一个conda虚拟软件环境. 二.步骤 1.下载anaconda安装文件:https://mirrors.tuna.tsinghua.edu.cn/anaconda/m ...

  6. Rocket - debug - TLDebugModuleInner - Program Buffer Access

    https://mp.weixin.qq.com/s/EJVqw7JPjjaib68tENl5AQ 简单介绍TLDebugModuleInner中的Program Buffer Access. 1. ...

  7. Java实现 LeetCode 764 最大加号标志(暴力递推)

    764. 最大加号标志 在一个大小在 (0, 0) 到 (N-1, N-1) 的2D网格 grid 中,除了在 mines 中给出的单元为 0,其他每个单元都是 1.网格中包含 1 的最大的轴对齐加号 ...

  8. (Java实现) 洛谷 P1106 删数问题

    题目描述 键盘输入一个高精度的正整数NN(不超过250250位) ,去掉其中任意kk个数字后剩下的数字按原左右次序将组成一个新的正整数.编程对给定的NN和kk,寻找一种方案使得剩下的数字组成的新数最小 ...

  9. Java中继承的详细用法

    关于上一篇构造方法后的继承方法 构造方法链接 extends是继承的关键字 例: 下面的代码BB和CC就是AA的子类 允许一个父类有多个子类,但不允许一个子类有多个父类 /*final*/ class ...

  10. shell中文本内容多行变一行的技巧

    在linux下有时可能需要将多行的值转成一行.其实现的方法有很多种.笔者将自己曾经用过的方法在些分享. 如有一文本文件5201351.txt,文本的内容如下: 现我们可以通过如下方法将文本内容转成一行 ...