提交 ca545316 编写于 作者: W wizardforcel

2021-10-22 23:02:49

上级 bc35583f
......@@ -86,7 +86,7 @@
NsLookup 工具是我们遇到的大多数操作系统中的标准程序。它是一种查询 DNS 服务器以确定有关潜在目标的信息的方法。它使用非常简单,提供了大量信息。在您的机器上打开**命令提示符**窗口,输入`nslookup www.packt.net`。这将产生类似于以下屏幕截图所示的输出:
![Nonintrusive target search](graphics/477-1_01_01.jpg)
![Nonintrusive target search](img/477-1_01_01.jpg)
您可以在前面的屏幕截图中看到,对我们命令的响应是域**www.packt.net**的 DNS 服务器的 IP 地址。您还可以看到他们的 DNS 配置了 IPv6 地址。如果我们测试这个网站,我们会进一步探索。或者,我们也可以使用另一个很棒的 DNS 查找工具**dig。**现在,我们将不讨论它,转而讨论下一个资源。
......@@ -94,43 +94,43 @@
[www.serversniff.net](http://www.serversniff.net)网站有许多工具,我们可以使用这些工具收集有关潜在目标的信息。有用于**IP**、**加密**、**名称服务器**、**Web 服务器**等的工具。以下屏幕截图显示了此网站的主页示例:
![Nonintrusive target search](graphics/477-1_01_08.jpg)
![Nonintrusive target search](img/477-1_01_08.jpg)
我们可以展示很多工具,但我们只想简单介绍一下安全测试各个领域的工具。打开**命令提示**窗口,输入`tracert www.microsoft.com`。如果您使用的是 Microsoft Windows 操作系统,您将看到该命令失败,如以下屏幕截图所示:
![Nonintrusive target search](graphics/477-1_01_09.jpg)
![Nonintrusive target search](img/477-1_01_09.jpg)
阅读本书的大多数人可能都知道为什么会被阻止,而对于那些不知道的人来说,这是因为微软已经阻止了 ICMP 协议,而这是`tracert`命令默认使用的。这很简单,因为服务器正在运行服务,我们可以使用特定的协议来访问它,在本例中,该协议就是 TCP。转到 Serversniff 页面并导航到**IP 工具****TCP 跟踪路由**。然后,在**IP 地址**或**主机名框**字段中输入`www.microsoft.com`并进行跟踪路由。您将看到它现在将成功,如以下屏幕截图所示:
![Nonintrusive target search](graphics/477-1_01_19.jpg)
![Nonintrusive target search](img/477-1_01_19.jpg)
* Way Back Machine ([www.archive.org](http://www.archive.org)):
这个网站证明了互联网上的任何东西都不会离开!当客户通知团队他们正在测试一台未投入生产的 web 服务器时,已经有很多评估,当他们看到该站点已经被复制和存储时,他们惊奇地发现这确实发生了。我喜欢使用该站点下载一些我最喜欢的演示文稿、工具等,这些内容已从站点中删除,在某些情况下,该站点已不存在。例如,用于向学生展示隐写术概念的工具之一是工具*Infostego*。这个工具是由 Antiy 实验室发布的,它为学生提供了一个易于使用的工具来理解这些概念。如果你去他们的网站[www.antiy.net](http://www.antiy.net),你会发现没有提到这个工具。事实上,在他们的任何一页上都找不到。他们现在更专注于杀毒市场。他们页面的一部分显示在以下屏幕截图中:
![Nonintrusive target search](graphics/477-1_01_02.jpg)
![Nonintrusive target search](img/477-1_01_02.jpg)
现在让我们利用**回程机**的力量来寻找我们的软件。打开您选择的浏览器并输入`www.archive.org`。Way Back Machine 托管在这里,在下面的屏幕截图中可以看到这个站点的一个样本:
![Nonintrusive target search](graphics/477-1_01_03.jpg)
![Nonintrusive target search](img/477-1_01_03.jpg)
如前所述,在撰写本书时,共有 3660 亿页存档。在 URL 部分,输入`www.antiy.net`并点击**浏览历史**。这将导致网站在其档案中搜索输入的 URL,几分钟后,将显示搜索结果。以下屏幕截图显示了一个示例:
![Nonintrusive target search](graphics/477-1_01_04.jpg)
![Nonintrusive target search](img/477-1_01_04.jpg)
我们知道我们不想访问最近存档的页面,因此为了安全起见,请单击**2008**。这将导致显示日历,显示网站存档的**2008**中的所有日期。你可以选择你想要的任何一个。下面的屏幕截图显示了 12 月 18 日存档站点的示例。正如您可以看到的,*Infostego*工具可用,您甚至可以下载它!如果您愿意,可以免费下载并试用该工具。
![Nonintrusive target search](graphics/477-1_01_05.jpg)
![Nonintrusive target search](img/477-1_01_05.jpg)
* Shodanhq:
Shodan 站点是我们可以使用的最强大的云扫描仪之一。您需要注册网站,才能执行更高级类型的查询。强烈建议您以扫描仪的强大功能在网站上注册,您可以发现的信息非常令人印象深刻,尤其是在注册之后。登录后显示的页面显示在以下屏幕截图中:
![Nonintrusive target search](graphics/477-1_01_06.jpg)
![Nonintrusive target search](img/477-1_01_06.jpg)
前面的截图显示了登录用户最近进行的共享搜索查询以及最新搜索。如果您正在执行专业安全测试,这是另一个您应该深入研究的工具。现在,我们将看一个例子并继续,因为我们可以用这个工具写一整本书。如果您以注册用户身份登录,可以在搜索查询窗口中输入`iphone ru`。这将在查询中返回 iPhone 页面,大部分在俄罗斯,但与任何工具一样,在其他网站上也会有一些点击。以下屏幕截图显示了此搜索结果的示例:
![Nonintrusive target search](graphics/477-1_01_07.jpg)
![Nonintrusive target search](img/477-1_01_07.jpg)
显示了此搜索结果的示例
......@@ -146,7 +146,7 @@
无论您使用哪个版本的 nmap 进行探索,它们都有相似的命令语法,如果不是相同的话。在终端或命令提示窗口中,如果您在 Windows 操作系统上运行它,请输入`nmap –sP <insert network IP address>`。我们正在扫描的网络是 192.168.177.0/24 网络;你的很可能会有所不同。此 ping sweep 命令的示例如以下屏幕截图所示:
![Intrusive target search](graphics/477-1_01_10.jpg)
![Intrusive target search](img/477-1_01_10.jpg)
我们现在在网络上有实时系统,我们可以进一步调查。
......@@ -156,13 +156,13 @@
此外,发现的其中一台机器是我们自己的机器;因此,我们不会扫描我们自己,我们可以,但这不是最好的计划。我们网络上的实时目标是 1、2 和 254。我们可以通过输入`nmap –sS 192.168.177.1,2,254`来扫描这些。如果您想了解更多关于不同扫描类型的信息,请参考[http://nmap.org/book/man-port-scanning-techniques.html](http://nmap.org/book/man-port-scanning-techniques.html) 。或者,您可以使用`nmap –h`选项显示选项列表。扫描结果的第一部分显示在以下屏幕截图中:
![Intrusive target search](graphics/477-1_01_11.jpg)
![Intrusive target search](img/477-1_01_11.jpg)
* Discover services:
我们现在在机器上有带电系统和开口。下一步是确定我们发现的这些端口上运行的是什么。我们必须确定机器上运行的是什么,以便在深入研究方法时使用它。我们再次转向 nmap。在大多数命令和终端窗口中,都有可用的历史记录。希望您可以使用键盘上的箭头键访问它。对于我们的网络,我们将进入`nmap –sV 192.168.177.1`。根据上次扫描,我们确定其他机器已关闭其所有扫描端口;因此,为了节省时间,我们将不再扫描它们。在以下屏幕截图中可以看到此扫描的示例:
![Intrusive target search](graphics/477-1_01_12.jpg)
![Intrusive target search](img/477-1_01_12.jpg)
可以看到这种扫描的一个例子
......@@ -172,7 +172,7 @@
这是提取潜在目标的更多信息的过程,包括操作系统、用户名、机器名以及我们可以发现的其他细节。最新版本的 nmap 有一个脚本引擎,它将尝试发现许多细节,事实上,在某些方面枚举系统。要使用 nmap 处理枚举,我们使用`–A`选项。在命令提示中输入`nmap –A 192.168.177.1`。提醒您,如果您的目标地址与我们的不同,您必须输入该地址。此外,此扫描需要一些时间才能完成,并且会在网络上产生大量流量。如果您想要更新,可以随时按空格键接收更新。此命令输出非常广泛,因此以下屏幕截图中显示了截断版本:
![Intrusive target search](graphics/477-1_01_13.jpg)
![Intrusive target search](img/477-1_01_13.jpg)
正如屏幕截图所示,您有大量关于目标的信息,并且您已经准备好开始下一阶段的测试。此外,我们正确识别了操作系统;直到这一步,我们才有了这一点。
......@@ -182,11 +182,11 @@
我们将使用 Rapid7 的 Nexpose 漏洞扫描程序。他们的工具有一个社区版本,只扫描有限数量的目标,但值得研究。您可以从[www.rapid7.com](http://www.rapid7.com)下载 Nexpose。下载后,您必须注册并通过电子邮件接收密钥才能激活它。我们将省略的细节,让您自己体验。Nexpose 有一个 web 界面,因此一旦安装并启动该工具,您就必须访问它。您可以通过输入`https://localhost:3780`来访问它。初始化似乎需要非常长的时间,但最终会显示一个登录页面,如以下屏幕截图所示:
![Intrusive target search](graphics/477-1_01_14.jpg)
![Intrusive target search](img/477-1_01_14.jpg)
登录所需的凭据将在安装期间创建。设置扫描非常复杂,由于我们正在详细介绍过程,并且有一个优秀的快速入门指南,我们将继续讨论扫描结果。随着本书的进展,我们将有足够的时间探索这一领域。典型扫描的结果显示在以下屏幕截图中:
![Intrusive target search](graphics/477-1_01_15.jpg)
![Intrusive target search](img/477-1_01_15.jpg)
显示了典型扫描的结果
......@@ -198,17 +198,17 @@
可用的选项显示在以下屏幕截图中:
![Intrusive target search](graphics/477-1_01_16.jpg)
![Intrusive target search](img/477-1_01_16.jpg)
选项中有相当多的信息,但我们需要涵盖的选项是,因为我们正在利用漏洞 MS08-067 攻击服务器服务中的漏洞。这是一个更好的选择使用,因为它几乎总是工作,你可以利用它一次又一次。如果您想了解有关此漏洞的更多信息,请访问[查看 http://technet.microsoft.com/en-us/security/bulletin/ms08-067](http://technet.microsoft.com/en-us/security/bulletin/ms08-067) 。设置好选项后,我们准备尝试利用此漏洞,如以下屏幕截图所示,我们成功并在目标机器上获得了一个外壳:
![Intrusive target search](graphics/477-1_01_17.jpg)
![Intrusive target search](img/477-1_01_17.jpg)
## 数据分析
数据分析经常被忽略,这是一个耗时的过程。这是花费最多时间开发的过程。大多数测试人员可以运行工具、执行手动测试和利用,但真正的挑战是获取所有结果并进行分析。我们将在下一个屏幕截图中看一个例子。花点时间查看 WiresCark 工具中的协议分析捕获。作为一名分析师,您需要知道协议分析器向您展示了什么。你知道到底发生了什么吗?别担心,截图后我们会告诉你的。花一分钟的时间,看看您是否可以确定该工具正在使用以下屏幕截图中显示的数据包报告什么:
![Data analysis](graphics/477-1_01_18.jpg)
![Data analysis](img/477-1_01_18.jpg)
查看是否可以通过显示的数据包确定工具正在报告的内容
......
......@@ -12,13 +12,13 @@
以下屏幕截图显示了类型 1 裸机架构的示例:
![Choosing the Virtual Environment](graphics/477-1_02_01.jpg)
![Choosing the Virtual Environment](img/477-1_02_01.jpg)
如前面的屏幕截图所示,在类型 1 或裸机体系结构中,虚拟机监控程序安装在系统硬件中,虚拟化资源由虚拟机监控程序提供。使用虚拟裸机解决方案时,可以配置大量选项以包括资源分配。
1 型虚拟化 ToR0T0 提供了一个健壮的和非常强大的解决方案来考虑当你正在建立你的笔试实验室。然而,让部署成为挑战的一件事是,操作系统是由已经安装在硬件中的虚拟机监控程序提供的,这可能会对某些硬件版本造成挑战;此外,在大多数情况下,这种类型的解决方案最好在桌面或服务器类型的机器上实现。虽然它可以在笔记本电脑上实现,但在其他平台上更为常见。一个可能的选择是创建您的实验室环境,然后远程访问它。从虚拟化的角度来看,它不会影响我们创建的机器;类型 1 或类型 2 就足够了。在本书中,我们将使用类型 2 虚拟化。下面的屏幕截图显示了类型 2 虚拟化的示例:
![Choosing the Virtual Environment](graphics/477-1_02_02.jpg)
![Choosing the Virtual Environment](img/477-1_02_02.jpg)
可以看出,在类型 2 虚拟化中,虚拟机监控程序运行在操作系统上,操作系统运行在系统硬件上。同样,这是我们将在本书中使用的架构。现在,我们将研究类型 1 和类型 2 解决方案。从[第 3 章](03.html "Chapter 3. Planning a Range")开始*规划范围*,我们将继续关注类型 2 解决方案。
......@@ -44,7 +44,7 @@ OracleVirtualBox 是一个非常强大的工具,在选择虚拟化解决方案
一旦您安装了软件,程序将自动启动,您应该看到一个类似于以下屏幕截图所示的屏幕:
![VirtualBox](graphics/477-1_02_08.jpg)
![VirtualBox](img/477-1_02_08.jpg)
我们需要一个 ISO 映像来用于我们的虚拟机。为此,我们将使用优秀的工具 Samurai**Web 测试框架****WTF**。这是一个 web 应用测试框架,它是一个实时 Linux 环境,已预配置为 web 测试框架。这张 CD 包含了一些最好的开源和免费工具,可以用来测试和攻击网站。您可以从[下载 ISO 图像 http://www.samurai-wtf.org/](http://www.samurai-wtf.org/)
......@@ -52,13 +52,13 @@ OracleVirtualBox 是一个非常强大的工具,在选择虚拟化解决方案
在弹出的下一个窗口中,您将为虚拟机选择 RAM;您可以将设置保留为默认值**256 MB**或将其更改为最适合您的另一个值。此窗口的示例显示在以下屏幕截图中:
![VirtualBox](graphics/477-1_02_09.jpg)
![VirtualBox](img/477-1_02_09.jpg)
下一步我们想做的是为我们的虚拟机创建一个硬盘,但出于我们的目的,我们不打算使用硬盘;因此,我们将选择**不添加虚拟硬盘**设置并点击**创建**。您将被警告不要创建没有硬盘的虚拟机,但这没关系,因为这是我们想要做的。因此,阅读警告并点击**继续**
祝贺如果一切顺利,那么您刚刚在 VirtualBox 中创建了一个虚拟机。现在,您应该有一个窗口显示您创建的机器,它看起来类似于以下屏幕截图:
![VirtualBox](graphics/477-1_02_10.jpg)
![VirtualBox](img/477-1_02_10.jpg)
我们现在准备启动我们的虚拟机!点击**启动**设置,启动虚拟机。在这里,您将收到一条消息,说明您需要如何选择要从中引导的光学映像,这就是我们下载的映像的来源。所以,我们现在就要这样做。在提示下,导航到已下载的 ISO 映像并引导 Samurai WTF 虚拟机。这是使用 VirtualBox 的过程,我们将不再在此继续。欢迎你自己进行实验和实践。需要注意的一点是,有时,在某些机器上,VirtualBox 软件在键盘和输入方面会有困难。如果发生这种情况,建议您加载可在[找到的扩展 https://www.virtualbox.org/wiki/Downloads](https://www.virtualbox.org/wiki/Downloads) 。这就是为什么 VirtualBox 不是本书所选软件的原因之一。
......@@ -97,7 +97,7 @@ Hyper-V 有两个主要要求,第一个要求是操作系统必须为 64 位
2. 点击 Hyper-V 右侧窗格中的**虚拟网络管理器**,出现**虚拟网络管理器**窗口。
3. Select **New Virtual network** on the left-hand pane and select **External** as the type of network, then click on **Add**. This is shown in the following screenshot:
![Hyper-V](graphics/477-1_02_05.jpg)
![Hyper-V](img/477-1_02_05.jpg)
创建 InternalNet 的过程是相同的,因此我们在这里不再重复。我们将完成使用 Hyper-V 创建虚拟机的步骤,直至成功引导,然后继续本章。
......@@ -109,24 +109,24 @@ Hyper-V 有两个主要要求,第一个要求是操作系统必须为 64 位
4. 这将带来网络连接选择;点击**未连接**,然后点击**下一步**两次。
5. In the Installation Options window, select the radio button **Install an operating system from a boot CD/DVD-ROM** and then select the image file (ISO) and browse to the Kali image. Refer to the following screenshot:
![Hyper-V](graphics/477-1_02_03.jpg)
![Hyper-V](img/477-1_02_03.jpg)
这是安装选项屏幕,供您参考
6. 导航到 ISO 图像后,单击**下一步**。验证您的设置是否正确,然后单击**完成**
7. We now want to configure our network adapter. Within the Hyper-V environment, this can be a tricky process; so, the safest way when you are dealing with machines that are not from the Windows family is to select the legacy card. Right-click on the Kali virtual machine you have created and select **Legacy Network Adapter**. Then, click on **Add** as shown in the following screenshot:
![Hyper-V](graphics/477-1_02_04.jpg)
![Hyper-V](img/477-1_02_04.jpg)
8. 现在我们已经选择了网络适配器类型,我们必须将其连接到网络。在下拉窗口中,选择**外部**网络,点击**应用**,然后点击**确定**
9. A new virtual network will appear on the left-hand side of the window. Select it and then enter the name as `ExternalNet` in the right-hand pane of the window. Ensure that the **External** radio button is selected, click on the network adapter of your computer, and then click on **Apply**, as shown in the following screenshot:
![Hyper-V](graphics/477-1_02_06.jpg)
![Hyper-V](img/477-1_02_06.jpg)
10. 如果您收到与下一个屏幕截图类似的警告消息,请单击**是**将其清除。只是为了让您知道您可能会失去连接,如果您确实失去了网络连接,则必须重新输入静态网络配置数据。
11. If you do not want to be bothered by the alert again, then select the **Please don't ask me again** checkbox before you click on **Yes**, as shown in the following screenshot:
![Hyper-V](graphics/477-1_02_07.jpg)
![Hyper-V](img/477-1_02_07.jpg)
12. 我们现在已经准备好启动虚拟机。右键点击 Kali 虚拟机并选择**启动**。然后,再次右击并选择**连接**。您的虚拟机应该启动,您可以输入`startx`,这将启动环境。在这一点上,这取决于您对这个虚拟机的探索程度。我们将继续这一章,这样我们就可以通过虚拟化的不同选择,继续进行更大、更光明的事情。
......@@ -164,7 +164,7 @@ Hyper-V 有两个主要要求,第一个要求是操作系统必须为 64 位
VMware Player Plus 的另一个功能是,它可以用于运行由其他商用 VMware 产品创建的受限虚拟机。这意味着您可以使用密码保护机器,如果用户没有密码,则他们无法运行机器。下面的屏幕截图显示了密码保护机器的示例:
![VMware Player Plus](graphics/477-1_02_20.jpg)
![VMware Player Plus](img/477-1_02_20.jpg)
在撰写本书时,该工具并未提供试用下载,但您可以从[中阅读更多信息 http://www.vmware.com/products/player/](http://www.vmware.com/products/player/)
......@@ -190,14 +190,14 @@ Citrix 的团队已经开发出了一个强大的竞争对手,可以与 VMware
有一个大型的社区论坛,也是关于该工具信息的极好参考。支持是 VMware 继续在主要虚拟化类别中领先的另一个原因。安装并打开程序后,您应该会在屏幕上看到与以下屏幕截图类似的显示:
![VMware Workstation](graphics/477-1_02_11.jpg)
![VMware Workstation](img/477-1_02_11.jpg)
正如您在前面的屏幕截图中所看到的,我们可以从许多选项开始。正如我们前面使用的 ISO 映像一样,我们将继续这一趋势,并添加另一项创建虚拟机的任务。为简单起见,我们将使用之前使用的相同 ISO Samurai WTF 映像,但欢迎您下载您选择的 ISO 映像并从此映像创建机器。一旦您选择了要使用的 ISO 映像,我们就可以开始安装了。要开始使用此虚拟机,我们将执行以下步骤:
1. 点击**新建虚拟机**。这将启动新虚拟机向导。接受**典型**的默认设置,点击**下一步**
2. In the next window, select the radio button **Installer disc image file (iso)** and browse to the location of the ISO file. Then, click on **Next**, as shown in the following screenshot:
![VMware Workstation](graphics/477-1_02_12.jpg)
![VMware Workstation](img/477-1_02_12.jpg)
在上一个屏幕截图中,您可能注意到操作系统没有被自动检测到;因此,我们必须手动输入详细信息。如果检测到,向导将在大多数情况下执行安装,而无需用户交互。
......@@ -205,7 +205,7 @@ Citrix 的团队已经开发出了一个强大的竞争对手,可以与 VMware
4.**指定磁盘容量**屏幕上,通读拆分磁盘的优缺点信息。如果您希望更改默认设置,您可以这样做,但对于大多数情况,默认设置是可以接受的,除非您打算使用大型计算机。
5. Once you have made your decisions, click on **Next**. This should be the last screen; take a moment and review the information. Then, click on **Finish** and create your virtual machine. You should see the machine you created and the information for the machine configuration, as shown in the following screenshot:
![VMware Workstation](graphics/477-1_02_13.jpg)
![VMware Workstation](img/477-1_02_13.jpg)
6. 唯一要做的就是打开虚拟机的电源。点击**打开此虚拟机**电源,您的机器将启动。
......@@ -216,24 +216,24 @@ Citrix 的团队已经开发出了一个强大的竞争对手,可以与 VMware
1. 点击**打开虚拟机**。导航到提取文件的文件夹,并找到已损坏的 Web 应用项目 VM 的配置文件。
2. Once you have located the file, select it and click on **Open** to open the file. This will open the VM and you should be in the configuration screen, as shown in the following screenshot:
![VMware Workstation](graphics/477-1_02_14.jpg)
![VMware Workstation](img/477-1_02_14.jpg)
正如您在前面的屏幕截图中所看到的,VM 被配置为在 NAT 接口上启动,我们将在启动 VM 后使用它。在本节的最后,我们将了解这个 NAT 接口在 VM 环境中的意义。
3. 我们现在想要启动机器;点击**打开此虚拟机**电源,您的机器将启动。
4. Once the machine has booted, you will see the login information for the machine to access it across the Internet. We could log in to the machine locally, but there really is no reason to do this. You are welcome to do this if you want to check the machine out or look around, but for our purposes, we will access it from the network. This is the preferred way to access it because it provides us with a GUI to all of the different tools within the VM. The VM screen that shows the status after the boot is shown in the following screenshot:
![VMware Workstation](graphics/477-1_02_15.jpg)
![VMware Workstation](img/477-1_02_15.jpg)
这里我们需要的信息是分配给虚拟机的 IP 地址,这样我们就可以访问并查看它!打开您选择的浏览器,输入显示的 IP 地址,并打开断开的 web 应用项目 VM 的 web 界面。呈现给您的网页示例如以下屏幕截图所示:
![VMware Workstation](graphics/477-1_02_16.jpg)
![VMware Workstation](img/477-1_02_16.jpg)
如屏幕截图所示,在这个 VM 发行版中有许多工具,任何测试人员都可以从中受益。此处包含的教程和应用允许用户练习他们的技能和挑战,这些技能和挑战设置在不同的技能级别。我们鼓励你花很多时间在这里,并经常回来。当情况需要时,我们将在整本书中使用它。同样,自 Mandiant 赞助以来,VM 增加了许多额外的挑战。阅读本书的一些人可能熟悉 OWASP 的优秀教程 Web Goat。这个项目只是本教程的一个扩展,它还添加了 Irongeek 工具 Mutillidae。你可以在[上阅读更多关于水母科的信息 http://www.irongeek.com/i.php?page=mutillidae/mutillidae-故意-vulnerable-php-owasp-top-10](http://www.irongeek.com/i.php?page=mutillidae/mutillidae-deliberately-vulnerable-php-owasp-top-10)甚至在[www.irongeek.com](http://www.irongeek.com)上观看一些信息视频。
在继续本章之前,我们还有一个主题要看;它是 VMware Workstation 内联网的强大功能。这是我购买并继续购买 VMware Workstation 的主要原因之一。在 VMware 工作站中,导航到**编辑****虚拟网络编辑器**。当窗口打开时,您将看到在 VMware 中配置的当前交换机。默认情况下,VMware 配置三个虚拟交换机,它们是 Vmnet0(用于桥接接口)、Vmnet1(用于仅主机接口)和 Vmnet8(用于 NAT 接口)。我们在此不作详细介绍,因为我们可以从许多来源了解有关网络及其含义的更多信息,其中最好的一个来源是我们在本章前面提到的《VMware Workstation 用户指南》。VMware Workstation 的强大功能是我们最多可以拥有 10 个虚拟交换机!这意味着我们可以有效地构建 10 个不同的网段。VMware 网络配置允许我们设置所需的 IP 地址范围,并提供 DHCP 服务器。在大多数情况下,10 超出了我们的需要,对于 10x 及更高版本,我们现在可以在 Windows 和 Linux 主机上分别拥有 20 个和 255 个网段。这是一个很大的网络!正是这一点和其他因素使它成为我们的首选软件。当我们构建分层和分段的体系结构时,我们需要交换能力。我的机器上的网络配置示例如以下屏幕截图所示:
![VMware Workstation](graphics/477-1_02_17.jpg)
![VMware Workstation](img/477-1_02_17.jpg)
在前面的屏幕截图中,您可以看到在我的机器中,10 个可能的网络中的大多数都是可见的。我在一段时间内构建了许多复杂的体系结构,并添加了多个自定义网络。
......@@ -251,7 +251,7 @@ Citrix 的团队已经开发出了一个强大的竞争对手,可以与 VMware
您可以从[下载软件 http://www.starwindsoftware.com/converter](http://www.starwindsoftware.com/converter) 。请注意,您需要注册并且应用在 Windows 中运行。下载软件后,安装软件,然后运行程序。这是一个易于使用的工具;您可以通过导航到文件图像来选择要转换的文件图像。随后,该工具将显示格式输出的选项。以下屏幕截图显示了一个示例:
![Image conversion](graphics/477-1_02_18.jpg)
![Image conversion](img/477-1_02_18.jpg)
一旦选择了输出格式,转换过程将运行,一旦转换完成,您只需对您所选择的工具执行我们之前介绍的步骤。如前所述,该工具运行良好,节省了大量时间,并使您能够选择任何您喜欢的平台来构建 pentesting 环境。
......@@ -259,7 +259,7 @@ Citrix 的团队已经开发出了一个强大的竞争对手,可以与 VMware
当我们创建机器时,许多工具中可以用来帮助我们的另一个选项是物理到虚拟功能,有时称为 P2V 概念;此外,这使我们能够构建任何机器,运行转换过程以获取物理机器,然后将其转换为虚拟机。此功能允许您构建定制的 pentesting 平台机器,然后执行转换并将机器带到野外的任何地方。我们将讨论几个选项。我们可以使用 VMware 提供的名为 vCenter Converter 的免费选项。使用此工具,您不仅可以转换物理 Windows 机器,还可以转换 Linux。要试用并了解其工作情况,您可以从[下载 http://www.vmware.com/products/converter/](http://www.vmware.com/products/converter/) 。我们还有另一个选择,即使用 VMware Workstation 安装中的功能。这是我们的首选。如果您打开软件,您将看到有一个将物理机转换为虚拟机的选项,该选项称为**虚拟化物理机…**。请注意,在这里,您必须在首次在 VMware Workstation 中选择该选项时安装转换器,如以下屏幕截图所示:
![Converting from a physical to virtual environment](graphics/477-1_02_19.jpg)
![Converting from a physical to virtual environment](img/477-1_02_19.jpg)
# 总结
......
......@@ -27,13 +27,13 @@
我们将看一个例子。我同时使用任务和事件组件,因此如果启动 Microsoft Outlook 程序,您可以单击菜单顶部的**新项目**。这将打开菜单以创建新项目。以下屏幕截图显示了一个示例:
![By when do we have to accomplish it?](graphics/477-1_03_01.jpg)
![By when do we have to accomplish it?](img/477-1_03_01.jpg)
在 Outlook 中创建新项目的菜单(剪切的文本不重要)
我们想要创建一个新任务;为此,我们点击**任务**选项上的,将打开一个新菜单,如下图所示:
![By when do we have to accomplish it?](graphics/477-1_03_02.jpg)
![By when do we have to accomplish it?](img/477-1_03_02.jpg)
单击任务选项后的菜单屏幕(剪切的文本不重要)
......@@ -61,7 +61,7 @@
这只是一个小样本,当我们开始研究漏洞特性时,我们可能需要考虑的是什么。使用**通用漏洞评分系统****CVSS**)的示例如以下截图所示:
![Identifying vulnerabilities](graphics/477-1_03_03.jpg)
![Identifying vulnerabilities](img/477-1_03_03.jpg)
关于通用脆弱性评分系统的参考表(裁剪文本不重要)
......@@ -77,7 +77,7 @@
以下屏幕截图显示了在 Microsoft Bing 中进行此搜索的示例:
![Vulnerability sites](graphics/477-1_03_04.jpg)
![Vulnerability sites](img/477-1_03_04.jpg)
搜索 Microsoft Bing 上的漏洞站点(剪切的文本不重要)
......@@ -87,7 +87,7 @@
这将打开漏洞的搜索界面;从这里开始,只需输入您的搜索参数并查看结果。此搜索页面如下图所示:
![Vulnerability sites](graphics/477-1_03_05.jpg)
![Vulnerability sites](img/477-1_03_05.jpg)
漏洞的搜索界面(剪切文本不重要)
......@@ -97,7 +97,7 @@
以下屏幕截图显示了此搜索的示例:
![Vulnerability sites](graphics/477-1_03_06.jpg)
![Vulnerability sites](img/477-1_03_06.jpg)
显示返回 Adobe 漏洞的屏幕(剪切文本不重要)
......@@ -109,7 +109,7 @@
返回国家漏洞数据库网站主页,位于页面左侧的中间位置,您将看到其他链接;找到并点击**US-CERT Vuln notes**。这将带来 US-CERT 团队的漏洞说明。以下屏幕截图显示了一个示例:
![Vulnerability sites](graphics/477-1_03_07.jpg)
![Vulnerability sites](img/477-1_03_07.jpg)
显示来自 US-CERT 团队的漏洞说明的屏幕(剪切文本不重要)
......@@ -119,7 +119,7 @@
单击该漏洞后,将打开另一个页面,其中包含有关该漏洞的更多详细信息。我们看到这是一个输入验证问题,这是我们经常看到的。程序员在开发应用时没有很好地清理他们的输入。以下屏幕截图显示了该漏洞的详细信息示例:
![Vulnerability sites](graphics/477-1_03_08.jpg)
![Vulnerability sites](img/477-1_03_08.jpg)
显示漏洞详细信息的屏幕(剪切的文本不重要)
......@@ -129,7 +129,7 @@
如果我们在该漏洞上选择 CWE 编号,它将为我们提供有关该漏洞的更多详细信息。以下屏幕截图显示了一个示例:
![Vulnerability sites](graphics/477-1_03_09.jpg)
![Vulnerability sites](img/477-1_03_09.jpg)
屏幕显示有关漏洞的其他详细信息(剪切的文本不重要)
......@@ -137,29 +137,29 @@
下一个我们要看的站点是我们返回搜索结果时排名第二的站点,是**安全焦点**站点。打开您选择的浏览器并输入[http://www.securityfocus.com](http://www.securityfocus.com) 。这将使您进入安全关注的主页;以下屏幕截图中显示了一个示例:
![Vulnerability sites](graphics/477-1_03_10.jpg)
![Vulnerability sites](img/477-1_03_10.jpg)
显示安全焦点主页的屏幕(剪切的文本不重要)
正如前面的截图所示,我们进行搜索的那天对 Mozilla 来说是糟糕的一天。关于**安全焦点**网站,我们喜欢的是它们为我们提供了一些我们认为有用的额外细节,其中之一就是漏洞利用信息。选择主页上列出的漏洞之一。以下屏幕截图显示了**Mozilla Firefox/Thunderbird/SeaMonkey JavaScript 引擎多缓冲区溢出漏洞**的一个示例:
![Vulnerability sites](graphics/477-1_03_11.jpg)
![Vulnerability sites](img/477-1_03_11.jpg)
显示 Mozilla Firefox/Thunderbird/SeaMonkey JavaScript 引擎多缓冲区溢出漏洞漏洞的屏幕(剪切的文本不重要)
当您查看漏洞详细信息时,您将看到有许多我们感兴趣的选项卡,主要是**漏洞**选项卡。这将潜在地为我们提供关于漏洞可利用性的信息,如果存在关于野外利用的信息。由于这些漏洞本质上是新的,因此没有任何利用漏洞的信息。它仍然是一个很好的参考,因为它为我们提供了有关该漏洞的更多详细信息。我们可以在测试中使用的 Nagios 漏洞示例显示在以下屏幕截图中,以提供读取漏洞信息的参考:
![Vulnerability sites](graphics/477-1_03_12.jpg)
![Vulnerability sites](img/477-1_03_12.jpg)
我们现在投入业务是因为我们有利用漏洞的字符串,而这只是建立实验室和测试它的问题。这一切都会及时到来,现在我们将继续审查不同的网站,以作为潜在的参考。当我们追求漏洞时,漏洞越新越好。这是因为,很可能还没有为检测漏洞而编写的签名;此外,如果它是一个零日漏洞,那么它就不会被公开,这使它变得非常理想。我们有几个网站要审查,它们为我们提供了关于零日的信息,我们首先要看的是网站的零日跟踪程序。在浏览器中,输入[http://www.eeye.com/Resources/Security-Center/Research/Zero-Day-Tracker](http://www.eeye.com/Resources/Security-Center/Research/Zero-Day-Tracker) 。网站的一部分显示在以下屏幕截图中:
![Vulnerability sites](graphics/477-1_03_13.jpg)
![Vulnerability sites](img/477-1_03_13.jpg)
现场的一部分[http://www.eeye.com/Resources/Security-Center/Research/Zero-Day-Tracker](http://www.eeye.com/Resources/Security-Center/Research/Zero-Day-Tracker) (剪切的文本不重要)
正如您在访问该网站后所看到的,它致力于零日调查结果。这是我们讨论过的,我们希望在研究中做的事情,这个网站为我们提供了一个很好的参考。因此,让我们进一步探讨上市问题。选择一个漏洞并查看其他详细信息。以下屏幕截图显示了进一步详细信息的示例:
![Vulnerability sites](graphics/477-1_03_14.jpg)
![Vulnerability sites](img/477-1_03_14.jpg)
在查看屏幕截图时,我们希望更仔细地查看该漏洞的一些特征。我们发现目前没有可用的缓解措施。这意味着在披露时无法对其进行辩护。这使得它非常适合添加到我们的工具箱中。您会注意到它影响了 Windows XP 机器,这很好地说明了为什么 Microsoft 继续试图从行业中消除这一点。操作系统已经过时,确实需要更换;问题是它作为一个受信任的操作系统已经存在很长时间了,以至于人们,包括我自己,都喜欢使用它。然而,微软已经宣布不再支持它。因此,从我们的测试角度来看,如果漏洞被释放,这意味着它永远不会有补丁,因此漏洞将始终存在。
......@@ -171,19 +171,19 @@
下一个站点我们将关注的是由**TippingPoint**赞助的零日计划站点,该站点现在是 HP 的一部分。在浏览器中,打开链接[http://www.zerodayinitiative.com](http://www.zerodayinitiative.com) 。以下屏幕截图显示了站点主页的示例:
![Vulnerability sites](graphics/477-1_03_15.jpg)
![Vulnerability sites](img/477-1_03_15.jpg)
当您查看前面的屏幕截图时,您会看到中有关于**即将发布的咨询**以及**已发布的咨询**的部分。我们将重点关注**发布的咨询**,但**即将发布的咨询**也很有趣,您可能希望自己去探索。
这些是已通知供应商但尚未发布修补程序的通知。当您看到供应商收到通知后的天数,以及仍然没有发布补丁的事实时,您可能会感到惊讶。然而,同样,这是我们将不在这里讨论的内容,但这是很好了解的信息。我们将查看**发布的咨询**。点击**发布的咨询**,将弹出当前发布咨询的列表,如下图所示:
![Vulnerability sites](graphics/477-1_03_16.jpg)
![Vulnerability sites](img/477-1_03_16.jpg)
当您查看前面的屏幕截图时,您会看到一些具有**CVE**。我们可以使用此 CVE 跨不同工具和站点跟踪漏洞,以收集更多信息。此外,几乎所有工具都与 CVE 编号有交叉引用,因此,这使我们的工作更容易。这个过程是创建我们想要测试的实验室环境,然后使用这个工具,看看它在数据包级别做了什么。要在数据包级别查看信息,我们只需使用协议分析器,如 Wireshark 或其他。
我们不会在这里详细介绍该站点,但我们确实希望更仔细地查看该漏洞详细信息中的可用信息。我们将选择上一个屏幕截图中未显示的示例。我们选择的漏洞位于**Cisco 数据中心管理器**中,其 CVE 编号为**2013-5486**,并于 2013 年 11 月 24 日**进行了修补**。一旦我们选择了该漏洞,它就会显示关于实际漏洞本身的附加信息。作为测试人员,我们希望尽可能多地研究该漏洞,以便在测试环境中或在现场测试时更好地模拟它。下一个屏幕截图显示了该漏洞的示例:
![Vulnerability sites](graphics/477-1_03_17.jpg)
![Vulnerability sites](img/477-1_03_17.jpg)
这里特别令人感兴趣的是,该漏洞于 2013 年 2 月 22 日向供应商报告,并持续到 2013 年 11 月 24 日。这就是修补的现实;在安全方面,它不会拯救我们。这对我们现在来说是好的,因为我们正在测试,但最终是坏的,因为我们在测试和进攻,所以我们在防守端保护自己。正如我想说的,补丁是一个坏系统,但不幸的是,当我们试图缓解软件中的这些漏洞时,它是我们唯一的系统。
......@@ -193,19 +193,19 @@
我们将首先从一些倾向于或实际上是完全公开的网站开始;因此,其中大多数都有利用漏洞的信息或链接。我们首先要看的是**SecurityTeam**的网站;打开链接[http://www.securiteam.com](http://www.securiteam.com) 。这是另一个为我们提供丰富信息的网站,超出了本书的全面探讨范围;然而,我们确实想看看这里的一些优秀信息和资源。在主页的右侧,您将看到有关漏洞利用和工具的信息,如以下屏幕截图所示:
![Vulnerability sites](graphics/477-1_03_18.jpg)
![Vulnerability sites](img/477-1_03_18.jpg)
同样,这是一个你想经常访问的网站,你可以阅读其中的一些资源和信息。该方法将被要求执行环境测试。你的下一步是计划和准备你的实验室;我们讨论过的这个站点和其他站点为您提供了一个机会,让您可以寻找外面存在的东西,然后您尝试在实验室环境中创建它,这样您就可以知道当您进入测试领域时会发生什么。
我们现在来看看其中一个漏洞,看看该网站为我们提供了什么。我们将选择主页顶部的漏洞利用选项卡,并查找我们选择的漏洞利用。要继续,请单击**漏洞**。这将打开撰写本书时列出的漏洞列表,如以下屏幕截图所示:
![Vulnerability sites](graphics/477-1_03_19.jpg)
![Vulnerability sites](img/477-1_03_19.jpg)
我们选择清单的这一部分是因为一个特定的原因。在写这本书的时候,我们正在为一个高端客户机进行一次安全测试,在简报会的初始结果中,客户问我们这样一个问题:“您在 Windows 以外的其他操作系统上发现了什么吗?”。经常会遇到这个问题,因为人们错误地认为 Linux 或 Unix 自动比 Windows 更安全。我们不打算在这本书的书页中讨论这个问题;此外,它忽略了安全性的要点,即最重要的是流程而不是操作系统。也就是说,如果您没有一个补丁管理过程,那么无论使用什么操作系统,都会发现漏洞。这里就是这样;他们的 Linux 和 Unix 平台存在漏洞,因为他们没有有效的漏洞管理系统。
在前面的屏幕截图中有许多漏洞值得调查。不过,我们将集中讨论清单上倒数第二个问题;它在 FreeBSD 中,正好是我最喜欢部署在防火墙架构中的操作系统之一,唯一优先选择它的是**OpenBSD**。让我们进一步探讨这个问题。以下屏幕截图显示了利用漏洞信息的示例:
![Vulnerability sites](graphics/477-1_03_20.jpg)
![Vulnerability sites](img/477-1_03_20.jpg)
需要注意的一点是,我们正在连接到本地主机,因此这是一个本地攻击,我们需要在本地计算机上进行攻击。正如前面提到的,这并不理想,但我们可以为此建立实验室,看看是否可以远程利用它。同样,重要的是过程;我们从那里取下它,然后用它进行实验,看看当我们在野外遇到一台 FreeBSD 机器时,我们如何使用它。当然,我们还要求 box 为这次攻击运行 telnet 服务。在上一个屏幕截图中显示的不是,而是该漏洞的实际源代码,可在网站上找到。
......@@ -213,7 +213,7 @@
一旦您查看了 packet storm 的主页,我们想看看漏洞利用领域。点击**漏洞**并查看出现的信息。有一个巨大的漏洞列表。以下屏幕截图显示了利用漏洞列表的示例:
![Vulnerability sites](graphics/477-1_03_21.jpg)
![Vulnerability sites](img/477-1_03_21.jpg)
显示利用漏洞列表示例的屏幕(剪切的文本不重要)
......@@ -223,13 +223,13 @@
在本节中,我们将介绍的最后一个网站将是一个网站,在大多数情况下,它是我们在零日查找包含漏洞的信息时的最佳参考。所使用的网站名为 millw0rm,但创始人的任务非常艰巨,他试图保持网站正常运行,因此关闭了该网站。幸运的是,进攻性安全团队延续了原有站点的传统。在浏览器中,打开链接[http://www.exploit-db.com](http://www.exploit-db.com) 带出现场。正如您所看到的,该站点根据漏洞利用所需的位置分为部分。以下屏幕截图显示了该站点的示例:
![Vulnerability sites](graphics/477-1_03_22.jpg)
![Vulnerability sites](img/477-1_03_22.jpg)
和以前一样,我们可以查看漏洞代码,但既然我们已经完成了这项工作,我们将查看该网站的另一个功能,它非常强大,而且经常被忽略。这是搜索漏洞的能力。
位于主页顶部的是一个菜单列表;花一分钟回顾一下选项。此菜单显示在以下屏幕截图中:
![Vulnerability sites](graphics/477-1_03_23.jpg)
![Vulnerability sites](img/477-1_03_23.jpg)
显示位于主页顶部的菜单列表的屏幕(剪切的文本不重要)
......@@ -237,7 +237,7 @@
我们可以搜索各种参数;选择在很大程度上取决于你在研究中发现了什么。我们将提供一个简单的例子。我们在 FreeBSD 中看到了一个漏洞,因此我们将搜索数据库,并查看其中包含的关于 FreeBSD 的内容。在搜索窗口中,在**说明**字段中输入`FreeBSD`。然后,点击**搜索**按钮,将搜索提交到数据库,并返回大量结果。以下屏幕截图显示了一个示例:
![Vulnerability sites](graphics/477-1_03_24.jpg)
![Vulnerability sites](img/477-1_03_24.jpg)
有趣的是,我们没有看到在探索 SecurityTeam 站点时发现的 telnet 漏洞。这就是为什么我们在进行研究时使用大量不同的参考资料和资源。总有一种可能,一个人拥有它,而另一个人没有。列表可能位于另一个参数下。因此,我们可以尝试使用另一个参数进行搜索,看看能得到什么。我们不会在这里尝试,因为我们有来自早期站点的利用代码,因此我们可以构建实验室环境并尝试利用。我们已经涵盖了足够多的漏洞站点;此外,这为您提供了一个良好的基础,帮助您发现漏洞并试图在实验室环境中验证这些漏洞。
......@@ -253,7 +253,7 @@
Microsoft 有一个漏洞公告编号,我们可以在尝试关联来自不同站点的信息时使用该编号;它类似于 CVE 这样的参考,但它来自微软内部。下一个屏幕截图显示了 2013 年 11 月的 Microsoft 公告列表示例:
![Vendor sites](graphics/477-1_03_25.jpg)
![Vendor sites](img/477-1_03_25.jpg)
当您查看清单时,您会发现这三个问题非常关键,而这正是我们在查找漏洞时所要寻找的问题。我们已经发现了许多获取信息的方法,而使用公告编号作为参考只是另一种方法。
......@@ -261,7 +261,7 @@ Microsoft 有一个漏洞公告编号,我们可以在尝试关联来自不同
理想情况下,当这些漏洞利用存在于漏洞利用数据库中时,它们已经是 metasploit 框架的一部分。我会认为,几乎所有阅读这篇文章的人都听说过 RAPID7 拥有的优秀开发框架,另外,由于该收购,现在已经有了商业版。我们将在整本书中使用开源版本。如果碰巧您不熟悉该工具,您可以在[发现更多信息 http://www.metasploit.org/](http://www.metasploit.org/) 。主页示例如以下屏幕截图所示:
![Vendor sites](graphics/477-1_03_26.jpg)
![Vendor sites](img/477-1_03_26.jpg)
屏幕显示[http://www.metasploit.org/](http://www.metasploit.org/) (剪切的文本不重要)
......@@ -269,13 +269,13 @@ Microsoft 有一个漏洞公告编号,我们可以在尝试关联来自不同
我们从漏洞利用数据库站点获取的 MS13-009 漏洞利用示例是为 Microsoft Internet Explorer 软件编写的。这是我们在执行测试任务时极有可能遇到的问题,而且它有一个一贯的习惯,即几乎在每一个*补丁*上为我们提供漏洞。我们现在将进一步探讨此漏洞。当我们在漏洞数据库站点时,我们点击**漏洞**打开漏洞代码。以下屏幕截图显示了利用漏洞代码的标题示例:
![Vendor sites](graphics/477-1_03_27.jpg)
![Vendor sites](img/477-1_03_27.jpg)
显示利用漏洞代码标题示例的屏幕(剪切的文本不重要)
正如前面的屏幕截图所示,此漏洞利用是 metasploit 框架的一部分,因此,我们可以从框架内调查漏洞利用所需的参数。我们将在下一节中选择并构建一台攻击者机器;因此,现在我们将在 metasploit 中显示该漏洞的外观,而不提供构建该机器的详细信息。下面的屏幕截图显示了 metasploit 中的漏洞利用选项示例:
![Vendor sites](graphics/477-1_03_28.jpg)
![Vendor sites](img/477-1_03_28.jpg)
正如前面的屏幕截图所示,我们只有两个选项需要设置,**SRVHOST****SRVPORT**来尝试利用此漏洞。这里重要的一点是,一旦它进入框架,我们的漏洞验证任务就变得容易得多。不过要谨慎一点;仅仅因为我们在 metasploit 中有这个漏洞并不意味着我们会成功。这就是为什么存在“利用率不是 100%”的说法。
......
......@@ -21,7 +21,7 @@ OSSTMM 正在不断发展;您可以从[下载最新版本 http://www.isecom.or
在撰写本书时,OSSTMM 的当前版本是第 3 版,但正在审查第 4 版草案。下载这两个版本并查看更新版本中的差异和更改是一个好主意。下载页面的示例如以下屏幕截图所示:
![The OSSTMM](graphics/477-1_05_1.jpg)
![The OSSTMM](img/477-1_05_1.jpg)
如前一个屏幕截图所示,您必须是 ISECOM 金牌或白金团队的一员才能下载手册的草稿版本。
......@@ -70,7 +70,7 @@ OSSTMM 对运营安全的关注是通过查看多个通道的安全性来实现
在测试无线设备时,有许多因素需要考虑。最重要的因素之一是测试仪的安全性。有许多电磁和微波辐射源会对听力和视力造成伤害。因此,在-12dB 或更大的测量范围内,可能需要分析员穿戴防护设备。不幸的是,这是一个经常被忽视的问题,但是测试人员必须在可能使他们处于危险的环境中受到保护。靠近这些类型的污染源有许多潜在危险。因此,在使用天线进行室内外测试时,确保测试场地附近的信号频率和强度均已评估。OSSTMM 中详细讨论了这些保护措施。以下屏幕截图显示了本手册中一些注意事项的示例:
![The OSSTMM](graphics/477-1_05_3.jpg)
![The OSSTMM](img/477-1_05_3.jpg)
现在已经简要讨论了身体方面的考虑,接下来要讨论的是姿势回顾。
......@@ -228,19 +228,19 @@ OSSTMM 的无线测试部分到此结束。正如你所看到的,这是一个
此外,团队成员可以通过考试来满足要求。此处将不讨论考试的详细信息,但以下屏幕截图中显示了一个包含其他参考信息的示例:
![CHECK](graphics/477-1_05_4.jpg)
![CHECK](img/477-1_05_4.jpg)
现在我们已经简单地了解了什么是检查,现在我们可以了解它为我们进行笔试或评估提供了什么。检查由确定检查系统基本要求的基本原则组成。
以下屏幕截图显示了成员资格和分配的两个组成部分的示例:
![CHECK](graphics/477-1_05_5.jpg)
![CHECK](img/477-1_05_5.jpg)
我们最不想从检查中看到的是报告要求。作为专业安全测试人员,我们要做的最重要的事情之一就是编写一份报告。不幸的是,这是通常得到最少关注的事情之一。当涉及到测试时,大多数课程都会向您展示开发和其他方面的展示技巧。然而,现实情况是,你花在学习如何起草和创建报告上的时间越多,你就越能更好地满足客户的需求,这是一份关于你的调查结果的报告,而且是一份基于这些调查结果改进他们安全态势的建议的完整列表。
以下屏幕截图显示了检查中报告要求提交的信息示例:
![CHECK](graphics/477-1_05_6.jpg)
![CHECK](img/477-1_05_6.jpg)
经核实,我们掌握了该报告的构成信息。它是一个高级抽象,由六个主要主题组成。有关每个主题的其他说明,请参阅以下链接:
......@@ -274,13 +274,13 @@ OSSTMM 的无线测试部分到此结束。正如你所看到的,这是一个
正如我们对 OSSTMM 所做的那样,我们将只看一小部分文档的细节。NIST 网站上有许多我们应该熟悉的参考资料。**特别出版物**主页示例如下图所示:
![NIST SP-800-115](graphics/477-1_05_7.jpg)
![NIST SP-800-115](img/477-1_05_7.jpg)
NIST 网站和参考资料应在您喜爱的浏览器中添加书签,因为它们不断发布出版物供审查。花点时间回顾这些预发行的出版物总是一个好主意;这是另一种帮助您保持技术更新的方法。
根据 NIST 出版物,该文件为我们提供了专业信息安全测试和评估的流程和技术指导参考,以下屏幕截图显示了这方面的具体内容:
![NIST SP-800-115](graphics/477-1_05_8.jpg)
![NIST SP-800-115](img/477-1_05_8.jpg)
对于那些想要更详细地审查 NIST SP800-115 的人,您可以从 NIST 网站[下载该文件以及任何其他特殊出版物文件 http://csrc.nist.gov/publications/PubsSPs.html](http://csrc.nist.gov/publications/PubsSPs.html)
......@@ -354,7 +354,7 @@ NIST 出版物明确指出,它不是一个参考文献,它不会为您提供
NIST 出版物的下一部分是目标识别和分析技术部分。从这一点开始,我们将不回顾本节中的所有主题。我们将在继续的过程中强调需要注意的要点。在本节中,我们将介绍评估团队成员的技能。以下屏幕截图显示了一个示例:
![Overt and covert](graphics/477-1_05_9.jpg)
![Overt and covert](img/477-1_05_9.jpg)
正如前面的屏幕截图所示,四种主要技术中的三种需要 TCP/IP 知识作为基本技能集。这与我在行业中看到的情况是一致的,这就是理解协议并能够在数据包级别分析它们的重要性。阅读本文的许多人可能认为,当涉及 TCP/IP 时,你需要有广泛的背景和高水平的知识,这是一件好事。不幸的是,我遇到的大多数顾问或想成为顾问的人都不具备 TCP/IP 所需的详细知识。这让我写了一门关于安全的基础和核心概念的课程。本课程的主要内容之一是 TCP/IP。作为一名测试人员,您必须了解网络模型的所有层,并且在相应层的数据包级别上解释和分析不同的事件。
......@@ -362,13 +362,13 @@ NIST 出版物的下一部分是目标识别和分析技术部分。从这一点
本节包含 NIST 定义的渗透测试阶段。根据 NIST,渗透测试概念由四个阶段定义。这四个阶段是**计划****发现****攻击****报告**。NIST 出版物中的示例如下图所示:
![Overt and covert](graphics/477-1_05_10.jpg)
![Overt and covert](img/477-1_05_10.jpg)
在规划阶段,确定规则并最终确定和记录批准。必须由组织的合格代表以书面形式批准。计划为成功的穿透测试奠定基础。
发现阶段由两部分组成;第一部分是实际测试的开始,包括信息的收集和扫描。在发现阶段的第一部分中收集的信息显示在以下屏幕截图中:
![Overt and covert](graphics/477-1_05_11.jpg)
![Overt and covert](img/477-1_05_11.jpg)
发现阶段的第二部分是漏洞分析发挥作用的地方。这包括获取我们以前发现的信息,并将其与漏洞数据库进行比较。就像我们在本书前面所做的那样,该过程寻找我们已经识别的信息,然后发现我们在进入下一阶段攻击时可能利用的漏洞。在大多数情况下,这最初是通过自动扫描仪进行的。一旦扫描器识别出一个潜在的漏洞,我们接着对发现的漏洞进行更深入的调查,看看它是否真的是一个弱点,以及我们如何利用漏洞或验证漏洞。因此,此过程是手动的,可能很耗时。
......@@ -376,7 +376,7 @@ NIST 出版物的下一部分是目标识别和分析技术部分。从这一点
以下屏幕截图显示了一个示例:
![Overt and covert](graphics/477-1_05_12.jpg)
![Overt and covert](img/477-1_05_12.jpg)
攻击阶段的前一个屏幕截图中的阶段将在很大程度上取决于工作范围。因此,正如我们所提到的,为规划阶段定义清晰简洁的工作范围对于专业安全测试的后续组件至关重要。
......@@ -384,7 +384,7 @@ NIST 出版物中定义的渗透测试的最后阶段是报告阶段。同样,
我们将通过解释 NIST 出版物中的内容来结束讨论。存在与所有技术和技术组合相关的风险。因此,为了确保各项技术尽可能安全、准确地执行,建议测试人员具备一定的技能水平。其中一些已在上一个屏幕截图中显示,在本节中,我们有另一个关于技能的指南,如下屏幕截图所示:
![Overt and covert](graphics/477-1_05_13.jpg)
![Overt and covert](img/477-1_05_13.jpg)
值得注意的是,上一个屏幕截图中确定的技能仍然参考了 TCP/IP 知识,但现在我们已经从一般知识水平提升到了广泛的知识水平。作为一名专业的安全测试人员,再次强调在最低级别理解 TCP/IP 的重要性。
......@@ -392,15 +392,15 @@ NIST 出版物中定义的渗透测试的最后阶段是报告阶段。同样,
进攻性安全团队负责许多项目,我们将作为专业安全测试人员进行探索。的例子包括 Kali 发行版、metasploit 发布的指南、谷歌黑客数据库和漏洞数据库。如果您访问攻击性安全网站[http://www.offensive-security.com/](http://www.offensive-security.com/) ,您将无法找到实际方法的参考,但由于 Kali 发行版是该集团维护的项目,我们可以在其中寻找方法。以下屏幕截图显示了 Kali 中的方法示例:
![Offensive Security](graphics/477-1_05_14.jpg)
![Offensive Security](img/477-1_05_14.jpg)
如前一个屏幕截图所示,包含在 Kali 发行版中的方法遵循了我们在其他示例中介绍的类似步骤。如上所述,进攻性安全小组还保留了**metasploit 释放**的优秀参考资料。我们可以在这些步骤中练习一种方法,如以下屏幕截图所示:
![Offensive Security](graphics/477-1_05_15.jpg)
![Offensive Security](img/477-1_05_15.jpg)
关于**metasploit**参考文献的伟大之处在于,在主题中,有使用 metasploit 框架的详细步骤,以支持测试方法中的不同步骤。以下屏幕截图显示了在**流量计脚本**下可以找到的步骤示例:
![Offensive Security](graphics/477-1_05_16.jpg)
![Offensive Security](img/477-1_05_16.jpg)
我们将在这里停止 metasploit 释放的引用。在继续之前,如果您想更熟练地使用 metasploit 框架,建议研究此处提供的信息。这是最好的参考之一,我们必须释放工具的力量。
......@@ -410,7 +410,7 @@ NIST 出版物中定义的渗透测试的最后阶段是报告阶段。同样,
如果您曾经或曾经参加过由国际电子商务顾问委员会提供的认证道德课程,您会发现在课程的每个模块结束时,都有一个专门介绍渗透测试的部分。在本文中,您将发现一个流程图,该流程图显示了流程中的每个项目,它还提供了一个工具示例,用于获取该步骤的结果。以下屏幕截图显示了一个示例:
![Other methodologies](graphics/477-1_05_17.jpg)
![Other methodologies](img/477-1_05_17.jpg)
前面的示例是渗透测试枚举步骤的流程图;这是创建渗透测试方法文档的极好起点。事实上,建议您构建这些流程图并对其进行分层,以便您可以在现场随身携带,并且它们可以作为您遇到的不同类型测试的参考。
......
......@@ -15,7 +15,7 @@
对于基于网络的 IDS,IDS 的功能是在数据包级别处理网络流量,然后分析其特征或模式,这些特征或模式可能是攻击的迹象。考虑到这一点,请记住网络传感器正在捕获数据包;那么,一次有多少数据包通过网络?这是基于网络的 IDS(如何以不断提高的网络速度处理流量)面临的挑战之一。然而,我们正在超越自己。我们要做的第一件事是设计我们的体系结构,以便能够很好地表示在客户端网络上可能看到的典型 ID。我们将使用下图:
![Deploying a network-based IDS](graphics/477-1_08-1.jpg)
![Deploying a network-based IDS](img/477-1_08-1.jpg)
我们的建筑
......@@ -27,7 +27,7 @@
Firefox web 浏览器启动时,如果未填写用户名和密码详细信息,请输入所需信息并单击**确定**。这会将您放在网络安全工具包 Web 用户界面的主页上。然后导航至**安全****入侵检测****Snort IDS**,如下图所示:
![Deploying a network-based IDS](graphics/477-1_08-3.jpg)
![Deploying a network-based IDS](img/477-1_08-3.jpg)
打开 Snort 页面后,您将希望看到在挂起或关闭虚拟机时,机器处于何种状态。如果未看到处于列出状态的传感器,则必须为传感器配置接口。尽管我们在前面已经解释过了,但我们将再次研究它,这样您就不必寻找它了。如果您没有看到列出的传感器,则需要向下滚动并选择适当的界面。对于本书,我们使用的是 eth1 接口,因此下面的示例将基于此。如果您在另一个接口上设置了 VMnet2 开关,那么您必须选择该接口,而不是我们正在使用的接口。
......@@ -39,13 +39,13 @@ Firefox web 浏览器启动时,如果未填写用户名和密码详细信息
传感器成功启动后,您应该看到 Snort 传感器处于**运行**状态,如下图所示:
![Deploying a network-based IDS](graphics/477-1_08-4.jpg)
![Deploying a network-based IDS](img/477-1_08-4.jpg)
屏幕显示 Snort 传感器处于运行状态(剪切的文本不重要)
一旦进程处于我们希望它处于的状态,我们将验证规则是否已打开。点击**规则**并验证**扫描**规则是否被选中。以下屏幕截图显示了一个示例:
![Deploying a network-based IDS](graphics/477-1_08-5.jpg)
![Deploying a network-based IDS](img/477-1_08-5.jpg)
屏幕以验证是否选择了扫描规则(剪切的文本不重要)
......@@ -65,51 +65,51 @@ snort –A –c snort.conf
除了 Snort 易于安装之外,我们还喜欢网络安全工具包的另一个特点是,我们有优秀的 Snort 工具。我们来看看工具**Base Analysis Search Engine****Base**)。要启动基地,您需要导航到**安全****入侵检测****基地**。以下屏幕截图显示了一个示例:
![Deploying a network-based IDS](graphics/477-1_08-6.jpg)
![Deploying a network-based IDS](img/477-1_08-6.jpg)
当基本工具启动时,将要求您进行身份验证。应该已经为您输入了凭据,如果没有,您将有输入相应的凭据以访问 GUI。完成此操作后,单击**确定**,如下图所示:
![Deploying a network-based IDS](graphics/477-1_08-7.jpg)
![Deploying a network-based IDS](img/477-1_08-7.jpg)
基本 GUI 允许我们在图形显示中记录传感器检测到的警报。返回您的 Kali 机器,再次运行圣诞树扫描。作为提醒,您可以使用**X**选项配置扫描。扫描完成后,返回到**基本**显示屏并刷新显示屏,您现在应该可以看到检测到的 TCP 流量,如以下屏幕截图所示:
![Deploying a network-based IDS](graphics/477-1_08-8.jpg)
![Deploying a network-based IDS](img/477-1_08-8.jpg)
基本工具的一个优点是可以从警报中检查的信息。我们现在就做。单击百分比数字,将弹出另一个窗口,其中包含传感器检测到的警报列表。以下屏幕截图显示了一个示例:
![Deploying a network-based IDS](graphics/477-1_08-9.jpg)
![Deploying a network-based IDS](img/477-1_08-9.jpg)
我们要做的下一件事是检查警报。我们通过单击警报来实现这一点。单击警报时,您将看到有关警报的其他信息。以下屏幕截图显示了一个示例:
![Deploying a network-based IDS](graphics/477-1_08-10.jpg)
![Deploying a network-based IDS](img/477-1_08-10.jpg)
正如前面的屏幕截图所示,数据包的组成,包括封装数据的显示,可供查看。这显示了**Nmap**工具设置 FIN、PUSH 和紧急标志来表示扫描。某些工具在执行扫描时会设置所有六个标志。
有两个链接位于**元**部分和**触发签名**下。单击 Snort 链接,它将显示触发签名的规则。以下屏幕截图显示了一个示例:
![Deploying a network-based IDS](graphics/477-1_08-11.jpg)
![Deploying a network-based IDS](img/477-1_08-11.jpg)
前面的屏幕截图显示了您可以检查的信息,不仅可以发现有关签名的更多细节,还可以发现触发事件的影响。此外,您还可以提供有关误报评级的信息。这一点很重要,因为许多实施 IDS 的管理员将关闭生成大量错误警报的签名。事实上,你可能还记得,我们必须打开扫描规则,这是因为它有一个高假阳性率的趋势。现在我们将检查 Nmap XMAS 扫描的假阳性评级。向下滚动并查看信息。以下屏幕截图显示了一个示例:
![Deploying a network-based IDS](graphics/477-1_08-12.jpg)
![Deploying a network-based IDS](img/477-1_08-12.jpg)
我们现在有了一个 IDS 范围,可以用来观察不同工具和技术的反应。在执行此操作之前,我们将清除机器中的所有警报,要执行此操作,您需要转到**查询结果**屏幕的底部,并导航到**操作**|**删除警报**。完成此操作后,单击**整个查询**按钮删除警报,然后单击**主页**上的返回主屏幕。我们将使用 Nikto web 扫描工具查看使用扫描仪时 Snort 传感器的反应。我们将扫描 Snort 传感器网络上的网络安全工具包 web 服务器。要在 Kali Linux 机器上进行扫描,打开终端窗口,输入`nikto –ssl –h <IP address of the Sensor>`,如下图所示:
![Deploying a network-based IDS](graphics/477-1_08-13.jpg)
![Deploying a network-based IDS](img/477-1_08-13.jpg)
`ssl`选项用于强制检查**安全套接字层****SSL**),因为在默认配置中,网络安全工具包在端口 80 没有 web 服务器;只能访问 HTTPS 端口 443。扫描完成后,您会注意到有几个发现。要查看这些发现,您需要滚动浏览并查找它们。与大多数工具一样,有一种更好的方法,我们现在将对此进行探讨。
在终端窗口中,我们将使用工具的输出功能将其写入文件。输入`nikto –ssl –h <IP address of the Sensor> -o file.html`,如下图所示:
![Deploying a network-based IDS](graphics/477-1_08-14.jpg)
![Deploying a network-based IDS](img/477-1_08-14.jpg)
这已经获取了工具结果的输出,并将其写入 HTML 文件。导航至**应用****互联网****Iceweasel 网络浏览器**打开**Iceweasel**。浏览器打开时,打开已创建的文件并查看结果。您将看到输出更易于阅读,如以下屏幕截图所示:
![Deploying a network-based IDS](graphics/477-1_08-15.jpg)
![Deploying a network-based IDS](img/477-1_08-15.jpg)
现在是时候返回我们的 Snort 传感器和基本显示器查看是否有任何警报。我们已经进行了多次网络扫描,想看看检测到了什么。返回网络安全工具包,刷新基本显示并查看信息。以下屏幕截图显示了一个示例:
![Deploying a network-based IDS](graphics/477-1_08-16.jpg)
![Deploying a network-based IDS](img/477-1_08-16.jpg)
正如前面的截图所示,我们没有任何警报!为什么会这样?嗯,这是反复试验过程的一部分。我们知道在配置 Snort 传感器时加载了特定的规则,因为我们过去必须启用一些规则。因此,从这里开始的过程将是尝试启用更多规则,看看会发生什么。还有一个很好的机会是存在另一个问题,但只要我们发送非法标志组合数据包,我们就会收到某种警报,这告诉我们传感器正在工作。在这种情况下,如果启用所有规则,仍然不会出现警报。我们将保留这个问题的答案,直到我们进入关于逃避的部分。
......@@ -123,27 +123,27 @@ snort –A –c snort.conf
使用 Symantec 工具,我们查看工具配置中的选项以获得此信息。以下屏幕截图显示了仪表板的示例:
![Implementing the host-based IDS and endpoint security](graphics/477-1_08-17.jpg)
![Implementing the host-based IDS and endpoint security](img/477-1_08-17.jpg)
正如前面的截图所示,有三个主要保护区域。我们现在只有一个启用的,这是我们首先要看的。我们将导航到**选项****更改设置****入侵预防**以打开菜单更改阻止可疑攻击流量的设置。以下屏幕截图显示了一个示例:
![Implementing the host-based IDS and endpoint security](graphics/477-1_08-18.jpg)
![Implementing the host-based IDS and endpoint security](img/477-1_08-18.jpg)
正如前面的截图所示,我们有许多值可以配置和定制,这是我们作为测试人员面临的挑战之一。如果管理员调整或更改了不同的设置,我们可能无法逃避检测,但我们正在超越自己,因为我们不在逃避部分。我们在这里更改了默认值。
我们需要做的下一件事是看看我们是否能够检测到潜在的攻击并实际阻止 IP 地址。我们可以使用 Nmap,但我们更喜欢使用攻击工具,这就是 Nikto 的用武之地。我们将把它指向赛门铁克机器的 IP 地址,看看会发生什么。以下屏幕截图显示了一个结果示例:
![Implementing the host-based IDS and endpoint security](graphics/477-1_08-19.jpg)
![Implementing the host-based IDS and endpoint security](img/477-1_08-19.jpg)
正如前面的截图所示,攻击被检测到,IP 地址现在被阻止;这就是为什么我们将块更改为 60 秒,以便 Nikto 扫描不会花费太长时间。扫描完成后,我们可以在 Symantec 工具中查看检测历史和相应的块。所有这些功能对用户来说都很好,并且易于使用,但对攻击者来说也很好。Nikto 扫描的日志结果示例如以下屏幕截图所示:
![Implementing the host-based IDS and endpoint security](graphics/477-1_08-20.jpg)
![Implementing the host-based IDS and endpoint security](img/477-1_08-20.jpg)
如前一个屏幕截图所示,入侵预防工具已检测到并随后阻止了来自该工具的攻击尝试。问题是,正如许多阅读本文的人可能知道的那样,IP 阻止并不总是一个好主意,因为我们可以欺骗 IP 地址,然后用户将被阻止。这就是 IP 阻塞通常只针对可能导致重大损失的配置的原因之一。
赛门铁克工具还有其他几个部分,我们在这里不一一介绍。但是,我们将看一个与网络无关,但实际上与主机相关的。我们现在要看的功能是**防病毒和反间谍软件保护**。我们要做的第一件事是点击**修复所有**按钮,这将打开所有保护,如以下屏幕截图所示:
![Implementing the host-based IDS and endpoint security](graphics/477-1_08-21.jpg)
![Implementing the host-based IDS and endpoint security](img/477-1_08-21.jpg)
显示屏幕上所有保护的屏幕(剪切的文本不重要)
......@@ -151,11 +151,11 @@ snort –A –c snort.conf
当我们将 FU rootkit 的可执行文件复制到受保护的机器时,它会立即被检测为威胁,如下图所示:
![Implementing the host-based IDS and endpoint security](graphics/477-1_08-22.jpg)
![Implementing the host-based IDS and endpoint security](img/477-1_08-22.jpg)
正如前面的截图所示,它已被检测到,并被归类为**黑客工具。Rootkit**,由于它被视为威胁,因此被删除。我们可以通过点击防病毒和反间谍软件保护来查看更多检测细节。导航至**选项****查看日志****风险日志**查看已检测到的风险。以下屏幕截图显示了一个示例:
![Implementing the host-based IDS and endpoint security](graphics/477-1_08-23.jpg)
![Implementing the host-based IDS and endpoint security](img/477-1_08-23.jpg)
正如前面的截图所示,检测是在两个文件上进行的,可执行文件是一个和`msdirectx.sys`,这是加载并用于访问内核内存的驱动程序。FU-rootkit 是一个先驱,因为它是第一个实现**直接内核对象内存****DKOM**操作的。
......@@ -165,13 +165,13 @@ snort –A –c snort.conf
当我们正在构建我们的范围时,我们必须考虑我们拥有的交换机类型,以及我们是否需要配置**交换机端口分析仪****SPAN**)或**测试接入点****TAP**)。像大多数事情一样,每件事都有优点和缺点。您可以在网站[上了解更多信息 http://www.networktaps.com](http://www.networktaps.com) 。以下截图中显示了一个来自网站的比较示例:
![Working with virtual switches](graphics/477-1_08-24.jpg)
![Working with virtual switches](img/477-1_08-24.jpg)
如果你正在用物理开关构建你的射程,那么这是你必须考虑的事情。但是,如果您使用的是虚拟交换机,那么我们就没有这个难题。我们已经看过一次了,但我们想从入侵检测的角度来看。为此,我们将运行扫描,但这次不直接在传感器上运行。您将需要 Kali Linux 机器、OWASP 和网络安全工具包。在继续之前,启动所有三个虚拟机。
机器联机后,我们将使用运行 Snort 传感器的网络安全工具包,从 Kali Linux 机器对 OWASP 机器和 VMnet2 交换机进行扫描。设置如下图所示:
![Working with virtual switches](graphics/477-1_08-25.jpg)
![Working with virtual switches](img/477-1_08-25.jpg)
您将下一步需要在网络安全工具包机器上启动 Snort 传感器。我们在本章前面介绍了这方面的步骤。
......@@ -183,17 +183,17 @@ snort –A –c snort.conf
以下屏幕截图显示了一个示例:
![Working with virtual switches](graphics/477-1_08-26.jpg)
![Working with virtual switches](img/477-1_08-26.jpg)
显示基本显示的屏幕(剪切的文本不重要)
正如前面的截图所示,流量已经生成了一些警报。接下来我们要做的是查看传感器生成的警报。点击**100%**,这将显示传感器报告的警报列表。当我们使用 Nikto 工具时,我们正在寻找与 web 流量相关的警报。以下屏幕截图显示了一个示例:
![Working with virtual switches](graphics/477-1_08-27.jpg)
![Working with virtual switches](img/477-1_08-27.jpg)
我们现在有了警报,所以选择其中一个并进一步检查它。在本章的前面,当我们检查警报时,我们看到了有关生成警报的数据包的附加信息。然而,我们没有关于数据包有效载荷的任何信息。这是因为没有可捕获的有效载荷。由于这些数据包是攻击模式,我们有更好的机会找到有效负载。目录遍历攻击的有效负载示例如以下屏幕截图所示:
![Working with virtual switches](graphics/477-1_08-28.jpg)
![Working with virtual switches](img/477-1_08-28.jpg)
您可以看到,虚拟交换机上的传感器不需要像物理交换机那样使用范围或镜像来查看网络流量,因此我们已经准备好进入另一部分。
......@@ -219,11 +219,11 @@ snort –A –c snort.conf
在检测漏洞时,检测到的数据是 shell 代码;此外,该代码的签名。因为它是一种标准,所以工具很容易检测到它。我们现在来看看这个。您将需要您的 Kioptrix 机器,因为我们将利用它。我们已经讨论了许多实现这一点的方法,出于我们的目的,我们将使用 metasploit 工具对其进行开发。当我们试图避免检测时,有许多参数可以操纵,不幸的是,没有保证。如果您使用 Armitage 工具,那么您可以选择**显示高级选项**来查看我们可以使用的其他参数。以下屏幕截图显示了一个示例:
![Shell code obfuscation](graphics/477-1_08-29.jpg)
![Shell code obfuscation](img/477-1_08-29.jpg)
我们将首先使用默认设置进行攻击,以查看基本工具检测到了什么。再说一次,当涉及到逃避时,没有保证,所以这是一个实验和记录你的发现的问题。以下屏幕截图显示了利用漏洞的尝试示例:
![Shell code obfuscation](graphics/477-1_08-30.jpg)
![Shell code obfuscation](img/477-1_08-30.jpg)
正如前面的屏幕截图所示,我们没有成功,所以现在我们将修改有效负载,看看我们是否有更好的运气。这是一个过程:你尝试不同的事情,发现什么是有效的,什么是无效的。这就是为什么很少要求逃避是件好事。
......@@ -235,11 +235,11 @@ snort –A –c snort.conf
向下滚动至服务器配置部分,删除`#`以取消注释`Listen 80`,如下图所示:
![Shell code obfuscation](graphics/477-1_08-31.jpg)
![Shell code obfuscation](img/477-1_08-31.jpg)
编辑完成后,导航至**文件****保存退出**退出编辑器。接下来要做的是重新启动 web 服务器。在终端窗口中,输入`service httpd restart`重新启动服务。一旦服务重新启动,我们将使用 Nikto 对 NST 机器进行扫描。对于第一次扫描,我们将使用 SSL 选项,但在执行此操作之前,请确保清除库中的所有查询。返回您的 Kali 机器并扫描 NST 机器的 IP 地址。在我们的示例中,机器地址是 10.2.0.144,这就是我们将使用的地址。在终端窗口中,输入`nikto -ssl -h 10.2.0.144`。扫描完成后,返回基地,查看是否检测到扫描。你被发现了吗?答案应该是否定的!为什么会这样?好吧,在我们回答这个问题之前,就像所有好的测试一样,我们将证明这一点。基本显示中不应有任何警报。返回您的 Kali 机器,再次运行扫描,而不强制它通过 SSL。在终端窗口中,输入`nikto -h 10.2.0.144`。扫描完成后,返回基本显示屏,查看是否检测到扫描。以下屏幕截图显示了仪表板的示例:
![Shell code obfuscation](graphics/477-1_08-32.jpg)
![Shell code obfuscation](img/477-1_08-32.jpg)
显示基本显示的屏幕(剪切的文本不重要)
......
......@@ -21,7 +21,7 @@
我们的方法是创建一个分段的体系结构,利用虚拟化框架中的交换机选项。此外,我们希望构建不同类型的网段,以便测试平面和分层网络的组合。在本书中,我们多次讨论了这些体系结构。下图显示了我们建议的架构范围示例:
![Segmenting the architecture](graphics/477-1_13_1.jpg)
![Segmenting the architecture](img/477-1_13_1.jpg)
#### 公共非军事区
......@@ -29,7 +29,7 @@
下图显示了此配置的示例:
![A public DMZ](graphics/477-1_13_2.jpg)
![A public DMZ](img/477-1_13_2.jpg)
这种方法的问题在于公共 DMZ 仅受屏蔽路由器的保护,因此有遭受攻击的风险;因此,这个问题的一个潜在解决方案是移动 DMZ。
......@@ -39,7 +39,7 @@
下图显示了此配置的示例:
![A private DMZ](graphics/477-1_13_3.jpg)
![A private DMZ](img/477-1_13_3.jpg)
正如前面的图所示,我们现在有两层防御,保护放置在私人 DMZ 中的机器。话虽如此,这种方法有一个缺点,那就是我们允许我们的公共服务一路通过防火墙进入。因此,带宽由进出互联网的所有流量共享。在下一节中,我们将研究一种可能的解决方案。
......@@ -49,7 +49,7 @@
这种配置的另一个好处是,我们可以为用户绑定防火墙内的端口,然后只绑定外部接口上的最小端口。下图显示了这方面的示例:
![Decoy DMZ](graphics/477-1_13_4.jpg)
![Decoy DMZ](img/477-1_13_4.jpg)
上图中架构的优势在于,由于进出互联网的主要流量不与进出公共 DMZ 中服务的流量共享,网络的性能趋于提高。由于我们在整本书中都集中在进攻上,所以我们不会从防守的角度来讨论优势。但是,对于想了解更多信息的人,您可以在我创建的**高级安全培训中心**部分查看**高级网络防御**课程。您可以通过以下链接阅读更多内容:[http://www.eccouncil.org/Training/advanced-security-training/courses/cast-614](http://www.eccouncil.org/Training/advanced-security-training/courses/cast-614)
......@@ -61,21 +61,21 @@
我们将要看到的第一个蜜罐是由**Marcus Ranum**在多年前创建的,当时 Back 孔工具感染了互联网上的机器。该工具不再可用,但您可以在 Internet 上搜索,您应该能够发现它。工具被称为**后备军官友好型**,而且虽然占地面积小,但在蜜罐的角色上非常有效。该工具允许您选择它将侦听连接的多个端口。以下屏幕截图显示了这些选项的示例:
![Integrating decoys and honeypots](graphics/477-1_13_5.jpg)
![Integrating decoys and honeypots](img/477-1_13_5.jpg)
正如前面的屏幕截图所示,我们将所有端口设置为在蜜罐上侦听。我们没有选择**假回复**选项;这是因为如果设置了此选项,则横幅将泄露蜜罐。现在我们有了监听这一系列端口的蜜罐,我们将扫描它,看看扫描时它是什么样子。
以下屏幕截图显示了使用 Nmap 扫描机器后的结果示例:
![Integrating decoys and honeypots](graphics/477-1_13_6.jpg)
![Integrating decoys and honeypots](img/477-1_13_6.jpg)
正如前面的屏幕截图所示,我们在机器上打开了这些端口,因此我们希望对此进行进一步探索。首选的方法是手动连接端口并抓取这些端口的标题,因为如果我们扫描端口,它们会返回为`tcpwrapped`;因此,我们将手动查看端口。我们有很多方法可以用来连接这个端口,在书中的例子中,我们将使用`netcat`。在终端窗口中,输入`nc <target> 21`连接 FTP 服务器;以下屏幕截图显示了此结果的示例:
![Integrating decoys and honeypots](graphics/477-1_13_7.jpg)
![Integrating decoys and honeypots](img/477-1_13_7.jpg)
如前面的截图所示,`netcat`命令只返回一个命令提示,表示连接不成功;然而,当我们使用 telnet 时,会建立连接,然后立即关闭。这些是您希望在测试中查找的类型,也就是说,查找行为不正常的类型。当我们扫描机器时,我们看到有打开的端口;然而,当我们试图连接到这些已识别的开放端口时,我们并没有成功。这种情况不应该发生,因此是可疑的。重要的是要记住,如果它的行为不正常,即使它有开放的端口,有一个很好的机会,你遇到了一个蜜罐。蜜罐本身呢?以下屏幕截图显示了一个示例:
![Integrating decoys and honeypots](graphics/477-1_13_8.jpg)
![Integrating decoys and honeypots](img/477-1_13_8.jpg)
如前一个屏幕截图所示,该工具显示连接尝试;即使用户没有连接,蜜罐仍然会记录它。
......@@ -89,21 +89,21 @@
在终端窗口中准备好运行工具后,输入`labrea –v –i eth0 -sz -d -n <target> -o`。我们不会审查选项,但鼓励您自行审查。我们已经将输出设置为写入屏幕,因此我们将看到 Labrea 工具截获的任何内容的输出。以下屏幕截图显示了该命令的输出示例:
![Integrating decoys and honeypots](graphics/477-1_13_9.jpg)
![Integrating decoys and honeypots](img/477-1_13_9.jpg)
在上一个屏幕截图中需要注意的一点是配置文件已设置为仅响应`1-3000`端口。接下来,我们需要看看蜜罐将如何在网络上响应。我们将使用 Kali Linux 机器;在 Kali 的终端窗口中,输入`ping –c 7 <target>`,其中目标是您的目标网络的任何 IP 地址。
以下屏幕截图显示了`192.168.177`网络的示例:
![Integrating decoys and honeypots](graphics/477-1_13_10.jpg)
![Integrating decoys and honeypots](img/477-1_13_10.jpg)
正如前面的截图所示,第一个 ping 请求返回时无法访问。因此,那里没有主机。机器在第四个 ping 上响应;这是来自 Labrea 蜜罐的回应。我们可以通过参考启动程序的终端窗口来验证这一点。以下屏幕截图显示了一个示例:
![Integrating decoys and honeypots](graphics/477-1_13_11.jpg)
![Integrating decoys and honeypots](img/477-1_13_11.jpg)
为了了解 Labrea 蜜罐的真正威力,我们将使用 Kali Linux 发行版中的一个工具 ping 一系列 IP 地址。在 Kali Linux 终端中,输入`fping –g <target IP block>`。以下屏幕截图显示了该命令部分结果的示例:
![Integrating decoys and honeypots](graphics/477-1_13_12.jpg)
![Integrating decoys and honeypots](img/477-1_13_12.jpg)
这表明 Labrea 蜜罐已经在`192.168.177`子网上创建了所有可能机器的诱饵存在;这些机器看起来像是活机器。这是为了请求与这些 IP 地址的连接,因为它们是恶意的。
......@@ -111,31 +111,31 @@ Labrea 蜜罐使用了一种称为**焦油点**的技术,这会导致连接花
以下屏幕截图显示了其中一台诱饵机器的扫描结果示例:
![Integrating decoys and honeypots](graphics/477-1_13_13.jpg)
![Integrating decoys and honeypots](img/477-1_13_13.jpg)
我们要注意的另一个响应是使用`netcat`连接到机器;我们现在就尝试一下。在 Kali 机器中,输入`nc <target IP address> 445`。以下屏幕截图显示了手动连接时的结果示例:
![Integrating decoys and honeypots](graphics/477-1_13_14.jpg)
![Integrating decoys and honeypots](img/477-1_13_14.jpg)
正如前面的截图所示,蜜罐会检测到每个连接并将其放入柏油坑,这会花费更多的时间,并捕获与机器的通信。要研究和了解更多关于 Labrea 的信息,请参考[http://sourceforge.net/projects/labrea/](http://sourceforge.net/projects/labrea/)
接下来我们要看的蜜罐是商用产品**KFSensor**。您可以在[了解更多信息 http://www.keyfocus.net/kfsensor/](http://www.keyfocus.net/kfsensor/) 。该网站将要求您注册才能下载该工具。下载后,需要将其安装到 Windows 系统上。以下屏幕截图显示了该工具的界面示例:
![Integrating decoys and honeypots](graphics/477-1_13_15.jpg)
![Integrating decoys and honeypots](img/477-1_13_15.jpg)
正如前面的截图所示,我们有许多端口通过蜜罐打开,因此下一步是检查并查看扫描后返回的内容。请记住,我们希望执行测试,以便知道当我们遇到一个带有此蜜罐的网络时会发生什么。此外,我们希望确保注意到可以帮助我们确定 KFSensor 是否部署在网络上的工件。
以下屏幕截图显示了针对蜜罐的`Nmap`扫描示例:
![Integrating decoys and honeypots](graphics/477-1_13_16.jpg)
![Integrating decoys and honeypots](img/477-1_13_16.jpg)
正如前面的屏幕截图所示,我们打开了端口,但`Nmap`将其报告为`tcpwrapped`。这是我们做`Nmap`扫描时的样子,那么它在目标上是什么样子的呢?此外,蜜罐展示了什么?以下屏幕截图显示了一个示例:
![Integrating decoys and honeypots](graphics/477-1_13_17.jpg)
![Integrating decoys and honeypots](img/477-1_13_17.jpg)
该工具的另一个好处是,它还打开了许多 UDP 端口,因此提供了一个非常有效的蜜罐。以下屏幕截图显示了 UDP 端口的示例:
![Integrating decoys and honeypots](graphics/477-1_13_18.jpg)
![Integrating decoys and honeypots](img/477-1_13_18.jpg)
这是只是看一看可用的许多不同蜜罐中的一些,因此,您应该在测试范围内使用不同的蜜罐进行练习,并记录它们在部署后的行为。
......@@ -147,11 +147,11 @@ Labrea 蜜罐使用了一种称为**焦油点**的技术,这会导致连接花
一旦你建立并攻击了靶场,强烈建议你记录这些攻击,以便你可以使用它们进行练习,更重要的是,用于训练目的。每次执行攻击时,都会创建非常有价值的数据,这些数据应该被捕获并再次使用。捕获数据的最简单方法之一是使用 Wireshark。捕获数据后,保存它,然后可以使用工具重播捕获的流量。有很多方法可以实现这一点。最简单的方法之一是使用**tcpreplay**工具;它是 Kali Linux 发行版的一部分。此外,如果您不想创建自己的攻击,还可以下载许多包跟踪,这些跟踪涵盖了许多不同的攻击。下面的屏幕截图显示了用于重播早期 DEFCON 会议中的文件的命令示例:
![Recording the attack data for further training and analysis](graphics/477-1_13_19.jpg)
![Recording the attack data for further training and analysis](img/477-1_13_19.jpg)
对于那些想要使用 GUI 工具的人来说,有很多工具可供选择。一个免费的很好用的是来自 Colasoft 的 Colasoft 数据包播放器;您可以从[下载 http://www.colasoft.com](http://www.colasoft.com) 。下面的屏幕截图显示了该工具用于回放 DEFCON 数据包捕获的示例:
![Recording the attack data for further training and analysis](graphics/477-1_13_20.jpg)
![Recording the attack data for further training and analysis](img/477-1_13_20.jpg)
正如前面的截图所示,您可以设置多种不同的播放速度,在**突发**模式下,播放速度将尽网卡所能。
......
......@@ -116,7 +116,7 @@ Windows 没有预先安装 Python。要检查是否已安装,请打开命令
***F5**
* 单击带有三个齿轮的图标
![Setting up in Windows](images/image_01_001.jpg)
![Setting up in Windows](img/image_01_001.jpg)
当 Geany 中有一个正在运行的`hello.py`程序时,请执行以下步骤:
......@@ -222,7 +222,7 @@ $ source name-of-virtual-environment/bin/activate
```
![Using virtualenv and virtualwrapper](images/image_01_002.jpg)
![Using virtualenv and virtualwrapper](img/image_01_002.jpg)
现在,在命令提示符的左侧,将显示活动虚拟环境的名称。在此提示符中使用`pip`安装的任何软件包都将属于活动虚拟环境,该虚拟环境将与所有其他虚拟环境和全局安装隔离。
......
......@@ -174,7 +174,7 @@ while True:
服务器终端可能如下所示:
![Receiving data](images/image_02_001.jpg)
![Receiving data](img/image_02_001.jpg)
现在,我们可以修改客户端脚本以从服务器接收响应:
......@@ -212,7 +212,7 @@ print "Response from server:", data
将此保存到`client.py`并运行。请确保服务器脚本正在运行。客户端终端可能如下所示:
![Receiving data](images/image_02_002.jpg)
![Receiving data](img/image_02_002.jpg)
### 处理多个连接
......@@ -362,15 +362,15 @@ TCP/IP 等协议的头由内核或操作系统堆栈提供,但我们可以使
所有数据包的结构都是相同的,包括 IP 头和一个可变长度的数据字段。首先,我们有固定大小为 14 字节的以太网报头,然后是 IP 报头(如果是 IP 数据包),或者 TCP 报头(如果是 TCP 数据包),基于以太网报头最后两个字节中指定的以太网类型:
![Raw socket programming](images/image_02_004.jpg)
![Raw socket programming](img/image_02_004.jpg)
在以太网报头中,前六个字节是目标主机,后面是六个字节的源主机。最后两个字节是以太网类型:
![Raw socket programming](images/image_02_006.jpg)
![Raw socket programming](img/image_02_006.jpg)
IP 报头的长度为 20 字节;前 12 个字节包括版本、**IHL****总计****长度****标志**等,后 4 个字节代表源地址。最后,最后四个字节是目标地址:
![Raw socket programming](images/image_02_008.jpg)
![Raw socket programming](img/image_02_008.jpg)
### 提示
......@@ -553,7 +553,7 @@ raw_socket.send(packet + "Hello")
这将在 Scapy 中返回一个交互式终端:
![Investigate network traffic with Scapy](images/image_02_010.jpg)
![Investigate network traffic with Scapy](img/image_02_010.jpg)
以下是一些用于交互使用的基本命令:
......@@ -580,7 +580,7 @@ Scapy 帮助创建基于其支持的大量协议集的自定义数据包。现
以下屏幕截图显示了该数据包的使用情况:
![Investigate network traffic with Scapy](images/image_02_012.jpg)
![Investigate network traffic with Scapy](img/image_02_012.jpg)
Scapy 通过每个数据包中的层和每个层中的字段创建和解析数据包。每个层都封装在父层内。Scapy 中的数据包是 Python 字典,因此每个数据包都是一组嵌套字典,每一层都是父层的子字典。`summary()`方法将提供数据包层的详细信息:
......@@ -633,7 +633,7 @@ Scapy 通过每个数据包中的层和每个层中的字段创建和解析数
这将从`eth0`接口获得三个数据包。通过`hexdump()`,我们可以在`hex`中转储数据包:
![Packet sniffing with Scapy](images/image_02_014.jpg)
![Packet sniffing with Scapy](img/image_02_014.jpg)
`sniff()`方法的参数如下:
......@@ -653,7 +653,7 @@ Scapy 通过每个数据包中的层和每个层中的字段创建和解析数
此命令将提供以下输出:
![Packet sniffing with Scapy](images/image_02_016.jpg)
![Packet sniffing with Scapy](img/image_02_016.jpg)
要实时查看嗅探到的数据包,我们必须使用 lambda 函数以及`summary()``show()`方法:
......@@ -742,7 +742,7 @@ send 命令的主要参数如下所示:
我们发送的数据包可以使用另一个 Scapy 交互终端进行嗅探。输出如下,第二个数据包是我们从`packtpub.com`收到的响应:
![Packet injection with Scapy](images/image_02_017.jpg)
![Packet injection with Scapy](img/image_02_017.jpg)
类似地,要发送第 2 层数据包,我们必须添加以太网报头和接口,如下所示:
......
......@@ -98,7 +98,7 @@ Urllib/urllib2 提供了可用于从 URL 获取资源的方法,包括打开网
* 输出如下所示:
![Useful methods of urllib/urllib2](images/image_03_001.jpg)
![Useful methods of urllib/urllib2](img/image_03_001.jpg)
* 我们也可以使用`keys()`获取所有响应头键:
......@@ -217,7 +217,7 @@ print response.request.headers # Headers we sent
* 输出结果如下:
![Parsing HTML using BeautifulSoup](images/image_03_004.jpg)
![Parsing HTML using BeautifulSoup](img/image_03_004.jpg)
* 使用`BeautifulSoup`在 HTML 中导航的一些示例方法如下:
......@@ -316,7 +316,7 @@ tree = html.fromstring(response.content)
我们可以使用任何 page inspect 工具(如 Firebug 或 Chrome developer 工具)获取元素的 XPath:
![Parsing HTML with lxml](images/image_03_007.jpg)
![Parsing HTML with lxml](img/image_03_007.jpg)
如果我们想从列表中获得书名和价格,请在源代码中找到以下部分。
......@@ -360,7 +360,7 @@ Scrapy 是一个用于 web 抓取和 web 爬行的开源框架。这可以用来
这将在当前工作目录`testSpider`中生成一个项目文件夹。这也将为我们的 spider 在文件夹中创建一个基本结构和文件:
![Scrapy](images/image_03_010.jpg)
![Scrapy](img/image_03_010.jpg)
Scrapy 有 CLI 命令来创建爬行器。要创建爬行器,我们必须输入由`startproject`命令生成的文件夹:
......@@ -378,7 +378,7 @@ Scrapy 有 CLI 命令来创建爬行器。要创建爬行器,我们必须输
这将生成另一个名为`spiders`的文件夹,并在该文件夹内创建所需的文件。然后,文件夹结构将如下所示:
![Scrapy](images/image_03_011.jpg)
![Scrapy](img/image_03_011.jpg)
现在打开`items.py`文件,在名为`TestspiderItem`的子类中定义一个新项:
......
......@@ -424,7 +424,7 @@ $ sudo python process_monitor.py
结果如下:
![Installation](images/image_05_001.jpg)
![Installation](img/image_05_001.jpg)
```
$ python network_monitor.py
......@@ -433,7 +433,7 @@ $ python network_monitor.py
结果如下:
![Installation](images/image_05_002.jpg)
![Installation](img/image_05_002.jpg)
要在 Windows 和 Linux 上安装,请先安装必备软件。
......
......@@ -39,7 +39,7 @@ DOS 头以幻数`4D 5A 50 00`(前两个字节为字母`MZ`)开头,最后
PE 标题包含更多有趣的信息。以下是 PE 标头的结构:
![PE header](images/image_06_001-2.jpg)
![PE header](img/image_06_001-2.jpg)
PE 总管由三部分组成:
......@@ -93,7 +93,7 @@ pe = pefile.PE('path/to/file')
这将以可读格式列出所有内容,如下所示:
![Inspecting headers](images/image_06_002-2.jpg)
![Inspecting headers](img/image_06_002-2.jpg)
我们还可以打印特定标题的内容,如下所示:
......
......@@ -24,7 +24,7 @@
散列函数主要用于密码学中检查消息的完整性、数字签名、操作检测、指纹和密码存储。如果不能根据输出猜测输入字符串,则函数是一个好的哈希函数。当散列函数将随机数量的数据转换为固定长度的字符串时,可能会有一些输入散列为相同的字符串。散列函数的创建方式使得这些冲突极难找到。最常用的哈希函数如下所示:
![Hash functions](images/image_07_001.jpg)
![Hash functions](img/image_07_001.jpg)
**MD2****MD4****MD5**具有**128 位**长度且不安全。**SHA-1****160 位**长度,但也不安全。
......@@ -99,7 +99,7 @@ print digest
要使用特定的哈希算法,我们可以使用`hashlib`模块中的相应构造函数,该构造函数将创建一个哈希对象,该对象可用于与哈希进行交互。由于`hashlib`模块有 OpenSSL 支持,所以 OpenSSL 中的所有算法,如`md5``sha1``sha224``sha256``sha384``sha512`都可以在`hashlib`中使用:
![hashlib algorithms](images/image_07_002.jpg)
![hashlib algorithms](img/image_07_002.jpg)
以下是重要的`hashlib`方法:
......
......@@ -275,7 +275,7 @@ ImageGrab.grab(bbox=(10,10,510,510)).save("screen_capture.jpg", "JPEG") where, b
以下屏幕截图说明了该示例:
![Screen grabbing](images/image_08_001.jpg)
![Screen grabbing](img/image_08_001.jpg)
要在 Linux 系统上抓取屏幕截图,我们必须使用具有跨平台兼容性的`wxPython`库。我们可以从[下载 wxPythonhttp://wxpython.org/download.php](http://wxpython.org/download.php)
......
......@@ -21,13 +21,13 @@
paramiko 的主要类是`paramiko.SSHClient`,它提供了一个启动服务器连接的基本接口:
![Establish SSH connection with paramiko](images/1-1.jpg)
![Establish SSH connection with paramiko](img/1-1.jpg)
这将创建一个新的 SSHClient 实例,然后我们调用连接到 SSH 服务器的`connect()`方法。
当我们使用任何 SSH 客户端连接到远程计算机时,该远程主机的密钥将自动存储在主目录中的`.ssh/known_hosts`文件中。因此,当我们第一次连接到远程系统时,我们将收到一条消息,如下所示:
![Establish SSH connection with paramiko](images/4323OS_09_01.jpg)
![Establish SSH connection with paramiko](img/4323OS_09_01.jpg)
当您为此消息键入`yes`时,它将在`known_hosts`文件中添加一个条目。通过接受此消息,将为该主机添加一个信任级别。同样的规则也适用于帕拉米科。默认情况下,SSHClient 实例将拒绝连接没有在我们的`known_hosts`文件中保存密钥的主机。这将在创建自动化脚本时产生问题。我们可以设置主机密钥策略,使用 paramiko 自动添加缺少的主机密钥,如下所示:
......@@ -38,7 +38,7 @@ ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
现在,使用自动添加主机键连接到`ssh`的脚本如下:
![Establish SSH connection with paramiko](images/2-1.jpg)
![Establish SSH connection with paramiko](img/2-1.jpg)
## 使用 paramiko 运行命令
......@@ -77,7 +77,7 @@ for line in stdout.readlines():
为此,我们首先像前面一样实例化一个新的`paramiko.SSHClient`实例:
![SFTP with paramiko](images/3.jpg)
![SFTP with paramiko](img/3.jpg)
然后在连接到远程主机后使用`open_sftp()`,将返回一个`paramiko.SFTPClient`客户端对象。`paramiko.SFTPClient`将支持所有 SFTP 操作。在这里,我们列出了远程服务器根目录中的文件。
......@@ -165,7 +165,7 @@ for port in listport:
此脚本将提供如下输出:
![python-nmap](images/image_09_002.jpg)
![python-nmap](img/image_09_002.jpg)
### 提示
......@@ -295,7 +295,7 @@ $ ./msfrpcd
结果如下:
![Metasploit scripting with MSGRPC](images/image_09_007.jpg)
![Metasploit scripting with MSGRPC](img/image_09_007.jpg)
要使用密码`123456`启动 MSGRPC:
......@@ -304,7 +304,7 @@ $ ./msfrpcd -P 123456 -n -f
```
![Metasploit scripting with MSGRPC](images/image_09_008.jpg)
![Metasploit scripting with MSGRPC](img/image_09_008.jpg)
现在 Metasploit 的 RPC 接口正在监听端口`55553`。我们可以继续编写 Python 脚本。
......@@ -710,11 +710,11 @@ $ ./beef
输出结果如下:
![Installing BeEF](images/Capture.jpg)
![Installing BeEF](img/Capture.jpg)
* 从一个 web 界面管理多个受害者既低效又乏味。BeEF 有一个 RESTAPI,可以帮助自动化许多任务。要访问此 API,它需要一个 API 密钥,该密钥在启动时由 BeEF 生成。
![Installing BeEF](images/4323OS_09_06.jpg)
![Installing BeEF](img/4323OS_09_06.jpg)
### 连接牛肉和蛋黄酱
......@@ -734,11 +734,11 @@ enable: true
主配置文件已准备好支持 Metasploit 扩展,并且 MSGRPC 服务已启动。现在,我们必须更新扩展设置以更新到 MSGRPC 服务器的连接详细信息。为此,编辑 Metasploit 扩展名的配置文件(`extensions/metasploit/config.xml`
![Connecting BeEF with Metasploit](images/4323OS_09_07.jpg)
![Connecting BeEF with Metasploit](img/4323OS_09_07.jpg)
现在,我们可以开始吃牛肉了。如果连接成功,将有一个额外的通知,指示加载的 Metasploit 攻击次数,如下所示:
![Connecting BeEF with Metasploit](images/Capture-2.jpg)
![Connecting BeEF with Metasploit](img/Capture-2.jpg)
### 用 Python 访问牛肉 API
......
此差异已折叠。
......@@ -38,7 +38,7 @@ Python 不支持`switch`语句。
从现在起,我们将了解脚本是如何工作的。我们要么创建脚本文件,要么进行练习。因此,请继续在 gedit 或您选择的任何编辑器上创建一个文件,并将其命名为`if_condition.py`。或者,我们可以在终端中键入`gedit if_condition.py`
![](assets/aa9f2b2d-6c1e-4a9c-9f32-6256eeea1e66.png)
![](img/aa9f2b2d-6c1e-4a9c-9f32-6256eeea1e66.png)
然后键入以下代码:
......@@ -52,7 +52,7 @@ print("End")
现在,为了运行这个脚本,我们只需在终端中键入`python3.5 if_condition.py`
![](assets/1312d095-dbf5-4364-b1b7-5b7579c8056e.png)
![](img/1312d095-dbf5-4364-b1b7-5b7579c8056e.png)
Python`print`方法默认情况下会在要打印的字符串中添加`\n`,使用它我们可以在不同的行中看到两个输出。注意,`if`语句的语法如下:
......@@ -64,11 +64,11 @@ Python`print`方法默认情况下会在要打印的字符串中添加`\n`,使
**让我们创建另一个名为`if_detailed.py`的文件,并键入以下代码:
![](assets/7c54677b-14e2-455c-9d44-5ca468c56ff8.png)
![](img/7c54677b-14e2-455c-9d44-5ca468c56ff8.png)
您可能已经注意到,在文件的开头,我们有一条语句,内容为`#! /usr/bin/python3.5`。这意味着我们不必每次执行代码时都输入`python3.5`。它指示代码在每次作为可执行文件执行时使用放置在`/usr/bin/python3.5`的程序来执行它。我们需要更改文件的权限以使其可执行。执行此操作,然后按如下方式执行代码:
![](assets/7e5e11fc-3482-487e-bb75-e91fda5623a7.png)
![](img/7e5e11fc-3482-487e-bb75-e91fda5623a7.png)
产生的结果不言自明。如前所述,任何不计算为`0``False``None``empty`的内容都被视为`True`,并执行`if`块。这解释了为什么前三个`if`条件被评估为`True`并打印了消息,但第四条消息没有打印。从第 19 行开始,我们使用了逻辑运算符。在 Python 中,连接操作由 PosiT8 算子运载,它与 C、C++、java 使用的 java 是相同的。最后,`not`关键字在 Python 中提供否定,就像`!`在其他语言中一样。
......@@ -90,11 +90,11 @@ print("End")
让我们创建一个名为`if_else.py`的文件,看看如何使用它:
![](assets/5599335c-aa75-4ca0-84cb-e3fc8080ee70.png)
![](img/5599335c-aa75-4ca0-84cb-e3fc8080ee70.png)
同样,这里的输出是不言自明的。在这部分代码中,我们探讨了一些位运算符与`if...else`代码结构的用法。我们还使用了变量,这些变量将使用打印方法打印。`%s`是占位符,并指定`%s`的值应替换为字符串变量,该字符串变量的值将在字符串结束后非实质性地出现。如果我们有多个值要替换,它们可以作为元组传递,例如`%(val1,val2,val3)`
![](assets/adaa4be6-332d-470f-8ae1-b6d99a3a6bac.png)
![](img/adaa4be6-332d-470f-8ae1-b6d99a3a6bac.png)
# if…elif 条件
......@@ -114,11 +114,11 @@ print("End")
必须注意,前面代码段中的第三个`else`是可选的。即使我们没有指定,代码也可以正常工作:
![](assets/ee775bc5-f579-4818-b1b7-e52d557c3560.png)
![](img/ee775bc5-f579-4818-b1b7-e52d557c3560.png)
让我们创建一个名为`if_el_if.py`的文件,看看如何使用它:
![](assets/2676e133-5cb3-4a20-85c9-3a22b38122d7.png)
![](img/2676e133-5cb3-4a20-85c9-3a22b38122d7.png)
# 循环
......@@ -145,13 +145,13 @@ my_list[3].get("k1") -> "v1
让我们在下面的代码的帮助下更仔细地看看{ To0t}循环。我们还将看到如何使用`while`循环迭代列表:
![](assets/0e68bc32-414c-496d-adc4-3b226d86b136.png)
![](img/0e68bc32-414c-496d-adc4-3b226d86b136.png)
代码的第一部分,第 2 行到第 6 行,描述了`while`循环的一个简单用法,其中我们将打印一条语句五次。请注意,为要执行的循环指定的条件可以使用大括号放置,也可以不使用大括号放置,如第 7 行到第 10 行所示。
在第 12 行中,我们声明了一个包含数字、字符串、浮点和嵌套列表的列表。然后,在从第 14 行开始的最后一个`while`循环中,我们通过将循环控制变量设置为小于列表的长度来迭代列表的元素。在循环中,我们检查列表变量的类型。`if`类型(`1`返回整数类,`a`类型返回字符串类,`[]`类型返回列表类。当类型为列表时,我们在嵌套的`while`循环中再次迭代它的元素,并打印每个元素,如第 19 到 24 行所示:
![](assets/10ea76e3-b448-4f3b-83b1-94ab2fb0b198.png)
![](img/10ea76e3-b448-4f3b-83b1-94ab2fb0b198.png)
# for 循环
......@@ -163,21 +163,21 @@ my_list[3].get("k1") -> "v1
**Iterable**:Iterable 是具有`__iter__`方法的对象,该方法返回迭代器。迭代器是任何包含可以迭代的元素序列的对象,然后可以执行操作。Python 字符串、列表、元组、字典和集合都是 ITerable,因为它们实现了`__iter__`方法。查看以下代码段以查看示例:
![](assets/519d23b0-3a68-4990-8bdc-a9ab679251bb.png)
![](img/519d23b0-3a68-4990-8bdc-a9ab679251bb.png)
在前面的代码片段中,我们声明了一个字符串`a`并将值`hello`放入其中。要查看 Python 中任何对象的所有内置方法,我们可以使用`dir(<object>)`方法。对于字符串,这将返回可以对字符串类型执行的所有操作和方法。在第二行中,第五个操作是我们前面提到的`iter`方法。可以看出,`iter(a)`返回一个字符串迭代器:
![](assets/a0a1f01f-e979-4f87-978e-bad863fc3fa3.png)
![](img/a0a1f01f-e979-4f87-978e-bad863fc3fa3.png)
类似地,列表对象的`iter`方法将返回一个列表迭代器,如前所示。
**迭代器**:迭代器是具有`__next__`方法的对象。下一个方法总是返回调用原始`iter()`方法的序列的`next`元素,从索引 0 开始。这显示在以下代码段中:
![](assets/56b3b03d-3e4d-46ed-9c14-5e7635670261.png)
![](img/56b3b03d-3e4d-46ed-9c14-5e7635670261.png)
从 string 和 list 的示例中可以看出,迭代器上的`next`方法将始终返回序列中的`next`元素或我们正在迭代的对象。必须注意的是,迭代器只向前移动,如果我们想要`iter_a``list_itr`返回任何元素,我们必须将迭代器重新初始化为原始对象或序列:
![](assets/debc073b-944c-415d-8025-4aad8c31828f.png)
![](img/debc073b-944c-415d-8025-4aad8c31828f.png)
# 更详细地了解循环
......@@ -192,19 +192,19 @@ for var in iterable:
让我们创建一个名为`for_loops.py`的文件,它将解释`for`循环的基本用法:
![](assets/21f3c53c-8026-4eb0-89c2-584610aaf3bd.png)
![](img/21f3c53c-8026-4eb0-89c2-584610aaf3bd.png)
在前面的示例中,我们使用了 Python 范围函数/方法,这有助于我们实现我们在其他编程语言(如 C、C++或 Java)中学习的传统`for`循环。这可能类似于`for i =0 ;i < 5 ;i ++`。Python 中的 range 函数接受一个强制参数和两个默认参数。强制参数指定迭代的限制,并从索引`0`开始返回数字,直到达到限制,如代码第 3 行和第 4 行所示。当使用两个参数调用时,第一个作为范围的起点,最后一个作为终点,如代码第 7 行和第 8 行所示。最后,当使用三个参数调用`range`函数时,第三个参数作为步长,默认情况下等于一。以下输出以及示例代码的第 12 行和第 13 行对此进行了描述:
![](assets/52eaf92b-b027-400f-ad61-adc8931dae46.png)
![](img/52eaf92b-b027-400f-ad61-adc8931dae46.png)
让我们看一下另一个例子,我们将使用它来遍历 python 定义的所有迭代。这将使我们能够探索`for`循环的真正威力。让我们创建一个名为`for_loops_ad.py`的文件:
![](assets/5899a34e-3c43-477a-b13b-b2fe50d1e557.png)
![](img/5899a34e-3c43-477a-b13b-b2fe50d1e557.png)
前面,我们看到了如何从列表、字符串和元组中读取值。在前面的示例中,我们使用`for`循环枚举字符串、列表和字典。我们之前了解到,`for`循环实际上调用了 iterables 的`iter`方法,然后为每次迭代调用`next`方法。如下例所示:
![](assets/c6c41da0-de0e-4976-9ac5-55a9dea1ab52.png)
![](img/c6c41da0-de0e-4976-9ac5-55a9dea1ab52.png)
当我们使用`for`循环迭代 Python 字典时,默认情况下,字典键返回给我们。当我们在字典上使用`.items()`时,每次迭代它时,它都会返回一个元组,键位于元组的第 0<sup></sup>索引处,值位于第一个索引处。
......@@ -229,14 +229,14 @@ Python 方法在定义中没有返回类型,如 C、C++或 java 中所见的
让我们探讨一下使用`method_basics.py`脚本调用方法的各种方式:
![](assets/6433781e-b3c0-4444-ac77-972cb6a9b54e.png)
![](img/6433781e-b3c0-4444-ac77-972cb6a9b54e.png)
现在,让我们将其分解为更小的部分,并尝试了解发生了什么:
* `print_msg1()`:这是一个基本的方法,只需在控制台上打印一个字符串。它在第 2 行定义,在第 19 行调用。
* `print_msg2()`:这是一种在变量消息中获取参数,然后在屏幕上打印该变量值的方法。请记住,Python 变量不需要指定类型,因此我们可以将任何数据传递给`message`变量。这是一个采用单个参数的方法的 Pythonic 示例。请记住,参数的类型是 Python 对象,它可以接受传递给它的任何值。可以在以下屏幕截图中看到输出:
![](assets/f707b6e8-aff7-4cf9-99f6-05cf4084806f.png)
![](img/f707b6e8-aff7-4cf9-99f6-05cf4084806f.png)
* `print_msg3()`:这是一个接受两个参数的 Python 方法。这与我们之前看到的`print_msg2()`方法类似。区别在于它有时可能返回一个值。它的调用方式也不同。请注意,在第 22 行中,我们通过将第二个参数传递为`True`来调用此方法。这意味着它有一个返回值`True`,但我们不会在第 26 行中以`True`作为第二个参数调用它,因此它不会返回任何内容。为此,我们在屏幕上打印出了 Ty5 T5。在其他编程语言中,如 C、C++、java 等,调用该方法时的参数顺序非常重要。这是因为我们传递参数的序列应该与传递给方法的序列相同。但是,在 Python 中,我们可以在调用过程中调用方法并传递命名参数。这意味着顺序或序列无关紧要,只要名称与方法参数的名称匹配即可。第 29 行描述了这一点,其中我们将消息作为第二个参数传递,即使它是方法定义中的第一个参数。如输出中所示,这工作得非常好。
* `print_msg4()`:这是我们熟悉 Python 默认参数的地方,以及它们如何与方法一起使用。默认参数是在声明方法时指定默认值的变量。如果调用者传递此参数或变量的值,则调用者传递的值将覆盖默认值。如果在调用过程中没有为默认参数传递任何值,那么该变量将保持其初始化到的默认值。`print_msg4()`方法有一个强制参数`m`和两个可选参数`op1``op2`
......@@ -251,13 +251,13 @@ Python 方法在定义中没有返回类型,如 C、C++或 java 中所见的
此外,当`if`与方法声明中的一个参数一起使用时,它会在内部将所有 maned 参数转换为 Python 字典,其中键作为名称,值与`=`操作符后面的值相同。这可以在`method_2`中看到。最后,当`**`与调用者参数一起使用时,该参数在内部从 Python 字典转换为命名参数。可通过`method_2_rev`进行验证:
![](assets/a143bc5f-0fdd-4a93-a9ff-650b65748d8b.png)
![](img/a143bc5f-0fdd-4a93-a9ff-650b65748d8b.png)
# 模块和包
每个 Python 脚本都称为一个模块。Python 的设计考虑到了可重用性和代码的易用性。因此,我们创建的每个 Python 文件都成为 Python 模块,并且可以在任何其他文件或脚本中调用或使用。您可能已经在 Java 中学习了如何导入类并将它们与其他类一起重用。这里的想法基本相同,只是我们将整个文件作为一个模块导入,并且可以重用导入文件的任何方法、类或变量。让我们来看一个例子。我们将创建两个文件`child.py``parent.py`,并在每个文件中放入以下代码,如下所示:
![](assets/4978a91f-a963-4631-9d09-6704e427d4f0.png)
![](img/4978a91f-a963-4631-9d09-6704e427d4f0.png)
前五行属于`child.py`,后八行属于`parent.py`。我们将运行父级,如输出中所示。需要注意的是,导入的文件可以有一个别名。在我们的例子中,我们导入了子文件并给它别名 C。最后,我们从父 Python 脚本调用了该模块的`child_method()`类。
......@@ -265,11 +265,11 @@ Python 方法在定义中没有返回类型,如 C、C++或 java 中所见的
如前所述,Python 包是一个普通目录。唯一的区别是,为了使普通目录像 Python 包一样工作,我们必须在目录中放置一个空的`__init__.py`文件。这向 Python 指示它应该使用哪些目录作为包。让我们继续创建一个名为`shapes`的包。我们将在其中放置一个名为`__init__.py`的空 Python 文件和另一个名为`area_finder.py`的文件:
![](assets/3f51903f-9f5e-4c09-a2d4-51e0ab61bd4c.png)
![](img/3f51903f-9f5e-4c09-a2d4-51e0ab61bd4c.png)
现在让我们将以下代码放入`area_finder.py`文件中。我们还要创建另一个名为`invoker.py`的文件,并将其**放置在我们创建的 shapes**文件夹之外。调用程序的代码在下图右侧给出,`area_finder`的代码在左侧给出:
![](assets/d04e78e6-484e-4d8b-a142-751caf7ca5ce.png)
![](img/d04e78e6-484e-4d8b-a142-751caf7ca5ce.png)
前面的代码是如何在 Python 中使用包的简单示例。我们创建了一个名为`shapes`的包,并在其中放置了一个名为`area_finder`的文件,该文件将计算形状的面积。然后,我们继续在`shapes`文件夹外创建一个名为`invoker.py`的文件,并以多种方式从包中导入`area_finder`脚本(用于演示)。最后,我们使用其中一个别名调用`find_area()`方法。
......@@ -277,19 +277,19 @@ Python 方法在定义中没有返回类型,如 C、C++或 java 中所见的
**生成器**是 Python 中一种特殊的迭代器。换句话说,Python 生成器是一个函数,它通过发出`yield`命令返回生成器迭代器,可以对其进行迭代。在某些情况下,我们可能希望一个方法或函数返回一系列值,而不仅仅是一个值。例如,我们可能希望我们的方法部分执行任务,将部分结果返回给调用方,然后从返回最后一个值的位置重新开始工作。通常,当一个方法终止或返回一个值时,它的执行从头开始。这就是生成器试图解决的问题。生成器方法向调用方返回一个值和一个控件,然后从停止的位置继续执行。生成器方法是带有 yield 语句的普通 Python 方法。以下代码片段`generators.py`解释了如何使用生成器:
![](assets/602efafc-01fe-4ce4-99db-0d946dea3d9e.png)
![](img/602efafc-01fe-4ce4-99db-0d946dea3d9e.png)
请注意,因为`genMethod`中有一个收益率语句,所以它变成了一个生成器。每次执行 yield 语句时,“a”的值都会返回给调用方和控件(请记住,生成器返回一系列值)。每次对 generator 方法进行`next()`调用时,它都会从之前停止的位置恢复执行
我们知道,每次执行一个 yield 时,generator 方法都返回一个 generator 迭代器。因此,与任何迭代器一样,我们可以使用`for`循环来迭代生成器方法。此`for`循环将继续,直到达到方法中的屈服操作。与`for`循环相同的示例如下所示:
![](assets/8f445fb5-837c-4f90-af71-da0d2bebab28.png)
![](img/8f445fb5-837c-4f90-af71-da0d2bebab28.png)
您可能想知道,当列表可以获得相同的结果时,为什么我们要使用生成器。生成器非常节省内存和空间。如果生成值需要大量处理,那么使用生成器是有意义的,因为这样我们只能根据需求生成值。
生成器表达式是可以生成生成器对象的单行表达式,可以对其进行迭代。这意味着可以在内存和处理方面实现相同的优化。以下代码段显示了如何使用生成器表达式:
![](assets/2d06b188-024e-4928-b650-aa02d5d0f302.png)
![](img/2d06b188-024e-4928-b650-aa02d5d0f302.png)
# 理解
......@@ -297,11 +297,11 @@ Python 方法在定义中没有返回类型,如 C、C++或 java 中所见的
让我们来看看两个不同的方法来解决这个问题:
![](assets/eaed9af8-43f0-40e1-86df-0076c101d8d4.png)
![](img/eaed9af8-43f0-40e1-86df-0076c101d8d4.png)
左边的代码片段是一种更为传统的方法,用了九行。使用理解的代码只花了我们三行。列表理解在方括号内声明,它对列表的每个元素执行任何操作。然后它返回一个带有修改的新列表。让我们来看看另一个理解的例子。这一次,我们将使用一个`if`条件(称为理解过滤器)和包含理解的嵌套循环。我们将文件命名为`list_comp_adv.py`并输入以下代码:
![](assets/5a1a5b89-0434-4f19-b6c6-60d05a1c1ca1.png)
![](img/5a1a5b89-0434-4f19-b6c6-60d05a1c1ca1.png)
前面的代码片段是不言自明的。它向我们展示了如何在理解中使用`if`条件(第 4 行)。它还向我们展示了如何使用嵌套循环来添加两个列表(第 5 行)。最后,它向我们展示了如何使用理解词典(第 6 行)。
......@@ -311,19 +311,19 @@ Python 方法在定义中没有返回类型,如 C、C++或 java 中所见的
* `Map()`:如前所述,当我们必须对列表中的所有或部分元素执行操作时,列表理解非常方便。同样可以通过`map`功能实现。这需要两个参数,第一个是对列表元素执行操作的函数,第二个是列表本身。下面的示例`map_usage.py`演示了这一点:
![](assets/77878f15-4172-4891-8b59-225dce87a415.png)
![](img/77878f15-4172-4891-8b59-225dce87a415.png)
* `Lambda()`:Lambda 函数是小型但功能强大的内嵌函数,可用于数据操作。它们对于小型操作非常有用,因为实现它们只需要很少的代码。让我们再次看同一个示例,但这次我们将使用 Lambda 函数代替普通 Python 函数:
![](assets/cb16e80b-43d7-4c23-bfef-9aebe43b2889.png)
![](img/cb16e80b-43d7-4c23-bfef-9aebe43b2889.png)
* `Zip()``zip`方法获取两个列表或 iterable,并跨多个 iterable 聚合元素。最后,它返回一个包含聚合的元组迭代器。让我们使用一个简单的代码`zip_.py`来演示此功能:
![](assets/3b2d1050-84aa-4988-8977-1da910a5f0f7.png)
![](img/3b2d1050-84aa-4988-8977-1da910a5f0f7.png)
* `Filter()``filter`方法用于过滤列表中针对特定条件返回 true 的元素。`filter`方法有两个参数,第一个是返回特定元素`true``false`的方法或 Lambda 函数,第二个是该元素所属的列表或 iterable。它返回一个列表,其中包含条件评估为`true`的元素。让我们创建一个名为`filter_usage.py`的文件,并添加以下内容:
![](assets/5281cba6-6154-46fd-a92d-b7b1edbd98ad.png)
![](img/5281cba6-6154-46fd-a92d-b7b1edbd98ad.png)
# 总结
......
此差异已折叠。
......@@ -59,13 +59,13 @@ Thread started
必须注意的是,线程是从主程序调用的,在线程完全执行之前,主程序不会退出(默认情况下)。原因是主程序默认以非恶魔模式调用线程,这使得线程在前台运行,而不是等待它在后台运行。因此,非恶魔线程是在前台运行的线程,导致主程序等待正在运行的线程完成其执行。另一方面,恶魔线程是在后台运行的线程,因此不会导致主程序等待它完成执行。请看以下示例:
![](assets/6e397ca8-b18b-4f3c-8ba6-924d43fa7c65.png)
![](img/6e397ca8-b18b-4f3c-8ba6-924d43fa7c65.png)
从前面的代码片段可以看出,当我们创建并执行一个非恶魔线程(默认)时,在打印`Main Ended`之后,终端窗口会停止 4 秒,等待`ND`线程完成其执行。当它结束时,我们会收到一条`Exit Non Demonic`消息,即主程序退出时。在此之前,主程序不会退出。
让我们看看在后台运行的恶魔线程是如何改变的:
![](assets/1282d560-dbce-4a16-afca-418123f2620f.png)
![](img/1282d560-dbce-4a16-afca-418123f2620f.png)
在前面的代码片段中,我们看到了如何使用恶魔线程。有趣的是,主程序没有等待恶魔线程完成执行。恶魔线程在后台运行,当它完成时,主线程已经从内存中退出,因此我们没有看到屏幕上打印的`Exit :Daemonic`消息。在本例中,我们使用的是日志模块。默认情况下,日志模块将登录到`stdout`,在我们的例子中,它恰好是终端。
......@@ -75,11 +75,11 @@ Thread started
在退出之前,主程序必须验证所有线程是否已执行:
![](assets/d55f6fa9-2ca8-4942-a604-9df8396064a2.png)
![](img/d55f6fa9-2ca8-4942-a604-9df8396064a2.png)
以下屏幕截图描述了上述代码的输出:
![](assets/bcdb3300-4256-4c30-8704-458809e8c604.png)
![](img/bcdb3300-4256-4c30-8704-458809e8c604.png)
# 线程间的相互通信
......@@ -87,13 +87,13 @@ Thread started
在下面的代码块中,我们将看到一个示例,其中一个线程将递增一个计数器。当计数器值达到 5 时,需要另一个线程执行操作。必须注意的是,事件还有一个`wait()`方法,等待事件被阻止或设置。事件可以等待一个超时时间间隔,也可以无限期地等待,但一旦设置标志为`true`,则`wait()`方法实际上不会阻止线程的执行。以下代码对此进行了描述:
![](assets/1032f145-f810-4804-85e9-895ad8059ce6.png)
![](img/1032f145-f810-4804-85e9-895ad8059ce6.png)
# 线程并发控制
在许多情况下,多个线程需要共享一个资源。我们希望确保,如果一个线程正在更改对象的状态,那么另一个线程必须等待。为了避免不一致的结果,必须在更改共享资源的状态之前锁定该资源。状态更改后,应释放锁。Python 提供了线程锁来实现这一点。请看下面的代码片段`Thread_locking.py`,它演示了线程锁定和并发控制:
![](assets/f5d301dc-49fd-4ef6-a601-f7f981c008b7.png)
![](img/f5d301dc-49fd-4ef6-a601-f7f981c008b7.png)
前面的代码片段显示了线程锁定。这里,`count`是多个线程尝试更新的共享变量。第一个输出没有锁定机制(注释掉了第 16 行和第 22 行)。当没有锁定到位时,可以看到`thread_3`在获取锁定时读取的值为 1,与`thread_4`的情况相同。每个线程将计数的值增加 1,但在`thread_4`结束时,计数的值是 3。从我们使用锁定时获得的第二个输出可以看出,在更新共享资源`counter`时,没有其他线程可以实际读取它,因此获得的结果是一致的。
......@@ -132,7 +132,7 @@ Process started
我们已经研究了什么是恶魔线程和非恶魔线程。同样的原则也适用于过程。恶魔进程在后台运行而不阻塞主进程,而非恶魔进程在前台运行。如下例所示:
![](assets/75c7a70a-38f0-4f46-b35e-17593e3f939a.png)
![](img/75c7a70a-38f0-4f46-b35e-17593e3f939a.png)
从前面的代码片段可以看出,当我们创建并执行一个非恶魔进程(默认选项),如输出 1 和第 20 行所示,在打印`Main Ended`后,终端窗口会停止 4 秒钟,同时等待非恶魔进程完成其执行。当它结束时,我们得到`Exit Non Daemonic`消息,即主程序退出时。在第二种情况下(如输出 2 中所示),主程序不会等待恶魔进程完成其执行。守护进程在后台运行,当它完成时,主线程已经从内存中退出。因此,我们没有看到屏幕上打印的`Exit :Daemonic`消息。
......@@ -142,7 +142,7 @@ Process started
看看下面的代码片段,它演示了前面的概念。下面代码的目标是生成几个进程,并使主进程等待 10 秒钟,以使生成的进程完成执行。如果未完成,则仍在运行的将在退出之前终止:
![](assets/b26127f3-7bd5-4c9c-a991-e4171692dab8.png)
![](img/b26127f3-7bd5-4c9c-a991-e4171692dab8.png)
前面的代码`Join_enumerate_terminate.py`相当简单;我们所做的与之前使用线程所做的相同。这里唯一的区别是,我们只应用 join 操作 3 秒钟,因此我们故意得到一些处于活动状态的进程。然后,我们通过对这些进程应用`terminate()`来杀死它们。
......@@ -152,7 +152,7 @@ Process started
看看下面的例子,我们需要在八个不同的文件中写入 800 万条记录(每个文件中有 100 万条记录)。我们有一个四核处理器来执行这项任务。理想情况下,我们需要两次生成一批四个进程,以便每个进程在文件中写入 100 万条记录。由于我们有四个核心,我们希望每个核心执行我们任务的不同部分。如果我们选择同时生成八个进程,我们将在上下文切换方面浪费一些时间,因此我们需要明智地使用处理器和处理能力以获得最大吞吐量:
![](assets/7fc29816-ce6c-46a5-ab31-5a75a7b60de3.png)
![](img/7fc29816-ce6c-46a5-ab31-5a75a7b60de3.png)
在前面的代码`Multiprocess_pool.py`中,我们正在第 30 行创建一个多处理池。我们将池的大小定义为`size=mp.cpu_count()`,在我们的例子中是`4`,因此我们定义了一个大小为 4 的池。我们需要创建 8 个文件,每个文件包含 100 万条记录。我们使用一个`for`循环来定义八个进程,这些进程将通过调用所创建的池对象上的`apply_async()`发送到池对象。`apply_async()`方法需要我们希望以多处理模块作为参数的进程执行的方法的名称。第二个参数是传递给我们希望执行的方法的参数。请注意,当进程与池模块一起执行时,它还具有从方法返回数据的功能。
......@@ -167,7 +167,7 @@ Process started
我们在这里也在做同样的事情,唯一的区别是我们使用处理器内核来代替节点:
![](assets/ba23f995-6aaf-4f2f-ae31-75806d6206f2.png)
![](img/ba23f995-6aaf-4f2f-ae31-75806d6206f2.png)
从前面的代码片段中可以看出,借助于`Pool`模块的`map()`方法,我们可以使多个进程在不同的文件上并行工作,然后合并所有结果并将其作为单个结构发送。这些进程并行执行,`record_id %1700`为我们返回零的记录将返回给我们。最后,我们将聚合结果保存在`Modulo_1700_agg`文件中。这是多处理模块的一个非常强大的功能,如果使用得当,可以大幅减少处理时间和聚合时间。
......@@ -175,7 +175,7 @@ Process started
从另一个流程调用外部流程称为**子流程**。在这种情况下,进程之间的通信是在 OS 管道的帮助下进行的。换句话说,如果流程 B 将流程 a 作为子流程调用,那么流程 B 可以向其传递输入,还可以通过操作系统管道从中读取输出。当涉及到自动化渗透测试以及使用 Python 调用其他工具和实用程序时,此模块至关重要。Python 提供了一个非常强大的模块`subprocess`来处理子流程。请看下面的代码片段`Subprocessing.py`,它显示了如何使用子流程调用名为`ls`的系统命令:
![](assets/efe81042-63ce-4ee0-a4ea-6fe512989192.png)
![](img/efe81042-63ce-4ee0-a4ea-6fe512989192.png)
在前面的代码片段中,我们使用`subprocess.Popen()`方法调用`subprocess`。调用或调用`subprocess`的其他方法很少,例如`call()`,但我们这里讨论的是`Popen`。这是因为`Popen`方法返回将生成的进程的进程 ID,这反过来使我们能够很好地控制该进程。`Popen`方法接受许多参数,其中第一个参数实际上是要在操作系统级别执行的命令。命名参数包括`stderr=subprocess.PIPE`,这意味着如果外部程序或脚本产生错误,则该错误必须重定向到操作系统管道,父进程必须从该管道读取错误。`stdout=subprocess.PIPE`建议子进程将产生的输出也必须通过管道发送到父进程。`shell=True`建议无论给出什么命令,第一个参数必须被视为`shell`命令,如果它有一些参数,它们必须作为要调用的进程的参数传递。最后,如果我们希望父进程读取子进程产生的输出和错误,我们必须在被调用的`subprocess`上调用`communicate()`方法。`communicate()`方法打开`subprocess`管道,通信从子进程写入管道一端开始,父进程从另一端读取。必须注意的是,`communicate()`方法将使父进程等待子进程完成。该方法返回一个元组,其输出位于第 0 个索引,std error 位于第 1 个索引。
......@@ -184,7 +184,7 @@ Process started
请看下面的示例,其中我们将使用`shell=False`。对于`shell=False`,我们调用的进程/命令的命令和参数必须作为列表单独传递。让我们试着用`shell=False`执行`ls -l`
![](assets/2b25936f-6483-4e7e-b78d-28918afffe3b.png)
![](img/2b25936f-6483-4e7e-b78d-28918afffe3b.png)
这就是我们在子流程模块的帮助下用 Python 执行外部流程的方式。
......@@ -213,17 +213,17 @@ Process started
请看下面的代码片段`server_socket.py`,它在端口`80`实现了一个 TCP 服务器套接字:
![](assets/c22814d3-51d0-4002-90b1-323f1a762121.png)
![](img/c22814d3-51d0-4002-90b1-323f1a762121.png)
在前面的例子中,我们使用`socket.socket`语句创建了一个套接字。这里,`socket.AF_INET`表示 IPv4 协议,`socket.SOCK_STREAM`建议使用基于流的套接字数据包,这些数据包只不过是 TCP 流。`bind()`方法将元组作为参数,第一个参数是本地 IP 地址。您应该将其替换为您的个人 IP 或`127.0.0.1`。给 tuple 的第二个参数是 port,它反过来调用`bind()`方法。然后,我们开始监听套接字,最后开始一个接受客户端连接的循环。请注意,该方法创建一个单线程服务器,这意味着如果任何其他客户端连接,它必须等待活动客户端断开连接。`send ()``recv()`方法是不言自明的。
现在,让我们创建一个基本的客户端套接字代码`client_socket.py`,它连接到先前创建的服务器并向其传递消息:
![](assets/8a85859c-469a-48c9-a9ea-bfa613bc246f.png)
![](img/8a85859c-469a-48c9-a9ea-bfa613bc246f.png)
客户端和服务器套接字产生的输出如下所示:
![](assets/4f357662-4615-410d-8204-25603f3bd866.png)
![](img/4f357662-4615-410d-8204-25603f3bd866.png)
以下是我们如何使用 UDP 的套接字连接:
......@@ -236,7 +236,7 @@ sock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
现在我们已经了解了子处理、多处理等的基本知识,用 Python 实现一个基本的 TCP 反向 shell 非常简单。对于这个例子,`rev_tcp.py`,我们将使用基于 bash 的反向 TCP shell。在本书后面的章节中,我们将看到如何完全使用 Python 传递反向 shell:
![](assets/91cc6614-9d64-417f-b396-ff81b57f0271.png)
![](img/91cc6614-9d64-417f-b396-ff81b57f0271.png)
需要注意的是,`OS.dup2`用于在 Python 中创建文件描述符的副本。`stdin`定义为文件描述符`0``stdout`定义为文件描述符`1``stderr`定义为文件描述符`2`。代码行`OS.dup2(s.fileno(),0)`指示我们应该创建`stdin`的副本,并将流量重定向到套接字文件,该文件恰好位于本地主机和端口`1234`(Netcat 正在侦听的端口)上。最后,我们在交互模式下调用 shell,由于我们没有指定`stderr``stdin``stdout`参数,默认情况下,参数将发送到系统级的`stdin``stdout`,并再次映射到程序范围的套接字。因此,前面的代码段将以交互模式打开 shell 并将其传递给套接字。所有输入从插座中获取为`stdin`,所有输出通过`stdout`传递到插座。这可以通过查看生成的输出来验证。
......
......@@ -15,31 +15,31 @@
* 以下屏幕截图显示了 Nmap 可用的不同扫描技术:
![](assets/bc202233-ec7a-4cf2-9f45-f460cbf1989f.png)
![](img/bc202233-ec7a-4cf2-9f45-f460cbf1989f.png)
* 以下屏幕截图显示了主机发现和端口规范,以及一些示例:
![](assets/6d0cc2a1-1a99-4b91-a955-7c716b98e2b4.png)
![](img/6d0cc2a1-1a99-4b91-a955-7c716b98e2b4.png)
* 以下屏幕截图显示了服务和版本检测、操作系统检测以及一些示例:
![](assets/0916b622-58df-43d6-8352-47abde235a89.png)
![](img/0916b622-58df-43d6-8352-47abde235a89.png)
* 以下屏幕截图显示了计时和性能,以及一些示例:
![](assets/2c977b22-4f6f-4759-a377-2f524a871ce2.png)
![](img/2c977b22-4f6f-4759-a377-2f524a871ce2.png)
* 以下屏幕截图显示了 NSE 脚本以及一些示例:
![](assets/65ff3c58-e849-4150-adf9-d23d42e34175.png)
![](img/65ff3c58-e849-4150-adf9-d23d42e34175.png)
* 以下屏幕截图显示了防火墙/IDS 规避和欺骗,以及一些示例:
![](assets/73d765cb-3e08-4f16-8897-5b8e5440adb1.png)
![](img/73d765cb-3e08-4f16-8897-5b8e5440adb1.png)
* 以下屏幕截图显示了一些有用的 Nmap 输出示例:
![](assets/d133fd74-18da-4b31-931c-965053f0e6fb.png)
![](img/d133fd74-18da-4b31-931c-965053f0e6fb.png)
前面的屏幕截图提供了我们在日常操作中经常使用的 Nmap 命令的综合列表。我们将不讨论如何在终端上运行 Nmap 命令,因为假定这是简单的。
......@@ -47,17 +47,17 @@
首先,输入新虚拟机的名称以及类型和版本;在我们的例子中,这是 Linux 和 Debian(64 位)。之后,分配内存大小:
![](assets/8660a60c-33a3-4bbd-a4ae-89f264016990.png)
![](img/8660a60c-33a3-4bbd-a4ae-89f264016990.png)
接下来,选择虚拟硬盘文件,如以下屏幕截图所示:
![](assets/fb56c950-1a2e-40aa-b206-c3316e593f3e.png)
![](img/fb56c950-1a2e-40aa-b206-c3316e593f3e.png)
# 用 Python 构建网络扫描器
现在,我们都已经设置好 VirtualBox 映像,让我们看一看一个简单的 Python 脚本,它将帮助我们调用 Nmap 并启动扫描。稍后,我们将优化此脚本以使其更好。最后,我们将使其成为一个具有暂停、恢复和多处理功能的成熟的端口扫描 Python 引擎:
![](assets/f39d287f-fe41-46e2-9472-e1905e658275.png)
![](img/f39d287f-fe41-46e2-9472-e1905e658275.png)
前面的脚本生成的信息很难让 Python 代码过滤和存储。如果我们想将所有打开的端口和服务存储在一个字典中,那么使用前面的方法很难做到这一点。让我们考虑一下脚本可以解析和处理生成的信息的另一种方式。我们知道,`oX`标志用于生成 XML 格式的输出。我们将使用`oX`标志将 XML 字符串转换为 Python 字典,如下部分所示。
......@@ -65,11 +65,11 @@
在下面的示例中,我们重用了前面研究过的相同概念。我们将 XML 格式的 Nmap 输出重定向到屏幕。然后,我们收集作为字符串生成的输出,并使用`import xml.Etree.elementTree`Python 模块作为`ET`,以便将 XML 输出转换为 Python 字典。使用以下代码,我们可以使用我们的程序控制 Nmap 并过滤掉所有有用的信息:
![](assets/642b97d5-7cb5-4089-aaa2-186d75977dbc.png)
![](img/642b97d5-7cb5-4089-aaa2-186d75977dbc.png)
然后,我们可以将该信息存储在数据库表中:
![](assets/18f9a7f3-34e3-4fe4-a586-cca99832a8a4.png)
![](img/18f9a7f3-34e3-4fe4-a586-cca99832a8a4.png)
接下来,运行以下命令:
......@@ -129,7 +129,7 @@ import Nmap # import Nmap.py module
端口扫描部分指的是我们将如何在 Python 代码中实现它。其思想是结合使用线程和多处理。如果我们想扫描 10 台主机,我们会将其分为 5 批。每个批次有两台主机(批次大小可以根据您实验室机器的 RAM 和处理器能力而增加)。对于四核处理器和 2GB RAM,批大小应为 2。在任何时候,我们都将处理一个批,并为每个主机分配一个线程。因此,两个线程将并行运行以扫描两台主机。一旦主机专用于某个线程,该线程将为该主机选择要扫描的端口范围(假设该端口范围在 1 到 65535 之间)。与其顺序扫描端口,逻辑是将整个范围分成三个块,每个块的大小为 21845。现在,对单个主机的三个块进行并行扫描。如果处理器内核的数量更高,则块大小可以增加。对于四核处理器和 2 GB RAM,建议使用三个块:
![](assets/43439e13-237b-41cd-9532-19de6878b022.png)
![](img/43439e13-237b-41cd-9532-19de6878b022.png)
总之,主机被分为批大小为 2 的批,并专用于单个主机。进一步的端口被分为多个块,多处理过程专门用于扫描每个块,以便并行进行端口扫描。因此,在任何时候,端口扫描活动都将运行两个线程和六个进程。如果用户想暂停扫描,可以在终端窗口使用*Ctrl*+*C*暂停。当他们重新运行代码时,系统会提示他们选择启动新扫描或恢复先前暂停的扫描。
......@@ -139,15 +139,15 @@ import Nmap # import Nmap.py module
以下是服务扫描的体系结构图:
![](assets/d773d881-a6d1-49a6-8553-07c81a5aed82.png)
![](img/d773d881-a6d1-49a6-8553-07c81a5aed82.png)
以下屏幕截图描述了如何配置 JSON 文件以执行脚本:
![](assets/0c8f1abe-7e5b-4057-a877-13af911e8717.png)
![](img/0c8f1abe-7e5b-4057-a877-13af911e8717.png)
正如前面的屏幕截图所示,JSON 文件中有各种类型的命令。Metasploit 模板显示了用于执行 Metasploit 模块的命令。单行命令用于执行 NSE 脚本和所有非交互式模块或脚本。其他类别包括`interactive_commands``single_line_sniffing`,我们需要在执行脚本的同时嗅探流量。JSON 文件的通用模板如下所示:
![](assets/705fd705-0c7b-48aa-b505-cf34c0fb0b9d.png)
![](img/705fd705-0c7b-48aa-b505-cf34c0fb0b9d.png)
密钥是服务的名称。标题包含文件描述。`method_id`是实际的 Python 方法,应该调用它来调用要执行的外部脚本。请注意,对于单行命令,我们还指定一个超时参数(以秒为单位)作为`args`参数下的第一个参数。
......@@ -169,25 +169,25 @@ import Nmap # import Nmap.py module
如前所述,我们将讨论代码的中心逻辑,它由以下代码片段表示:
![](assets/906ee2de-700c-48dc-aa75-c98131399c4e.png)
![](img/906ee2de-700c-48dc-aa75-c98131399c4e.png)
整个类可以在 URL[<找到 https://github.com/FurqanKhan1/Dictator/blob/master/Dictator_service/Driver_main_class.py >](http://%3Chttps://github.com/FurqanKhan1/Dictator/blob/master/Dictator_service/Driver_main_class.py%3E)代表`Driver_main_class.py`。类的构造函数为在`main_class_based_backup.py`中找到的`NmapScan`类声明一个对象。突出显示为**(1)****(2)**的行是收集所有输入后触发实际逻辑的位置,包括项目名称、IP、端口范围、扫描开关和扫描类型。扫描类型 1 表示新扫描,而扫描类型 2 表示恢复先前暂停的现有扫描。`self.scanbanner()`方法提示用户输入用户希望使用的 Nmap 扫描开关。日常扫描中最常用的开关类型有七种。以下屏幕截图显示配置了扫描开关的配置文件`Nmap.cfg`
![](assets/db825a7f-52ec-40d7-a2d2-76923a5600b8.png)
![](img/db825a7f-52ec-40d7-a2d2-76923a5600b8.png)
下面的代码片段表示`main_class_based_backup.py`类的流程:
![](assets/4f7219c0-f153-451e-aa10-0381f5441da9.png)
![](img/4f7219c0-f153-451e-aa10-0381f5441da9.png)
此屏幕截图表示主`NmapScan`类。类的构造函数包含各种变量,我们将在类的整个执行流中使用这些变量。如前所述,`IPtable`是一个 python 类,用于将数据推送到后端数据库中。数据库的结构将在`db_structure`部分讨论。现在,我们应该理解,通过使用 MySQLdb connector/Python 模块,我们将通过`IPtable`类在后端表中推送所有端口扫描细节。此外,`textable`是一个 Python 模块,用于在终端窗口上绘制表来表示数据。`Simple_Logger`是一个 Python 模块,需要将调试和错误消息记录在文件中。
正如我们前面看到的,当我们查看`Driver_main_class.py`时,实际的执行流程从`NmapScan`类的`driver_main`方法开始(在`Driver_main_class.py`类的**(1)****(2)**代码片段中突出显示)。以下屏幕截图更详细地显示了此方法:
![](assets/5bfc3fe2-0ae7-4311-9419-1ed0006c3c4a.png)
![](img/5bfc3fe2-0ae7-4311-9419-1ed0006c3c4a.png)
前面的代码片段很简单。该方法从调用方接收所有参数。我们将扫描的开始时间保存在一个名为 start 的变量中。突出显示的代码段**(1)**调用同一类的另一个`main`方法,并将所有接收到的参数传递给它。这是启动所有主机的端口扫描的方法。一旦调用的`self.main`方法完成其执行,如代码片段(2)所示,我们需要检查是否所有主机都已成功扫描。这可以从反手表中推断出来,反手表为所有正在扫描的主机维护一个`status_code`,由当前项目 ID 引用。如果主机扫描成功,状态将为“完成”,否则将为“正在处理”或“未完成”。如果当前项目未处于暂停状态,并且仍有一些主机的状态为“未完成”或“正在处理”,则我们需要再次处理这些主机,代码段(3)突出显示了这一点。如果所有主机的处理状态都已完成,我们将最终项目状态更新为完成,如`self.IPtable.clearLogs`方法所指定。最后,我们以秒为单位显示执行时间。在下一个代码片段中,我们将看一看`NmapScan`类的主要方法,它使事情运行:
![](assets/e985decc-f655-423b-a6ae-6099dce2091b.png)
![](img/e985decc-f655-423b-a6ae-6099dce2091b.png)
`main`方法从检查`scan_type`开始。必须注意,`scan_type ="1"`表示新扫描,`scan_type="2"`表示恢复先前暂停的扫描。该代码还检查扫描模式。注意,c 代表命令行模式。我们正在制作的漏洞扫描器在 GUI 模式(我们将在后面讨论)和命令行模式下运行。我们现在可以忽略`g-init``g-start`模式。
......@@ -213,7 +213,7 @@ import Nmap # import Nmap.py module
下面代码片段中显示的`startProcessing()`方法只是从状态不完整的数据库表中提取所有不同的主机,并将它们放在本机 Python 列表`All_hosts`中。对于当前示例,它将返回以下列表:[`192.168.250.143`、`192.168.250.144`。然后,突出显示为(1)的代码段将调用`startThreads `方法,其中一个线程将分配给主机:
![](assets/9c9a7de3-73d9-40fe-b127-81948237195c.png)
![](img/9c9a7de3-73d9-40fe-b127-81948237195c.png)
`startThreads()`方法很简单。我们通过调用`obj.simplescanner`方法并将当前 IP 列表传递给它,迭代列表主机并为每个主机分配一个线程。对于我们当前的示例,`simplescanner `方法将被调用两次。首先,它将被线程 1 调用,该线程的 IP 地址为`192.168.250.143`,然后它将被线程 2 调用,该线程的 IP 地址为`192.168.250.144`。这在片段**(1)**中突出显示。
......@@ -230,19 +230,19 @@ import Nmap # import Nmap.py module
下面的代码是不言自明的。我们使用 Python 的内置 Nmap 实用程序扫描主机和端口块。如果扫描成功,我们只需解析结果并分别提取 TCP 和 UDP 结果。提取结果后,我们只需使用`self.IPtable .Update ()`方法将结果保存在后端数据库表中。我们将状态标记为“完成”,并将结果保存到发现已打开的端口和服务。另一方面,如果端口块和 IP 的端口扫描结果返回任何异常,我们将重复三次尝试执行扫描:
![](assets/6c69fb2c-a863-4c03-9951-d6587f0e30d8.png)
![](img/6c69fb2c-a863-4c03-9951-d6587f0e30d8.png)
三次重试后,如果扫描不成功,则对于该记录(`I``port-chunk``project_id`),我们将状态更新为错误完成,如以下屏幕截图所示:
![](assets/07daa4ad-28c8-4ce9-ab0e-368f1d2b1577.png)
![](img/07daa4ad-28c8-4ce9-ab0e-368f1d2b1577.png)
`start_Polling`方法持续监控活动线程的数量,如第**(1)**行和第**(2)**行所示。如果它只找到一个正在运行的线程,则会检查后端表,以查看是否所有主机都标记为“完成”状态。如果只有一个正在运行的线程(`main`),并且所有主机都标记为已完成,则它将中断无限轮询循环。另一方面,如果发现当前运行的线程数小于允许的最大批处理大小,并且数据库表中剩下的未扫描主机很少,则会选择一个未扫描的主机,并通过调用`startProcessing()`方法为其分配一个线程。以下代码片段的**(3)****(4)**部分强调了这一点:
![](assets/474536d9-0239-4bd0-b419-d93f3e97063f.png)
![](img/474536d9-0239-4bd0-b419-d93f3e97063f.png)
下面的代码处理如何恢复暂停的扫描。`self.IPtable.MakeUpdate`方法将未扫描主机的状态更新为`incomplete`。当主机的处理状态现在标记为`incomplete`时,返回 1。如果扫描在主机放入数据库表之前暂停,则返回状态为`2`。在这种情况下,我们需要再次进行批量输入。代码的其余部分很简单;我们调用`startProcessing()`方法为要扫描的主机委派线程:
![](assets/d998a5dc-be7b-4796-a2a5-4b3f0a3a9275.png)
![](img/d998a5dc-be7b-4796-a2a5-4b3f0a3a9275.png)
必须注意的是,为了暂停扫描,我们只需按下控制台或终端窗口上的*Ctrl*+*C*即可。当前扫描将暂停,根据当前项目 ID 适当更新后端数据库中的状态。还应注意,如前所述,上述方法构成漏洞扫描器端口扫描器(部分)的中心逻辑。确切的代码还有一些其他功能,详细信息可以在 GitHub 存储库[<中找到 https://github.com/FurqanKhan1/Dictator >](http://%3Chttps://github.com/FurqanKhan1/Dictator%3E)
......@@ -252,15 +252,15 @@ import Nmap # import Nmap.py module
要运行代码,请转到`/root/Django_project/Dictator/Dictator_Servicepath`并将`driver_main_class.py`代码文件作为`python Driver_main_class.py`运行:
![](assets/0ef89bf7-bfcd-495b-814e-a5402aff164e.png)
![](img/0ef89bf7-bfcd-495b-814e-a5402aff164e.png)
以下屏幕截图显示了正在扫描的程序:
![](assets/7db4c409-3d62-48d3-aec5-1bdeb4057460.png)
![](img/7db4c409-3d62-48d3-aec5-1bdeb4057460.png)
以下屏幕截图显示了日志详细信息:
![](assets/4feca97b-57a3-40ba-8ee2-04c02ff0ead0.png)
![](img/4feca97b-57a3-40ba-8ee2-04c02ff0ead0.png)
在前面的屏幕截图中可以看到,对于一台主机,生成了三个子进程,创建了一个线程。
......@@ -268,27 +268,27 @@ import Nmap # import Nmap.py module
让我们尝试了解后端数据库以及我们正在使用的数据库中各种表的结构。`show databases`命令用于列出 MySQL 中存在的所有数据库:
![](assets/33fbdd85-907e-4b6c-81b8-3713c8e0c79c.png)![](assets/6b682cfd-471e-4e60-ba2e-16e9734fd478.png)
![](img/33fbdd85-907e-4b6c-81b8-3713c8e0c79c.png)![](img/6b682cfd-471e-4e60-ba2e-16e9734fd478.png)
为了使用与我们的漏洞扫描器相关的当前数据库,我们使用 use`nmapscan`命令。此外,为了查看当前数据库中的所有表,我们使用`show tables`命令:
![](assets/34d0290a-b420-42ed-8d8e-db7f49cd82a2.png)
![](img/34d0290a-b420-42ed-8d8e-db7f49cd82a2.png)
为了让我们看到包含所有扫描项目的表的结构或模式,我们使用了`desc project`命令。为了查看我们扫描的项目的数据,我们发出以下 SQL 查询:
![](assets/bf85b82b-b7bb-41c8-ac59-d63bb1a430e7.png)
![](img/bf85b82b-b7bb-41c8-ac59-d63bb1a430e7.png)
`IPtable`是保存目标端口扫描结果的表格。下面的命令`desc IPtable`向我们显示了表的模式:
![](assets/f4848d35-8c04-4c37-8534-a8d613ca6661.png)
![](img/f4848d35-8c04-4c37-8534-a8d613ca6661.png)
以下屏幕截图显示了当前项目`744``IPtable`中存在的数据。我们可以看到,所有服务扫描结果都以 CSV 格式放置在表中:
![](assets/19ce5118-42ad-4cdb-b976-1d46ee553d09.png)
![](img/19ce5118-42ad-4cdb-b976-1d46ee553d09.png)
一旦项目端口扫描成功完成,项目所有细节将从`IPtable`移至`IPtable_history`。这是为了在`IPtable`上快速执行查找操作。因此,`IPtable_history`表的模式将与 IPtable 完全相同。这可以在以下屏幕截图中进行验证:
![](assets/ee50a4d2-fe36-4dcd-85d8-978e85dd336f.png)
![](img/ee50a4d2-fe36-4dcd-85d8-978e85dd336f.png)
# 总结
......
此差异已折叠。
此差异已折叠。
......@@ -15,15 +15,15 @@ Burp suite 目前通过其许可版本(Burp suite professional)提供 API
启动 Burp Suite 并按如下方式配置 API:
![](assets/e4ce8eae-640e-4880-8f32-65e911e0ef72.png)
![](img/e4ce8eae-640e-4880-8f32-65e911e0ef72.png)
然后,启动 API 并配置 API 密钥,如下所示:
![](assets/06a55de3-a63a-48a4-8061-aea501583b03.png)
![](img/06a55de3-a63a-48a4-8061-aea501583b03.png)
当我们点击按钮时,键会被复制到剪贴板上。我们可以按如下方式使用它:
![](assets/f3a7587c-9f78-437f-82bf-efe060c1f24e.png)
![](img/f3a7587c-9f78-437f-82bf-efe060c1f24e.png)
我们可以看到 API 正在监听端口`1337`。我们使用 API 键来引用这个端点地址。API 公开了三个端点:获取问题定义、启动扫描和获取正在运行的扫描的状态。
......@@ -51,7 +51,7 @@ curl -vgw "\n" -X POST 'http://127.0.0.1:1337/<API KEY>/v0.1/scan' -d '{"applica
这可以在 Burp Suite 控制台上看到,如下所示:
![](assets/d4f2011e-9920-41cf-adfe-9f51337b2faf.png)
![](img/d4f2011e-9920-41cf-adfe-9f51337b2faf.png)
在上一个屏幕截图中,我们可以看到一个 ID 为`9`的新任务已经创建,它正在扫描本地托管的易受攻击的 Web 应用。截图时,任务能够识别四个高问题、十个中问题和三个低问题。在下一节中,我们可以看到如何让扫描仪不断告诉我们扫描的状态。为了做到这一点,我们需要设置一个回调 URL。换句话说,我们需要一个监听端口,扫描仪将不断地发送结果。我们可以在控制台上按如下方式打印:
......@@ -59,11 +59,11 @@ curl -vgw "\n" -X POST 'http://127.0.0.1:1337/<API KEY>/v0.1/scan' -d '{"applica
curl -vgw "\n" -X POST 'http://127.0.0.1:1337/Sm2fbfwrTQVqwH3VERLKIuXkiVbAwJgm/v0.1/scan' -d '{"application_logins":[{"password":"password","username":"admin"}],"scan_callback":{"url":"http://127.0.0.1:8000"},"scope":{"exclude":[{"rule":"http://192.168.250.1/dvwa/logout.php","type":"SimpleScopeDef"}],"include":[{"rule":"http://192.168.250.1/dvwa/","type":"SimpleScopeDef"}]},"urls":["http://192.168.250.1/dvwa/"]}'
```
![](assets/2919585e-8d65-4874-a61b-8201ed5a2d4d.png)
![](img/2919585e-8d65-4874-a61b-8201ed5a2d4d.png)
扫描状态和所有结果将发送回指定地址:
![](assets/3a30a396-3b57-489a-96ea-59e76ddd2b6a.png)
![](img/3a30a396-3b57-489a-96ea-59e76ddd2b6a.png)
既然我们现在已经了解了如何使用 Burp Suite API 自动化扫描,那么让我们编写一个 Python 脚本来实现这一点。我们将创建一个 Python 脚本来调用扫描,同时该脚本将侦听回调请求并解析响应以显示所有高、中、低问题。
......@@ -171,11 +171,11 @@ obj.start()
这显示在以下屏幕截图中:
![](assets/29538d16-d08b-42f5-8fec-9f0fe1fab1fe.png)
![](img/29538d16-d08b-42f5-8fec-9f0fe1fab1fe.png)
以下屏幕截图表示扫描状态和请求总数。脚本将继续运行,直到扫描完成,状态为**成功**
![](assets/20dad012-3a34-4b6c-bd3c-378f498f1370.png)
![](img/20dad012-3a34-4b6c-bd3c-378f498f1370.png)
# SQL 注入
......@@ -195,33 +195,33 @@ obj.start()
让我们启动 SQLmap 服务器:
![](assets/b05c9931-ed0e-457b-bba4-a87c67eeeb8a.png)
![](img/b05c9931-ed0e-457b-bba4-a87c67eeeb8a.png)
现在服务器已经启动并在本地主机上运行(端口`8775`),让我们看看如何使用 cURL 和 API 扫描应用(DVWA)进行 SQL 注入:
* 创建一个新任务,如下所示:
![](assets/10c420c5-00d4-47a9-a4dc-70929be7d3a1.png)
![](img/10c420c5-00d4-47a9-a4dc-70929be7d3a1.png)
* 将新任务的`scan`选项设置如下:
![](assets/2aa2f353-fb96-4096-b479-2b5c6fd98aee.png)
![](img/2aa2f353-fb96-4096-b479-2b5c6fd98aee.png)
* 将新任务的`list`选项设置如下:
![](assets/a3a34ab3-25e0-4335-91ac-45d222bd999f.png)
![](img/a3a34ab3-25e0-4335-91ac-45d222bd999f.png)
* 使用以下`set`选项开始扫描:
![](assets/27bda66f-8f89-4d47-ad03-0d193be91bce.png)
![](img/27bda66f-8f89-4d47-ad03-0d193be91bce.png)
* 检查创建的扫描的`status`以发现 SQL 注入,如下所示:
![](assets/24549a86-71b3-4da7-8e2f-1caa74dbe25c.png)
![](img/24549a86-71b3-4da7-8e2f-1caa74dbe25c.png)
![](assets/98393f6a-9bef-47ce-975d-5da6438fb606.png)
![](img/98393f6a-9bef-47ce-975d-5da6438fb606.png)
![](assets/0c836bba-b17f-4ae6-bb41-f625705ee784.png)
![](img/0c836bba-b17f-4ae6-bb41-f625705ee784.png)
前面的屏幕截图验证了后端数据库是 MySQL,并且参数 ID 易受 SQL 注入攻击。
......
......@@ -64,33 +64,33 @@ sudo cp phantomjs-2.1.1-linux-x86_64/bin/phantomjs /usr/local/bin/
让我们将脚本命名为`Xss_automate.py`并添加以下截图所示的内容:
![](assets/484f429d-bd64-41a3-920c-38e3892b6249.png)
![](img/484f429d-bd64-41a3-920c-38e3892b6249.png)
![](assets/08909770-f649-4193-b2e3-6416f920f08b.png)
![](img/08909770-f649-4193-b2e3-6416f920f08b.png)
![](assets/a024dced-fd3e-4fe9-bd23-81486e046e6d.png)
![](img/a024dced-fd3e-4fe9-bd23-81486e046e6d.png)
![](assets/c03fe143-c7a6-4041-b336-c4f73782c3fc.png)
![](img/c03fe143-c7a6-4041-b336-c4f73782c3fc.png)
现在可以按如下方式运行脚本:
![](assets/a24eb513-17ea-4f53-b2e6-58201c03ddd3.png)
![](img/a24eb513-17ea-4f53-b2e6-58201c03ddd3.png)
让我们检查一下当前路径,看看是否创建了屏幕截图:
![](assets/c8657ffd-643f-4ed4-9469-31216243196c.png)
![](img/c8657ffd-643f-4ed4-9469-31216243196c.png)
如前所述,创建并捕获了三个屏幕截图。让我们打开每一个来验证概念证明。以下是我们使用脚本成功登录后看到的屏幕截图:
![](assets/0d525220-1a2a-4f08-817a-06c5b9d13592.png)
![](img/0d525220-1a2a-4f08-817a-06c5b9d13592.png)
以下屏幕截图显示了通过创建链接利用反射的 XSS 漏洞的情况。请注意安全性的值,该值设置为低:
![](assets/063194e2-c175-43e2-8fd9-21457c9a288e.png)
![](img/063194e2-c175-43e2-8fd9-21457c9a288e.png)
以下屏幕截图显示了存储的 XSS 漏洞:
![](assets/cfa0cf01-a5eb-4a50-8110-625e472120eb.png)
![](img/cfa0cf01-a5eb-4a50-8110-625e472120eb.png)
应该注意的是,我们只在两个页面中应用了前面的方法来检测 XSS,只是为了减少执行时间并展示这个概念的威力。但是,这可以扩展到应用的所有 web 页面。我们需要删除检查从`<a>`标记获取的 URL 是否存在于列表中的条件:`self.target_links=["vulnerabilities/xss_r/","vulnerabilities/xss_s/"]`。尝试此方法,删除此条件,并在需要时修改脚本以查看其内容。
......@@ -118,23 +118,23 @@ sudo cp phantomjs-2.1.1-linux-x86_64/bin/phantomjs /usr/local/bin/
让我们继续创建一个名为`Csrf_detection.py`的脚本,内容如以下屏幕截图所示:
![](assets/005e85f7-756e-4087-b759-4ccf0ddf62a1.png)
![](img/005e85f7-756e-4087-b759-4ccf0ddf62a1.png)
![](assets/30d156ff-af96-4a4d-a911-1326a0eeed0c.png)
![](img/30d156ff-af96-4a4d-a911-1326a0eeed0c.png)
![](assets/00ec8910-e107-4368-b0f9-4e654ef280d7.png)
![](img/00ec8910-e107-4368-b0f9-4e654ef280d7.png)
当我们执行脚本时,我们得到以下输出:
![](assets/b598296e-27e3-4d2f-ab9a-056a8874d1f6.png)
![](img/b598296e-27e3-4d2f-ab9a-056a8874d1f6.png)
创建的屏幕截图如下所示:
![](assets/d9395078-a5a6-4dfc-8569-d01a54dd881a.png)
![](img/d9395078-a5a6-4dfc-8569-d01a54dd881a.png)
DVWA 应用捕获的屏幕截图如下所示:
![](assets/6f7cec96-632d-491f-a3b8-f6340ce0f9ca.png)
![](img/6f7cec96-632d-491f-a3b8-f6340ce0f9ca.png)
应该注意的是,我们使用前面的方法仅在一个页面中检测 CSRF,只是为了减少执行时间并展示概念的威力。但是,这可以扩展到应用的所有 web 页面。我们需要删除检查从`<a>`标记获取的 URL 是否在列表中的条件:`self.target_links=["vulnerabilities/csrf"]`。尝试相同的方法,删除此条件,并在需要时修改脚本以查看其涵盖的内容。
......@@ -156,11 +156,11 @@ DVWA 应用捕获的屏幕截图如下所示:
在这里,我们将看到一种方法,我们将使用它来查看网站是否容易被点击劫持。我们将使用一个简单的 Python 脚本来检查应用呈现的响应头中是否存在 X-Frame-Options。我们将调用脚本`CJ_detector.py`并添加以下内容:
![](assets/21e9f24e-ebae-4ab8-9cbb-e3472a0e0793.png)
![](img/21e9f24e-ebae-4ab8-9cbb-e3472a0e0793.png)
我们将运行脚本,查看 DVWA 应用是否受到了点击劫持保护:
![](assets/4e8bfe5d-13f7-4f6f-aec8-b5edca533ad8.png)
![](img/4e8bfe5d-13f7-4f6f-aec8-b5edca533ad8.png)
# SSL 剥离(缺少 HSTS 标头)
......@@ -178,11 +178,11 @@ DVWA 应用捕获的屏幕截图如下所示:
在这里,我们将看到一种方法,我们将使用它来确定网站是否容易受到点击劫持。我们将使用一个简单的 Python 脚本来检查应用呈现的响应头中是否存在严格的传输安全性。我们将脚本命名为`HSTS_detector.py`并在其中放入以下内容:
![](assets/eca5a805-7183-4545-9e35-5574f75f05e4.png)
![](img/eca5a805-7183-4545-9e35-5574f75f05e4.png)
让我们运行脚本,看看应用 DVWA 是否受到点击劫持的保护:
![](assets/abcd12ce-31c4-460a-b738-686c049c7c47.png)
![](img/abcd12ce-31c4-460a-b738-686c049c7c47.png)
# 总结
......
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
......@@ -68,7 +68,7 @@
下图表示固件包含的内容:闪存内容、引导加载程序、内核和根文件系统:
![](Images/231e28db-2fd3-4dce-8a9b-da4d56f020f0.png)
![](img/231e28db-2fd3-4dce-8a9b-da4d56f020f0.png)
图 1.1:固件内容
......@@ -78,7 +78,7 @@
固件中使用了许多文件系统类型,有时甚至根据设备使用专有文件类型。然而,一些最常见的文件系统类型是 SquashFS、cramFS、JFFS2、YAFFS2 和 ext2。设备(尤其是消费设备)中使用的最常见的文件系统是 SquashFS。有一些实用程序,如`unsquashfs`和修改后的`unsquashfs`用于从压缩的文件系统中提取数据。当供应商将 SquashFS 更改为使用不受支持的压缩时,例如 LZMA(在 SquashFS 4.0 之前,官方唯一支持的压缩是`.zlib`),将使用修改后的`unsquashfs`工具,并且与常规 SquashFS 文件系统相比,文件系统的起始位置将有不同的偏移量。我们将在本书后面讨论定位和识别偏移。
有关嵌入式 Linux 文件系统的更多信息,请访问以下链接:[http://elinux.org/images/b/b1/Filesystems-for-embedded-linux.pdf](http://elinux.org/images/b/b1/Filesystems-for-embedded-linux.pdf)
有关嵌入式 Linux 文件系统的更多信息,请访问以下链接:[http://elinux.oimg/b/b1/Filesystems-for-embedded-linux.pdf](http://elinux.oimg/b/b1/Filesystems-for-embedded-linux.pdf)
Sasquatch 是一个方便的工具,可用于提取修改后的 SquashFS 文件系统。Saskash 可在以下链接中找到:
[https://github.com/devttys0/sasquatch](https://github.com/devttys0/sasquatch)
......@@ -101,7 +101,7 @@ Sasquatch 是一个方便的工具,可用于提取修改后的 SquashFS 文件
具有互联网功能的物联网设备的混合云模型可能如下图所示。用户访问设备界面,供应商云和用户设备之间的 web 服务在幕后进行更改或收集数据:
![](Images/0286ac63-5107-4f15-b80c-56ea86df7a88.png)
![](img/0286ac63-5107-4f15-b80c-56ea86df7a88.png)
图 1.2 混合 web 模型
......@@ -109,7 +109,7 @@ Sasquatch 是一个方便的工具,可用于提取修改后的 SquashFS 文件
下图演示了用户通过 web 浏览器连接到嵌入式独立 web 应用,而无需外部系统依赖项:
![](Images/48003667-51ba-4c99-a652-f1467989b9a2.png)
![](img/48003667-51ba-4c99-a652-f1467989b9a2.png)
图 1.3:本地嵌入式 web 应用
......@@ -189,7 +189,7 @@ Connection: close
为了让您更好地了解运行混合应用所需的体系结构,下图显示了应用代码、Web 视图、插件和移动设备本身之间的不同组件。请记住,大多数包装器代码和插件都是由混合框架或为框架做出贡献的第三方利用人员利用的:
![](Images/d240b6b2-0fc4-4b23-b849-336bdec75509.png)
![](img/d240b6b2-0fc4-4b23-b849-336bdec75509.png)
混合应用实例
......@@ -199,7 +199,7 @@ Connection: close
本机架构比混合应用架构简单得多。下图显示了直接在设备上运行本机代码的本机应用,无需第三方组件访问硬件资源:
![](Images/5732b5bd-04fc-4f7c-851f-d30a85dff090.png)
![](img/5732b5bd-04fc-4f7c-851f-d30a85dff090.png)
本机应用示例
......@@ -211,7 +211,7 @@ Connection: close
这就是**数字录像机****DVR**的 PCB 板的外观):
![](Images/3f9d66c9-5f98-47b4-badd-596f944b93f7.jpg)
![](img/3f9d66c9-5f98-47b4-badd-596f944b93f7.jpg)
PCB 板
......@@ -219,10 +219,10 @@ PCB 板
EEPROM 是一种非易失性存储位置,可作为单个字节块进行读写。EEPROM 可通过电荷或紫外线照射擦除。与其他闪存类型类似,EEPROM 允许有限数量的写入周期。EEPROM 是一种感兴趣的芯片,因为固件可以加载在 EEPROM 上,并且可以从 PCB 上卸下到 EEPROM 读取器上进行进一步分析:
![](Images/5cfe5ed0-19cc-44fb-b30c-d4da33185751.jpg)
![](img/5cfe5ed0-19cc-44fb-b30c-d4da33185751.jpg)
EEPROM
图像源:[https://cdn.sparkfun.com//assets/parts/3/0/5/EEPROM.jpg](https://cdn.sparkfun.com//assets/parts/3/0/5/EEPROM.jpg)
图像源:[https://cdn.sparkfun.coimg/parts/3/0/5/EEPROM.jpg](https://cdn.sparkfun.coimg/parts/3/0/5/EEPROM.jpg)
NAND 闪存是以块的形式写入和读取的,这种块通常存在于 USB 驱动器中,但也存在于物联网设备以及游戏机中。NAND 闪存通常包含一个设备的引导加载程序,该引导加载程序遵循各种指令启动操作系统,并且可以进行操作;我们将在本书后面的部分向您介绍这一点。
......@@ -348,7 +348,7 @@ JTAG 是 IEEE 1149.1 下的另一种串行通信。它是为芯片和系统级
硬件工具因所分析的特定设备而异;但是,有一些基本工具适用于所有硬件甚至电气要求。制造商将使用不同类型的螺钉、外壳和安全钻头作为硬件拆卸的权宜之计。有时,螺钉会隐藏在标签或橡胶脚下。确定螺钉类型很重要。我们将列出可以绕过供应商使用的这种混淆技术的工具包。下图有助于使用一些不同类型的螺钉类型:
![](Images/8e8de3fe-89ca-40d9-be9c-e223494ca5a6.png)
![](img/8e8de3fe-89ca-40d9-be9c-e223494ca5a6.png)
图像来源:http://www.instructables.com/id/When-a-Phillips-is-not-a-Phillips/
......
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册