JHU-信息保障分析笔记-全-
JHU 信息保障分析笔记(全)
001:专业方向介绍 🎯

在本节课中,我们将要学习约翰霍普金斯大学《信息保障分析》课程的专业方向介绍。课程讲师将介绍课程结构、核心内容以及学习目标,帮助你了解如何通过本课程提升在信息安全领域的分析能力。
大家好,我是杰森·克罗斯兰。我是约翰霍普金斯大学应用物理实验室的一名高级网络安全工程师。我在JHU怀廷工程学院的继续教育项目中任教,同时也是一名军官。我拥有超过20年的军事委任和文职工作经验,涉及信息保障、管理系统、技术、视觉系统、网络安全工程、射击检测和道德黑客等领域。
我开发了信息保障分析课程,该课程在Coursera平台上被分解为多个专业方向。每个专业方向包含多个模块,通过讲座、阅读材料、视频、作业和讨论来呈现信息保障分析的主题。你可以学习所有专业方向,也可以选择信息保障分析领域中你希望深入了解的部分。
课程目标与内容 📚
上一节我们介绍了讲师背景,本节中我们来看看课程的核心目标与涵盖内容。
信息保障分析Coursera课程探索、识别并描述了适用场景,在这些场景中,应用信息保障分析原则可以提高态势感知、识别、检测、预防和响应能力。课程通过收集数据和应用解决方案来实施保护措施,教授防御战术和版本系统。
你将通过使用理论知识、案例研究、日志数据和用户数据文件以及作业中的视频,学习分析活动。课程将教授构建有效信息保障计划的基本组成部分。
你还将理解并认识到有效的IA原则如何影响政策制定、操作程序、取证研究、数据分析科学、数据分析以及事件响应和处理流程。
以下是课程将研究的各种分析技术:
- 收集
- 方法评估
- 总体估计
- 假设检验
- 实验评估
并且,你将培养用于取证分析的证据链思维。
课程涵盖主题 🔍
上一节我们了解了课程的分析技术,本节中我们来看看课程具体涵盖哪些主题。
课程主题包括但不限于:
- 恶意软件
- 防病毒与漏洞原理
- 物联网
- 人工智能
- 移动应用安全
- 寻址端口网关协议
- 查询、匿名化
- 分布式控制系统
- 通用研究记录类型
- 分析DNS、HTTP、SNTP和TCP协议
课程将进一步研究IT和OT协议弱点及其应对措施,包括:
- WiFi、Zigbee、EMV、Sigfox和Z-Wave
- Modbus、DNP3、Hart、BACnet、ICCP和OPC UA
教学理念与期望 🌟
我的目标是让学习变得有趣、愉快且引人入胜。我将复杂的概念转化为易于理解和应用的可管理学习模块。
我希望学生们能够吸收信息保障分析Coursera平台课程中提供的理论思想和知识,利用讲座、阅读材料、作业和讨论,然后将所学应用到职业生涯中。
我很高兴大家对这门课程感兴趣。感谢你们的关注,希望大家享受Coursera上的信息保障分析课程。祝大家有美好的一天。感谢你们选择Coursera平台学习这门课程。
总结
本节课中我们一起学习了《信息保障分析》课程的总体介绍。我们了解了讲师的资历、课程的结构与专业方向设置、课程的核心目标(即应用分析原则提升安全能力),以及广泛的技术主题和协议分析。最后,讲师分享了他的教学理念,即化繁为简,并期望学员能将理论应用于实践。
002:恶意软件分析入门 🦠
在本节课中,我们将学习几种不同类型的恶意软件及其基本工作原理。目标是能够识别这些恶意软件的行为特征,并具体说明它们的作用和一般运作方式。
木马程序 🐴

上一节我们概述了课程目标,本节中我们首先来看看木马程序。木马是“特洛伊木马”的简称,这是一个老派的术语,指那些伪装成提供某种功能,但实际上具有恶意行为的应用程序。
一个典型的例子曾在第3.6讲中讨论过,即那些自带后门的免费钓鱼工具包。关键在于,木马程序通常会履行它们声称的功能,但在此之外还会执行额外的恶意操作。例如,钓鱼工具包能建立看起来非常逼真的网站,诱骗个人安装本不该安装的应用程序。许多工具包还预设了垃圾邮件机器人,便于攻击者使用。问题在于,除了这些功能,它们还包含后门,允许恶意代码的作者直接侵入系统。在这个案例中,这或许是件“好事”,因为“受害者”本身也是试图伤害他人的人。但大多数情况下,并没有这种“正义”的结局。
木马是一个简单概念的最基本实现:你需要让恶意软件进入某人的系统,并确保他们执行它。大多数恶意软件(如病毒)要造成实际损害,必须被“放行”或安装。因此,攻击者专注于设计完美的骗局,让受害者觉得必须下载并安装这个新软件。就木马而言,攻击者实际上是让受害者自己完成下载和安装的所有工作。

然而,情况并非总是如此。接下来我们将探讨一些无需受害者亲自安装的情况。
网页植入攻击 🌐

HTML 提供了一种植入恶意软件的绝佳机制。我们可以从最简单的 iframe 开始。
以下是其核心概念:
- iframe 是一个 HTML 标签,它可以在网页中打开一个框架。
- 攻击者可以让这个框架指向一个恶意网站。
- 如果结合缓冲区溢出等漏洞,攻击者就能在用户仅仅浏览某个特定网站时,在其系统上执行代码。
另一个无需用户察觉即可安装代码的方法是 跨站脚本攻击。

这是一个经典例子,其基本流程涉及将动态内容(如 JavaScript 命令)发送到原本期望接收纯数据的地方。攻击者实质上是让他们的可执行代码被放入一个“合法”的网站。任何允许他人在其网站上发布内容的站点,都必须确保所纳入的内容不是将在该站点上运行的代码。这是 Facebook 以及所有允许用户发表评论的网站都必须处理的问题。关键在于,当你展示用户发布的评论时,必须在允许这些内容显示在页面上之前,对数据进行“净化”处理。
更值得注意的是,在某些情况下,这种攻击甚至可以编码到 URL 中。例如,上方的这个 URL 片段,我们可以在其中嵌入将被执行的 JavaScript。因此,URL 为攻击者执行跨站脚本攻击提供了极好的途径。
因为许多系统会解析 URL,尝试解释其中的内容。跨站脚本攻击之所以有效,根本原因在于浏览器本身就是一个功能完整的图灵机,它想要执行指令。所以,攻击者只需设法将这些指令传递到你的浏览器和系统并得以执行即可。

所有这些(缓冲区溢出、SQL 注入、跨站脚本)本质上都是关于在期望数据的地方插入可执行代码。我们处理的是控制平面(决定执行什么指令)和数据平面(包含需要存储和操作的数据)之间的重叠。当这两者开始交叉混淆时,就处于非常危险的境地。这就是为什么始终对数据进行净化处理至关重要的原因。
防御措施 🛡️

针对上述攻击的防御措施其实相当简单。
如果你允许他人在你的网站上发布内容,至少应该尝试识别并移除所有带有恶意内容的标签。不要允许人们随意上传未经你检查的随机代码。如果他们得逞,他们就是在利用你的网站进行攻击。你的网站是合法的,但他们已将其变成了恶意实体。因此,采取主动的安全防护方法比被动反应更为重要。如果你能稍微主动一点,仅仅执行移除网站上帖子中所有标签这一步,就能为自己挽回大量声誉,避免许多麻烦,也省去了在发现被黑后不得不清理网站的精力。

社会工程学与诱骗 🎭
现在,让我们从防御讲台下来,开始谈谈恶意软件本身,或者说如何将其传播给他人。这通常需要受害者自己安装,打开门户,并允许其系统以某种方式被你利用。这意味着你需要进行诱骗。这时,了解心理学知识就非常理想了。这本质上就是操纵,是一场骗局,而且往往是一场短平快的骗局。

让我们站在攻击者的角度思考:你想要模仿一个权威人物(无论是友善的还是严厉的),在人们意想不到的地方发起攻击。例如,向某人的个人邮箱或 Gmail 账户发送邮件,诱使他们点击链接,或从你为钓鱼设置的特定网站下载文件。一旦进入他们的系统,当他们开始连接公司 VPN 或内部网络时,你现在就拥有了一台已入侵的、位于目标网络内部的机器。从此,你可以进一步行动。事实上,RSA 攻击就采用了类似模式。攻击者没有针对 RSA 的 CEO 或技术人员,而是针对低级员工,说服他们在自己的系统上安装恶意软件。当这些系统接入公司内部网络时,就成了攻击者向 RSA 服务器发起实际攻击的跳板。
请注意,我们这里讨论的只是几种简单的攻击机制。每当你想要诱使某人做某事时,都可以利用这些方法。操纵并迎合人们的心理是一种非常有效的方式。

我之前提到过,你可以尝试让人们安装他们自己的“更新”——只需假装成官方实体,说“嘿,你需要更新 Adobe”。或者,就像大家还记得的,那些弹出免费病毒扫描程序广告的情况。当然,还有假装成朋友。这是一个久经考验的方法。如果你能伪装成他们的密友,他们就更可能信任你让他们做的任何事情,也更可能照做。
总结 📝

本节课中,我们一起学习了恶意软件传播的基础。总而言之,恶意软件的安装是一场骗局。你需要通过说服和欺骗来让恶意软件得以安装。木马是一种很好的方法,但不是唯一的方法。同样,你可以说服某人你是一个更新程序(即使你根本不是),让他们下载。如果你想做得更巧妙、更隐蔽,跨站脚本和 iframe 漏洞利用就是这类方法。它们试图更隐秘地行动,并试图与合法的内容交织在一起。
003:动态HTTP、XML、SOAP与REST架构 🧩
在本节课中,我们将要学习动态HTTP技术。这包括CGI、XML、SOAP和REST。我们的目标是让你能够理解并讨论动态HTTP的工作原理。回想上一模块,我曾提到HTTP既是我们处理的最简单的协议,也是最复杂的协议。其根本原因在于我们附加到HTTP上的所有额外内容。真正的起点,即HTTP开始变得复杂混乱的时刻,是动态HTTP的发展,以及XML作为通用格式化语言的结合使用。这有效地导致了TCP/IP栈在HTTP内部的复制。结合用于创建动态可调用HTTP站点的各种技术,如SOAP和REST,在本模块中,我们将讨论它们是如何发展的、它们之间的哲学差异,以及它们如何使事情变得复杂。

动态HTTP的基石
上一节我们介绍了动态HTTP的起源,本节中我们来看看其核心机制。动态HTTP的基石是GET和POST消息。更具体地说,是GET和POST消息中包含参数这一事实。根据你使用的消息类型,这些参数要么编码在URL中,要么作为消息本身的一部分发送。这尤其强调了HTTP的无状态性。通常当我们谈论HTTP时,我们说它是一个无状态协议。这意味着每次你发送一个HTTP请求,所有必要的信息都包含在该请求中。对于GET请求,这些信息是明确可见的。例如,如果你曾经使用过书签小工具,它们会告诉你“收藏此页”以便能够调用网站并执行某些功能,这就是通过GET完成的。你所做的就是创建了一个包含特定参数的书签。
我们可以通过查看一个动态网页来理解这一点。





我在这里查看的页面是众多CGI bin测试站点之一,它并不比其他站点特殊。然而,我想展示的是实际的动态元素是如何工作的。你会注意到上面的命令echo后面有一个问号,它将URI与参数分隔开,然后是一堆赋值、提交按钮、文本字段等。你可以看到这些在查询字符串中被精确复制了。
此外,你还会注意到我们讨论过的其他一些东西,例如用户代理字符串在这里。还有引用来源。然而,关键是你可以在那里看到动态元素。这里的这个值被传递下来并存储在这里的这个值中。这个东西所做的只是显示值,但你同样可以设置它来做一些动态的事情,比如修改文本、反转它或开始玩Galaga克隆游戏。


CGI:动态HTTP的第一个标准


理解了GET和POST的参数传递后,我们来看看第一个正式的动态HTTP标准。动态HTTP的第一个真正标准是CGI,在RFC 3875中定义。CGI代表通用网关接口。这是动态HTML的“T型车”。CGI的工作方式是:GET或POST中发送的参数作为环境变量传递给一个shell脚本。因此,需要理解的重要一点是,CGI本身不是一种语言或技术。它是一种解析URL、提取信息,然后将其作为环境变量传递给另一个应用程序的方式。
这恰好是Perl语言的增长点。事实上,很多早期的CGI bin都是用Perl编写的,Perl和Web确实是携手发展的。然而,Perl是一种非常糟糕的语言,不适合做任何严肃的事情。如果你曾尝试维护Perl代码,那么你既知道这一点,也值得同情。这种情况在90年代末、21世纪初加剧了,当时每个人都在构建自己的网络浏览器,比如Internet Explorer、Netscape、Firefox、Mozilla、Opera、Safari、Links、W3等。每个浏览器都以略微不同的方式渲染HTML。例如,IE在表格构造方面往往非常宽松,而Netscape对语法要求更严格。
这导致了动态架构的使用,我们称之为CMS(内容管理系统)。内容管理系统允许你将任务分开,让开发人员专注于开发,让编写页面的人专注于页面,而不必担心开发的细节。这些细节的驱动因素之一是,正如我所说,我们有许多不同的浏览器,必须为不同的浏览器进行略有不同的渲染。如果你只想做一个表格,情况已经够糟了;如果你想做任何涉及JavaScript的事情,就必须进行极其复杂的配置操作。
因此,CGI这种临时凑合的方案逐渐消亡,被像PHP、Django这样的架构所取代。与此同时,JavaScript本身也从一种非常简单的存储变量技术,最终发展成为成熟的ECMAScript,成为一种相对成熟的编程语言。这导致了AJAX环境的出现,JavaScript、XML等所有这些东西协同工作。
以下是关于内容管理系统的一些关键点:
- 功能:它们通常与Web服务器绑定,但许多会包含自己的Web服务器。市面上有各种工具,如PHP、Django、Rails、Zope、MediaWiki、DokuWiki等。
- 核心优势:CMS与临时凑合的CGI脚本的关键区别在于,它们管理不兼容性,并将内容与呈现分离。这是一个关键特性。没有这种分离内容与呈现的能力,你必须自己编写所有这些东西,开发所有功能,并时刻跟踪浏览器不断进行的所有微小更改。
- 插件架构:关于这些系统需要记住的另一件事是,它们具有插件架构来支持功能。例如,如果你要进行图形可视化,可以为Django获取一个插件来支持科学可视化。如果你想创建一个留言板,它们都有可以为你创建留言板的插件。
模块化架构与安全隐患
上一节我们介绍了CMS如何简化开发,本节中我们来看看这种模式带来的复杂性。关于这一切,它确实打破了经典的客户端-服务器模型。在你的经典客户端-服务器模型中,你有一个客户端,它基本上只能与服务器通信;还有一个服务器,它完成所有工作。现在,计算被分散到各个地方。有些由服务器完成,有些由CMS完成,有些由浏览器完成,有些由数据库完成,有些由插件完成。因此,我们创建了这个极其复杂的模块化架构,坦率地说,它充满了漏洞。


这些不同的椭圆中的每一个都可能拥有自己的漏洞家族,其中一些漏洞只有在它们相互交互时才会真正发生。
当我谈论所有这些事物中的漏洞时,还存在一个我们可以在工程世界中称为“零件清单”的问题。理论上有很多选项可用。我的意思是,如果你想,你可以编写自己的留言板软件。然而,在实践中,通常只有少数几种实现。当我在研究生院从事卫星设计工作时,我曾有过一个令人心碎的时刻,当时我意识到我所有的机械工程训练都毫无意义,因为卫星只有四种发动机类型可用,而且没有人会再制造另一种。所以只有四种选择。许多这些动态技术的情况非常类似,因为存在插件架构,某些插件成为默认选择,你会一遍又一遍地看到它们。攻击者知道这一点,他们知道某些应用程序很常见,他们会寻找针对这些应用程序的攻击。

我们实际上所做的是在计算之上重建计算。我的意思是,在过去的30年里,模块化软件一直是开发社区的圣杯之一。有几十种技术:套接字、RPC、DCE、CORBA、RMI、MOM。我们现在谈论的是Web服务,我们正在再次重建软件和服务。
XML:通用数据格式
那么,这次有什么不同呢?最大的不同是XML。首先,让我告诉你,XML并不能为你解决问题,它只是重新格式化了问题。XML是SGML(标准通用标记语言)的一个有限重新实现或有限约束版本。XML相对于SGML的优势在于XML是可理解的。它是纯ASCII文本,基本上看起来像HTML,具有这种简单的分隔标签格式。另一方面,它会占用巨大的空间。



那么,XML有什么令人兴奋的呢?在XML出现之前,如果你想在系统之间来回传输信息,你必须自己想出数据将如何来回移动的定义。在XML中,你创建一个DTD(文档模板定义),然后,任何可以访问该DTD的东西都知道如何处理你来回传递的数据。所以一旦我们有了这个,我们就有了在网络上的服务器或主机之间发送消息的方法,这样它们就能相互理解。现在你可能会想,我不能只用CGI做这个吗?问题在于,CGI你只是发送信息,你不知道这些信息意味着什么。XML帮助你定义这些信息的含义。这当然引出了下一个问题:那么我们如何通信呢?如果是在1992年,我会使用套接字,或者使用DCE,或者微软那周称之为ActiveX的任何东西。

但现在我们有了HTTP,端口80是开放的。为什么端口80是开放的?我们别无选择。一切都通过端口80。所以我们可以做的是,开始讨论使用HTTP来回发送XML消息。这导致了端口80成为今天巨大的信息高速公路。现在,当我们审视信息安全时,实际上我们创建了一个巨大的堡垒,有防火墙、守卫、保护、护城河,然后我们建造了一条八车道的高速公路,称之为HTTP,并让它直接穿过房子的中间。
我们在HTTP上重新实现了一切,我们引入了全新的不安全领域。有像Quadraasesis、Reactivity和Checkpoint这样的各种公司,它们正试图在HTTP上创建防御,因为HTTP既简单又方便。
我们构建了HTTP这个超级服务,我们在HTTP之上构建了一个全新的TCP/IP栈。如果你曾经使用过像Citrix这样的东西,Citrix允许你在HTTP上进行客户端-服务器会话。与此同时,HTTP不仅是一堆协议的调解者,而且一堆协议实际上就是HTTP。例如BitTorrent,用于与跟踪器通信的协议就是HTTP,它是一个CGI脚本。

SOAP:基于XML的远程过程调用
因此,大约在这个时候,某个聪明人(这个聪明人很可能是Dave Weiner)意识到,嗯,我可以这样做:与其发送这种自定义格式的数据,既然每个人都在开放端口80,我就编写一个发送XML的东西,它接收XML作为POST中的数据,并用XML响应。然后我就可以发送命令,我可以用XML实现远程过程调用,这就是SOAP(简单对象访问协议)。Web服务器现在可以使用XML来调解远程过程调用。



于是,SOAP,下一个RPC,杀死了CORBA。如果你在2001年或2002年左右四处看看,你会读到很多关于CORBA的东西。CORBA是公共对象请求代理架构。CORBA是一种极其复杂和精密的协议,它允许你远程访问不同机器上的对象,并通过发送远程调用来操作它们。所以CORBA标准是令人生畏的。与此同时,几个人凑在一起,拼凑出这个基于XML的通信标准。突然间,每个人都在做像Google Maps、MapShops这样的事情。还有Walk Score,那些告诉你附近有多少墨西哥卷饼摊的东西。所有这些都由XML调解。这之所以有效,基本上是因为XML RPC将所有任务都推回给了开发人员。开发人员基本上被告知网站的API,这是API的调用方式,你如何找到这个。每个网站都想办法告诉你。没有安全检查,没有反射,没有完整性检查之类的。你可以编写这个。如果出了问题,上帝也帮不了你。但它编写起来非常快,一个XML调用,一个XML响应。而CORBA则在耻辱中消亡。

REST:表述性状态转移
这导致了一种我们称之为REST(表述性状态转移)的范式。REST是那种奇怪的野兽,它并不是一个真正的API,更像是一个用于无状态传输信息的框架。所以它更像是一种“如何做”的API指南。特别是Google,一直在广泛使用REST来创建工具,例如我在这里使用REST创建的动态图表。这是Web 2.0的开始:XML消息,以及那些动态到实际上只是API的网站。


截至去年,这一发展的顶峰是Facebook的Graph API,你可以通过来回发送XML消息来基本上操作整个Facebook系统。
面向服务的架构与信任问题


那么,这些是做什么的呢?关键点在于,这些都是面向服务的架构,它是一个移动的目标,也是一堆字母缩写:RPC、XML、SOAP、Graph API。所有这些都将网站转变为基于XML的数据库前端。你通过XML进行通信,基本上你不是去抓取页面,而是在生成函数。一个关键点是,许多信任问题由服务器本身处理。你可能已经注意到的一件事是,例如,最近查看评论网站时,它们开始利用规模经济。所以过去拥有自己评论认证系统的网站现在只使用Facebook。所以正在发生的是,我们开始看到其中一些网站成为通用网关。这意味着什么?这样看:如果你访问一个网站,它在角落里为你拉取一些Facebook信息或一些Google信息,这意味着你访问了Google。这意味着他们知道,这意味着Google知道,你刚刚访问了那个网站。有一个来回的引用。有一些像Google和Facebook这样的网站,我毫不怀疑,你查看的每两个网页中就有一个涉及与它们的通信。

总结

本节课中,我们一起学习了动态HTTP技术的演变。我们从CGI这个最初的动态网页标准开始,了解了它如何将参数传递给脚本。接着,我们探讨了内容管理系统如何通过分离内容与呈现、管理浏览器兼容性以及提供插件架构,解决了CGI的许多问题,但也引入了复杂的模块化架构和安全隐患。然后,我们深入了解了XML作为一种通用数据格式,它如何为数据交换提供结构定义。在此基础上,我们学习了SOAP如何利用XML和HTTP实现远程过程调用,从而简化了分布式计算。最后,我们探讨了REST作为一种无状态通信框架,以及面向服务的架构如何将网站转变为API,并带来了新的信任和隐私挑战,例如通过Facebook和Google等通用网关进行的大规模数据交换。
004:网络钓鱼攻击 🎣

在本节课中,我们将学习网络钓鱼攻击的原理、实施步骤以及防御者面临的挑战。网络钓鱼是一种通过伪装成可信实体来诱骗受害者泄露敏感信息(如密码、账户信息)的攻击方式。
攻击准备与实施
上一节我们介绍了网络钓鱼的基本概念,本节中我们来看看攻击者如何具体准备和实施一次钓鱼攻击。
网络钓鱼攻击分为两个阶段。第一阶段是发送包含指向攻击者控制网站的链接的垃圾邮件。第二阶段是受害者点击链接,被引导至一个旨在窃取信息的伪造网站。
因此,为了使攻击成功,攻击者需要让网站和电子邮件看起来合法可信。

首先,攻击者需要找到一个地方来托管钓鱼网站。显然,他们不希望使用自己的机器。正如在之前的课程中提到的,目前存在多个列出当前存在漏洞的网站列表。攻击者会入侵其中一个,并将其用作钓鱼网站。如果行动迅速,这个网站甚至不会被任何人怀疑,因此邮件服务器常用的黑名单上不会有该网站的记录,从而不会封锁该网站。
此外,如果我们在那里设置服务器和钓鱼网站,由于该服务器没有不良声誉,基于网络的过滤也可能失效。因此,攻击模式是:先入侵一个脆弱的服务器,然后利用它通过钓鱼攻击入侵更多人。有证据表明,攻击者确实会利用声誉良好的服务器来建立钓鱼网站。
以下是关于攻击者选择宿主服务器的分析:


这里有两张图。左边的图代表了当前被报告的钓鱼网站与僵尸网络的交集。右边的图代表了钓鱼网站与常用报告列表的交集。X轴是前缀长度(用于最大匹配),Y轴是网络区块的总数。可以看出,之前被报告为钓鱼网站、现在又是僵尸网络一部分的服务器,其交集远高于随机情况。而被报告为钓鱼网站的服务器,与僵尸网络的交集则较低。
原因很简单:攻击者希望使用那些仍然拥有良好声誉的服务器来建立钓鱼网站。一旦这些服务器失效,不再适合用于钓鱼,它们就会被用作僵尸网络进行其他活动。
网络钓鱼的商业模式与目标
了解了攻击的实施方式后,我们来看看驱动这些攻击的动机和目标。

需要理解的是,网络钓鱼在很大程度上是一门生意。运营钓鱼攻击的人通常并不关心具体攻击谁。和任何其他生意一样,其复杂程度也各不相同。顶端是有组织的犯罪集团,底端则是使用免费钓鱼工具包的人。这些免费工具包通常质量低劣,攻击者需要付出大量努力才能建立起有意义的攻击,并且他们往往在第一轮垃圾邮件过滤中就被拦截。
然而,这里有一个有趣的转折。在《没有免费的钓鱼》一文中,Cova及其同事解释了免费钓鱼工具包通常包含后门,会反过来入侵钓鱼者自己的系统。因此,这些试图利用他人的、毫无经验的钓鱼者,在安装这些“精良”的钓鱼软件时,自己反而成了受害者。


那么,钓鱼者在追求什么呢?很简单:凭证。通常是小额账户,因为大多数钓鱼受害者并不富有,因此直接入侵他们的账户本身价值可能不大。真正的价值在于密码。由于人们倾向于在多个网站上使用相同的密码,获取一个密码可能比获取个人信息更有价值。如果他们入侵了你一个账户的密码,那么很可能也入侵了你80%甚至所有账户的密码。这就是他们的目标。


此外,还存在一种网络钓鱼的子类别,称为鱼叉式网络钓鱼。鱼叉式网络钓鱼其实就是定向钓鱼。攻击者发现了关于特定目标的某些信息,并利用这些信息试图入侵这个特定目标。例如,美国在2010年遭受了一次重大的鱼叉式钓鱼攻击,此前一年也有针对西藏活动家的攻击。现在,这类事件在新闻中已屡见不鲜。
攻击者的伪装与隐藏技术
在明确了攻击目标后,我们接下来探讨攻击者如何巧妙地隐藏自己,使攻击更难被察觉。

网络钓鱼最致命的一点在于,它经常使用名称操纵技术。一个有趣的现象是,攻击者会使用像西里尔字母这样的字符进行替换。例如,西里尔字母中的“A”看起来很像标准拉丁字母中的“A”。钓鱼者会利用这一点,使他们的URL看起来与你期望的一模一样。

以下是几种简单的欺骗方式:
- 在电子邮件中放置一个超链接,显示文本是“ebay”,但实际的链接地址指向一个恶意网站。这是最简单的方法。
- 使他们的URL看起来几乎合法,但实际指向他们自己的域名。例如,
www.ebay.com.evilsite.com。 - 使用重定向,声称将带你前往一个网站,但随后立即将你弹到另一个网站。


除了简单的名称操纵,钓鱼者还有其他巧妙的方法来隐藏他们的活动地点。例如快速通量技术。这非常有趣:一个域名被分配给多个IP地址,并且每个IP地址的分配时间都非常短。这意味着受感染的用户不是全部前往一个主机,而是前往大量不同的主机,并且这些主机还在不断变化,它们都托管着相同的恶意软件或再次重定向到另一个托管地点。这使得追踪变得非常困难。

像Rock Phish这样的组织就使用了类似的技术,这是一套复杂的组合拳。他们使用网站作为代理来隐藏真正的指挥服务器,进行了各种有趣的DNS操纵。但归根结底,他们是在托管一个恶意网站,并且这个网站不断跳转,使得追踪活动、弄清发生了什么变得非常困难。简单的趋势分析技术,例如寻找流向一个或一组特定站点的流量,可能无法产生好的结果。事实上,大多数时候,这对我们来说效果不佳。
防御挑战与应对策略

面对如此狡猾的攻击技术,防御者面临着严峻的挑战。本节我们将分析这些挑战以及可能的应对策略。
为什么攻击者需要在命名上使用更奇特的技术?核心问题在于黑名单机制。攻击者为已知被入侵的主机支付的成本更低。正如在本讲第三张幻灯片中所示,如果一个服务器已经被标记为僵尸网络的一部分,你就不希望再把它用作钓鱼网站,因为它已经被识别了。
我们的核心问题是,我们采用的是黑名单而非白名单策略。因此,我们正处在一个需要不断添加所有被入侵服务器的境地,并且还得想办法在它们恢复后将其从名单中移除。你怎么知道一个曾经是坏的东西现在变好了?更重要的是,你怎么知道它现在变好了以后不会再变坏?我们面对的是一个开放的系统,由构成互联网的各种协议组成。构建有效的白名单远比决定尝试阻止过去做过坏事的东西更具挑战性。

通常,判断你是否是一个钓鱼网站的最简单方法是有人会告诉你。如果你被入侵并被用作钓鱼网站,网上会有很多站点开始大声疾呼。有很多公开的黑名单可供查询,你可以检查你的所有IP信息,看看你的网站是否已被入侵并正被用于钓鱼。

那么,你怎么知道自己被钓鱼了呢?去易趣网看看?不,你通常不会知道自己“被约会”了。在这种情况下,通常会有别人告诉你:你的银行可能会突然打电话给你,或者有人打电话告诉你你的账户已被清空。这类事情是发现被钓鱼的最简单方式,当然,这也是最糟糕的情况。

因此,最佳行动方案是对收到的所有电子邮件保持高度怀疑,并首先努力避免被钓鱼。
总结
本节课中我们一起学习了网络钓鱼攻击的完整链条。总结来说,网络钓鱼攻击者是为了赚钱,而不是为了搞破坏。他们试图获取你的账户信息和密码,并尽可能多地在不同地方使用这些信息。他们会撒下尽可能大的网,因为只需要有一定数量的人点击链接、访问网站并输入他们的账户信息即可成功。攻击者并不指望每个人都点击他们的链接。
因此,攻击流程就是:购买一个尚未出现在任何黑名单上的、新近被入侵的僵尸主机,建立站点,制作一个看起来合法的网站,制作一个高效的垃圾邮件发送器,向所有人发送垃圾邮件,然后坐等人们上门并提供他们的用户信息。


005:基础HTTP协议 🧩
在本节课中,我们将要学习HTTP协议的基础工作原理。HTTP是一个看似简单甚至粗糙的协议,却意外地成为了当今互联网上最重要的协议。我们将了解其数据传输方式、状态码的含义以及可选头部字段的使用。
HTTP的起源与背景 🌱
上一节我们介绍了课程目标,本节中我们来看看HTTP的起源。HTTP是“超文本传输协议”的缩写。HTTP和HTML(超文本标记语言)由欧洲核子研究组织的研究员蒂姆·伯纳斯-李于1990年开发。CERN和许多美国能源部的超级计算中心是万维网的无名英雄,早期的许多网络开发工作都在那里完成。
伯纳斯-李创建了一个非常精简的超文本版本,旨在快速共享研究论文。虽然我们常在网络语境下谈论超文本,但从超文本理论家的视角看,HTML是一种非常原始的超文本形式。网络环境中的一个主要问题是链接可能是单向且可能失效的,而理想的超文本环境中的链接是双向且指向确定存在的资源。
HTTP的简单性演示 🖥️
了解了HTTP的背景后,本节我们通过手动操作来展示HTTP的简单性。我将演示一个简短和一个较长的HTTP会话。

通过telnet命令连接到cnn.com的80端口(HTTP默认端口)。连接建立后,输入GET /命令,服务器会返回一个网页。例如,可能会收到301 Moved Permanently的状态码。

同样,连接到nytimes.com并输入GET /,会收到一大段HTML代码,这就是《纽约时报》的主页内容。这表明仅通过输入简单命令即可完成HTTP会话。
HTTP协议规范与模型 📜
上一节我们手动进行了HTTP通信,本节中我们来看看其官方规范。HTTP协议由一小部分RFC文档定义。核心规范是RFC 2616,它定义了HTTP/1.1。另一个关键的安全相关文档是RFC 4229,它定义了大量HTTP头部。
由于HTTP协议简单原始,人们很快开始为其添加功能,并用它替代互联网基础设施的其他部分。这也导致了协议中存在许多特定于服务器和实现的特性。
HTTP基于一个非常简单的 “打开-请求-响应-关闭”模型 运行。客户端打开一个到服务器的TCP连接(目标端口通常是80或8080),发送一个请求消息,服务器返回响应,然后连接关闭。
HTTP/1.1增加了旨在提高吞吐量的功能,如会话持久性(可以在一个连接上发送多个请求-响应对)和管道化(可以一次性发送多个请求,然后一次性接收多个响应)。然而,在现代交互式网络环境中,管道化并不常用,因为后续请求往往依赖于前一个响应的内容。
HTTP请求详解 🔍
上一节介绍了HTTP的通信模型,本节我们深入看看请求的构成。一个HTTP请求由三个关键部分组成:方法、URI和协议标识符。
- 协议标识符:通常是HTTP/1.0或HTTP/1.1。
- URI:通常被称为URL,是你试图访问的数据地址。
- 方法:客户端试图在服务器上执行的操作类型。
RFC 2616列出了9种方法。在现代网络中,我们主要过度使用其中两种:GET和POST。
GET方法用于获取页面。它允许通过URL传递参数,格式是在URL后附加?key1=value1&key2=value2。GET本质上是无状态的。POST方法用于提交表单数据或发送消息。它通常用于发送大量数据(超过64KB)。
GET请求的一个例子是访问一个带有查询参数的网址,例如 http://www.speedguide.net/port.php?port=155。更改port=后面的值,页面内容会动态变化。

URI、URL与URN 📍

我们一直在谈论URL,但在规范中更准确的说法是URI。URI是“统一资源标识符”,它是一个更广泛的概念,包含了URL和URN。
- URL是“统一资源定位符”,表示资源在空间中的位置。
- URN是“统一资源名称”,旨在作为一个永久名称,例如ISBN号或社会安全号码。
URI的格式遵循协议:路径的约定,路径的构造方式由协议定义。例如:
mailto:president@whitehouse.gov属于邮件协议。http://www.example.com/path/to/page则使用斜杠表示路径,通常对应文件系统。
在HTTP中,我们处理的是URL。一个HTTP URL由http://、主机名和路径组成。注意主机名,许多HTTP服务器是虚拟主机,即一台物理机器通过不同的主机名托管多个网站,这通过HTTP头部中的Host字段实现。
HTTP头部:协议的“调味剂” 🧂
HTTP本身是一个原始简单的协议,其复杂性来自于头部的使用。头部是可选的键值对,在客户端和服务器之间传递。RFC 4229指定了一个很长的列表。
以下是四个至关重要的头部,它们是网络的“粘合剂”:
- Host:你正在通信的主机的完全限定域名。对于托管多个网站的服务器(虚拟主机),此字段用于确定客户端想访问哪个网站。
- Referer:你到达当前页面所来自的页面的地址。服务器可以用它来追踪访问路径或控制资源访问(例如,防止直接链接图片)。
- Cookie:由客户端维护的持久性信息片段,用于与应用程序保持长期一致的关系(例如,身份验证令牌)。
- User-Agent:标识你的浏览器的字符串。由于不同浏览器存在细微的不兼容性,服务器需要根据此信息调整页面渲染方式。
HTTP响应与状态码 📨
你的请求会得到一个响应。响应由状态行、一组头部和数据组成。需要再次强调,HTTP本身非常简单灵活,复杂性来自头部。
状态行包含一个三位数的状态码。状态码分为5大类:
- 1xx:信息性状态。
- 2xx:成功。最重要的是
200 OK。 - 3xx:重定向。常见的有
301 Moved Permanently和302 Found。 - 4xx:客户端错误。最重要的是
401 Unauthorized(需要认证)和404 Not Found(资源未找到)。 - 5xx:服务器错误。
响应中重要的头部包括:
Content-Length:响应体的长度(字节)。Set-Cookie:服务器指示客户端存储信息。Location:用于重定向,指示客户端应前往的地址。Server:服务器类型标识。Refresh:指定页面重新加载的时间。
401状态码是一个有趣的例子。它意味着需要用户名和密码才能继续。在浏览器中,这会弹出一个密码对话框。然而,HTTP基本认证(401)的安全性很差,因为用户名和密码是以Base64编码(近乎明文)在请求中发送的。你永远不应该在生产环境中使用这种认证方式,它常见于一些嵌入式设备(如无线路由器)的管理界面中。
总结 📝

本节课中我们一起学习了HTTP协议的基础。核心要点是:HTTP协议本身非常简单,但其强大的灵活性来自于请求和响应中可传递的各种头部字段。正是这种简单性和灵活性的结合,使得HTTP能够支撑起整个现代网络,同时也带来了许多安全和管理上的挑战。理解这些基础是进行信息保障分析的基石。
006:服务器攻击技术 🛡️💻
在本节课中,我们将学习针对服务器的攻击技术。我们将探讨攻击者如何利用各种机制(尤其是通过HTTP协议)来破坏或控制服务器。课程将涵盖密码破解、次级访问、SQL注入等常见攻击手段,并解释其背后的原理。

服务器攻击概述
服务器攻击的目标是破坏或控制服务器。这类攻击通常以HTTP协议作为攻击向量。本模块内容更侧重于破坏HTTP服务器本身,而非仅通过HTTP发起的攻击。这些攻击都属于同一领域,并会使用多种工具。
传统服务器接管方式
上一节我们介绍了服务器攻击的总体概念,本节中我们来看看历史上经典的服务器接管方式。传统上,接管Web服务器的方式并非直接攻击Web服务器本身。
经典的方法是攻击网站。正如我在模块32中提到的,网站最初是本地文件系统上的目录。这意味着,当你想修改网站时,你需要通过FTP传输文件。如今,这仍然在一些非常基础的低端主机托管服务中使用,但内容管理系统(CMS)已经接管了大部分此类职责。
然而,这意味着承载Web服务器的IP地址上实际上运行着多种服务。它可能是一个数据库客户端(通过端口1521和1434通信),一个FTP服务器,一个SSH服务器,一个SMTP客户端,也可能是一个Web客户端。所有这些服务都可能运行在同一台机器上,并且都可能成为攻击的入口点。特别是SSH、FTP和数据库服务,它们都容易受到密码攻击。
因此,当我们谈论Web服务器时,实际上是在谈论围绕它的一系列服务。当我们谈论服务器防御时,我们指的是检测诸如次级访问之类的事情。你需要监控和审计这些活动。为此,你需要某种形式的流量监控。在模块4中,我们将广泛介绍NetFlow,这是实现此目的的经典方法之一。你也可以查看服务器本身的日志,但这样做的问题是,你永远无法判断是否有人只是探测了你,因为除非你建立了实际的服务器会话,否则不会生成服务器日志。
以下是识别攻击者的几种技术:
- 新IP地址:访问服务器的用户通常来自可预测的地点。我不会从任何随机位置更新我的网站,我通常只在固定的几个地方操作,例如办公室、家或本地咖啡店。
- 寻找笨拙行为的证据:如果有人在服务器上漫无目的地浏览,例如只是查看文件、寻找文件或尝试访问不存在的文件,这通常表明有人在探测,而不是在寻找他们已知存在的东西。
密码破解攻击
上一节我们讨论了如何识别攻击者,本节中我们来看看最经典的服务器接管方式:密码破解。
密码破解仍然是接管主机的非常有效的方法,因为人们倾向于使用相当可预测的密码。如果你要求用户设置至少6个字符且必须包含数字的密码,你会发现很多人使用“123456”作为密码。
此外,请记住,许多应用程序确实存在默认密码。因此,当你设置一个应用程序时,如果攻击者知道默认密码,你可能就在安装一个安全漏洞。
内容管理系统(CMS)与攻击


除了密码破解,还有其他接管服务器的方式。我之前提到CMS作为FTP的替代品。但CMS本身也存在安全漏洞。
CMS通常提供许多历史上需要通过多种服务才能实现的功能。它们提供上传功能、账户管理、脚本支持。通常,CMS内部还有自己的管理权限结构。这可能导致问题。
有一个非常常见的内容管理系统叫做PHP-Nuke。它是一组PHP脚本,允许你构建一个经典的LAMP系统。

“LAMP”这个术语大约在五年前流行,也就是在Ruby on Rails和Django框架兴起之前。它指的是Linux、Apache、MySQL、PHP。这是经典的、可扩展的系统。PHP当然是一种网页脚本语言。LAMP基本上是一个用PHP实现的内容管理系统,附带一个包管理器,允许你加载各种模块。它非常易于扩展,但也长期以不安全而闻名,以至于至少有一个PHP-Nuke的分支项目——Zula——是纯粹出于安全考虑而创建的。

例如,如果你查看PHP-Nuke中的admin.php脚本,你会发现它实际上在每个消息中都传递了管理员名称、权限和权利。这是一个已知的漏洞,因此所有这些信息都必须通过路由传递,并且很容易被篡改。
SQL注入攻击
上一节我们讨论了CMS内部的攻击,本节中我们来看看另一种更常见的基于Web的攻击形式:SQL注入。

SQL注入是当前非常常见的攻击向量,在我看来,它也是无限制字符串求值危险性的一个很好的例子。以下是SQL注入的工作原理:
假设我有一个网站,出于对华夫饼的痴迷,就叫它Waffle.net。网站上有一个脚本,假设是fix_food.php。这个脚本具体做什么并不重要,它接收两个参数:一个ID和一个A。如果我想以某种方式“修复”华夫饼,我就会调用这个脚本。
该脚本会被翻译成一条SQL语句。例如:
UPDATE foods SET name='waffles' WHERE id=3
攻击者想要破坏这条语句。他的做法是,在你本应进行更新的地方,他通过字符串注入了一个终止符和一个实际的SQL命令。你会注意到代码中的两个破折号--,这在SQL中表示“此行之后的内容是注释”。

因此,这条命令现在不再是“更新foods表,将id为3的记录的name设置为waffles”,而是变成了:
UPDATE foods SET name='waffles'; SELECT name, password FROM admin; --
它执行了第一条更新语句(这可能无关紧要,可能只是产生乱码),但它还有另一条命令要执行:从admin表中选择name和password,后面跟着注释,所以前一条语句被终止了。
结果就是,攻击者注入并截断了原始的SQL命令,然后在后面添加了另一条命令。最终,输入被翻译成了多条SQL命令。
SQL注入的原理与防御
SQL注入的“魔法”依赖于几件事:
- 变量净化不充分。
- 使用双破折号
--注释,这用于指示其后的所有内容都可以被忽略。 - 人们忘记对所有输入进行净化。以PHP-Nuke为例,它曾有一个净化问题,即不断将HTTP Referer标签作为参数传递。因此,攻击者只需将SQL注入代码放入Referer标签即可发起攻击。

关于SQL注入,需要记住的关键点是:SQL注入是注入任意SQL语句。因此,你会看到SQL注入攻击使用最无害的变量作为攻击向量,因为攻击者只关心他们提供的变量内容会被直接传递给SQL语句。例如,已加载页面数量的计数器。
我将“不充分”加了引号,因为净化工作很难。当你查看一次SQL注入攻击时,你实际上看到了多级重定向:URL本身、JavaScript、CGI-BIN接口、内容管理系统、CMS使用的脚本语言,以及SQL。你必须在某个环节进行拦截。如果攻击者足够聪明,他可以利用系统的不同部分在不同层级为他处理一些求值和解析工作。攻击者会操纵文本来达到目的。
另外要记住的是,SQL注入真正伤害我们的地方在于,它是在对一个通用的HTTP请求进行操作。它基本上是将一些值放入某个东西中并运行eval(求值)。一般来说,eval是危险的。尽量避免在用户输入附近直接运行代码。

攻击者如何寻找目标
攻击者如何攻击网站?他们做的第一件事就是寻找漏洞。
最好的方法是使用谷歌。例如,如果我想寻找一个使用PHP-Nuke的网站,我只需让谷歌为我搜索“PHP Nuke”,然后找到一系列网站。我这里有一个例子,是寻找包含我可以探测的cgi-bin目录的网站。
通常,攻击者会直接寻找特定的URL。他们只会运行自动请求常见URL的机器人程序。这里的关键点是,大多数时候攻击者并不关心网站本身。他们寻找的是可利用性。因此,他们会寻找关于cgi-bin或nuke(PHP-Nuke目录)的目录,寻找公开的Perl或Python脚本等。
总结与核心安全理念


在本节课中,我们一起学习了攻击者用于接管网站的各种机制。
当你审视这些服务时,请将它们视为安全漏洞。它们确实提供了额外的功能,但当然,这样做也打开了系统被利用的大门。

最后,另一件需要记住的事情是:文本解析和求值是危险的。我坚信我们遇到的大多数安全问题都属于有限的几个类别,其中一个重要的类别就是混淆了控制平面(我们如何做事)和数据平面(我们正在操作的信息)。SQL注入、缓冲区溢出都是这方面的例子。任何将数据字符串视为命令(而不再是数据)的情况都会导致风险。这就是我们在SQL注入攻击中看到的情况。
007:漏洞与恶意软件信息源 📚
在本节课中,我们将学习如何获取关于漏洞和恶意软件的信息。课程结束时,你将能够列举一系列提供漏洞和恶意软件信息的来源,了解它们的用途和局限性,并描述关联不同信息来源的困难。

我们经常需要处理漏洞和恶意软件的各种命名。

有多种索引和技术说明可用于追踪这些信息。问题恰恰在于追踪这些信息的索引和技术说明种类繁多。这有点像其他标准的情况。标准的“好处”在于有太多可供选择,它们做着完全相同的事情,而每个人都会围绕某个特定标准形成自己的小阵营。那么,为什么这方面会有所不同呢?你会看到很多情况,人们使用特定的命名约定,并希望坚持这些约定,他们不会让任何其他数据源来规定他们自己的命名方式。这往往会成为一个问题,但也意味着它们各自在做事方式上都非常可预测。
在深入探讨定义漏洞和利用的不同方式之前,我们需要先明确一些定义。在尝试获取与漏洞和利用相关的信息时,你会看到一个常见说法,即术语使用上的松散性。因此,让我们在这里保持简单。
术语定义
当谈论容错时,你会用到诸如缺陷、故障和失效这样的术语。



而在谈论网络安全时,你真正需要谈论的是漏洞和利用。其中,漏洞是一个可被敌对方利用以夺取控制权的缺陷。利用则是利用该漏洞以夺取控制权的工具或机制。

这是两个略有不同但又紧密相连的概念。我将恶意软件称为包含一个或多个利用的应用程序。漏洞是一种缺陷,但缺陷不一定是漏洞。例如,缓冲区溢出可能不会给攻击者带来任何好处,只有攻击者才能利用它。

漏洞信息来源
我们能够成功地对缺陷和漏洞进行分类,也能在一定程度上对特定的利用进行分类。但在准确判断恶意软件包具体使用了哪些漏洞方面,我们有时会遇到困难。
每个主要且负责任的发布商都会提供关于其当前缺陷或漏洞的技术说明。通常,这些说明与补丁相关联。
以下是主要操作系统供应商的列表。需要注意的是,这些信息源对我们和攻击者来说都是很好的资源,因为它们提供了可能被利用的路线图。如果用户没有留意这些网站的警告,他或她就可能成为勤奋攻击者的潜在受害者。请记住,你必须实际更新系统,才能免受利用特定漏洞的攻击。但并非每个人都能始终保持必要的警惕性,这就是为什么攻击者仍然可以利用这些信息来设计确实有效的攻击。

除了供应商,其他组织和机构也会跟踪漏洞状态。其中一些是政府明确授权这样做的,例如 FFRDCs 等。


另一些则是独立的组织,它们这样做是为了推动网络安全研究和整体网络安全运营。熟悉这些来源以及供应商网站的信息是一种好习惯。它们之间会有重叠,但并非完全重叠,你将从每个来源获得独特的信息。


现在,让我们更具体地了解一些信息来源。

具体信息源
CERT 会发布一系列公告,可以在顶部显示的 URL 找到。这是 CERT 的任务之一,即报告并随时记录这些信息。这项工作由 US-CERT 完成,它充当了漏洞信息的中央交换中心。US-CERT 发布的公告数量相对较少,大约每月三到四个,但这些往往是“重磅”消息。这里所说的“重磅”,指的是那些可能在极短时间内影响最多人群的漏洞。


接下来是 CVE,可以在显示的 URL 找到。CVE 旨在为每个重要的漏洞分配一个编号。当你发现一个漏洞时,你可以向 CNA(CVE 编号机构)请求一个编号。CVE 是一个重要的参考。你可以在一个全国维护的数据库 NVD 中查找所有编号。事实上,你将在后续的作业中使用它。


最后,我们有 SANS,可以在其网站上找到。SANS 研究所是一个为系统管理员和安全专业人员提供的分布式教育、培训和信息交流机构。它定期发布关于安全漏洞的报告,这些报告通常来自网络安全领域的从业者,并且是为网络安全从业者编写的。

完全披露理念
现在,我们将更深入地探讨一种更自由的漏洞报告理念——完全披露。这是一种看待安全事件的观点,在 90 年代中期发展起来。它是对该领域许多人认为 CERT 开始持有的那种“象牙塔”态度的回应。完全披露主张,所有漏洞一经确认,都应连同其信息一起公开宣布,这与供应商试图做的(即保密信息、开发补丁、发布补丁,然后才让人们知道漏洞)相反。

这是一种完全不同的意识形态。这些群体更倾向于让每个人都知道某种形式的“基本事实”,认为无知比让攻击者知道弱点所在更危险。


因此,完全披露的讨论往往围绕两个主要的邮件列表进行,我们在此列出:第一个是 Bugtraq,第二个是 Full-Disclosure。这两个列表都是可搜索的,简单的谷歌搜索就能带你直达网站,你还可以在存档中进行搜索,这非常有用。

恶意软件分类
我们已经讨论了如何对漏洞进行分类,现在我们来谈谈恶意软件是如何分类的。恶意软件主要由防病毒供应商进行分类。我们在此列出了其中几家。其中许多名字应该会立刻让人感到熟悉。
传统上,恶意软件公司通过在其名称末尾添加一个字母来分配变体名。这在一定程度上是有用的,可以让你知道两个恶意软件确实存在关联,但如果不亲自去它们的网站查看并进行比较,它无助于你理解它们之间的差异。

更“棒”的是,它们之间没有使用统一的命名约定。例如,这里有几个例子说明了它们各自的命名方式是如何运作的:在 McAfee,你会看到类似“受影响的OS/名称.变体”的格式;赛门铁克使用“OS.名称.变体”的格式,两者之间存在简单的映射关系,等等。问题是,尽管你确实可以在其中一些命名之间建立很好的映射关系(如果它们都保持一致维护的话),但无法保证它们都会使用一致的名称。

因此,所有这些变体都存在某种形式的冲突。上一张幻灯片中的所有变体都使用了该网站为 Conficker 蠕虫引用的名称,但这不一定是一个在所有注释中都一致的名称。尽管我觉得这很烦人,但我能理解它发生的原因,而且确实没有简单的方法来修复它。因此,目前作为分析师的你必须保持警惕,永远不要因为恶意软件没有你预期的名称而忽视它。考虑信息本身告诉你的内容,并据此开展工作。名称只是一个代号。
这些名称实际上是根据发现恶意软件的方法而产生的。例如,密集的并行研究开发可能导致实验室开始以不同的方式称呼事物,而这个名称就被传播开来。有些与蠕虫的传播方式有关。所以,这种情况的发生是可以理解的。这不是恶意的,也不是他们试图阻止你使用他们的信息。这真的只是关于实际恶意软件被发现方式的问题。
总结
在本节课中,我们一起学习了多种提供漏洞和利用信息的网站和组织。对于漏洞,我们有供应商网站、FFRDCs,还有独立组织收集这些信息并使其易于网络安全人员获取。恶意软件则由防病毒供应商积极进行分类。


它们没有使用相同的命名约定,但一旦你发现两个不同的名称实际上在两个不同的网站上代表同一事物,结合这些信息将是你全面了解某个恶意软件情况的最佳方法。


008:网站篡改攻击 🖥️🔓
在本节课中,我们将要学习一种最基本且易于检测的攻击类型——网站篡改攻击。这种攻击的核心目的是展示攻击者能够对他人的网站进行修改。
概述
网站篡改攻击,其本质类似于网络空间的涂鸦。攻击者接管系统并替换网页内容,这种行为也被称为“黑客主义”或“网络破坏”。虽然篡改本身可能只是为了炫耀,但被攻陷的网站往往会被攻击者视为后续更严重攻击的资源。
网站篡改的本质与动机
上一节我们介绍了网站篡改的基本概念,本节中我们来看看攻击者实施此类攻击的深层动机。
攻击者可能纯粹为了篡改网站本身而发动攻击。然而,我们预期遇到的大多数攻击者,对网站本身并无直接兴趣。事实上,在攻击者看来,一个网站是可被利用的资源,旨在为后续的真实攻击服务。

尽管Zone-H等网站只是篡改事件的存档库,但它也揭示了一个事实:网站容易受到攻击。因此,虽然网站当时只是被篡改,但它被其他方式攻陷后,未来被用于更邪恶目的的风险会显著增加。
那么,谁会在意呢?不就是一台服务器吗?实际上,服务器对攻击者而言颇具价值,甚至比个人电脑更有价值。一台被占领的HTTP服务器能为攻击者提供多种资源:它本身可作为网络钓鱼、恶意软件投放、命令与控制通道的服务器;同时,它可能包含可被窃取的用户列表及相关信息,这些信息可用于其他非法目的。
如何检测网站篡改

了解了攻击的动机后,一个很自然的想法是:如何检测网站是否被篡改?以下是一些有效的检测方法。
检测篡改的一个好方法是直接检查网页。最简单的方式是在本地进行。实际上,你可以设置任何基于主机的入侵检测系统(如Tripwire),来追踪系统上文件的任何更改。

你也可以采取更精细和主动的措施,例如使用爬虫定期抓取你的网站,并将结果与基准进行周期性对比。
事件响应与加固
假设篡改确实发生了。你实际已被攻击。此时你应该问的首要问题是:他们是如何进入的?
从那一刻起,你必须展开全面的调查。你需要检查服务器日志,查看系统上是否运行了额外的服务,检查之前启用但未使用的、可能被此次攻击利用的服务。同时,你也应该检查网络流量中是否有向服务器的文件传输,这是判断服务器是否被用于非法目的的有效方法。
除了“他们如何进入”,你应该问的第二个问题是:如何更严格地锁定你的网站?
显然,此时你的安全防护存在某些缺陷,必须加以解决。
总结

本节课中,我们一起学习了网站篡改攻击。我们了解到,这种攻击虽然看似简单,但被攻陷的网站往往会成为攻击者进行后续非法活动(如网络钓鱼、数据窃取)的跳板。我们探讨了通过本地监控工具(如Tripwire)或主动爬虫对比来检测篡改的方法。最后,我们强调了事件响应的关键:调查入侵路径并立即加固安全防线,修补存在的漏洞。
009:新型攻击向量 🔓

在本节课中,我们将探讨一些近年来才引起广泛关注的新型攻击向量。这些攻击利用了我们日常使用的社交网络和新兴通信技术中的安全弱点,使得攻击者能够以极小的代价感染大量用户。
上一节我们讨论了传统的攻击方式,本节中我们来看看社交网络如何成为攻击者的新阵地。
社交网络:攻击的放大器
社交网络为恶意攻击者提供了一种高效感染大量用户的方式。这些新型通信结构本身安全性不足,且用户普遍不熟悉如何保护自己。
一个关键风险在于,一旦攻陷一个用户,攻击者就进入了可以感染其他实体的“社交圈”。正如我们在其他课程中提到的,人们更信任自己的朋友。因此,如果感染了一个用户,攻击者很可能利用其社交网络关系,筛选出目标列表,并使用该用户的凭据向好友发送恶意软件,从而大大提高打开率。
本质上,社交网络在通信方式上“重新发明了轮子”,但也继承了旧通信方式中已解决的安全漏洞,并为攻击者提供了寻找新目标的绝佳途径。

具体攻击类型分析
以下是几种利用社交网络的具体攻击类型。
Twitter垃圾信息

这种攻击方式相对简单。攻击者随机选择一组用户,诱使他们点击恶意链接。
关于这类攻击有一些值得注意的特点:
- 这些发起攻击的Twitter账号通常关注了大量用户,但粉丝数很少。
- 他们发布的内容往往涉及色情信息,比普通用户更频繁。
- 与所有垃圾信息攻击一样,如果响应率不足,攻击者会扩大攻击范围以覆盖更多人。

跨站请求伪造
CSRF攻击也被称为“一键攻击”或“会话劫持”。像Facebook这样的大型应用使用Cookie来维持用户状态(因为HTTP协议本身是无状态的)。攻击者利用这一点,诱使用户在不知情的情况下执行操作。
其工作原理很简单:恶意链接利用了网站对用户浏览器的信任。攻击者精心构造一个指向目标网站的链接。当你点击该链接时,你的浏览器就会代表攻击者执行该链接指定的操作。
例如,假设一个银行系统允许通过包含所有请求参数的URL来处理转账。如果你已登录(Cookie有效),攻击者诱使你点击一个类似 https://bank.com/transfer?to=attacker&amount=12000 的链接,那么这笔转账就会在你的账户下被执行。
在社交网络中,好友关系为这种攻击增加了新的复杂性。来自好友的链接比来自陌生垃圾信息发送者的链接看起来更可信,我们也更容易轻信朋友。CSRF等恶意链接正是通过这种方式,借助好友关系进行传播,这也是Facebook蠕虫扩散的途径之一。
Facebook蠕虫:Koobface案例
以Koobface蠕虫为例,这是一个有趣的案例。它试图创建一个用于窃取Facebook登录信息的僵尸网络。

其攻击流程如下:
- 它在用户的“墙”上发布一张图片和一个诱人的链接。
- 该链接会欺骗性地提示用户安装Flash播放器更新,声称当前版本过低。
- 当用户点击更新时,实际上是在系统中下载并安装了恶意软件。
- 该恶意软件窃取用户数据,然后重复上述过程,感染用户的好友。
这代表了蠕虫传播的新方式。
总结

本节课我们一起学习了社交网络环境下的新型攻击向量。我们了解到,社交网络因其固有的信任关系和潜在的安全漏洞,成为了攻击者的高效平台。具体探讨了Twitter垃圾信息、跨站请求伪造的原理与危害,并以Koobface蠕虫为例,分析了恶意软件如何通过社交关系链进行传播。理解这些攻击模式对于提高个人和组织在数字社交环境中的安全意识至关重要。
010:NetFlow流量分析概述 🚦

在本节课中,我们将学习NetFlow的基本概念,了解流分析与数据包分析的区别,并探讨NetFlow的优势与局限性。

概述
NetFlow是一种网络流量分析技术,它通过汇总数据包信息来提供网络活动的概览。与逐包分析相比,NetFlow能更高效地处理大规模数据,适用于流量统计、计费和安全监控等场景。
流分析与数据包分析
上一节我们介绍了课程目标,本节中我们来看看流分析与数据包分析的核心区别。



逐包分析工具(如TCPdump和Wireshark)能提供每个数据包的详细信息。然而,在处理大规模数据时,这种方法可能效率低下。例如,分析流向热门视频流的数万个中间数据包,或深入检查扫描暗网空间的每个数据包,通常既不必要也不可行。
因此,我们需要摘要技术。最常见的摘要技术就是NetFlow。
NetFlow的起源

NetFlow最初由计算机科学家Casey Claffy在其博士论文中提出,随后被思科(Cisco)开发成调试工具。传说思科在一次演示中,客户注意到了角落里的NetFlow工具并表示想要,NetFlow便由此逐渐发展起来。
什么是流?
流(Flow)是指在时间上密切相关的一组数据包。
Casey Claffy的博士论文研究了一个具体问题:观察两个具有相同特征的数据包,如果它们在K秒内出现,它们属于同一个TCP会话的可能性有多大?由于脱离端点重组TCP会话计算成本极高,我们可以通过查看地址信息来合理猜测数据包是否属于同一会话。
流由我们通常所说的五元组定义。五元组是一个计算机科学理论术语,意指“一组事物”。
以下是定义流的五元组:
- 源IP地址
- 目的IP地址
- 源端口
- 目的端口
- 协议
严格来说,提及端口意味着我们主要关注TCP和UDP。但思科作为工程导向的公司,也会将其他协议(如ESP、ICMP)中源/目的端口字段位置相同的分组归入流,尽管这种关联可能很微弱。流的原始目标是重建TCP会话,为此,端口和地址信息是很好的依据。

流的收集与特性
流通常在路由器上收集。最初,思科将NetFlow作为路由器内部的调试工具,用于更高效地转发流量,并非为了报告。



流是基于时间的。这意味着如果一系列具有相同五元组的数据包在一个称为活动超时的时间段内出现,它们就会被归入一个流。与发生在瞬间的数据包不同,流具有持续时间和起始时间。
流的关键特性是:即使五个数据包地址信息相同,但如果它们在时间上不紧密相关,也会被拆分成多个子流。这对于SSH或Telnet等长会话尤其是个问题,因为它们会因保活数据包而被拆分成多个流。

为什么使用流?
流是对TCP会话的近似估计。由于TCP会话重组成本极高,且某些情况(如标志位组合)无法完全确定,流作为一种“足够好”的近似,适用于统计分析、流量分析、计费和安全监控。
流记录示例
一个流记录至少包含以下字段(不同公司的实现可能不同):
- 五元组字段(始终存在):源IP、目的IP、源端口、目的端口、协议。
- 数据包数:具有相同五元组的数据包总数。
- 字节数:这些数据包的总大小(基于三层信息,例如TCP流每个包至少40字节,UDP流每个包至少28字节)。
- 标志位:TCP标志位的按位或(OR)结果(对于非TCP协议可能无意义)。
- 开始时间与结束时间:观测到第一个和最后一个数据包的时间。
- 持续时间:结束时间与开始时间之差。

为何选择流而非完整流量转储?
完整流量转储的成本极高。这不仅涉及数据存储,还包括在大型网络上传输所有数据所需的额外网络资源。向管理层提议建设一个专用于记录和传输流量的第二网络需要极大勇气。
NetFlow是流量的紧凑表示,能将数兆字节的会话压缩至约22字节。它具有很高的性价比,当你不知道要查找什么且存储空间有限时,流记录中的字段信息是首要抓取目标。另一种方法是进行特征匹配,但这只能发现已知特征,覆盖范围很小。
总结

本节课中我们一起学习了NetFlow流量分析。
请记住,NetFlow是交互行为的紧凑摘要。它也是单向的,例如一个TCP会话会产生两个流(客户端到服务器,服务器到客户端)。这在IP世界中是合理的。

NetFlow不包含有效载荷信息,它只摘要信息,不包含包头数据。这导致了一个观点:NetFlow具有最高的性价比。当你不确定要查找什么时,它是一个很好的起点。
011:SILK网络分析工具套件 🛠️
在本节课中,我们将要学习SILK工具套件。SILK是一套用于分析大规模网络流数据的工具集。我们将了解其核心工具、基本操作流程以及如何利用其模块化特性进行数据分析。
SILK工具套件简介

SILK是“系统级互联网知识”(System for Internet-Level Knowledge)的缩写。它由卡内基梅隆大学在2002年至2004年间开发,专门用于分析极其庞大的NetFlow数据集。至今,SILK仍由卡内基梅隆大学的CERT团队维护,这本身也说明了该工具的重要性。
SILK是一套模块化的分析工具,但其命令行界面以不友好著称。因此,我们将重点介绍其基本使用方法,帮助你理解如何利用它来回答实际的网络分析问题。

核心工具与基本操作
上一节我们介绍了SILK的背景,本节中我们来看看其最核心的两个工具:rwfilter和rwcut。这是使用SILK的基础。

一个最基本的SILK命令示例如下:
rwfilter --proto=6 data.rw --pass=stdout | rwcut
这个命令的含义是:从名为data.rw的流文件中,过滤出协议号为6(即TCP)的流记录,然后将结果通过管道传递给rwcut命令进行格式化输出。
这里需要注意几个关键点:
- 管道(Pipe)的使用:SILK遵循经典的Unix哲学,即通过管道将多个小型、功能专一的工具连接起来。
rwfilter和rwcut就是通过管道符|连接的。 --pass=stdout参数:rwfilter的输出默认是二进制的,--pass=stdout指定将“通过”过滤的二进制流数据输出到标准输出,以便通过管道传递给下一个命令。rwcut的作用:二进制流数据对人类不可读。rwcut的作用就是接收这些二进制流,并将其转换为可读的文本格式(如CSV)输出到屏幕。

SILK工具虽然本身可能很复杂,但其操作模式依然根植于这种通过管道连接模块化工具的理念。一些命令,特别是rwfilter,甚至可以同时使用多个管道。
详解RWFilter:流量过滤引擎
rwfilter是SILK中最基础、最强大的工具。它的作用是让你通过命令行指定一系列针对流记录属性的测试条件(即过滤器),并根据这些条件决定每条流记录是“通过”还是“失败”。
你可以将“通过”和“失败”的流分别发送到不同的输出管道进行下一步处理。实际上,你可以连续使用多个rwfilter命令,这在处理像TCP标志位这类复杂过滤时很常见。
以下是rwfilter命令的构造方式:
- 过滤器条件之间是“与(AND)”的关系。例如,
--aport=80 --proto=6表示同时满足“端口为80”且“协议为6”的流才会通过。 - 要表达“或(OR)”关系,需要在单个条件内完成。例如,
--aport=80本身就是一个“或”条件,它表示源端口或目的端口为80的流。 - 过滤器通常接受用逗号分隔的列表或短横线表示的区间。例如:
--proto=6,17表示协议为6 或 17。--proto=6-17表示协议在6到17之间(包含两端)所有的协议。
一个更复杂的例子:
rwfilter --start-date=2023/10/01 --end-date=2023/10/02 --aport=80 --proto=6 input.rw --pass=stdout | rwcut
这个命令过滤出在2023年10月1日至2日期间,使用TCP协议且端口为80的所有流。请注意,--start-date和--end-date定义的是一个时间窗口,只有开始时间在这个窗口内的流才会被选中,与之重叠但开始时间在外的流不会被包含。
详解RWCut与数据分析流程
rwcut是基本的探索性工具,它接收rwfilter输出的二进制流,并将其转换为可读格式。它有很多格式化选项,例如指定输出字段、分隔符等。
理解了基本工具后,我们来看看使用SILK分析数据的典型流程。这能帮助你理解这些工具是如何协同工作的。


SILK分析的一般思路是:你从一个源(如路由器)生成的原始流文件开始,运行rwfilter生成一个新的、过滤后的文件,然后对这个新文件继续运行更精细的rwfilter,逐步缩小范围,定位到你寻找的目标。
例如:
- 首先,过滤出所有TCP流量:
rwfilter --proto=6 original.rw --pass=tcp.rw - 用
rwcut查看tcp.rw文件:rwcut tcp.rw | less - 发现某个IP地址可疑,进一步过滤与该IP相关的TCP流量:
rwfilter --sip=192.168.1.100 tcp.rw --pass=suspicious.rw - 继续对
suspicious.rw文件进行分析。
这种渐进式细化搜索,处理的数据文件会越来越小。你还可以使用rwfileinfo工具查看某个流文件是由哪些查询命令生成的。
当你得到一个最终的、包含目标数据的小文件后,就可以使用能生成ASCII报告的输出工具(如rwcount, rwuniq, rwstats)来制作图表或统计摘要。

高级输出工具:Count, Uniq与Stats
以下是三个主要的输出工具,用于从过滤后的数据中生成统计报告:
rwcount:生成适合绘制时间序列图的输出。它最初的设计几乎可以直接接入Gnuplot进行绘图。rwuniq:提供分类汇总统计。你需要指定一组字段(如协议、端口),它会按这些字段的值进行分组,并计算每个分组中的流数、包数、字节数等。rwstats:非常适用于生成“Top N”列表(如流量最大的前10个IP地址)。
需要记住的是,SILK是为处理超大规模数据集而设计的。因此,它采用了一些高度优化的算法。例如,除非必要,它不会进行全排序;rwstats就使用了堆(Heap)数据结构,这虽然更耗内存,但在时间效率上远高于全排序。

核心进阶概念:集合(Sets)与包(Bags)
基础的SILK已经很强大了,但当你开始使用集合(Sets)和包(Bags)时,它会变得更有趣、更强大。
一个集合是任意IP地址集合的二进制表示。它可以是一个特定网段(如10.0.0.0/8)内的所有IP,可以是你手动输入的列表,也可以是另一个过滤任务的结果(例如“所有与服务器通信的客户端IP”)。
集合可以从流文件生成(例如,提取所有源IP到一个集合),也可以从文本文件用rwsetbuild工具构建。集合之间可以进行操作,如并集(union)、交集(intersect)、差集(difference)。

最关键的是,rwfilter可以使用sipset、dipset、any-set等谓词,基于IP集合的内容进行过滤。例如,rwfilter --any-set=malicious_ips.set data.rw --pass=stdout | rwcut可以找出所有与“恶意IP集合”中任一地址通信的流。
与集合相比,包是“带标签的集合”。一个包包含一个IP地址以及与之关联的一个或多个值。这个值可以是自动生成的(如该IP发送的总字节数),也可以是任意你赋予的标签。你可以从流文件生成包,也可以从集合生成,并使用rwbagtool这个功能强大的“瑞士军刀”对包进行添加、减去、合并等操作。

其他实用工具与总结
最后,还有一些其他有用的工具需要了解:
rwcat:用于将多个流文件拼接在一起。rwfileinfo:用于查看流文件的元数据和生成历史。rwrecc:可以看作是rwcut的逆操作,它将ASCII格式的输入转换回SILK的二进制流文件格式。


本节课中我们一起学习了SILK网络分析工具套件。我们了解到,SILK提供了一系列基于管道理念连接的分析工具,核心是rwfilter(过滤)和rwcut(查看)。通过渐进式过滤和细化搜索,可以处理大规模流数据。进阶的集合(Sets)和包(Bags)功能极大地增强了基于IP地址组的复杂查询能力。最终,我们可以使用rwcount、rwuniq等工具生成可视化报告。掌握这套工具,你将能有效地对网络流量进行深度分析和安全调查。
012:流量记录收集与解析 📊
在本节课中,我们将要学习网络流量记录的收集与处理过程。我们将探讨流量记录的收集方式、其构成属性,以及不同收集方法的优缺点。理解这些内容对于有效利用流量数据进行安全分析至关重要。


上一节我们介绍了流量分析的基本概念,本节中我们来看看流量记录的构建方式。
有多种方法可以创建流量记录。以下是主要的几种:
- 企业级工具:功能全面的商业解决方案。
- 开源工具:如YAF,提供了灵活且免费的选择。
- 路由器内置功能:例如Cisco IOS中的NetFlow功能。

这些工具提供的核心能力主要分为两类:观测点(由传感器位置决定)和记录构成(由传感器添加的额外功能决定)。
在讨论NetFlow时,我们通常指的是NetFlow V5。这是思科路由器操作系统(IOS)中多年的标准报告功能。思科路由器被配置为生成原始的NetFlow数据,然后通过收集基础设施进行聚合并生成更高级别的报告。这种分离的原因是,NetFlow最初主要是一个计费工具,而非安全工具。

接下来,我们详细了解一下NetFlow的版本。

通常我们讨论两个主要版本:
- NetFlow V5:通用的NetFlow标准。大多数专有实现基于此版本。其包含的字段因实现而异,但通常包括注解、扩展和采样信息。它不包含有效载荷数据。
- NetFlow V9:由思科开发的可配置NetFlow标准。其核心特点是允许用户指定要报告的字段。IETF(互联网工程任务组)版本的NetFlow V9被称为 IPFIX,这是一个对所有人开放的标准。
对于收集工具,有一个重要的开源实现需要熟悉。

在收集方面,我希望大家熟悉的工具是 YAF。YAF是IETF为IPFIX标准提供的参考实现。如今,它已成为一个开源的流量生成工具,并且从经验来看,它已成为处理V9流量的默认选择之一。它可以直接从网络接口或抓包文件(Pcap)生成流量记录。

当然,市场上还存在其他工具。最早的包括OSU Flow Tools套件,其中的NFD是流量收集工具。此外还有各种专有工具,例如QRadar的Flow Collector。需要记住的是,流量记录最初是作为路由器功能被构想出来的,因此大多数路由器都支持生成流量记录。



现在,让我们谈谈流量记录具体是什么样子,以及它们为何如此设计。

请记住,与日志文件或TCPdump相比,NetFlow是一种摘要。它不包含有效载荷数据。在构建流量时,信息会丢失。因此,NetFlow分析中包含很多推断。我们之前展示的结构只是NetFlow记录的一部分。如果你查看SiLK流量工具的定义,会发现还有更多字段。以下是一些我认为最重要的附加字段类别,它们能帮助你理解我们可以添加哪些类型的信息:
- 路由器属性字段:例如
in、out、nhIP。这些字段告诉你流量是如何通过路由器转发的。它们在NetFlow V5中就存在,只是之前与安全分析相关性不高,所以没有重点讨论。 - 注解字段:例如
src_type、dst_type、src_cc(源国家代码)、dst_cc(目的国家代码)。这些字段实际上是查找表的别名。它们使用IP地址进行查询,因此如果你知道一个IP地址的国家代码,你总会看到相同的值。 - 标志位字段:例如
initial_flags和final_flags。这是为了克服NetFlow汇总带来的限制。在标准NetFlow中,标志位字段是所有数据包标志位的“或”运算结果,这对于像SYN/ACK这样的TCP标志来说信息价值有限。SiLK工具添加了初始和最终标志位字段,以获取会话中第一个和最后一个数据包的标志,这有助于判断连接是由客户端发起(第一个包是SYN)还是由服务器发起(第一个包是SYN-ACK)。


这些注解字段(如国家代码、类型等)依赖于查找表,其准确性取决于所用表格的质量。例如,MaxMind和Quova等公司专门从事地理定位业务,它们销售IP地址到国家代码(以及额外人口统计信息)的映射表,并确保这些映射的准确性。此外,像app(应用类型)这样的字段,实际上是通过深度包检测(DPI)技术创建的。

了解了结构问题后,让我们回过头来谈谈收集流量时的盲点问题。

当我们收集流量信息时,数据是从某个观测点获取的。主要有三种方式:
- 物理分路器:例如“吸血鬼分路器”,它直接刺入线缆获取流量副本。
- 在路由器上收集:利用路由器自身的NetFlow功能。
- 在网段内主机上收集:让一台主机以混杂模式运行抓包工具(如TCPdump),监听该网段内所有流量。

每种收集点都有其问题。以下是具体分析:

- 在路由器上收集:需要理解的是,路由器的首要目标是路由流量。因此,当路由器负载过高时,NetFlow这种低优先级进程会首先被终止。它相对不够灵活。但它的优势在于规模巨大。一台有40个接口的路由器,你只需在路由器上启用一次流量收集,而不需要在40条不同的线缆上设置40个独立的收集进程。
- 使用软件收集器(如YAF或QRadar):相比之下通常更灵活,性能更高,能够进行注解并创建多种不同类型的流量记录。然而,它们存在于路由结构之外,这使得管理起来可能比较困难。
此外,我们必须时刻牢记可见性盲点的问题:只有被“看到”的流量才能被报告。例如:
- 如果在一个使用集线器(Hub)的网络中,机器A与机器B通信,路由器可能看不到这段流量,因为它从未被路由。
- 如果使用分路器,流量必须经过被分路的线缆。
- 当涉及多个路由器接口时,确保全面覆盖具有挑战性。
- 在网段内以混杂模式收集,只能获取该网段内的通信。

总结

本节课中我们一起学习了网络流量记录的收集与解析。主要内容包括:
- 有多种工具可以生成NetFlow记录,其中 YAF 是一个需要重点了解的开源IPFIX实现工具。
- 流量记录本质上是一种摘要,会丢失部分信息。记录中的一些值(如包数、字节数)是聚合值,而另一些值(如标志位)则可能丢失细节。
- 收集流量数据时存在盲点,流量必须经过收集点才能被记录。
- 根据收集位置(路由器、专用传感器、网段主机)的不同,会面临不同的优势、劣势和管理挑战。

理解这些基本原理,是后续进行有效流量分析和安全事件检测的基础。
013:NetFlow数据分析技术 🕵️

在本节课中,我们将通过实际案例练习,学习如何解读NetFlow数据。我们的目标是理解NetFlow记录所传达的信息,并识别网络中的正常与异常活动。

上一节我们介绍了课程目标,本节中我们来看看具体的实践方法。本次练习将采用互动形式。接下来的几张幻灯片将展示不同的NetFlow数据记录。请暂停播放,仔细观察每条记录,尝试分析其中发生了什么。每张幻灯片之后,我们会给出实际的解释。请务必花时间自己分析,而不要直接翻看答案。
在开始分析前,请思考以下几个问题:
- 每个IP地址的主机扮演什么角色?
- 它们各自在进行什么活动?
- 你怀疑这是什么应用程序?
- 你认为这是正常流量吗?是否需要进一步调查?
同时,尝试利用时间信息进行分析。虽然NetFlow记录不包含数据包到达的具体时间点,但会显示会话持续时间和活动持续情况。
现在,让我们开始分析第一个案例。

案例一:持久SSH连接
以下是第一条NetFlow记录。

(请在此处暂停并分析)
好的,现在让我们来看看这实际上是什么。



这是一条SSH隧道记录。客户端是 12.168.1.6,它连接到服务器 12.168.1.72。这是一个持续时间非常长的SSH连接。
回顾之前的记录,你会发现这个会话在极长的时间内持续存在。因此,流记录被活跃超时(active timeout)机制分割了。在本例中,活跃超时设置为 1800秒。所以每过1800秒,系统就会生成一条流记录。当下一个数据包到来时,又会生成一条新记录。所有这些记录实际上都属于同一个SSH会话。
案例二:IPSec VPN隧道
现在,我们来看第二个案例。


(请在此处暂停并分析)

现在让我们揭晓答案。

这里展示的是一个IPSec隧道。你会看到大量保活(keep-alive)消息定期来回发送,以确保IPSec隧道不会断开。
请记住,建立这种隧道的过程并不快速。因此,反复断开和重连是没有意义的。一旦隧道建立,就会发送周期性数据包来维持其连接状态。
从记录中可以看到,会话在 584 秒后开始活跃。基本上,在很长一段时间内,这个会话没有任何实际活动。直到最后,突然有人开始进行一些操作,活动量随之上升,这体现在最后一条流记录中。


案例三:网页浏览流量
接下来,我们分析第三个案例。

(请在此处暂停并分析)


我猜很多人立刻根据端口号判断这是SSH或Web流量,这是正确的。
本例中,客户端是 12.168.1.20,服务器是 1.168.1.5,端口是 150。
这里有两点很有趣:
- 连接是通过 RST(复位) 而不是 FIN(结束) 来关闭的。回想之前的课程,正确关闭TCP连接的方式是使用FIN握手。但现实中,人们常常直接发送RST来快速关闭连接。
- 我们处理的不是单一连接,而是多个Web连接。这非常常见。需要理解的是,一个完整的网页是在客户端系统上构建的。一个主页可能指示浏览器从多个不同的站点下载各种资源(如图片、脚本)。
以下是涉及的连接情况:



我们总共有五个不同的连接。
案例四:网络扫描活动
最后,让我们看看这个案例。

(请在此处暂停并分析)
现在让我们看看这是什么。

这是 Ping扫描。主机 1.2.168.1.170 正在访问大量地址(例如 1.168.0.0/60 网段中的多个地址)。这里展示的只是与此次扫描相关的大量记录中的一小部分。
观察协议字段,这里使用的是 ICMP,这就是我们立刻能判断这是Ping扫描的原因。
总结与关键要点 🎯
本节课中我们一起学习了如何通过几个简短的NetFlow记录案例进行分析。如果你花时间仔细解读,就能获得关于如何理解流记录的宝贵经验。
在查看NetFlow时,需要考虑的关键因素包括:
- 协议
- 端口号
- 时间信息
但请注意:
- 端口号不是100%可靠的指示器。例如,许多人会将不想被轻易发现的流量伪装成 80端口(HTTP)的流量,使其看起来“正常”。
- NetFlow记录与会话不是一一对应的。至少,你应该看到连接的两端。最多,一个会话可能对应任意数量的流记录。
- 长时间会话会表现为多条流记录,特别是当它们超过活跃超时时间(在我们的例子中是1800秒,即30分钟)时。
本讲到此结束。


014:分布式哈希表与P2P网络 🧩


在本节课中,我们将学习对等网络系统的基本概念、其发展历史、主要用途,以及分布式哈希表的出现及其应用。课程结束时,你将能够描述P2P系统,了解其历史背景和主要用途,并掌握DHT的基本原理及其在P2P网络中的作用。

P2P系统的历史背景 📜
上一节我们介绍了课程概述,本节中我们来看看P2P网络的历史背景。
20世纪90年代末期,出现了一些有趣的技术。P2P文件共享技术开始兴起,例如Napster、LimeWire、BitTorrent、Winny、Kazaa、BearShare等。这些系统彼此之间存在紧密关联,同时也有许多变体在流传,各种文件共享活动非常活跃。

早期的P2P系统依赖于中央服务器。例如,Napster就有一个中央服务器,用于记录每个主机系统上可用的文件。这种设计的缺点是,如果想使整个系统离线,只需关闭中央服务器即可。在Napster的案例中,这一点尤为明显,因为其单一的中央服务器记录了所有连接用户的信息,一旦被关闭,整个网络便无法运行。
中央化架构的问题与法律挑战 ⚖️
上一节我们回顾了早期P2P系统,本节中我们来探讨其架构带来的问题和法律挑战。

中央服务器有能力追踪所有对等节点。虽然存在窃听防护措施,但我们需要暂时搁置信息自由的问题,关注文件共享系统面临的主要问题:根据现行法律,盗版和非法共享音乐文件属于侵权行为。因此,美国唱片业协会等组织极力打击此类行为,希望阻止文件共享以促进正版销售。
用户则希望避免法律追责。因此,他们开始寻找方法,以规避这种存储所有用户信息、可能带来重大法律风险的中央服务器。
此外,在讨论文件共享、盗版或任何知识产权问题时,还需考虑另一个因素:互联网是一个国际社区,涉及复杂的法律场景。一个典型的例子是维基百科在不同国家的差异。在美国,维基百科可以展示哥斯拉等图片,但在日本,由于知识产权法的限制,可能无法展示相同图片。因此,一些文化更倾向于使用文字描述而非图片展示。
除了音乐产业打击盗版的行为已扩展到其他行业外,跨越国际边界时还会遇到知识产权法规或松或紧的问题。
去中心化与覆盖网络 🛡️
上一节我们讨论了法律挑战,本节中我们来看看如何通过技术手段保护系统用户。
用户可以使用加密技术,这能在很大程度上抵御深度数据包检测技术的影响。但更重要的措施是实现去中心化。与其依赖现有的网络层来处理所有路由,不如在其之上构建一个覆盖网络。这样,可以创建一个分布式系统,它利用现有基础设施,但并非所有互联网用户都能连接,只有P2P系统的成员才能相互连接。
以下是实现去中心化的关键方法:
- 系统采用分布式哈希表实现去中心化。
- 这允许完全移除中央服务器。
- 消除了单点故障,无人能通过关闭单一节点使整个网络瘫痪。

分布式哈希表的工作原理 🔍

上一节我们介绍了去中心化的概念,本节中我们深入探讨DHT的具体工作原理。
DHT的基本原理是,各个节点维护网络中其他节点的唯一标识和IP地址信息。这些节点又维护着其他节点的信息,依此类推。学术界和私营部门都开发了许多此类系统的实例。
以下是DHT的关键示例和共同概念:
- 关键示例包括Chord、Tapestry、Pastry等,它们基于非常相似的概念运行。
- 每个节点被分配一个全局唯一的ID。
- 核心是确定覆盖网络中的路由结构,即利用网络中的其他节点将信息从一个ID传递到另一个ID。
其工作方式类似于一种“绅士协议”:覆盖网络或P2P系统中的每个成员都承诺“如果你为我路由流量,我也为你路由流量”。因此,就像传统网络路由一样,只需将数据包发送到比你自己更接近最终目的地的节点。你无需知道最终目的地的具体位置、所在国家或跳数,只需知道一个比你更接近目标的节点即可。
Pastry路由机制示例 🧮
上一节我们概述了DHT的工作方式,本节中以Pastry为例,具体看其路由机制。

Pastry使用一个128位整数作为节点ID,并假设这些唯一ID是均匀分布的。其路由处理方式是:如果你的目标节点有一个唯一ID,而该ID与你的ID相距甚远(例如相差数百万),那么你会找到那个拥有与最终目的地最接近的前缀的节点,并将信息路由给它。该节点再执行相同操作,最终信息会到达那个拥有完整、匹配目标ID的节点。
这是一种非常有趣的方法,它最初并不太考虑网络位置( locality )。不过,Pastry有一些改进版本,会 heavily 考虑位置信息并更节省带宽。这些改进的基本思路是,个体会开始维护关于路由效率的信息,并且更靠近它们的本地主机会更频繁地使用它们。但归根结底,它们都是利用这个唯一的ID来处理所有路由。
加密与无追踪器DHT的应用 🔐
上一节我们以Pastry为例说明了路由,本节中我们来看看加密技术在P2P网络中的应用。
加密技术已存在多年。尽管曾有人反对在此领域使用加密,但它确实被广泛应用,并且也利用了无追踪器的DHT功能。海盗湾等组织一直是这方面的积极倡导者。

总结与核心概念回顾 🎯

在本节课中,我们一起学习了P2P网络和分布式哈希表。
总而言之,当我们观察这些P2P网络时,只要不是90年代中期的那种,它们基本都是去中心化的。因此,我们在整个模块中学到的关于BGP路由、如何将信息从A点传递到B点的所有原理,在P2P网络中再次得到了应用。
这很有趣,因为它运用了所有已学的经验教训,创建了一个覆盖网络。这个覆盖网络完全忽略了底层的所有原则,只专注于路由发现这一核心概念。

其核心机制可以概括为:节点通过维护一个(唯一ID, IP地址)的映射表,并依据ID的相似性(如前缀匹配)将查询或消息逐步转发给“更接近”目标ID的节点,直至到达目的地。
015:边界网关协议(BGP) 🕸️
在本节课中,我们将学习边界网关协议(BGP)的基础知识。BGP是互联网的核心路由协议,负责在不同网络之间交换路由信息。我们将探讨BGP的工作原理、如何从中提取信息,并揭示其背后一个“可怕的秘密”。
BGP基础
BGP是一种协议。它是一种TCP协议,运行在端口179上。它名义上是一种对等协议。该协议专门由路由器使用,是路由器之间传输信息的方式。
BGP用于维护RIB,即路由信息库。RIB,简单来说,是路由器用来了解互联网如何连接的神奇知识库。之所以用“神奇”这个词,是因为BGP有一些能力,允许它根据其内部智慧决定路由路径。任何声称完全了解BGP工作原理的人都在说谎。BGP是一个非常古怪的协议。
在正常操作中,BGP路由器只是互相发送其RIB的更新信息。
BGP的构成

BGP的核心是一系列经过深思熟虑的想法。本质上,它是一种最短路径算法,这在路由算法中并不少见。
BGP构建了一个互联网的图。这个图中的节点被称为自治系统,链接则是将这些自治系统物理连接在一起的线路。其理念是,你需要经过最少的跳数,即最少的自治系统数量,从你的起始IP到达你的目标IP。所有其他复杂的机制都建立在这个巨大的基础之上。

正如所说,它基于最短路径的理念。但除此之外,还有许多其他因素,例如本地偏好、TTL、MPLS等协议,这些协议允许你创建隧道,将其他协议封装起来,在自治系统之间传输。
查看RIB
现在,我们来谈谈RIB的实际样子。这是一个你可以自己做的练习。地址 route-server.ip.att.net 是一个路由器,你可以实际连接到它并查看BGP RIB。

如图所示,我连接到该服务器并输入了命令 show ip bgp,这是查看这种路由器RIB的命令。你会看到我得到了一系列数字,这些数字是CIDR块、下一跳ID和路径。
那么,我们看到了什么?我们看到了目标CIDR块、下一跳地址、自治系统间度量、本地偏好、权重和路径。所有这些分别代表什么?

首先,BGP不以IP地址为单位进行通信,BGP以自治系统为单位进行通信。一个自治系统是互联网中一个封闭的部分。自治系统的意义在于,一旦你进入一个AS,你就知道如何进入以及如何出去。你不知道里面发生了什么。它可能只有一个路由器,也可能是一打路由器组成网状框架,甚至可能是物理打印数据包并互相传递的松鼠。你不知道这些信息,也不关心。
AS的所有者声明它拥有什么以及它是如何连接的。关于它拥有什么,这是CIDR块发挥作用的地方。一个AS拥有一个CIDR块。例如,我会告诉全世界我拥有 122.0.0.0/24。
路径解析

现在,如果我们回到RIB查看,你会发现,我无法直接到达 194.15.0.0/16,但我可以接近它,我需要先到 190.0.0.0/8。要做到这一点,我必须经过一系列自治系统:708 -> 2914 -> 4788,然后是内部路由。
这意味着什么?这意味着,如果我想到达最终目的地,我必须经过这一系列自治系统才能到达那里。

取证与自治系统查询
现在,我们来谈谈取证。自治系统是有所有者的实体。因此,我可以对它们进行查询。最简单的方法是使用WHOIS服务器。例如,APNIC。我输入一个地址,可以看到当我这样做时,我从APNIC(亚太网络信息中心)获得了这个特定AS 4788的所有权信息。我可以获取信息,找出谁拥有它,了解变更记录,并获取其所有联系信息。
另一种方法是使用PeeringDB,我也可以进行类似的查询。例如,我对Telecom Malaysia进行查询。你会看到它给出了我的ASN 4788。让我们回到RIB查看片刻,你会看到主要的ASN 4788就在那里。

所以,我回到RIB查看。你可以看到4788是我到达目的地要使用的最后一个AS。实际上,你可以看到这些跳数是按从近到远的顺序排列的。如果你查看下一跳地址,你可以看到这些对等关系,它们都是 121.23.x.x,并且都属于 7018(AT&T)。
利用PeeringDB深入分析

我可以使用PeeringDB来查找AS信息。我可以查看它支持的协议,还会发现它与谁连接。你会注意到,所有这些连接都指向特定的互联网交换点。
让我看另一个例子。这里我希望你注意的重点不是左边的信息,而是右边的信息。你注意到所有连接都指向Equinix Ashburn吗?顺带一提,我讲课的地方在华盛顿特区附近,你们听讲的地方可能在马里兰地区,而弗吉尼亚州的阿什本拥有大量的互联网连接。
我在这里所做的基本上是遍历到达最终目的地 7018(AT&T)的各个步骤。让我们倒退一步:7018 -> 2914 -> 4788。让我们再回去看看那些数字:7018、2914、4788。7018是AT&T在美国大陆的服务器,所以数据会先到那个AT&T服务器(7018),然后通过阿什本的IX到达 2914,再到 4788。
因此,你实际上可以看到拥有路由的政治实体、人员和组织。我希望你记住这一点。在之前的讲座中,我谈到路由器使用PeeringDB和APNIC等资源物理连接在一起,你可以查明谁拥有特定路由,并找出他们与谁连接。
BGP消息类型
考虑到这一点,我们来谈谈路由器本身如何交换BGP消息。主要有四种类型:OPEN、UPDATE、NOTIFICATION和KEEPALIVE。
当我们谈论BGP时,BGP是对等协议。所以我们不谈论客户端和服务器,我们谈论发言者。OPEN消息用于建立连接,两个发言者互相确认。UPDATE消息用于推送路由更新,通常发生在有新路由添加或旧路由失效时。NOTIFICATION用于错误处理。KEEPALIVE消息用于维持连接,当你启动一个BGP连接后,只需保持其运行。如果你几分钟内没有发送任何消息,你会发送一个KEEPALIVE消息,只是说“我还在这里”。
这是一个BGP OPEN消息的样子:版本号(BGP版本)、自治系统号、BGP标识符和一些可选参数。
一个UPDATE消息包含一个不可行路由列表和任何路径更新。这引出了你如何实际选择路径的问题。首先,这并不简单,有许多因素会影响路由选择,其中一些相当晦涩。关键特点是内部路由是一个黑盒。有一个权重度量应该反映这一点,但不要对权重度量过于兴奋。总的来说,你看到的是尝试经过尽可能少的自治系统。

然后有一些基本规则可以使用:最短路径、一个称为本地偏好的值、一个权重值和一个起源属性(无论它是内部、外部还是其他类型)。不幸的是,这里面有很多“巫术”。
BGP的商业本质与“可怕的秘密”
原因是BGP是技术目标和商业目标之间的结合体。技术目标是找到从A点到B点的路由。商业目标是通过这样做赚钱。因此,出现了对等安排。根据人们如何签订协议,这也可能影响选择的路由。
让我们看看对等方是谁。对等方是路由的组织实体。如果我同意与你对等,我们就是“对等体”。有几种层次的对等协议。最神秘的是所谓的“私有对等”。在其之下是“传输对等”。除非你是一级ISP,否则你一生中处理的都是传输对等。传输对等意味着你向另一个ISP付费以传输你的数据。一级ISP,大约15个左右,如Level 3、AT&T,它们之间有关于如何移动数据的协议。
其他所有人都向它们付费。这就引出了BGP的“可怕秘密”,这在我接下来的讲座中会变得更加明显,该讲座将讨论臭名昭著的巴基斯坦屏蔽YouTube事件。但这里要理解的关键点是:互联网是由一群实际上彼此保持密切联系的人维护的。

有一个戏称叫“寿司阴谋集团”,因为他们过去常在NANOG会议期间一起去吃寿司大餐。但要明白,一级ISP的数量是有限的。二级ISP数量多一些,但这些人彼此都认识。你是AT&T的路由大神,你认识Level 3的路由大神,你认识Hurricane Electric的路由大神。你们一起参加过会议,一起踢过足球等等。实际上有大量的握手和非正式协议在管理着BGP。“寿司阴谋集团”是个玩笑,但要明白,其核心在于,这是一个由社会关系维护的协议,而不是一个自主的机械系统。这涉及到彼此认识并知道如何相互沟通和设置信息的人。这就是真实的状况。
总结

本节课中,我们一起学习了BGP的结构。我尝试将从RIB表中获得的路由与使用PeeringDB等资源进行的有形取证联系起来。我可以查找网络上任何特定路由组织的关联信息,并利用这些信息追踪路由。我认为关键要点是,驱动这一切的是所有权和商业关系。很容易抽象地谈论这些漂浮在空中的身份,但要明白,商业决策、个人关系,甚至常常是恩怨,驱动着这一切。这引出了我所认为的BGP的“可怕秘密”,现在你们已经入门了。祝你们有美好的一天。
016:BGP源数据分析 🔍
在本节课中,我们将学习如何分析和获取路由信息。我们将介绍几种关键的数据源和分析工具,特别是用于检查网络路径的 ping 和 traceroute 工具。通过学习,你将能够列出分析路由信息的资源,并讨论如何使用这些工具。
路由数据源 📊
上一节我们介绍了BGP的基本概念,本节中我们来看看获取和分析BGP数据的具体资源。分析BGP数据时,可以轻松找到多种数据源。
在讨论路由时,你感兴趣的关键数据之一是RIB文件。RIB文件是基于路由信息的文件,通常由多种来源提供。这些来源会告诉你BGP通告、选路路径等信息。
其中两个重要的数据源是Route Views和Looking Glass。
以下是关于这两个数据源的详细信息:
- Route Views:这是俄勒冈大学的一个项目。它存储了多个顶级网络运营商的BGP数据。数据以MRT格式存储,这是一种多线程路由工具包格式。解析该格式的工具可以在下方URL找到。这是一种紧凑且一致的格式,便于存储所有路由信息。
- Looking Glass:这个术语更有趣一些。它是一个通用术语,指的是一类服务器软件,本质上是路由器的前端。它通常有两种形式:基于HTTP或基于Telnet。基于HTTP的通常有更友好的图形界面,而基于Telnet的则更偏向命令行方式。下方列出了几个HTTP服务器示例。

再次强调,当我说“友好、流畅的界面”时,我指的是真正友好的界面。很多界面会引导你:第一步,选择你想查看的源位置;第二步,选择你想要的目的地信息类型;第三步,选择获取方式,例如执行ping、traceroute或查看BGP信息等。至于Telnet方式,它更偏向命令行。你偶尔会看到这些,它们基本上是路由器的前端,你可以输入一些命令,比如 show ip bgp,然后获得类似下图的信息。

你在这里看到的信息基本上是一系列到达不同IP地址的路径信息。例如,要到达 1.1.9.0/16 这个目标网络,下一跳是 12.123.145.124。当然,也可能存在其他下一跳。之后,你实际上可以看到它将尝试的完整路径。我们关心的是最终目的地,但不必担心路径的每一步,只需要关注当前的下一跳是什么。这样,我们知道下一跳的IP地址,就可以将路由信息发送给它,并最终到达 1.1.9.0/16 网络。


路由非对称性与路径分析工具 🛣️
在深入工具之前,有几个关键细节需要大家了解。首先,路由是非对称的。如果A路由到B,它可能走一条非常短、快速、简单、低延迟的路径。而B路由回A时,可能走一条非常长、绕经新加坡和冰岛再返回美国的路径。这没关系,两者都能路由数据包。网络底层工作并不需要对称性,事实上,这是其主动设计目标之一。我们不必担心路由不对称,这其中有多种原因,例如光缆布局、对等协议等都会影响路径选择。这些是底层细节,终端用户通常不需要了解,即使活跃在此领域的人也大多无需深究。然而,BGP允许我们在给定条件下,决定如何绕路。
我们已经讨论了路由本身以及如何获取RIB信息,现在我们将花更多时间讨论人们通常用来分析从自己系统到另一系统路径的工具。
我将重点介绍的两个工具是 ping 和 traceroute。
使用这些工具时你需要什么?对于 ping 和 traceroute,你并不一定需要Looking Glass,因为可以直接从你的系统执行。但如果你想了解从日本到朝鲜或韩国系统之间的路径情况,你可能需要去一个更接近该地区的路由器,以更好地了解这两个站点之间的情况。从你这里执行 ping 对此帮助不大。
Ping工具详解 📡
ping 是一个相当简单的基于 ICMP 的工具。大家可能都用过,所以我不打算花太多时间,但还是简要提一下关键细节。
ping 发送一个代码为0、类型为8的ICMP消息,这是一个回显请求。如果目标主机接受此请求,它将回复一个代码为0、类型为0的回显应答。你可以在回显请求或应答的数据包中编码一些状态信息,这允许你区分不同的请求,因为通常当你输入 ping google.com 时,你不会只发送一个ping,而是多个。这使你可以进行多次尝试。当我们说多次尝试时,并不要求每一次都完全成功。
你可以调整很多参数,例如调整ICMP消息的有效载荷大小,调整TTL值(例如,你可以设置这个ping最多只经过3跳)。通过观察不同设置下的差异,可以获取更多信息。
ping 也可用于一些攻击,例如经典的死亡之ping、ping泛洪、Smurf攻击等。我们现在不深入讨论这些细节,但希望大家知道它们的存在。有许多资源可以更详细地了解这些攻击的原理和表现。
Traceroute工具详解 🧭
现在让我们进入 traceroute。traceroute 是另一个有趣的工具,因为它可以让你看到数据包经过的确切路径。
traceroute 基本上是一个路由分析和诊断工具。我的意思是,如果我们想弄清楚为什么两个点之间延迟这么高,我们可以快速做的一件事就是从一个点执行 traceroute 到目标点,比如 google.com。它会给出我们计算机到Google.com路径上每一跳之间的延迟。
它的一个美妙之处在于,你还能获得路径上每一个愿意报告其名称的路由器的列表。
traceroute 的工作原理是利用了IP数据包中的 TTL 值。TTL值介于0到255之间。当TTL降为0时,数据包就会被丢弃。这是为了防止数据包在网络中无限循环。这允许我们确定数据包从源点到目标点所需的最小TTL值。一般来说,我们不必太担心这个。但如果你确实想进行网络层面的映射和分析,这类信息是绝对需要的。
traceroute 开始时发送TTL为1的数据包。收到响应后,接着发送TTL为2的数据包,依此类推。路径上的每个路由器都会返回一个响应。这个响应通常包括对消息的回复,这让我们知道该路由器是什么。当然,我们还会设置一个计时器,这样我们就能看到往返时间,并获得每一跳之间的实际延迟。
所以,如果你在Linux系统的命令行输入 traceroute,或在Windows系统输入 tracert,你会看到类似下图的结果。

你可以看到这个过程随时间展开,它会告诉你每一跳花费的毫秒数,以及数据包的去向。这是一个非常有趣且有用的工具,用于确定数据是如何被路由的,以及当你说“我想访问某网站”时,你的流量实际去了哪里。

总结 📝

本节课中我们一起学习了如何收集和分析路由信息。

总结来说,可以通过多种方式获取BGP数据,也可以通过多种方式获取其他有用信息,例如使用 ping 和 traceroute。
在查看这些信息时,我希望大家考虑到:使用你自己的系统会给出从你系统出发的路由,而使用Looking Glass则会给出从世界其他部分观察到的路由。在开始分析之前,明确你实际感兴趣的内容非常重要,这样你才能从适当的来源收集到所需的信息。


017:基础路由问题解析 🧭

在本节课中,我们将要学习网络路由的基本问题。我们将探讨路由在网络体系结构中的位置、为何需要路由,以及当今网络所采用的一般路由方法。理解这些基础概念是后续深入学习复杂路由协议的前提。

路由在网络中的位置
上一节我们介绍了课程概述,本节中我们来看看路由在网络模型中的具体位置。
你已经了解左侧的OSI模型。协议栈的每一层都依赖于其他各层正确执行其功能。例如,我们访问网页时,数据流是HTTP over TCP over IP over Ethernet over twisted pairs。每一层都必须正常运行,其上层才能正常工作。没有TCP,就无法运行HTTP。

为了帮助你理解,你也可以参考左侧的TCP/IP模型视图。路由在OSI模型的网络层或TCP/IP模型的网际层进行处理。
因此,本模块我们将主要关注和讨论这一层。
为何需要路由:从数据链路层说起
上一节我们确定了路由的工作层级,本节中我们来探讨为何需要路由机制。
数据链路层是第二层,它倾向于采用广播方式:每个主机都将数据“倾倒”到总线上,然后让其他所有主机尝试筛选出属于自己的信息。因此,筛选出对特定主机有意义的信息这项工作,必须在更高一层处理。
具体来说,我们需要基于该层之上的某些信息,来精确判断哪些信息对我们重要。这就是第三层——网络层(或网际层)的任务。
举例说明,假设所有设备都相互连接,彼此都能看到所有信息。如果我们有三个主机,这意味着需要三条连接。假设每台主机都与所有其他主机相连。

当我们加入第四个主机时,就变成了4台主机,需要6条连接。再加一台,就是5台主机,10条连接。如果持续这样增加,最终我们会得到 n 台主机对应 (n² - n) / 2 条连接。显然,让每台主机都与其他所有主机直接相连是不可行的。
更重要的是,存储每条独立连接的信息也根本行不通。我的电脑上可没有 2³² 个物理端口(这里指的是物理接口,而非TCP端口)。这非常困难,效率极低。
因此,我们需要一种方法将信息分组聚合,让设备能够判断自己连接了什么,并能根据连接情况将信息传递到正确的位置。
路由的核心思想:间接传递

上一节我们看到了全互联的不可行性,本节中我们来看看路由是如何解决这个问题的。
正确的工作方式应该是:当有人问“谁能把这条信息送到某个不同地点”时,必须有人“举手”或者说:“别担心,我知道它在哪,我会把它送到那里。”这就是路由的核心理念。
你不需要知道到达每个地点的确切路径,你只需要认识某个能说“我知道在哪,我会让它离目的地更近一步”的人。
于是我们最终得到的是类似这样的连接图:并非所有设备都相互连接,但存在许多能形成有效路径的连接。
如果左上角的设备需要发送信息到左下角,我们不必向所有人广播。我们只需以某种方式询问:“嘿,你知道这个地址在哪吗?”而知道答案或能将信息传递到下一个更接近目的地的设备,会自动响应,接过信息,并重复这个过程,直到信息到达最终目的地。

我们无需包含所有无关节点,只需包含那些重要的节点。此外,仅仅因为某条信息一次经过了某个节点,并不意味着所有信息都必须经过那里。我们可以在第二跳就做出主动选择,根据对该跳最有利的情况来路由信息。
路由问题的普遍性
上一节我们描述了路由的基本思想,本节中我们来看看这个问题并非网络层独有。

这不是本层独有的问题。SMTP(简单邮件传输协议)也处理同样的问题。DNS(域名系统)也有类似问题:你的本地DNS缓存服务器并不知道互联网上每一个域名和IP地址的对应关系,它只知道一部分记录,并且知道去哪里获取特定域名的更多信息。
大多数P2P(点对点)协议也有这个问题。当你研究像Pastry这样的协议时,这个问题尤其有趣,它们大量处理节点集合的本地化并优化路由,其原理是相通的。
路由问题的形式化定义
上一节我们看到了路由问题的普遍性,本节中我们将其形式化。
给定一个图中的两个节点,我们需要找到从第一个节点到第二个节点的最优路径。前提是:每个节点只知道它的直接邻居,并且图的结构可能随时间任意变化。
人们不喜欢思考这一点,但有一个简单的事实:互联网是不断变化的。事实上,我以前常开的一个玩笑是问别人:只要有足够的航空里程和一把镐,我就能把澳大利亚从地图上“抹掉”,这是真的还是假的?如果我去那里,开始破坏每一条通往澳大利亚海底的主要物理光缆,在我切断每一条线路时,BGP(边界网关协议)将允许我们绕过这条我刚切断的“大管道”进行路由。所以,这基本上是一个自愈系统,它不一定以最佳方式愈合,但会以一种能工作的方式愈合。
关于这一点还有另一个方面:除了物理问题,我们也可以将其应用到商业层面,来处理诸如大型电信公司这样的情况。它们被允许声明:“通过我路由信息,我将收取X美元。”如果你作为一个电信公司,可以选择通过一个收费50美元的节点和一个收费10美元的节点来路由,你很可能会尝试构建一条路径,让人们更多地通过那个10美元的连接,而不是50美元的。
当然,也存在必须使用50美元连接的情况,因为那个10美元的节点无法处理、不知道路径,或者没有到你目的地的有效路径。在这种情况下,你仍然需要通过那个50美元的节点。但所有这些细节都对用户隐藏,几乎对所有人都是透明的。
它最终归结为:这是我得到的路径。你并不真正关心我是如何得出这个结论的,但这就是我得到的,请随意使用。
总结

本节课中我们一起学习了网络路由的基础问题。我们明确了路由工作在OSI模型的网络层或TCP/IP模型的网际层。我们探讨了由于全互联网络在物理连接和信息存储上的不可行性,从而引出了路由的必要性。路由的核心思想是间接传递和路径选择,每个节点只需知道如何将信息送到“下一跳”。我们还看到路由问题具有普遍性,不仅存在于网络层,也出现在SMTP、DNS和P2P协议中。最后,我们将路由问题形式化为在一个动态变化的图中寻找最优路径的问题,并理解了互联网路由具有自愈和基于策略(如成本)进行选择的特性。
018:数据包路由机制 🚦

在本节课中,我们将学习数据包路由机制。我们将回顾链路协议与路由之间的交互,理解路由器在IP层的工作原理,并探讨生存时间(TTL)字段的实际作用。
什么是路由器?🖥️
路由器最简单的定义是:路由器是一台多宿主计算机。这意味着路由器是一台拥有多个接口、可以连接到不同网络的计算机。例如,大多数现代个人电脑都具备一定的路由器功能,因为它们通常同时拥有无线网络接口和有线以太网接口。

路由器的作用是使数据包能够在不同网络之间“跳跃”。从路由器的视角看,这意味着从一个接口接收数据包,然后利用一系列信息决定从另一个接口将其发送出去。
路由的复杂性 🔄
路由是互联网运作中所有抽象概念开始瓦解的地方。这主要是因为我们需要处理多种协议。

互联网路由的基石是边界网关协议(BGP)。BGP是一个TCP协议,但它用于管理路由信息。而实际的路由转发工作是在第二层(数据链路层)完成的,通常是以太网这样的链路协议。此外,还有地址解析协议(ARP),它负责将物理MAC地址与IP地址关联起来。所有这些都发生在我们已经通过DNS确定了目标地址之后。
回顾以太网帧 📦
以太网是一个链路层协议,它在两台主机之间传输信息,但采用的是广播方式。当一个以太网数据帧被发出时,它会发送给网络内的所有主机,只有拥有正确目标MAC地址的主机才会读取它。

MAC地址详解 🔢
这些硬件地址就是MAC地址。MAC地址是6个字节(48位)的地址,是硬件的唯一标识符。与IP地址相比,这是MAC地址的一个重要特性。

MAC地址的48位结构如下:
- 前24位(OUI):分配给制造该硬件的公司。
- 后24位(NIC ID):由制造商分配给单个网络接口。
理论上,这提供了约1600万个唯一的MAC地址。在理想情况下,一个网络内的网卡数量不应超过这个数字,以避免地址冲突。
广播与规模限制 📡
广播意味着消息通过共享线路发送。在第二层网络中,我们经常讨论物理拓扑(如星型、总线型)。在这种环境下,所有主机都可能同时读写,协议必须管理这种并发访问。

这带来了规模限制。这也是路由的核心原因:我们进行路由不是因为想,而是因为必须这样做。
以太网通过向共享总线上的所有设备广播消息来工作。如果我们试图在整个互联网规模上这样做,网络将会崩溃。因为通信量会随着主机数量的平方增长。
在第二层,由于要争用公共资源,有几种经典的冲突处理方法:
- 时分复用:像令牌环网络那样。
- 冲突检测与重传:这就是以太网采用的方式——发生碰撞后简单重发。
帧大小与MTU 📏
碰撞和重传的代价,导致了我们对帧大小的限制。你可能记得我们讨论过1500字节的MTU(最大传输单元)限制。这是数据包大小的一个实际限制,以太网通过它来通知TCP/IP协议栈。


路由与“跳”的概念 🦘

数据包的结构由它穿行的网络决定。数据包从一个网络转移到另一个网络的物理过程,我们称之为“跳”。
“跳”由路由器管理。一次“跳”将数据包从一个由BGP管理的网络移动到另一个BGP网络。它是如何做到的呢?路由器物理上复制了这个数据包。记住,路由器是一台多接口的计算机。“跳”意味着路由器从一个接口接收数据包,然后将其移动到另一个接口发送出去。

“跳”的物理过程 🛣️
让我们考虑一次“跳”的物理过程。假设我有一个数据包:
- 源IP:
122.0.0.111 - 目标IP:
99.143.0.311
我想把它从我的网络发送到目标IP所在的网络。这里引出了互联网的一个重要但常被忽视的特点:一旦数据包离开你的无线网络,它实际上走的是一条物理上可追踪的路线。
在一次“跳”的过程中:
- 数据包被传递给另一台路由器。
- 发送到的这个路由器地址称为下一跳地址。
- TTL值减1。
- 你会注意到MAC地址改变了。原因是数据包移动到了一个新的物理接口。因此,IP地址(如
122.0.0.111)在整个通信过程中保持不变,但实际处理传输的MAC地址在路由器的每一“跳”都会改变。

生存时间(TTL)的作用 ⏳
所有IP数据包都有一个TTL(生存时间)字段。每经过一跳,TTL值就减1。这样设计的原因是:如果没有TTL,数据包将在网络中永远循环下去。

TTL是一个可变的量。不同的协议栈会指定不同的初始TTL值。此外,在路由过程中修改TTL值也是被允许的,这实际上是像MPLS(多协议标签交换)这类协议的基础。
需要牢记的要点 💡

首先,物理路由会影响更高层。我们试图将其抽象化,但底层物理连接是基础。
其次,路由器是物理连接在一起的。有可能通过攻击这些物理资产来破坏网络。

总结 📚
本节课我们一起回顾了路由与多层协议的关系,讨论了以太网的结构和冲突避免机制。核心要点如下:
以太网是一个广播协议。事实上,我们所有的第二层协议在很大程度上都是在共享总线上进行广播。我们无法建造一个世界规模的共享总线。

路由存在的意义,就是将各个网络彼此隔离,以确保碰撞、接口噪声等问题被控制在一个可管理的范围内。我们通过沿着受控的通道(即路由器之间的接口)发送信息来实现这一点。这些路由器间的接口通常是维护良好、受到物理监控的资产。这就是“跳”和“路由”概念的核心价值。
019:路由协议滥用行为 🛣️


在本节课中,我们将学习路由协议滥用行为。我们将探讨一个由路由配置错误引发的真实全球性故障案例,并了解如何将路由协议的原理用于非效率目的,特别是实现匿名通信。



路由协议的社会性与潜在风险
上一节我们介绍了网络维护者之间通常存在一种协作关系。本节中我们来看看当这种关系失效时,会发生什么。这正是互联网发生大规模破坏性事件的开始。



边界网关协议(BGP)在很大程度上依赖于社会信任,其内置的安全机制并不多。BGP协议本身并不运行,而是由路由器来运行。为了与另一个组织建立有意义的BGP连接,通常需要签署某种商业协议。
这意味着存在一个纸面上的记录。然而,它仍然可能被滥用,原因在于互联网是一个全球性媒介,一旦超出特定区域,这种“纸面记录”就可能变得不可靠。

案例分析:巴基斯坦YouTube封锁事件 🚫

接下来,我们来看一个具体的例子。在2008年,巴基斯坦决定在国内屏蔽YouTube的内容。他们的想法是在路由层面进行封锁,因为如果只是简单地屏蔽网站,用户很容易通过代理服务或加密通道等方式绕过。
以下是他们采取的方法:
- YouTube宣布了一个IP地址块:
208.65.152.0/22。 - 巴基斯坦电信(Pakistan Telecom)宣布了一个更具体的
/24子网,并将其重定向到一个“黑洞”。 - 根据BGP的“最长前缀匹配”原则,更具体的路由(
/24)会优先于较宽泛的路由(/22)。 - 结果,全球其他自治系统开始将所有发往YouTube的流量路由到巴基斯坦。

为什么这会演变成全球性问题?这是因为巴基斯坦电信的上游路由器没有过滤这个错误的路由宣告。他们的上游提供商也没有阻止它,导致这个错误信息在全球传播。



在美国和欧洲,发生此类问题时通常有现成的处理机制,因为上游提供商之间会相互沟通。但在当时,亚洲地区的网络互联相对较新,相关方未能与更广泛的社区进行有效沟通,导致一个本地行动引发了全球性后果。

目前,对于这类问题并没有完美的解决方案。尽管存在一些安全增强方案,但它们尚未被广泛采纳为可行的协议。

非最优路由:匿名通信的应用 🕵️
现在,让我们来谈谈匿名性。这是一个人们将路由协议用于其最初设计目的之外的典型例子。


首先,我们需要了解一个核心概念:匿名集。匿名集是指一群无法被区分开的个体。例如,如果你是霍普金斯大学的学生,你的匿名集规模可能是数千人;而如果你只是某门特定课程的学生,匿名集可能就只有20人左右。匿名集越大,匿名性就越强。
过去20年,人们在创建匿名消息系统方面做了大量工作,传统上是为了防范国家层面的监控。所有这些系统的基石都是混合网络。混合网络也是一种路由网络,但其转发目的不是为了效率,而是为了迷惑观察者。

经典的混合网络由David Chaum在论文《不可追踪的电子邮件、返回地址和数字假名》中定义。其核心思想是,网络中的节点对消息进行逐层加密和签名,消息在到达最终目的地前被逐层解密和验证。
为什么将电子邮件和路由相提并论?因为电子邮件和路由都是路由协议,在这方面它们非常相似。广义上说,混合网络与电子邮件的区别在于延迟。混合网络大致分为高延迟和低延迟两种。电子邮件属于高延迟系统。
最著名的低延迟匿名系统例子是Tor(洋葱路由器的简称)。它是最流行的匿名网络。Tor在TCP层之上增加了一层额外的路由。其工作原理是进行多层加密。




以下是Tor的基本工作流程:
- 发送方将消息用最终目的地的公钥加密。
- 然后,为路径上的每一个中间节点(中继)再包裹一层该节点的公钥加密。
- 消息像洋葱一样被层层包裹,然后发送出去。
- 路径上的每个中继依次解密属于自己的一层,以获知下一跳地址,然后将剩余部分转发出去。
- 直到最后一层被解密,消息才到达最终目的地。

Tor有效吗?是的,但它也存在一些弱点,例如出口节点可能被监控,且运行出口节点需要勇气。Tor的主要问题在于,它承诺的是匿名性,而非隐私性。如果用户行为不当,仍然会暴露身份。

使用Tor时需要注意以下事项:
- 不要访问你通常使用的网站。
- 不要使用Cookie。
- 注意DNS解析可能泄露信息。
- 不要在Tor上登录个人账户(如Facebook),这等于直接暴露身份。
- 用户的其他行为也可能破坏匿名性。
Tor并非唯一的混合网络。还有其他替代方案,例如:
- Freenet:一个作为托管系统开发的高延迟网络。
- Crowds:由我论文导师开发的系统。
- Mixmaster:另一个高延迟匿名邮件系统。

总结 📝
本节课中,我们一起学习了路由协议滥用行为。我们首先分析了一个因BGP路由配置错误和缺乏协调而导致的全球性网络中断案例。接着,我们探讨了如何将路由原理应用于匿名通信,重点介绍了混合网络的概念以及Tor系统的工作原理。

关于匿名性的关键点在于,它并非最优路由。路由的目的是尽可能高效地从A点到达B点,而匿名性的目的是迷惑观察者,让他们无法弄清你的去向。理解这种根本区别,对于分析网络协议的不同应用场景至关重要。
020:信息保障分析2 🎯

概述
在本节课中,我们将跟随约翰霍普金斯大学的Jason Crossland老师,了解《信息保障分析》这门课程的核心内容、结构以及学习目标。课程旨在通过理论与实践相结合的方式,教授信息保障分析的原则与应用。
课程讲师介绍
大家好,我是Jason Crossland。
我是约翰霍普金斯大学应用物理实验室的一名高级网络安全工程师。
我在JHU怀廷工程学院的继续教育项目中任教,同时也是一名军官。
我拥有超过20年的军事委任和民用领域经验,涉及信息保障、管理系统、技术视觉系统、网络安全工程、射击检测和道德黑客技术。
课程结构与内容
我开发了这门信息保障分析课程,它在Coursera平台上被分解为多个专业方向。
每个专业方向包含多个模块,通过讲座、阅读材料、视频、作业和讨论来呈现信息保障分析的主题。
你可以学习所有专业方向,也可以选择信息保障分析领域中你更感兴趣的部分进行学习。
上一节我们介绍了课程的基本情况,本节中我们来看看课程的具体目标与内容。
课程目标与学习成果
信息保障分析Coursera课程探索、识别并描述了适用场景,在这些场景中,信息保障分析原则可被应用,以实现更高水平的社会意识、识别、检测、预防,并通过收集数据、应用解决方案和预防性措施来增强系统的恢复能力和防御战术。
你将通过使用理论知识、案例研究、日志数据和用户数据文件以及作业中的视频,学习分析活动。
课程将教授构建有效信息保障计划的基本组成部分。
你还将理解并认识到有效的IA原则如何为政策制定、标准操作程序、取证研究、数据分析科学、事件响应和处理程序提供信息。
以下是课程将研究的各种分析技术:
- 收集
- 方法评估
- 总体估计
- 假设检验
- 实验评估
并且,你将培养用于取证分析的证据链思维。
涵盖主题范围
课程主题包括但不限于以下内容:
- 恶意软件
- 防病毒与漏洞原理
- 物联网
- 人工智能
- 移动应用安全
- 寻址与端口网关协议
- 查询与匿名化
- 分布式控制系统
- 通用研究记录类型
- 协议分析:DNS、HTTP、SNTP和TCP协议的分析。
课程将进一步研究IT与非IT协议弱点及其应对措施,具体包括:
- We now Zigbee
- EMV
- SigFox
- Z-Wave
- Modbus
- DNP3
- Hart
- BACnet
- ICCP
- OPC
教学理念与期望
我的目标是使学习过程有趣、愉快且引人入胜。
将复杂的概念转化为易于理解和应用的可管理学习模块。
我希望学生们能够获取信息保障分析Coursera平台课程中提供的理论思想和知识,利用讲座、阅读材料、作业和讨论,然后将所学应用到职业生涯中。
我很高兴大家对这门课程感兴趣。
感谢大家的关注。
我希望每个人都能享受Coursera上的信息保障分析课程。
祝大家有美好的一天。
感谢大家在Coursera平台上选修这门课程。
总结
本节课中,我们一起学习了《信息保障分析》课程的整体框架。Jason Crossland老师介绍了他的专业背景、课程的分专业方向结构、核心学习目标(包括提升系统防御能力和掌握多种分析技术),以及课程将广泛涵盖从恶意软件到各类通信协议安全等主题。最后,老师表达了他希望将复杂知识变得易于掌握,并助力学生职业发展的教学愿景。
021:匿名性的形式化模型 🕵️
在本节课中,我们将学习匿名性的核心概念与形式化定义。我们将探讨匿名性的目标、实现方式以及相关的关键术语,如匿名集、K-匿名性和混合网络。通过本模块,你将掌握讨论和分析匿名性问题的基本词汇和框架。
匿名性的定义与重要性


匿名性是计算机安全研究中最受关注的主题之一。例如,在主要的学术会议“IEEE安全与隐私研讨会”(又称奥克兰会议)中,作为隐私一部分的匿名性扮演着重要角色。
有多种术语用于描述匿名性,包括“混合网络”。混合网络有其特性和意图达成的目标,并且存在多种方式来实现我们想要的匿名性。我们将逐一讲解这些内容,以便你理解匿名性是如何实现的,以及特定的选择如何影响匿名性的强弱。
为了理解匿名性,最好从回顾“检察官谬误”开始。如果你不记得了,这是在课程早期讲过的内容。检察官谬误是一种常见的统计错误,其假设是:因为两个事件各自都很罕见,所以它们同时发生的概率就异常之低。
一个经典例子是萨莉·克拉克案。她被指控谋杀了自己的孩子,而指控她谋杀了第二个孩子的论据是:她的第一个孩子死于婴儿猝死综合征,第二个孩子也死于婴儿猝死综合征。因此,检察官将单个孩子死于SIDS的概率自乘,并声称这个概率小得离谱。然而,如果比较那些有过孩子死于SIDS的家庭,他们第二个孩子死于SIDS的概率会更高。这些事件是相关的,而非独立事件。
这个概念中的“群体”或“实体集合”正是我们在讨论匿名性时需要关注的核心。


匿名集与去匿名化
我们形式化讨论的匿名性,是指能够模拟一个足够大的群体的行为,从而无法从该群体中的其他成员中被区分出来的能力。这个群体就是我们所说的匿名集。
我们如何定义这个“群体”呢?实际上,我们谈论的是收集到的数据。例如,如果我观察一组使用网络流量的人群,我的行为是否与其他人足够难以区分,从而不必担心被识别出来?
去匿名化的过程涉及将匿名集分解为更小的子集。
例如,如果我们不仅仅看网络流量,还查看照片,或者建立一个系统来识别所有戴水果帽的人(就像我在这个演示中使用的那样)。去匿名化的策略就是找到这个集合,并将其分解成更小的集合,找到我们可以用来识别和描绘个体的特征,最好能精确到个人。

数据库设计中有一个类似的概念,叫做K-匿名性。我之前描述的匿名性与K-匿名性的区别在于:前面的匿名性是一种行为,而K-匿名性是一个目标,是数据库内部的一个设计标准。
其目标是:如果数据库中某些字段的组合可以用来识别某人,那么对于该字段组合的每一种取值,数据库中至少应有k个对应的记录,以确保个人无法通过该字段组合被唯一识别。
例如,如果我们记录头发颜色和食物偏好这类信息,对于这些特征的每一种组合,我们至少应有k个实例,以确保我们无法通过该组合指向特定的个人。


为何需要匿名性?
这自然引出一个问题:我们为什么需要匿名性?原因多种多样,目前我将重点讨论以下三个:维护尊严、保障言论自由和规避起诉。
-
维护尊严:在这个语境下,我希望你思考的是,可能存在关于你的尴尬信息,或者可能让你丢掉工作、丧失社会地位的信息。这并不一定意味着你是坏人、罪犯或类似的人。只是意味着,如果有人有足够的动机去调查数据库,他们可以通过各种方法找出人来识别个体。有一篇由S. Schmaticco和Naya撰写的论文(我已放入阅读材料),他们能够通过人们的Netflix偏好来识别个体。一个更明显的例子是医疗记录:你可能不希望别人知道你患有什么疾病,如果这不关他们的事。
-
保障言论自由:关于这一点,我持保留态度。这通常是匿名化系统的常见论点,但我并不完全相信这些系统能达到宣称的效果。我并非不同意这种观点,而是质疑其结果。像Tor和Freenet这样的工具(我们稍后会讨论)被设计用于抵抗审查,这意味着使用者可以在没有恐惧的情况下进行交流。然而,也有失败的案例,比如大约两年前发生的一个涉及名为Hastack的系统的著名灾难,我们也会提及。


- 规避起诉:这不是一个价值判断,但匿名工具是技术工具,是软件,它们不做价值判断。因此,它们既能被用来规避伊朗的法律,也能被用来规避美国的法律。因此,使用这些工具的人目的各异。右边这张图片是一个名为“丝绸之路”的Tor隐藏网站。这是一个除非使用Tor否则无法访问的系统。Tor是一种旨在使你的网络流量无法追踪的路由系统。“丝绸之路”更进一步,它结合了Tor和一个名为比特币的匿名电子货币系统,以保护用户的匿名性。
如何实现匿名性?
如前所述,匿名性是通过生成一个匿名集来实现的。K-匿名性是数据库设计中实现这一目标的标准,但在网络流量中,这通常通过我们称之为混合网络的东西来实现。

混合网络是一组在网络中转发流量的路由器集合。在这里,“路由器”不一定指BGP路由器。最早的混合网络系统源于David Chaum在80年代初的工作,完全是基于电子邮件的。事实上,电子邮件路由是第一种匿名通信形式。
混合路由与经典路由的关键区别在于:混合路由专注于通过不可预测的路径发送流量以混淆追踪者;而经典路由追求最短路径。混合路由则故意将流量发送经过多个系统,使其难以追踪。
传统上,混合网络根据性能分为两类:高延迟和低延迟。这实际上是一种简化的说法,用来描述用户使用时是否会感到抓狂。
- 高延迟混合网络:类似于电子邮件,流量以自己的节奏发送,你无法准确预测它何时到达。如果你在等待邮件,你可能需要等上一段时间。
- 低延迟混合网络:旨在支持像网页浏览这样的活动。因此,低延迟混合网络会足够快地发送流量,以使系统可用。网页浏览往往是这类系统的典型用例。

除了这个普遍的延迟要求,你还应该记住,匿名性工具通常不优先考虑性能。事实上,这里存在直接的权衡。匿名性系统的目标是打乱数据包,使用户无法被追踪。这意味着它们会采用更长的、不可预测的路径。为了设计一个有效且可用的系统,你需要在匿名性需求和可用性之间取得平衡。
匿名性面临的最大问题是熵。熵是信息论中结构性的度量,它描述了数据中包含多少信息。经典地,当我们谈论熵时,我们指的是香农熵。香农熵是可压缩性的度量。如果信息是结构化的,有很多重复的模式,那么该信息的熵就低,易于压缩,并且你会发现其中有很多可以识别和提取的特征。
你在密码学中遇到过这个概念。密码学的目标是让数据看起来像随机噪声,看起来是随机的。如果它是随机的,它就是高熵的,这就是为什么加密数据难以压缩。而互联网数据通常是结构化的,这意味着它的熵较低,各种特征出现的概率较高。

总结
本节课中,我们一起学习了匿名性的核心概念:匿名集、延迟和混合网络。
- 匿名集是我们描述某事物是否匿名的工具。集合越大,匿名性越强。
- 延迟是匿名性工具的一个质量属性。它意味着你通过牺牲速度来换取匿名性。延迟反映了信息通过系统的速度以及系统对用户的可用性。
- 混合网络是我们用来实现匿名性的主要工具。


理解这些概念是分析和设计匿名性系统的基础。
022:混合节点与分布式哈希表 🔐
在本节课中,我们将学习匿名化系统中的核心工具:混合节点网络和分布式哈希表。我们将探讨它们的工作原理、历史背景以及在实际系统(如Tor和BitTorrent)中的应用。

概述
互联网在设计之初并未将匿名性作为核心原则,这导致了一些固有的匿名性缺陷。为了应对这些挑战,研究人员开发了混合节点网络和分布式哈希表等工具。本节将详细介绍这些工具,并分析它们在保护用户隐私方面的作用与局限。
互联网的匿名性基础

上一节我们介绍了课程背景,本节中我们来看看互联网匿名性的基础。互联网协议本身对匿名性漠不关心。这意味着,虽然存在一些固有的匿名性,但这更多是设计疏忽而非有意为之。例如,在IP地址查找练习中,我们能够确定IP地址的归属和名称。此外,多年前的“追溯”技术试图定位攻击源,但效果有限。因此,互联网内置的匿名性非常薄弱。
同时,中心化结构也严重限制了匿名性。例如,在浏览网页时,几乎每个页面都会与Google或广告网络通信,这使得保持匿名变得异常困难。

匿名性研究的兴起
在20世纪90年代中期,匿名性成为一个焦点问题。当时,密码学和匿名性研究,尤其是美国国防部资助的研究,取得了巨大进展。此外,一个名为“密码朋克”的邮件列表汇集了持有自由意志主义观点的人士,他们相信通过高级密码学可以保障个人自由。


这一时期还发生了许多事件。例如,匿名转发服务器与山达基教会之间的冲突,成为了一个典型案例。该服务器因泄露教会认为受版权保护的信息而被关闭。这个例子揭示了一个关于匿名性的普遍观察:单一解决方案存在脆弱性。
混合节点网络
为了解决单一节点的脆弱性,传统上我们使用混合节点网络。混合节点网络是一个由路由转发系统组成的网络,它们转发流量而不记录来源。混合节点的原始概念由David Chaum在1981年的一篇论文中提出。其核心思想是:通过混合节点对数据进行洗牌,使得数据来源变得不可追踪。


混合节点的功能不仅限于路由。它们通常会对信息进行加密。因此,当你从点A开始时,你将消息加密发送到点B。如果你不在点B且没有密钥,你就无法解密消息。
经典的混合网络由Chaum定义,而密码朋克则根据一系列属性对混合节点进行分类:
- 类型1混合节点:剥离传输数据。这意味着它会从电子邮件消息中删除SMTP头部等信息,使消息看起来像是直接从该转发器或投放点发出的。
- 类型2混合节点:这是经典的Chaum混合节点,特别是名为Mixmaster的系统。
- 类型3混合节点:这是Chaum系统的改进版本,称为Mixminion,它增加了各种技术来防御原始设计后发现的各种攻击。
需要注意的是,混合节点大致分为高延迟和低延迟两种。高延迟混合节点不关心你何时收到信息,而低延迟混合节点则有性能约束。


Tor:洋葱路由
在讨论了混合节点的分类后,我们来看看最成功的混合网络:Tor。Tor是历史上最流行、最成功的混合节点网络。它最初由Paul Syverson等人进行数学开发,实际实现则由Roger Dingledine和一个名为Tor Project的团队完成。
Tor是一个低延迟网络,你可以用它浏览网页,许多人确实这样做。它在某种程度上用我们所说的洋葱路由取代了传统路由。更准确地说,它在传统路由之上提供了洋葱路由。
让我们谈谈Tor实际如何工作。你从一开始就生成整个路由:获取入口节点,从Tor可用的节点中选择路径。你可能不知道完整的节点集合,但你知道一个足以让你连接到出口节点并进而接入互联网的子集。你在构建连接时就决定了路由。这与经典的路由器逐跳决定路径不同,你提前知道所有这些信息。你提前知道这些信息的原因是你将逐步加密信息,这就是洋葱路由。
洋葱路由的工作原理是结合转发和加密。当你创建消息时,你使用目标站点的公钥对目的地信息进行层层加密。然后,目标节点解密该信息并重复该过程。例如,如果我要经过A、E到H,那么我首先用H的公钥加密我的消息,并说明要发送给H。然后,我将这个结果用E的公钥加密,并包含发送给E的指令。重复这个过程,最后用A的公钥加密并发送给A。A依次剥离外层加密,它只知道有一个必须发送给E的数据包。E收到消息后,解密其外层,发现它是一个只能发送给H的加密数据包。只有H能理解里面的内容。因此,例如,如果我攻破了E,我无法查看消息,因为它是为H加密的。唯一能解密该消息的实体是H。我实际上能读取消息的唯一方式是攻破H本身。



Tor有效吗?Tor存在几个问题。最臭名昭著的是出口节点流量。多个出口节点的运营者曾被逮捕。运营出口节点的大学经常需要与警方沟通。不过,可能最重要的一点是,你必须规范自己的行为才能保持匿名。你不能访问你通常访问的站点,你需要担心DNS解析,不能使用可能泄露身份的Cookie或运行间谍软件。你最好在一台干净的机器上做这些。对于大多数用户来说,这是一个不小的主要挑战。他们设置了Tor访问,但第一件事就是去有Facebook的网站,结果发现他们的Facebook Cookie还在,这就泄露了身份。
此外,还开发了多种攻击Tor的技术,包括基于时间的攻击和涉及有限节点妥协的技术。我们将在后续课程和部分作业中更详细地讨论这些。


分布式系统与点对点网络
关于匿名性需要记住的是,Tor并非唯一方案。从90年代中期至今,为了应对各种挑战(如前文提到的山达基教会事件和Napster),人们构建了多种系统。这些系统的共同原则包括:服务去中心化、服务复制和加密。
匿名性变得重要的一个原因是Napster被关闭。Napster是第一个点对点文件共享(主要是音乐)应用程序,出现在90年代中期。在Napster之后,开发了包括Gnutella、Tor以及名为Winny的日本系统等一系列文件共享工具。这些系统通常因为依赖中心点而被打击。例如,Napster依赖一家公司,Gnutella和Winny有核心服务器。BitTorrent使用追踪器和对等节点,正如我们将讨论的,如果这些追踪器被关闭,可能会破坏部分网络。许多系统都是通过拔除中心控制节点而被阻止的。


分布式哈希表
在讨论匿名性或保护系统时,我们必须做此免责声明:我们暂且搁置自由问题。盗版是非法的,文件共享很可能涉及隐私。正因为如此,用户对不被追踪越来越感兴趣。这对我们来说是个问题,因为用户现在越来越积极地希望保持其所有流量的匿名性。我们想要防御这个问题,但从用户的角度来看,我们是“内部警察”,所以他们不会向我们透露他们在做什么。知识产权问题可能非常严重。


一个有趣的例子是日本维基百科和英文维基百科的对比。如果你访问日本维基百科,你会发现几乎没有图片,几乎全是文字。这是日本知识产权法严格规定的结果。在美国,你必须积极维护版权;在日本,你只需主张权利,不维护也不会损害权利。但结果是,在日本,维基百科页面上不放任何图片,而美国维基百科则倾向于包含图片。

另一个需要记住的是,当我们再次谈论匿名性和盗版网站时,我们遇到了单点故障系统。正如法律斗争所预期的那样,这导致了爆炸性的增长。例如,当流行的种子网站Demonoid的追踪器被关闭时,意味着这些系统对保护措施感兴趣,主要是加密和去中心化。
加密相当直接,我们来谈谈去中心化,特别是称为分布式哈希表的路由机制。去中心化从系统中移除了中心服务器。通过这样做,当单点故障会造成损害时,它们能保持系统运行。它们通常模拟各种路由技术,最常见的形式是目前称为DHT或分布式哈希表的技术。


DHT对我来说很有趣,因为它们作为一个学术概念出现大约四年后,实际应用就出现了。在学术界,我几乎从未见过任何东西只花四年就进入外部世界。这尤其迅速地被大众采纳,原因在于这样他们就不必处理中心化带来的问题。
有多种主要的DHT,常见的有Chord、CAN、Tapestry和Pastry。这些系统通过创建一种机制来为节点分配全局ID,然后在节点上设置本地路由表以提供邻接功能,并在节点之间传递流量。其思想是,当你使用BitTorrent并连接到追踪器时,追踪器告诉你到哪里寻找文件的特定实例或文件的一部分。而使用DHT,你向网络请求搜索特定ID,网络将你传递到该ID所在的节点,而无需连接到中心追踪器。DHT用于组织信息。


一个DHT示例(Pastry)可以让你了解这些系统通常如何工作:Pastry为节点随机分配128位ID,并假设均匀分布。因此,如果你有一个节点网络,节点间的平均距离应该是2^128 / n。Pastry的工作方式是,如果一个节点ID是目标,你去找与你拥有最长共同前缀位数的节点。因此,你需要在你的节点上维护一个路由表,它为你指向那些与你有n位共同前缀的节点。这是一种路由技术,通过保持路由表较小,并假设ID均匀分布,你应该只需有限次数的搜索就能到达目标。
令人惊讶的是,这些东西已经被BitTorrent社区非常积极地采纳了。如果你下载一个当前的BitTorrent客户端(如μTorrent),你会发现首先原生加密已被支持。有趣的是,BitTorrent的发明者Bram Cohen最初反对加密,因为他认为这破坏了BitTorrent作为传输信息的合法协议的理念。BitTorrent最初是为传输红帽ISO而设计的。BitTorrent也有无追踪器功能,如果你查看,会发现它提供基于DHT的查找。像海盗湾这样的网站非常提倡使用无追踪器模式。你会发现某些BitTorrent站点只接受以无追踪器方式或使用非常规端口号进行的通信,以隐藏用户身份。
总结

本节课中,我们一起学习了匿名化系统的基本工具:混合节点和去中心化技术。我们讨论了这些分布式系统的工作原理,展示了一些应用这些技术的系统实例(如Tor和BitTorrent),并探讨了它们的使用要点。在下一讲中,我们将讨论为什么实现匿名性如此困难。
023:实现匿名性的困难 🎭

在本节课中,我们将探讨为什么实现真正的网络匿名性如此困难。匿名性长期以来都是信息安全领域部分研究者追求的目标,但事实证明,要达成这一目标极具挑战性。
为什么匿名性难以实现?
匿名性难以实现,一个核心原因在于,要达成匿名,你必须以匿名的方式行事。本模块的目标是帮助你理解这背后的原因,包括人类行为的低熵特性以及互联网服务的中心化趋势。
上一节我们介绍了匿名性的概念,本节中我们来看看具体有哪些因素使其难以实现。
使用Tor网络时的限制


如果你想使用Tor网络实现匿名,必须遵循一系列严格的操作规范。以下是使用Tor时的一些基本要求:
- 禁止登录:不能登录任何需要密码和身份验证的网站。
- 避免常用网站:不能访问你平时经常使用的网站。
- 禁用Cookie:不能启用浏览器Cookie。
- 检查DNS:需要检查并确保DNS查询不会泄露信息。
- 防范恶意软件:确保系统没有运行恶意软件。
- 禁用浏览器插件:不应运行任何浏览器插件。
存在一个很大的问题是,你正在运行的软件本身已经进行了大量的跟踪和追踪,这使得以匿名方式使用Tor变得相当不便。
行为习惯会暴露身份
另一件你必须做到的事是:你不能像平常一样行事。计算机科学中有一个经典案例,即通过统计分析来确定《联邦党人文集》的作者身份。这些文章均以笔名“Publius”发表,实际由麦迪逊、汉密尔顿和杰伊撰写。研究发现,有多种技术可用于识别某篇文章是否由特定作者所写。
以下是几种常用的作者身份识别方法:

- 词汇选择分析:分析作者对特定词汇的偏好。
- 语法错误分析:统计语法错误的出现模式。
- 词频分析:统计特定术语出现的频率。
- 特殊术语使用:识别作者使用的独特术语。
- Hapax Legomenon(罕用语):指在整个语料库中仅出现一次的词语,这是翻译学中的一个术语。
- 句子长度分析:分析作者习惯的句子长度。
所有这些特征都是你养成的习惯,本质上构成了你的个人风格。这些习惯会标识你的身份,即使你使用了世界上最先进的路由和加密系统,也可能被用来推断出你是谁。
匿名性困难的根本原因
这正是匿名性困难的核心所在。匿名性之所以困难,原因主要有两点:


- 便利性与中心化:为了让生活更便利,我们将许多服务组织并中心化。
- 行为习惯:我们在写作和浏览网络时都养成了特定的习惯。例如,我每天都会访问《纽约时报》、Ars Technica和一些信息安全网站,这形成了固定的模式。
同时,为了让互联网正常工作,我们不得不将许多服务集中化。谷歌和内容分发网络承载了互联网的大部分流量,无论你做什么,很可能都在与它们通信。
浏览器指纹识别:Panopticlick项目

为了具体说明这一点,我们可以看看一个名为Panopticlick的系统。这是电子前沿基金会的一个项目,其成果发表在2010年隐私增强技术研讨会(PETS)上。
Panopticlick是一个网站,当你访问它时,它会统计分析你的浏览器配置信息。这些信息很容易被获取,Panopticlick使用了多项指标(部分需要JavaScript或用户同意才能获取)。该网站会告诉你某项配置值在你身上出现的概率、有多少浏览器可能拥有相同的值,以及该值包含多少信息熵(独特性)。
Panopticlick会检查多项浏览器配置信息,以下是其中一部分:
- 用户代理字符串
- HTTP Accept头部
- 浏览器插件列表
- 时区
- 屏幕尺寸
- 系统字体
- Cookie设置
- 各种基于Cookie的测试


这些都是机械的配置信息,是你的浏览器为了提升用户体验而传递的。这些信息对你完全隐藏,但却是HTTP会话的一部分。
以我为例,我就因为安装了一款特定字体而变得独特。我安装了“Tengwar”字体(如果你不熟悉,它来自托尔金的作品)。某次阅读时,我想看看这种字体的效果,就安装了它。Panopticlick使用的许多识别技术正是基于浏览器插件和字体——这些你基于个人喜好安装并设置在浏览器上的东西。因此,如果你安装了一些独特或有趣的字体,它很可能被用来识别你。
核心矛盾:匿名性与便利性
这就是问题的关键所在。有可能做到行为匿名,但如果你选择匿名,就意味着要让自己行事不便。匿名性并不便利,它很困难。

我们在信息安全领域,特别是在研究匿名性的政治敏感社区中遇到的一个问题是:我们必须非常小心,不要向人们兜售“虚假的希望”。为了使用匿名系统,你必须表现得像在隐藏自己。如果不这样做,你将会暴露身份的各个方面。
我不会随意使用Tor浏览网页。坦率地说,如果我使用Tor,那是因为我正在从事一项特定的、有限的活动,并且希望它是不可追踪的。我不会用它进行大量的用户交互。例如,如果要用它发送邮件,我会尽可能简洁,并尽量避免使用我平常的说话方式。
可用于追踪的基本行为特征
存在多种基本的行为特征可用于追踪你,这包括:

- 语法行为特征
- 浏览器偏好设置
- 生物特征识别
在下一讲中,我们将利用这些技术来探讨如何实际打破匿名性。
总结

本节课中我们一起学习了实现网络匿名性为何如此困难。我们了解到,即使使用了像Tor这样的匿名工具,用户的行为习惯、浏览器指纹以及互联网服务的中心化结构都会导致身份暴露。真正的匿名要求用户改变其常规的在线行为模式,而这通常以牺牲便利性为代价。记住,匿名是一种需要刻意实践的行为模式,而不仅仅是一种技术工具。
024:流量去匿名化技术 🕵️
在本节课中,我们将学习流量去匿名化的核心概念与技术。去匿名化旨在识别匿名网络流量背后的用户身份。我们将探讨多种技术,从行为分析到高级数据挖掘方法,并理解为何完全匿名在实践中难以实现。
概述



去匿名化没有一套固定的规则。本模块将讨论多种用于追踪或揭示用户身份的技术。这些技术本质上可归结为寻找用户的“痕迹”。有些是行为分析技术,有些则是更高级的方法,相关论文中有所涵盖。目前没有能保证在法庭上提交结果的“匿名攻击系统”,但存在一些通用的操作原则。
核心原则
以下是进行去匿名化时可遵循的三条核心原则。
- 不按系统规则行事:匿名系统在特定设计假设下提供匿名性。研究者们倾向于在明确的边界内讨论系统。因此,攻击时应寻找系统设计者忽略或回避的方面,而非攻击他们已讨论过的防御点。
- 寻找共同习惯:大量文献研究通过寻找用户的共同习惯来去匿名。这包括分析浏览习惯、点击模式等。
- 审视次级服务与依赖:查看用户与附属网站(如谷歌、脸书、推特)的通信。用户可能在不自知的情况下访问这些站点,例如通过广告或Cookie。此外,还应关注恶意软件、间谍软件、侵入性浏览器插件等。

行为与习惯分析
上一节我们介绍了核心原则,本节中我们来看看如何具体分析用户行为。
一个关键视角是关注“长尾”分布。许多用户会定期访问一组独特或小众的网站。这符合经典的帕累托分布(80/20法则):80%的访问流向20%的热门网站(如谷歌、YouTube)。然而,分布还存在一个“长尾”——对于每一个谷歌,都有成千上万个仅被少数人访问的站点。


以下是“长尾”包含的典型站点类型:
- 小众博客,特别是政治或爱好类博客。
- 特定主题的网站。
- 用户定期且独特地访问,但并非人人皆访的爱好站点。
低熵信息与高级技术


最通用的去匿名化方法是寻找低熵信息序列,即内部存在大量结构的信息。一个更高级的技术例子是阅读材料中提到的一篇论文:《揭示加密网络电话对话中的口语短语》。
该论文的核心思想是,即使语音数据已被加密,你仍可通过数据包长度来解码VoIP消息。因为不同的声音(音素)以不同的比特率编码。例如,某些编码器对元音的编码速率高于辅音(如“f”或“s”这种气流通过两个表面产生的声音)。这种差异导致了不同的数据包大小。
语言结构与马尔可夫模型
为了理解上述技术,我们需要了解语言结构。英语中大约有40到60个音素,它们是语言中独特的原子性声音。当我们说一个英文单词时,实际上是组合了一系列音素。

然而,音素序列的分布并不均匀。某些组合非常常见,而有些则几乎不会出现(例如,舌头很难连续发出“th”和“z”的音)。如果你能计算出这些序列的概率,就能很好地猜测特定的数据包序列可能对应什么内容。
我们使用马尔可夫模型(Markov Model)来实现这一点。马尔可夫过程是一种“无记忆”的统计过程,其下一个状态仅取决于当前状态。
一个马尔可夫模型通常表现为一个图,包含一系列带有概率标签的状态转移。例如:
状态A --(概率0.8)--> 状态B
状态A --(概率0.2)--> 状态C
在机器学习中,我们使用隐马尔可夫模型。这是一种人工智能技术,通过观察输出来推断出马尔可夫模型。例如,输入大量英文句子,HMM算法可以学习并输出描述各种音素转移概率的模型。

去匿名化的核心挑战
前述论文利用隐马尔可夫模型,根据数据包长度来推断可能的声音。关键在于,单个数据包长度可能对应多个音素,但一旦将它们组合成序列,就更容易识别其可能的内容。
这触及了实现匿名性的核心难题:低熵数据。任何具有大量结构的信息(如用户习惯、互联网工程特性导致的偏好分布)都会使匿名化变得困难。

为了使匿名系统有效,必须确保攻击者能观察到的几乎所有信息都是均匀分布的。例如,上一讲中提到的高延迟混合网络,会控制数据包定时和大小以确保匿名性。但问题在于,使一切均匀分布意味着效率的损失。
匿名性、效率和便利性三者相互制约。为了隐私,你不得不以匿名方式行事,而这种方式往往既不高效也不方便。
总结
本节课中,我们一起学习了用于打破匿名性的多种技术概览。关键要点在于,去匿名化涉及攻击那些低熵的属性。存在许多此类属性可供分析:


- 生物特征
- 浏览习惯
- 购物习惯
- 位置信息

这些都是识别用户行为的可行技术。理解这些原理有助于我们更好地设计防御措施和评估匿名系统的实际强度。
025:DNS协议概述 🧭

在本节课中,我们将要学习DNS(域名系统)的基础知识。DNS是互联网的核心基础设施之一,它将人类友好的域名(如 www.jhu.edu)转换为机器可读的IP地址(如 192.168.1.1)。本节课将提供一个高层次的概述,帮助你理解DNS的角色、基本工作原理及其在互联网中的中心地位。
DNS的角色与重要性

上一节我们介绍了课程模块,本节中我们来看看DNS的核心作用。
DNS的根本目的是让互联网对用户更友好。互联网地址本质上是介于1到2^32之间的数字,但人们更习惯使用名称,例如 www.jhu.edu。DNS提供了将名称映射到IP地址的机制,极大地方便了用户。

此外,DNS深度嵌入在互联网基础设施中。例如,邮件系统(SMTP)依赖DNS来确定邮件的路由目的地。DNS也是信任和证书体系的基础,域名会出现在X.509证书中,从而产生与之相关的信任问题。

DNS的起源:Hosts文件
在深入讨论DNS协议之前,我们先了解一下其前身。
最早的名称解析等价物是Unix系统上的 /etc/hosts 文件。这是一个简单的文本文件,包含了IP地址与主机名之间的对应关系。在Windows系统中,它通常位于 C:\Windows\System32\drivers\etc\hosts。

以下是该文件的一个示例格式:
127.0.0.1 localhost
192.168.1.10 myserver.local
关于这个文件,有两点需要注意:
- 名称可以是任意的,不一定是完全限定域名。
- Hosts文件至今仍在使用。操作系统在进行名称解析时,通常会首先查询此文件。
正因如此,恶意软件常会攻击Hosts文件。许多病毒或木马入侵系统后,会修改此文件,将知名安全厂商的域名指向本地回环地址 127.0.0.1,从而阻止用户获取安全更新。

完全限定域名

在讨论DNS协议细节前,我们需要理解一个核心概念:完全限定域名。
你可能已经注意到域名具有层次结构,例如 www.ep.jhu.edu。这种结构化的名称就是FQDN。它类似于文件的绝对路径,从最具体的部分(左)到最通用的部分(右)排列。
一个显式指定的FQDN在末尾会有一个点 .,例如 www.ep.jhu.edu.。这个点代表DNS的根域。大多数情况下,DNS解析会使用隐式域名。例如,在 jhu.edu 域内查询 ep,解析器会自动将其补全为 ep.jhu.edu。
你可以将DNS想象成一棵倒置的树,根 . 在顶端,其下是 com、edu、org 等顶级域,再往下是 jhu、google 等二级域,以此类推。


DNS系统的工作原理
显然,仅靠Hosts文件无法支撑全球数十亿台主机的名称解析。解决方案就是域名系统。
DNS是一个分层级的分布式数据库,用于将名称映射到IP地址。它的工作方式基于委托授权:
- 根服务器将
.edu域的权威委托给管理.edu的服务器。 .edu服务器再将jhu.edu的权威委托给约翰霍普金斯大学的DNS服务器。- 约翰霍普金斯的DNS服务器则负责管理其域内(如
www.jhu.edu)的记录。
FQDN的解析过程正是沿着这条路径进行的。例如,解析 up.quark.phys.cmu.edu.:
- 查询从根
.开始,找到负责.edu的服务器。 - 询问
.edu服务器关于cmu.edu的信息,得到CMU的DNS服务器地址。 - 询问CMU的DNS服务器关于
phys.cmu.edu的信息。 - 依此类推,直至找到负责
up.quark.phys.cmu.edu的最终权威服务器并获取IP地址。

这个过程就像沿着树形结构逐级向下查询。

域名注册与管理机构
你可能会问,谁来决定 cmu.edu 归卡内基梅隆大学所有?答案是注册管理机构。
以下是域名注册的层级结构:
- ICANN:互联网名称与数字地址分配机构,管理根域和顶级域。
- 顶级域注册管理机构:负责运营特定顶级域的公司或组织。例如:
- 通用顶级域:如 Verisign 运营
.com, Educause 运营.edu。 - 国家代码顶级域:如 Nominet 运营
.uk(英国)。
- 通用顶级域:如 Verisign 运营
- 注册商:经注册管理机构授权,向公众销售域名的公司,例如 GoDaddy、Namecheap。

如果你想注册一个 .com 域名,你需要向 GoDaddy 这样的注册商付费。注册商再向 Verisign (.com的管理机构) 付费,Verisign 最终向 ICANN 付费。这是一个链条式的正式商业协议。
不同顶级域有不同的注册政策。.edu 仅限 accredited 教育机构注册,.org 通常面向非营利组织,而 .com 则对所有人开放。

IP地址的分配
拥有了域名之后,如何获得与之关联的IP地址呢?答案是互联网服务提供商。
IP地址的分配也是一个分层级的过程:
- IANA:将大块的IP地址空间分配给区域互联网注册管理机构。
- RIR:全球共有5个RIR(如 ARIN 负责北美,APNIC 负责亚太),它们将地址分配给大型ISP或组织。
- ISP:互联网服务提供商从RIR获得地址块,再将其中的一部分“租借”给终端用户或企业。

需要明确的是:购买域名和获取IP地址是两个独立的过程。你可以购买一个域名而不将其指向任何服务器(即“占位”)。但若想建立一个网站,你就需要从ISP获得一个IP地址,并在DNS记录中将你的域名指向这个地址。
由于IPv4地址资源有限(约43亿个),其分配和管理显得尤为重要。目前所有IPv4地址块均已分配完毕,市场主要通过交易和租赁来流通现有地址。

信息查询工具:Whois

如何追踪域名和IP地址的注册信息?核心工具是 whois。
你可以在命令行中使用它:
whois example.com
或
whois -h whois.arin.net 192.168.1.1

需要注意的是,whois 数据库的信息质量参差不齐。它没有统一的格式,信息更新可能不及时,甚至可能缺失。因此,查询时可能需要尝试多个 whois 服务器(例如,针对不同RIR的服务器)。
以下是进行有效 whois 查询的一些技巧:
- 逐级深入:
whois查询是层次化的。一个查询结果可能会指引你到另一个更具体的whois服务器。 - 查看周边:个人或公司通常不会只拥有一个IP地址,而是一个地址块(如
/27网段)。除了查询特定IP,也可以查看其相邻地址的注册信息,以发现更多关联。

总结

本节课中我们一起学习了DNS的基础概述。
我们讨论了DNS在互联网中扮演的核心角色,即实现域名到IP地址的映射,并支撑着邮件、证书等诸多关键服务。
我们了解了域名和IP地址的获取途径:域名通过注册商-注册管理机构的层级体系购买;IP地址则通过ISP-RIR的层级体系租用。
最后,我们介绍了用于查询这些注册信息的 whois 工具及其使用技巧。

重要的是要认识到,整个DNS体系建立在社会共识和商业协议之上。我们使用的“官方”DNS根服务器由ICANN协调。虽然也存在替代根服务器,但由于缺乏规模、带宽和全球支持,其影响力有限。

本节课为你建立了一个关于DNS如何运作的总体框架。在接下来的课程中,我们将深入探讨DNS协议的技术细节、报文结构以及其中涉及的安全问题。
026:A记录与DNS查询机制 🔍

在本节课中,我们将要学习DNS协议的核心操作机制,特别是A记录和DNS查询过程。我们将从DNS的基本概念入手,逐步深入到数据包格式、查询类型以及实际查询工具的使用。

上一节我们介绍了域名和IP地址的获取等高层概念,本节中我们来看看DNS查询的具体过程是如何进行的。
DNS查询概述 🌐

DNS协议的目标是解析域名到IP地址。理解这个过程至关重要,因为它是互联网运作的基础。DNS查询过程与传统的静态主机文件(如/etc/hosts)分配方式有根本区别,它引入了层次化缓存和动态解析机制。
DNS客户端与服务器 🖥️

DNS客户端通常被称为解析器。其配置通常存储在一个名为resolv.conf的文件中。该文件内容简单,主要包含一个或多个DNS服务器的IP地址。
DNS服务器本质上是层次化的缓存系统。缓存机制对于提升查询性能至关重要,因为完整的域名解析过程可能涉及多次服务器间的往返查询。

以下是DNS层次化查询的基本步骤:
- 客户端向根服务器查询顶级域(如
.edu)的权威服务器地址。 - 根服务器返回指向
.edu域权威服务器的信息。 - 客户端再向
.edu权威服务器查询二级域(如jhu.edu)的权威服务器地址。 - 最终,
jhu.edu的权威服务器返回目标主机(如www.jhu.edu)的IP地址。
DNS数据包格式 📦
DNS主要基于UDP协议(区域传输等特殊情况除外)。理解DNS数据包格式是分析查询过程的关键。

一个基本的DNS数据包格式包含以下核心部分:
- 查询ID:一个16位的随机整数,用于匹配查询与响应,维持UDP协议下的“状态”。
- 标志位:16位,用于标识查询类型(如递归查询、权威应答等)。
- 计数区:包含问题数、答案数、权威记录数、附加记录数等。
- 资源记录:实际承载DNS信息的区域,包含多种类型的记录。
DNS查询与响应详解 🔄

一个DNS查询主要由三部分组成。

查询名称采用一种类似Pascal字符串的编码方式:每个标签(如www, jhu, edu)前有一个字节表示其长度,最后以长度0结束。例如,www.jhu.edu的编码为:3www3jhuedu0。每个标签长度限制为63个字符。

查询类型指定要查找的记录类型。虽然存在约20-30种类型,但最常用的几种包括:
- A:将主机名映射到IPv4地址。
- AAAA:将主机名映射到IPv6地址。
- CNAME:规范名称记录,用于设置别名。
- PTR:指针记录,用于反向DNS查找(IP到域名)。
- MX:邮件交换记录。
- NS:名称服务器记录。
- SOA:起始授权机构记录。
查询类几乎总是IN,代表互联网。

响应以资源记录格式返回。其结构如下:
- 类型:与查询类型对应(如A、CNAME)。
- 类:同样为
IN。 - TTL:生存时间,以秒为单位,表示该记录在缓存中有效的时长。现代网络TTL通常较短(如几分钟到一小时),以适应动态内容。
- 数据长度:后面资源数据的长度。
- 资源数据:格式取决于记录类型。例如,A记录的数据就是一个32位的IPv4地址。
使用Dig工具进行查询 🛠️
dig是当前标准的DNS查询工具,功能强大,可以显示DNS查询的详细信息。


以下是一个简单的dig命令示例,用于查询cnn.com的A记录:
dig cnn.com
输出结果会包含多个部分。在“ANSWER SECTION”中,你可能会看到多个A记录,每个对应一个IP地址。这称为轮询负载均衡,是一种将流量分散到多个服务器的简单方法,也是内容分发网络的基础。

你还会注意到较短的TTL值(例如85秒),这反映了现代网站的动态特性。
其他重要记录类型 📝

除了基础的A记录,还有其他关键记录类型。
AAAA记录是IPv6时代的A记录,类型号为28,其数据部分包含一个128位的IPv6地址。

CNAME记录用于创建别名。例如,www.university.edu可能是一个CNAME,指向真实的主机名webserver.proxy.university.edu。这实现了灵活的重定向机制。
反向DNS查找尝试通过IP地址查找域名,但这并非DNS设计的主要方向。它使用特殊的in-addr.arpa域,并将IP地址反转后作为查询名称。例如,查询IP192.0.2.1的反向记录,实际查询的是1.2.0.192.in-addr.arpa的PTR记录。


反向查找并不可靠,许多组织并未正确配置PTR记录,可能导致查询失败或返回无关信息。因此,在进行分析时,一个重要的原则是:尽量在事件发生时收集域名信息,而非事后依赖反向查找。

总结 📚
本节课中我们一起学习了DNS协议查询机制的核心内容。我们探讨了DNS客户端与服务器的角色、DNS数据包的格式、以及查询与响应的详细过程。我们介绍了关键的资源记录类型,包括A记录、AAAA记录、CNAME记录和用于反向查找的PTR记录。我们还学习了使用强大的dig工具进行实际查询,并了解了反向DNS查找的局限性和不可靠性。

下一模块,我们将通过实际调查案例,综合运用whois查询、DNS正向/反向查找等工具,让你亲身体验域名解析调查的过程及其中的挑战。
027:地址调查分析 🔍

在本节课中,我们将学习如何对一个给定的IP地址进行调查分析。这是一个实践性的演练,我们将把课程中零散介绍过的工具和方法串联起来,形成一个完整的调查流程。通过本教程,你将掌握从IP地址出发,逐步收集和分析相关信息的基本方法。


上一节我们介绍了课程概述,本节中我们来看看调查流程的第一步:初始域名查询。
初始域名查询
首先,我们对示例IP地址 192.44.3.18 执行 dig -x 命令进行反向DNS查询。
dig -x 192.44.3.18
查询结果显示,该地址没有直接对应的主机名,但权威部分指出它属于一个名为“Phonehoffer”的德国组织。这里需要注意两点:权威名称服务器通常以“NS”为前缀;域名中的国家代码(如 .de)能直接表明其地理位置。
为了对比,我们再查询另一个地址 99.43.211.18。
dig -x 99.43.211.18
这次我们在答案部分获得了丰富的信息:adsl-99-43-211-18.dsl.rcsntx.sbcglobal.net。这个编码化的名称透露了很多信息:adsl 表明这是一个DSL线路,rcsntx 可能代表地理位置(如德克萨斯州),sbcglobal.net 是西南贝尔公司的域名。这种命名方式在ISP为家庭用户分配动态IP时很常见。

以下是域名查询中可能遇到的命名模式:
- 功能性站点:常包含
mail、ftp、search等词。 - 动态IP:常包含
dsl、pool、dynamic等词及地理编码。 - 组织机构:域名本身可能直接反映公司、大学或政府机构名称。

上一节我们介绍了如何从域名中获取信息,本节中我们来看看调查过程中一个至关重要但常被忽视的环节:利用公开信息源。
善用公开信息源
调查是一个探索过程,而非简单的清单核对。许多调查者会忘记使用最基本、最强大的公开信息源。

在进行技术查询的同时,务必进行以下操作:
- 使用搜索引擎:在Google中搜索该IP地址或相关域名。
- 查阅维基百科:查找与该组织或域名相关的背景信息。
- 访问相关网站:如果允许,直接访问该组织的官方网站,了解其性质(是ISP、公司、非政府组织还是大学)。不同性质的机构管理IP地址的方式差异很大。

上一节我们强调了公开信息源的重要性,本节中我们进入调查的核心步骤:查询IP地址的注册信息(Whois)。

查询Whois注册信息
首先,我们访问ARIN(美国互联网号码注册中心)的Whois服务进行查询。虽然我们已经知道目标地址属于德国(.de),应使用RIPE NCC(欧洲IP地址注册中心),但此举是为了演示如果忽略地域信息会发生什么。

在ARIN查询 192.44.3.18 后,我们得到一份报告,指出该地址段属于 RIPE-EX-192.44.1.0。这明确告诉我们,需要去RIPE NCC查询更详细的信息。
全球各大区域性互联网注册管理机构(RIR)都提供Whois服务。以下是主要的RIR及其负责区域:
- ARIN:北美地区
- RIPE NCC:欧洲、中东和中亚地区
- APNIC:亚太地区
- LACNIC:拉丁美洲和加勒比海地区
- AFRINIC:非洲地区
我们转而访问RIPE NCC进行查询。这次获得的信息比ARIN提供的更精确,它给出了具体的地址块(192.44.3.0/25),所属的自治系统号(ASN),以及技术联系人和管理联系人的信息(需要进一步展开查看)。根据调查需要,你甚至可以考虑联系这些联系人。

一个重要提示:不同注册机构和地区的Whois信息质量参差不齐。通常,西欧和北美的信息较为准确可靠。信息质量是注册机构和所在地域的共同作用结果。



上一节我们通过Whois查询了IP的注册信息,本节中我们来看看当标准反向查询无效时,还有哪些替代方法。

替代查询方法
除了标准的 dig -x 反向查询,还有其他途径可以获取信息,尽管它们可能不那么可靠或需要付费。
一个替代方案是使用互联网调查数据。例如,ISC(互联网系统协会)会通过主动探测DNS来收集名称信息,并出售相关的调查报告。此外,也有一些公司提供类似的商业化IP-域名映射数据服务。但请注意,这些数据可能不完整,不应期望过高。




上一节我们探讨了名称查询的替代方法,本节中我们进入网络层面的调查:分析路由路径。
分析网络路由

我们可以通过追踪数据包的路由路径来获取信息。这可以通过命令行工具 traceroute 实现,也可以利用在线“Looking Glass”服务器(例如通过 traceroute.org 查找)从不同地理位置发起追踪。
例如,从本地对 192.44.3.18 执行 traceroute,追踪在到达 border1.fra-1.bone.fhG.de 和 noc.fho 后停止。从另一个(德国)路由节点再次尝试,结果类似,均在到达弗劳恩霍夫协会的网络运营中心(NOC)后终止。

这暗示目标可能不存在。接下来,我们执行最简单的连通性测试:ping。
ping 192.44.3.18
结果显示“请求超时”。这可能意味着该地址上没有活跃的主机。在互联网安全领域,没有绝对的规则。对方可能配置路由器丢弃了ICMP回显请求(ping包)。
为了验证,我们可以探测该地址的“邻居”。例如,ping 192.44.3.21。
ping 192.44.3.21
这次我们收到了回复。对 192.44.3.21 进行 traceroute,路径显示它同样经过弗劳恩霍夫网络。结合Whois信息(两者同属一个地址块),这进一步支持了 192.44.3.18 没有主机的推论,尽管不能100%确定(因为可能存在特殊的防火墙规则)。

上一节我们通过路由和连通性测试分析了网络状态,本节中我们来总结整个调查流程的核心要点和最佳实践。
调查总结与核心要点
本次演练展示了一个手动调查IP地址的流程。需要记住,这不是一个完美的固定流程,而是一套基于经验的方法论。以下是一些核心规则和要点:
- 探测相邻地址:如果无法直接从目标地址获取信息,可以调查其相邻IP。你可能会发现所属机构、本地名称服务器等对进一步调查有用的信息。
- 大胆使用搜索引擎:再次强调,Google等搜索引擎是最基础且强大的研究工具,应在调查早期频繁使用。
- 善用Looking Glass服务器:在分析路由信息时,Looking Glass服务器是无价之宝。它们允许你从不同地理位置发起探测,避免因本地网络路径造成的偏见。从德国探测德国IP与从美国探测,路径可能完全不同。
- 理解信息的局限性:你只能描述观察到的现象(如数据包被丢弃),但无法绝对确定其原因(是主机不存在,还是路由器被配置为不响应)。调查结论通常是基于证据的“可能性”推断。
- 流程是灵活的:本次演示提供了一个起点和基本思路。随着经验积累,你会形成自己的一套工具组合和调查路径。

本节课中我们一起学习了针对IP地址的调查分析方法。我们从初始的域名查询开始,逐步深入到Whois注册信息查询、公开信息源利用、网络路由追踪以及连通性测试。记住,调查是一个综合性的探索过程,需要灵活运用多种工具和方法,并对信息的质量和局限性保持清醒的认识。本教程为你构建自己的调查流程提供了一个坚实的起点。
028:DNS基础设施架构详解 🌐
在本节课中,我们将深入学习DNS(域名系统)的基础设施架构。我们将探讨DNS的核心概念,包括区域、权威服务器、邮件交换记录以及根服务器的物理基础设施。通过理解这些组件,你将能更好地掌握DNS的工作原理及其在网络安全中的作用。

区域与域名的区别
上一节我们介绍了DNS的基本概念,本节中我们来看看DNS中的“区域”与“域名”有何不同。

在DNS术语中,域名是一个连续的、具有共同标签的名称集合。例如,.com 是一个域名,foo.com 是一个域名,bar.foo.com 也是一个域名。
从管理角度看,DNS被划分为区域。一个区域是分配给特定服务器的连续DNS空间集合。区域可以分配子域名,也可以将部分空间分配给其他区域。
需要理解的关键点是:区域关乎所有权,而非仅仅是域名。例如,foo.com 可能是一个区域,而 x.foo.com 和 y.foo.com 可能同属于 foo.com 区域。如果在 foo.com 下创建 bar.foo.com 并为其分配一个新区域,那么所有 bar.foo.com 下的名称都属于这个新区域,除非进一步分割。

权威服务器与递归服务器
区域的概念直接关系到权威查找问题。我们之前简要提到过权威服务器的概念。
权威服务器是为特定域名提供权威答案的服务器。如果我查询两个服务器得到同一个名称的不同IP地址,那么来自权威服务器的答案具有决定性。

权威服务器在域名注册过程中被指定。当我注册一个域名时,我会同时注册一个对该域名具有权威性的服务器。
理论上,所有查询都可以通过权威服务器完成。但为了管理海量查询,DNS系统广泛使用递归服务器。
递归服务器会缓存区域信息或地址信息,直到信息更新(由TTL,即生存时间控制)。当你使用 dig 命令查询一个名称时,返回结果中包含一个TTL值,它表示该响应在缓存中有效的时长。

区域传输
一个权威服务器管理一个区域内的所有地址和名称。

如果你想获取区域内的所有记录,可以使用记录类型 AXFR,即区域传输。AXFR记录会返回该权威服务器负责的所有信息。由于数据量可能很大,无法放入单个UDP数据包,因此区域传输通常通过TCP协议完成。
如果你长时间监控一个权威DNS服务器的流量,可能会偶尔观察到大型TCP会话,那就是在进行区域传输。

DNS与邮件系统的关联
现在,让我们谈谈邮件。这看起来似乎有些跳跃,因为DNS和邮件系统本质上没有必然联系。但由于它们都是互联网最古老的协议,设计者决定将邮件系统的部分功能整合到DNS中。
没有DNS,电子邮件将无法正常工作,因为DNS负责维护邮件服务器的位置信息。
这是通过一类称为 MX记录 的DNS记录实现的。MX记录接收一个域名,并返回该域名的邮件服务器名称。
例如,执行 dig MX jhu.edu 命令,会返回 smtp.johnshopkins.edu 这样的MX记录。
在返回结果中,你可能会注意到“附加部分”。DNS会非常有帮助地传递额外信息,这样你通常就不需要执行多次查询。例如,查询 jhu.edu 的邮件服务器时,DNS不仅返回服务器名称,还可能直接提供其IP地址。
MX记录中还有一个优先级数字。如果你有多个邮件服务器,优先级数字指示邮件客户端应优先使用哪个服务器。数字越低,优先级越高。
邮件客户端应遵循此优先级,流量通常会按优先级指数级下降。但需要注意的是,垃圾邮件发送者可能会利用此信息,他们可能认为低优先级的服务器监控较弱。因此,许多人选择为所有邮件服务器设置相同的优先级。

物理基础设施:根服务器
最后,我们来谈谈物理资源。我们之前讨论过完全限定域名,例如 www.jhu.edu.,结尾的点代表根域。

互联网上存在根服务器,它们是技术上的第一级查询服务器。这些是物理机器,你可以在 root-servers.org 上查看它们的位置和状态。其中许多实际上是计算机集群,因为它们每天需要处理巨大的网络流量。
根服务器的主要职责是维护根区域。这意味着,当你查询任何顶级域(如 .edu 或 .com)时,根服务器会告诉你该去找哪个服务器。
你可能好奇为什么只有13组根服务器。这与DNS最初设计的UDP数据包大小(约512字节)有关。考虑到描述服务器所需的记录大小,以及每个主机都需要知道所有根服务器,13是当时能合理塞进一个DNS数据包的最大数量。这个数字一直沿用至今。
这些根服务器有固定的名称(如 a.root-servers.net)和IP地址。其中一些还支持IPv6地址,这反映了向IPv6迁移的进程。
总结


本节课中,我们一起学习了DNS基础设施的几个核心方面:
- 区域与域名:理解了区域是管理所有权的单位,而域名是名称的连续集合。
- 权威与递归服务器:认识了提供权威答案的服务器和用于缓存、提高效率的递归服务器。
- 区域传输:了解了如何使用AXFR记录获取整个区域的数据。
- DNS与邮件:掌握了MX记录如何将域名映射到邮件服务器及其优先级机制。
- 根服务器:认识了互联网DNS查询起点的物理基础设施及其历史设计约束。

通过理解DNS的这些内部架构,你为分析潜在的DNS攻击和设计更安全的网络配置奠定了坚实基础。
029:DNS攻击技术 🛡️

在本节课中,我们将要学习DNS(域名系统)的各种攻击与滥用技术。DNS是互联网的核心基础设施,负责将人类可读的域名(如 example.com)转换为机器可读的IP地址。我们将探讨合法的DNS使用方式(如负载均衡),以及攻击者(特别是恶意软件作者)如何操纵DNS进行攻击。

轮询DNS分配 🔄

上一节我们介绍了DNS的基础概念,本节中我们来看看一种基础的负载均衡技术:轮询DNS分配。这是互联网上最早、最简单的负载均衡形式。
其工作原理是:当一个客户端查询一个域名时,DNS服务器会从一个地址池中随机返回一个IP地址。理想情况下,这些地址分布在不同的网络和地理位置。

通过随机分配,流量得以均匀分布,确保没有单台机器过载。例如,查询 CNN.com 可能会返回多个不同的IP地址。

dig CNN.com
; <<>> DiG 9.10.6 <<>> CNN.com
;; ANSWER SECTION:
CNN.com. 300 IN A 151.101.65.67
CNN.com. 300 IN A 151.101.1.67
CNN.com. 300 IN A 151.101.129.67
CNN.com. 300 IN A 151.101.193.67

内容分发网络与DNS操纵 🌐
上一节我们介绍了基础的负载均衡,本节中我们来看看更复杂的系统:内容分发网络。互联网并非完全去中心化,它严重依赖高度集中的网络。早期的“端到端”连接模型在应对“闪存 crowd”(瞬间涌入的大量访问)时很容易耗尽资源。

CDN的解决方案是在全球各地复制网站内容。当用户请求一个域名时,CDN的权威DNS服务器会查看请求来源的IP地址,并返回地理位置上最近的缓存服务器地址。

以下是CDN利用DNS进行流量引导的过程:
- 用户查询
Foxnews.com。 - Akamai(CDN提供商)的DNS服务器收到请求。
- 服务器根据用户的IP地址判断其地理位置。
- 服务器返回离用户最近的
Foxnews.com缓存服务器的IP地址。

通过这种方式,CDN利用DNS操纵来优化互联网流量,没有CDN,当今的多媒体互联网将无法实现。
DNS攻击技术概览 ⚔️

了解了合法用途后,我们现在来看看攻击者如何滥用DNS。攻击的核心目标是劫持域名解析,迫使用户访问攻击者控制的特定站点。

以下是几种常见的DNS攻击技术:

- 修改Hosts文件:这是恶意软件最常用的简单方法,直接修改本地的
hosts文件,将域名指向恶意IP。 - 域名仿冒:攻击者注册一个与真实域名极其相似的域名(例如
wwwnyytime.com),诱骗用户访问。 - 同形异义字攻击:利用国际化域名中与其他语言字符外形相似的字符(如西里尔字母)注册域名,进行视觉欺骗。
- 缓存投毒:攻击上游DNS服务器或利用协议漏洞,污染DNS缓存,使缓存中存储错误的域名-IP映射关系。
- 快速通量:这是一种防御规避技术。攻击者将一个域名关联到大量IP地址,并设置极短的TTL。当防御者封禁一个IP时,域名已迅速切换到新的IP地址。
- 域名生成算法:恶意软件使用可预测的算法每日生成新的通信域名。防御者需要破解算法才能提前封堵这些域名。
- DNS劫持器:此类恶意软件会修改系统的DNS解析器设置,将其指向攻击者控制的恶意DNS服务器,从而完全控制受害者的域名解析。
协议漏洞与Kaminsky攻击 🐛

上一节我们列举了多种攻击面,本节中我们深入探讨一个著名的协议级漏洞:Kaminsky攻击。DNS协议使用一个16位的查询ID来匹配请求与响应,理论上攻击者需要猜对这个ID才能进行缓存投毒。

然而,Dan Kaminsky在2008年发现并利用了一个关键点:DNS响应中可以包含“附加信息”部分,这部分信息可以包含任何其他域名的记录,即使原查询并未询问这些记录。
Kaminsky攻击的简化流程如下:
- 攻击者诱使用户浏览器向权威DNS服务器发送大量对随机子域名(如
1.example.com,2.example.com...)的查询。 - 同时,攻击者向权威服务器伪造大量响应,声称“
www.example.com的IP地址是恶意IP”,并猜测查询ID。 - 由于查询量巨大,攻击者猜中某个查询ID的概率大大增加。
- 一旦猜中,权威服务器的缓存就会被污染,所有用户查询
www.example.com都会被导向恶意IP。

此漏洞的严重性直接推动了 DNSSEC 的部署,这是一种为DNS提供数据来源验证和完整性的加密安全扩展。

总结 📚
本节课中我们一起学习了DNS技术的多个方面。我们首先了解了轮询DNS分配作为基础的负载均衡方法。接着,我们探讨了内容分发网络如何大规模地利用DNS进行流量工程,以支撑现代互联网。
然后,我们转向攻击视角,系统性地学习了多种DNS攻击技术,包括从简单的修改Hosts文件、域名仿冒,到更复杂的缓存投毒、快速通量、域名生成算法和DNS劫持器。最后,我们深入分析了著名的 Kaminsky攻击 原理,它揭示了DNS协议本身的脆弱性并促进了DNSSEC的发展。


核心要点在于:DNS因其核心地位而变得异常复杂。它不仅是互联网的“电话簿”,更成为了流量管理、安全对抗和性能优化的关键战场。理解这些技术,无论是用于建设还是防御,都至关重要。
信息保障分析:模块8:HTTP协议头部解析教程 🧩
在本节课中,我们将学习如何解析HTTP协议的头部信息。通过本教程,你将能够描述HTTP头的各个组成部分及其用途,并理解HTTP请求与响应的基本结构。
虚拟主机与Host字段 🌐
首先,我们来介绍HTTP头部中一个名为Host的字段。这个字段用于指定服务器的域名。


公式/代码示例:
Host: www.example.com

当一台Web服务器托管了多个网站(即虚拟主机)时,Host字段就变得至关重要。服务器需要根据这个字段来判断客户端想要访问的是哪个具体的网站。如果Host字段配置错误,服务器通常会返回一个错误,提示你使用了不正确的域名。
简而言之,Host字段使得一台物理服务器能够轻松地托管和管理多个不同的网站。
来源与Referer字段 🔗
上一节我们介绍了Host字段,本节中我们来看看Referer字段。这个字段指明了当前请求是从哪个网页链接过来的。
公式/代码示例:
Referer: https://www.google.com/search?q=example

Referer字段记录了引荐来源的URL。网站可以利用这个信息进行多种判断,例如:
- 访问控制:某些网站(如过去的《纽约时报》)曾用它来验证用户是否通过特定路径(如内部合作伙伴页面)访问,以此进行简易的访问控制。
- 流量分析:网站可以分析流量来源,例如判断用户是否通过Google搜索或其他已知页面跳转而来。
然而,Referer字段很容易被伪造,因此不适合用于高安全性的身份验证。
状态管理与Cookie 🍪
Referer字段帮助我们了解用户来源,而Cookie则用于在无状态的HTTP协议中维持用户状态。服务器通过Cookie向浏览器传递信息,浏览器在后续请求中将其发回服务器。
公式/代码示例:
Set-Cookie: sessionid=abc123; Expires=Wed, 09 Jun 2021 10:18:14 GMT
Cookie是“名称-值”对,并可附带过期时间、存储权限等参数。它主要用于:
- 维持会话状态:跟踪用户在单次访问或多次访问中的状态与偏好。
- 用户身份验证:经典的“记住我”功能就是通过
Cookie实现的,它避免了用户每次访问都需要重新输入凭证。

本质上,Cookie使得服务器能够“记住”用户,从而提供个性化的体验。
客户端标识与User-Agent字段 🖥️
除了状态管理,服务器还需要了解客户端的类型以提供合适的内容,这通过User-Agent字段实现。
公式/代码示例:
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36
User-Agent字符串向服务器传递了关于浏览器类型、操作系统等信息。服务器可以根据这些信息:
- 优化内容:为IE浏览器和Firefox浏览器提供不同优化版本的网页。
- 用户分类:虽然不能精确定位到个人,但可以将用户归类到不同的设备或浏览器群体中进行分析。
这个字段有助于服务器进行兼容性配置和基本的用户群体分析。

HTTP响应结构解析 📄
我们已经讨论了HTTP请求中的几个关键头部字段。现在,当一个HTTP请求发出并经过验证后,服务器会返回一个HTTP响应。HTTP响应的结构非常简单明了。
一个典型的HTTP响应包含以下部分:
- 状态行:包含HTTP版本、状态码和状态描述。
- 日期:响应生成的日期和时间。
- 可选的响应头:提供关于服务器及其能力的信息。
- 响应体:实际的返回数据,如网页的HTML内容。
在本讨论中,我们主要关注响应头,响应体可以是任何类型的数据。

常见HTTP状态码 📊
响应状态行中的状态码是一个三位数字,它清晰地表明了请求的结果。第一位数字定义了响应的类别。
以下是几个最常见和重要的状态码:
- 200 OK:请求成功。这是最常见的成功状态码。
- 301/302:重定向。请求的资源已被移动到新位置。
- 400 Bad Request:请求格式错误,服务器无法理解。
- 401 Unauthorized:请求未授权,需要提供身份验证凭证。注意:这与
403不同。 - 403 Forbidden:服务器理解请求,但拒绝执行。通常意味着没有访问权限。
- 404 Not Found:服务器找不到请求的资源。
- 500 Internal Server Error:服务器内部错误,无法完成请求。
你可以在网上轻松找到完整的HTTP状态码列表。

关键的响应头字段 🔑
服务器通过响应头向客户端传递重要指令和信息。除了通用的头字段,有几个专门用于特定目的:
以下是几个关键的响应头:
Set-Cookie:服务器通过此头向客户端发送一个Cookie,要求浏览器存储。Location:用于重定向响应,指明客户端应该访问的新URL。Server:标识服务器软件的类型和版本(例如,Apache/2.4.1)。这个信息有时对了解服务器配置很有用。Refresh:指定一个定时刷新或重定向,告诉浏览器多久后重新加载当前页面或跳转到新页面。
关于401状态码的安全警示 ⚠️

最后,我们特别讨论一下401 Unauthorized状态码。它表示访问资源需要身份验证。
安全警示:当你访问一个需要密码的网站,并且该网站使用HTTP(而非HTTPS)协议时,情况会变得很危险。因为浏览器会弹窗让你输入用户名和密码,而这些凭证会以明文形式通过HTTP发送。
公式/代码示例(潜在风险):
Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ= (这是 "username:password" 的Base64编码,可轻松解码)
如果你在网络上嗅探到401响应,并且持续监听,你很可能会捕获到用户发送的明文凭证。因此,401状态码配合HTTP协议,是一个明确的安全风险信号,所有敏感信息的传输都必须使用HTTPS。

总结 📝

本节课中,我们一起学习了HTTP协议头部的核心组成部分。
我们首先了解了Host字段在虚拟主机环境中的作用,然后探讨了Referer字段如何标识请求来源。
接着,我们深入研究了Cookie如何解决HTTP无状态的问题,用于会话管理和用户跟踪,并分析了User-Agent字段如何标识客户端。
之后,我们解析了HTTP响应的基本结构,并详细介绍了常见的HTTP状态码及其含义,特别是200、404、401、403等。
最后,我们回顾了几个关键的响应头,如Set-Cookie和Location,并重点强调了在HTTP协议下401状态码可能带来的凭证明文传输安全风险。
掌握这些知识是进行Web应用安全分析和信息保障的基础。
031:解析HTTP头部结构 🧩

在本节课中,我们将学习如何解析HTTP头部。我们将详细描述HTTP头部的各个组成部分及其用途,包括主机、虚拟主机、引用来源和Cookie。此外,我们还将探讨HTTP响应的基本结构。
主机与虚拟主机 🖥️
上一节我们介绍了HTTP头部的基本概念,本节中我们来看看主机字段。在HTTP头部中,Host字段用于指定服务器的主机名。然而,大多数Web服务器都是虚拟主机。

例如,Aia.com可能托管在chica.pere.com上。同一台物理主机上可能托管着多个不同的网站。因此,正确识别你正在访问的实际虚拟主机非常重要。
如果你使用了错误的Host头部,一个配置良好的服务器会拒绝你的请求,并返回一个错误,提示你使用了不正确的信息。
这本质上是一种允许单个服务器同时托管多个站点的方法,并使服务器能够轻松确定你感兴趣的是哪个具体站点。
引用来源 🔗
现在让我们继续讨论引用来源。Referer字段(注意拼写)用于说明你来自哪里,即“谁”将你引荐到了当前页面。
以下是关于Referer字段的关键信息:
- 定义:Referer字段包含你来源页面的URL。
- 用途:它常用于处理附属站点或验证访问路径。例如,过去《纽约时报》曾用它来验证用户是否来自其认可的特定站点,以处理身份验证。
- 追踪来源:该信息有助于确定流量来源,例如是来自Google搜索链接还是其他已知页面。
- 安全性:虽然可用于确保用户通过特定路径访问页面,但Referer字段非常容易被伪造。攻击者可以轻松构造包含虚假Referer信息的HTTP头部。

Cookie 🍪
最后,我们来谈谈Cookie。Cookie是HTTP的状态信息,由服务器传递给浏览器。
Cookie是名值对,并可以附带额外参数,从客户端传回服务器。这些信息可以包含:
- 过期日期
- 分层存储信息
- 权限信息
- 服务器希望为终端用户跟踪的任何信息

从技术上讲,Cookie只应由颁发它的站点读取。它们非常有用,可以用于补充信息,并允许网站追踪用户之前的访问行为。
虽然我们使用Cookie,但HTTP本身是一种无状态协议。服务器无法获取请求之外的信息(通常只有URL及其参数)。通过添加Cookie,服务器可以追踪用户的行为、偏好等。
Cookie常用于维护用户偏好状态,并且这种状态可以跨多个会话持续,而不仅仅是单次连接或单次访问。它还可以用于密码验证,这样用户就不必在每个页面上都重新提供凭证。
用户代理 👤

接下来,我们探讨一个非常有趣的部分——用户代理。如果你在保护服务器,这部分内容会特别重要。
市面上有很多浏览器,甚至包括一些你意想不到的,如邮件阅读器、即时通讯客户端或文本编辑器,都可以用来浏览网页。
User-Agent字符串将关于浏览器和系统的信息传递给服务器。它提供这些信息是为了告诉服务器客户端能做什么和不能做什么,即具备哪些特定的能力。
一个典型的例子是,服务器可能需要根据你使用的是IE还是Mozilla(Firefox)浏览器,对页面进行略微不同的处理。通过提前告知服务器,它可以为你提供最适合IE或Mozilla的定制版本。
User-Agent也用于以这种方式处理配置问题,并且是识别特定用户群体的好方法。虽然可能无法确定具体是哪个用户,但至少可以将他们归类到不同的组中。
HTTP响应结构 📨

现在,带有所有这些信息的HTTP请求头部已经发出。一切检查完毕后,我们会收到一个响应。
HTTP请求的响应结构非常简单,是最容易解析的内容之一。它包含三个部分:
- 状态行
- 头部
- 数据
响应总是包含一个状态消息,这是一个三位数字代码(我们稍后会详细说明)。还可能有一组可选的头部,提供关于服务器的信息以及服务器后续能做什么的指示。最后是实际的数据。就本次讨论而言,我们不会深入探讨数据部分,因为它可以是任何内容(例如传输回来的实际网页信息)。
状态码解读 🔢

状态消息有些很常见,有些则不那么常见。基本上,这些消息告诉你服务器上发生了什么以及服务器的看法。
每个状态码都是一个三位数值。第一位数字表示主要的类别分组,后两位数字提供更具体的细节。
- 如果第一位是 1,表示这是一个信息性消息。
- 如果是 2,表示成功(但可能附带一些注意事项)。
- 如果是 3,表示重定向(服务器没有直接满足请求,而是将你导向了其他地方)。
- 如果是 4,表示客户端错误。
- 如果是 5,表示服务器错误。
你通常会看到的一些主要状态码值包括:
- 200:HTTP OK(请求成功)。
- 302:Found(最常见的重定向技术)。
- 400:Bad Request(错误的请求)。
- 401:Unauthorized(未授权,与“禁止”不同,意味着你未被授权访问)。
- 403:Forbidden(禁止访问,意味着你完全不能访问该资源)。
- 404:Not Found(未找到,服务器不知道你要找什么,因为它不存在)。
这些是状态码的基础知识。你几乎可以在任何地方(例如在Google搜索“HTTP status code”)查到完整的列表。
响应头部 📋

响应头部中有几个非常有趣的部分。这是服务器提供给客户端的信息。
以下是几个关键的响应头部:
- Content-Length:响应的长度(以字节为单位),告诉客户端响应体有多大。
- Set-Cookie:发送一个Cookie供客户端存储。
- Location:用于重定向的新位置。它基本上是说:“你应该去这里。”
- Server:标识服务器类型和版本的字符串。这本身非常有趣,因为它指明了服务器运行的系统及其能力。
- Refresh:指定定时重定向。跳转到同一页面将导致重新加载,它持续告诉你应该多久重新加载页面本身。
深入探讨401状态码 ⚠️
现在,让我们花点时间专门讨论一下401状态码。
401表示未授权,即缺乏访问站点的授权。这很容易在浏览器中触发,只需访问任何需要密码的站点即可。

如果你通过HTTP(而非HTTPS)访问此类站点,情况会变得很棘手。因为当你发送用户名和密码时,你是在明文传输这些信息。任何要求通过HTTP传输密码的站点,都在让你以明文发送用户凭证。
因此,如果你在HTTP站点上看到401状态码,这是一个很好的迹象,表明如果你在那里嗅探足够长的时间,很可能会找到入侵的方法,因为所有信息都是明文发送的。

本节课中我们一起学习了HTTP头部的关键组成部分,包括Host、Referer、Cookie和User-Agent字段的作用与意义。我们还剖析了HTTP响应的结构,理解了状态码(如200、302、401、404)的分类与含义,以及常见的响应头部信息。最后,我们特别强调了在HTTP协议下遇到401状态码时可能存在的安全风险。掌握这些知识是进行Web信息分析和保障的基础。
032:HTTP日志分析 📊
在本节课中,我们将学习HTTP日志分析,重点介绍两种主要的日志格式:通用日志格式和W3C扩展日志格式。通过本课,你将能够详细描述这两种格式的结构与用途。
概述
HTTP日志是记录Web服务器活动的重要文件。通过分析这些日志,我们可以了解谁访问了服务器、访问了什么内容以及访问是否成功。本节将深入解析两种最常见的HTTP日志格式。




通用日志格式
通用日志格式是一种非常流行且简单的日志格式。它易于理解,是许多Web服务器的默认日志格式。上一节我们介绍了日志分析的基本概念,本节中我们来看看CLF的具体构成。
CLF为每个HTTP请求生成一条日志记录,包含请求的IP地址、时间、请求内容、状态码和传输字节数等信息。其基本结构如下:
%h %l %u %t \"%r\" %>s %b
以下是CLF日志记录的一个示例及其各字段的详细说明:

127.0.0.1 - frank [10/Oct/2000:13:55:36 -0700] \"GET /apache_pb.gif HTTP/1.0\" 200 2326
- %h (远程主机地址):发出请求的客户端的IP地址或主机名。例如:
127.0.0.1。 - %l (远程登录名):客户端的RFC 1413标识(已弃用)。通常为短横线
-。 - %u (远程用户):HTTP身份验证得到的用户名。如果未认证,则为短横线
-。例如:frank。 - %t (时间):服务器收到请求的时间。例如:
[10/Oct/2000:13:55:36 -0700]。 - "%r" (请求行):客户端的完整请求行,包括方法、路径和协议。例如:
\"GET /apache_pb.gif HTTP/1.0\"。 - %>s (状态码):服务器返回给客户端的最终HTTP状态码。例如:
200表示成功。 - %b (发送的字节数):返回给客户端的字节数(不包括响应头)。例如:
2326。
CLF格式非常灵活,可以通过不同的变量进行扩展。例如,使用 %A 可以记录服务器的本地IP地址,这在多服务器环境中很有用。使用 %{Referer}i 可以记录引导用户访问当前页面的来源URL。
W3C扩展日志格式
介绍完简单直接的CLF格式后,我们接下来看看另一种格式:W3C扩展日志格式。这种格式主要用于微软的IIS服务器,它允许管理员自定义日志中包含哪些字段。

W3C格式将一系列HTTP请求分组记录,字段可以从一个预定义的集合中选择。其规范可以在W3C的官方网站上找到。
以下是W3C扩展日志格式的关键特点:
- 字段可定制:管理员可以指定需要记录的字段组合。
- 分组记录:日志条目按组排列,而非严格的单行单请求(取决于配置)。
- IIS默认:它是微软Internet信息服务(IIS)的默认日志格式。
- 类似扩展性:和CLF一样,它也可以通过添加特定字段进行扩展。
日志文件管理
了解日志格式后,管理这些日志文件本身也至关重要。无论是Apache还是IIS,日志文件通常都有特定的存储位置和轮转策略。


对于Apache,日志位置由 CustomLog 指令定义。对于IIS,日志默认存储在 C:\inetpub\logs\ 目录下。日志文件通常按时间(例如每天)或大小进行轮转。
以下是关于日志文件管理的几个重要注意事项:
- 文件大小限制:Web服务器通常对单个日志文件有最大容量限制。超过此限制,当前文件会被关闭并归档。
- 目录空间限制:日志目录的总大小也可能有限制。超过限制后,系统可能会删除最旧的日志文件以释放空间。
- 配置影响分析:如果未能正确理解这些限制,可能会导致在不知情的情况下丢失具有分析价值的日志数据。因此,在部署前充分了解日志系统的配置至关重要。
总结
本节课中我们一起学习了HTTP日志分析的两种核心格式。

我们首先详细探讨了通用日志格式,它是一种简单、通用且高度可扩展的格式,通过单行记录每个请求的详细信息,易于解析和理解。
接着,我们介绍了W3C扩展日志格式,它作为IIS服务器的默认格式,允许自定义字段并可将请求分组记录,虽然不如CLF常用,但在特定环境中非常重要。
最后,我们讨论了日志文件的管理实践,包括存储位置、轮转策略以及大小限制,正确的配置是确保日志数据完整可用于分析的前提。

掌握这些日志格式及其管理知识,是进行Web服务器安全监控、故障排查和访问行为分析的基础。
信息保障分析:模块8:搜索引擎原理
在本节课中,我们将学习搜索引擎的工作原理。我们将了解搜索引擎如何获取并理解网络信息,如何决定向用户展示哪些搜索结果,以及它们存在哪些局限性。课程最后,我们还将简要介绍如何构建一个 robots.txt 文件。


概述:搜索引擎如何“看”世界
搜索引擎理解网络世界,主要依赖于一个被称为“网络爬虫”的程序。我们可以通过一张图来理解其基本工作流程。
上一节我们概述了搜索引擎的宏观目标,本节中我们来看看其核心组件——网络爬虫的具体工作方式。

网络爬虫(也被称为蜘蛛、机器人等)是一个自动浏览网页的应用程序。它从一个起始网页开始,提取该页面上的所有链接,并将这些新链接加入待访问列表。然后,它会依次访问列表中的新页面,重复这个过程,从而像蜘蛛网一样遍历互联网。

以下是其工作流程的关键步骤:
- 访问页面:爬虫访问一个网页。
- 提取链接:爬虫提取该页面上的所有超链接。
- 更新列表:将这些新链接加入待访问队列。
- 重复遍历:爬虫从队列中取出下一个链接,继续访问和提取过程。
在这个过程中,爬虫还会记录每个网页被其他网页引用的次数(即入链数量),这些信息对后续的页面排名至关重要。所有收集到的网页数据会被存入一个庞大的存储系统中。

从数据到索引:搜索引擎的“大脑”
上一节我们介绍了爬虫如何收集原始数据,本节中我们来看看搜索引擎如何将这些杂乱的数据整理成可快速查询的索引。

存储系统收集了海量网页数据后,需要经过“索引器”的处理。索引器会分析网页内容,建立模型,以便用户搜索时能快速找到相关结果。


网页排名技术的发展经历了几个阶段:
- 手工索引时代:早期如雅虎的目录是完全人工编辑的,效率低下。
- 文本分析时代:第二代索引开始自动扫描网页文本,并根据以下因素建立排名:
- 关键词在文档中的位置(如靠近顶部)。
- 关键词的重复频率。
- 关键词与其他词的关联情况。
- 链接分析时代:随后,以谷歌创始人拉里·佩奇命名的 PageRank 算法出现了。它革新了页面排名方式,其核心思想是:一个网页的重要性取决于链接到它的其他网页的数量和质量。
PageRank 算法本质上计算的是用户访问某个网页的概率。它通过构建网页间的链接关系矩阵(邻接矩阵),并计算其主特征向量来实现。公式可以简化为:


PR(A) = (1-d) + d (PR(T1)/C(T1) + ... + PR(Tn)/C(Tn))
其中:
PR(A):网页 A 的 PageRank 值。PR(Ti):链接到 A 的网页 Ti 的 PageRank 值。C(Ti):网页 Ti 的出站链接总数。d:阻尼系数,通常设为 0.85。
谷歌不断优化其算法,例如考虑链接锚文本、打击恶意刷排名(如创建大量垃圾链接指向某个网站)等。但 PageRank 的核心思想依然是:基于链接的流行度投票。这意味着搜索结果可能偏向大众文化或经过精心优化的内容。

为了改善这一点,可以为网页添加丰富的语义数据,例如:
- 标注重要信息的标签。
- 使用规范的元数据描述网站内容类型。
- 采用语义网技术。
与爬虫共舞:robots.txt 文件
上一节我们探讨了搜索引擎如何排名,本节中我们来看看网站管理员如何与爬虫互动,这主要通过 robots.txt 文件实现。

网站管理员与网络爬虫的关系复杂。一方面,爬虫是网站被搜索引擎收录的关键;另一方面,爬虫“智商”有限,可能抓取不应公开的内容,或对服务器造成负担。因此,控制爬虫行为是网站管理的重要任务。
robots.txt 文件是网站管理员与爬虫沟通的主要渠道。爬虫访问网站时,会首先查看该文件,并(在遵守规则的前提下)按照其中的指令行动。
一个基本的 robots.txt 文件示例如下:

User-agent: *
Disallow: /
这段代码的含义是:
User-agent: *:指令适用于所有爬虫。Disallow: /:禁止抓取网站的所有内容。
当然,更常见的用法是精细控制,例如允许抓取但禁止访问某些特定目录。

识别网络爬虫
在进行网络分析时,识别出爬虫流量非常重要,因为大量爬虫请求可能会“污染”数据集,影响对真实用户行为的分析。如果你确信爬虫活动无害,可能希望过滤掉这些数据。

有以下几种方法可以识别爬虫:
- IP地址列表:许多公司会公开其爬虫使用的IP地址段。但需要注意,这些IP地址可能会频繁变动,因此需要定期更新列表。
- DNS反向查询:对访问IP进行反向DNS查询,爬虫的主机名通常包含“googlebot”、“bingbot”等明显标识。
- 行为分析:这是最有趣且简单的方法。爬虫的行为与人类用户有显著差异。
如图所示,X轴代表对特定网站的请求测试次数,Y轴代表连续成功的请求数。爬虫的行为模式非常典型:它会持续发起大量请求,即使遇到失败(如404错误)也毫不气馁,从而产生一连串的失败记录。而正常用户在几次失败后通常会放弃。这种行为特征是识别自动化爬虫的良好指标。
总结
本节课中,我们一起学习了搜索引擎的核心原理。
- 信息收集:网络爬虫作为“侦察兵”,自动遍历互联网,收集网页数据和链接关系。
- 索引与排名:搜索引擎对收集的数据进行索引,并运用如 PageRank 等算法,基于链接流行度和内容相关性对网页进行排名。
- 交互与控制:网站管理员可通过
robots.txt文件指导爬虫的访问行为。 - 识别与局限:我们可以通过IP、DNS和行为特征识别爬虫流量。同时,搜索引擎存在局限,例如难以有效抓取和索引动态生成的网页内容(据估计,仅有约1/6的网络内容被充分索引)。

搜索引擎的最终目标,是在用户查询时,从其庞大的索引中快速返回最相关、最有用的结果。
034:搜索引擎滥用行为 🔍
在本节课中,我们将学习搜索引擎滥用行为,通常被称为“垃圾索引”或“黑帽SEO”。我们将探讨其工作原理、常见类型以及实施者为何要承担风险。理解这些概念有助于我们识别并防范网络中的不良行为。
概述
搜索引擎优化(SEO)旨在提升网站在搜索结果中的排名。然而,一些人会采用欺骗性手段来操纵排名,这些行为被称为搜索引擎滥用。实施者需要在提升排名与避免被搜索引擎惩罚之间找到平衡。


搜索引擎滥用的主要类型
以下是几种常见的搜索引擎滥用技术。
域名抢注
域名抢注是指抢先注册热门或有价值的域名,以期日后出售获利。这种行为甚至早于搜索引擎出现。

- 举例:注册类似
pets.com的流行域名。 - 真实案例:曾有一群人在星巴克大声讨论他们计划开发的网站域名,被旁边的人听到并抢先注册,然后向他们高价出售。
误植域名抢注
误植域名抢注是注册与知名网站域名拼写非常相似的域名,利用用户的拼写错误。
- 目的:
- 进行恶意活动,诱骗访问错误网站的用户。
- 迫使合法网站所有者高价回购该域名。
- 举例:注册
bankamerica.com(正确应为bankofamerica.com)。
技术实现:这种行为常通过“域名尝鲜”来实施,即在5天试用期内注册域名,测试其流量价值,以降低操作成本。
隐藏文本与关键词堆砌
上一节我们介绍了域名层面的滥用,本节我们来看看在网页内容上的操纵手法。
隐藏文本是在网页中添加用户不可见但能被搜索引擎爬虫读取的文本,以提升特定关键词的排名。

- 实现方式:使用白色文字、极小字体或将文本置于页面边缘。
- 代码示例:
<p style="color: #ffffff; font-size: 1px;">这里是一长串用户看不见但搜索引擎能读到的关键词。</p>
关键词堆砌则是在页面可见内容中过度重复关键词。虽然效果不如隐藏文本,但仍被使用。
- 举例:在页面顶部段落中反复出现“TCP 1434”等术语,牺牲可读性以换取排名。
链接操纵

链接操纵通过大量外部链接来提升目标网站的排名。
- 著名案例:有人通过操纵,使谷歌搜索“miserable failure”(可悲的失败)时,乔治·W·布什的传记页面成为第一条结果。这并非恶意攻击,但有力证明了该技术的威力。
障眼法
障眼法是一种对 robots.txt 文件的巧妙操纵。它向搜索引擎爬虫和普通用户展示不同版本的网站内容。
- 工作原理:
- 搜索引擎爬虫访问时,服务器根据
robots.txt指示,返回一个充满目标关键词的页面以提升排名。 - 普通用户访问时,服务器则返回正常的网站内容。
- 搜索引擎爬虫访问时,服务器根据
- 核心逻辑:利用
robots.txt文件区分爬虫和人类用户,从而进行内容投喂。
总结

本节课我们一起学习了多种搜索引擎滥用行为,包括域名抢注、误植域名抢注、隐藏文本、关键词堆砌、链接操纵和障眼法。这些技术虽然能短期内提升排名,但都越过了道德与规则的界限,极易引起搜索引擎的注意并招致惩罚(如降低排名或从索引中移除)。理解这些手法有助于我们更好地维护网络信息的公正性与安全性。
035:SMTP协议概述 📧
在本节课中,我们将学习电子邮件的基础协议——简单邮件传输协议(SMTP)。我们将了解SMTP的基本工作原理、相关代理角色、消息传递过程,以及它与电子邮件服务的关系。理解SMTP是后续探讨垃圾邮件(Spam)及其对抗机制的重要基础。
SMTP简介
SMTP,即简单邮件传输协议,是整个电子邮件系统的基石协议。电子邮件本身是一个非常复杂的系统,实际上是多个协议交互的结果。然而,最基础的协议就是我们所说的SMTP。
上一节我们介绍了课程的整体目标,本节中我们来看看SMTP的核心概念。你需要从本模块掌握的是SMTP的基本操作、SMTP代理是什么、信息如何来回传递,以及SMTP协议与电子邮件服务之间的关系。因为电子邮件实际上是至少三个协议(可能更多)交互的产物。这部分原因在于电子邮件悠久的历史,它是互联网上最古老的协议之一,最初设计用于连接那些已有自己邮件系统的通信。

SMTP协议的本质
我希望你从本节中获得的是对SMTP协议实际样貌的理解:消息如何来回发送、如何登录等。在某种程度上,这些知识已经过时,因为如今很难找到一个开放的SMTP服务器。但理解通信如何进行以及你的客户端实际在做什么,仍然很有益处。
那么,SMTP到底是什么?从根本上说,SMTP是一种路由协议。在这方面,它与BGP有一些共同行为,因为它是一种存储转发协议。我想给你发邮件,我与一个系统通信,该系统说“好的,我可以传到这里”,然后它把消息传递给一个中继,中继重复这个过程,就像传递数据包一样。

如果你查看你的SMTP消息内部,在你的邮件客户端中有一个“查看完整邮件头”的选项。如果你这样做,你会看到类似我在这里展示的一系列“Received”头信息。这一系列头信息实际上显示了邮件消息到达你所经历的逐步传递过程。
例如,你在这里看到的版本是我发送给我自己 M.Collins@i 的邮件。你会看到在此之前,它在 listbox.com 这个主机上。listbox.com 又从服务于 cs.cmu.edu 的 SMTP03 服务器获得,而 SMTP03 又是从康卡斯特(Comcast)获得的,以此类推。所以你会看到这一系列主机,并且可能会惊讶于有多少主机参与了你的消息传递。你可能认为这是ABC式的简单过程,但你可能会看到8到10个,甚至20个主机参与传递这些消息。
SMTP的运作方式
SMTP实际上是一种点对点协议,因为它由一个对等网络组成。它们在TCP端口25上进行通信。对于经过身份验证的SMTP,通常在端口587。然后还有这些有着奇怪名称的服务器:MSA、MTA、MX。这些实际上都是同一个应用程序——SMTP服务器——所扮演的不同角色。在某些情况下,它们甚至是同一台服务器。这基本上只是描述了从一个用户到另一个用户的路径:用户提交给MSA,MSA传给MTA,MTA可能传给多个MTA,最后MTA传给MDA,然后MDA传递给接收者。每一个环节都只是路由和处理过程中的一个步骤。
以下是SMTP系统中的关键代理角色:
- MUA(邮件用户代理):即我们通常认为的电子邮件客户端,如Outlook或Mail应用。如果你使用Gmail,它隐藏在幕后,通过SMTP与服务器通信以提交你的消息。
- MSA(邮件提交代理):实际上是与SMTP开始通信的服务器。
- MTA(邮件传输代理):在网络中来回传输消息,直到它们到达MDA。
- MDA(邮件投递代理):这是将邮件送达目标邮箱的东西。

电子邮件与SMTP的区别
这里我们进入了电子邮件和SMTP的区别。你不使用SMTP来阅读你的电子邮件。你使用SMTP来发送你的电子邮件。你的电子邮件是通过一个通常称为邮局协议的协议来访问的。经典的有两种:最古老的POP(邮局协议)和另一个标准协议IMAP(互联网消息访问协议)。这些协议实际上是将你的消息存储在邮件服务器上,让你可以访问它们、放入文件夹等。基本上是一个消息数据库。我得到一个IMAP ID,可以查询邮件服务器,它可以返回相关的消息。
除此之外,DNS深深嵌入在SMTP中。你可能记得我在DNS部分提到过,DNS中有一个MX记录,它与邮件相关。事实上,它是这样工作的:让我们谈谈如何查询邮件交换记录。我想给 someone@yahoo.com 发邮件。我知道电子邮件地址类似于 ob@yahoo.com,但这并没有告诉我雅虎的哪台机器会开放SMTP会话。我查找一个MX记录,例如使用 dig 命令加上 MX 选项。你会看到在这种情况下,有 smtp.mail.yahoo.com 等。
这里我想让你注意的另一件事是旁边这组数字。MX记录包含所谓的“优先级值”。优先级值是一种距离度量,其工作方式与BGP中的距离度量类似:数值越低,意味着你会获得更好的路由。你会注意到在雅虎的例子中,他们给所有记录分配了相等的值。组织这样做有几个主要原因,其中一个主要原因是垃圾邮件发送者。过去,你会将最低的度量值分配给你最希望人们联系的服务。历史上,你会看到一种指数级的后备方案:一定比例的用户去排名最高的服务器,X/4去第二高的,X/9去第三高的,以此类推。垃圾邮件发送者发现,优先级值高意味着那台服务器维护较少、监控较弱,因此他们会优先选择高优先级的服务器。这可能是雅虎决定平等权衡邮件服务器的原因。当然,我不一定说情况就是如此,但你经常会发现这一点。
SMTP消息与邮件头

SMTP是信息安全战争的前线。垃圾邮件和反垃圾邮件是历史上最古老的战斗。正因为如此,你会看到SMTP发生了很多变化:实际使用中的SMTP与理想中的SMTP。因为多年来人们发现,垃圾邮件发送者会尽一切人力所能及的办法来利用它。所以,当你查看实际的SMTP时,你会看到很多“战斗伤痕”。
SMTP消息包含电子邮件头。电子邮件头是SMTP的元数据,相当于TCP选项、BGP选项之类的东西。我之前展示的那些“Received”头就是电子邮件头的一个例子。
大多数电子邮件头都相当不言自明。例如,你需要一个“From”头、“To”头和“Subject”头,分别表示发件人、收件人和主题。此外,还有一系列其他值得关注的头信息。
以下是可选头信息类别:
- Received头:基本上充当“洗衣票”,显示邮件经过的每一步。
- Message-ID头:该邮件的全局唯一标识符。
- Reply-To头:指定回复邮件时发送给谁。
让我们谈谈“Received”头。我早些时候向你展示过一些。沿着传输链的每一封邮件,你都会看到它。你通常会看到在连续的“Received”头之间发生顺序过滤。例如,如果“由服务器X接收”,并且某个反垃圾邮件系统在其中丢弃了几个头或添加了一些头来指示反垃圾邮件操作的类型,这些头通常会出现在两个“Received”头之间,表明“这里发生了这个”。“Received”头相当直截了当:有一个DNS名称,一个IP地址,以及发生事件的日期。
下一个值得注意的是“Message-ID”。Message-ID是该邮件消息的全局唯一标识符。如果你查看Message-ID,你会注意到它们附加了一个类似电子邮件地址的域名。这是为了确保消息的全局唯一性,因为这意味着它只在该域内生成唯一的ID,附加域名是为了确保唯一性。
除了Message-ID,还有“Reply-To”头。“Reply-To”头指定当你回复时应将消息发送给谁。垃圾邮件发送者经常调整它,他们会放入一个空白地址或类似的东西。你经常会发现,某些类别的恶意软件邮件,如果你点击回复,会发现没有合理的回复地址,这就是使用“Reply-To”头实现的。
除此之外,还有可选头,通常以“X-”开头。它们不受SMTP支持,但会沿路径传递。你会在“X-”头中放入很多东西,你会看到很多加密类型的信息。你还会看到来自反垃圾邮件系统的消息。许多反垃圾邮件系统实际上并不阻止或停止邮件,它们只是对其进行注释,表明它们是否认为是垃圾邮件。反垃圾邮件系统会添加一大堆关于它是否认为某物是垃圾邮件的细节,并且实际上会包含一种“收据”,展示它做出该决定所使用的推理过程。
一个简单的SMTP会话
这基本上是你对SMTP的快速概览。现在让我们实际谈谈一个SMTP会话是什么样子的。回到20世纪90年代,在那些纯真的日子里,我们曾经通过直接向SMTP服务器发送邮件来惹恼我们的朋友。你通过直接 telnet 到SMTP服务器并发送SMTP会话来做到这一点,很像HTTP可以在命令行完成。SMTP和HTTP的区别在于,因为垃圾邮件发送者会找到开放的SMTP服务器并立即开始使用它,所以我们不再在公网上开放SMTP服务器。
这是一个简单的SMTP会话。首先,你 telnet 到你的SMTP站点的25端口。你会收到一条关于它位置的消息。然后你联系它。你做的第一件事是发送一个“HELO”消息,说明你来自哪里。如今大多数时候,如果你这样做,SMTP服务器要做的第一件事就是进行反向查找来双重检查你。无论如何,你把你的名字放在那里,你发送(指定)收件人,然后你发送消息。传统上,这是用“DATA”语句完成的,要终止消息,你在一行中输入一个英文句点“.”,然后回车。无论如何,你必须放入邮件头。所以你会看到消息开头,发件人放入了这些头:From、To、Date和Subject,然后只是一条简短的消息。这就是我们过去自娱自乐的方式。在那之后,它停止接受数据,然后返回到SMTP命令模式,然后你只需“QUIT”就完成了。
正如我所说,这是我们在90年代常做的那种事情,因为它很有趣,令人困惑,而且很酷。你现在再也看不到这种事了。这是那些基本上已经成为历史的事情之一,因为垃圾邮件发送者寻找SMTP服务器,因为这对他们来说异常方便。
现代SMTP的演变
让我补充一点,当我说垃圾邮件发送者寻找SMTP服务器时,我使用的是有点过时的信息。如今,大多数垃圾邮件软件、大多数恶意软件都包含用于发送消息的SMTP服务器。过去,垃圾邮件发送者会寻找我们所谓的“开放中继”。大多数SMTP服务器连接到一个域的边界。所以如果它是 A.com 的边界,那么所有消息必须要么源自 A.com,要么发往 A.com。开放中继会接受来自任何地方、发往任何地方的消息。过去,我们经常在互联网上进行检查,发送邮件给人们让他们关闭他们的开放中继,因为垃圾邮件发送者喜欢开放中继。SMTP的基本设计是开放和友好的,因此基本上像塞伦盖蒂草原上受伤的羚羊一样生存机会渺茫。这导致了这种(开放)做法的消亡。现在基本上每个人都锁定了他们的SMTP服务器,进行身份验证保护,只接受来自有限服务器集合的连接,等等。
总结

本节课中我们一起学习了SMTP的基础知识。我们讨论了SMTP代理,讨论了邮件头。我向你展示了一个简单的SMTP会话是什么样子的。我特别向你展示了邮件头的作用,尤其是“Received”头的作用,以及这些可选的“X-”头如何为讨论垃圾邮件的机制奠定了基础。
036:垃圾邮件问题 🚫📧
在本节课中,我们将学习垃圾邮件的基础知识。我们将回顾SMTP协议,探讨垃圾邮件的定义、影响、检测指标、缓解策略,以及它在不同媒介中的传播方式。课程内容将涵盖垃圾邮件对网络基础设施的影响,以及服务提供商如何应对这一挑战。
SMTP协议与垃圾邮件
上一节我们介绍了SMTP的基础知识,本节中我们来看看垃圾邮件如何利用SMTP协议进行传播。



电子邮件系统由多个协议协同工作:
- 地址查询:由DNS处理。
- 邮件路由:由SMTP处理。
- 收件人收取邮件:由IMAP或POP3处理。
我们主要关注SMTP协议。垃圾邮件发送者会滥用SMTP协议。历史上,路由中讨论的“距离度量”也是服务器维护程度的指标。受青睐的服务器通常受到许可反垃圾邮件组织(如IronPort或Wellmail)的密切监控,并被列入黑名单。垃圾邮件发送者倾向于使用“高距离”服务器,即那些更偏远、监管较松的服务器。
一些防御者会安装虚假的高距离服务器作为陷阱,这种做法称为“黑洞列表”,其效果各不相同。在当今环境下,这种方法的影响已不如前,但仍在使用,并且可能非常有效。
开放中继与黑名单

邮件服务器有“中继”的概念,它们知道向哪个网络发送邮件。然而,历史上存在一些“开放中继”邮件服务器,它们被垃圾邮件发送者广泛滥用,并最终被列入黑名单。
理论上,任何人都可以在自己的网络上设置一个开放的邮件中继。这个中继会将接收到的任何邮件路由到任何目的地。它本意是作为一种促进连接和内容传递的方法。但和大多数内容传递机制一样,人们最初并未充分考虑其负面影响。
垃圾邮件发送者开始将这些开放中继作为他们的中转站。问题在于,那个拥有开放中继IP地址的主机会被列入黑名单。该主机的所有者将背负“垃圾邮件发送者”的指控,而他们可能对此毫不知情。我们可以假设大多数情况下他们并不知情。
在后续的一些课程中,你会看到被列入黑名单是非常麻烦的。不仅你的IP地址会被列入黑名单,还存在用于确定特定域名是否可信的域名解析选项。仅仅是你域名下的一个主机被列入黑名单,就可能对你整个域名的信誉和邮件送达能力产生非常负面的影响。
垃圾邮件的定义与规模

在继续深入之前,我们需要了解垃圾邮件的规模。
我认为在座的各位都理解什么是垃圾邮件。对于那些不熟悉的人,最直接的描述是:一堆你并不想要、未经请求、旨在让你购买产品、使用服务或窃取你个人信息的垃圾信息被发送到你的收件箱。
当我们谈论垃圾邮件的数量时,需要认识到,如果你明天就消除所有垃圾邮件,你所处理的邮件流量将大幅减少。保守估计,高达90%的邮件流量是垃圾邮件。这导致在2010年,每天约有20亿封垃圾邮件,平均每人每小时收到2封。

在我看来,这个比例可能还被低估了,因为垃圾邮件通常体积很小,不是那种大体积的高容量邮件。如果我们只处理SMTP流量的绝对数量,这个数字可能掩盖了实际的邮件数量。同样,因为它们体积小,实际数量可能更多。由于垃圾邮件过滤器的存在,你最终只看到这些信息中的一小部分。
垃圾邮件的影响与ISP的动机
服务提供商(ISP)真的不希望这些垃圾邮件链接出现在他们的网络上,原因多种多样。但更重要的是,他们拥有被这些垃圾信息堵塞的基础设施。他们本可以通过传输有效数据来赚钱,但如果传输的是垃圾数据,他们就无法为此收费。这对他们无益,对他们的客户也无益。
因此,他们尽力在网络层面清除垃圾邮件,但这并不能完全解决问题。我必须对这张幻灯片的标题一笑,因为Mike是制作它的人。
垃圾邮件往往是集中、免费、高对比度的内容。在一些第三世界国家,他们接收的垃圾邮件流量甚至超过了其可用带宽。因此,对ISP来说,能够过滤垃圾邮件至关重要。

在后续的一些实验课程中,你会看到许多垃圾邮件操作已转移到不一定是发达国家的地区。原因是法律开始将它们驱逐出第一世界国家。然而,在一些既非第三世界也非第一世界的国家中存在一个“甜蜜点”,它们有足够的带宽支持垃圾邮件操作,但又缺乏严格的法律来限制此类活动。我们将在后续的一节课程中更详细地讨论这一点。
案例研究:ISP的应对与“防弹主机”
让我们通过一个案例来了解ISP如何应对以及他们必须担心的问题。
存在一种称为“防弹主机”的服务。防弹主机提供商无论用户发送什么内容都会保持你的服务在线。这些提供商不在乎。例如,Colo曾是一个主要的垃圾邮件发送者McColo的宿主。它只是一个被列入黑名单的垃圾邮件发送者,最终被一个ISP团体联手断网。

我想让大家在继续之前意识到一件事:我们正在谈论的是一群ISP联合起来切断了一个实体的连接。
这张图显示在一个非常大的网络上观察到的SMTP流数量。在最高层级,我们看到从11月2日到11月12日期间,一侧的SMTP流数量对另一侧产生了影响。如图所示,有几个高流量时期。你可以看到季节性和昼夜模式,这指示了一周中的实际天数,然后在周末流量急剧下降,工作日又开始回升。
有趣的是,我们无法为它们找到一个单一的、明确的改变原因。但仅仅通过采取行动(指断网McColo),我们就将SMTP流量减少了多达图中所示的程度。
总结


本节课中,我们一起学习了垃圾邮件的核心问题。我们回顾了SMTP协议如何被滥用,了解了垃圾邮件的巨大规模及其对网络基础设施的严重影响。我们还探讨了服务提供商过滤垃圾邮件的动机,并通过案例看到了协同行动能显著降低垃圾邮件流量。理解这些基础是后续深入学习垃圾邮件检测与缓解策略的关键。
037:垃圾邮件发送者视角 🕵️♂️
在本节课中,我们将从垃圾邮件发送者的视角,探讨垃圾邮件产业的运作方式。我们将了解其背后的动机、盈利模式、有效原因以及其组织架构。通过本课,你将能够解释垃圾邮件活动为何存在,以及它是如何在全球范围内运作的。
垃圾邮件为何如此普遍?📧
上一节我们介绍了课程概述,本节中我们来看看垃圾邮件为何如此普遍。根本原因在于其有效性。垃圾邮件是驱动全球许多更复杂网络犯罪活动的引擎,历史上被视为利润引擎。它为犯罪者积累资本,以便进行更高级别的犯罪活动。
垃圾邮件之所以有用,是因为它能以极低的成本实现盈利。垃圾邮件发送者建立了对抗各种反垃圾邮件机制的系统,并投入大量资金开发高效软件。他们甚至利用运营所在国家的法律体系,试图限制对其活动的遏制,例如起诉反垃圾邮件者。
盈利引擎:如何赚钱?💰
既然垃圾邮件是一个盈利引擎,那么他们具体如何赚钱呢?本模块有一篇阅读材料会详细探讨这一点。需要明确的是,我们讨论的是一个年收入达数百万美元的产业。
以下是其主要盈利方式:
- 营销高利润产品:主要通过销售利润率高但效果甚微的廉价药品。由于全球化,他们可以非常低廉的成本(例如来自印度、加拿大或中国的标签药品)制造这些产品,然后将其推销给有购买力的美国用户。任何轻信广告并购买的人都会成为受害者。
- 不对称经济:这是一个完全不对称的经济模式。操作者可能来自经济规模较小的地区,从美国等第一世界经济体中提取资金。由于当地生活成本低,他们无需赚取数十亿美元就能过上优越的生活,少量收入就足够他们生活多年。
搭建垃圾邮件运营:需要什么?🔧
在了解了盈利模式后,现在我们来探讨搭建一个垃圾邮件运营体系需要哪些要素。这有助于你理解这些半合法操作背后的心态、组织方式及其目标。
搭建垃圾邮件运营需要三个主要组成部分:
- 地址列表:用于发送邮件的目标邮箱地址集合。
- 垃圾邮件工具:用于发送邮件、规避过滤的软件或系统。
- 基础设施:包括带宽、服务器托管支持,以及从受害者那里提取资金的渠道(如支付处理)。
地址收集与交易
垃圾邮件发送者从多种渠道收集邮箱地址。
以下是常见的地址来源:
- 公开帖子:从论坛、博客评论等公开网络信息中抓取。
- 模式生成与验证:利用常见的邮箱命名模式(如
name@domain.com)生成大量地址,然后通过发送探测邮件验证哪些地址有效。这个过程自动化程度高,速度极快。 - 网络爬取:抓取各类网站上的“联系我们”页面、通讯录等任何包含邮箱地址的页面。
收集到的地址列表本身也具有价值,并形成了一个交易市场。地址根据其新鲜度、有效性和真实性进行评级。你可以购买这些列表,然后用于自己的垃圾邮件活动。需要指出的是,过于复杂的地址隐藏方案价值有限,因为一旦地址被捕获一次,就可能进入这个交易系统。作为网络防御者,更应着力于保护账户,而非仅仅隐藏地址。
工具与基础设施
我们将在本模块阅读的另一篇论文讨论了网络层面的行为。不仅地址被评级,用于发送垃圾邮件的主机也会根据其是否已被列入黑名单而被评级。信誉良好的主机(即尚未被标记为恶意的)对垃圾邮件发送者来说价值更高。

在90年代中期,大多数垃圾邮件发送者在美国。2003年,美国通过了《CAN-SPAM法案》,这基本上扼杀了美国的垃圾邮件产业,所有操作都转移到了海外。这造成了一种 dichotomy(二分法):运营基础设施设在海外,主要目标是攻击美国等第一世界国家以获取资金。
这种转变催生了“飞蛾扑火”式的IP地址提供商,它们允许客户托管恶意软件、交易站点等。这些提供商通常信誉较差,但为垃圾邮件发送者提供了必要的网络存在。下图(源自RSA反欺诈行动中心,2009年3月)展示了这种全球化的、去中心化的基础设施网络,其中红色中心节点代表托管恶意软件和交易站点的服务器,连接着世界各地众多自治系统(AS)。


总结 📝
本节课中,我们一起学习了垃圾邮件产业的运作视角。
主要要点总结如下:
- 动机纯粹是金钱:垃圾邮件是获取启动资金、为更复杂犯罪活动融资的便捷方式。
- 基本构成三要素:地址列表、垃圾邮件工具和基础设施(带宽/托管)。
- 存在成熟市场:所需组件(如软件、地址列表)均可购买,降低了入门门槛。
- 运营已全球化:主要运营不再位于美国,法律打击效果受限,全球化使得打击更加困难。
- 经济不对称性:从富裕国家提取少量资金,就能在生活成本低的国家产生巨大影响。


理解这些原理,有助于我们更好地设计防御策略,从根源上认识垃圾邮件威胁的持久性和复杂性。
038:反垃圾邮件的技术军备竞赛 🛡️📧
在本节课中,我们将学习反垃圾邮件技术的工作原理,以及垃圾邮件发送者如何应对这些技术。我们将从网络和消息两个层面探讨反垃圾邮件的策略,并了解攻击者如何不断调整策略以绕过防御。
网络层面的防御 🌐



上一节我们介绍了反垃圾邮件的整体框架,本节中我们来看看网络层面的防御措施。网络层面的防御主要处理声誉问题,通过黑名单机制来阻止已知的恶意来源。
反垃圾邮件系统收集垃圾邮件活动的报告,生成黑名单并进行分发。订阅这些服务的服务器会定期更新黑名单。黑名单的条目通常有预设的过期时间。
关于黑名单的一个重要细节是:一旦某个实体被列入黑名单,它会在一段时间内保持在该列表中。声誉管理服务会维护历史信息,记录实体何时被列入黑名单以及何时被移除。例如,某些硬件服务(如 IronPort)允许你查询历史记录。

以下是使用DNS黑名单的典型流程:
- 设置一个本地DNS服务器。
- 该服务器定期从黑名单服务更新数据。
- 当收到来自未知URL的邮件时,系统会查询本地DNS服务器。
- 服务器会返回该URL是否为恶意站点的信息。
关于这些黑名单的一个普遍问题是其质量参差不齐。许多人关心的是如何从黑名单中移除。有些列表的移除政策非常严格,即使网络感染已被清除,也可能无法被移除。理解实际的移除政策非常重要。

如果你是一名网络防御者或管理员,必须了解这些黑名单系统的移除机制。如果你的网络突然出现在某个黑名单上,你需要知道如何申请移除。
总的来说,声誉黑名单机制相对直接。你可以使用本地DNS服务器来解析查询,也可以直接将IP集插入某些系统(如 IronPort)。

消息层面的防御 📄
上一节我们讨论了网络层面的声誉管理,本节中我们来看看消息层面的防御。这里我们不再关心基础设施,只关注收到的具体邮件内容。
早期的垃圾邮件防御非常简单,因为攻击者会反复发送完全相同的信息。防御者可以通过对邮件内容进行哈希处理,来识别和阻止重复出现的垃圾邮件。这种方法在攻击者重复使用相同消息时非常有效。
然而,如果攻击者开始尝试发送不同的内容,这种方法就会失效。于是,贝叶斯过滤被引入。
贝叶斯过滤的基本前提是:计算一封包含特定罕见词汇(如“草本伟哥”)的邮件是垃圾邮件的概率。系统会请求用户帮助判断邮件是否为垃圾邮件,以此来计算和调整概率。
我不会深入讲解具体的公式,但这是一个标准的贝叶斯检查。它从一个基础概率(例如,某封邮件是垃圾邮件的概率约为85%)开始,然后根据邮件中是否存在你标记过的特定词汇来估算其是垃圾邮件的概率。
每当用户手动将邮件标记为垃圾邮件时,系统就会学习,并变得越来越擅长识别你系统收到的垃圾邮件。


还存在一种变体策略。上面的公式是朴素贝叶斯分类器,可用于计算一组词汇的概率。这意味着它不是针对单个词汇,而是针对词汇组进行分类。其他分类器也采用这种方法,例如聚合文档中多种类型的词汇及其不同配置。
这是一种非常有趣的策略,需要一些基础但设计良好的机制。


攻击者的应对策略 ⚔️
上一节我们了解了防御技术,本节中我们来看看攻击者如何应对。攻击者不会坐以待毙,他们会不断采用新技术来规避这些防御,以保护其利润。
攻击者会采取多种手段,例如“投毒”训练数据、利用僵尸网络群发广告、利用经济学原理等。他们会充分利用这些手段。

首先,他们应对许多防御措施最简单的方法是:获取一个声誉良好的、不在任何黑名单上的僵尸网络。然后尽可能快地发送大量邮件。
由于反垃圾邮件系统的基本设计是默认允许邮件通过(在用户点击“垃圾邮件”按钮之前),贝叶斯标识符可能尚未更新。同时,攻击者使用独特的邮件内容,因此基于哈希的过滤器可能尚未将其识别为垃圾邮件。
只要僵尸网络尚未被列入黑名单,攻击者就会尽可能快地向收件箱发送尽可能多的邮件,看看在被阻止之前能完成多少。这就是垃圾邮件发送者的基本思路。
但如果我们想真正击败反垃圾邮件系统使用的某些特定技术呢?例如,早期的哈希过滤器要求每条信息都完全相同。一旦你看到某条信息重复了几千次,就能很好地判断它可能是垃圾邮件。

攻击者绕过此防御的方法是引入“词汇沙拉”,即在邮件文本中添加一组随机选择的垃圾词汇。这样,哈希值就不再重复。

攻击者也可以进行基本的混淆,例如猜测用户的电子邮件地址并将其放入邮件中,这同样会影响哈希值。这两种方法都相当有效。
这与许多恶意软件加壳的思路类似:在恶意软件中填充一堆随机数据,使其哈希值每次都不同。
那么,贝叶斯过滤器呢?这个过滤器背后有数学原理支撑,它会根据用户自身的行为来计算概率并调整过滤策略。它实际上是在分析发送的邮件文本。


贝叶斯过滤器的一个小问题是:人类很容易阅读写得不好的文字。攻击者很容易击败这类文本处理系统,因为人类擅长阅读,而机器在处理各种奇怪的网络用语时则不那么擅长。

最后,还有图像垃圾邮件。反垃圾邮件引擎不一定能很好地处理图像。攻击者可以将邮件的所有文本编码成一张图片发送,这样就不会被反垃圾邮件引擎分析,从而绕过防御。
还有一种利用基础设施使邮件对反垃圾邮件引擎更具“亲和力”的技巧。例如,攻击者会发送一封邮件,邮件被退回,然后他们直接转发这封退信通知。因为这封邮件看起来像是需要返回给发件人的系统级消息,所以更容易进入收件箱。

总结 📝
本节课中,我们一起学习了反垃圾邮件的技术军备竞赛。我们从网络层面的黑名单和声誉管理开始,了解了如何通过DNS查询来阻止恶意来源。接着,我们探讨了消息层面的防御,包括早期的哈希对比和更先进的贝叶斯概率过滤。


最后,我们看到了攻击者如何不断调整策略来应对这些防御,例如使用“词汇沙拉”、图像垃圾邮件和利用系统退信机制。关键在于,即使我们拥有最先进的技术和用户反馈机制,垃圾邮件发送者也不会坐视利润减少。他们会不断寻找新方法,绕过现有防御,并重复这一过程,直到找到有效的手段。这场攻防对抗将持续进行。
039:SMTP之外的垃圾信息传播 🚫
在本节课中,我们将探讨垃圾信息发送者(Spammer)如何利用SMTP电子邮件协议之外的其他渠道传播信息。你将了解垃圾信息传播的新手段,以及用于缓解这些新威胁的策略。


概述
垃圾信息传播是一个以盈利为目的的产业。随着电子邮件过滤技术的成熟,垃圾信息发送者开始转向新的媒介和受众。本节将介绍他们如何利用博客、社交媒体等动态网站进行传播,并讨论相应的防御策略。
垃圾信息传播的演变
上一节我们介绍了基于SMTP的垃圾邮件。本节中我们来看看,随着新媒体的兴起,垃圾信息发送者如何将阵地转移到电子邮件之外。

垃圾信息发送者是广告商,他们需要寻找新的受众。因此,当电子邮件等传统渠道效果下降时,他们会转向新的媒介。目前,除电子邮件外的垃圾信息主要集中在社交网络和其他动态网站上。

垃圾信息传播的两种主要方式
垃圾信息传播通常通过以下两种方式之一进行:
以下是两种主要方式:
- 利用动态功能添加内容:例如,在博客评论区或维基页面上发布垃圾信息。
- 滥用联系人列表:例如,入侵社交媒体账户后,向其好友列表发送垃圾信息。


1. 利用动态功能
这种方式通常针对那些允许用户生成内容的动态网站。

以下是具体表现:
- 查看任何长期运行的博客,你可能会看到垃圾评论。
- 垃圾信息常集中在缺乏维护的旧页面或网站上。
- 发送者试图将信息与人们可能搜索的关键词关联起来。
2. 滥用联系人列表(社交媒体垃圾信息)
让我们从简单的账户创建转向讨论那些已经建立、并被滥用的账户。垃圾信息发送者会入侵这些账户,并利用其社交关系网络进行传播。

以Twitter为例,存在所谓的“Twitter垃圾信息发送者”。他们的目标是让尽可能多的人关注他们。
以下是常见的策略:
- 大量关注他人:快速关注尽可能多的人(早期上限是每天1000人),希望对方回关。
- 入侵账户:一旦获得某人的账户访问权限,就能更容易地向其好友列表发送垃圾信息。接收者更可能点击来自“朋友”的链接。
- 使用机器人(Bots):利用自动化程序,通过被入侵的账户向所有联系人发送看似无害的垃圾信息。
防御策略
面对这些新型垃圾信息,网站管理者采取了一系列防御措施。维基百科(Wikipedia)是一个很好的案例,展示了如何有效应对。
以下是几种关键的防御策略:
- 使用自动垃圾信息检测机器人:自动扫描并回退被篡改为垃圾内容的页面。
- 关闭或限制动态功能:在一定时间后关闭页面的评论或编辑功能,锁定最终版本的信息。
- 采用验证码(CAPTCHA):验证码的全称是“完全自动化的公共图灵测试,用于区分计算机和人类”(Completely Automated Public Turing test to tell Computers and Humans Apart)。它属于谜题防御的一种,旨在提出一个对人类简单但对计算机困难的问题,用户必须解决后才能继续操作。
代码示例:一个简单的验证码理念
# 概念性代码:展示验证码的基本逻辑
def check_captcha(user_input, correct_answer):
if user_input == correct_answer:
return True # 认为是人类
else:
return False # 可能是机器

然而,验证码并非完美无缺。
以下是验证码的局限性:
- 可被光学字符识别(OCR)破解:如果验证码是扭曲的文本,OCR技术可能识别出来。
- 人工破解:垃圾信息发送者可以雇佣廉价人力来批量解决验证码。
关键要点与总结
本节课中我们一起学习了SMTP协议之外的垃圾信息传播手段。
关于垃圾信息,有几个核心要点需要记住:
- 低响应率即可盈利:垃圾信息发送是数量游戏。即使向10000人发送只有1人回应,也可能获利。他们不在乎成功率低,只需持续发送。
- 这是一门生意:根本动机是经济利益,而非针对个人。
- 适应性与演变:垃圾信息发送者会不断适应新技术和新平台。任何高效的新通信渠道都可能出现垃圾信息。
- 防御的挑战:对于Twitter、Facebook、维基百科等我们网络之外的平台,我们很难直接检测其上的垃圾信息。防御重点在于平台方采取的措施(如验证码、自动检测)和用户自身的警惕性。

总之,垃圾信息传播是一个持续演变的问题。发送者会不断寻找并利用新的媒介和技术漏洞。理解他们的动机和手段,是制定有效防御策略的第一步。
040:分层模型 📚


在本节课中,我们将开始学习TCP/IP协议分析。为了理解TCP/IP,我们必须从它之下的基础概念——分层模型开始。

概述 📋
本模块的目标是让你理解分层和网络协议的作用。分层用于隐藏网络的复杂性,使其更易于配置和实现。存在多种分层模型。在本模块结束时,你将能够识别和描述这些模型,并理解各层之间的相互依赖性及其影响,因为安全问题往往就出现在这里。
分层模型的核心概念 🧱

上一节我们介绍了本课程的目标,本节中我们来看看分层模型的核心思想。
在工程学中,一个核心思想是有限理性。这意味着工程师审视一个项目时,会为其设定边界以使问题可解。他必须抽象掉某些方面。例如,设计汽车时,你不必担心其环境影响或总体污染,你关心的是如何将能量传递到车轮。在协议设计中,我们通过将协议放入一系列称为“层”的黑盒中来抽象和限定我们的理性。

一个层是一个功能性的黑盒,它与上层和下层交互,但不知道这些层内部发生了什么。这为我们提供了灵活性和鲁棒性。灵活性的一个关键特征是,我可以在各种底层链路协议(如以太网、ATM、令牌环)上运行IP协议,而无需过多担心这些底层协议的细节。此外,分层还提供了一定程度的鲁棒性:如果某一层出现问题,它不一定会自动传播到整个系统。
OSI与IETF分层模型对比 🔄

现在,关于分层最重要的一点是它们并不总是完美工作。这部分是因为IETF(互联网工程任务组)信奉“粗略共识和运行代码”,不喜欢复杂的分层方案。而OSI(开放系统互连)模型则钟爱复杂的分层方案。
以下是两种模型的对比:

- OSI 七层模型:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。这个模型出现得比TCP/IP晚,其层与层之间的界限比实际情况更清晰。
- IETF 四层模型:链路层、互联网层、传输层、应用层。IETF有一篇著名论文叫《分层被认为有害》,因此他们的模型分层不那么严格,各层之间的区别也不像OSI模型所宣称的那样清晰。
详解OSI模型各层 🗂️

上一节我们对比了两种模型,本节我们来详细看看更复杂的OSI模型各层的职责。

- 物理层:关注物理互连。它涉及如何将两台计算机连接起来,包括引脚排列、信息是作为载波脉冲、光束还是电信号传输等问题。
- 数据链路层:关注两点之间的通信,不依赖路由和中介。这是像以太网、帧中继和ATM这样的协议,它们假定拥有或列出了与所有通信对象的直接连接。当人们谈论星型或环型拓扑时,他们谈论的就是数据链路层的问题。
- 网络层:关注路由和分片,即数据在实际网络中的移动。
- 传输层:也关注数据传输,主要是像TCP和UDP这样的协议,专注于发送用户信息。大约从这里开始,用户的真实需求开始显现。
- 会话层:涉及双向传输。你可能注意到TCP在这里出现了很多次,这是因为OSI模型是在TCP开发很久之后才出现的,IETF模型(主要由TCP/IP驱动)与OSI模型的多层重叠。
- 表示层:关注数据的编码和转换。它涉及如何将传输的比特转换成用户可以阅读的内容,涵盖从ASCII或EBCDIC编码到加密等问题。
- 应用层:到达你可能认为是客户端程序(如Netscape、Telnet)的层面。此外,你还会听到一些半开玩笑的“超级层”,最常见的是第8层(用户)、第9层(组织)和第10层(政府)。

分层模型的挑战:MTU与分片 ⚠️

记住关于分层的一切:分层降低了复杂性,但抽象降低了效率,并通过形式化依赖关系实现了灵活性。问题是分层很少是清晰的。为了理解这一点,让我们看看一个我们将遇到的基础性问题:MTU(最大传输单元)。
要理解MTU,让我们从第2层的帧开始(第2层通常是帧,第3层是数据报,第4层是包)。以以太网帧为例,它有一个同步字、硬件地址、服务质量信息、结构信息,以及最多1500字节的有效载荷。

以太网只是多种第2层协议之一。其他例子包括ATM、SONET(同步光纤网络)、令牌环和CAN(控制器局域网)。如今,以太网因其在处理异步活动(如办公室人员共享激光打印机)方面表现出色且成本低廉,几乎成为了一切的标准。
然而,这些协议都有自己的依赖关系,这些依赖关系导致了复杂性的增加。IP中最臭名昭著的例子就是分片。

分片机制与安全问题 🔓

要理解分片,你必须理解MTU的概念。协议涉及实体争夺资源(带宽)的控制权。例如,以太网帧每帧可以发送1500字节。这是一个权衡:如果将帧大小设为1兆字节,那么丢包或重传的代价就很高。因此,帧大小被设定在丢包不会造成灾难的水平。不同的协议为最大帧大小设定了不同的标准。
但是,如果你在具有不同MTU的网络之间传输数据呢?例如,从一个使用ATM AAL5(MTU为9180字节)的网络连接到一个以太网(MTU为1500字节)网络。在IPv4中,他们开发了一种称为分片的机制。位于两个网络之间的路由器会将大的ATM数据包分割成多个带有重组指令的子数据包,对用户完全透明。

IP通过三个字段实现分片:IP标识符(所有分片共享同一个标识符)、分片偏移量(指示该分片应放置的位置)和标志位(指示是否为最后一个分片)。接收方根据这些信息重组数据包。

分片带来的安全噩梦 😱

分片从一开始就是一场巨大的灾难。主要问题在于规范编写时存在一系列复杂且未定义的行为。例如,如果两个分片被指定为重叠,会发生什么?作为安全人员,我们必须考虑当有人设置这个参数时会发生什么。答案是,不同的协议栈以不同的方式实现了它,因为规范没有明确说明该怎么做。这意味着攻击者可以根据协议栈对分片的反应来探测其类型,或者操纵分片以逃避检测。
IPv6基本不使用分片,它使用路径MTU发现机制来探测整条路径上的最小MTU。此外,由于现在几乎所有连接都始于并终于以太网,只要中间网络不使用更大的MTU,分片问题就不那么突出。
那么,为什么这很重要?原因是:MTU打破了分层模型。它是一个影响所有其他层的工程约束。因为我不能有一个超过1500字节的以太网帧,所以我实际上也不能有一个超过1500字节的TCP包或UDP包。这甚至影响了像DNS这样的协议。分片是为了保持分层模型工作而进行的尝试,它通过增加复杂性来隐藏细节,而这种复杂性却引入了巨大的安全漏洞。
总结与要点 🎯

本节课中我们一起学习了现代协议设计依赖分层,需要记住第2层(交换)、第3层(路由)和第4层(传输协议)。所有这些用于隐藏细节的工具都是不完美的,低层的信息会影响高层。MTU是第2层的产物,它影响了IP包大小、TCP包大小以及其上的一切。

此外,请记住,维护抽象会增加复杂性,而复杂性为攻击打开了路径。分片就是这方面的一个经典例子。不要为了维护一个模型而牺牲现实,这是问题的核心。不要为了捍卫分层而引入安全漏洞。

核心要点回顾:
- 分层是管理网络复杂性的关键工具。
- OSI七层模型和IETF四层模型是主要的参考模型。
- MTU是数据链路层的限制,它向上影响网络层和传输层。
- IPv4的分片机制是为了解决MTU差异,但引入了复杂性和安全漏洞。
- 在安全设计中,应平衡抽象带来的好处与复杂性增加的风险。
041:IP协议族 📡

在本节课中,我们将要学习TCP/IP协议族,特别是IP协议。我们将了解其作为“尽力而为”的包交换协议的关键特性,并详细解析IP数据报的各个字段,如TTL、地址和协议字段。

什么是TCP/IP? 🌐
上一节我们介绍了课程概述,本节中我们来看看TCP/IP的基本概念。
TCP/IP是互联网上传输信息的基本协议。它是一种包交换协议。这意味着数据被分割成离散的数据包在互联网上传输,并最终到达目的地。

你可以将其想象成一个非常、非常快速的邮政服务。
包交换 vs. 电路交换 🔄
在介绍包交换的具体含义前,我们先了解两种信息传输模式。
以下是两种主要的传输模式:
- 电路交换:类似于传统的电话系统。在两个地点之间建立一条专用的物理连接。这条专用连接允许你在两点之间传输信息,并为此分配了专用资源。
- 包交换:我们将信息分割成数据包,然后将每个数据包单独发送到目的地。它们可能走相同的路径,也可能不走。包交换并不关心路径,只要所有信息都能到达即可。

TCP使用包交换。数据包是你会话的子部分,它们可以被任意路由。能够任意路由数据是TCP/IP的一个特定设计目标。

为什么选择包交换? 💡
上一节我们对比了两种交换模式,本节中我们来看看选择包交换的原因。
IP协议族的设计初衷是为了在战争中存活下来。它被设计成即使路由流量的站点被摧毁,也能重新路由流量。
- 电路交换为你提供一组专用资源。
- 包交换则不同。如果一个站点宕机,你可以绕过它进行路由。而在电路交换中,如果站点宕机,整个连接就会中断。
邮政服务类比 📮
理解TCP/IP包交换的最佳方式,是将其类比为一个超高速的邮政服务。
我们只关心某物要去哪里,而不关心它来自哪里。在这个类比中,路由器就是不同的邮局。它们不需要确切知道目的地在哪,只需要知道哪个邮局能把信件送到更接近最终目的地的地方。

同样,路由器只关心它所知道的、能将数据包送到更接近(且更快)其目的地的下一个路由器。这意味着你可以在不了解世界上每台计算机所有信息的情况下路由信息。这也意味着路由路径不具有对称性。从A到B的路径,并不意味着从B返回A会走相同的反向路径,甚至不一定能从B到达A。
由于如此注重将信息送达目的地,这种路由形式容易受到欺骗。即某人可以声称他们代表A发送数据,但实际上与A完全无关。正如我们稍后会讲到的,这既可用于合法目的,也可用于非法目的。

IP协议族简介 🧩
现在我们来介绍IP协议族本身。它是一个协议套件。
协议存在于IP之上的层,并依赖于IP提供的特性,特别是寻址和TTL。你实际上并不直接通过IP进行通信,IP并非为此设计。IP的设计目的是帮助引导数据包。因此,你是在其他协议之上通过IP进行通信,而不是IP本身。
IP数据报结构 📦
以下是IP数据报的格式图。如图所示,它被分成几个不同的字段。


第一个字段是4位的版本,目前可以是4或6,大多数情况下你会看到IPv4。接下来是IHL,即整个IP数据报头的长度。然后是服务类型、总长度、标识符、标志、分片等。随着课程的深入,我们会探讨其中几个最有趣的字段。
当然,大多数人最关心的字段是源地址和目的地址。这是两个32位的地址,在谈论网络流量时最常见。地址格式类似 192.168.1.1。
最后,我们还有选项和填充。选项和填充是一些不一定需要成为实际数据报部分的字段集合。你会注意到IP数据报的长度实际上是可变的,这是因为你不一定必须在这里添加选项,但你可以添加。
关键字段详解 🔍
上一节我们概述了IP数据报结构,本节中我们深入看看几个关键字段。
1. IHL(首部长度)
IHL基本上是包括选项在内的首部长度。关于这一点,一个容易让人困惑的地方是:当人们想到“长度”时,通常想到的是8位(字节)或其倍数。但IHL是一个4位字段,它指定的是首部中包含多少个32位字。
2. ToS(服务类型)

这个字段实际上相当过时,多年来被不断重新定义。粗略地说,它定义了数据包的优先级。目前它通常包含两个部分:
- DSCP(差分服务代码点):为数据包提供分类,例如VoIP服务应获得的优先级。
- ECN(显式拥塞通知):用于通知目的地网络中出现的拥塞问题。
关于此字段的重要一点是:只有当发起方和目的地都明确决定使用时,它才会被使用。
TTL(生存时间) ⏳
TTL可能是IP数据报中最简单但也最容易被利用的部分。
TTL的基本工作原理是:IP数据包以尽力而为的方式路由,它们实际上并不知道数据包是否会到达目标。理论上,数据包可能永远循环下去。因此,设计者为每个数据包关联了一个计数器。TTL就是用来通过这个计数器防止无限循环的,每次数据包经过一个路由器,TTL值就会减1。
例如,你可以将TTL设置为3。第一个路由器看到它,接收,TTL减为2,然后转发。下一个路由器减为1,再下一个减为0。如果下一个看到它的路由器不是最终目的地,它就会丢弃这个数据包。


通过调整TTL值并发送数据包,如果你有一种有效的方法来确定数据包何时被丢弃,你就可以实际探测出网络有多大。

协议字段 📋
现在让我们来看看协议字段。你会注意到在TTL字段之后就是协议字段。

这个字段可以容纳256种不同的协议,由IANA协议ID标识。大多数人可能只能列出其中的两三种,因为这两三种非常常见。
以下是几个常见的协议ID:
- 1 - ICMP:互联网控制消息协议。包含所有关于网络状态的信息,例如“主机不可达”、“目的不可达”等。
- 6 - TCP:传输控制协议。这是面向连接的状态化协议。
- 17 - UDP:用户数据报协议。这是无连接的协议。

这三个是你最常见到的。你可能还会看到一些其他的,比如用于封装IPv6的协议,或者用于VPN的GRE和ESP等。
这个字段将为你看到的每个数据包提供至关重要的信息。

IPv4地址 🏷️
本节我们将专门讨论IPv4地址(IPv6将在后续课程中讨论)。
IPv4地址是一个32位整数,为网络上的大多数设备提供唯一标识符。IPv4地址通常以十进制整数或十六进制表示,但在口语中更常见的是点分四组格式,例如 192.168.1.1。在本课程的大部分内容中,我们将以这种形式引用它。
IP地址分类与CIDR 📊
历史上,我们通过类别来划分IP地址,例如A类、B类、C类、D类。
- A类网络:地址块为
0.0.0.0到0.255.255.255,包含约1600万个地址。 - B类网络:包含65536个地址。
- C类网络:包含256个地址。
这种划分方式的问题是:如果你只以这种方式划分网络,你能分配出去的块数量非常有限,而且这些块都很大(最小的C类也有256个地址)。

因此,现在我们实际上使用CIDR(无类别域间路由)表示法。它通常带有斜杠,例如 /16、/24。斜杠前的部分是地址,斜杠后的数字是网络前缀的位数(即掩码的位数)。
例如,/16 表示前16位是网络部分,后16位是主机部分。如果我们想要一个C类网络(/24),那么前三个八位组(24位)是固定的,最后一个八位组可以是0到255之间的任何数字。

地址分配与特殊地址 🗺️
IP地址由 IANA 分配。你可以通过特定查询找到谁拥有一个 /8 的地址块。地址实际上是分层分配的:IANA将它们分配给 RIR(区域互联网注册管理机构),然后RIR可能将它们分配给国家或本地互联网注册管理机构,这些机构再分配具体的IP地址。
我们有 2^32(约43亿)个地址可用,但并非所有这些地址都能使用。其中一部分有特殊用途或根本不被使用。
对我们来说特别感兴趣的是:
- 广播地址:通常是网络地址的补码,以
.255结尾(例如192.168.1.255)。用于向整个网络发送消息。每个路由器都知道如何处理.255地址。 - 网关地址:通常是你访问互联网的接入点,是你本地网络到更广阔广域网的过渡区域。这个地址通常是你的网络地址加上
.0或.1(例如192.168.1.0或192.168.1.1)。
这意味着一个典型的 /24 网络中,你实际上有254个可用主机地址(例如 192.168.1.1 到 192.168.1.254),而不是256个。
除了从你的地址块中划出的这些地址外,还有一些CIDR块永远不会分配给公众。这些是专门用于私有网络的地址:
10.0.0.0/8172.16.0.0/12192.168.0.0/16
有趣的是,当你在公共互联网上看到这些地址的流量时,通常表明有人正在将其本地流量泄露到整个互联网。它们不应该被路由到公共网络,但我们确实见过这种情况。
源地址欺骗与单向性 🎭

正如之前所说,IP并不进行双向通信。我们遇到的情况是,每个路由器都试图将数据包送到目的地。因此,没有真正的“返回路径”概念。
正因为如此,源地址的意义是有限的。它对你作为分析师来说意味着一些东西,因为它给了你数据包来源的指示,但这不一定是真正的源头。那只是你看到的源头。
TCP/IP提供了许多进行“花招”的能力,其中最好的(也是最常被利用的)之一就是通过代理。代理会代表其他主机执行功能,使用那些主机的IP地址,而不是请求的实际发起者的地址。这同样有合法和非法用途。
总结 📝

本节课中我们一起学习了IP协议的核心知识。
- IP是一个包交换的转发协议。它是一个协议套件,位于TCP或UDP等协议之下。
- IP数据包包含多种字段,描述了流量的关键信息,包括地址、协议类型等。
- 欺骗和操纵这些字段相对容易。正如我们所说,这真的只是“说你有什么”的问题,没有真正的验证机制。所以你可以声称任何数据包来自
192.168.1.1。
IP协议的设计重点在于将数据送达目的地,而非验证来源或保证双向连接,这既是其强大适应性的基础,也带来了安全挑战。理解这些特性是进行有效网络分析和安全评估的关键。

本节课到此结束,希望对你有所帮助。
042:ICMP与UDP协议分析 🧩
在本节课中,我们将学习TCP/IP协议族中的另外两个核心协议:ICMP和UDP。我们将首先探讨ICMP协议,它负责网络中的错误报告和诊断;然后分析UDP协议,这是一种简单、快速但不可靠的数据传输协议。理解这两个协议是掌握更复杂的TCP协议的重要基础。
ICMP协议:网络的“错误报告员” 📨
上一节我们介绍了IP数据报的基本结构,本节中我们来看看ICMP协议。ICMP是互联网控制消息协议,它是互联网的错误处理协议。当路由或数据传输出现问题时,你可能会收到一个ICMP数据包作为响应。
ICMP发送单数据包消息,并期望得到单数据包响应。消息通过类型和代码值来区分。一个ICMP数据包包含8个字节,其中1个字节是类型,1个字节是代码,2个字节是校验和,以及ID和序列号。消息的实际内容取决于其类型和代码。
以下是主要的ICMP消息类型和代码示例:
- 类型0:回显应答,代码固定为0。
- 类型3:目的地不可达,包含多个代码,例如:
- 代码1:主机不可达
- 代码2:协议不可用
- 代码3:端口不可达
这些类型和代码的组合可能会在数据包负载中包含额外的诊断信息。例如,如果你尝试访问一个主机并收到“主机不可达”的ICMP消息,该主机的IP地址会被编码在ICMP消息中。
使用ICMP的常见工具 🛠️

有多种工具直接使用ICMP,其中最常见的是Ping和Traceroute。
Ping是最常用的工具。它向目标发送ICMP类型8、代码0的消息,即回显请求。该消息包含一个数字,并等待带有相同数字的回复消息返回。Ping通常会发送多个数据包并等待它们返回,以生成关于往返时间的统计模型。数据包通过序列号来区分。


Traceroute的功能与ICMP类似,用于追踪从源主机到目标主机路径上的路由器。它的工作原理类似于Ping,也发送回显请求消息。但与Ping不同的是,Traceroute从一个较小的TTL值开始,并逐步增加该值。TTL旨在防止网络被数据包淹没。数据包每经过一个路由器,TTL值就减1。因此,当我对《纽约时报》网站执行Traceroute时,我发送的第一个数据包TTL为1,它在我的机器之外的第一台路由器处被丢弃,我会收到错误消息。接着发送TTL为2的数据包,它经过第一台路由器到达第二台路由器后丢弃,如此重复。这允许你看到数据包在何处被丢弃。


UDP协议:快速但不可靠的“明信片” 💨


现在,我们来讨论UDP协议。UDP是用户数据报协议,或称不可靠数据报协议。UDP是一种轻量级的数据传输协议,它在两个主机之间发送无状态的单数据报。UDP不假设会有响应,它就像发送明信片。服务可以实现发送响应的功能,但UDP本身没有处理响应的机制。

UDP的核心特点是廉价且无状态信息。与我们将要介绍的复杂协议TCP相比,UDP没有TCP那样的开销。这意味着使用UDP发送数据非常容易,但它是不可靠的。如果一个数据包丢失,你无法知道。UDP数据报的结构非常简单:包含源端口、目的端口、长度、校验和一些数据,仅此而已。



UDP数据报引入的关键概念是端口。端口本质上是IP地址的一个子地址,是一个介于0到65535之间的值。如果我们将IP地址比作一栋建筑,那么端口就是这栋建筑里的一个邮箱。
以下是一些众所周知的端口示例:
- 端口53:DNS服务
- 端口6881:BitTorrent服务
这些端口是我们定义如何与网络上的服务器进行公开通信的方式。如果你想与DNS服务器通信,你可能会打开到端口53的连接。这是公开的常识,攻击者也会扫描端口53。
总结 📝
本节课中我们一起学习了TCP/IP协议族中三个最重要的协议中的两个:UDP和ICMP。
- ICMP用于诊断和错误消息。这些消息可能来自你最初期望发生错误的源地址之外的地方。
- UDP用于发送消息。它快速、不可靠且简单。

请记住这些概念,因为接下来我们将探索TCP协议的奇妙世界,这是一个非常复杂的协议。
043:TCP协议入门 🧩

在本节课中,我们将要学习TCP协议的基础知识。TCP是互联网上最核心的传输层协议,理解其工作机制对于分析网络流量至关重要。我们将介绍TCP会话的基本机制、数据包结构及其关键特性。

TCP的重要性与核心模型 🌐
上一节我们介绍了IP协议,本节中我们来看看TCP。TCP在现代网络流量中占据主导地位,因此我们需要特别关注它。

TCP是互联网上按字节计算最常用的协议,数百种服务都依赖于它。你日常使用的许多应用程序,例如查看邮件、浏览网页或通过FTP传输文件,都使用了TCP。因此,花时间理解这种流量的本质及其特性是非常值得的。

TCP是一种可靠的协议,虽然开销较大(涉及大量数据包重传),但它能保证发送的每一个比特载荷都能准确无误地到达连接的另一端。
TCP在IP协议之上强加了一个IP本身不使用的模型,它构建了一种“幻觉”。回顾我们之前关于IP套件的讨论,IP是一种分组交换协议,没有专用的传输电路。而TCP通过在会话中维护状态,让我们拥有了类似“电路”的幻觉。

TCP会话中的角色与数据包结构 📦
在这个模型中,通信双方分别是客户端(发起连接者)和服务器(监听连接者)。这仅意味着连接由一方发起,另一方监听,一旦会话建立,这对实际的数据传输没有影响。
以下是TCP数据包的头部结构:


我们首先看到两个16位的数字,即端口号。可以将其理解为常见的服务端口,例如Web服务的80端口或SMTP的25端口。
接着是序列号和确认号,它们是两个32位的数字,用于表示会话的进展状态。


数据偏移字段指示了TCP头部的实际大小。
标志位字段是最重要的字段之一,因为会话状态主要通过它来维护,它能告诉你数据包的意图。此外,还有窗口大小、校验和及紧急指针字段。

当然,和IP协议一样,TCP头部末尾也有选项字段。

在所有头部信息之后,就是实际传输的数据载荷。


深入理解TCP标志位与状态 🚩

正如之前所说,会话状态主要通过标志位字段来维护。该字段有8个比特,每个比特代表一个标志。人们常根据此字段中设置的比特组合来指代数据包。
- SYN 比特表示同步,通常称为SYN包,用于发起连接。
- ACK 比特表示确认。
- FIN 比特表示会话结束。
- RST 比特表示连接需要重置。
ACK比特的具体含义可能因数据包在双方通信流中的位置而有所不同,我们稍后会详细讨论。还有PSH、URG和ECE等比特,它们不一定与状态直接相关,我们暂时略过。
让我们直接进入这些更重要的、与会话状态相关的比特。



TCP的三次握手与四次挥手 🤝

以下是建立和终止TCP连接的标准流程:

建立连接(三次握手)
- 客户端通过向正在监听的服务器发送一个SYN包来发起连接。
- 服务器收到后,回应一个SYN-ACK包。这表示“我听到你了,让我们建立连接吧”。
- 最后,客户端发回自己的ACK确认。至此,数据传输便可以开始。

这个过程就是著名的TCP三次握手。
终止连接(四次挥手)
- 当任一方的数据传输完毕后,它可以发送一个FIN包。
- 另一方用ACK包确认收到这个FIN。
- 然后,另一方也发送自己的FIN包。
- 最初发送FIN的一方再用ACK包进行确认,至此会话完全终止。
这是理想情况下的流程,但并非总是如此。实际上,许多服务器为了简化,可能直接发送多个RST包来重置并丢弃连接,而不是完整地进行四次挥手。这虽然不优雅,但确实存在。作为分析者,你会在数据包中看到这种现象,但这通常不意味着存在恶意活动。



序列号与确认号机制 🔢
序列号和确认号是通信双方跟踪对方已接收数据情况的核心机制。其工作原理如下:

- 客户端在初始SYN包中随机选择一个序列号。
- 服务器在ACK包的确认号字段中回应该序列号,并选择自己的序列号。
- 客户端在下一个ACK包中,将确认号设置为服务器发来的序列号,并依据发送的数据大小递增自己的序列号。

此后,每一方都通过确认号来告知对方自己已完整接收到的最高序列号数据。序列号则告诉接收方当前数据包在数据流中的位置。
这对于检测丢包至关重要。每一方只会在确认号字段中填写它已完整接收的最高序列号。例如,如果服务器已完整接收客户端序列号10之前的所有数据,但接下来收到了序列号为400的数据包,而中间的数据包(11-399)却丢失了,那么服务器仍会回复确认号为10的ACK包。
这正是网络中出现大量数据包重传的原因。因为只要丢失一个数据包,接收方就不会确认后续的数据,发送方最终会认为数据丢失并开始重传。理想情况下,一旦丢失的包被补上,接收方会直接确认到最新的序列号(如400),从而避免全部重传。

TCP端口号与选项字段 🚪
现在,让我们来看看端口号。端口号本质上是约定俗成的,它只是建议哪些应用程序应该在哪个端口上运行。除了大家的普遍预期,没有任何强制规定要求特定服务必须运行在特定端口上。


但有一点是确定的:用户级别的活动通常发生在1024号端口以上。没有特权的客户端会从一个高于1024(通常是1024到65535)的端口池中选取一个端口进行通信。这就是为什么你在查看流量时,总会看到一个知名端口(如80)连接到一个1024以上的“奇怪”端口号。
以下是一些你将会常见的端口号列表:
- 20/21: FTP (文件传输)
- 22: SSH (安全外壳)
- 23: Telnet (远程登录)
- 25: SMTP (邮件发送)
- 53: DNS (域名解析)
- 80: HTTP (网页浏览)
- 110: POP3 (邮件接收)
- 143: IMAP (邮件管理)
- 443: HTTPS (安全网页浏览)
虽然恶意活动有时会将服务设置在非标准端口以规避检测,但了解这些通用端口号对分析工作非常有帮助。

最后,关于选项字段:数据偏移字段和IP协议类似,以“字”(4字节)为单位。默认TCP头部大小是5个字(20字节)。如果偏移值更大,说明存在选项。一些常见选项包括:
- 最大分段大小 (MSS): 协商每次能传输的最大数据量。
- 选择性确认 (SACK): 允许接收方更灵活地确认收到的数据块,而非仅确认连续的数据。
- 时间戳: 用于计算往返时间和防止序列号回绕。
- MD5校验和: 一种可选的“安全”机制,用于验证数据在传输过程中是否被篡改。
总结 📝

本节课中我们一起学习了TCP协议的核心内容。
总结如下:
- TCP是IP套件中用于基于会话活动的常见协议,它在无连接的IP层之上提供了类似电路的幻觉。
- 数据包可能乱序到达,但TCP能将其重新排序。
- 通过标志位、序列号和确认号等多个字段来建立和维护会话状态。
- 三次握手用于建立连接,四次挥手用于优雅终止连接(尽管实践中可能简化)。
- 端口号指示了可能运行的服务,但不能绝对保证服务的实际类型。
- 选项字段提供了扩展功能,如调整传输参数和增强可靠性。


理解这些基础知识是后续进行更深入网络流量分析和安全评估的关键。
044:TCP/IP协议滥用分析
在本节课中,我们将学习攻击者如何滥用TCP/IP协议进行恶意活动。我们将探讨从基础的网络扫描到更复杂的会话劫持和协议漏洞利用等多种机制。理解这些滥用方式对于设计安全的系统和进行有效的防御至关重要。
扫描:基础情报收集
上一节我们介绍了TCP/IP协议的基本概念,本节中我们来看看最常见的滥用形式:扫描。扫描是一系列侦察活动的基础,其核心目的是探测网络中哪些主机和端口是活跃的。
以下是两种主要的扫描策略:
- 垂直扫描:针对一个特定的IP地址,扫描其所有可能的端口。这通常用于评估单个主机的整体安全状况。
- 水平扫描:针对网络中的一系列IP地址,扫描一个或几个特定的端口(例如,所有主机的22号SSH端口)。攻击者常用此方法寻找运行特定易受攻击服务的机器。
TCP扫描之所以流行,是因为与UDP或ICMP不同,TCP协议保证响应。如果一个端口开放并准备接受连接,它会回应;如果关闭,则会发送重置(RST)包。
TCP扫描技术详解
了解了扫描的基本分类后,我们深入探讨几种具体的TCP扫描技术。
以下是几种经典的TCP扫描方式:
- 半开放扫描:扫描器发送一个SYN包,如果收到SYN-ACK回复,则立即发送RST包终止连接,而不完成三次握手。这避免了建立完整连接,更为隐蔽。其过程可简化为:
客户端 -> SYN -> 服务器;服务器 -> SYN-ACK -> 客户端;客户端 -> RST -> 服务器。 - 全连接扫描:使用系统调用(如Unix的
connect())完成标准的三次握手,建立完整TCP连接后再断开。这相当于手动使用Telnet测试端口,是最基础、最易被检测的扫描方式。 - 圣诞树扫描:扫描器发送一个设置了所有TCP标志位(SYN, ACK, FIN, PSH, URG, RST)的数据包。这种“全亮”的畸形包(如同挂满彩灯的圣诞树)可能引发不同操作系统栈的异常反应,用于探测和指纹识别。
协议模糊性与指纹识别
扫描不仅用于发现目标,还能通过分析目标对异常数据包的反应来收集更深入的信息,即操作系统指纹识别。
TCP/IP协议栈的实现中存在许多未明确定义的模糊地带。例如,RFC规范可能未规定当第一个包是FIN,或当RST与其他标志位组合时应如何响应。不同开发者在实现时会做出不同选择,这就产生了可被探测的差异。
攻击者会系统地尝试各种标志位组合和异常情况(如分片),观察目标的响应,从而推断其操作系统和协议栈版本。一个著名的指纹识别工具是Michael Zalewski开发的p0f。
需要记住的是,虽然存在技术高超的攻击者,但互联网上绝大多数攻击是自动化、重复且“愚蠢”的。例如,针对SSH端口的暴力密码破解扫描无时无刻不在发生。一个简单的防御建议就是将SSH服务移到非标准端口,以避开这些自动化扫描的噪音。
会话劫持与随机数安全
除了扫描,TCP协议本身的机制也可能被直接攻击。一个经典的例子是利用初始序列号(ISN)的弱点进行会话劫持。
TCP通过序列号来维持会话的连续性和可靠性。在理想情况下,每个新连接的初始序列号(ISN)应该是完全随机且不可预测的,以防止攻击者猜测序列号并劫持会话。
然而,生成高质量的随机数(熵)在计算上是困难的。许多早期或设计不良的系统使用脆弱的伪随机数生成器,导致ISN并非真正随机,而是存在可预测的模式或范围过于集中。
如果攻击者能够监听通信并成功预测出下一个序列号,他就可以伪造源IP地址(这通常需要更复杂的路由欺骗),并插入带有正确序列号的数据包,从而劫持或注入数据到现有会话中。这凸显了在安全设计中,随机性至关重要,而可预测性则意味着漏洞。
IP层攻击:TTL操纵示例
最后,我们来看一个在IP层进行协议滥用的例子:生存时间(TTL)操纵。这虽然不是纯粹的TCP攻击,但很好地展示了如何利用协议的无状态特性。


TTL字段规定了一个数据包在被丢弃前能经过的最大路由器跳数。一些旧的入侵检测系统(IDS)或防火墙会检查数据包负载中的特定字符串(例如,查找“root”这个关键词)。

攻击者可以将攻击载荷(如“ROOT”)拆分到多个数据包中发送。他们给包含干扰字符(如“ROBOT”)的数据包设置一个很低的TTL值,使其在到达检测设备之前就被路由器丢弃。而包含真正攻击字符串(如“OT”)的数据包则设置较高的TTL,顺利通过检查。由于IP是无状态的,检测设备看不到被丢弃的包,因此无法重组出完整的“ROOT”字符串,从而绕过了基于内容的检测。

总结与设计要点
本节课中我们一起学习了多种TCP/IP协议滥用的方式,从基础的扫描到复杂的会话劫持和协议漏洞利用。
关键的设计要点总结如下:
- 永不假设“这不会发生”:在安全设计中,必须考虑所有可能的输入和状态组合。如果某种情况在理论上是可能发生的,攻击者就一定会尝试它。
- 随机性至关重要:无论是生成会话令牌、密码还是初始序列号,使用强密码学安全的随机数生成器是防御预测攻击的基石。可预测性会直接导致系统被颠覆。
- 协议无状态性是一把双刃剑:IP和TCP协议的高效源于其无连接、无状态的设计,但这同样为攻击者进行数据包注入、会话干扰和逃避检测提供了空间。防御系统必须考虑到这一点。

作为安全专业人员,理解这些攻击机制是构建有效防御的第一道防线。
045:IPv6协议 🌐


在本节课中,我们将要学习IPv6协议。我们将探讨其设计动机、与IPv4的主要区别、地址表示方法以及其在安全性和部署方面的考量。
地址耗尽问题 💡
上一节我们介绍了TCP/IP协议的基础,本节中我们来看看推动IPv6设计的核心问题:IPv4地址耗尽。

IPv4提供了大约43亿个地址。理论上这是2的32次方,但由于路由、组播和本地地址预留等原因,实际可用的公网地址更少。一个重要类别是RFC 1918定义的私有地址,例如192.168.x.x和10.x.x.x。负责分配地址的机构IANA在2011年1月耗尽了最后两个未分配的地址块(/8)。
地址分配不均与滥用 🗺️
了解了地址耗尽的背景后,我们来看看地址分配本身的问题。

IP地址的分配最初基于“先到先得”原则,导致分配极不均衡。许多早期组织获得了远超其需求的地址空间。例如,美国国防部拥有约10个/8地址块,总计约1.6亿个IP地址。而像礼来公司这样的组织,可能只使用了其拥有的巨大地址空间中的一小部分,其余部分处于闲置状态。这种早期的分配方式导致了地址资源的浪费。
现有解决方案:NAT与DHCP 🔄

面对地址限制,我们已采用了一些关键技术来适应。
以下是两种核心的地址管理服务:
- 网络地址转换:NAT允许多个设备共享一个公网IP地址。例如,家庭无线路路由器为内部设备分配
192.168.x.x这样的私有地址,然后通过端口转换,将这些内部地址的通信映射到ISP分配的一个公网地址上。 - 动态主机配置协议:DHCP自动为网络中的设备分配IP地址,简化了网络管理。
IPv6的设计目标与变化 🚀

我们已看到IPv4的局限和应对方案,现在让我们深入探讨IPv6本身。

IPv6旨在克服IPv4中发现的缺陷。其设计思想始于1992年。最明显的改进是提供了巨大的地址空间,以解决地址耗尽问题。另一个重大变化是减少了路由器的开销。回顾之前讨论的分片机制,IPv6通常不在路由器上进行分片,从而降低了处理负担。大部分变化都是为了适应新的、更大的地址空间。其他方面则相对类似:IPv6中同样存在TCP和UDP,其操作与IPv4版本基本一致。像DNS这样的协议则同时包含了对IPv4和IPv6的支持,IPv4使用A记录,而IPv6使用AAAA记录。
IPv6地址空间与表示法 🔢
IPv6带来了巨大的地址空间,这自然导致了新的地址表示方法。
IPv6地址长度为128位,提供了约3.4 × 10^38个地址。如果均匀分配,地球上的每个人都能获得海量的地址。IPv6的表示法比IPv4复杂。最简单的形式是将完整地址写成8组4位的十六进制数,例如:2001:0db8:85a3:0000:0000:8a2e:0370:7334。

为了尽可能简洁,遵循以下压缩规则:
- 省略前导零:每组中的前导零可以省略。例如,
0db8可以写成db8。 - 零组压缩:连续多组全零可以用双冒号
::表示一次。例如,2001:db8::1表示2001:db8:0000:0000:0000:0000:0000:0001。
IPv6的特殊地址与关键差异 ⚙️

掌握了地址表示法后,我们来看看IPv6中的一些特殊地址和重要特性。
IPv6定义了一些特殊地址块:
- 环回地址:
::1/128 - 本地链路地址:
fe80::/10 - IPv4映射地址:
::ffff:0:0/96,用于在IPv6中嵌入IPv4地址。
IPv6与IPv4的两个关键差异在于:
- 标准子网规模:IPv6充分利用其地址空间,标准子网大小是
/64(2的64次方个地址)。这比IPv4中常见的/24或更小的子网大得多,简化了路由和管理。 - 分片处理:IPv6的分片通常不在路由器进行。通信开始时,通过路径MTU发现机制确定整条路径上支持的最小MTU,随后整个会话都使用该MTU发送数据包,避免了中途分片。

IPv6与安全性 🛡️
那么,IPv6是否让我们更安全呢?这需要辩证地看。

某些攻击在IPv6环境下效力大减。例如,基于扫描的探测攻击在浩瀚的IPv6地址空间中变得不切实际。然而,IPv6的设计基于为每个设备分配永久、公开的IP地址这一早期理念。这与当前普遍使用NAT和动态地址的互联网现状不同。IPv6的设计早于无线网络、云计算和现代互联网应用模式的普及,因此它主要解决了IPv4的地址空间和效率问题,但并未完全解决后来在IPv4中发现的所有安全缺陷。
IPv6的部署与过渡 🌍
IPv6的部署是一个渐进且不均衡的过程。
IPv6的采用取决于互联网服务提供商。例如,康卡斯特和AT&T等大型ISP已在不同时间点部署了IPv6支持。所有现代操作系统都内置了IPv6支持,谷歌等许多互联网服务也原生支持IPv6。全新建设的网络(如研究网络或某些IPv4地址稀缺的国家)更倾向于直接部署IPv6。预计亚洲和东欧等IPv4地址紧张的地区会率先广泛采用,而美国由于拥有大量历史遗留的IPv4地址,过渡动力相对较弱。

IPv4与IPv6的共存与过渡技术 🌉
由于IPv6尚未完全普及,我们需要技术来实现IPv4和IPv6网络的互通。
当前存在多种过渡技术,其核心思想是隧道协议。在网络中设置IPv4/IPv6网关,当数据包需要从一种协议网络穿越到另一种时,网关负责进行协议转换和地址封装。例如,将IPv4数据包封装在IPv6数据包内进行传输。主要的过渡技术包括:6to4、6in4、4in6以及以“无聊”蠕虫命名的Teredo隧道协议。

总结 📝
本节课中我们一起学习了IPv6协议。
- IPv6的核心目标是解决IPv4地址耗尽问题,提供了极其庞大的地址空间(128位)。
- 这导致了新的十六进制压缩表示法(如
2001:db8::1)和更大的标准子网(/64)。 - 与IPv4相比,IPv6减少了路由器分片开销,依赖路径MTU发现。
- IPv6的部署是一个漫长且不均衡的过程,受各地区IPv4地址存量影响。
- 过渡期间,需要通过隧道等协议实现IPv4与IPv6网络的共存与通信。

理解IPv6是理解现代及未来网络发展的基础。
046:安全区域数据采集工具 🛡️


在本节课中,我们将要学习安全区域级别的数据采集。我们将探讨其目的、局限性,并介绍如何使用伯克利包过滤器进行数据采集和过滤。

概述

数据采集可以根据传感器部署的位置分为两大类:基于路由器的采集和基于安全区域的采集。本节课程将重点介绍基于安全区域的采集方法。完成本模块后,你将能够解释安全区域级数据采集的目的和局限性,并能够使用BPF来定位数据采集和过滤已收集的数据。
什么是安全区域? 🏘️
在深入探讨如何采集数据之前,我们首先需要明确“安全区域”的概念。当我们谈论安全区域时,我们指的是一个内部与外部空间有明确区分的网络。例如,你的家庭网络、军事基地或公司总部都可以被视为一个安全区域。在安全区域内部署的系统和需要保护的资产,与整个互联网之间有一条清晰的界限。
然而,需要指出的是,人们通常并不像他们想象的那样了解自己的网络。一个典型的例子是,许多人没有意识到他们的每一台打印机同时也充当着内部网络服务器的角色。
安全区域采集与路由器采集的差异 🔄
上一节我们介绍了安全区域的概念,本节中我们来看看它与路由器采集的主要区别。安全区域采集与路由器采集最显著的区别在于,在安全区域内,你可以看到更多单个主机的行为细节,但总体流量较少。
在安全区域内,你可以看到主机的所有本地流量以及它发送到互联网的流量,但你无法看到其他所有安全区域通过上层路由器进行通信的全部流量。此外,在安全区域层面,我们较少受到网络地址转换的阻碍。网络地址转换有时是一个很大的障碍,因为它使你无法准确判断你实际处理的主机数量,因为所有主机都被隐藏在某个特定的IP地址之后。

但在安全区域层面,你可以精确地看到主机在做什么以及如何做。由于我们处理的主机总数较少,我们在保留哪些流量方面拥有更大的灵活性。在路由器层面,由于流量巨大,你不得不处理流量汇总,而在这里,我们至少可以尝试记录非汇总的数据,甚至可以尝试按数据包进行记录。
流量如何进出安全区域? 📡
为了实现按数据包记录的目标,让我们讨论一下流量如何进出安全区域。为了简化,我们假设我们的安全区域位于单个集线器上。如果我们有一个大型网络,我们可以简单地假设在每个集线器上都设置了采集点,仍然可以获得大致相同的结果。

以太网和大多数第二层协议都是广播协议。如果一切实施正确,每当一台主机向集线器发送流量时,该集线器会将其发送给路由器,但它也有将流量广播给连接到该集线器的所有其他主机的倾向。
现在,假设其中一台主机被设置为传感器,用于记录流量。主机可以以两种模式运行:混杂模式和非混杂模式。
以下是两种模式的区别:
- 混杂模式:主机监听来自集线器的所有内容。其优点是能够监听到其他主机的流量。其缺点是必须在混杂模式下运行传感器,这需要对该机器拥有根级访问权限。
- 非混杂模式:如果你没有根级访问权限,或者只想检查发送到特定主机的流量,可以使用非混杂模式。这会进行主机通常进行的所有过滤,主机本身不会监听所有流量,而只监听专门发送给它的流量。

数据采集工具 🛠️

关于背景知识已经介绍得足够多了,让我们来看看一些实际的工具。在本课程中,我们将反复使用两个工具:tcpdump 和 Wireshark。它们的功能基本相同,都是采集和分析工具,允许你将网络流量保存为二进制文件格式,并允许你对流量进行过滤和其他操作。


两者的区别在于,Wireshark 拥有一个简洁的图形用户界面,并且可以在多种不同的平台上使用。
tcpdump
我们先从 tcpdump 开始,快速了解一下。它是一个用于Unix环境的命令行工具,有几个非常重要的选项需要快速过一遍。

以下是 tcpdump 的几个关键选项:
-A:允许你将ASCII输出到屏幕。这意味着你可以开始报告流量并直接将其转储到屏幕上,查看发生了什么。-i:允许你指定网络接口。每个拥有笔记本电脑的人可能都意识到你有大约三到四个可用的接口,因此能够指定我们真正感兴趣的那个至关重要。-w:用于将原始数据写入文件。
Wireshark
如前所述,Wireshark 是一个易于使用的GUI工具。需要提醒你的一点是,确保你以足够的权限运行它,以便选择你想要使用的接口,并以能够以混杂模式运行的方式配置这些接口。这一点对人们来说可能不那么明显,即程序需要在混杂模式下运行,或者必须配置其某些子进程以混杂模式运行才能完全正常工作。

关于这方面的很多内容实际上都列在网站提供的文档中。我不会花太多时间在这上面,因为网上有大量的YouTube视频以及网站上的几份文档,可以告诉你关于这个工具本身你需要知道的一切。
过滤语法:伯克利包过滤器 🔍
现在进入过滤语法的核心。分析师将执行的最重要的操作之一就是过滤流量。伯克利包过滤器基本上是数据链路层的一个接口,它允许你发送和接收数据包。它是一个非常有趣的工具,在大多数操作系统中都可用。

当大多数人谈论BPF时,他们不一定是在谈论该工具本身,更多的是在谈论其过滤能力。这种过滤能力在各种不同的工具中都可用。此外,Windows和Unix都有支持它的API,分别是Unix的pcap和Windows的winpcap。每当你使用 tcpdump 时,你都可以使用BPF,而且Wireshark的语法也非常相似。
BPF 基础语法
让我们深入了解该语法的基本原理。在最基本的层面上,BPF允许你分析来自数组(如IP、以太网帧或TCP)的记录。基本上,它的作用是将数据块分割成你在本模块前几节课的数据报中看到的各个字段。
例如,ip[9] 表示它正在查找数组中第9个位置的值(从0开始计数)。在这种特定情况下,这将是协议字段。里面存放的不是协议的名称,而是与之关联的实际数字,即0到256之间的值。如果值为6,则表示TCP;如果值为17,则表示UDP。

BPF包含许多原语,它们是数组特定部分的快捷方式。你可以指定一个特定的值,如 host 或 proto,它会直接给你协议信息。
高级操作与逻辑
数组有范围表示法。例如,tcp[2:2] 将给出从偏移量2开始的两个字节。在TCP的情况下,这将是目标端口。而 tcp[0:2] 则是数据报中的前两个字节,即源端口。
BPF的一个有趣特性是它允许你进行比较操作,例如等于、大于、小于、不等于。你可以操作值,将不同的字段组合在一起,然后将这些结果与你想要的任何静态值进行比较,并使用该过滤器来决定是否保留你正在采集的数据包。
你还可以使用逻辑运算符将许多条件组合在一起。&& 表示逻辑与,|| 表示逻辑或,! 表示逻辑非。通过这套简单的保留关键字,我们能够组合出一些非常复杂的过滤器,以确定是否保留特定流量,或者在已捕获的数据中显示它。

地址与子网过滤

关于BPF的另一点是,地址可以使用主机名或IP地址进行过滤。在查看内容时,你也可以使用子网。例如,你可以指定类似 src host 192.168.1.1 或 dst net 10.0.0.0/24 的条件。
BPF 语句示例
以下是一些BPF语句的示例:
host alibaba.com and port ftp or ftp-data- 这个语句的含义是:如果解析源或目的IP地址得到
alibaba.com,则返回真。并且,如果查找端口号,端口号是FTP(端口21)或FTP数据(端口20)中的任何一个,则也返回真。如果这两部分(主机名和端口名)都返回真,则记录将被捕获。
- 这个语句的含义是:如果解析源或目的IP地址得到
- 如果我们想查找ICMP记录,这里列出了两种方法:
ip[9] == 1:这意味着它确实是IP数据报,并且是ICMP流量。- 或者,我们可以直接说
icmp,它会自动转换为适当的形式。

总结 📝
本节课中我们一起学习了安全区域级别的数据采集。总结来说,在安全区域收集流量与在路由器收集流量有根本性的不同。我们对单个主机及其本地流量有更多的了解,并且可以监听到与路由器层面不同的内容,例如本地流量。

在安全区域层面,有许多成熟的免费工具可用,例如 tcpdump 和 Wireshark,当然还有其他一些工具,这只是本课程中我们偏好的两个。BPF为我们提供了一种灵活的方法,可以在这两种工具中过滤流量。
047:路由器流量采集工具 🛠️


在本节课中,我们将学习路由器级别的数据采集工具。我们将解释路由器级数据采集的目的与局限,理解流记录(Flow Record)的构成与含义,并描述Silk工具套件及其使用方法。
概述

上一节我们讨论了数据采集的视点问题。本节中,我们来看看在路由器层面进行数据采集的策略与工具。

正如在2.7节中提到的,数据采集的视点决定了采集策略。如果你位于网络分区(Enclave)内部,你可以访问本地流量,监控的主机数量较少。如果你处于路由器层面,例如作为互联网服务提供商(ISP),你将无法访问分区内部的本地流量,但会看到经过该路由器的所有流量,因此流量总量会大得多。

考虑这个示意图。在一个拥有多个路由器的大型网络中,有三个主机。假设网络分区的所有者不允许我们在其分区内采集流量。这比想象中更常见。例如,你不会允许黑客在你的家庭网络中采集流量,大多数企业也不希望如此。
因此,与其试图从分区获取流量,我们可以对路由器进行配置。路由器非常适合这项任务,它们能看到所有经过的流量。唯一的问题是,路由器无法复制它们看到的每一个比特的流量,这任务过于繁重,也不是其主要功能。路由器的首要功能是路由流量,而非报告流量。流量实在太多,无法全部复制。
所以,路由器转而使用摘要信息。流(Flow)是一种常用的流量摘要。从一个分区到另一个分区的流量摘要结果看起来是这样的:一台主机通过一个路由器通信,再经过另外两个路由器,到达另一个分区中的主机。这对于检测分区间的通信非常有效。然而,对于分区内部的通信,我们则完全无法看到。
除了这个缺点,你的采集配置还可能提供冗余的流信息。例如,如果我们对数据包经过的所有三个路由器都进行配置,它们都会看到相同的东西。如果我们没有制定策略来限制输出或建立更好的感知策略,就可能报告冗余数据。理解你的实际基础设施是避免这种错误的关键。

流记录详解
上一节我们提到了流作为摘要。本节中,我们将具体关注NetFlow。

NetFlow是共享一个共同五元组的数据包的单向摘要。这个五元组是:源地址、目的地址、源端口、目的端口、协议。所有共享这五个要素的数据包将被归为一组。
路由器开始构建一个记录,将具有相同五元组的数据包分组。它统计字节数、数据包数、记录首次看到该流的时间以及会话的持续时间。在NetFlow中,特别是使用Silk时,我们还会存储观察到的所有TCP标志位。
例如,如果你看到TCP三次握手,并且会话仍在进行,标志位字段将包含S(SYN)和A(ACK)。Silk会尝试遵循协议语义,如果我们看到RST(重置)或FIN(结束)标志,就会开始结束会话。
此外,我们还会对持续时间过长的会话进行超时处理。主要有两种超时:
- TCP超时:如果在设定时间内没有看到任何数据包,就假设连接已死,写出完整的记录。
- 长时间会话超时:如果某个会话持续了极长时间,我们会关闭当前记录并写出,然后当下一个数据包到达时,再开启一个新的记录。
这样做的原因是,例如一个SSH会话可能持续数周,我们不想等到会话结束才获得任何信息。超时机制保证了我们能在不久的将来获得部分数据。
流记录示例与局限

现在,我们来看一个NetFlow输出的例子。


这里展示的是管道符分隔的TCP会话输出。需要指出的是,每个方向都有自己独立的记录。NetFlow是单向的。因此,要了解一个完整的会话,你至少需要处理两条记录:一条是客户端到服务器的通信,另一条是服务器到客户端的通信。
这是一种非常有效的方式,可以查明谁在什么时间、通过什么端口、与谁通信了多久,传输了多少数据。
然而,它也存在一些问题:
- 没有有效载荷:在路由器层面处理海量流量,无法像在分区内部那样保留数据包的有效载荷内容。
- 对行为的近似:流是对TCP/UDP/ICMP等协议行为的近似汇总,并非完全精确。
- ICMP处理:对于ICMP流量,其类型和代码信息是通过重载目的端口字段来编码的。高比特位表示类型,低比特位表示代码(或相反,具体见文档)。
- 时间粒度较粗:只能获得会话开始和结束的时间,没有数据包间到达时间的精细信息。
Silk工具套件介绍
如前所述,本课程将主要使用Silk进行流分析。


Silk是一个用于分析流数据的相对复杂的工具套件。其重要之处在于,它既是采集工具也是分析工具套件。它收集数据并将其组织到自己的存储库中,然后你可以通过一组Silk工具访问该存储库。

以下是该套件中的一些核心工具:

rwfilter:选择和过滤工具。它允许你从存储库中选择记录,并根据特定特征进行过滤。rwcut:转换工具。它读取Silk格式的文件,并输出ASCII文本(就像前面NetFlow示例中展示的那样)。rwcount:汇总工具。它主要用于生成时间序列数据,可以按任意时间范围对数据进行分箱,并统计该时间段内的字节数、数据包数和流数。结果可以轻松导入Excel。rwuniq:聚合工具。它允许你将任意字段组合在一起进行聚合。例如,你可以按源IP和目的IP地址聚合,查看从特定IP到另一个IP传输了多少字节、数据包或流。
在所有这些工具中,rwfilter是最重要的。它不仅用于过滤数据,还是你访问已采集数据存储库的入口点。可以说,几乎所有使用Silk的分析,都将从运行rwfilter命令开始。
IP集(IP Set)工具


关于这些工具,还有一个非常重要的方面,即IP集(IP Set)工具,初学者常常会忽略。


IP集是IP地址的任意集合。有三个工具用于操作它们:
rwset:从Silk文件构建集合文件。rwsetbuild:从ASCII文件构建集合文件。rwsetcat:查看集合文件的内容。
IP集的用处在于,你可以用它来过滤一组不一定连续(不仅仅是CIDR块)的特定地址。一个很好的用例是:假设我们过滤后发现了一组可能被感染的主机,我可以自动将这些IP放入一个集合文件中。之后,我就可以像过滤单个IP地址一样,轻松地过滤出所有这些主机的流量。IP集使用紧凑的二进制格式表示,处理效率很高。
总结
本节课中,我们一起学习了路由器级别的数据采集。

- 路由器级采集提供了网络分区之间传输流量的摘要信息。
- 我们深入了解了NetFlow流记录的构成,它基于五元组(源/目的地址、源/目的端口、协议)对流量进行单向摘要,并包含字节数、数据包数、起止时间等信息。
- 我们介绍了Silk工具套件,它是一个功能强大的流数据采集与分析系统。我们认识了几个核心工具:
rwfilter(过滤)、rwcut(转换)、rwcount(时间序列汇总)、rwuniq(字段聚合),以及管理IP地址集合的rwset系列工具。

路由器级采集虽然无法看到分区内部细节,但在监控大规模网络流量、分析分区间通信模式方面是不可或缺的工具。
048:专业方向与课程概览 🎯

在本节课中,我们将学习约翰霍普金斯大学《信息保障分析》课程的专业方向、课程结构以及你将掌握的核心知识与技能。
大家好,我是杰森·克罗斯兰。我是约翰霍普金斯大学应用物理实验室的一名高级网络安全工程师。我在JHU怀廷工程学院的副修学位项目下任教,同时也是一名军官。我拥有超过20年的军事委任和文职经验,涉及信息保障、任务系统、技术、网络安全工程、威胁检测和道德黑客等领域。
我开发了信息保障分析课程,该课程在Coursera平台上被分解为多个专业方向。每个专业方向包含若干模块,通过讲座、阅读材料、视频、作业和讨论来呈现信息保障分析的主题。你可以学习所有专业方向,也可以选择信息保障分析中你希望深入了解的特定领域。
课程目标与核心内容
信息保障分析Coursera课程旨在探索、识别和描述适当的情境与场景,在这些情境中应用信息保障分析原则,以提高态势感知、识别、检测、预防和响应能力,并通过收集数据和应用解决方案来实施保护措施,从而增强操作系统的防御策略。
你将通过使用在案例研究、日志数据和用户数据文件中获得的理论知识,以及完成作业和观看视频,来学习分析活动。
课程将教授构建有效信息保障计划的基本组成部分。你还将理解并认识到有效的IA原则如何为政策制定、标准操作程序、取证研究、数据分析科学、事件响应和处理程序提供信息。
你将学习的分析方法
以下是课程将涵盖的各种分析技术:
- 收集方法
- 评估方法
- 总体估计
- 假设检验
- 实验评估
此外,你还将为取证分析开发证据链。
课程涵盖主题
课程主题包括但不限于以下内容:
- 恶意软件
- 防病毒与漏洞原理
- 物联网
- 人工智能
- 移动应用安全
- 寻址与端口网关协议
- 查找与匿名化
- 分布式控制系统
- 通用研究记录类型
- DNS、HTTP、SNTP和TCP协议分析
课程将进一步探讨IT和OT协议的弱点及其应对措施,包括但不限于:
- WiFi
- Zigbee
- EMV
- Sigfox
- Z-Wave
- Modbus
- DNP3
- Hart
- BACnet
- ICCP
- OPC
教学理念与期望
我的目标是使学习过程变得有趣、愉快且引人入胜,将复杂的物理概念转化为易于理解和应用的可管理学习模块。
我希望学生们能够利用信息保障分析Coursera平台课程中提供的理论思想和知识,通过讲座、阅读、作业和讨论,然后将所学应用到他们的职业生涯中。
我很高兴大家对这门课程感兴趣。感谢你们的关注,并希望每个人都能享受Coursera平台上的信息保障分析课程。祝大家度过美好的一天,感谢你们选择在Coursera平台上学习这门课程。
本节课中,我们一起学习了《信息保障分析》课程的整体框架、核心学习目标、涵盖的关键技术主题以及多样的分析方法。课程旨在将理论与实践结合,帮助你建立有效的信息保障体系知识,并应用于实际的专业场景中。

浙公网安备 33010602011771号