【南方科技大学】CS315 Computer Security 【Lab6 IoT Security and Wireless Exploitation】

目录

  • Introduction (Part 1: OS Security for IoT )
  • Software Requirements
  • Starting the Lab 6 Virtual Machine
  • Setting up the Zephyr Development Environment
    • Download the Zephyr Source Code
    • Installing Requirements and Dependencies
    • Setting the Project’s Environment Variables
    • Installing the Zephyr Software Development Kit
  • Building and Running an Application with Zephyr
    • Sample Hello World Application
    • Building a Sample Application
    • Running a Sample Application
  • Exploiting Buffer Overflows in Zephyr Applications
    • Application Stack Frame on Zephyr
  • Assignments for Lab 6 Part 1
  • Introduction (Part 2: Wireless Exploitation & Defenses)
  • Software Requirements
  • Setup an Access Point
  • Capturing Wireless Packets via Wireshark
  • Capturing the Four-way Handshake
  • Cracking WPA2 WiFi Passphrase Using Kali Linux
  • Assignments for Lab 6 Part 2

Introduction (Part 1: OS Security for IoT )

物联网(IoT)是一项将影响我们日常生活的新兴技术。据报道,到2025年,连接的物联网设备将达到1000亿,因此物联网的影响将是令人印象深刻的,而安全性是其中的重要组成部分。出于本实验的目的,我们将重点关注物联网设备的操作系统安全性。

有许多新开发的物联网操作系统。例如,Contiki 是一个物联网开源操作系统。 Contiki 将微型低成本、低功耗微控制器连接到互联网。 2015 年 5 月,谷歌发布了 Brillo,一个物联网操作系统。 Brillo是Google推出的一款用于构建互联设备的解决方案,基于Android系统开发。 Zephyr 是另一个专为物联网设备设计的实时操作系统。 Zephyr开源项目由Linux基金会于2016年2月宣布。在本实验室中,我们使用Zehpyr作为研究示例来探索物联网设备的操作系统安全性。具体来说,我们将利用应用程序中的缓冲区溢出漏洞并了解 Zephyr OS 的安全功能。完成实验作业后,您将需要回答以下问题:

Zephyr 有哪些安全功能?

应用程序是否与操作系统内核共享相同的地址空间?

Zephyr 是否具有防御机制,例如不可执行堆栈或地址空间布局随机化(ASLR)?

教科书攻击(例如缓冲区溢出或堆喷射)对 Zephyr 有效吗?

Software Requirements

所有必需的文件都在提供的虚拟机映像中打包和配置。

The VMWare Software
http://apps.eng.wayne.edu/MPStudents/Dreamspark.aspx

The Ubuntu 14.04 Long Term Support (LTS) Version
http://www.ubuntu.com/download/desktop

Zephyr: Real Time OS for IoT – A Linux Foundation Collaborative Project https://www.zephyrproject.org/downloads

Starting the Lab 6 Virtual Machine

在本实验中,我们使用 Ubuntu 作为虚拟机映像。选择名为“Lab6”的虚拟机。
在这里插入图片描述
使用用户名 Student 和密码 [TBA in the class] 登录 Ubuntu 映像。以下是登录后的屏幕截图。
在这里插入图片描述

Setting up the Zephyr Development Environment

您可以从 Zephry 项目网站找到详细文档:

https://docs.zephyrproject.org/latest

Download the Zephyr Source Code

该代码托管在 Linux 基金会,其 Gerrit 后端支持通过 git 进行匿名克隆。

我们可以使用 git 命令查看 Zephyr 源代码。可以看到主目录下有zephyr-project文件夹。

https://www.zephyrproject.org/

请注意,如果您想在自己的机器上尝试,则需要安装 git。请注意,我们的实验室映像已在以下位置下载了 Zephyr 源代码:~/zephyr-project/

Installing Requirements and Dependencies

如果您使用自己的笔记本电脑或台式机进行实验,则需要通过执行以下命令来安装依赖项。在我们的 Ubuntu 映像上,我已经为您安装了它们。

$ sudo apt-get install git make gcc gcc-multilib g++ g+±multilib

Setting the Project’s Environment Variables

$ cd zephyr-project
$ source zephyr-env.sh
在这里插入图片描述

Installing the Zephyr Software Development Kit

Zephyr 的 SDK 包含在所有支持的架构上构建内核所需的所有必要工具和交叉编译器。此外,它还包括主机工具,例如自定义 QEMU 和用于构建主机工具的主机编译器(如果需要)。 SDK 支持以下架构:IA-32、ARM 和 ARC。

接下来,您需要按照以下步骤在 Ubuntu Linux VM 上安装 SDK。

Step 1. 从 zephyr 网站下载 SDK 自执行脚本。镜像已下载脚本;文件名为 zephyr-sdk-0.8.2-i686-setup.run。请参阅下面的屏幕截图。
在这里插入图片描述
Step 2. 运行安装脚本
$ chmod a+x zephyr-sdk-0.8.2-i686-setup.run
$ sudo ./zephyr-sdk-0.8.2-i686-setup.run

下面的截图显示了步骤1和2的执行情况。我们可以看到Zephyr SDK的默认目录安装在/opt/zephyr-sdk目录下。由于我之前已经在镜像中安装了 SDK,因此您会看到一条消息,询问您是否要删除现有目录 /opt/zephyr。只需选择yes。
在这里插入图片描述
Step 3 要使用 Zephyr SDK,请导出以下环境变量并使用安装 SDK 的目标位置。您只需将以下行添加到 ~/.bashrc 文件中即可。
$ vim ~/.bashrc
Add these two lines into the file
export ZEPHYR_GCC_VARIANT=zephyr
export ZEPHYR_SDK_INSTALL_DIR=/opt/zephyr-sdk
$ source ~/.bashrc
下面的屏幕截图显示了步骤 3。
在这里插入图片描述

Building and Running an Application with Zephyr

您已成功设置 Zephyr 的开发环境。本节提供构建包含应用程序的 Zephyr 内核并运行它的所有步骤。我们使用 Hello World 示例应用程序作为示例。您还可以创建自己的应用程序并运行它。

Sample Hello World Application

首先,让我们看一下 Zephyr 的示例应用程序是什么样的。转到 Hello World 示例的源目录。
$ cd ~/zephyr-project/samples/hello_world/src
$ vim main.c
下面的屏幕截图显示了 Hello World 应用程序的源代码。
在这里插入图片描述

Building a Sample Application

要构建 Hello World 示例应用程序,您只需执行以下命令即可:
$ cd ~/zephyr-project/samples/hello_world/
$ make
在这里插入图片描述
上面的 make 屏幕截图将使用应用程序 Makefile 中定义的默认设置构建 hello_world 示例应用程序。您可以通过使用受支持的平台之一定义变量 BOARD 来针对不同的平台进行构建,例如:

$ make BOARD=arduino_101

下图为执行后的结果
在这里插入图片描述
下面的屏幕截图显示了 Zephyr 项目支持的主板,包括 Intel Galileo Gen1 和 Gen2。出于本实验的目的,我们将在 x86 QEMU 上测试该应用程序。您还可以输入:

$ make help

这将获取受支持的板和其他有用命令的完整列表。
在这里插入图片描述
微内核和超微内核的示例项目可在 ~/zephyrproject/samples 中找到,每个示例都具有微内核和超微内核特定的构建。应用程序构建成功后,可以在应用程序根目录下的outdir子目录中找到结果。构建系统生成的 ELF 二进制文件默认命名为 zephyr.elf。下面的屏幕截图显示了 outdir 目录中的文件列表。
在这里插入图片描述

Running a Sample Application

要对 hello world 应用程序进行快速测试,我们可以通过执行以下命令来使用 QEMU 和 x86 仿真板配置 (qemu_x86):

$ cd ~/zephyr-project/samples/hello_world
$ make BOARD=qemu_x86 qemu
在这里插入图片描述
上面的屏幕截图显示了使用 QEMU 执行 hello world 应用程序。

我们可以看到“Hello World!”在终端中打印出来。要退出 QEMU,我们可以输入

‘Ctrl+a, x’

在这里插入图片描述

Exploiting Buffer Overflows in Zephyr Applications

首先,让我们编写一个包含缓冲区溢出漏洞的 Zephyr 应用程序。将 hello world main.c 程序更改为以下代码,如屏幕截图所示。

$ gedit main.c

在这里插入图片描述
在这里插入图片描述
从源代码中我们可以看到overflow()函数中嵌入了一个缓冲区溢出漏洞。然后,我们将一个长字符串传递给overflow()函数,该字符串将覆盖堆栈上的返回地址,程序将因返回地址无效而崩溃。接下来,让我们编译该应用程序并运行它,看看会发生什么。

如前所述,要构建应用程序,您只需执行以下命令即可:

$ cd ~/zephyr-project/samples/hello_world
$ make

要使用 QEMU 和 x86 仿真板配置 (qemu_x86) 运行应用程序,请执行以下命令:

$ cd ~/zephyr-project/samples/hello_world
$ make BOARD=qemu_x86 qemu

正如我们所料,应用程序由于返回地址无效而崩溃。
在这里插入图片描述
此外,QEMU 也会崩溃,您将看到一个弹出窗口,如下图所示。
在这里插入图片描述
我们可以看到EIP寄存器的值为0x7420676e。为了在利用缓冲区溢出漏洞后执行一些有意义的事情,我们需要控制EIP寄存器。接下来,调整main.c中的输入字符串,将EIP寄存器更改为0x41414141。请注意,0x41 是字符“A”的 ASCII 值。

我们可以简单地编辑 main() 函数,如下图所示
在这里插入图片描述
要重新编译应用程序,您需要重新运行zephyr环境脚本zephyrevn.sh。

$ cd ~/zephyr-project
$ source ./zephyr-env.sh

然后您可以重新编译该应用程序并运行它。您将看到 EIP 寄存器将为 0x41414141,如下图所示。
在这里插入图片描述
在这里插入图片描述
要重新编译应用程序,您需要重新运行zephyr环境脚本zephyrevn.sh。
$ cd ~/zephyr-project
$ source ./zephyr-env.sh

Application Stack Frame on Zephyr

为了做更有意义的事情,例如在堆栈上执行 shell 代码,我们需要了解应用程序的堆栈框架。我们在实验 2 中完成了类似的任务。如前所述,对于每个 Zephyr 应用程序,编译二进制文件都存储在名为 outdir 的目录中。我们可以进入该目录并使用 objdump 工具反汇编应用程序二进制文件并了解其堆栈框架。

$ cd ~/zephyr-project/samples/hello_world/outdir/qemu_x86/src
$ objdump –d main.o

下面的屏幕截图显示了 main.o 二进制文件的反汇编结果。
在这里插入图片描述

Assignments for Lab 6 Part 1

1.阅读上面的实验室说明并完成所有任务。
2.回答引言部分中的问题,并证明你的答案。简单的是或否的回答不会获得任何学分。
2.1 Zephyr 有哪些安全功能?
2.2 应用程序与操作系统内核共享相同的地址空间吗?
2.3 Zephyr 是否有防御机制,例如不可执行堆栈或地址空间布局随机化 (ASLR)?
2.4 教科书攻击(例如缓冲区溢出或堆喷射)对 Zephyr 有效吗?
3. 将EIP寄存器更改为值0xdeadbeef,并显示应用程序崩溃时EIP值的屏幕截图。

Extra Credit (10pt): 在堆栈上执行 shell 代码。 shell 代码可以启动 shell 或打印 hello 字符串。

Introduction (Part 2: Wireless Exploitation & Defenses)

在本实验室中,学生将探索执行无线攻击并了解潜在防御的方法。将涵盖的攻击包括检查和修改无线卡参数、更改无线传输通道、洪泛攻击以及破解 WPA2 保护网络的密钥。

Software Requirements

所有必需的文件都在提供的虚拟机映像中打包和配置。

The VMWare Software
http://apps.eng.wayne.edu/MPStudents/Dreamspark.aspx

The Kali Linux, Penetration Testing Distribution
https://www.kali.org/downloads/

Wireshark: Network protocol analyzer
https://www.wireshark.org/#download

Aircrack- ng: a suite of tools to assess WiFi network security
http://aircrack-ng.en.softonic.com/

Setup an Access Point

在本实验中,我们使用 TP-LINK 无线 N300 家用路由器作为示例,但相同的概念或想法也适用于其他路由器。接下来,它解释了设置接入点的服务集标识符(SSID)和安全机制的基本步骤。如果您以前做过此操作,请跳过本节。下图是我们在教室使用的TP-LINK无线N300家庭路由器。
在这里插入图片描述
Step 1: 将笔记本电脑或台式机连接到路由器。

此步骤取决于路由器。某些路由器需要使用以太网电缆来物理连接路由器。其他一些路由器可能能够使用其服务集标识符 (SSID) 通过无线进行连接。对于我们在教室中使用的路由器,需要物理连接到路由器的 LAN 端口之一。 (注意:考虑这两种类型的路由器的安全影响。)

Step 2: 打开基于 Web 的设置页面

打开Web浏览器,在地址栏中输入登录IP或主机名,即可登录Web管理页面。通常,您可以从路由器的背面找到IP地址或主机名。我们的路由器的IP地址是192.168.1.1,主机名是http://www.tplinkwifi.net

Step 3: 输入用户名和密码登录

输入默认用户名和密码即可登录。对于我们的路由器,其默认用户名和密码是 admin 和 [Same-Password-As-Kali-Linux]。

下图是我们使用的路由器的登录页面。
在这里插入图片描述
Step 4. 配置SSID
在我们的路由器中,转到无线 -> 无线设置。您可以在此处重命名您的无线网络(即 SSID)。我们路由器的 SSID 是“Hack3r”
在这里插入图片描述
Step 5 配置密码和无线安全。
在我们的路由器中,转到无线 -> 无线安全。然后您可以配置路由器的安全性。在下面的截图中,我们将安全协议配置为WPA/WPA2,使用AES作为加密方式,密码为“password”。还可以使用其他安全协议,例如 WEP。
在这里插入图片描述

Capturing Wireless Packets via Wireshark

要捕获无线数据包,您的计算机上需要安装无线网卡。无线网络接口有两种:一种是内部网卡。大多数笔记本电脑都有一个内置网卡;另一种是外部网卡。下图为外部网络。这是 Alfa Network 的 Wi-Fi USB 适配器(1000mW 高功率无线 G 802.11g,带 5dBi 天线)。
在这里插入图片描述
一旦您拥有无线网卡,您就可以运行数据包嗅探工具来捕获数据包,就像我们在实验 1 中所做的那样。

Step 1 启动 Wireshark 程序。

为了嗅探数据包,您可能需要通过在终端中键入 $ sudowireshark 来授予 Wireshark root 权限。下面是我的 iMac 桌面上 Wireshark 界面的屏幕截图。

在这里插入图片描述
Step 2 选择WiFi接口

单击 Wireshark 程序中的“捕获”->“选项”。寻找 WiFi 接口。通常,接口名称为 wlan0,但根据您的配置,它可能是不同的名称。例如,我的 iMac 上的 WiFi 接口名称是“WiFi:en1”。

Step 3 启用监控模式或混杂模式

在监控模式下,它捕获其距离范围内所有 SSID 的所有数据包。请注意,监控模式与混杂模式不同。为了本实验的目的,我们需要捕获所有流量,以便我们需要启用监视模式或混杂模式。

下面的屏幕截图显示了我的 iMac 上的 Wireshark 程序在监视器模式下的捕获接口的配置。您需要启用监控模式并将链路层头配置为802.11。
在这里插入图片描述
下面的屏幕截图显示了我的 iMac 上的 Wireshark 程序中混杂的捕获接口的配置。您需要启用混杂模式并将链路层头配置为每数据包信息。
在这里插入图片描述
Step 4 开始捕捉
单击捕获接口窗口中的开始并开始捕获。下面的屏幕截图显示了 Wireshark 程序在监视模式下捕获时的界面。
在这里插入图片描述

Capturing the Four-way Handshake

要破解 WPA/WPA2 密码,我们首先需要捕获包含以下内容的四次握手:

Step 1 开始捕获所有流量

这就是我们在上一步中所做的。只需将 Wireshark 程序进入监控模式并运行

Step 2 使用其密码连接到接入点

使用您的手机或笔记本电脑连接到接入点。出于本实验的目的,我们教室中的路由器的 SSID 是“Hack3r”。

Step 3 停止Wireshark程序并识别四次握手

按停止按钮停止Wireshark中的捕获;在过滤器中输入关键字“EAPOL”来识别四次握手。下面的屏幕截图显示了示例。

在这里插入图片描述
Step 4 保存捕获的流量

单击文件 -> 另存为选项将捕获的流量保存到 pcap 文件。下面的屏幕截图显示了示例。保存的pcap文件名为:test.pcap

在这里插入图片描述

Cracking WPA2 WiFi Passphrase Using Kali Linux

在本实验中,我们使用 Kali Linux 来破解 WPA2 WiFi 密码。选择名为“Lab7”的虚拟机映像。

在这里插入图片描述
使用用户名 root 和密码 [TBA in the class] 登录 Kali 镜像。以下是登录后的屏幕截图。

在这里插入图片描述
Step 1 将 test.pcap 文件复制到 Kali Linux 中

在我们的 Kali Linux 映像中,有 test-instructor-monitor.pcap 和 testinstructor-promiscously 文件的副本。如果您没有 test.pcap 的副本,也可以使用这些文件。

Step 2 使用aircrack-ng破解密码

Aircrack-ng 是一个网络软件套件,由用于 802.11 无线 LAN 的检测器、数据包嗅探器、WEP 和 WPA/WPA2-PSK 破解器以及分析工具组成。 Kali Linux 已默认安装它。

您可以输入 $ man aircrack-ng 查看该工具的手册页

在这里插入图片描述
运行以下命令来破解密码

$ aircrack-ng -w /usr/share/wordlists/fern-wifi/common.txt ~/Desktop/test-instructormonitor.pcap

-w: specify the path to the wordlist

接下来是 pcap 文件。下面的屏幕截图显示了命令的执行情况。
在这里插入图片描述
然后,我们为 WPA2 握手选择索引。我们可以通过SSID来识别索引。从截图中我们可以看到“Hack3r”的索引为5。

输入5后,我们可以看到aircrack已经成功破解密码,如下图所示。

在这里插入图片描述
下面是破解monitor模式捕获的pcap文件的截图。
在这里插入图片描述
选择1作为目标网络接口后,如下图所示,密码已被破解。
在这里插入图片描述

Assignments for Lab 6 Part 2

1.阅读上面的实验室说明并完成所有任务。
2.回答引言部分中的问题,并证明你的答案。简单的是或否的回答不会获得任何学分。
2.1 监控模式和混杂模式有什么区别
2.2 我们从本实验中学到了有关设置 WiFi 密码的哪些经验教训?
3. 将路由器更改为不同的密码,然后使用 Wireshark 和 Aircrach-ng 破解密码。显示结果的屏幕截图。

Extra Credit (3pt): 发送广播解除身份验证数据包以强制客户端重新连接。然后您就可以捕获四次握手。

上一篇:【数据结构初阶】二叉树---堆


下一篇:C++ | Leetcode C++题解之 第508题出现次数最多的子树元素和-题解: