渗透测试方法论

渗透测试(penetration testing,pentest)是实施安全评估(即审计)的具体手段.方法论是在制定,实施信息安全审计方案时,需要遵循的规则,惯例和过程.人们在评估网络,应用,系统或三者组合的安全状况时,不断摸索各种务实的理念和成熟的做法,并总结了一套理论——渗透测试方法论.

渗透测试的种类

黑盒测试

  • 在进行黑盒测试时,安全审计员在不清楚被测单位的内部技术构造的情况下,从外部评估网络基础设施的安全性.在渗透测试的各个阶段,黑盒测试借助真实世界的黑客技术,暴露出目标的安全问题,甚至可以揭露尚未被他人利用的安全弱点.渗透测试人员应能理解安全弱点,将之分类并按照风险等级(高,中,低)对其排序.通常来说,风险级别取决于相关弱点可能形成危害的大小.老练的渗透测试专家应能够确定可引发安全事故的所有攻击模式.当测试人员完成黑盒测试的所有测试工作之后,他们会把与测试对象安全状况有关的必要信息进行整理,并使用业务的语言描述这些被识别出来的风险,继而将之汇总为书面报告.黑盒测试的市场报价通常会高于白盒测试.

白盒测试

  • 白盒测试的审计员可以获取被测单位的各种内部资料甚至不公开资料,所以渗透测试人员的视野更为开阔.若以白盒测试的方法评估安全漏洞,测试人员可以以最小的工作量达到最高的评估精确度.白盒测试从被测系统环境自身出发,全面消除内部安全问题.从而增加了从单位外部渗透系统的难度.黑盒测试起不到这样的作用.白盒测试所需要的步骤数目与黑盒测试不相上下.另外,若能将白盒测试与常规的研发生命周期相结合,就可以在入侵者发现甚至利用安全弱点之前,尽可能最早地消除全部安全隐患.这使得白盒测试的时间,成本,以及发现,解决安全弱点的技术门槛都全面低于黑盒测试.

脆弱性评估与渗透测试

  • 脆弱性评估通过分析企业资产面临安全威胁的情况和程度,评估内部和外部的的安全控制的安全性.这种技术上的信息系统评估,不仅揭露现有防范措施里存在的风险,而且要提出多重备选的补救策略,并将这些策略进行比较.内部的脆弱性评估可保证内部系统的安全性,而外部的脆弱性评估则是验证边界防护(perimeter defenses)的有效性.无论进行内部脆弱性评估还是进行外部脆弱性评估,评估人员都会采用各种攻击模式来严格测试网络资产的安全性,从而验证信息系统处理安全威胁的能力,进而确定应对措施的有效性.不同类型的脆弱性评估需要的测试流程,测试工具和自动化测试技术也不相同.这可以通过一体化的安全弱点管控(vulnerability management)平台来实现.现在的安全弱点管理平台带有可自动更新的漏洞数据库,能够测试不同类型的网络设备,而且不会影响配置管理和变更管理的完整性.脆弱性评估和渗透测试两者最大的区别就是:渗透测试不仅要识别目标的弱点,它还设计在目标系统上进行漏洞利用,权限提升和访问维护.换句话说,脆弱性评估虽然可以充分发现系统里的缺陷,但是不会考虑去衡量这些缺陷对系统造成的危害.另外,相比脆弱性评估,渗透测试更倾向于入侵,会刻意使用各种技术手段利用安全漏洞;所以渗透测试可能对生产环境带来实际的破坏性影响.而脆弱性评估以非入侵的方式,定性,定量得识别已知安全弱点.

渗透测试流程

渗透测试执行标准(Penetration Testing Execution Standard,PTES)的先驱都是渗透测试行业的精英.这个标准有渗透测试7个阶段的标准组成,可以在任意环境中进行富有成果的渗透测试.

  1. 事前互动
  2. 情报搜集
  3. 威胁建模
  4. 漏洞分析
  5. 漏洞利用
  6. 深度利用
  7. 书面报告

通用渗透测试框架

从技术管理的角度来看,遵循正规的测试框架对安全测试极为重要.通用渗透测试框架涵盖了典型的审计测试工作和渗透测试工作会涉及到的各个阶段.无论是进行白盒测试还是黑盒测试,选择和使用测试步骤都是测试人员的责任.在测试开始前,测试人员需要根据目标系统的实际环境和已掌握的相关目标系统的情况,在指定最佳的测试策略.

  1. 范围界定
  2. 信息搜集
  3. 目标识别
  4. 服务枚举
  5. 漏洞映射
  6. 社会工程学
  7. 漏洞利用
  8. 权限提升
  9. 访问维护
  10. 文档报告

范围界定

  • 在开始技术性安全评估之间,务必要观察,研究目标环境的被测范围.同时还要了解,这个范围牵扯多少个单位,是单个单位还是多个单位会参与到安全评估的工作中来,在范围界定阶段,需要考虑的典型因素如下.
  1. 测试对象是什么?
  2. 应当采取何种测试方法?
  3. 有哪些在测试过程中需要满足的条件?
  4. 哪些因素可能会限制测试执行的过程?
  5. 需要多久才能完成测试
  6. 此次测试应当达成什么样的任务目标?

信息搜集

  • 在划定了测试范围之后,就需要进入信息收集阶段.在这个阶段,渗透人员需要使用各种公开资源尽可能地获取测试目标的相关信息.他们从互联网上搜集信息的互联网渠道主要有:论坛|公告板|新闻组|媒体文章|博客|社交网络|其他商业或非商业性的网站.此外,他们也可以借助各种搜索引擎中获取相关数据,如谷歌,雅虎,MSN必应,百度等.收集的信息主要包括DNS 服务器,路由关系,whois 数据库,电子邮件地址,电话号码,个人信息以及用户账户.收集的信息越多,渗透测试成功的概率越高.

目标识别

  • 这个阶段的主要任务是识别目标的网络状态,操作系统和网络架构.该阶段工作旨在完整地展现目标网络里各种联网设备或技术的完整关系,以帮助测试人员在接下来的工作里枚举目标网络的各种服务.

服务枚举

  • 这一阶段会根据前面各个阶段的成果,进一步找出目标系统中所有开放的端口.一旦找到了所有开放的端口,就可以通过这些端口来列出目标系统上运行的服务.主机上开放的端口都有相应的服务程序,对这些信息进行深度分析之后,可进一步发掘目标网络基础设施中可能存在的漏洞.

漏洞映射

  • 可以根据已经发现的开放端口和服务程序,查找,分析目标系统中存在的漏洞.如果能够采用自动和手动这两种不同的测试方法结合起来,审计人员对目标系统的认知就会更为清晰,透彻,并能够仔细地检查任何已知和未知的漏洞.

社会工程学

  • 如果目标网络没有直接的入口,欺骗的艺术将起到抛砖引玉的重要作用.对目标组织中的人员进行定向攻击,很有可能帮助我们找到渗透目标系统的入口.例如,诱使用户运行安装后门的恶意程序,就可能为审计人员的渗透工作形成突破.社会工程学渗透分为多种不同实现形式.伪装成网络管理员,通过电话要求用户提供自己的账户信息;发送钓鱼邮件来劫持用户的银行账户;甚至诱使某人出现在某个地点——这些都属于社会工程学攻击.在社会工程学中,达成同一既定目标的实现方式应有尽有.需要注意的是,在对目标实施欺骗以达成渗透目标之前,多数情况下需要长时间研究目标人员的心理.另外,在开展这个阶段的工作之前,您需要实现研究过内的法律是否有关于社会工程学的相关条款.

漏洞利用

  • 在仔细检查和发现目标系统中的漏洞之后,就可以使用已有的漏洞利用程序对目标系统进行渗透.审计人员可以把客户端漏洞利用程序和社会工程学进行结合,进而控制目标系统.这个阶段的主要任务是控制目标系统.这个流程可以分为三步,涉及攻击前,攻击,攻击后的相关行动.

权限提升

  • 获取目标系统的控制权是渗透成功的标识.接下来,审计人员就可以根据其所拥有的访问权限,在被测系统中自由发挥.审计人员也可以使用适用于目标系统的本地漏洞来提升自己的权限.只要他们能偶在目标系统上运行提权漏洞利用程序,就可以获得主机的超级用户权限或者系统级权限.审计人员还可以以该主机为跳板,进一步攻击局域网络.根据之前渗透范围的界定,审计人员接下来会开展的攻击可能是受限制的,也可能是不受限制.然后,他们很有肯呢个以各种方式获得与控制系统有关的更多信息.具体的说,他们可能是用嗅探手段截获网络数据包,破解各种服务的密码,在局域网络中使用网络欺骗手段.所以说,提升权限的最终目的是获得目标系统的最高访问权限.

访问维护

  • 多数情况下,审计人员需要在一段时间内维护他们对目标系统的访问权限.例如,在演示越权访问目标系统的时候,安装后门将节省重新渗透目标系统所耗费的大量时间.这种情况下,访问维护将节约获取目标系统访问权限所需要的时间,花费和资源.审计人员可以通过一些秘密的通信隧道,在既定时间内维持对目标的访问权限.这些隧道往往基于特定协议,代理或者点对点方法的后门程序.这种对系统的访问方法可以清楚地展示,入侵人员在目标系统实施攻击时隐藏行踪的具体方法.

文档报告

  • 在渗透测试的最后一个环节里,审计人员要记录,报告并现场演示那些已经识别,验证和利用了的安全漏洞.在被测单位的管理和技术团队会检查渗透时使用的方法,并会根据这些文档修补所有存在的安全漏洞.所以从道德角度来看,文档报告的工作十分重要.并为了帮助管理人员和技术人员共同理解,分析当前IT 基础架构中的薄弱环节,可能需要给不同的部门撰写不同措辞的书面报告.此外,这些报告还可以用来获取和比渗透测试前后系统目标的完整性.

简化渗透测试流程

  • 明确目标 确定范围|确定规则|确定需求
  • 信息收集 基础信息|系统信息|应用信息|人员信息|防护信息
  • 漏洞探测 系统漏洞|Web 服务漏洞|Web 应用漏洞|其他端口|通信安全
  • 漏洞验证 手工验证|工具验证|实验验证
  • 漏洞利用 定制EXP|防御绕过|进一步渗透|清理痕迹
  • 形成报告 整理结果|补充介绍|修复建议

Web架构安全分析

Web 工作机制

  • 浏览器输入网址
  • 本地缓存
  • host
  • IP/ARP
  • DNS
  • IP
  • 网关
  • 路由
  • 到达对方主机
  • 访问80 443
  • 3次握手
  • 建立连接
  • HTTP 数据包
  • HTTP 响应
  • html 文件
  • php
  • 数据库
  • php 运行结果

网站

  • 我们可以通过浏览器上网看到的精美页面,一般都是经过浏览器渲染过的.html 页面,其中包含了css 等前端技术.多个网页的集合就是网站.

Web容器

  • Web 容器,也叫Web 服务器,主要提供Web 服务,也就是常说的HTTP 服务.常见的Web 容器有:Apache/IIS/Nginx 等.

静态的网页

  • 静态的网页,都是一些.html 文件,是纯文本文件.这些文件中包含html 代码.HTML(HyperText Markup Language,超文本标记语言),在浏览器中解释运行.

中间件服务器

  • 以上这种,只能单向地给用户展示信息.随着Web的发展,信息要双向流动,产生了交互的需求,也就是动态网页的概念;所谓动态就是利用flash,Php,asp,Java等技术在网页中嵌入一些可运行的脚本,用户浏览器在解释页面时,遇到脚本就启动运行它.这些脚本可以嵌入在页面中,如JS等.也可以以文件的形式单独存放在Web服务器的目录里,如.asp,.php,jsp文件等.这样功能性的脚本越来越多,形成常用的工具包,单独管理,Web业务开发时,直接使用就可以了,这就是中间件服务器,它实际上是Web服务器处理能力的扩展.

数据库

  • 静态网页与脚本都是事前设计好的,一般不经常改动,但网站上很多内容需要经常的更新,如新闻,博客文章,互动游戏等,这些变动的数据放在静态的程序中显然不适合,传统的办法是数据与程序分离,采用专业的数据库.Web开发者在Web服务器后边增加了一个数据库服务器,这些经常变化的数据存进数据库,可以随时更新.当用户请求页面时,脚本根据用户请求的页面,涉及到动态数据的地方,利用SQL数据库语言,从数据中读取最新的数据,生成“完整”页面,最后送给用户.

HTTP协议

  • HTTP(HyperText Transfer Protocol,超文本传输协议)是浏览器与Web 服务器之间的通信协议,是传递消息的规范和要求.

概述

  • 1990 年提出的,当前版本1.1.
  • HTTP 是用来将html 文档从Web 服务器传输到Web 浏览器.
  • 是一个请求和响应的协议.客户端发出请求,服务器端对请求给出回应.
  • HTTP 使用可靠的TCP 连接,默认端口80.

URL

  • 统一资源定位符(网址),用来告诉Web 容器,浏览器所请求资源(文件)的路径.
schema://login:password@address:port/path/to/resource/?query_string#fragment

#port       端口
#login      用户名
#password   密码    匿名访问时,默认没有这两个内容
#fragment   锚点

HTTP 报文分析

REQUEST

Web 应用的所有通信的消息都要遵守HTTP 协议的规范和要求

GET /php/test/get.php HTTP/1.1
Host: 172.16.132.161
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:69.0) Gecko/20100101 Firefox/69.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Referer: http://172.16.132.161/php/test/
Connection: close
Upgrade-Insecure-Requests: 1
Cache-Control: max-age=0

HTTP 请求由请求行,请求头,请求正文三个部分组成

  • 方法:GET
  • 资源路径:/php/test/get.php
  • 协议/版本:HTTP/1.1
  • 请求头: 从请求报文第二行开始到第一个空行为止之间的内容.其中包含很多字段.
  • 请求正文: GET没有请求正文,POST有请求正文

主要字段

  • Host : 主要用于指定被请求资源的Internet主机和端口号
  • User-Agent : 浏览器指纹
  • Referer : 包含一个URL,代表当前URL的上一个URL
  • Cookie : 记录请求者的身份认证信息
  • Accept-Charset : 用于指定客户端接收的字符集
  • Content-Type : 用于向接收方指示实体的介质类型数据类型
  • Content-Length : 用于指明实体正文的长度,以字节方式存储的十进制数字来表示
  • Last-Modified : 用于指示资源的最后修改时间和日期

RESPONSE

HTTP/1.1 200 OK
Date: Sun, 29 Sep 2019 08:43:35 GMT
Server: Apache/2.4.23 (Win32) OpenSSL/1.0.2j PHP/5.4.45
X-Powered-By: PHP/5.4.45
Content-Length: 13
Connection: close
Content-Type: text/html

array(0) {
}

响应报文由状态行,响应头,响应正文三部分组成

状态行:协议/版本,状态代码,描述短语

  • 协议/版本:HTTP/1.1
  • 状态代码:200
  • 描述短语:OK

响应报头

  • 第二行开始到第一个空行为止的所有内容,其中包含了关于HTTP响应的重要字段.

响应正文

  • 服务器返回资源的内容,即浏览器接收到的HTML 代码.

主要字段

  • Server : 服务器指纹
  • Set-Cookie : 向浏览器端设置Cookie
  • Last-Modified : 服务器通过这个头信息告诉浏览器,资源的最后修改时间
  • Content-Length : 正文的长度
  • Location : 重定向目标页面
  • Refresh : 服务器通过Refresh头告诉浏览器定时刷新浏览器

同源策略

同源策略是禁止JavaScript 进行跨域访问的安全策略.它也是浏览器沙盒环境所提供的一项制约.浏览器可以同时处理多个网站的内容,其典型方法为使用标签页或iframe 等.同源策略的保护对象不仅仅是 iframe 内的文档.比如,实现 Ajax 时所使用的 XMLHttpRequest 对象能够访问的 URL 也受到了同源策略的限制.

同源策略的条件

  • URL 的主机(FQDN:Fully Qualified Domain Name 全称域名)一致
  • Schema 一致
  • 端口号一致