1、第 九 章 网络监听内容提纲2流量劫持流量劫持3数据采集数据采集4网络监听概述网络监听概述1网络监听工具网络监听工具5网络监听防御网络监听防御知识回顾 如何攻陷控制一台主机?网络侦察 网络扫描 口令攻击 缓冲区溢出攻击 木马 控制一台主控制一台主机后如何把战机后如何把战果扩大到该局果扩大到该局域网?域网?网络监听 网络监听(Network Listening):是指在计算机网络接口处截获网上计算机之间通信的数据,也称网络嗅探(Network Sniffing)。协助网络管理员监测网络传输数据,排除网络故障;被黑客利用来截获网络上的敏感信息,给网络安全带来极大危害。网络监听案例 网络监听在安全领
2、域引起普遍注意是在1994年。在该年2月,一个不知名的人在众多的主机和骨干网络设备上安装了网络监听软件,对美国骨干互联网和军方网窃取了超过10万个有效的用户名和口令。该事件是互联网上最早期的大规模网络监听事件,使网络监听从“地下”走向了公开,并迅速地在大众中普及开来。黑客用网络监听能干什么?嗅探敏感的帐号信息 Telnet会话的用户名和密码;HTTP应用程序的用户名和密码;FTP口令;电子邮件消息 截获网络上传输的文件 分析协议信息网络监听环境LANInternet 内网内网 外网外网 主机主机A 主机主机B 主机主机C 路由器路由器R 黑客黑客 监听点监听点 要实施网络监听,主要解决两个问题
3、:一是网络流量劫持,即使监听目标的网络流量经过攻击者控制的监听点(主机),主要通过各种地址欺骗或流量定向的方法来实现 二是在监听点上采集并分析网络数据,主要涉及网卡的工作原理、协议分析技术,如果通信流量加密了,则还需要进行解密处理。网络监听要解决的问题内容提纲2流量劫持流量劫持3数据采集数据采集4网络监听概述网络监听概述1网络监听工具网络监听工具5网络监听防御网络监听防御 攻击者要想监听目标的通信,首先要能够接收到目标的网络通信数据,如何做到呢?与网络环境有关。一般来说,网络环境可以划分为共享式网络环境和交换式网络环境两类。问题共享式网络监听的原理 广播特性的总线:主机发送的物理信号能被物理连
4、接在一起的所有主机接收到。网卡处于混杂模式:接收所有的数据帧。共享式网络监听:总线型以太网B向向 D发送数据发送数据 C D A E不接受不接受 不接受不接受 不接受不接受 接受接受 B只有只有 D 接受接受B 发送的数据发送的数据 广播特性的广播特性的总线:所有都能收到,但只总线:所有都能收到,但只有地址对了,才处理,从而实现有地址对了,才处理,从而实现了一对了一对一的通信一的通信共享网络监听:Hub一、交换式网络监听交换机的工作方式端口管理端口管理 端口端口1 端口端口2 缓存缓存 交换机交换机 以太网以太网 交换机交换机 1 2 MAC 端口端口 3 CAM存储转发实现了无碰存储转发实现
5、了无碰撞地传输数据撞地传输数据Content Addressable Memory,内容可寻址内容可寻址存储器存储器(一)交换网络监听:交换机+集线器交换机交换机 内网内网外网外网A:10.10.10.1B:10.10.10.2C:10.10.10.3路由器路由器R 10.10.10.8(二)交换网络监听:端口镜像1 2 3 4 5 6 端口镜像端口镜像(Port Mirroring):是把交换机一个或):是把交换机一个或多个端口的数据镜像到某个端口的方法。多个端口的数据镜像到某个端口的方法。管理员为了部署网络分析仪等管理员为了部署网络分析仪等设备,通过配置交换机端口镜设备,通过配置交换机端口
6、镜像功能来实现对网络的监听。像功能来实现对网络的监听。(三)交换网络监听:MAC洪泛 攻击思路:在局域网中发送带有欺骗性MAC地址源的数据;CAM表中将会填充伪造的MAC地址记录,随着记录增多,与CAM表相关的交换机内存将被耗尽,这时交换机以类似于集线器的模式工作,向其它所有的物理端口转发数据。CAM MAC地址地址 端口端口 MAC1 1 MAC2 2 MAC3 3 伪造伪造MAC 3 伪造伪造MAC 3 伪造伪造MAC 3 伪造伪造MAC 3 伪造伪造MAC 3 伪造伪造MAC 3 伪造伪造MAC 3 伪造伪造MAC 3 伪造伪造MAC 3 交换网络监听:MAC洪泛为什么为什么MAC洪泛攻
7、洪泛攻击会成功?难道交换击会成功?难道交换机不能根据自己的端机不能根据自己的端口数来固定口数来固定CAM表表的长度吗的长度吗?CAM MAC地址地址 端口端口 MAC1 1 MAC2 2 MAC3 3 伪造伪造MAC 3 伪造伪造MAC 3 伪造伪造MAC 3 伪造伪造MAC 3 伪造伪造MAC 3 伪造伪造MAC 3(三)交换网络监听:MAC洪泛 问题:网络速度明显降低;目前许多交换机具有MAC洪泛免疫功能。步骤步骤1:攻击者向主机:攻击者向主机A和和B发送发送ARP欺骗报文欺骗报文(四)交换网络监听:ARP欺骗交换机交换机 内网内网外网外网A:10.10.10.1B:10.10.10.2C
8、:10.10.10.3路由器路由器R:10.10.10.810.10.10.1的的MAC地址是地址是11:22:33:44:55:CC10.10.10.2的的MAC地址是地址是11:22:33:44:55:CC10.10.10.3 11:22:33:44:55:CC IP地址地址 MAC地址地址10.10.10.8 11:22:33:44:55:RR10.10.10.1 11:22:33:44:55:AA10.10.10.1 11:22:33:44:55:CC10.10.10.3 11:22:33:44:55:CC IP地址地址 MAC地址地址10.10.10.8 11:22:33:44:55
9、:RR10.10.10.2 11:22:33:44:55:BB10.10.10.2 11:22:33:44:55:CC(四)交换网络监听:ARP欺骗交换机交换机 内网内网外网外网A:10.10.10.1B:10.10.10.2C:10.10.10.3路由器路由器R:10.10.10.810.10.10.3 11:22:33:44:55:CC IP地址地址 MAC地址地址10.10.10.8 11:22:33:44:55:RR10.10.10.1 11:22:33:44:55:CC10.10.10.3 11:22:33:44:55:CC IP地址地址 MAC地址地址10.10.10.8 11:2
10、2:33:44:55:RR10.10.10.2 11:22:33:44:55:CC步骤步骤2:攻击者从网络接:攻击者从网络接口上嗅探受害主机发过来口上嗅探受害主机发过来的数据帧的数据帧(四)交换网络监听:ARP欺骗交换机交换机 内网内网外网外网A:10.10.10.1B:10.10.10.2C:10.10.10.3路由器路由器R:10.10.10.810.10.10.3 11:22:33:44:55:CC IP地址地址 MAC地址地址10.10.10.8 11:22:33:44:55:RR10.10.10.1 11:22:33:44:55:CC10.10.10.3 11:22:33:44:55
11、:CC IP地址地址 MAC地址地址10.10.10.8 11:22:33:44:55:RR10.10.10.2 11:22:33:44:55:CC步骤步骤3:攻击者将嗅探到:攻击者将嗅探到的数据发送回原本应该接的数据发送回原本应该接收的主机收的主机(四)交换网络监听:ARP欺骗需要监听的通信双方需要监听的通信双方主机不在一个局域网主机不在一个局域网内?内?需要监听主机与外界需要监听主机与外界网络之间的通信?网络之间的通信?(四)交换网络监听:ARP欺骗交换机交换机 内网内网外网外网A:10.10.10.1B:10.10.10.2C:10.10.10.3路由器路由器R:10.10.10.8 路
12、由器或网关是内路由器或网关是内网与外网之间报文网与外网之间报文转发的必经节点转发的必经节点写出使用写出使用ARPARP欺骗的方欺骗的方法监听局域网与外网之法监听局域网与外网之间通信的的详细步骤。间通信的的详细步骤。课后思考题:课后思考题:目标主机的IP为192.168.10.122,它的网关IP地址为192.168.10.1,网关MAC地址为00-e8-4c-68-17-8b网关欺骗ARP攻击主机的IP地址为192.168.10.148,MAC地址为00-0c-29-6c-22-04,在运行攻击程序arpspoof.py之前,还需要开启对网关和目标IP地址的流量转发功能,在终端输入“echo
13、1 /proc/sys/net/ipv4/ip_forward”命令,然后运行上述攻击程序(需要root权限)后即可发起对目标主机的ARP欺骗攻击网关欺骗ARP 攻击主机发起ARP攻击后,目标主机的网关MAC地址已经被修改成攻击主机的MAC地址,目标主机的流量被攻击主机成功劫持网关欺骗ARP 从图中可以看出,目标主机访问了115.239.210.52()网站的web服务网关欺骗ARP 攻击停止后,目标主机的网关MAC地址恢复正常网关欺骗ARP(五)交换网络监听:端口盗用交换机交换机 内网内网外网外网A:10.10.10.1B:10.10.10.2C:10.10.10.3路由器路由器R:10.1
14、0.10.8步骤步骤1:发送伪造以太网:发送伪造以太网帧:源帧:源MAC为受害者的为受害者的MAC;目的;目的MAC为攻击为攻击者的者的MAC。1 2 3 4 11:22:33:44:55:BB 2 MAC地址地址 端口端口 11:22:33:44:55:CC 3 11:22:33:44:55:RR 4 11:22:33:44:55:AA 1 我的源我的源MAC是是A的的MAC,目的,目的MAC是是C的的MAC 11:22:33:44:55:AA 3(五)交换网络监听:端口盗用交换机交换机 内网内网外网外网A:10.10.10.1B:10.10.10.2C:10.10.10.3路由器路由器R:
15、10.10.10.8步骤步骤2:受害主机将数据:受害主机将数据帧发送给攻击者,攻击者帧发送给攻击者,攻击者从网络接口嗅探数据。从网络接口嗅探数据。1 2 3 4 11:22:33:44:55:BB 2 MAC地址地址 端口端口 11:22:33:44:55:CC 3 11:22:33:44:55:AA 3 11:22:33:44:55:RR 4 问题:攻击者怎么把嗅探数问题:攻击者怎么把嗅探数据发还给受害主机?据发还给受害主机?步骤步骤3:攻击者将数据缓存,:攻击者将数据缓存,让网络正常后,再将数据转让网络正常后,再将数据转交。然后再开始新一轮的攻交。然后再开始新一轮的攻击。击。33交换网络监
16、听小结 网络管理员 交换机+集线器 端口镜像 黑客 MAC洪泛 ARP欺骗 端口盗用二、DHCP欺骗 DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)通常被应用在大型的局域网络环境中,主要作用是集中的管理、分配IP地址,使网络环境中的主机动态地获得IP地址、Gateway地址、DNS服务器地址等信息,并能够提升地址的使用率。DHCP基本原理DHCP基本原理DHCP欺骗三、DNS劫持 在因特网中,域名解析系统(DNS)负责将域名(Domain Name)解析成 IP 地址。同ARP协议一样,DNS同样可以被黑客利用来进行网络流量窃取。DNS 攻
17、击者还可以通过社会工程学等手段获得域名管理密码和域名管理邮箱,然后将指定域名的DNS纪录指向到黑客可以控制的DNS服务器,进而通过在该DNS服务器上添加相应域名纪录,从而使网民访问该域名时,进入了黑客所指向的主机。DNS攻击 DNS缓存投毒:控制DNS缓存服务器,把原本准备访问某网站的用户在不知不觉中带到黑客指向的其他网站上。其实现方式有多种,比如可以通过利用网民ISP端的DNS缓存服务器的漏洞进行攻击或控制,从而改变该ISP内的用户访问域名的响应结果;或者通过利用用户权威域名服务器上的漏洞,如当用户权威域名服务器同时可以被当作缓存服务器使用,黑客可以实现缓存投毒,将错误的域名纪录存入缓存中,
18、从而使所有使用该缓存服务器的用户得到错误的DNS解析结果。DNS攻击DNS劫持CDN入侵 四、Wi-Fi 流量劫持Wi-Fi 热点Wi-Fi 热点钓鱼Wi-Fi 强制断线内容提纲2流量劫持流量劫持3数据采集数据采集4网络监听概述网络监听概述1网络监听工具网络监听工具5网络监听防御网络监听防御一、网卡的工作原理 MAC地址网卡地址网卡工作方式 单播(Unicast):网卡在工作时接收目的地址是本机硬件地址的数据帧;广播(Broadcast):接收所有类型为广播报文的数据帧;多播(Multicast):接收特定的组播报 混杂模式(Promiscuous):是指对报文中的目的硬件地址不加任何检查,全
19、部接收的工作模式。网卡的处理流程二、数据采集以太网的广播方式发送B向向 D发送数据发送数据 C D A E不接受不接受 不接受不接受 不接受不接受 接受接受 B只有只有 D 接受接受B 发送的数据发送的数据 物理层物理层 数据链路层数据链路层 网络层网络层 传输层传输层 应用层应用层 网卡网卡 网卡网卡 物理层物理层 数据链路层数据链路层 网络层网络层 传输层传输层 应用层应用层 网卡是否工作网卡是否工作在混杂模式?在混杂模式?广播特性的总线广播特性的总线实现了一对一的实现了一对一的通信通信 Libpcap(Libaray for Packet Capture),即分组捕获函数库,是由劳伦斯伯
20、克利国家实验室开发的一个在用户级进行实时分组捕获的接口,其特点是独立于操作系统。Libpcap的Windows版本,称为Winpcap 目前的Libpcap已成为开发跨平台的分组捕获和网络监视软件的首选工具。LibpcapLibpcap数据链路BPFDLPISOCK-PACKETLIBPCAP源自BSD的内核SOLARIS 2.xLINUX内核向应用程序提供统一的分组捕获编程接口三、协议分析协议分析内容提纲2流量劫持流量劫持3数据采集数据采集4网络监听概述网络监听概述1网络监听工具网络监听工具5网络监听防御网络监听防御WiresharkWiresharkWireshark案例:Cain Wir
21、eshark案例:Cain Wireshark案例:Cain Wireshark案例:Cain Wireshark案例:Cain Wireshark案例:Cain Wireshark案例:Cain Wireshark案例:Cain Wireshark案例:Cain Wireshark内容提纲2流量劫持流量劫持3数据采集数据采集4网络监听概述网络监听概述1网络监听工具网络监听工具5网络监听防御网络监听防御如何发现Sniffer 通过下面的方法可以分析出网络上是否存在Sniffer:构造特殊的报文,根据目标主机的反映判断其网卡是否处于混杂模式。往网上发大量包含着不存在的物理地址的包,由于监听程序将
22、处理这些包,将导致性能下降,通过比较前后该机器性能(ICMP echo delay等方法)加以判断。如何发现Sniffer 使用Anti-Sniffer、promisc、cmp等工具,发现大型网络上的Sniffer。测试网络接口有无被设置成混杂模式,因为虽然在非混杂模式下可以运行Sniffer,但只有在混杂模式下才可以捕获共享网络中的所有会话。对于SunOS、Linux和BSD Unix可以采用命令:ifconfig-aSniffer的防范 规划网络:一般将网络分段划分得越细,Sniffer收集到的信息越少。采用加密通信:加密后,即使Sniffer捕获了数据,也难于获得数据的原文。目前比较流行
23、的做法是使用SSL协议和SSH安全产品。Sniffer的防范 要想防止对WLAN的监听攻击,可以启用一些安全策略,考虑采用无线VPN产品增强认证和加密功能。对于主动监听工具,简单地采用交换机来防止监听已经不够了。要防止ARP缓存改写,必须对敏感网络中所有主机的ARP缓存表进行硬编码,这些主机包括在线网站、DNS和Mail服务器、防火墙和DMZ路由器等。另外还应该用Ipsec、VPN和其它的加密技术来保护敏感信息本章小结作业第 十 章 缓冲区溢出攻击内容提要缓冲区溢出概述缓冲区溢出概述1缓冲区溢出攻击原理缓冲区溢出攻击原理2缓冲区溢出缓冲区溢出攻击防御措施攻击防御措施3概念 缓冲区或缓存(Buf
24、fer):用户为程序运行时在计算机中申请得的一段连续的内存,它保存了给定类型的数据。缓冲区溢出(Buffer Overflow):计算机程序向缓冲区内填充的数据位数超过了缓冲区本身的容量,溢出的数据覆盖在合法数据上。缓冲区溢出攻击:(一般情况下,缓冲区溢出引起程序运行错误,但是在攻击者的设计下)向程序的缓冲区写入超出其长度的内容,造成缓冲区的溢出,从而破坏程序的正常执行流程,使程序转而执行其他的指令,以达到攻击的目的。缓冲区溢出的根源 溢出的根源在于编程:如果缓冲区被写满,而程序没有去检查缓冲区边界,也没有停止接收数据,这时缓冲区溢出就会发生。Unix和MS Windows系统由于要实现更好的
25、性能和功能,往往在数据段中动态地放入可执行的代码。C/C+语言问题:对数组下标访问边界不做检查或者少做检查。程序员的编程习惯:忽略对输入数据进行严格的边界检查。发展历史 1988年,Morris蠕虫攻击VAX 和 Sun机器,使当时Internet的大约10%崩溃。1996年,Elias Levy发表文章“Smashing the stack for fun and profit”,显示了很多程序都存在缓冲区溢出的危险。缓冲区溢出攻击被广泛关注。1999年,Dark spyrit AKA Barnaby jack提出使用系统核心dll中的“jmp esp”指令完成shellcode跳转的想法,
26、开创了Win32平台下缓冲区溢出的新思路,大量windows平台下缓冲区溢出漏洞被利用。2001年8月,“红色代码”利用微软IIS漏洞产生缓冲区存溢出,成为攻击企业网络的“罪魁祸首”。发展历史 2003年1月,Slammer蠕虫利用微软SQL漏洞产生缓冲区溢出对全球互联网产生冲击。同年,“冲击波”蠕虫病毒利用微软RPC远程调用存在的缓冲区漏洞对Windows 2000/XP、Windows Server 2003进行攻击,波及全球网络 2004年5月爆发的“振荡波”利用了Windows系统的活动目录服务缓冲区溢出漏洞。2005年8月利用Windows即插即用缓冲区溢出漏洞的“狙击波”被称为史上
27、最快利用微软漏洞进行攻击的恶意代码 2008年底至2009年的Conficker蠕虫利用的是Windows处理远程RPC请求时的漏洞(MS08-067)。危害性和普遍性 缓冲区溢出漏洞可以使一个匿名的Internet用户有机会获得一台主机的部分或全部的控制权。缓冲区溢出攻击占了远程网络攻击的绝大多数,操作系统中超过50%的安全漏洞都是由内存溢出引起的。任何平台、任何程序都可能存在缓冲区溢出的漏洞。1998年Lincoln实验室用来评估入侵检测的的5种远程攻击中,有2种是缓冲区溢出。而在1998年CERT的13份建议中,有9份是是与缓冲区溢出有关的,在1999年,至少有半数的建议是和缓冲区溢出有
28、关的。危害性和普遍性 普遍性1999年,CERT安全建议中50%以上同它有关。严重性获得系统最高权限。没有有效预防措施 C语言问题 程序员编程习惯,安全意识薄弱安全漏洞数量(CERT)05101520253035401988 1989 1990 1991199219931994 1995199719981999 2000200220011996Other errorsBuffer overflow危害性和普遍性危害性和普遍性 近年来,虽然缓冲区溢出漏洞的数量占比有所减少,但仍然是一类危害性极大的、数量众多的安全漏洞危害性和普遍性内容提要缓冲区溢出概述1缓冲区溢出攻击原理2缓冲区溢出缓冲区溢出攻
29、击防御措施攻击防御措施3三种内存分配模式(1)静态分配:在进程创建时由系统一次性分配的整块静态内存,这块空间在进程运行期间保持不变。包括:正文(TEXT)段:指令 数据(DATA)段:初始化的全局静态数据 BSS段:未初始化的全局数据 栈空间三种内存分配模式(2)堆栈(Stack)分配:调用程序的地址信息,函数参数的内存分配。整个堆栈空间已在进程创建时分配好。进程刚启动时,堆栈空间是空的,里面无实体。在进程运行期间,对实体的堆栈分配是进程自行生成(压栈)和释放(弹出)实体,系统并不参与。只要压入的实体的总长度不超过堆栈空间大小,堆栈分配就与系统无关。若超过,就会引发堆栈溢出错误。三种内存分配模
30、式(3)堆(Heap)分配:当进程需要生成实体时,向系统申请分配空间;不再需要该实体时,可以向系统申请回收这块空间。堆分配使用特定的函数:malloc();new()。堆分配的空间利用率最高。三种内存分配模式比较静态分配静态分配 栈分配栈分配 堆分配堆分配 空间的生成空间的生成 进程创建时进程创建时进程创建时进程创建时用一点分配用一点分配一点一点 实体生成时间实体生成时间 进程创建时进程创建时 进程运行时进程运行时 进程运行时进程运行时 实体生成者实体生成者 操作系统操作系统 进程进程 进程申请进程申请/系系统实施统实施 生命期生命期 永久永久 临时临时 完全可控完全可控 访问方式访问方式标识
31、标识标识标识指针指针内存布局94内存布局不同区域:堆栈堆栈保存调用程序的地址信息,所需要的变量,其它保存调用程序的地址信息,所需要的变量,其它帧指针等帧指针等:HEAP动态内存分配,本地变量动态内存分配,本地变量:BSS符号块起始地址符号块起始地址:未初始化全局数据段:未初始化全局数据段,即:即:int foo;float baz;:DATA初始化全局静态数据,即:初始化全局静态数据,即:int shit=9,char head=”ugh”;:TEXT机器指令机器指令=操作码操作码+操作数;操作数;read-only编译时编译时分配分配执行时执行时分配分配内存布局ArgumentsVariab
32、lesenvironmentstackHeapBSSDatatext(code)Adresses hautesAdresses bassesuserstackframe代码区代码区数据区数据区栈栈堆堆缓冲区溢出攻击原理 缓冲区溢出的目的在于扰乱具有某些特权的运行程序的执行流程,让攻击者取得程序的控制权,两个步骤:(1)在程序的地址空间(堆栈、堆、BSS段等)里植 入攻击代码,或植入攻击代码所需的攻击参数(如果攻击代码已存在于目标程序中);()改变程序的执行流程,转去执行攻击代码缓冲区溢出攻击原理 代码注入攻击 攻击者向缓冲区写入的数据包含了攻击代码(可执行的二进制代码,通常称为“shellco
33、de”),当发生缓冲区溢出时,溢出的数据覆盖掉一个可执行程序的入口地址(如函数的返回地址,函数指针变量等等),使得该地址指向shellcode,从而当程序试图通过该入口地址执行代码时,就会执行攻击者的shellcode缓冲区溢出攻击原理 ROP 攻击 攻击代码已经在被攻击的程序中了(通常是一些系统函数,如system(),exec()等),攻击者所要做的只是为攻击代码传递它所需要的参数,然后用一个系统函数的地址覆盖可执行代码的入口地址,通过巧妙的构造可以使程序用预设的参数调用系统函数,比如用“cmd”作为参数调用system()函数,也称为ret2libc(Return-to-libc)主要分
34、为:堆栈溢出 堆溢出 BSS段溢出 格式化字符串溢出攻击缓冲区溢出攻击分类一、堆栈溢出堆栈的相关概念 SP:堆栈指针,指向堆栈的顶部;堆栈的增长方向:向下增长(向内存低地址)FP:帧指针,指向堆栈的帧头。堆栈布局堆栈的相关概念函数调用过程最先压入栈最先压入栈最后压入栈最后压入栈 函数调用时堆栈处理规定函数调用过程C语言默认方法函数调用的栈帧变化 假设过程P调用过程Q:Q的参数放在P的栈帧中;当P调用Q时,P中的返回地址被压入栈中,形成P的栈帧的末尾;返回地址就是当程序从Q返回时应继续执行的地方;Q的栈帧从保存的帧指针的值开始,后面是保存的其他寄存器的值。假设有一个程序,其函数调用顺序如下:ma
35、in()-func_1()-func_2()-func_3()栈布局C语言函数调用例子void function(int a,int b,int c)char buffer15;char buffer210;void main()function(1,2,3);C语言函数调用过程 按c、b、a的顺序将参数压栈;把指令指针(IP)压栈,IP也称为返回地址(RET);把FP压栈,被保存的FP称为SFP;将当前的SP复制到FP,成为新的帧指针;将SP的值减小,为局部变量保留空间。C语言函数调用过程buffer1cbaretsfpbuffer2堆栈顶部堆栈顶部(内存低端内存低端)堆栈底部堆栈底部(内存
36、高端内存高端)缓冲区溢出攻击的原理 攻击的原理:通过往程序缓冲区写入超过其边界的内容,造成缓冲区溢出,使得程序转而执行攻击者指定的代码,通常是为攻击者打开远程连接的ShellCode。关键点:存在能够被攻击的数据缓存 要有被执行的攻击代码堆栈溢出原理堆栈溢出代码1/函数定义void function(char*str)char buffer16;strcpy(buffer,str);/主函数主函数void main()char large_string256;int i;for(i=0;i 1)copy(argv1);堆栈溢出示例代码2buffer0buffer0buffer511buffer
37、511previous fpprevious fpReturn Return addressaddressargv1argv1spfpattackcodeStack growthMemory growth 改变函数指针变量堆栈溢出示例代码3堆栈溢出示例代码3int good(const char*str)copy(char*msg)int(*fptr)(const char*str);char buffer512;fptr=(int(*)(const char*str)good;strcpy(buffer,msg);(void)(*fptr)(buffer);main(int argc,cha
38、r*argv)if(argc1)copy(argv1);堆栈溢出示例代码3buffer0buffer0buffer511buffer511fptrfptrprevious fpprevious fpReturn Return addressaddressargv1argv1spfpattackcodeStack growthMemory growthShell Code 改变程序流程后希望得到Shell 首先把想要执行的代码放到我们想使其溢出的缓冲区里;然后覆盖函数的返回地址,使其指向这个缓冲区(希望执行的代码,通常是shell Code)Shell Codevoid main()char*s
39、tr2=”/bin/sh”,0;exec(“/bin/sh”,str,0);char shellcode=“xebx2ax5ex89x76x08xc6x46x07x00 xc7x46x0cx00 x00 x00”“x00 xb8x0bx00 x00 x00 x89xf3x8dx4ex08x8dx56x0cxcdx80”“xb8x01x00 x00 x00 xbbx00 x00 x00 x00 xcdx80 xe8xdlxffxff”“xffx2fx62x69x6ex2fx73x68x00 x89xecx5dxc3”;编译后反编译编译后反编译堆栈溢出过程分析示例 示例环境:操作系统:Window
40、s 7 Professional Service Pack 1 编译器:VC+6.0 目的:掌握动态调试方法,理解函数调用过程中堆栈和关键寄存器的变化以及堆栈溢出原理堆栈溢出分析示例 源代码:堆栈溢出分析示例运行结果是什么?溢出过程分析堆栈溢出分析示例 溢出过程分析堆栈溢出分析示例 堆栈变化过程堆栈溢出分析示例 溢出过程分析堆栈溢出分析示例 堆栈变化过程堆栈溢出分析示例 溢出过程分析堆栈溢出分析示例 溢出过程分析堆栈溢出分析示例 溢出过程分析堆栈溢出分析示例 堆栈变化过程堆栈溢出分析示例 溢出过程分析堆栈溢出分析示例 堆栈变化过程堆栈溢出分析示例 堆栈变化过程堆栈溢出分析示例 堆栈变化过程堆栈
41、溢出分析示例 溢出过程分析堆栈溢出分析示例 堆栈变化过程堆栈溢出分析示例 溢出过程分析堆栈溢出分析示例 堆栈变化过程堆栈溢出分析示例 溢出过程分析堆栈溢出分析示例 堆栈变化过程堆栈溢出分析示例 溢出过程分析堆栈溢出分析示例 堆栈变化过程堆栈溢出分析示例 溢出过程分析堆栈溢出分析示例 堆栈变化过程堆栈溢出分析示例二、堆溢出堆溢出 当我们需要较大的缓冲区或在写代码时不知道包含在缓冲区中对象的大小,常常要使用堆。堆没有压栈和入栈操作,而是分配和回收内存。C语言中使用malloc()和free()函数实现内存的动态分配和回收,C+语言使用new()和delete()函数来实现相同的功能。堆的特点 堆的
42、增长方向:从底到高(与栈相反)堆的分配和释放可以由用户自由控制 堆的空间不一定连续 堆申请函数返回指向堆内存的指针,后续对于内存的读写等操作需要通过此指针进行 不同的系统有着不同的堆管理机制HeapLinux堆Linux堆 堆表用来索引堆块,表中包含索引堆块的大小、位置、状态等信息 位于堆区的起始位置,堆表分为两种空闲双向链表Freelist(空表 128条)和快速单向链表Lookaside(快表最多只有四项)堆表 堆块分配可以分为三类:快表分配、普通空表分配和零号空表(free0分配)堆块分配 释放堆块的操作包括将堆块状态改为空闲,链入相应的堆表。堆块释放 当堆管理系统发现两个空闲堆块相邻时
43、,就会进行堆块合并操作,包括,将堆块从链表中卸下、合并、调整新堆块块首信息、重新链入空表堆块合并 堆溢出是指程序向某个堆块中写入的字节数超过了堆块本身可使用的字节数(之所以是可使用而不是用户申请的字节数,是因为堆管理器会对用户所申请的字节数进行调整,这也导致可利用的字节数都不小于用户申请的字节数),因而导致了数据溢出,并覆盖到物理相邻的高地址的下一个堆块堆溢出 前提条件:程序向堆上写入数据 写入的数据大小没有被良好地控制 利用策略 覆盖与其物理相邻的下一个 chunk 的内容 利用堆中的机制(如 unlink 等)来实现任意地址写入(Write-Anything-Anywhere)或控制堆块中
44、的内容等效果,从而来控制程序的执行流堆溢出 用精心构造的数据去溢出下一个块的块首,改写块首中的前向指针和后向指针,这种能够向内存任意位置写入任意数据的机会叫DWORD SHOOT堆溢出-DWORD SHOOTint remove(ListNode*node)node-blink-flink=node-flink;node-flink-blink=node-blink;堆溢出-DWORD SHOOT堆溢出-DWORD SHOOT 触发unlink 绕过系统保护堆溢出利用堆溢出实例#include#include#include#include#define BUFFER-SIZE 16#defi
45、ne OVERLAYSIZE 8 /*将覆盖buf2 的前OVERLAYSIZE 个字节*/int main()u-long diff;char*buf1=(char*)malloc(BUFFER-SIZE);char*buf2=(char*)malloc(BUFFER-SIZE);diff=(u-long)buf2-(u-long)buf1;printf(buf1=%p,buf2=%p,diff=0 x%x(%d)bytes n,buf1,buf2,diff,diff);/*将buf2 用a填充*/memset(buf2,a,BUFFER-SIZE-1);buf2BUFFER-SIZE-1
46、=0;printf(before overflow:buf2=%s n,buf2);/*用diff+OVERLAYSIZE 个b填充buf1*/memset(buf1,b,(u-int)(diff+OVERLAYSIZE);printf(after overflow:buf2=%s n,buf2);return 0;堆溢出实例 运行结果:buf1=0 x8049858,buf2=0 x8049870,diff=0 x18(24)bytes before overflow:buf2=aaaaaaaaaaaaaaa after overflow:buf2=bbbbbbbbaaaaaaa buf2的
47、前8个字节被覆盖了,这是因为往buf1中填写的数据超出了它的边界进入了buf2的范围。由于buf2的数据仍然在有效的Heap区内,程序仍可正常结束。堆溢出实例 虽然buf1和buf2是相继分配的,但它们并不是紧挨着的,而是有8个字节的间距。这是因为,使用malloc()动态分配内存时,系统向用户返回一个内存地址,实际上在这个地址前面通常还有8字节的内部结构,用来记录分配的块长度、上一个堆的字节数以及一些标志等。这个间距可能随不同的系统环境而不同。buf1溢出后,buf2的前8字节也被改写为bbbbbbbb,buf2内部的部分内容也被修改为b。堆溢出实例 示意图:堆溢出n堆溢出不如栈溢出流行,原
48、因在于:堆溢出不如栈溢出流行,原因在于:n比栈溢出难度更大比栈溢出难度更大n需要结合其他的技术需要结合其他的技术n对于内存中变量的组织方式有一定的要求对于内存中变量的组织方式有一定的要求堆溢出堆溢出三、BSS段溢出BSS溢出 BSS段存放全局和静态的未初始化变量,变量与变量之间是连续存放的,没有保留空间。这样定义的两个字符数组即是位于BSS段:static char buf116,buf216;如果事先向buf2中写入16个字符A,之后再往buf1中写入24个B,由于变量之间是连续存放的,静态字符数组buf1溢出后,就会覆盖其相邻区域字符数组buf2的值。利用这一点,攻击者可以通过改写BSS中
49、的指针或函数指针等方式,改变程序原先的执行流程,使指针跳转到特定的内存地址并执行指定操作。四、格式化字符串溢出格式化串溢出 与前面三种溢出不同的是,这种溢出漏洞是利用了编程语言自身存在的安全问题。格式化串溢出源自*printf()类函数的参数格式问题(如printf、fprintf、sprintf等)。int printf(const char*format,arg1,arg2,);它们将根据format的内容(%s,%d,%p,%x,%n,),将数据格式化后输出。问题在于:*printf()函数并不能确定数据参数arg1,arg2,究竟在什么地方结束,即函数本身不知道参数的个数,而只会根据f
50、ormat中打印格式的数目依次打印堆栈中参数format后面地址的内容。格式化串溢出实例/*程序说明:%#x:按16进制输出,并在前面加上0 x%.20d:按10进制输出,输出20位,并在前面补0%n:将显示内容的长度输出到一个变量中去*/#include main()int num=0 x61616161;printf(Before:num=%#x n,num);printf(%.20d%n n,num,&num);printf(After:num=%#x n,num);格式化串溢出实例 当程序执行第2个printf语句时,参数压栈之后的内存布局如下:格式化串溢出实例 根据C函数调用约定,参