zwtblog

项目地址(参考):https://websec.readthedocs.io/zh/latest/basic/history.html

本文只能充当目录简介,具体还要自己深入学习。

序章

Web技术演化

简单网站

Web技术在最初阶段,网站的主要内容是静态的,大多站点托管在ISP (Internet Service Provider) 上,由文字和图片组成,制作和表现形式也是以表格为主。当时的用户行为也非常简单,基本只是浏览网页。

随着技术的不断发展,音频、视频、Flash等多媒体技术诞生了。多媒体的加入使得网页变得更加生动形象,网页上的交互也给用户带来了更好的体验。

渐渐的,多媒体已经不能满足人们的请求,于是CGI (Common Gateway Interface) 应运而生。CGI定义了Web服务器与外部应用程序之间的通信接口标准,因此Web服务器可以通过CGI执行外部程序,让外部程序根据Web请求内容生成动态的内容。

在这个时候,各种编程语言如PHP/ASP/JSP也逐渐加入市场,基于这些语言可以实现更加模块化的、功能更强大的应用程序。

Ajax,在开始的时候,用户提交整个表单后才能获取结果,用户体验极差。于是Ajax (Asynchronous Javascript And XML) 技术逐渐流行起来,它使得应用在不更新整个页面的前提下也可以获得或更新数据。这使得Web应用程序更为迅捷地回应用户动作,并避免了在网络上发送那些没有改变的信息。

随着Web应用开发越来越标准化,出现了MVC等思想。MVC是Model/View/Control的缩写,Model用于封装数据和数据处理方法,视图View是数据的HTML展现,控制器Controller负责响应请求,协调Model和View。

Model,View和Controller的分开,是一种典型的关注点分离的思想,使得代码复用性和组织性更好,Web应用的配置性和灵活性也越来越好。而数据访问也逐渐通过面向对象的方式来替代直接的SQL访问,出现了ORM (Object Relation Mapping) 的概念。

除了MVC,类似的设计思想还有MVPModel View Presenter ),MVVM( Model-View-ViewModel )等。

数据交互

在CGI时期,前后端通常是没有做严格区分的,随着解耦和的需求不断增加,前后端的概念开始变得清晰。前端主要指网站前台部分,运行在PC端、移动端等浏览器上展现给用户浏览的网页,由HTML5、CSS3、JavaScript组成。后端主要指网站的逻辑部分,涉及数据的增删改查等。

此时,REST (Representation State Transformation) 逐渐成为一种流行的Web架构风格。

REST鼓励基于URL来组织系统功能,充分利用HTTP本身的语义,而不是仅仅将HTTP作为一种远程数据传输协议。一般RESTful有以下的特征:

    • 域名和主域名分开

      api.example.comexample.com/api/
      
    • 带有版本控制

      api.example.com/v1api.example.com/v2
      
    • 使用URL定位资源

      GET /users 获取所有用户GET /team/:team/users 获取某团队所有用户POST /users 创建用户PATCH/PUT /users 修改某个用户数据DELETE /users 删除某个用户数据
      
    • 用 HTTP 动词描述操作

      GET 获取资源,单个或多个POST 创建资源PUT/PATCH 更新资源,客户端提供完整的资源数据DELETE 删除资源
      
    • 正确使用状态码

      使用状态码提高返回数据的可读性
      
  • 默认使用 JSON 作为数据响应格式

  • 有清晰的文档

部分网络服务场景的数据有复杂的依赖关系,为了应对这些场景,Facebook 推出了 GraphQL ,以图状数据结构对数据进行查询存储。部分网站也应用了 GraphQL 作为 API 交互的方式。

随着业务对性能的要求提高,前后端开始使用HTTP/2、自定义Protocol Buffer等方式来加快数据交互。

中间件

随着业务的不断发展,业务架构也越来越复杂。传统的功能被拆分成不同的模块,出现了中间件、中台等概念。代理服务、负载均衡、数据库分表、异地容灾、缓存、CDN、消息队列、安全防护等技术应用越来越广泛,增加了Web开发和运维的复杂度。

客户端的形态越来越多,除了Web之外iOS、Android等其他场景也出现在Web服务的客户端场景。

数据库从最开始的轻量数据库,出现了Redis/Memcached缓存数据库等一类满足特定需求的数据库。

为了满足特定的业务需求,出现了Lucene/Solr/Elasticsearch搜索应用服务器,Kafka/RabbitMQ/ZeroMQ消息系统,Spark计算引擎,Hive数据仓库平台等不同的基础架构。

随着数据量的不断提高,单台设备难以承载这样的访问量,同时不同功能也被拆分到不同的应用中,于是出现了提高业务复用及整合的分布式服务框架(RPC)。

持续集成 (Continuous Integration, CI) 是让开发人员将工作集成到共享分支中的过程。频繁的集成有助于解决隔离,减少每次提交的大小,以降低合并冲突的可能性。

持续交付 (Continuous Deployment, CD) 是持续集成的扩展,它将构建从集成测试套件部署到预生产环境。这使得它可以直接在类生产环境中评估每个构建,因此开发人员可以在无需增加任何工作量的情况下,验证bug修复或者测试新特性。

云计算诞生之前,大部分计算资源是处于“裸金属”状态的物理机,运维人员选择对应规格的硬件,建设机房的 IDC 网络,完成服务的提供,投入硬件基础建设和维护的成本很高。云服务出现之后,使用者可以直接购买云主机,基础设施由供应商管理,这种方式也被称作 IaaS (Infrastructure-as-a-Service) 。

随着架构的继续发展,应用的运行更加细粒度,部署环境容器化,各个功能拆成微服务或是Serverless的架构。

Serverless 架构由两部分组成,即 Faas (Function-as-a-Service) 和 BaaS (Backend-as-a-Service) 。

FaaS是运行平台,用户上传需要执行的逻辑函数如一些定时任务、数据处理任务等到云函数平台,配置执行条件触发器、路由等等,就可以通过云平台完成函数的执行。

BaaS包含了后端服务组件,它基于 API 完成第三方服务,主要是数据库、对象存储、消息队列、日志服务等等。

微服务起源于2005年Peter Rodgers博士在云端运算博览会提出的微Web服务 (Micro-Web-Service),根本思想类似于Unix的管道设计理念。2014年,由Martin Fowler与 James Lewis共同提出了微服务的概念,定义了微服务架构风格是一种通过一套小型服务来开发单个应用的方法,每个服务运行在自己的进程中,并通过轻量级的机制进行通讯 (HTTP API) 。

微服务是一种应用于组件设计和部署架构的软件架构风格。它利用模块化的方式组合出复杂的大型应用程序:

  • 各个服务功能内聚,实现与接口分离。
  • 各个服务高度自治、相互解耦,可以独立进行部署、版本控制和容量伸缩。
  • 各个服务之间通过 API 的方式进行通信。
  • 各个服务拥有独立的状态,并且只能通过服务本身来对其进行访问。

API网关是一个服务器,客户端只需要使用简单的访问方式,统一访问API网关,由API网关来代理对后端服务的访问,同时由于服务治理特性统一放到API网关上面,服务治理特性的变更可以做到对客户端透明,一定程度上实现了服务治理等基础特性和业务服务的解耦,服务治理特性的升级也比较容易实现。

网络攻防技术演化

1939年,图灵破解了Enigma,使战争提前结束了两年,这是较早的一次计算机安全开始出现在人们的视野中,这个时候计算机的算力有限,人们使用的攻防方式也相对初级。

1949年,约翰·冯·诺依曼(John Von Neumann)提出了一种可自我复制的程序的设计,这被认为是世界上第一种计算机病毒

1970年到2009年间,随着因特网不断发展,网络安全也开始进入人们的视野。在网络发展的初期,很多系统都是零防护的,安全意识也尚未普及开来。很多系统的设计也只考虑了可用性,对安全性的考虑不多,所以在当时结合搜索引擎与一些集成渗透测试工具,可以很容易的拿到数据或者权限。

1972年,缓冲区溢出攻击被 Computer Security Technology Planning Study 提出。

1984年,Ken Thompson 在 Reflections on Trusting Trust 一文中介绍了自己如何在编译器中增加后门来获取 Unix 权限的,这也是较早的供应链攻击。

1988年,卡耐基梅隆大学(Carnegie Mellon University, CMU)的一位学生以测试的目的编写了Morris Worm,对当时的互联网造成了极大的损害。

同年,CMU的CERT Coordination Center (CERT-CC)为了处理Morris Worm对互联网造成的破坏,组成了第一个计算机紧急响应小组(Computer Emergency Response Team),而后全球多个国家、地区、团体都构建了CERT、SRC等组织。

同样是在1988年,Barton Miller教授在威斯康星大学的 计算机实验课上 ,首次提出Fuzz生成器(Fuzz Generator)的概念,用于测试Unix程序的健壮性,即用随机数据来测试程序直至崩溃。因此,Barton Miller教授也被多数人尊称为"模糊测试之父"。

1989年,C.J.Cherryh 发表了小说 The Cuckoo\'s Egg: Tracking a Spy Through the Maze of Computer Espionage ,这本书是作者根据追溯黑客攻击的真实经历改编,在书中提出了蜜罐技术的雏形。

1990年,一些网络防火墙的产品开始出现,此时主要是基于网络的防火墙,可以处理FTP等应用程序。

1993年起,Jeff Moss开始每年在美国内华达州的拉斯维加斯举办 DEFCON (也写做 DEF CON, Defcon, or DC, 全球最大的计算机安全会议之一) 。CTF (Capture The Flag) 比赛的形式也是起源于1996年的 DEFCON 。

1993年7月,Windows NT 3.1发布,引入了身份认证、访问控制和安全审计等安全控制机制,在此之前的 Windows 9x 内核几乎没有任何安全性机制。

1996年,Smashing the Stack For Fun and Profit发表,在堆栈的缓冲区溢出的利用方式上做出了开创性的工作。

1997年起,Jeff Moss开始举办 Black Hat ,以中立的立场进行信息安全研究的交流和培训,到目前为止,Black Hat 也会在欧洲和亚洲举行。

1998年12月,Jeff Forristal在一篇 文章 中提到了使用SQL注入的技巧攻击一个网站的例子,从此SQL注入开始被广泛讨论。

1999年1月21日-22日的第二届 Research with Security Vulnerability Databases 的 WorkShop 上, MITRE 的创始人 David E. Mann 和 Steven M. Christey 发表了一篇名为《Towards a Common Enumeration of Vulnerabilities》的白皮书,提出了CVE (Common Vulnerabilities and Exposures, 通用漏洞披露) 的概念,在当年收录并公开了321个CVE漏洞。

1999年12月,MSRC的一些工程师发现了一些网站被注入代码的例子,他们在整理讨论后公开了这种攻击,并称为 Cross Site Scripting

2002年1月,Microsoft发起了 “可信赖计算” (Trustworthy Computing) 计划,以帮助确保产品和服务在本质上具有高度安全性,可用性,可靠性以及业务完整性,SDL (Security Development Lifecycle) 也在此时被提出。

2001年9月9日,Mark Curphey启动了OWASP (Open Web Application Security Project) 项目,开始在社区中提供一些Web攻击技术的文章、方法和工具等。

在此之后,Responsible disclosure / Full disclosure 等概念也不断进入人们的视野之中。

2002年10月4日,Kevin Mitnick 编著的 The Art of Deception (欺骗的艺术) 出版,这本书详细的介绍了社会工程学在攻击中是如何应用的,Kevin Mitnick 也被认为是社会工程学的开山鼻祖。

2005年7月25日,Zero Day Initiative (ZDI) 创建,鼓励负责任的漏洞披露。

2005年11月,基于从1941年2月开始的情报收集积累和发展,Director of National Intelligence 宣布成立 Open Source Center (OSC) ,进行开源情报的收集,而后 Open-source intelligence (OSINT) 的概念也不断被人们认知。

2006年,APT(Advanced Persistent Threat, 高级持续威胁) 攻击的概念被正式提出,用来描述从20世纪90年代末到21世纪初在美国军事和政府网络中发现的隐蔽且持续的网络攻击。

2006年起,美国国土安全部(DHS)开始每两年举行一次 “网络风暴” (Cyber Storm) 系列国家级网络事件演习。

随着时代不断的发展,攻防技术有了很大的改变,防御手段、安全意识也随着演化。在攻击发生前有威胁情报、黑名单共享等机制,威胁及时能传播。在攻击发生时有基于各种机制的防火墙如关键字检测、语义分析、深度学习,有的防御机制甚至能一定程度上防御零日攻击。在攻击发生后,一些关键系统系统做了隔离,攻击成果难以扩大,就算拿到了目标也很难做进一步的攻击。也有的目标蜜罐仿真程度很高,有正常的服务和一些难以判断真假的业务数据。

2010年6月,震网 (Stuxnet) 被发现,在这之后供应链攻击事件开始成为网络空间安全的新兴威胁之一。随后的XcodeGhost、CCleaner等供应链攻击事件都造成了重大影响。

在2010年Forrester Research Inc.的分析师提出了“零信任”的概念模型时。

2012年1月,Gartner 公司提出了 IAST (Interactive Application Security Testing) 的概念,提供了结合 DAST 和 SAST 两种技术的解决方案。

2012年9月,Gartner 公司研究员 David Cearley 提出了 DevSecOps 的概念,表示 DevOps 的流程应该包含安全理念。

2013年,MITRE 提出了 ATT&CK™ (Adversarial Tactics, Techniques, and Common Knowledge, ATT&CK) ,这是一个站在攻击者的视角来描述攻击中各阶段用到的技术的模型。

2013年,Michigan 大学开始了 ZMap 项目,在2015年这个项目演化为 Censys ,从这之后网络空间测绘的项目逐渐出现。

2014年,在 Gartner Security and Risk Management Summit 上,Runtime Application Self-protection (RASP) 的概念被提出,在应用层进行安全保护。

2015年,Gartner 首次提出了 SOAR 的概念,最初的定义是 Security Operations, Analytics and Reporting,即安全运维分析与报告。

2017年,Gartner 对 SOAR 概念做了重新定义:Security Orchestration, Automation and Response, 即安全编排、自动化与响应。

网络安全观

网络定义安全

网络安全的一个通用定义指网络信息系统的硬件、软件及其系统中的数据受到保护,不因偶然的或者恶意的破坏、更改、泄露,系统能连续、可靠、正常地运行,服务不中断。网络安全简单的说是在网络环境下能够识别和消除不安全因素的能力。

网络安全在不同环境和应用中有不同的解释,例如系统运行的安全、系统信息内容的安全、信息通信与传播的安全等。

网络安全的基本需求包括可靠性、可用性、保密性、完整性、不可抵赖性、可控性、可审查性、真实性等。其中三个最基本的要素是机密性 (Confidentiality)、完整性 (Integrity)、可用性 (Availability)。

机密性是不将有用信息泄漏给非授权用户的特性。可以通过信息加密、身份认证、访问控制、安全通信协议等技术实现,信息加密是防止信息非法泄露的最基本手段,主要强调有用信息只被授权对象使用的特征。

完整性是指信息在传输、交换、存储和处理过程中,保持信息不被破坏或修改、不丢失和信息未经授权不能改变的特性,也是最基本的安全特征。

可用性指信息资源可被授权实体按要求访问、正常使用或在非正常情况下能恢复使用的特性。在系统运行时正确存取所需信息,当系统遭受意外攻击或破坏时,可以迅速恢复并能投入使用。是衡量网络信息系统面向用户的一种安全性能,以保障为用户提供服务。

网络安全的主体是保护网络上的数据和通信的安全,数据安全性是指软硬件保护措施,用来阻止对数据进行非授权的泄漏、转移、修改和破坏等,通信安全性是通信保护措施,要求在通信中采用保密安全性、传输安全性、辐射安全性等措施。

系统脆弱性

信息系统本身是脆弱的,信息系统的硬件资源、通信资源、软件及信息资源等都可能因为可预见或不可预见甚至恶意的原因而可能导致系统受到破坏、更改、泄露和功能失效,从而使系统处于异常状态,甚至崩溃瘫痪。

硬件资源的脆弱性主要表现为物理安全方面的问题,多源于设计,采用软件程序的方法见效不大。

软件的脆弱性来源于设计和软件工程实施中遗留问题,如设计中的疏忽、内部设计的逻辑混乱,没有遵守信息系统安全原则进行设计等。

法律与法规

计算机网络与协议

网络基础

协议(HTTP/TCP/IP)

DHCP协议

动态主机配置协议 (Dynamic Host Configuration Protocol,DHCP) 是一个用于局域网的网络协议,位于OSI模型的应用层,使用UDP协议工作,主要用于自动分配IP地址给用户,方便管理员进行统一管理。

DHCP服务器端使用67/udp,客户端使用68/udp。

DHCP运行分为四个基本过程

  • 请求IP租约
  • 提供IP租约
  • 选择IP租约
  • 确认IP租约
  • 客户端在获得了一个IP地址以后,就可以发送一个ARP请求来避免由于DHCP服务器地址池重叠而引发的IP冲突。

DCHP 报文格式

0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|     op (1)    |   htype (1)   |   hlen (1)    |   hops (1)    |
+---------------+---------------+---------------+---------------+
|                            xid (4)                            |
+-------------------------------+-------------------------------+
|           secs (2)            |           flags (2)           |
+-------------------------------+-------------------------------+
|                          ciaddr  (4)                          |
+---------------------------------------------------------------+
|                          yiaddr  (4)                          |
+---------------------------------------------------------------+
|                          siaddr  (4)                          |
+---------------------------------------------------------------+
|                          giaddr  (4)                          |
+---------------------------------------------------------------+
|                          chaddr  (16)                         |
+---------------------------------------------------------------+
|                          sname   (64)                         |
+---------------------------------------------------------------+
|                          file    (128)                        |
+---------------------------------------------------------------+
|                          options (variable)                   |
+---------------------------------------------------------------+

路由算法

路由算法是用于找到一条从源路由器到目的路由器的最佳路径的算法。存在着多种路由算法,每种算法对网络和路由器资源的影响都不同;由于路由算法使用多种度量标准 (metric),所以不同路由算法的最佳路径选择也有所不同。

路由选择算法的功能

源/宿对之间的路径选择,以及选定路由之后将报文传送到它们的目的地。

路由选择算法的要求:

  • 正确性:确保分组从源节点传送到目的节点
  • 简单性:实现方便,软硬件开销小
  • 自适应性:也称健壮性,算法能够适应业务量和网络拓扑的变化
  • 稳定性:能长时间无故障运行
  • 公平性:每个节点都有机会传送信息
  • 最优性:尽量选取好的路由

自治系统 AS (Autonomous System)

经典定义:

  • 由一个组织管理的一整套路由器和网络。
  • 使用一种AS 内部的路由选择协议和共同的度量以确定分组在该 AS 内的路由。
  • 使用一种 AS 之间的路由选择协议用以确定分组在AS之间的路由。

尽管一个 AS 使用了多种内部路由选择协议和度量,但对其他 AS 表现出的是一个单一的和一致的路由选择策略。

两大类路由选择协议

因特网的中,路由协议可以分为内部网关协议 IGP (Interior Gateway Protocol)和外部网关协议 EGP (External Gateway Protocol)。

IGP是在一个AS内部使用的路由选择协议,如RIP和OSPF协议,是域内路由选择 (interdomain routing)。当源主机和目的主机处在不同的AS中,在数据报到达AS的边界时,使用外部网关协议 EGP 将路由选择信息传递到另一个自治系统中,如BGP-4,是域间路由选择 (intradomain routing)。

  • RIP

    路由信息协议 (Routing Information Protocol, RIP) 是一种基于距离 向量的路由选择协议。
    RIP 协议要求网络中的每一个路由器都要维护从它自己到自治系统内其他每一个目的网络的距离
    和下一跳路由器地址。
    
  • OSPF

    开放最短路径优先(Open Shortest Path First,OSPF),
    这个算法名为“最短路径优先”是因为使用了 Dijkstra 提出的最短路径算法SPF,只是一个协议的名字,
    它并不表示其他的路由选择协议不是“最短路径优先”。
    

域名系统

DNS是一个简单的请求-响应协议,是将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。DNS使用TCP和UDP协议的53端口。

mDNS

Multicast DNS (mDNS),多播DNS,使用5353端口,组播地址为 224.0.0.251[FF02::FB] 。在一个没有常规DNS服务器的小型网络内可以使用mDNS来实现类似DNS的编程接口、包格式和操作语义。mDNS协议的报文与DNS的报文结构相同,但有些字段对于mDNS来说有新的含义。

启动mDNS的主机会在进入局域网后向所有主机组播消息,包含主机名、IP等信息,其他拥有相应服务的主机也会响应含有主机名和IP的信息。

mDNS的域名是用 .local 和普通域名区分开的。

FQDN

FQDN (Fully-Qualified Domain Name) 是域名的完全形态,主要是包含零长度的根标签,例如 www.example.com.

TLD

Top-Level Domain (TLD) 是属于根域的一个域,例如 comjp

TLD一般可以分为 Country Code Top-Level Domains (ccTLDs) 、Generic Top-Level Domains (gTLDs) 以及其它。

IDN

Internationalized Domain Names for Applications (IDNA) 是为了处理非ASCII字符的情况。

CNAME

CNAME即Canonical name,又称alias,将域名指向另一个域名。

TTL

Time To Live,无符号整数,记录DNS记录过期的时间,最小是0,最大是2147483647 (2^31 - 1)。

DNS记录

    • A记录

      返回域名对应的IPv4地址
      
    • NS记录

      域名服务器返回该域名由哪台域名服务器解析
      
    • PTR记录

      反向记录从IP地址到域名的记录
      
    • MX记录

      电子邮件交换记录记录邮件域名对应的IP地址
      

响应码

  • NOERROR
No error condition
  • FORMERR
Format error - The name server was unable to interpret the query
  • SERVFAIL
Server failure - The name server was unable to process this query due to a problem with the name server
  • NXDOMAIN
this code signifies that the domain name referenced in the query does not exist
  • NOTIMP
Not Implemented - The name server does not support the requested kind of query
  • REFUSED
Refused - The name server refuses to perform the specified operation for policy reasons
  • NODATA
A pseudo RCODE which indicates that the name is valid, for the given class, but [there] are no records of the given type A NODATA response has to be inferred from the answer.

域名系统工作原理

解析过程

DNS解析过程是递归查询的,具体过程如下:

  • 用户要访问域名www.example.com时,先查看本机hosts是否有记录或者本机是否有DNS缓存,如果有,直接返回结果,否则向递归服务器查询该域名的IP地址
  • 递归缓存为空时,首先向根服务器查询com顶级域的IP地址
  • 根服务器告知递归服务器com顶级域名服务器的IP地址
  • 递归向com顶级域名服务器查询负责example.com的权威服务器的IP
  • com顶级域名服务器返回相应的IP地址
  • 递归向example.com的权威服务器查询www.example.com的地址记录
  • 权威服务器告知www.example.com的地址记录
  • 递归服务器将查询结果返回客户端

域传送

DNS服务器可以分为主服务器、备份服务器和缓存服务器。域传送是指备份服务器从主服务器拷贝数据,并使用得到的数据更新自身数据库。域传送是在主备服务器之间同步数据库的机制。

服务器类型

根服务器

根服务器是DNS的核心,负责互联网顶级域名的解析,用于维护域的权威信息,并将DNS查询引导到相应的域名服务器。

根服务器在域名树中代表最顶级的 . 域, 一般省略。

13台IPv4根服务器的域名标号为a到m,即a.root-servers.org到m.root-servers.org,所有服务器存储的数据相同,仅包含ICANN批准的TLD域名权威信息。

权威服务器

权威服务器上存储域名Zone文件,维护域内域名的权威信息,递归服务器可以从权威服务器获得DNS查询的资源记录。

权威服务器需要在所承载的域名所属的TLD管理局注册,同一个权威服务器可以承载不同TLD域名,同一个域也可以有多个权威服务器。

递归服务器

递归服务器负责接收用户的查询请求,进行递归查询并响应用户查询请求。在初始时递归服务器仅有记录了根域名的Hint文件。

DNS利用

DGA

DGA(Domain Generate Algorithm,域名生成算法)是一种利用随机字符来生成C&C域名,从而逃避域名黑名单检测的技术手段,常见于botnet中。一般来说,一个DGA域名的存活时间约在1-7天左右。

通信时,客户端和服务端都运行同一套DGA算法,生成相同的备选域名列表,当需要发动攻击的时候,选择其中少量进行注册,便可以建立通信,并且可以对注册的域名应用速变IP技术,快速变换IP,从而域名和IP都可以进行快速变化。

DGA域名有多种生成方式,根据种子类型可以分为确定性和不确定性的生成。不确定性的种子可能会选用当天的一些即时数据,如汇率信息等。

DNS隧道

DNS隧道工具将进入隧道的其他协议流量封装到DNS协议内,在隧道上传输。这些数据包出隧道时进行解封装,还原数据。

加密方案

作为主流的防御方案,DNS加密有五种方案,分别是 DNS-over-TLS (DoT)、DNS-over-DTLS、DNS-over-HTTPS (DoH)、DNS-over-QUIC以及DNSCrypt。

DoT

DoT方案在2016年发表于RFC7858,使用853端口。主要思想是Client和Server通过TCP协议建立TLS会话后再进行DNS传输,Client通过SSL证书验证服务器身份。

DNS-over-DTLS

DNS-over-DTLS和DoT类似,区别在于使用UDP协议而不是TCP协议。

DoH

DoH方案在发表RFC8484,使用 https://dns.example.com/dns-query{?dns} 来查询服务器的IP,复用https的443端口,流量特征比较小。DoH会对DNS服务器进行加密认证,不提供fallback选项。目前Cloudflare、Google等服务商对DoH提供了支持。

DNS-over-QUIC

DNS-over-QUIC安全特性和DoT类似,但是性能更高,目前没有合适的软件实现。

DNSCrypt

DNSCrypt使用X25519-XSalsa20Poly1305而非标准的TLS,且DNSCrypt的Client需要额外的软件,Server需要的专门的证书。

相关漏洞

DNS劫持

DNS劫持有多种方式,比较早期的攻击方式是通过攻击域名解析服务器,或是伪造DNS响应的方法,来将域名解析到恶意的IP地址。

随着互联网应用的不断发展,出现了基于废弃记录的劫持方式。这种方式发生的场景是次级域名的解析记录指向第三方资源,而第三方资源被释放后,解析记录并没有取消,在这种场景下,可以对应申请第三方资源,以获取控制解析记录的能力。

拒绝服务

DNS服务通常会开启UDP端口,当DNS服务器拥有大量二级域NS记录时,通过DNS的UDP反射攻击可以实现高倍的拒绝服务。

SSL/TLS

SSL全称是Secure Sockets Layer,安全套接字层,它是由网景公司(Netscape)在1994年时设计,主要用于Web的安全传输协议,目的是为网络通信提供机密性、认证性及数据完整性保障。如今,SSL已经成为互联网保密通信的工业标准。

SSL最初的几个版本(SSL 1.0、SSL2.0、SSL 3.0)由网景公司设计和维护,从3.1版本开始,SSL协议由因特网工程任务小组(IETF)正式接管,并更名为TLS(Transport Layer Security),发展至今已有TLS 1.0、TLS1.1、TLS1.2、TLS1.3这几个版本。

如TLS名字所说,SSL/TLS协议仅保障传输层安全。同时,由于协议自身特性(数字证书机制),SSL/TLS不能被用于保护多跳(multi-hop)端到端通信,而只能保护点到点通信。

SSL/TLS协议能够提供的安全目标主要包括如下几个:

    • 认证性

      借助数字证书认证服务端端和客户端身份,防止身份伪造
      
    • 机密性

      借助加密防止第三方窃听
      
    • 完整性

      借助消息认证码(MAC)保障数据完整性,防止消息篡改
      
    • 重放保护

      通过使用隐式序列号防止重放攻击
      

为了实现这些安全目标,SSL/TLS协议被设计为一个两阶段协议,分为握手阶段和应用阶段:

握手阶段也称协商阶段,在这一阶段,客户端和服务端端会认证对方身份(依赖于PKI体系,利用数字证书进行身份认证),并协商通信中使用的安全参数、密码套件以及MasterSecret。后续通信使用的所有密钥都是通过MasterSecret生成。 在握手阶段完成后,进入应用阶段。在应用阶段通信双方使用握手阶段协商好的密钥进行安全通信。

TLS 包含几个子协议,比较常用的有记录协议、警报协议、握手协议、变更密码规范协议等。

  • 记录协议(Record Protocol)规定了 TLS 收发数据的基本单位记录(record)。
  • 警报协议(Alert Protocol)用于提示协议交互过程出现错误。
  • 握手协议(Handshake Protocol)是 TLS 里最复杂的子协议,在握手过程中协商 TLS 版本号、随机数、密码套件等信息,然后交换证书和密钥参数,最终双方协商得到会话密钥,用于后续的混合加密系统
  • 变更密码规范协议(Change Cipher Spec Protocol)是一个“通知”,告诉对方,后续的数据都将使用加密保护。

交互过程

Client Hello 由客户端发送,内容包括客户端的一个Unix时间戳(GMT Unix Time)、一些随机的字节(Random Bytes),还包括了客户端接受的算法类型(Cipher Suites)。

Server Hello 由服务端发送,内容包括服务端支持的算法类型、GMT Unix Time以及Random Bytes。

Certificate由服务端或者客户端发送,发送方会会将自己的数字证书发送给接收方,由接收方进行证书验证,如果不通过的话,接收方会中断握手的过程。一般跟在Client / Server Hello报文之后。

Server Key Exchange由服务端发送,将自己的公钥参数传输给了客户端,一般也和Server Hello与Certificate在一个TCP报文中。

Server Hello Done服务端发送,一般也和Server Hello、Certificate和Server Key Exchange在一个TCP报文中。

Client Key Exchange客户端发送,向服务端发送自己的公钥参数,与服务端协商密钥。

Change Cipher Spec客户端或者服务端发送,紧跟着Key Exchange发送,代表自己生成了新的密钥,通知对方以后将更换密钥,使用新的密钥进行通信。

Encrypted Handshake Message客户端或者服务端发送,紧跟着Key Exchange发送。进行测试,一方用自己的刚刚生成的密钥加密一段固定的消息发送给对方,如果密钥协商正确无误的话,对方可以正确解密。

New Session Ticket服务端发送,表示发起会话,在一段时间之内(超时时间到来之前),双方都以刚刚交换的密钥进行通信。从这以后,加密通信正式开始。

Application Data使用密钥交换协议协商出来的密钥加密的应用层的数据。

Encrypted Alert客户端或服务端发送,意味着加密通信因为某些原因需要中断,警告对方不要再发送敏感的数据。

TLS 1.3

  • 引入了PSK作为新的密钥协商机制

  • 支持 0-RTT 模式,以安全性降低为代价,在建立连接时节省了往返时间

  • ServerHello 之后的所有握手消息采取了加密操作,可见明文减少

  • 不再允许对加密报文进行压缩、不再允许双方发起重协商

  • DSA 证书不再允许在 TLS 1.3 中使用

    • 删除不安全的密码算法

      RSA 密钥传输 - 不支持前向安全性CBC 模式密码 - 易受 BEAST 和 Lucky 13 攻击RC4 流密码 - 在 HTTPS 中使用并不安全SHA-1 哈希函数 - 建议以 SHA-2 取而代之任意 Diffie-Hellman 组- CVE-2016-0701 漏洞输出密码 - 易受 FREAK 和 LogJam 攻击
      

SSL/TLS协议有一个高度模块化的架构,分为很多子协议,主要是:

    • Handshake 协议

      包括协商安全参数和密码套件、服务端身份认证(客户端身份认证可选)、密钥交换
      
    • ChangeCipherSpec 协议

      一条消息表明握手协议已经完成
      
    • Alert 协议

      对握手协议中一些异常的错误提醒,分为fatal和warning两个级别,fatal类型的错误会直接中断SSL链接,而warning级别的错误SSL链接仍可继续,只是会给出错误警告
      
    • Record 协议

      包括对消息的分段、压缩、消息认证和完整性保护、加密等
      

IPsec

IPsec(IP Security)是IETF制定的三层隧道加密协议,它为Internet上传输的数据提供了高质量的、可互操作的、基于密码学的安全保证。特定的通信方之间在IP层通过加密与数据源认证等方式,提供了以下的安全服务:

    • 数据机密性(Confidentiality)

      IPsec发送方在通过网络传输包前对包进行加密。
      
    • 数据完整性(Data Integrity)

      IPsec接收方对发送方发送来的包进行认证,以确保数据在传输过程中没有被篡改。
      
    • 数据来源认证(Data Authentication)

      IPsec在接收端可以认证发送IPsec报文的发送端是否合法。
      
    • 防重放(Anti-Replay)

      IPsec接收方可检测并拒绝接收过时或重复的报文。
      

优点

IPsec具有以下优点:

  • 支持IKE(Internet Key Exchange,因特网密钥交换),可实现密钥的自动协商功能,减少了密钥协商的开销。可以通过IKE建立和维护SA的服务,简化了IPsec的使用和管理。
  • 所有使用IP协议进行数据传输的应用系统和服务都可以使用IPsec,而不必对这些应用系统和服务本身做任何修改。
  • 对数据的加密是以数据包为单位的,而不是以整个数据流为单位,这不仅灵活而且有助于进一步提高IP数据包的安全性,可以有效防范网络攻击。

构成

IPsec由四部分内容构成:

  • 负责密钥管理的Internet密钥交换协议IKE(Internet Key Exchange Protocol)
  • 负责将安全服务与使用该服务的通信流相联系的安全关联SA(Security Associations)
  • 直接操作数据包的认证头协议AH(IP Authentication Header)和安全载荷协议ESP(IP Encapsulating Security Payload)
  • 若干用于加密和认证的算法

安全联盟(SA)

IPsec在两个端点之间提供安全通信,端点被称为IPsec对等体。

SA是IPsec的基础,也是IPsec的本质。SA是通信对等体间对某些要素的约定,例如,使用哪种协议(AH、ESP还是两者结合使用)、协议的封装模式(传输模式和隧道模式)、加密算法(DES、3DES和AES)、特定流中保护数据的共享密钥以及密钥的生存周期等。建立SA的方式有手工配置和IKE自动协商两种。

SA是单向的,在两个对等体之间的双向通信,最少需要两个SA来分别对两个方向的数据流进行安全保护。同时,如果两个对等体希望同时使用AH和ESP来进行安全通信,则每个对等体都会针对每一种协议来构建一个独立的SA。

SA由一个三元组来唯一标识,这个三元组包括SPI(Security Parameter Index,安全参数索引)、目的IP地址、安全协议号(AH或ESP)。

SPI是用于唯一标识SA的一个32比特数值,它在AH和ESP头中传输。在手工配置SA时,需要手工指定SPI的取值。使用IKE协商产生SA时,SPI将随机生成。

IKE

IKE(RFC2407,RFC2408、RFC2409)属于一种混合型协议,由Internet安全关联和密钥管理协议(ISAKMP)和两种密钥交换协议OAKLEY与SKEME组成。IKE创建在由ISAKMP定义的框架上,沿用了OAKLEY的密钥交换模式以及SKEME的共享和密钥更新技术,还定义了它自己的两种密钥交换方式。

IKE使用了两个阶段的ISAKMP:

第一阶段,协商创建一个通信信道(IKE SA),并对该信道进行验证,为双方进一步的IKE通信提供机密性、消息完整性以及消息源验证服务; 第二阶段,使用已建立的IKE SA建立IPsec SA(V2中叫Child SA)。

Wi-Fi

Wi-Fi又称“无线热点”或“无线网络”,是Wi-Fi联盟的商标,一个基于IEEE 802.11标准的无线局域网技术。

攻击

暴力破解

WiFi密码是基于预置的秘钥,可以通过抓取报文的方式在本地快速的批量进行密码爆破尝试。

伪造热点

AP可以动态的广播自己,客户也可以主动发送探针请求。可以伪造AP发送对探针请求的响应包,来让客户端错误的识别。

秘钥重装攻击

该漏洞由Vanhoef发现。Wi-Fi在握手时双方会更新秘钥,该攻击通过重放握手信息,令客户端重新安装相同的秘钥。

Dragonblood

最新版的WPA3标准在实现上存在一些问题,同样由Vanhoef发现。包含拒绝服务攻击、降级攻击、侧信道泄露等。

信息收集

网络入口/信息

    • 网络拓扑信息

      外网出口
      
    • IP信息

      C段
      
    • 线下网络

      Wi-FiSSID认证信息
      
    • VPN

      厂商登录方式
      
  • 邮件网关

  • 手机APP

  • 小程序后台

  • OA

  • SSO

  • 边界网络设备

  • 上游运营商

域名信息

Whois

Whois 可以查询域名是否被注册,以及注册域名的详细信息的数据库,其中可能会存在一些有用的信息,例如域名所有人、域名注册商、邮箱等。

搜索引擎搜索

搜索引擎通常会记录域名信息,可以通过 site: domain 的语法来查询。

第三方查询

网络中有相当多的第三方应用提供了子域的查询功能,下面有一些例子:

ASN信息关联

在网络中一个自治系统 (Autonomous System, AS) 是一个有权自主地决定在本系统中应采用何种路由协议的小型单位。这个网络单位可以是一个简单的网络也可以是一个由一个或多个普通的网络管理员来控制的网络群体,它是一个单独的可管理的网络单元 (例如一所大学,一个企业或者一个公司个体) 。

一个自治系统有时也被称为是一个路由选择域 (routing domain) 。一个自治系统将会分配一个全局的唯一的16位号码,这个号码被称为自治系统号 (ASN) 。因此可以通过ASN号来查找可能相关的IP,例如:

whois -h whois.radb.net -- \'-i origin AS111111\' | grep -Eo "([0-9.]+){4}/[0-9]+" | uniq
nmap --script targets-asn --script-args targets-asn.asn=15169

域名相关性

同一个企业/个人注册的多个域名通常具有一定的相关性,例如使用了同一个邮箱来注册、使用了同一个备案、同一个负责人来注册等,可以使用这种方式来查找关联的域名。一种操作步骤如下:

  • 查询域名注册邮箱
  • 通过域名查询备案号
  • 通过备案号查询域名
  • 反查注册邮箱
  • 反查注册人
  • 通过注册人查询到的域名在查询邮箱
  • 通过上一步邮箱去查询域名
  • 查询以上获取出的域名的子域名

网站信息利用

网站中有相当多的信息,网站本身、各项安全策略、设置等都可能暴露出一些信息。

网站本身的交互通常不囿于单个域名,会和其他子域交互。对于这种情况,可以通过爬取网站,收集站点中的其他子域信息。这些信息通常出现在JavaScript文件、资源文件链接等位置。

网站的安全策略如跨域策略、CSP规则等通常也包含相关域名的信息。有时候多个域名为了方便会使用同一个SSL/TLS证书,因此有时可通过证书来获取相关域名信息。

HTTPS证书

证书透明度

为了保证HTTPS证书不会被误发或伪造,CA会将证书记录到可公开验证、不可篡改且只能附加内容的日志中,任何感兴趣的相关方都可以查看由授权中心签发的所有证书。因此可以通过查询已授权证书的方式来获得相关域名。

SAN

主题备用名称 (Subject Alternate Name, SAN),简单来说,在需要多个域名,并将其用于各项服务时,多使用SAN证书。SAN允许在安全证书中使用subjectAltName字段将多种值与证书关联,这些值被称为主题备用名称。

域传送漏洞

DNS域传送 (zone transfer) 指的是冗余备份服务器使用来自主服务器的数据刷新自己的域 (zone) 数据库。这是为了防止主服务器因意外不可用时影响到整个域名的解析。

一般来说,域传送操作应该只允许可信的备用DNS服务器发起,但是如果错误配置了授权,那么任意用户都可以获得整个DNS服务器的域名信息。这种错误授权被称作是DNS域传送漏洞。

Passive DNS

Passive DNS被动的从递归域名服务器记录来自不同域名服务器的响应,形成数据库。利用Passive DNS数据库可以知道域名曾绑定过哪些IP,IP曾关联到哪些域名,域名最早/最近出现的时间,为测试提供较大的帮助。Virustotal、passivetotal、CIRCL等网站都提供了Passive DNS数据库的查询。

泛解析

泛解析是把 *.example.com 的所有A记录都解析到某个IP 地址上,在子域名枚举时需要处理这种情况以防生成大量无效的记录。

重要记录

  • CNAME即Canonical name,又称alias,将域名指向另一个域名。其中可能包含其他关联业务的信息。很多网站使用的CDN加速功能利用了该记录。
  • MX记录即Mail Exchanger,记录了发送电子邮件时域名对应的服务器地址。可以用来寻找SMTP服务器信息。
  • NS (Name Server) 记录是域名服务器的记录,用来指定域名由哪个DNS服务器来进行解析。
  • SPF (Sender Policy Framework) 是为了防止垃圾邮件而提出来的一种DNS记录类型,是一种TXT类型的记录,用于登记某个域名拥有的用来外发邮件的所有IP地址。通过SPF记录可以获取相关的IP信息,常用命令为 dig example.com txt

CDN

CDN验证

可通过多地ping的方式确定目标是否使用了CDN,常用的网站有 http://ping.chinaz.com/ https://asm.ca.com/en/ping.php 等。

域名查找

使用了CDN的域名的父域或者子域名不一定使用了CDN,可以通过这种方式去查找对应的IP。

历史记录查找

CDN可能是在网站上线一段时间后才上线的,可以通过查找域名解析记录的方式去查找真实IP。

邮件信息

通过社会工程学的方式进行邮件沟通,从邮件头中获取IP地址,IP地址可能是网站的真实IP或者是目标的出口IP。

子域爆破

在内网等不易用到以上技巧的环境,或者想监测新域名上线时,可以通过批量尝试的方式,找到有效的域名。

缓存探测技术

在企业网络中通常都会配置DNS服务器为网络内的主机提供域名解析服务。域名缓存侦测(DNS Cache Snooping)技术就是向这些服务器发送域名解析请求,但并不要求使用递归模式,用于探测是否请求过某个域名。这种方式可以用来探测是否使用了某些软件,尤其是安全软件。

端口信息

常见端口及其脆弱点

    • FTP (21/TCP)

      默认用户名密码 `anonymous:anonymous`暴力破解密码VSFTP某版本后门
      
    • SSH (22/TCP)

      部分版本SSH存在漏洞可枚举用户名暴力破解密码
      
    • Telent (23/TCP)

      暴力破解密码嗅探抓取明文密码
      
    • SMTP (25/TCP)

      无认证时可伪造发件人
      
    • DNS (53/UDP)

      域传送漏洞DNS劫持DNS缓存投毒DNS欺骗SPF / DMARC CheckDDoSDNS Query FloodDNS 反弹DNS 隧道
      
    • DHCP 67/68

      劫持/欺骗
      
  • TFTP (69/TCP)

  • HTTP (80/TCP)

    • Kerberos (88/TCP)

      主要用于监听KDC的票据请求用于进行黄金票据和白银票据的伪造
      
    • POP3 (110/TCP)

      爆破
      
    • RPC (135/TCP)

      wmic 服务利用
      
    • NetBIOS (137/UDP & 138/UDP)

      未授权访问弱口令
      
    • NetBIOS / Samba (139/TCP)

      未授权访问弱口令
      
    • SNMP (161/TCP)

      Public 弱口令
      
    • LDAP (389/TCP)

      用于域上的权限验证服务匿名访问注入
      
  • HTTPS (443/TCP)

    • SMB (445/TCP)

      Windows 协议簇,主要功能为文件共享服务`net use \\192.168.1.1 /user:xxx\username password`
      
    • Linux Rexec (512/TCP & 513/TCP & 514/TCP)

      弱口令
      
    • Rsync (873/TCP)

      未授权访问
      
    • RPC (1025/TCP)

      NFS匿名访问
      
    • Java RMI (1090/TCP & 1099/TCP)

      反序列化远程命令执行漏洞
      
    • MSSQL (1433/TCP)

      弱密码差异备份 GetShellSA 提权
      
    • Oracle (1521/TCP)

      弱密码
      
    • NFS (2049/TCP)

      权限设置不当`showmount `
      
    • ZooKeeper (2171/TCP & 2375/TCP)

      无身份认证
      
    • Docker Remote API (2375/TCP)

      未限制IP / 未启用TLS身份认证`http://docker.addr:2375/version`
      
    • MySQL (3306/TCP)

      弱密码日志写WebShellUDF提权MOF提权
      
    • RDP / Terminal Services (3389/TCP)

      弱密码
      
    • Postgres (5432/TCP)

      弱密码执行系统命令
      
    • VNC (5900/TCP)

      弱密码
      
    • CouchDB (5984/TCP)

      未授权访问
      
    • WinRM (5985/TCP)

      Windows对WS-Management的实现在Vista上需要手动启动,在Windows Server 2008中服务是默认开启的
      
    • Redis (6379/TCP)

      无密码或弱密码绝对路径写 WebShell计划任务反弹 Shell写 SSH 公钥主从复制 RCEWindows 写启动项
      
    • Kubernetes API Server (6443/TCP && 10250/TCP)

      `https://Kubernetes:10250/pods`
      
    • JDWP (8000/TCP)

      远程命令执行
      
  • ActiveMQ (8061/TCP)

    • Jenkin (8080/TCP)

      未授权访问
      
    • Elasticsearch (9200/TCP)

      代码执行`http://es.addr:9200/_plugin/head/``http://es.addr:9200/_nodes`
      
    • Memcached (11211/TCP)

      未授权访问
      
  • RabbitMQ (15672/TCP & 15692/TCP & 25672/TCP)

    • MongoDB (27017/TCP)

      无密码或弱密码
      
    • Hadoop (50070/TCP & 50075/TCP)

      未授权访问
      

除了以上列出的可能出现的问题,暴露在公网上的服务若不是最新版,都可能存在已经公开的漏洞

常见端口扫描技术

全扫描

扫描主机尝试使用三次握手与目标主机的某个端口建立正规的连接,若成功建立连接,则端口处于开放状态,反之处于关闭状态。

全扫描实现简单,且以较低的权限就可以进行该操作。但是在流量日志中会有大量明显的记录。

半扫描

半扫描也称SYN扫描,在半扫描中,仅发送SYN数据段,如果应答为RST,则端口处于关闭状态,若应答为SYN/ACK,则端口处于监听状态。不过这种方式需要较高的权限,而且现在的大部分防火墙已经开始对这种扫描方式做处理。

FIN扫描

FIN扫描是向目标发送一个FIN数据包,如果是开放的端口,会返回RST数据包,关闭的端口则不会返回数据包,可以通过这种方式来判断端口是否打开。

这种方式并不在TCP三次握手的状态中,所以不会被记录,相对SYN扫描要更隐蔽一些。

Web服务

    • Jenkins

      未授权访问
      
    • Gitlab

      对应版本CVE
      
    • Zabbix

      权限设置不当
      

批量搜索

  • Censys
  • Shodan
  • ZoomEye

分类:

技术点:

相关文章: