730 likes | 872 Views
第三章 网络安全威胁. 1 TCPIP 经典威胁. 1.1 ARP 欺骗 1.2 RIP 源 路由欺骗 1.3 TCP 欺骗 1.4 WEB 欺骗. ARP 欺骗. 防范措施: 可利用一些工具(如 ARPWatch )来监视局域网内所有的 MAC 地址和 IP 地址的映射对,一旦有改变,将产生告警或日志。. IP 源 路由欺骗. IP 报文首部的可选项中有 “ 源站选路 ” , 可以指定到达目的站点的路由。正常情况下 , 目的主机如果有应答或其他信息返回源站 , 就可以直接将该路由反向运用作为应答的回复路径。. 条件
E N D
1 TCPIP经典威胁 1.1 ARP欺骗 1.2 RIP源路由欺骗 1.3 TCP欺骗 1.4 WEB欺骗
ARP欺骗 防范措施: 可利用一些工具(如ARPWatch)来监视局域网内所有的MAC地址和IP地址的映射对,一旦有改变,将产生告警或日志。
IP源路由欺骗 IP报文首部的可选项中有“源站选路”,可以指定到达目的站点的路由。正常情况下,目的主机如果有应答或其他信息返回源站,就可以直接将该路由反向运用作为应答的回复路径。
条件 主机A(假设IP地址是192.168.100.11)是主机B的被信任主机 主机X想冒充主机A从主机B(假设IP为192.168.100.1)获得某些服务 攻击过程 攻击者修改距离X最近的路由器G2,使得到达此路由器且包含目的地址192.168.100.1的数据包以主机X所在的网络为目的地 攻击者X利用IP欺骗(把数据包的源地址改为192.168.100.11)向主机B发送带有源路由选项(指定最近的路由器G2)的数据包。当B回送数据包时,按收到数据包的源路由选项反转使用源路由,就传送到被更改过的路由器G2。由于G2路由表已被修改,收到B的数据包时,G2根据路由表把数据包发送到X所在网络,X可在其局域网内较方便的进行侦听,收取此数据包。
TCP欺骗 基本流程: 步骤一,攻击者X要确定目标主机A的被信任主机B不在工作状态,若其在工作状态,也可使用SYN flooding等攻击手段使其处于拒绝服务状态。 步骤二,攻击者X伪造数据包:B -> A : SYN(ISN C),源IP地址使用B,初始序列号ISN为C,给目标主机发送TCP的SYN包请求建立连接。 步骤三,目标主机回应数据包:A -> B : SYN(ISN S) , ACK(ISN C),初始序列号为S,确认序号为C。由于B处于拒绝服务状态,不会发出响应包。攻击者X使用嗅探器捕获TCP报文段,得到初始序列号S。 步骤四,攻击者X伪造数据包:B ->A : ACK(ISN S),完成三次握手建立TCP连接。 步骤五,攻击者X一直使用B的IP地址与A进行通信。
盲攻击与非盲攻击: 非盲攻击:攻击者和被欺骗的目的主机在同一个网络上,攻击者可以简单地使用协议分析器(嗅探器)捕获TCP报文段,从而获得需要的序列号。见上述流程。 盲攻击:由于攻击者和被欺骗的目标主机不在同一个网络上,攻击者无法使用嗅探器捕获TCP报文段。其攻击步骤与非盲攻击几乎相同,只不过在步骤三无法使用嗅探器,可以使用TCP初始序列号预测技术得到初始序列号。在步骤五,攻击者X可以发送第一个数据包,但收不到A的响应包,较难实现交互。
Unicode输入验证攻击 Unicode:统一的字符编码标准,采用双字节对字符进行编码。 当微软IIS 4.0/5.0(远东地区版本)在处理包含有不完整的双字节编码字符的HTTP命令请求时,会导致Web目录下的文件内容被泄漏给远程攻击者。 利用这种IIS的漏洞,攻击者就可以通过这些特殊字符绕过IIS的目录审计远程执行任意命令。
一般实例: http://server/scripts/..%c1%1c../winnt/system32/cmd.exe?/c+dir+c:\ http://server/index.asp/..%c1%1c../..%c1%1c../winnt/win.ini 注意:以上“+”代表空格。
黑网页实例 C:>idahack <Host> <HostPort> <HostType> <ShellPort> C:>nc <Host> <ShellPort> 进入网页所在目录 C:>echo 内容 > 网页文件名
2 典型系统安全威胁 2.1 缓冲区溢出概述 2.2 缓冲区溢出原理 2.3 缓冲区溢出防范
2.1 SQL注入攻击 问题简介 用用户的输入创建一个动态的SQL请求有可能让攻击者控制SQL语句的意思。
Example 1:下面的C# 代码动态的创建SQL语句查询属于当前使用者的物品的名称。 ... string userName = ctx.getAuthenticatedUserName(); string query = "SELECT * FROM items WHERE owner = '" + userName + "' AND itemname = '" + ItemName.Text + "'"; sda = new SqlDataAdapter(query, conn); DataTable dt = new DataTable(); sda.Fill(dt); ...
查询语句预期被写为 SELECT * FROM items WHERE owner = AND itemname = ; 但是如果攻击者输入"name' OR 'a'='a" ,SQL语句就会变成 SELECT * FROM items WHERE owner = 'wiley' AND itemname = 'name' OR 'a'='a'; 于是可以简化成 SELECT * FROM items; 这样攻击者就可以查询到不属于当前用户下的items 了,而是查询到所有用户的items 。
Example 2:如果用户输入 "name'; DELETE FROM items; --" SQL语句变为: SELECT * FROM items WHERE owner = 'hacker' AND itemname = 'name'; DELETE FROM items; --'
2.2 缓冲区溢出 非常普遍、非常危险 后果: 程序运行失败 系统关机、重新启动 执行非授权指令,取得系统特权 概括:对可用性、完整性和机密性的攻击 渊源: Morris Worm 1988 针对fingerd CERT/CC(计算机紧急事件响应组/协调中心) Computer Emergency Response Team/Coordination Center
缓冲区溢出原理 缓冲区溢出的根本原因来自C语言(以及其后代C++)本质的不安全性: ·没有边界来检查数组和指针的引用; ·标准C 库中还存在许多非安全字符串操作,如strcpy() 、sprintf() 、gets() 等。 为了说明这个问题还必须看一看程序的内存映像。 任何一个源程序通常都包括代码段和数据段,这些代码和数据本身都是静态的。为了运行程序,首先要由操作系统负责为其创建进程,并在进程的虚拟地址空间中为其代码段和数据段建立映射。但是,光有静态的代码段和数据段是不够的,进程在运行过程中还要有其动态环境。一般说来,默认的动态存储环境通过堆栈(简称栈)机制建立。所有局部变量以及所有按值传递的函数参数都通过堆栈机制自动地进行内存空间的分配。分配同一数据类型相邻块的内存区域称为缓冲区。图2.6为Linux下进程的地址空间布局。当然,C语言还允许程序员使用堆机制创建存储器,存储使用malloc()获得的数据。不过,这与本节讨论的问题无关。
从逻辑上讲进程的堆栈是由多个堆栈帧构成的,其中每个堆栈帧都对应一个函数调用。当函数调用发生时,新的堆栈帧被压入堆栈;当函数返回时,相应的堆栈帧从堆栈中弹出。尽管堆栈帧结构的引入为在高级语言中实现函数或过程这样的概念提供了直接的硬件支持,但是由于将函数返回地址这样的重要数据保存在程序员可见的堆栈中。当程序写入超过缓冲区的边界时,这就是所谓的“缓冲区溢出”。发生缓冲区溢出时,就会覆盖下一个相邻的内存块,导致一些不可预料的结果:也许程序可以继续,也许程序的执行出现奇怪现象,也许程序完全失败。从逻辑上讲进程的堆栈是由多个堆栈帧构成的,其中每个堆栈帧都对应一个函数调用。当函数调用发生时,新的堆栈帧被压入堆栈;当函数返回时,相应的堆栈帧从堆栈中弹出。尽管堆栈帧结构的引入为在高级语言中实现函数或过程这样的概念提供了直接的硬件支持,但是由于将函数返回地址这样的重要数据保存在程序员可见的堆栈中。当程序写入超过缓冲区的边界时,这就是所谓的“缓冲区溢出”。发生缓冲区溢出时,就会覆盖下一个相邻的内存块,导致一些不可预料的结果:也许程序可以继续,也许程序的执行出现奇怪现象,也许程序完全失败。
下面的程序是一个缓冲溢出的实例。 例2.3.1 #include <stdio.h> int main(){ char name[5]; printf(“Please input your name:”); gets(name); printf(“you are %s”,name); } 运行这个程序可以发现,当输入的字符数少时,程序运行正常;当输入的字符数太多时(超过8),程序就不能正常结束。这就是缓冲区溢出所造成。
典型的堆栈帧结构如图2.7所示。堆栈中存放的是与每个函数对应的堆栈帧。当函数调用发生时,新的堆栈帧被压入堆栈;当函数返回时,相应的堆栈帧从堆栈中弹出。典型的堆栈帧结构如图2.7所示。堆栈中存放的是与每个函数对应的堆栈帧。当函数调用发生时,新的堆栈帧被压入堆栈;当函数返回时,相应的堆栈帧从堆栈中弹出。 图2.7 典型的堆栈帧结构
堆栈帧的顶部为函数的实参,下面是函数的返回地址以及前一个堆栈帧的指针,最下面是分配给函数的局部变量使用的空间。一个堆栈帧通常都有两个指针,其中一个称为堆栈帧指针,另一个称为栈顶指针。前者所指向的位置是固定的,而后者所指向的位置在函数的运行过程中可变。因此,在函数中访问实参和局部变量时都是以堆栈帧指针为基址,再加上一个偏移。由图2.7可知,实参的偏移为正,局部变量的偏移为负。当发生数据栈溢出时,多余的内容就会越过栈底,覆盖栈底后面的内容。通常,与栈底相邻的内存空间中存放着程序返回地址。因此,数据栈的溢出,会覆盖程序的返回地址,从而造成如下局面:要么程序会取到一个错误地址,要么将因程序无权访问该地址而产生一个错误。堆栈帧的顶部为函数的实参,下面是函数的返回地址以及前一个堆栈帧的指针,最下面是分配给函数的局部变量使用的空间。一个堆栈帧通常都有两个指针,其中一个称为堆栈帧指针,另一个称为栈顶指针。前者所指向的位置是固定的,而后者所指向的位置在函数的运行过程中可变。因此,在函数中访问实参和局部变量时都是以堆栈帧指针为基址,再加上一个偏移。由图2.7可知,实参的偏移为正,局部变量的偏移为负。当发生数据栈溢出时,多余的内容就会越过栈底,覆盖栈底后面的内容。通常,与栈底相邻的内存空间中存放着程序返回地址。因此,数据栈的溢出,会覆盖程序的返回地址,从而造成如下局面:要么程序会取到一个错误地址,要么将因程序无权访问该地址而产生一个错误。 鉴此,C语言把这一艰巨任务交给了开发人员,要求他们进行边界检查,编写安全的程序。然而这一要求往往被人们忽视,从而给黑客有机可乘。
缓冲区溢出防范 (1)安装安全补丁。 (2)编写安全的代码:缓冲区溢出攻击的根源在于编写程序的机制。因此,防范缓冲区溢出漏洞首先应该确保在Linux系统上运行的程序(包括系统软件和应用软件)代码的正确性,避免程序中有不检查变量、缓冲区大小及边界等情况存在。比如,使用grep工具搜索源代码中容易产生漏洞的库调用,检测变量的大小、数组的边界、对指针变量进行保护,以及使用具有边界、大小检测功能的C编译器等。
(3)基于一定的安全策略设置系统:攻击者攻击某一个Linux系统,必须事先通过某些途径对要攻击的系统做必要的了解,如版本信息等,然后再利用系统的某些设置直接或间接地获取控制权。因此,防范缓冲区溢出攻击就要对系统设置实施有效的安全策略。这些策略种类很多,下面只列举几个典型措施。(3)基于一定的安全策略设置系统:攻击者攻击某一个Linux系统,必须事先通过某些途径对要攻击的系统做必要的了解,如版本信息等,然后再利用系统的某些设置直接或间接地获取控制权。因此,防范缓冲区溢出攻击就要对系统设置实施有效的安全策略。这些策略种类很多,下面只列举几个典型措施。 ·在装有Telnet服务的情况下,通过手工改写“/etc/inetd.conf”文件中的Telnet设置,使得远程登录的用户无法看到系统的提示信息。具体方法是将Telnet设置改写为: telnet stream tcp nowait root /usr/sbin/tcpd/in.telnetd -h末尾加上“-h”参数可以让守护进程不显示任何系统信息,只显示登录提示。 · 改写“rc.local”文件。默认情况下,当登录Linux系统时系统运行rc.local文件,显示该Linux发行版本的名字、版本号、内核版本和服务器名称等信息,这使得大量系统信息被泄露。将“rc.local”文件中显示这些信息的代码注释掉,可以使系统不显示这些信息。
一种方法是在显示这些信息的代码行前加“#”:一种方法是在显示这些信息的代码行前加“#”: …# echo "">/etc/issue # echo "$R">>/etc/issue # echo "Kernel $ (uname -r)on $a $(uname -m)">>/etc/issue # # echo >>/etc/issue…另一种方法是将保存有系统信息的文件/etc/issue.net和issue删除。这两个文件分别用于在远程登录和本地登录时向用户提供相关信息。删除这两个文件的同时,仍需要完成方法一中的注释工作,否则,系统在启动时将会自动重新生成这两个文件。 ·禁止提供finger服务。使用finger命令可以显示本地或远程系统中目前已登录用户的详细信息。禁止提供finger服务的有效方法是,通过修改该文件属性、权限,使得只有root用户才可以执行该命令。 · 处理“inetd.conf”文件。该程序通过“/etc/inetd.conf”文件获得inetd在监听哪些网络端口,为每个端口启动哪些特定服务等信息,会泄露大量的敏感信息。
(4)保护堆栈 ·加入函数建立和销毁代码。前者在函数返回地址后增加一些附加字节,返回时要检查这些字节有无被改动。 · 使堆栈不可执行——非执行缓冲区技术,使入侵者无法利用缓冲区溢出漏洞。
3 计算机木马 3.1计算机木马概述 3.2 计算机木马原理 3.3 计算机木马防御 3.4 流行木马简介
3.1 计算机木马概述 木马( Trojan horse )是一种基于远程控制的黑客工具,具有:隐蔽性、潜伏性、危害性、非授权性。 木马与病毒、远程控制的区别 病毒程序是以自发性的败坏为目的 木马程序是依照黑客的命令来运作,主要目的是偷取文件、机密数据、个人隐私等行为。 隐蔽、非授权性
木马的发展(1) • 第一代一般主要表现木马的欺骗性,比如在Unix系统上表现的是假Login诱骗、假su诱骗,在Windows上则是BO,Netspy等木马; • 第二代木马,在隐藏、自启动和操纵服务器等技术上有了很大的发展,比如冰河、广外女生等;
木马的发展(2) • 第三代木马在隐藏、自启动和数据传递技术上则有了根本性的进步,以前的木马主要靠UDP协议传输数据,但在第三代木马中出现了靠ICMP协议传递数据; • 第四代木马在进程隐藏方面,则做了更大的改动——采用改写和替换系统文件的做法,修改操作系统内核,在UNIX内它伪装成系统守护进程,而在WINDOWS内它则伪装成DLL动态连接库,这样一来使木马几乎和操作系统结合在一起,从而使现有的杀毒软件几乎无能为力,极好地达到了隐藏的目的
木马的发展(3) • 发展趋势 • 跨平台性 • 模块化设计 • 能够自我复制 • 即时通知
发现木马的方法 系统的异常情况 打开文件,没有任何反应 查看打开的端口 检查注册表 查看进程
木马实施攻击的步骤 1.配置木马 木马伪装: 信息反馈: 2.传播木马 3.启动木马 4.建立连接 5.远程控制
3.2 计算机木马原理 实际就是一个C/S模式的程序(里应外合) 被植入木马的PC(server程序) 端口 操作系统 TCP/IP协议 TCP/IP协议 操作系统 端口 被植入木马的PC(client程序) 端口处于监听状态 控制端
木马文件的隐藏与伪装 (1)文件的位置 (2)文件的属性 (3)捆绑到其他文件上 (4)文件的名字 (5)文件的的扩展名 (6)文件的图标
木马运行中的隐藏与伪装 (1)在任务栏里隐藏 (2)在任务管理器里隐藏 (3)隐藏端口
木马启动方式 win.ini system.ini 启动组 注册表 捆绑方式启动 : 伪装在普通文件中 设置在超级连接中
木马传播方式(主动与被动): 主动植入 通过E-mail 文件下载 浏览网页
3.3 计算机木马防御 发现木马:检查系统文件、注册表、端口 不要轻易使用来历不明的软件 不熟悉的E-MAIL不打开 常用杀毒软件并及时升级 查在安装新的软件之前,请先备份注册表在安装完软件以后,立即用杀毒软件查杀Windows文件夹和所安装的软件的所在文件夹。如果杀毒软件报告有病毒,这时请将它杀掉,杀毒完成后,重新启动计算机
3.4 流行木马简介 冰河 back orifice Subseven 网络公牛(Netbull) 网络神偷(Nethief) 广外女生 Netspy(网络精灵) (见脱机资料)
4 拒绝服务攻击 4.1 拒绝服务攻击实例 4.2 分布式拒绝服务攻击 4.3 一次DDoS攻击过程 4.4 计算机蠕虫
4.1 拒绝服务攻击实例 Ping of Death Jolt2 Land
Ping of Death 原理: 攻击者:发送长度超过65535的ICMP Echo Request的碎片分组, 目标机:重组分片时会造成事先分配的65535字节缓冲区溢出,导致TCP/IP堆栈崩溃 防御: Win98之后的系统都能够应对超大尺寸的包 配置防火墙阻断ICMP以及任何未知协议分组
Jolt2 原理:发送大量相同的碎片化IP分组 分片标志位MF被置为0 偏移量为65520 IP分组大小为29字节 IPID为1109(IDS检测特征 ) 防御: Windows系统必须安装最新的补丁 在网络边界上禁止碎片包通过,或者限制其包速率 必须确保防火墙重组碎片的算法没有问题 计算总长度: 20+65520+9 = 65549 > 65535
Land 原理:发送一个特别定制的SYN分组 源地址和目的地址都设为目标机地址 源端口号和目的端口号相同 防御: 为操作系统安装最新的补丁 配置防火墙,过滤从外部接口进入的、含有内部源地址的分组
SYN Flooding 原理:TCP连接的三次握手和半开连接 攻击者:发送大量伪造的TCP连接请求 方法1:伪装成当时不在线的IP地址发动攻击 方法2:在主机或路由器上阻截目标机的SYN/ACK分组 目标机:堆栈溢出崩溃或无法处理正常请求 防御: 缩短SYN Timeout时间 (设置为20秒以下 ) 设置SYN Cookie 缺陷:依赖于对方使用真实的IP地址 设置路由器和防火墙,在给定的时间内只允许数量有限的半开TCP连接发往主机 给每一个请求连接的IP地址分配一个Cookie,如果短时间内连续收到某IP的重复SYN报文,就认定受到了攻击,从此IP地址来的后继包被丢弃。
客户端 客户端 服务器端 服务器端 SYN ACK SYN SYN/ACK SYN/ACK SYN/ACK SYN Flooding 之 TCP三次握手 正常过程 半开连接 SYN Timeout
. . . . . . . . . SYN SYN SYN SYN SYN/ACK SYN/ACK SYN/ACK SYN/ACK SYN/ACK SYN/ACK SYN/ACK SYN/ACK . . . . . . . . 目标主机 攻击者 1 等待应答SYN/ACK n
4.2 分布式拒绝服务攻击 分布式拒绝服务(Distributed Denial of Service,DDoS)攻击指借助于客户/服务器技术,将多个计算机联合起来作为攻击平台,对一个或多个目标发动DoS攻击,从而成倍地提高拒绝服务攻击的威力。通常,攻击者使用一个偷窃帐号将DDoS主控程序安装在一个计算机上,在一个设定的时间主控程序将与大量代理程序通讯,代理程序已经被安装在Internet上的许多计算机上。代理程序收到指令时就发动攻击。利用C/S技术,主控程序能在几秒钟内激活成百上千次代理程序的运行。
Smurf 一个将目的地址设置成广播地址(以太网地址为FF:FF:FF:FF:FF:FF:FF)后的数据包,将会被网络中所有主机接收并处理。显然,如果攻击者假冒目标主机的地址发出广播信息,则所有主机都会向目标主机回复一个应答使目标主机淹没在大量信息中,无法提供新的服务。这两个攻击就是利用广播地址的这一特点将攻击放大而实施的拒绝服务攻击。其中,Smurf是用广播地址发送ICMP ECHO包,而Fraggle是用广播地址发送UDP包。
显然,smurf为了能工作,必须要找到攻击平台,这个平台就是:其路由器上启动了IP广播功能——允许smurf 发送一个伪造的ping信息包,然后将它传播到整个计算机网络中。另一方面,为防止系统成为smurf攻击的平台,要将所有路由器上IP的广播功能都禁止(一般来讲,IP广播功能并不需要)。但是,攻击者若从LAN内部发动一个smurf攻击,在这种情况下,禁止路由器上的IP 广播功能就没有用了。为了避免这样一个攻击,许多操作系统都提供了相应设置,防止计算机对IP广播请求做出响应。 挫败一个smurf 攻击的最简单方法就是,对边界路由器的回音应答(echo reply)信息包进行过滤,然后丢弃它们,使网络避免被淹没。