网络攻防技术
拒绝服务攻击(DoS)
拒绝服务攻击(Denial of Service, DoS)在于对可用性(Availability)发起直接打击
其本质是通过恶意干涉,使得目标系统由于资源枯竭或逻辑崩溃,导致可用性降低或彻底丧失,从而剥夺合法用户获取不中断服务的权利。
- 定义:DoS是指任何导致系统崩溃、带宽耗尽或存储空间填满,使得其可用性降低或者失去可用性均称为拒绝服务。
DoS攻击通过人为制造极端供需失衡,主要演化为两种形式:带宽攻击与连通性攻击。前者侧重于通过海量垃圾流量充塞网络物理通道,而后者则针对操作系统在处理协议逻辑时的计算与存储上限。
| 特性 | 带宽攻击 (Bandwidth Attack) | 连通性攻击 (Connectivity Attack) |
|---|---|---|
| 触发机制 | 以极端通信量冲击网络节点 | 发送海量连接请求冲击主机 |
| 消耗资源 | 消耗所有可用网络传输带宽 | 消耗内核资源(如CPU、内存、连接表) |
| 对合法用户影响 | 合法请求因网络拥塞无法到达 | 系统忙于处理伪造请求,无法响应合法调用 |
典型 DoS/DDoS 攻击实例的技术拆解
深入理解网络层(IP/ICMP)与传输层(TCP)的协议缺陷是构建纵深防御体系的战略基石。
攻击者通过利用协议栈在数据包重组、握手状态维护等环节的逻辑漏洞,可以以极小的代价换取目标系统的瘫痪。
- Ping of Death(ICMP 攻击):
- 机理: 攻击者发送长度超过 65535 字节的 ICMP Echo Request 碎片。
- 影响: 目标机在重组 IP 碎片时,会导致事先分配的 65535 字节缓冲区溢出,触发 TCP/IP 堆栈崩溃。
- 防御: 现代系统已通过边界检查修复;防御策略应在防火墙端阻断非必要的 ICMP 及未知协议分组。
- Jolt2 碎片攻击(IDS 特征分析):
- 原理: 循环发送参数高度一致的碎片化 IP 分组。
- 关键参数: 分片标志 MF=0,偏移量 Offset=65520,分组大小 29 字节,其特有的 IPID=1109 是典型的 IDS 检测特征。
- 逻辑证明: 根据 IP 分片重组逻辑,计算它的总长度 =
20(IP固定头部) + 65520(偏移量) + 9(最后一片的实际数据大小) = 65549 字节。由于 65549 > 65535,会触发系统层逻辑溢出。
- Land 攻击:
- 评估: 攻击者构造源 IP/端口与目的 IP/端口完全一致的 SYN 分组。这使得目标机陷入“自己对自己发起连接”的无限逻辑死循环,迅速耗尽系统资源。
- 在防火墙上设置过滤规则,坚决丢弃“从外部接口进来的,但源地址却是内部地址”的数据包。
- SYN Flood(TCP 三次握手缺陷):
- 技术拆解: 利用 TCP “半开连接(Half-open connection)”机制。
- 攻击方法:
- 伪装法: 使用当前不在线的伪造 IP 发起连接。
- 阻截法: 在路由器端截获目标机回传的 SYN/ACK 分组。
- 过程描述: 攻击者发送 SYN,目标机返回 SYN/ACK 并将连接置于半开队列 ,目标机等待永远不会到达的 ACK , 目标机超时(SYN Timeout)并重发 SYN/ACK。
针对协议层攻击,核心防御措施包括:
- 时限优化: 将 SYN Timeout 缩短至 20 秒以下,加速释放半开连接占用的资源。
- SYN Cookie 技术: 为每个 SYN 请求分配加密 Cookie,仅在收到合法 ACK 后才分配连接资源。局限性: 强制要求攻击者使用真实 IP,无法对抗利用合法 IP 池的攻击。
- 连接数阈值: 限制单位时间内同一接口或地址允许的半开连接总数。
| 攻击名称 | 核心作案手法(它是怎么使坏的?) | 造成的致命后果 | 核心防御绝招(考试必写) |
|---|---|---|---|
| Ping of Death | 发送长度超过65535字节的超大 ICMP Echo 请求碎片分组。 | 目标机在重组分片时,缓冲区溢出,导致TCP/IP堆栈崩溃死机。 | 1. 升级系统补丁 2. 配置防火墙阻断未知协议或ICMP包。 |
| Jolt2 | 发送大量特制 IP 碎片:分片标志位MF=0,偏移量设为极大的65520。 | 重组计算总长度(20+65520+9=65549)超过65535极限,系统死锁。 | 1. 在网络边界禁止碎片包通过或限速 2. 确保防火墙碎片重组算法无漏洞。 |
| Land 攻击 | 伪造特殊的 SYN 请求包,把源IP和目的IP都写成目标机自己(连端口也一样)。 | 目标机自己向自己发送连接应答,建立死循环空连接,耗尽资源。 | 配置防火墙,过滤掉从外部接口进入、但源地址却是内部IP的分组。 |
| SYN Flood (最常考) |
利用TCP三次握手缺陷,伪造大量虚假IP发送 SYN 连接请求。 | 服务器傻等最后一次确认,产生大量“半开连接”,撑爆TCP队列,合法用户无法连入。 | 1. 缩短 SYN Timeout(超时时间) 2. 使用 SYN Cookie 技术 3. 限制半开连接数。 |
分布式拒绝服务(DDoS)
DDoS 攻击利用客户/服务器架构,通过主控端(Master)调度分布在全球的代理端(Agent/Zombie,俗称“肉鸡”)发起协同攻击。将多个计算机联合起来作为攻击平台,对一个或多个目标发动DoS 攻击,从而成倍地提高拒绝服务攻击的威力
- 四部分结构: 攻击者(幕后)、主控端(发布命令)、代理端(运行 Daemon 进程发起实际攻击)、攻击目标。
- 主控端和代理端分别用于控制和实际发起攻击
- 其中主控端只发布命令而不参与实际的攻击,代理端发出DDoS的实际攻击包。
- 攻击阶段分解:
- 安置阶段: 利用漏洞在海量物联网节点安置端口监督程序(Daemon)。
- 指令阶段: 攻击者向主控端下发激活指令,主控端可在指令发出后立即下线以实现身份隐藏。
- 执行阶段: 数百个代理端同时向目标发起伪装过的残缺数据包或连接请求,形成流量洪峰。、
TFN2K是一个DDoS工具,由客户端和守护程序两部分组成。
TFN2K 记住它最牛的三个特征:① 主控端和打手之间加密通讯;② 能发动 SYN、Ping、Smurf 等多种混合攻击;③ 进程名是随机的,很难被杀毒软件揪出来。
| 攻击名称 | 攻击派系 | 核心作案手法(怎么使坏?) | 主要消耗的目标资源 | ★ 考试必背题眼 / 关键特征 |
|---|---|---|---|---|
| SYN Flood | TCP机制类 | 发送海量伪造源IP的SYN报文,故意不完成最后一步确认。 | 系统的半开连接队列。 | 当前最常见的DDoS攻击;利用TCP三次握手缺陷。 |
| Connection Flood | TCP机制类 | 利用真实IP与服务器建立完整TCP连接,且长时间不释放。 | 服务器的残余连接数(使其处于WAIT状态)。 | 小流量冲击大带宽的典型;“占着茅坑不拉屎”。 |
| UDP Flood | UDP流量类 | 发送大量伪造源IP的小 UDP 数据包疯狂冲击目标。 | 网络带宽。 | 简单粗暴的流量型攻击;常针对流媒体视频或认证服务器。 |
| UDP DNS Query Flood | UDP流量类 | 向目标发送海量随机生成或根本不存在的假域名解析请求。 | DNS服务器的算力与解析能力。 | 每秒请求超限会导致正常的DNS解析超时瘫痪。 |
| HTTP Get 攻击 | 应用脚本类 | 建立正常TCP连接后,不断向存在ASP/PHP等脚本的程序提交查询调用。 | 后台数据库资源。 | 能绕过普通防火墙;致命缺点是会暴露黑客真实IP,且对静态网页效果不佳。 |
| ICMP Flood | 传统流量类 | 利用大流量的 ICMP 报文(如Ping包)给服务器带来极大负载。 | 服务器负载与带宽。 | 由于目前很多防火墙直接过滤ICMP报文,该攻击出场率已较低 |
“迄今为止人们还没有找到对DDoS攻击行之有效的(彻底)解决方法”。这是因为 DDoS 攻击大多利用了正常的网络协议(如 TCP、HTTP),防御方很难在海量流量中精准区分哪个是正常用户的请求,哪个是“肉鸡”发来的恶意请求。
防线一:主机系统的“强身健体”(防自身沦为肉鸡)
- 堵漏洞:及早发现漏洞,及时打补丁。
- 管权限:给管理员等特权账号设置强密码,防止被轻易爆破。
- 关服务:关闭不必要的网络服务(比如不用的端口直接封死),减少黑客的可乘之机。
防线二:网络边界的“设卡拦截”(控制流量进出)
- 部署防火墙:在系统边界加装防火墙,利用规则对所有出入的数据包进行严格过滤,限制异常包的进出。
- 网络与路由优化:合理设置路由器,优化对外提供服务的主机,对公开服务加以并发限制。
防线三:事中与事后的“监控报警”(异常行为感知)
- 引入 IDS(入侵检测系统):安装如 NIPC、NGREP 等入侵检测工具,经常扫描系统漏洞。
- 日志与文件监控:每天查看安全日志,对核心系统文件加密,并定期检查文件是否被黑客偷偷篡改。
系统漏洞与应用层攻击
软件实现层面的缺陷(如 C/C++ 的内存管理、SQL 拼接逻辑)是防御体系中最不稳定的变量。即便协议层安全,应用层的设计失误仍会导致核心业务资产泄露。
缓冲区溢出(Buffer Overflow)
- 根本原因: C/C++ 语言在处理数组和指针时缺乏强制边界检查。
- 最轻的是程序崩溃、系统死机;最致命的是黑客可以通过溢出,执行非授权的恶意指令,直接取得系统最高特权(Root权限)
- 防范策略
- 打补丁:最直接的方法,及时安装操作系统和软件的安全补丁
- 编写安全的代码:手动检查变量大小和数组边界,使用具有边界检测功能的 C 编译器
- 系统安全策略配置:要防止系统信息泄露
案例:Heartbleed(心脏滴血,CVE-2014-0160):
- 技术深度还原: 在处理 TLS Heartbeat 消息时,
memcpy()调用未对长度进行验证。 - 内存泄露逻辑: 攻击者控制了 HeartbeatMessage 结构中的 Payload Length。当 SSL3_RECORD 结构中的实际记录长度(Actual Record Length)未被验证时,服务器会根据攻击者伪造的超大 Payload 长度,从内存缓冲区中提取数据,导致每次泄露 64KB 敏感数据(如密钥、明文密码)。
- 修复手段极其简单,仅仅是在 OpenSSL 1.0.1g 版本中加了一行“边界检查”代码
SQL 注入(SQL Injection)
SQL 注入则是利用了“数据库分不清什么是数据、什么是命令”的应用层漏洞。
- 当网页后台把用户输入的内容(比如用户名),直接拼接到 SQL 查询语句中时,灾难就发生了。
- ★ 必考经典案例(or 'a'='a' ):
- 原本后台的查询逻辑是:
Select * from items where owner = '输入的用户名' and itemname = '输入的密码'。 - 黑客故意在用户名里输入:
wiley' and itemname = 'name' or 'a' = 'a。 拼接后,最后面多出了一个
or 'a'='a'。因为字母 a 永远等于 a(恒为真),这就导致整个查询条件瞬间全部成立,等价于 select * from items。黑客不需要知道密码,就直接绕过了验证,越权访问了整个数据库防御逻辑:
- 严格区分用户权限(最小特权原则):不要给普通用户分配建表、删表(
Drop Table)等高级权限 - 强迫使用参数化语句(★ 最核心防御):绝对不能把用户的输入“直接嵌入”到 SQL 语句中;而是通过参数传递拼接到SQL语句
- 严格验证用户输入(设卡过滤):坚决拒绝包含分号(**;**)、注释符、转义序列等容易引发注入的特殊符号
- 善用数据库自带的安全参数集合:SQL Server 提供的 Parameters 集合。它自带类型检查和长度验证功能
- 严格区分用户权限(最小特权原则):不要给普通用户分配建表、删表(
恶意软件
恶意软件就是专门为“恶意目的”而开发的软件
- 要么利用另一个程序的系统漏洞(比如之前讲过的缓冲区溢出),
- 要么利用用户的天真(比如伪装成正常文件诱骗点击),
- 最终目的是造成系统或文件的损坏,以及欺骗/窃取数据。
第一梯队:最爱混淆的“传统三剑客”(★ 必考辨析)
- 病毒(Virus):必须要有“宿主”。它像寄生虫一样感染正常的可执行文件,通常需要用户“主动去点击/运行”才会发作并感染其他文件。
- 蠕虫(Worm):能“自动”疯狂繁衍。它不需要宿主文件,也不需要用户干预,专钻网络的空子(漏洞)进行自我复制和主动传播,常常会导致网络严重拥塞。
- 木马(Trojan):靠“伪装和欺骗”。它把自己包装成极具诱惑力的正常软件(如游戏外挂、破解补丁),诱骗“天真的用户”下载安装。它一般不自我复制,但会在后台偷偷打开缺口,窃取密码。
第二梯队:DDoS 攻击的幕后黑手
- 机器人 / 僵尸电脑(Botnet / Zombie):这正好和我们前面学的 DDoS 攻击闭环了!黑客利用木马或蠕虫感染成千上万台普通用户的电脑,把它们变成“代理端(肉鸡)”。一旦主控端下达指令,这些僵尸电脑就会同时向目标发起洪泛攻击。
第三梯队:潜伏的刺客与间谍
- 逻辑炸弹(Logic Bomb):平时潜伏不动,只有当满足特定触发条件(比如到了某个特定的日期、或是公司开除了某个员工)时,才会瞬间引爆,执行破坏代码。
- 后门(Backdoor)与 Rootkit:黑客在攻破你的系统后,为了防止以后进不来,特意留下的“隐蔽通道”。Rootkit 更是高级,它能把自己深度隐藏在操作系统底层,连杀毒软件都查不出来。
- 间谍软件(Spyware)与 广告软件(Adware):这类通常不搞破坏,但非常烦人。它们潜伏在后台偷偷记录你的键盘输入(窃取账号),或者疯狂弹窗给你强行推送广告。