🌷🍁 博主 libin9iOak带您 Go to New World.✨🍁 🦄 个人主页——libin9iOak的博客🎐 🐳 《面试题大全》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 🌊 《IDEA开发秘籍》学会IDEA常用操作,工作效率翻倍~💐 🪁🍁 希望本文能够给您带来一定的帮助🌸文章粗浅,敬请批评指正!🍁🐥
这一节我们来学习网络安全威胁与攻击的分类,安全威胁可以从多个角度来进行分类。首先我们来看,从信息流动的角度,可以分成中段,截取、修改、捏造,从威胁的来源可以分为内部威胁和外部威胁,另外又可以分为自然的威胁和人为的威胁两类。从攻击者的行为上来可以分为主动威胁和被动威胁。从威胁的动机上来看的话,可以分成偶发性的威胁和故意威胁。这题我们来具体看一下,从信息流动的角度,网络安全攻击的类型。
这里有一张图,最上面是正常的信息活动,正常的信息活动,信源发送一条信息到信速,中间没有任何的干扰和攻击的存在。第一种攻击中断,很容易理解,就是在中间这个信息的传输被阻断了,到不了这个信速。第二种攻击是截取新语言,发送数据到迅速过程当中,在中途被攻击者截获了复制了一份,这个就攻击了信息安全的保密性。第三种攻击修改,这个攻击者把这个信源发送的数据截获下来,并且做这个相应的修改,然后再把它发送给迅速,这个就攻击了信息安全的这个完整性。第4种是捏造,所谓捏造就是无中生有,性缘本身没有活动,结果攻击者冒充信源发送一个信息给信速。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nQtuukAP-1687880215511)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image002.gif)]
我们刚才提到可以从攻击者的行为角度,将攻击分为被动攻击和主动攻击。这个分类方式是美国提出的信息保障,技术框架、iat、f当中提出的分类方式,在这个框架当中将网络攻击分成了如下的5类,在这个框架当中,除了被动攻击主动攻击之外,还有物理临近攻击,内部人员攻击和软硬件配状攻击。
首先我们来看被动攻击,被动攻击就是攻击者非法获取信息,但不对信息做任何的修改,常见的手段就是搭线监听或者是无线截获以及其他的截获方式,或者进一步对信息的内容进行分析或者做这个业务流分析。这个攻击是攻击我们前面讲的信息安全基础属性,三角形的保密性,因为它不做任何的修改,是一种非授权的访问信息,这种攻击方式受害者是难以感知到的,受害者不容易感觉到我的信息传输被监听了或者被这个截获了,所以是不易被发现的。这种攻击方式如何来进行防御?重点在于预防,在传输之前事先对信息进行一定的处理,比如说加密或者通过虚拟专用网 VPN进行传输,其实VPN它的主要的作用就是加密。
接下来我们再来看主动攻击,主动攻击就是攻击者,他要去篡改我们传输的数据流,或者产生虚假的流,具体的攻击方式包括假冒,一个实体,假装成另外一个实体去产生活动去发送信息。第二种攻击方式叫做重放,攻击者截获一个发送到目的主机的数据包,并且把它重新再发送给目的主机,从而起到一个欺骗目的主机的这样一个效果和作用,主要用于身份认证过程,通过这种攻击可以非法的通过这个认证。这里我们举一个例子,假设一个用户要登录他的邮件服务器,首先它要进行认证,这个认证就需要进行认证的交换,发送用户的账户名称然后以及密码,然后通过账户和密码通过认证,如果有一个攻击者在这个过程当中把这个认证的数据包给截获了,然后回头再把这个数据包原封不动的再发给邮件服务器,那这个就是一个存放攻击。由于攻击者发送了这个认证的完整的报文,这个时候它就可以借助这个认证的报文,通过这个邮件服务器的认证,从而起到一个冒充我们邮件用户的这样一个效果。
第三种方式是篡改攻击者非法的改变,延迟或者乱叙一个合法消息,以及这个消息当中的部分。非法改变实际上就是破坏消息的完整性,另外延迟就是把这个消息让它延迟在发送。我们知道有些消息它是具有这个时效性的,延迟之后时效性就被破坏了,就起到了一个攻击的效果。
延迟:消息延迟发送,破坏时效性。
还有乱序,有些消息可能是由若干个分片组成的,那这个时候如果攻击者把消息的顺序给他打乱了,那这个时候消息他的完整性也受到了破坏,有效性也受到了破坏。
乱序:打乱消息顺序,破坏完整性。
还有一种是拒绝服务,拒绝服务就是阻碍信息系统或者其部分设施的正常使用,让这个系统不能工作了,让别人没办法使用了,攻击这个可用性。
总结一下就是主动攻击,攻击我们前面讲的信息安全属性三角的完整性和可用性,这种攻击方式我们受害者是容易感知到的,也是容易检测出来的,但是它是不易有效防止的。
自动审计:针对这种攻击方式如何来进行防御?第一种方式就是我们进行审计,我们把这个攻击的活动给记录下来,以便事后来追究一些责任。
入侵检测:尽快的及时的把入侵行为检测出来,以便可以及时的进行响应。
完整性恢复:进行完整性的恢复,因为它可以破坏完整性,我们就可以采用一些措施让这个信息被篡改之后能够把它恢复过来。
系统加固:针对拒绝服务,我们可以加固系统,提高系统防御水平。
接下来我们简单看一下内部人员攻击,内部人员攻击可以分为恶意的和非恶意的,
恶意攻击就是我们内部人员蓄谋已久的有计划的实施窃听偷窃或者损害信息,或者是拒绝其他授权用户的访问,而非恶意攻击,就是内部人员。由于初心安全意识的缺乏或者知识的缺乏,或者为了完成工作等无意间绕开安全策略,从而对系统产生了破坏的行为。
我们再看一下物理零件攻击与软硬件配装攻击,物理临近攻击就是指攻击者,它可以物理上面临近网络系统或者设备,从而进行未授权的更改或者收集信息,或者进行相应的破坏。软硬件的配装攻击,又称为分发攻击,就是在软硬件的生产厂商或者在软硬件的产品分发过程当中恶意修改硬件或者软件。
前面我们介绍了网络安全威胁和攻击的分类,这里我们再来看网络安全威胁的分级,国际上有一个等级划分,将网络安全威胁分成了ABC三级,c级就是个体的信息犯罪,通常他们是单点攻击,采用比较简单的攻击方法,当然目前也有自动化平台化的趋势,总体而言单点攻击它的攻击的破坏力有限。第二级 b级是指有组织的分布式的协同的攻击,从多点采用多种技术发动协同的攻击,并且相互掩护,危害相对来说更大,难以兑付,往往能够攻击一些比较大型的网站,一些大的服务器,a级是最高级战争威胁,比如说信息战争、网络战争,这种类型它实施更大范围的攻击,攻击的技术也更全面,危害更大,可以采用一切的攻击手段。我国信息系统的安全等级保护条例,将信息系统的安全等级保护分为了5级,相应的安全威胁也分成了5级,具体如何来划分,大家可以下来参与一下这个等级保护条例,这里我们就不再详细的介绍。
我们来学习一下网络攻击的环节,网络攻击设计哪些环节,天时、地利、人和。孟夫子提出作战要取得胜利的话,需要天时地利人和。
网络攻击同样一次网络攻击要想成功的话,也需要天时地利人和。
天时就是时间,地利就是地点,或者说网络攻击的发起的位置或者覆盖的位置,人和就是攻击者他的背景。当然除了天时地利人和之外,还包括攻击的手段,攻击的目标。
首先我们来看时间环节,我们前面讲信息安全问题的根源是内忧外患,内忧就是信息系统普遍存在漏洞,信息信息系统的硬件、软件、网络、策略人员等等各个环节都可能存在漏洞,这些漏洞就为攻击者、攻击系统、打开了方便之门。这个信息系统的漏洞它是有生命周期的,通常在系统发布的时候,这个漏洞就存在了,但是这个时候漏洞还是安全的,因为没有被发现,随着时间推移,这个漏洞可能就被发现了,暴露出来了。暴露了一段时间之后,厂商或者第三方的人员就发布相应的补丁,然后再等用户去安装补丁,把这个漏洞进行修补。这个时候这个漏洞的生命周期就完结了,接下来可能又会有新的漏洞暴露,然后再来新补丁被发布出来再来安装。我们就可以看到在漏洞的这个生命周期当中,从漏洞发现到被安装上补丁,这么一段时间就是我们漏洞的道路窗口,只有在漏洞的暴露窗口,攻击者才会有机可乘,所以这段时间就是攻击窗口,一个漏洞的攻击窗口越短,我们这个系统就越安全,就越不容易被攻击者攻击。
接下来我们再来看地点,地点通常是攻击者的位置或者说攻击的范畴,这个入侵和攻击的范畴可以分为如下几类,一类是internet,就是攻击或者说这个攻击影响的范畴是在我们互联网的范围之内。第二个就是局域网,然后再下来就是本地甚至是离线的,
攻击的范围在互联网上,在internet上的话,攻击者可以发动如下一些攻击,比如说这个协同攻击多个攻击者相互的协作,然后也可以发动会话劫持,当合法用户在进行这个信息活动的时候,通过了认证,攻击者就把这个会话接管过来,顶替合法的用户进行后续的活动,也可以发动欺骗攻击,模仿或者是采取不失自己身份的一些行为,也可以发动反射攻击,利用第三方的机器服务器转播或者反射通信流量造成攻击,来自于第三方的假象。还有安装特洛伊木马,通过木马实现对目标的远程控制,木马通常平时是潜伏藏匿起来的,然后偷偷的活动,窃取信息,然后安装后门等等。这些攻击方式有些我们在后面的章节会进行更具体的介绍。
我们再来看在局域网范围内可以发动哪些攻击?
第一种典型的是网络嗅探,当和攻击目标处于同一个局域网范围的时候,攻击者就可以发动网络嗅探来窃听局域网上面的全部或者部分的流量。然后第二种是广播攻击广播攻击,就是以这个广播地址作为我们数据包的目标地址,然后发送大量的数据包,然后这些大量的数据包会消耗网络带宽,造成网络的拒绝服务或者网络服务质量的下降。在局网范围之内,我们可以发起一些非授权的文件访问,比如说通过获取呃目标用户的账户或者口令,然后去非法的访问别人的文件资源,另外我们还可以发动ARP欺骗攻击,这个攻击主要是污染其他主机的ARP缓存,污染之后就可以假冒乘其他的主机,然后实施欺骗攻击。
接下来我们再看一下在本地范围内攻击者可以实施什么样的攻击。
第一种就是旁侧偷看,攻击者临近受害目标,然后去偷偷的看别人的信息活动,看别人使用电脑敲入了什么样的数据。
第二种是偷用未上锁的终端,当这个攻击目标短暂的离开了它的终端,而未对终端进行锁屏上锁的话,攻击者就可以趁此机会去偷用别人的计算机,然后去查看别人的数据或者拷贝,偷取别人的数据。
另外可以搜索被写下的口令,有些用户他的口令比较常复杂,难以记忆的时候,有可能会把这个口令写下来,写在纸上或者笔记本上面,甚至把这个写下的这些口令又把它废弃了,扔到废纸,或者把这个写下的口令扔到垃圾桶里面,那这个时候我们就可以搜索这些被写下的口令,从而去获取它的口令。
我们还可以实施一些拒绝服务之类的攻击,直接把别人的机器的电源线网线拔掉,让别人无法工作。
接下来我们看离线的情况,在离线的时候,攻击者可以怎么样来进行攻击?
离线的时候攻击者可以对之前下载的口令文件实施一些破解操作,或者对下载的加密文本实时破解,另外也可以什么?呀借助一些存储设备来进行数据的复制。
接下来我们再来,看人物接下来我们再来看人和也就是人物,人物主要就是指攻击者的身份以及攻击者他的目标。我们前面实际上在讲这个信息安全问题的根源的时候提到过,这个外因就是存在各种各样不同身份的呃攻击者,那这里我们就不再详细介绍,大家可以在以后这样一张表来回顾一下。
接下来我们再来看手段,手段实际上就是攻击方式,常见的攻击方式有很多,这里我列出了一些,然后包括欺骗攻击、中间人攻击、拒绝服务,缓冲区溢出,后门漏洞,暴力破解等等。这些攻击方式有些我们在后面会更进一步的详细介绍。
接下来我们看目标,也就是容易遭到攻击的目标。信息系统当中的如下一些组件或者服务器就容易成为攻击者的目标。比如路由器、数据库、邮件服务器、域名服务器、web、APP服务器等等,就容易成为我们攻击者的目标。他们我就是我们应该重点保护的对象。
接下来我们来看一下网络攻击的步骤,网络攻击的常见步骤通常有如下的5步,叫做5步曲,第一步叫做踩点,踩点主要就是确定我们攻击的目标,第二步叫做定位,就是确定目标之后我们来分析一下目标,它有什么样的弱点,什么样的漏洞我们可以利用,接下来一步就是我们实施攻击,留后门就是在攻击目标里面,我们安装一些后门方便以后再来,
最后就是去痕迹攻击毕竟是一个非法的行为,攻击者往往会最后把他的入侵的痕迹清除掉,消灭犯罪证据。
刚才我们看到的攻击五部曲,我们又可以把它分成三大阶段,攻击之前叫做预攻击阶段,确定目标,分析目标,然后攻击就是实施各种攻击手段,留后门去痕迹就是后攻击阶段。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vfAMhKUu-1687880215513)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image004.jpg)]
我们看一下刚才的三大阶段,他们分别的目标和这个内容是什么?
在预攻击阶段主要是为了收集信息,然后进行目标的分析,然后最后来进行攻击的决策。在攻击阶段,他的目标就是实时攻击,获取有用的信息,获取一定的权限。后攻击阶段目标就是清除痕迹,然后维持一个长期的权限。
我们再来看预攻击阶段,他要实施的攻击内容,主要是获取攻击目标的相关信息并进行相应的分析。获取的信息内容包括攻击目标的域名,它的IP分布,然后攻击目标,它内部的一个网络托普,以及它的服务器上面的操作系统,然后另外攻击目标它的端口以及开放的服务,还有就是攻击目标它的应用系统的情况,以及它的漏洞的情况。在攻击阶段要实施的活动就包括获取远程权限,进入远程系统,然后再来进行一个权限的提升,然后进一步的扩展权限,然后进行一些实质性的一些操作。后攻击阶段的主要活动内容,包括自入,后门安装木马,方便进行远程的这样一个控制。然后另外就是清除痕迹,攻击者在攻击目标上面的活动往往会留下很多日志,这个时候我们把日志给它删除掉,然后另外要修补一些明显的漏洞,为什么我们要帮助攻击目标来修补它的漏洞?原因有两方面,一方面是避免这个攻击目标漏洞太多,而被其他的攻击者惦记,另外就是防止攻击目标自身来修补漏洞,他自己修补漏洞的话,可能我们这个系统后期就没有办法再很容易的进来了,然后另外就是进一步的去进行这个渗透的扩展,可以把当前这个目标作为攻击跳板,进而去攻击其他的系统。
接下来请大家看一张图,这张图是对应我们刚才讲的预攻击、攻击和后攻击三个阶段,黑客们常常采用的攻击的策略和步骤,以及一些具体的操作,这个图当中每个阶段黑客都会同时很多相应的活动,具体的活动部分我们会在后续的章节进行介绍,这里我们就不再详细的进行这个深入,大家可以自己来看一看。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9iVNF8GG-1687880215513)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image006.jpg)]
接下来我们进入预攻击阶段,我们来看一下攻击者他如何来收集信息,分析目标以及进行攻击的决策。
收集信息、目标分析、攻击决策
这是我们前面看到的,在预攻击阶段攻击者要获取哪些信息。我们来看一下预攻击阶段攻击者常采用的方式和手段,有技术手段,也有非技术手段,技术手段主要是利用一些工具来探测收集攻击目标的相关信息,非技术手段主要是利用公开的信息或者利用社会工程来套取攻击目标的信息。首先我们来看一下域名和ip的查询,要查询攻击目标的域名和IP,我们可以利用会议这个工具,这个工具是提供了域名和IP信息的查询和收集服务,它是一个标准的服务,可以查询域名是否被注册以及注册的详细信息,具体可以查询到信息包括域名所有者是谁,域名及IP地址的对应关系。域名所有者他的联系方式,域名的到期时间、注册时间以及域名所使用的域名服务器等等。
接下来我们看一下ping这个网络工具,这个工具是用于探测目标主机是否是开启的,只有开启的主机才能够成为攻击目标。它主要是利用我们前面介绍过的icmp协议,来向目标主机打一个招呼,具体是使用icmp的a口这个子协议。通常在工作的时候,发起者发送一个Aiko request的请求信息,等待对方进行应答。如果我们等到了应答的话,就说明目标主机它是开启的,如果没有应答可能有多种原因,一方面可能是这个主机没有开启,另外一方面有可能由于这个目标主机它前面的路由网关设置不正确,网络是不通的,另外也有可能这个网卡的配置是不正确的,还有就是我们发送的请求报文和这个应答,报文可能在网络传输过程当中超时了,另外也有可能我们发送的探测包以及响应包都被防火墙给拦截了,这里是我们使用这个 ping工具进行探测的一个事例,大家如果打开你们的计算机使用命令行提示符敲入cmd这样一个命令,然后你就可以在这个命令行窗口下面输入拼命令,然后后面跟上一个域名或者是IP地址,再敲回车,你就可以发起1个探测。这个拼命令它会发出4个请求,然后等待对方的回应,如果对方有应答的话,他就会最后给出一个报告,然后表明对方主机然后是如何来进行响应的,发出了多少个包,收到多少个响应。
接下来我们看一下炊事root这样一个工具,这个工具是用来探测我们执行这个命令的主机到目标主机的路径,这个命令又叫做路由跟踪,它的原理是发送若干的短命IC MP包,什么叫短命的IC MP包?我们每个IP包里头都有一个字段叫ttl短命的ismp包就是这个包里面它的ttl值设置的比较小,ttl这个字段是用来干嘛?这个 Ttl,字段是设置的数据包的生存周期,它是为了避免IP数据包在网络存在环路或者说目标不可达的时候,在网络当中无限的路由转发,无限的循环,浪费网络资源,所以设置了这样一个字段。
路由器在转发一次数据包的时候,就会把这个 ttl值减一,当这个 ttl值为0的时候,路由器就会把这个数据包丢掉,然后并且会向发送这个数据包的源端发送一个icm告警,告诉他这个数据包的生命周期终止了。
我们结合下面这张图来说一下Traceroute它的具体工作过程。这张图当中左边是这个发起方,这张图当中的左边的主机是探测方,而我们右边这个主机是探测目标,中间可能会经过若干的路由器组成的这样一个路径,Traceroute的目标就是把中间这些路由器一一的按照顺序给探测出来,Traceroute在工作的时候,它会向探测目标发送若干个ttl值从一开始递增的smp包。第一个数据包到达第一个路由器的时候,由于它的ttl值为一,路由器会把这个 ttl值减1,这个时候就变成了0,路由器会把这个包丢弃,然后并且像发送方报告一个信息告诉他,你这个包到我这儿终止了,生命周期结束了。接下来探测方再发送第二个探测包,第二个探测包它的ttl值v2,它自然可以顺利的通过第一个路由器,但是当它到达第二个路由器的时候,ttl值又变成了0,路由器会继续的向探测方再发送一个告警告诉他,你的数据包到我这儿,然后生命终止了。以此顺序,探测方发送一系列 smp包,最终到达探测目标。这个过程当中,我们中途的这些路由器就会分别的向探测方报告,当天你数据包到什么地方了,然后我给你终止了,最后我们就可以把整条完整的链路通过这样一种方式逐条的一一的给探测出来,接下来我们再来看一下net craft,通过这样一个服务可以查询大部分知名网站的信息,比如网站它运行了什么服务器,用什么web服务器,甚至网站在哪个机房,有些都可以查询出来,这个是相应的它的一个界面,大家下来可以去访问一下,试着用一下。接下来我们看一下如何对目标主机进行端口和服务的分析,要对目标主机进行端口和服务分析,我们可以使用应用程序进行测试,比如使用这个知名的太阳能FTP等等这样一些应用程序,像目标主机的目标端口,申请服务发起一个请求,如果对方有应答,就可以说明这个端口或者服务它是开放的。另外我们可以使用网络扫描的工具和软件,对目标主机一定范围的这个端口进行扫描,可以全部的掌握目标主机的端口情况。这里我们来看一下如何利用公开信息对目标进行分析,合理的利用公开信息可以分析和挖掘背后的很多信息。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LhmLE8WR-1687880215514)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image008.jpg)]
合理利用公开信息分析和挖掘背后的信息。这里我们举一个事例,这是一张照片,是1964年中国画报的封面。铁人王进喜在大庆油田,当时日本的一个厂商想要竞标中国大庆油田的钻探设备,于是对这张图展开了一个公开信息分析。从这张图他们展开了如下的判断,结合当时的时间以及衣着判断,这张图片拍摄于北纬46度到48度之间的区域,也就是齐齐哈尔与哈尔滨之间。然后根据王进喜所握手柄的架势,可以推测油井的大概直径,然后根据钻井与背后油田之间的间距以及这个井架的密度,可以大概推测它的储量和产量。正是利用这些公开信息分析和挖掘的背后信息,日本的厂商也一举中标。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xI06syOL-1687880215514)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image010.jpg)]
接下来我们来看信息搜索,如何利用网络来搜集有效信息。一是利用网站信息,比如某网络服务提供商在他的网站上进行宣传,特惠服务器租用red hat8.0支持my circle PHP采用性能优异的帕奇1.3web服务器。这条宣传信息就告诉我们了很多有价值的信息,它的服务器采用什么操作系统,采用了什么工具,采用了什么服务器,接下来我们来看一下如何利用搜索引擎来挖掘信息。如果攻击者在掌握了某些漏洞信息或者漏洞利用脚本信息的前提下面,它就可以利用搜索引擎,然后以漏洞或者脚本信息最关键词来进行搜索,有可能搜索引擎就会搜索出存在这些漏洞,或者可以被攻击脚本利用的网站或者服务器信息出来。
接下来我们来介绍一下社交工程攻击又叫社会工程攻击,它是利用社会关系社交活动来探听窃取信息,这个是攻击者在预攻击阶段常采用的一种攻击方式,想必很多同学都有一些社交工程攻击的一些体会,比如攻击者可以冒充新的资源去寻求帮助,试图找到在计算机上面完成某个特定任务的方法。攻击者有时候会冒充愤怒的领导给下属打电话,到院口令失效了或者遗忘了,让下属帮他恢复,攻击者也可以冒充系统管理员打电话或者发邮件给一些资源更新或者修改系统或者用户账户需要使用职员的口令,
攻击者也可以冒充新雇佣的远程管理员打电话给公司,询问系统的安全配置情况或者资料,
攻击者还常常冒充客户打电话给供应商,询问公司的新计划,发展方向以及公司的主要负责人。
接下来我们来学习一下网络扫描器,网络扫描器是自动的检测远程或本地系统安全弱点的这样一个程序或者工具,它的目标可以是工作站、服务器、交换机、数据库等等相关的应用。
网络扫描器的主要功能可以分为如下几部分,网络扫描器可以实施主机扫描,确定主机它的工作状态是开机还是关机的,还可以进行端口扫描,识别判断主机端口、开放的情况,然后还可以进行系统识别识别我们目标系统它的操作系统以及它的服务程序的类型和版本,然后还可以进行漏洞扫描,根据已知的漏洞情况,分析一下系统是否存在这些漏洞。最后它可以生成一个扫描的一个报告。我们来简单介绍一下扫描器的工作原理,扫描器的工作原理实际上就是一个投石问路。投石问路,我们经常在一些武侠小说或者武侠电影里面看到过,在一个月黑风高的夜晚,一个夜行侠潜入到一个大宅子,他要穿过一个门廊,这个门廊是否安全,是否可以通过这个时候它要探测一下,通常夜行侠会扔一个石头,看一下门廊那个地方有没有相应的反应,有没有守卫,有没有看门狗,如果没有任何反应的话,说明这个门廊是可以通过的。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Rh2BKuxv-1687880215514)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image012.jpg)]
我们扫描器采用相同的原理,首先我们扫描器可以给目标主机发送一些探测报文,探测这个主机它是否是存活的,是否是开机的,如果对方是开机的,我们再进一步的扔一些石头过去,看一下它的端口是否是开放的,这个时候就会发送一些端口,探测的报文。如果对方的端口是开放的,接下来我们就要看一下目标主机它是否存在一些漏洞,或者是脆弱性,我们又可以继续发送一些知名漏洞,它的利用的脚本或者相应的攻击方式去尝试的去攻击一下,看一下有没有反应,能不能攻破。如果是可以利用的,那这个时候说明对方它是存在这个漏洞的。
最后这一通的投石问路,探索完了,扫描器它就会给你出一个相应的报告,告诉你目标主机它的一个安全状况。
接下来我们来看一下如何来进行主机扫描。
主机扫描有一些传统的扫描手段,主要就是基于smpa口协议来跟目标主机进行一个打招呼或者说搭讪。
最简单的就是 p扫描,我们前面已经介绍过,可以使用ping这个工具来发起简单的smpa口的扫描,它是比较简单的系统支持,但是很容易被防火墙限制。
第二个传统的方式就是smp swap扫描,这个扫描是并行的扫描,它可以同时的探测多个目标,从而提高这个探测效率。
还有广播ICM扫描,它是利用广播向广播地址发送sm pico request请求包,这个时候就可以探测整个广播域内的主机它们是否是存活的。使用广播的话,它也会有一些相应的限制。它只适用于, UNIX或者Linux环境,windows环境会忽略这个广播扫描,它的另外一个缺点就是广播容易引起广播风暴,就容易被发现。还有一些扫描技术是非a口的I3P扫描,刚才我们看到的扫描都是基于IC MPa口协议来进行扫描的,他们容易被感知和拦截,所以需要有其他的扫描方式。我们如果去看icmp协议的类型的话,我们可以看到还有其他类型的这个 smp协议,它同样是请求应答这样一种模式,请求这样一种应答模式,它就可以被利用来进行这个扫描和探测,发起方发送请求被探测方进行应答,这个时候就可以探测。从这张表当中我们可以看到编号13 14 41对,请求应答嫌疑,请求时间戳,然后进行相应的应答。编号15 16又是一对请求应答,请求这个信息,然后这个编号17和18的又是一对请求应答,请求这个子网掩码,利用这三对协议,我们就可以构造扫描,这上面有些请求和应答今天已经被作废了,大家下来可以尝试一下。
刚才我们看到的传统的主机扫描技术,不管是a口的还是c口的,都是 icmp的这个报文,都是利用icmp来进行这个搭讪,防火墙网络过滤设备就比较容易进行拦截和过滤,所以后来又产生了高级的扫描技术,高级的扫描技术是利用smp协议它提供的网络间传输错误信息的这样一个功能来实现探测。也就是说smp协议,当发现网络当中出现一些错误的时候,比如说收到一些异常的数据包,然后他会报告这个错误,把它报告给数据包的发起方,我们就可以利用这一点来实施主机的扫描,我们可以构造存在异常的IP包,或者存在这个错误填充的IP包,或者是构造存在错误分片的IP包。另外还可以构造超长的ip包,用来探测我们这个目标它内部的路由情况。我们首先来看一下异常IP包头探测,这种探测就是像目标主机,发送这个 Ip包头错误的IP包,常见的这个可以利用的,字段就是这个 IP包头的头部长度字段和IP选项字段,我们在这两个字段填充错误的信息,如果目标主机是开机的,这个时候目标主机以及它前面的过滤设备就会进行反馈,反馈icmp参数错误信息,借助这个信息,我们就可以判断目标主机它是否开机。我们再来看填充错误IP报探测,这种探测就是像目标主机发送填充这段错误的IP包。我们前面看这个IP头部报文的格式的时候,专门看到过IP头部有一个填充字段,当我们发送填充这段错误的IP包的时候,目标主机如果它是开机的,这个时候目标主机或它的过滤设备就会反馈icmp目标不可达的信息。
接下来我们看一下错误分片IP包,错误分片IP包探测是利用IP层它的分片机制,当传输层交给IP层的数据比较大的时候,IP层就会对数据进行分片构造分片的IP包。这种探测就是像目标主机发送存在分片错误的IP包,当目标主机接收到分片错误的IP包的时候,比如某些分片丢失了,并且在规定的时间之内得不到更正,这个时候如果目标主机它是开机的,它就会丢弃这个数据包,并且进行反馈反馈icmp分片重组时间超时的这样一个错误报文。根据我们是否收到这个反馈报文,我们就可以判断目标主机它是否开机。
接下来我们来看一下如何构造超长IP包来探测目标系统内部的路由器。有些攻击方式专门利用IP分片来实施攻击。鉴于此,有些目标系统和路由器会设置一个最大的传输数据包的长度,并且禁止分片,借助这一点,我们就可以发送超长的IP数据包来探测目标系统它的路由器的情况,进而推断目标系统的网络托普。当这个路由器收到超长的数据包之后,它会进行相应的反馈反馈,需要分辨,但是不允许分辨这样的差错报文。接收到这样的报文,我们就可以获知目标系统它的内部路由器,进一步推断它的网络拓扑。
完成了主机扫描,我们就进一步来看一看目标端口开放的情况。我们来看端口扫描,首先看端口扫描的类型,端口是我们传输层的概念,所以大部分的端口扫描都基于TCP连接建立的握手过程与这个连接断开的灰色过程。主要分为如下三类,开放扫描,半开放扫描和这个隐蔽商标。我们来简单看一下TCP建立连接的三次握手过程,这里有两台主机,储能机a储机b主机a作为客户端,主机b作为服务端,首先主机a发起第一次的握手,像主机b服务端发送一个tcpson的报文,son代表同步代表的是我们这个建立连接的一个请求,这个数据包被主机b接收到之后,主机b会对它进行应答,然后同样给他发送一个豹纹,这个豹纹会把这个 Suv和ack进行一个自卫表示,我们同意你的请求,我们对他进行应答。这个报文被主机a客户端收到之后,组件a再发送一个报文,同意建立这个连接,这个三次握手就完成了,后续双方就可以进行TCP的有连接通信了。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pqDbmKwF-1687880215515)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image014.jpg)]
首先我们来看开放扫描,又叫TCP connect扫描,这个扫描的思路很简单,就是尝试与目标主机的目标端口建立连接,如果能够完成三次握手,就说明对方的端口是打开的。具体在实施的时候,我们可以调用socket函数connect对方的目标端口进行连接,如果能够connect成功,就说明对方的端口是侦听状态,否则说明端口是关闭的。下面是示意图,当然我们也可以借助一些工具来自动化的完成这样一个扫描过程。我们再来看一下开放扫描它的优缺点,它优点就是稳定可靠,不需要特殊的权限,但是也是有缺点的。缺点就是跟对方完成完整的删除握手的话,他不隐蔽会被日志记录下来,容易被发现。我们刚刚看到开放扫描它有缺点容易被发现,所以又产生了半开放扫描。我们回过头去看一下三次握手的过程,我们可以发现其实前两次握手完成了,我们就可以断定对方端口的开放情况,所以这个半开放扫描就是我们只需要完成三次握手的前两次,利用这前两次握手,我们来判断对方端口是否开放。看这里有一个图,探测方向,被扫描主机发送一个 s1的探测包,发起第一次握手,如果对方的端口是开放的,处于侦听状态,这个时候它就会进行第二次握手,对第一个包进行一个应答。如果对方的端口是不开放的,这个时候对方就会发送一个rst reset重置的一个反馈。如果对方的端口前面有防火墙进行过滤的话,那这个时候就收不到任何的反馈。通过这种反馈的情况,我们就可以判断对方的端口是否开放。
接下来我们来看一下隐蔽扫描,隐蔽扫描主要有下面4种方式,包括FIN扫描,finish,包括这个 Now扫描,xx扫描,ack扫描。
FIN扫描
NULL扫描
Xmas扫描
ACK扫描
隐蔽扫描主要基于TCP断开连接的4次挥手过程,这里我们简单看一下四肢挥手的过程,这里同样是主机a主机b分别作为客户端和服务端。
首先主机a发起一个断开连接的请求发送TCP包,其中控制为FIN自卫,主机b收到这个包之后对它进行这个响应,然后发送这个 tcpack自卫的这个包。接着主机b再发送一个TCP FM自卫的这个包发起它的这个方向断开连接的这个请求。组件a收到这个包之后,同样对这个请求进行应答,再发送一个包给主机b这个时候双向的连接就断开了,四肢握手,到这儿两个方向上的连接都断开了,4次挥手过程到这儿就结束了。我们来看一下TCP FM扫描。FM代表finish,这个扫描是向目标主机的端口发送 FM字位的TCP包,如果目标主机的目标端口它是关闭的,这个包会被丢掉,并且返回一个are的宝宝。Are Estee代表reset。如果端口是开放的,会简单的把这个包丢掉,不反馈任何的东西。这种扫描方式它的优点就是不包含TCP三次握手的任何部分无法被记录下来,当然也有缺点,缺点就是需要有超级用户或者是授权用户的权限能够访问专门的系统调用,而且这个扫描它适用于UNIX主机,windows主机环境下面它是无效的,不管端口是否开放,操作系统都会反馈 reset。
我们再来看其他的TP隐蔽扫描,首先null扫描,null代表虚无,这种扫描就是像目标主机的目标端口,发送没有任何标志位的TCP包,根据协议,如果目标端口它是关闭的,那这个时候它会硬打一个reset包,对这个发送进行一个自卫,接下来是x上描,这种扫描像目标主机,目标端口发送一个fnurg以及psh自卫的TCP包。同样根据协议,如果端口是关闭的,也会反馈一个rst包 。
Ack扫描是向目标主机目标端口发送一个ack字位的TCP包,根据协议如果目标端口是开放的,它会反馈一个rst包
我们前面看到的扫描都是针对TCP端口进行扫描的,传输层还有一大类协议就是udp,udp的端口如果要扫描的话,就可以采用udp端口扫描。这种扫描就是像目标主机的udp,目标端口发送udp、数据报,如果对方的端口是关闭的,它会触发一个icm端口不可达的插座豹纹,
这种扫描方式它的优点是可以完成对我们udp端口的探测。当然它的缺点就是需要我们系统管理员的权限,而且扫描的结果它是不可靠的,因为udp本来就是一个不可靠的协议,有可能对方给我们了应答,但是这个应答传输过程当中可能会传丢了,而且这种扫描它的速度是比较慢的,有些这个相关的协议草案对这个 smp报文生成的速度作出了限制,
我们前面介绍了端口扫描的技术,接下来我们来分析一下端口扫描的策略,如果不讲任何的策略的话,扫描容易被察觉被发现。端口扫描策略主要有如下几种,
第一种策略随机端口扫描,我们前面讲的这个端口扫描,特别是利用一些工具在进行扫描的时候,可能会大段大段的端口进行连续的扫描,这种扫描方式就比较容易被发现,所以我们可以进行随机端口的扫描,我们随机的选取一些端口来进行扫描,或者按照随机的顺序来扫描一段端口。另外就是我们采用一些工具来扫描的时候,可能会比较快,很快速的扫描的话就比较容易发现,这个时候我们可以适当的扫描的速度降下来,进行慢扫描,
我们还可以进行碎片化的扫描,我们利用这个分片的技术等等,我们来产生一些碎片的这个扫描数据包,单个包来看的话,看不出他是在进行扫描,只有当这些分片重组之后,它才是一个完整的扫描。此外我们还可以进行这个欺骗扫描,用欺骗的IP地址来发起扫描,使对方找不到扫描的发起端在什么地方。我们还可以协同扫描,从多个地方由多个人发起,共同的扫描。
接下来我们介绍两个端口扫描的工具。第一个是n map,它被称为扫描器之王,有for window和for UNIX两种版本,它需要这个 Name pick up或者是when pick up两个基础库的支持,这个工具能够实施普通的扫描,也可以执行各种高级的扫描,还可以进行操作系统的类别之别。这里是使用这个工具的一个示意图,大家可以看一下。我们再来看第二个工具,super sCAn。这个工具是基于windows平台的,它是图形化的界面,操作比较方便,然后速度是比较快的,可以实现傻瓜化的端口扫描。
接下来我们来学习操作系统的识别。操作系统是一个复杂的系统,往往存在大量的漏洞,这使他们成为了攻击者病毒恶意代码的一大攻击目标。不同的操作系统有不同的漏洞,而且不同的版本往往也有不同的漏洞,所以操作系统的识别就成为了我们预攻击阶段的一个常规任务。操作系统的识别主要是通过操作系统当中的协议站的指纹进行识别。我们知道TCP协议有标准化的定义,但是各个厂商或者组织在实现他们各自操作系统的TCP协议站的时候,往往做出了不同的解释和不同的实现。这些独有的特性就被称为指纹。通过这些指纹细微的差别,我们就可以对操作系统以及它的具体版本来进行推断。比如不同的操作系统可能会对下面的4个IP的参数有不同的默认设置。Ttl我们前面提到过的数据包的生命期,不同的操作系统可能会设置不同的初始数据包生命期,还有df字段,要不要分片?不同操作系统可能选择不一样。还有就是tos,服务类型,不同的操作系统的初始设置,这个值也是不一样的。另外还有就是我们TCP的滑动窗口,它的初始尺寸,不同操作系统它的设置也是不一样的,除了刚才我们看到的几种IP的初始设置之外,还有一些其他的操作系统识别依据,比如ack的序号,我们在发送ack应答的时候,不同的操作系统会对这个序号做不同的设置,另外 icmp地址源码请求,不同的操作系统也会做出不同的响应方式,有些操作系统会进行应答,而有些操作系统则不会应答。另外还有就是这个 FM扫描,针对不同的系统,它的响应方式也是不一样的,除了这些之外,还有一些其他的操作系统识别依据,我们这里由于时间关系就不再一一的对大家进行介绍,同学们下来可以自行学习一下。
我们来学习漏洞扫描。漏洞扫描是基于漏洞数据库,对指定的远程或本地计算机系统的安全脆弱性进行检测,发现是否存在可利用漏洞的行为,包括网络漏扫、主机漏扫、数据库漏扫等不同种类。
漏洞扫描它是一把双刃剑,网络管理员能够通过漏洞扫描,了解系统网络和应用服务的安全状态,及时发现安全漏洞,客观评估我们系统和网络的风险等级,而攻击者也能够借助漏洞扫描,发现攻击目标的漏洞情况,进而进行这个攻击的决策,以便发起漏洞利用攻击。
接下来我们看漏洞扫描的方法,漏洞扫描方法可以使用漏洞库、匹配法、模拟黑客攻击法以及使用漏洞工具,漏洞库匹配法是基于获取的漏洞库,把其中的漏洞与扫描目标进行一一的匹配,看有没有命中的,模拟黑客攻击法就是模拟黑客攻击的手法,对扫描目标进行漏洞利用攻击。比如我们下面可以看一看,配置错误漏洞的话,我们可以尝试使用这个 Ipc命名管道攻击,去看一下是否存在相应的漏洞。然后针对一些应用的话,我们可以采用一些Unicode攻击方法去尝试一下。然后针对缓存溢出漏洞的话,我们可以发起一些相应的缓冲区溢出攻击,如果系统有没有拒绝服务漏洞,我们可以发动一些拒绝服务攻击去尝试一下。如果怀疑我们系统是否存在弱口令的话,我们可以尝试进行这个口令猜测或者暴力破解。
我们再来看漏洞扫描工具法,漏洞扫描工具就是利用漏洞扫描工具来实施这个漏洞的扫描,漏洞扫描工具有很多类型,比如有网络设备的漏洞扫描器,比如Cisco的审计工具,还有集成化的漏洞扫描器,比如说Nessus,还有Shadow Security Scanner 以及Internet Security Scanner等等这样一些工具。另外一类就是web扫描软件,比如IBM的appscan
,还有比如Acunetix 的web漏洞扫描工具,还有就是数据库漏洞扫描器,比如ISS 的Database Scanner,还有就是oracle的数据库扫描器oscanner。
接下来我们就重点看几个工具的简要情况,首先nephew,这个工具它是一个CS架构的工具,有客户端,还有服务端,客户端连接服务端,下载插件和相应的扫描策略,而真正的扫描是由服务端发起的,客户端服务端它通过加密通信,这个工具它的优势是具有强大的插件功能,然后是完全免费的升级快速。这里是这个工具的一个界面,
这是国产自主开发的xx,它也是一个免费的一个工具,相对来说比较古老,缺乏维护,这个是它早期的一个操作界面。这是IBM的APP sCAn,它是web扫描工具,这是它的一个程序界面,如果大家对web的安全比较感兴趣的话,可以去尝试一下这个工具。最后是这个 Arctics的web安全测试软件,它也是一个图形界面的软件,大家也可以尝试一下。
前面我们介绍完了预攻击阶段,接下来攻击者就要进入攻击阶段了,攻击阶段的攻击手法也很多,但是往往攻击者会首先去获取权限。攻击者在获取权限的时候,往往首先获取一个一般的权限,然后获取一般权限,往往攻击者会采用比如说社交工程攻击,骗取一般用户的账户或者口令,或者设法盗窃账户文件,然后进行破解,获取某一个用户的账户和口令。另外还可以利用某些工具或者系统漏洞登录到主机上面来,直接获取操作权限。一般用户的权限是比较受限的,攻击者在目标主机上面能够执行的操作有限,所以很多攻击者会进一步的提升权限,或者直接去获取目标主机的管理权限,这个也是很多攻击者的终极目标。要获取目标主机的管理权限可以有如下几种途径,第一种是直接获取管理员的口令,比如进行口令的猜测,暴力破解口令文件或者发起社会工程攻击去欺骗管理员。另外,还可以利用系统管理安全的漏洞,比如错误的文件访问权,错误的系统配置,或者某些缓冲区溢出漏洞等等,通过这些手段来获取管理员的权限。另外还可以通过安装置入特洛伊木马来窃取管理员的口令。
刚才我们介绍了在攻击阶段,攻击者如何来获取权限,提升权限,获取完权限之后,攻击者就要实施具体的攻击了,具体的攻击可能有各种各样的类型,我们在后面的章节会陆续的对他们其中的一些重要的攻击进行介绍。这里我们就进入到后攻击阶段,看一下攻击者们如何清扫战场。后攻击阶段,我们攻击者的一旦任务就是藏匿自己的行踪,攻击者的在系统当中的行为或者活动往往会被系统记录下来,这个时候就要清除日志,然后删除拷贝的文件,有可能攻击者会在目标主机里面去下载拷贝一些文件,要把这些痕迹清除掉,操作系统不管是Linux还是UNIX,还是windows,都有相应的日志的存放机制和相应的位置,大家下来可以查阅一些资料去把这些日志找到去看一看。另外攻击者在进入我们目标机之后可能会启动一些相应的程序进程,我们这个时候攻击者还需要把这些进程给隐藏起来,另外可能攻击者还会在目标主机上发起一些对外的连接,这个时候需要把这些网络连接也隐藏起来。
有时候攻击者可能不具备去删除我们日志的这样一些权限,这时就可以退而求其次,通过修改系统时间去造成这个日志文件的紊乱。攻击者可能还需要删除在系统当中的一些中间文件,或者删除在系统当中自己创建的一些用户。
我们前面看到攻击者要突破或者拿下一个目标系统,它要经过很多技术的和非技术的手段,比较耗费时间和精力,所以很多攻击者在突破一个系统之后会放置后门,以方便下一次可以直接的比较顺利的进入到系统。通过后门,攻击者还可以监视用户的行为隐私,然后远程的控制用户的主机。
后门放置的方式要看攻击者是否已经把这个系统给成功的入侵了,如果成功入侵的情况下,面攻击者可以添加用户,在系统里面添加一个自己的用户,下一次就可以通过用户密码登录系统,或者可以修改系统的登录程序或者修改相应的配置。通过这些修改后的程序和配置,也是可以快速的绕开系统的安全防护,然后快速的登录到系统当中来。如果攻击者还没有成功入侵的话,这个时候也可以放置后门,比如说利用系统的漏洞,然后通过远程自入的方式或者诱骗目标系统去执行一些恶意代码通过恶意代码来窃取系统的这个呃账户口令等等,进入到系统当中去。
接下来我们来介绍一下网络嗅探。网络嗅探是监视网络的流量状态,数据等信息,然后进一步的分析数据包,从而获取有价值的信息。获取的信息通常包含口令账号,一些机密的或者敏感的数据和信息,还有就是可以通过网络嗅探来进行我们前面介绍过的业务流分析。
网络嗅探要分网络环境,当前主要有两种网络环境,一种是共享式的网络环境,通过harbor极限器连接的网络,另外一种是交换式的网络,通过交换机来组建的网络。网络嗅探是局域网范围内的攻击方式,具体的攻击技术又跟具体的网络环境相关,早期的网络通过Hub极限器来连接网络,是一种共享式的网络,今天的网络主要是通过交换机来组建的,是交换式的网络,这两类不同的环境,它的网络嗅探技术是不一样的,我们下面分别来看一下。共享式网络通过Hub组件极限期来组网。它是我们物理层的一个中继器,它的功能单一,主要就是放大信号、延长网络的距离,它没有载波监听和碰撞检测,就意味着当网络当中有多个节点,同时在发送数据的时候会产生碰撞,而Hub无能为力,从而造成通信的效率比较低,因为冲突多了,大家就只有重传了。在工作的时候,它将从一个接口接收到的数据,简单的广播到其他的接口上面,从而就形成了广播,就意味着一个主机发送的数据到网络当中,会被所有其他主机的网卡都增添到。这里有一张Hub组件的共享是网络的简单示意图,中间是Hub,它有4个网络接口,分别连接了ABCD4台计算机。假设主机a要发送一个数据到主机d这个时候,它发送的数据包就进入了Hub的与a连接了一个接口,这个时候Hub就简单的把这个数据包从这个接收到的接口把它复制广播到其他所有的接口上面。这个时候除了地主机可以侦听到a发送的数据包之外,b和c他也可以增添到这个 a主机发送的数据包,这就是广播。
我们来看一下共享式网络环境下面监听的原理,我们刚才提到共享是网络当中所有的主机的网卡,它都能够增添到网络当中的所有的数据增。举个例子,假设我们身处一个大的一个房间里面,有很多人在各自聊天说的话,这个时候只要声音足够大的话,我们每一个人都可以听到其他所有人的讲话。普通模式下面的话,网卡只接收发送给自己的数据增,就好比刚才那样一个场景当中,我们每个人可能只接收跟自己相关的这个谈话,而其他人的通话虽然我们听到了,但是我们并没有往心里去,如果在共享式网络环境下面要实时监听的话,这个时候就可以把自己的网卡设置为混杂模式,混杂模式网卡会将所有增添到的数据增,然后都把它接收下来,然后交给上层协议站去进行解析和解读。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pQvuyZlo-1687880215515)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image016.jpg)]
攻击者将它的网卡设置为混杂模式之后,它就可以来实施网络监听了,实时网络监听可以手动的,也可以自动的。手动就是基于pcap之类的网络抓包函数库,手动编写程序来抓包并进行解析。另外可以利用一些自动化的工具,比如说sniffer、wireshark等工具自动抓包和解析。
harbor主网的共享式网络,今天已经不多见了,今天主要是交换机组件的交换式网络,我们来看一下交换机以及交换机组件的交换式的网络,交换机工作在数据链路层,它的内部维护一个MAC地址到端口的映射表,又叫做交换表。这里有1个示意图,这个图当中有一台交换机,有6个接口,分别接入了A、B、C、A’、B’、C’、6台计算机,这有一个交换表的示意图,从这个图当中我们可以看到,主机A接入到交换机的一号端口,主机B接入到交换机的二号端口,C接在三号端口等等。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-al3CkgJg-1687880215515)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image018.gif)]
交换机在工作的时候,接到数据帧之后查表来转发这个帧,例如A主机假设要发送一个数据帧到A’主机,这个时候我们交换机从一号端口接收到这个数据帧之后,它就把这个帧当中的目的MAC地址,也就是A’的MAC地址来查表,通过查表发现A’是接在交换机的4号端口上面,所以交换机就把这个数据帧直接转发到4号端口。交换机采用端口到端口的转发方式,而不在广播就使得不同的端口它可以同时工作工作效率更高。比如我们这个示意图当中,我们A到A’可以通信,同时B到B’也可以通行,他们这两个通信是不冲突的,因为它不在广播,在这样一个交换式的网络环境当中,由于不在广播了,所以就不容易嗅探了。
接下来分析一下交换机的交换机词,交换机的核心是交换表,可以说交换机是表驱动的,交换表有若干的表象,每一个表象是我们交换机接入的主机的MAC地址跟对应的接口的映射。另外交换表空间有限,所以为每个表现设置了一个TTL,生命期过期之后就要被删除掉,或者用新的表象去替代旧的表象。交换机的交换表如何来构造,并不需要我们进行设置或者填充,而是交换机自学习。初始的时候交换表为空,交换机按照harbor的方式来工作,也就是说收到一个数据帧,然后就把它广播到其他所谓的端口上面。当交换机接收到一个数据真实,这个时候交换机就要记录这个数据帧的、源MAC地址跟对应的接口,然后把它作为我们交换表的一个表象填到交换表里面去。在示意图当中,假设A主机发送一个数据帧到交换机,这个时候我们交换机收到这个数据帧之后,它就把这个数据帧的原MAC地址,也就是我们主机A的MAC地址,以及主机A接入的我们交换机的端口,这两个信息记录下来,然后添加一个TTL把它填到交换表里面来。这就好比我们在使用手机的过程当中,我们要生成一个通讯录,假设我们最开始的时候这个通讯录是为空,这个时候有人给我们打电话,告诉我们我是谁、电话多少,那这个时候我们就把这个通信者添加到通讯录当中去,那随着我们接收的电话越来越多,我们就逐步的把这个通讯录建立起来。
刚才介绍了交换机的工作方式,接下来我们看一下在交换式的网络环境当中如何来实时监听,我们刚才看到了,在正常情况下面交换机是通过查表来工作的,也就是说交换机在收到一个数据帧之后,就把这个数据帧它的目的MAC地址来查询它的交换表,如果查表命中了,有一个对应的选项,这个时候就按照这个查询出的这个结果把这个帧转发到对应的交换机端口,如果查表没有命中的话,交换机它并不会把这个数据真就直接丢弃了,而是怎么把这个数据增采用Hub的方式广播出去,要让这个数据帧继续往前走,要进行传输。如果接收到的数据帧是一个广播帧,那就直接广播出去。在交换式网络环境当中来监听的话,实质上就是要让本来不应该到达本地的数据帧到达本地,可以采取如下三种方式:第一种方式是利用交换机的镜像功能,有些交换机具有这个镜像功能,它有一个专门的镜像端口,镜像端口就是所有的其他端口上面的数据都会在镜像端口上面进行复制,也就是说只要你介入到镜像端口,你就可以接收到所有交换机其他端口上面的数据,这个就可以实现监听了,把所有的端口的数据都可以接收下来。第二种在交换式网络环境当中,实施网络监听的方法就是交换机读化工机。我们看这个示意图,假设B撇就是攻击者,正常的工作模式下面交换机通过查询交换表工作,也就是说发送给主机A的数据帧,交换机就只把它交到A接入的端口,发送给主机B的数据增,我们交换机就只发送到B的接口,这个时候B撇攻击者他是收不到发送给A和B的数据,这个时候它如何来实施监听。这个时候攻击者就可以对交换机实施毒化攻击,把交换机的交换表给它污染,让它的表成为一张无效的表,无效的表我们交换机在工作的时候,收到一个针去查询的时候就不会命中,在不会命中的情况下面,交换机刚才讲了,它查表未命中的话,它就会退化成我们HUB的工作模式,把这个数据增进行广播,广播就好办了,本部应该到达攻击者的数据包都被广播了,都会到达攻击者的网卡,这个时候攻击者就可以实施网络鉴定了。第三种监听方式就是利用ARP欺骗,我们下面再看利用ARP欺骗。这里再来具体的分析一下这个交换机毒化攻击。我们刚才讲交换机的交换表它空间是有限的,所以交换表象它会有一个生命期,时间一到,它就会失效被删除。另外的话,新的表象会替代旧的表象,交换机的毒化攻击就是攻击者发送大量具有不同伪造原MAC地址的帧,然后让交换机去自学习。也就是说交换机收到这些经过伪造的数据之后,他会来学习,把这个伪造针里面的MAC地址跟这个端口的映射,把它填充到交换表里面去。因为发送了大量的,而且不同的语言MAC地址的真这个时候这些真就会把整个交换表完全的填充,把原来有效的交换表给替换掉。毒化攻击后,交换机的交换表它就无效了,因为他的表象全都是伪造的MAC地址跟端口的映射。这个时候交换机在工作的时候查表他就自然是没办法命中的,交换机完全退化成广播模式,跟Hub主网一样,在这种模式下面,攻击者要来实施监听就非常容易了,跟前面一样设置混杂模式,然后手动或自动来抓包再来解析,就可以了。
我们刚刚提到交换式网络环境下面还可以实施ARP欺骗攻击来实现网络监听。接下来我们就来看一下如何来进行ARP欺骗网络监听。我们在前面计算机网络基础当中提到,互联网络主要是有两层裙子,IP地址和MAC地址,IP地址是逻辑地址,主要用于远程的路由,MAC地址是网络接口的地址,主要用于在局域网范围之内的数据帧投递,我们这儿可以做一个类比,IP地址可以类比作单位名称,比如电子科技大学这个名称也可以作为一个地址,我们在收发邮件收发快递的时候,用电子科学大学作为地址,有些情况下面也是可以进行这个投递的。另外我们学校也有它具体的物理地址,比如建设北路二段4号就是我们沙河校区的地址,这两层地址通过地址解析协议ARP来实现映射和绑定。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3Uer63GB-1687880215516)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image020.jpg)]
这里有一张示意图,我们可以看到在这个局域网当中我们有几台主机,每台主机有两个地址,IP地址用于远距离的路由选路,然后MAC地址用于在局域网范围之内的寻址。ARP协议实现IP地址到MAC地址的映射和绑定。当我们在发送IP数据包的时候,要把它交到下层数据量层封装成真,这个时候我们就需要去根据目的IP地址查询对应的目的MAC地址,然后如果每一次封装真的时候都来查询的话,效率会比较的低下。这个时候每个节点实质上它都会有一个ARP表,也就是 ARP缓存,它会缓存邻居的IP和MAC地址的映射,类似于交换机的交换表,这个表象就是IP地址加上MAC地址,还有一个TTL时间,这个是表示我们IP和MAC地址映射的一个有效时间,典型的数为20分钟,这个表也是通过自学习建立的,一方面通过这个 ARP、查询,查询完了之后,我们就把这个对应的IP和MAC的绑定关系添加到ERP表当中去。另外就是我们进行旁听,在局域网范围之内,如果有其他节点,他在发起ARP的查询或者收到了应答,我们如果旁听到的话,也把它添加到ARP表里面去。大家在自己的主机上面,如果在命令行提示符下面,我们可以敲入ARP这个命令,然后可以看一下自己当前主机的ARP缓存是什么样的。比如下面这个这个框,我们可以看到我当前主机,我的ERP缓存有两条记录,分别记录了两个邻居节点,他的IP地址和他们的MAC地址。
说到ARP欺骗,我们首先来看一下ARP协议的工作过程。我们前面讲了TCPIP协议的数据包封装过程,当一个节点在发送数据的时候,当这个数据到达了网络层我们网络层,封装好了IP数据包之后,就要把它交到数据链路厂去封装成真。这个时候发送节点,首先它要根据数据包的IP地址来判断一下这个目的节点他是否跟自己在同一个网站,它可以根据IP地址与指望野马来做一个计算,就可以判别这个目的方跟自己是否在同一个网段。如果是在同一网段的话,这个接收方就是自己在局域网当中的邻居,这个时候就需要这个接收方他的MAC地址来作为真的目的MAC地址。这个时候我们发送方就可以首先检查一下自己的ARP缓存,来查询一下这个邻居他在不在我的ARP缓存里面,如果在的话,我们就直接把缓存里头这个邻居节点它的MAC地址拿出来,直接封装成帧发送就好了。如果查询ARP缓存没有命中,那这个时候怎么办?发送方它就可以发起一个ARP请求,然后询问一下谁的IP地址是我当前这个要发送的目的IP地址,让大家来报告一下。这个请求它是一个广播方式发送的请求,目的节点收到这个请求之后,它就会进行相应的一个应答,报告一下自己的MAC地址是多少,报告给发送节点。同时这个目的节点在收到这个请求的时候,除了报告他还,会把自己的ARP表更新一下,把这个发送方的IP以及它的MAC地址做一个更新或者添加,而发送方在收到这个应答之后,它就可以获取目的节点的 MAC地址,然后同时把这个目的节点刚才返回的这个 Mac地址添加到自己的ARP表里面去,如果没有收到这个应答的话,那说明目的节点可能不在这个网络当中,这个时候传输就失败了。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dMo2PTUN-1687880215517)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image022.jpg)]
另外一种情况,如果经过刚才的计算,发现这个目的方不跟自己在同一个网段,那这个时候这个数据就需要发送给网关,同样我们可以采用刚才的过程再来查询网关的MAC地址,如果查询ARP命中我们就直接封包,不行的话,我们就再来发起一个ARP查询,然后去查找网关的MAC地址,然后再来进行传输。接下来我们通过这样一个简单的事例来说明一下刚才讲解的ARP协议工作方式。在这样一个简单的局域网当中,网关下面有4台主机,假设这个时候 IP尾段为101的主机,想要跟 IP尾段为102的主机进行通信,但是没有102它对应的MAC地址。这个时候根据协议,首先101它会发起一个广播的查询,询问一下谁的IP是尾号为102的,这个广播就会把它发送到网络当中,所有的节点包括网关都能够收到这个广播查询。这个广播发送完了之后,尾号为102的主机就收到了这个广播,发现是在查询他的MAC地址,这个时候它就会生成一个应答,然后直接发送给101。01收到这个应答之后,就会根据应答的信息把我们102的 IP地址跟他的MAC地址添加到他的ARP缓存当中。同时其他的网络节点由于都收到了刚才101的广播查询,所以他们也会把101的IP和它的 MAC地址都刷新到自己的ARP缓存当中,以便后面再来使用。这里就是我们 ERP协议工作的一个简要过程,我们刚才看了ARP协议的工作过程,ARP欺骗是如何实现的?这里我们就来分析一下ARP协议它存在的问题,ARP协议它是通过广播请求单播应答的方式来实现的,广播请求我们刚才看到全部的接收者都会更新或者添加关于发送者的ARP表象,也就是说这个其他的广播请求的接收者会把广播者他的IP地址以及他的MAC地址作为表象,刷新到自己的ERP缓存当中去。
举个例子,比如说在一个群里面,忽然有个人跳出来说我是你是,我的电话是多少,实质上它是一个假的理事,这个时候所有其他人收到这条消息,就会把这个假的李四跟这个他的电话号码存起来,如果我们要跟李四打电话的话,可能就会打到这个假的李四的电话手里面去,造成欺骗。这个广播请求如果我们这个查询方他发送的ARP请求当中携带的是错误的pd值,这个时候就构成了欺骗,就污染了大家的ARP缓存。我们再来看应答,ARP的应答是单波应答它是无状态的,无状态就是说这个请求和应答之间并没有明显的对应关系,甚至可以是无问自答,也就是说当前没有节点在查询的情况下面,节点可以主动的来进行应答,这个信息也会被认为是有效的信息。还可能出现张冠李戴,本来是在查询 B组机的MAC地址,结果这个时候 C组机可以出来应答,然后把自己的MAC地址报告给查询方,这个时候就会造成查询方误认为这个 C主机就是B主机,这就造成了欺骗。
这里我们通过一个简单的事例来看一下ARP的欺骗过程,这是一个简单的局域网,网关上面有两台主机A和B。正常情况下面主机要跟外网进行通信,它的所有的数据流都会经过网关进行转发。假设在这个网络当中A主机是攻击者,A主机想要监听我们B组机的全部的通信,这个时候 A主机就可以直接给B主机发送一个ARP应答报文,把网关的IP地址也就是10.0.0.1与自己的MAC地址发送给主机B。主机B收到这个应答ARP报文之后,就把这个报文当中对应的 IP和MAC更新到自己的ARP缓存,这个时候主机B它就会误认为A主机就是它的网关,后续他就会把所有的数据包都发送给这个假网关让假网关,帮他进行路由转发,这个时候就构成了ARP欺骗,A主机就可以实现对B主机通信的监听。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WMi0fJyu-1687880215518)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image024.jpg)]
接下来我们来了解一下另外一种典型的网络攻击方式,拒绝服务攻击。
有一个事例,前些年听说有一个软件,叫做“忽视你”。通过这个软件可以不断给用户的手机打电话,让用户的手机没办法正常的接听,这个时候就造成了对该手机用户的拒绝服务。拒绝服务攻击是攻击者使用某种手段让目标主机或者网络停止向合法用户提供正常的访问或者服务。
拒绝服务的目的通常有如下三种:
第一种是破坏组织的正常运行,这个可以用于打击竞争对手,把同行业的竞争对手干垮了,这个时候自己的服务就可以得到更多的用户。
第二类是瘫痪服务器,以便黑客冒充我们前面介绍的 DNS欺骗攻击,我们攻击者如果要去假冒DNS服务器的话,可能首先需要把真正的服务器攻击到,才能更好的去冒充。
第三类是启动木马,我们攻击者在安装了木马之后,必须要把木马启动起来,它才能够去破坏去攻击。这个时候怎么样来启动目标主机,常用的一种方式就是通过拒绝服务攻击去把目标主机给强制重启。
我们接下来看一下拒绝服务攻击的基本模式拒绝服务攻击有多种模式。
第一种是资源,耗尽型就是消耗资源,信息系统当中有很多资源典型的网络带宽、磁盘空间和CPU内存资源等。网络带宽资源攻击者有意的制造大量的数据包或者传输大量的文件,消耗有限的网络带宽,致使合法用户无法正常的使用网络。第二类消耗磁盘空间,攻击者在短时间内制造大量的垃圾数据,急速的消耗存储资源,使系统和用户因没有磁盘空间而停止工作。
还有消耗CPU和内存资源,利用系统存在的缺陷,过度的使用CPU,内存资源,导致系统的服务性能下降,甚至造成系统的崩溃。
我们再来看配置修改型,拒绝服务,计算机系统包括网络,如果配置不当的话,可能会造成系统网络没法正常的运行,攻击者可以通过改变或破坏系统的配置信息,阻止合法用户使用计算机系统或者网络。
漏洞或策略利用型拒绝服务,它们可以利用目标系统或通信协议的漏洞,或者是安全策略来实施拒绝服务攻击。很多系统的登录都有相应的策略限制用户的登录次数,或者说试探次数,以避免攻击者对用户进行口令猜测,这个时候攻击者就可以利用这个策略来实施对用户账户的拒绝服务,有益的输错口令,导致系统锁定用户的账号。
还有一种物理实体破坏型的拒绝服务,它是通过破坏或者改变系统或网络部件实现拒绝服务。例如,物理临近破坏计算机,路由器,网络配线时,主干网段的电缆电源冷却设备等等。
下面我们来介绍几种典型的拒绝服务攻击,包括land pin of death,tear drop,Sean flood。
首先我们来看NAND,又叫自我手攻击,是向目标主机发起一个特别的TCP连接请求,也就是发起一个三次握手的第一次握手。它结合了一个IP欺骗,把受害者的IP作为这个请求的源IP,所以该请求就会造成目的IP和原IP是相同的情况。这会导致目的主机向自己发送这个应答,形成第二次握手,这个第二次握手又来进行应答,产生第三次握手都是跟自己在握手,从而创建一个空的连接。这个空的连接后续由于没有这个正常的通信,也自然没有一个主动的断开连接的请求,所以每一个这样的连接都会被保留到超时。这里有一个示意图,一张小狗在追着自己的尾巴空耗体力,这个就好比是我们这个 land攻击自己跟自己握手,然后消耗网络资源。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tdhdCnHs-1687880215518)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image026.jpg)]
这个攻击的影响会造成许多UNIX系统崩溃,而windows系统往往会变得极其的缓慢,大约会持续5分钟。
我们再来看ping of death又叫做死亡之聘,许多早期的操作系统版本会限制网络数据包的最大长度,比如说tcpip协议,它的IC MP包最大为64KB这个64是IP包的头部当中的认识字段来制定的认识字段两个字节正好16位,最大值就是65535。我们来看一下IP分片的示意图,当IP数据包的数据部分比较大的时候,我们就可以把这个数据部分分成若干个分片,每个分片携带一个独立的IP、包头,除了进入这个原目的IP地址之外,还要记录这个分片在整个数据部分它的偏移量以及这个分片的长度,以便我们接收端收到这些数据包之后进行这个重组ping of death攻击,它会改变我们最后一个分片的正确偏移量和这个段长度,造成我们接收端在重组这个分片报文的时候,总长度超过64KB,从而导致内存分配错误。整个TCP协议站崩溃时机。
Tear drop,又叫类d这个攻击是向攻击目标发送多个分片重叠的IP包,它也是利用IP分片,某些操作系统在收到分片重叠的IP包时会崩溃和重启。例如有一个40个字节的数据报,被分成了两个分片,第一个分片发送036个字节,正常情况下面第二个分片就应该是剩下的3739这几个字节,这个时候错误的分辨。第二个分片发送24~27个字节,在某些情况下面,这个重叠的分片就会破坏整个IP协议站造成系统的重启。
接下来我们来看一下Sean flood的攻击,这个攻击会结合IP欺骗,攻击者会伪造大量的IP地址,然后向受害者发起三次握手的第一次握手,发起一个s弯的请求,受害者收到这个第一次握手请求之后,他就会进行应答,发起第二次握手。由于我们这个请求的原ip地址是伪造的,所以受害者自然等不到第三次握手。这个时候受害者他会以为我们第二次握手被网络传输传丢了,这个时候它会等一个比较短的时间片,比如说第一次三秒,然后再来重传这个第二次握手的硬大包,自然这个应答也是不会得到响应的,这个时候受害者会把等待时间加倍,如此循环5次,大概我们这个受害者会等待98秒的时间。如果有大量这样的请求,受害者会维持很多这样的半连接,每个连接都会耗时大概98秒,这样就会造成受害者大量的网络资源消耗,从而造成拒绝服务。
我们再来看Smurf反射攻击,这种攻击会找出网络当中会回应我们ICMP Echo request的路由器,然后以受害者的IP,像路由器广播地址发送ping包,也就是发送 icmpa口request请求包,实际上就是假冒成受害者向路由器发送这个请求路由器会广播这个 Ping包,把它广播到对应的词网,对应值网当中的主机收到这个聘广播的设备,他们会同时向这个受害者进行应答,这个时候大量的应答会同时的到达受害者,从而将受害者他的网络带宽耗尽,把它淹没,造成拒绝服务。
刚才介绍的几种典型拒绝服务攻击的防御方法的特征是比较明显的,相对来说防御起来也比较的容易,烂的攻击可以通过打补丁的方式加固协议战,也可以在收到数据包的时候,我们做一个比对,我们丢弃源和目的IP地址相同的这些包,ping of death我们可以通过打补丁,也可以通过防火墙来进行拦截。Teardrop也是一样的,我们可以加入一些条件判断,我们来判断一下是否存在 IP分片错误的这些包,然后把它给丢弃,然后也可以打补丁加固血液站。Smurf是利用广播利用反射,这个时候就可以拦截广播,从而拦截这种攻击。Sean Flood的拦截来说相对比较困难,因为他发起的攻击包每个包单个来看的话,它就是三次握手的第一次握手一个连接建立的请求,这个是不太具有明显的攻击特征的。针对这种攻击,我们往往会提高受害者或者被攻击一方它的抗击打能力,让它能够消化更多的攻击流量。
接下来我们学习一般的拒绝服务攻击的防御策略。对于网络而言,我们可以配置路由器和防火墙,减少拒绝服务攻击的危害,还可以部署入侵检测系统,及时的检测异常行为。对系统而言,我们可以升级系统内核,打上必要的补丁,然后关掉不必要的服务和网络组件,如果有些配额功能的话,我们要进行正确的设置,同时我们还要监视我们系统的运行,避免降低到这个极限以下,然后检测系统配置信息的变化。我们还要保障我们物理上面的安全,然后建立备份和这个合理的恢复机制,以便在系统被攻破的时候我们进行恢复。
接下来我们介绍 DDOS。分布式拒绝服务攻击拒绝服务攻击,它是一对一的一种方式,早期它的效果比较明显,但是随着攻击目标抗击打能力的提升,对恶意攻击包的消化能力加强,拒绝服务攻击他的困难程度逐渐加大。特别是计算机的处理能力增强了,内存增加了,网络带宽提高了,比如攻击软件,如果每秒能够发送3000个攻击数据包,目标主机或者网络带宽每秒可以处理1万个攻击包,这样一来这个攻击就产生不了什么效果。普通的拒绝服务攻击,它的攻击效果越来越差,所以后来就发展出了DDOS攻击,分布式拒绝服务攻击。这种攻击会入侵并控制若干存在安全漏洞的计算机,作为傀儡和肉鸡,把他们联合起来作为攻击的平台,形成僵尸网络。我们前面讲过的导致半个美国掉线的僵尸网络,有数千万个 IP节点。分布式拒绝服务攻击往往采用客户端服务器的模式及技术,在肉机上面安装代理程序,而攻击者安装主控程序,攻击者通过主控程序与这个肉鸡上的代理程序通讯,然后发起攻击指令,操纵这些大量的傀儡主机,同时对一个或多个目标发动拒绝服务攻击。这个主控程序能够在几秒内激活,成百上千个代理程序运行,成倍的提高,拒绝服务攻击的为例。
分布式拒绝服务攻击的过程可以分为两大步骤,
第一是发展团队,攻占代理主机,探测扫描大量主机,以寻找可以被入侵作为肉鸡的主机。第二步就是入侵这些具有安全漏洞的主机取得控制权。
接下来是协同向目标发起攻击,安装攻击所需要的客户竞争或者守护竞争,然后通过主控端向这些客户进程发起命令,操纵这些代理主机进行协同的攻击。
今天很多黑产链以及暗网当中也在售卖成型的江苏网络,只要去购买或者租用这些僵尸网络,就可以发起分布式拒绝服务攻击。
这里我们来简单看一下分布式拒绝服务攻击的简单示意,攻击者首先去发展大量的傀儡主机,然后去安装这个代理程序,接下来攻击者就可以向攻击代理发送指令,让他们同时向目标系统发起攻击,发送大量的比如虚假的连接请求,消耗攻击目标的资源,造成他的拒绝服务。分布式拒绝服务攻击有很多工具,这里我罗列了几个同学们下来可以自己去学习一下,分布式拒绝服务攻击的防御是一个难题,我们可以采用本地防御,通过分布式集群加负载均衡,我们部署多台服务器形成集群,然后提升节点的攻击承受力,如一个节点受攻击,无法提供服务,系统可以自动的切换到另外的节点。另外我们还可以进行异常流量的清洗,我们不熟分布的拒绝服务硬件防火墙来清洗异常流量。还可以使用高仿智能的DNS解析服务。智能的根据用户的上网线路,将这个DNS解析请求解析到用户所属的网络服务器,分担服务器的压力。另外,还可以用它当机检测,随时将瘫痪的服务器智能的更换到正常的服务器。我们还可以租用第三方的云清洗服务,通过第三方的服务,把 Dns攻击的流量进行一定程度上的清洗,从而缓解他的攻击压力。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sOvHH8YZ-1687880215519)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image028.jpg)]
这一节我们来介绍缓冲区溢出攻击,缓冲区溢出攻击是最大的网络安全威胁之一,大部分的网络蠕虫都是利用缓冲区溢出进行攻击和传播的。比如1988年莫里斯从就是我们世界上第一个利用缓冲区溢出进行的攻击。生活当中也有缓冲区溢出的例子,比如我们大家使用的水杯水桶都是用来装水的缓冲区,如果我们在装水的时候,不管水杯水桶的容量而装入超出它容量的水的话,就会产生溢出,打湿桌面地面和衣物造成破坏。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-a0Gl2p0M-1687880215520)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image030.gif)]
接下来我们首先看一下缓冲区溢出攻击的相关概念。首先缓冲区是我们程序用于保存用户数数据临时数据的内存空间,通常是在我们程序的堆栈当中分配的函数的局部变量数组等。
缓冲区通常是我们在编程的时候程序员预先分配,然后当程序运行起来之后,我们再来使用这些缓冲区在里面存取数据。缓冲区溢出漏洞就是程序不对,输入的缓冲区,数据的长度做限制,这个时候超出的数据就会覆盖程序,为其他数据分配的内存空间造成溢出。缓冲区溢出最常出现在C、C++编写的程序当中,成因主要有两个,一个是这两个语言,他们让程序员自己来管理内存,程序员往往安全意识比较淡薄,总是假设我们缓冲区当中输入的数据长度与我们缓冲区的空间是相匹配的,不会溢出。第二个原因就是历史遗留问题,我们今天的网络信息系统当中还包含了大量的历史遗留代码,他们仍然在发挥着作用,这些代码在编写之初,那个时候计算机的内存资源是比较匮乏的,程序员为了节省内存资源,压缩程序代码,部编写对输入缓冲区的数据长度做匹配和限制的代码,从而造成了缓冲区溢出的漏洞。
这里我们来看一个简单的缓冲区溢出事例,这儿是一个c语言的简单程序,程序当中首先定义了1个8个字节的str字符数组,接下来又定了一个叫input的有256个字节的数组。再接下来用get这个函数从键盘输入了一个字符串到input当中,接着用str copy串拷贝函数,把我们input当中刚才输入的字符串把它复制到str这个串当中,然后程序结束了。这个程序我们运行的时候,如果输入的字符串长度是小于或等于8个字符的,这个时候这个程序运行是没有问题的。把这个程序运行完,并且输入了超过8个字符的字符串,这个时候会发生下面这个现象,程序停止工作,这个就是造成了缓冲区溢出,并且让程序崩溃。我们来分析一下为什么会产生这个原因?我们这个程序代码当中定义了两个缓冲区str跟input,我们在input当中装入了字符串之后,然后用串拷贝string copy这个函数,把input当中的字符串把它装到str这个缓冲区当中。由于str只有8个字符,而这个始终copy这个函数,这个 String copy函数在进行字符串复制的时候,它不检查这个原创input的长度跟我们目的串str的长度是否匹配,是否超出直接往里面装数据。当这个原创的长度超过目的串的这个容量的时候,就造成了缓冲区的溢出,从而污染内存,造成程序崩溃。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UHkhgyJK-1687880215520)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image032.jpg)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5QDYjY7c-1687880215520)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image034.jpg)]
接下来我们来说一下缓冲区溢出攻击,缓冲区溢出攻击是利用目标程序当中的缓冲区域出漏洞,然后向这个缓冲区当中写入超出其长度的内容,造成缓冲区溢出,从而改变程序的执行流程,跳转执行其他的代码或者程序。缓冲区溢出攻击,它的攻击效果可以分为两个层次。一个层次就是我们刚才看到了一个事例当中的破坏程序的堆栈,让程序终止运行,产生一个拒绝服务的效果。这个是超出的这个部分,它会写入或者覆盖我们程序堆栈当中的其他的空间,然后破坏程序的堆栈,然后使程序崩溃。第二个效果就是在第一个效果的基础之上,然后使程序发生一个跳转,或者叫做重定向到其他的指令,主要是通过溢出来改变函数的返回地址,让其指向其他的指令或者恶意代码,比如说指向这个注入的CFO的,然后获得系统的这个操作权限。什么是c2CAll的?Cea kod是一个软件漏洞,利用代码,经常让攻击者获得一个县而得名。这个线是一个交互式的操作界面,我们在使用windows的时候,我们敲入cmd这个命令会弹出一个命令行提示的一个窗口,在这个窗口当中我们可以敲入各种各样的命令,让操作系统执行相应的操作。而我们很多这个操作系统,比如说unix Linux,还有一些很多服务器,实际上都是使用share来进行操作的,这个 share这个操作虽然不如图形界面窗口来的直观和方便,但是它的运营效率是比较高的,所以深受很多程序员和系统管理人员的喜爱。所以对攻击者来说,通过缓冲区域出漏洞,然后获取了这个 share,实质上就获取了目标系统的操作权控制权。这里我们用这样一张图来说明一下缓冲区溢出攻击的流程,这里有一个攻击者,以及一个远程的提供了远程服务的被攻击系统,攻击者首先找到远程系统当中可利用的缓冲区溢出漏洞,
然后往这个漏洞当中去注入恶意的数据,这个恶意的数据到达了被攻击系统的缓冲区之后,就产生了缓冲区溢出,然后通过溢出重定向到攻击程序,然后执行相应的攻击程序,这个攻击程序执行之后,攻击者就获得了一个远程的控制权,然后他就可以通过这个远程的控制权去任意的执行我们被攻击系统上面的程序,执行相应的操作。
接下来我们介绍一下缓冲区溢出攻击的危害性,在UNIX平台Linux平台通过缓冲区溢出攻击,可以获得一个向我们刚刚提到获得希尔实质上就获得了控制权,而在windows平台可以上载并且执行任何的代码。当然这个缓冲区溢出攻击的话,它这个发掘需要较高的技巧和知识性,但是一旦有人编写出了缓冲区溢出的代码,并且发现了可以利用的缓冲区域出漏洞,使用起来就非常的简单。与其他类型的攻击相比而言,缓冲区一出攻击不太需要太多的先决条件,它的杀伤力很强,然后技术性也更强。另外缓冲区溢出攻击,它可以穿透防火墙,因为我们缓冲区域处攻击通常是攻击的,提供了远程服务的这样一些程序,所以从防火墙的视角来看,攻击的流量实际上它是嵌入到提供远程服务的这些程序的流量当中,具有较强的隐蔽性。
接下来我们分析一下缓冲区域处攻击的原理。缓冲区溢出攻击主要发生在函数的调用及返回过程当中,然后主要也是利用了编译器对函数调用的管理的漏洞进行的。
所以首先我们来看一下函数的调用过程及管理。我们高级语言编写的程序通常都包含了若干的函数调用,比如c语言我们编写的时候,必须要编一个main函数,所以 c语言至少会包含一个函数调用,编译器,使用堆栈来管理函数的调用。怎么样来管理?编译器会记录每个函数的执行环境活动,然后在堆栈当中形成一个栈,这个栈当中具体就包含了参数,函数返回地址和我们函数的局部变量。当函数返回的时候,会从这个栈当中去取回这个返回地址,然后同时把这个栈释放了,然后再根据这个返回地址去找到相应的后续要执行的代码,然后再来执行相应的代码。
下面的左图这个简单的程序调用的过程,程序在main函数当中,首先调用了a函数,
然后进入a函数运行,然后在中间又调用了b函数,这个时候程序的运行就转移到b函数当中去运行,当b函数执行完了之后,它就要进行函数的返回,返回到什么地方?返回到a函数当中,调用b函数的后面的程序,然后这个 A函数调用完了之后,又进一步的再返回到main函数当中,执行后续的main函数当中的部分。右图是我们一次函数执行过程当中形成的一个栈,我们可以看到栈的最下面是函数的参数,然后接下来存放函数的返回地址,然后在上面是堆栈的基础,在上面是函数的局部变量,这个局部变量就是缓冲区所在。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aV0jU5Mh-1687880215521)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image036.gif)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xKX3iN0d-1687880215521)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image038.jpg)]
缓冲区溢出攻击主要是在程序内存的堆栈段当中进行,但实质上堆和站是两个不同的区域,我们这里重点讲解战当中进行的缓冲区溢出攻击,在栈当中溢出的缓冲区攻击,它的原理是这样的,首先攻击者找到存在溢出漏洞的缓冲区,也就是某些函数的局部变量,然后通过往这些局部变量当中写入超出其长度的数据溢出缓冲区,然后这个溢出会修改我们堆栈当中的函数返回地址,并且让这个函数的返回地址指向攻击代码,也就是说用这个攻击代码它的地址去覆盖我们函数的返回地址。这个时候当函数返回的时候,程序就会取到这个被篡改后的返回地址而返回,这个时候这个篡改后的返回地址就会去触发攻击代码,从而执行攻击代码。
我们前面提到缓冲区溢出攻击它的技术性较强,这里我们来看一下缓冲区溢出攻击的技术挑战是什么?
缓冲区溢出攻击的目标是远程主机上的程序,远程主机上的程序,它的内存空间和战争对我们攻击者来说是不透明的,是不清楚的,所以有两个关键的技术问题需要进行这个预估和这个测算。一个就是函数的返回地址,我们前面介绍攻击实质上就是去改写函数的返回地址,让他去指向攻击代码,所以要改写这个函数的返回地址,你首先你得把这个函数的返回地址存放的位置给找到,精确的对它进行定位。这个函数的返回地址我们可以把它叫做缓冲区域除攻击的攻击瞄准器,指哪打哪。第二个就是我们要用用攻击代码的地址去覆盖函数的返回地址,而这个攻击代码往往也是存在于我们攻击目标程序它的内存空间的,所以也要对这个攻击代码的地址进行精确的定位,从而才能够去覆盖函数返回地址,然后去触发它。
分析完了缓冲区溢出攻击的原理以及它的技术挑战。我们接下来看缓冲区溢出攻击的步骤。
缓冲区域溢出攻击的步骤可以分为两大步,第一步是攻击代码的安排,可以采用代码自助的方式,也可以利用已经存在的代码。第二步是攻击代码安排好之后,我们再来修改程序的,流程控制也就是通过去改写函数的返回地址,让他去指向我们前边安排好的攻击代码去触发他,当然这两步也可以合二为一,在一步当中完成代码的置入和流程控制。攻击代码的安排就是解决攻击代码从何而来的问题。一方面可以采用代码自助的方式,攻击者通过远程注入的方式,在存在缓冲区域出漏洞的缓冲区当中,然后去写入事先准备好的攻击代码。另外攻击者也可以利用目标程序当中已经存在的代码,我们目标程序当中的代码有些也是可以被我们攻击者利用来发起攻击的,主要是 exec函数的调用,exec函数族可以实现在一个进程当中去启动另外一个程序的方法,实现这个程序的跳转,这正好是我们缓冲区溢出攻击想要达到的一个目的。
主要有两类调用方式是可以被我们利用的。一种就是exec,这个往往是我们系统当中这个线程序它的位置,或者说它的路径,执行这条代码就会在当前的进程当中去启动线,那这正好是我们很多缓冲区运出攻击所要想达到的目标,在当前的程序当中我们去启动线,那就可以掌握系统的控制权。如果我们在目标程序当中没有找到直接以兵线为参数的 exe函数调用,我们就可以找其他参数的exe函数调用。开始攻击代码安排好了之后,我们就可以通过修改程序的控制流程,然后让它指向攻击代码,进而激活攻击代码。如何来修改程序的流程控制有三种方式:第一种是激活记录,也就是溢出缓冲区,用攻击代码的地址去覆盖函数的返回地址,这是一种常用的方式。第二种就是函数指针,函数指针指向一个函数,它可以定位任何的地址空间,并且这个地址空间它是可以被执行的,我们就可以通过溢出函数指针附近的缓冲区,从而修改这个函数的指针地址,让这个地址指向攻击代码,从而这个函数指针被激活的时候,就可以去执行攻击代码。第三种就是长跳转缓冲区,也就是通过长的跳转来改写程序的流程控制。c语言当中具有检验和恢复机制,当程序当中出现了异常或者发生故障的时候,我们可以跳转到前边的某一个正常的位置,然后再重复的执行程序。这个检验和恢复机制主要利用setjmp结合longjmp进行程序异常处理。这两个函数类似go to语句,但是go to通常跳转范围限定在一个函数的内部,而这个两个函数配合可以实现跨跃函数范围的跳转。具体在使用的时候,三次降波函数它设定一个跳转的位置,然后通过这个 long jump跟上一个参数,实现这个跳转。当longjump跟上这个参数,例如buffer,这个时候就可以利用溢出去修改,使buffer指向攻击代码。这样,当程序在执行这个 long jump的时候,就会去跳转到攻击代码,从而触发攻击代码,实现攻击。
如何移步完成代码的置入和流程控制,可以在一个缓冲区当中置入攻击代码,并且继续溢出,用这个攻击代码的地址去覆盖函数返回地址,就同时完成了激活记录,当然也可以同时这两个缓冲区当中来溢出,然后实现代码的自助和流程控制。
接下来我们来看一下缓冲区溢出攻击的防御技术缓冲区域出攻击的防御技术分为如下几类:
第一个是使用类型安全的编程语言和相对安全的函数库;第二是修改编译器;第三可以对内核打补丁;第四可以使用静态分析方法和动态检测方法;最后还有基于硬件的防御技术。现在我们分别来看一下。
首先来看类型安全的编程语言,以及相对安全的函数库。c语言和c++语言不够安全,所以出现了其他的一些高级语言,比如Python等等更安全的语言。此外,我们还可以替换一些不安全的函数,比如我们最开始的事例当中看到的串拷贝、string copy,都有相应的函数对它进行替代更安全一些。另外,同类的函数还有这个串连接的string counter,可以把它替换为strain encounter,而中间这个 en就代表我们在进行串的拷贝或者说连接过程当中,我们会进行这个量体裁衣。我们在拷贝或者在复制的时候,我们先看一下目标串有多长,然后再往里面去复制相应的数据。另外 print函数也是不够安全的,这里也有安全的版本,s print函数可以对它进行替代。
再来看修改编译器,一方面可以增强编译器的边界检查能力,比如说针对gnuc编译器可以扩展数组和指针的边界检查能力,另外 VOC加加点net的GS选项可以动态的检测缓冲区的溢出。我们还可以对返回地址进行完整性的保护,我们开头看到缓冲区域助攻机主要是去改写返回地址,我们可以将返回地址备份那别的内存空间,然后在函数调用返回之前,再把这个备份的地址重新写回堆栈,而从而从而避免被缓冲区溢出攻击覆盖和改写。针对这个修改编译器的攻击防御方法,它也是有缺点的,一方面就是它具有性能的代价,我们修改这个编译器难度还是比较大的。另外就是这种检查方法目前仍然还是不够完善的,还在进一步的发展当中。
我们再来看内核补丁这种防御技术。我们前面看到缓冲区域出攻击,很多时候需要在缓冲区当中去置入攻击代码,然后触发攻击代码的执行,所以可以通过内核补丁将堆和站以及数据段等标注为不可执行,这个时候即使攻击者在当中埋伏了攻击代码,由于它不可执行,所以也不能激活攻击代码。比如Linux的内核补丁o ppo rsx等等,就实现了不可执行的对账。内核补丁这种防御技术也是有它的缺点的,对于一些需要堆栈数据段为可执行状态的程序是不合适的。然后另外的话这种技术需要重新编译我们原来的程序,如果原程序它只有可执行代码而没有源代码的话,那就不能获得这样一种保护。
我们再来看静态分析方法,静态分析就是对程序源代码进行检查,主要有质点检查法和程序注解法,字典检查法就是便利原程序,查找不安全的库函数和系统调用。比如静态分析工具,its4软等等,就可以对CC加加等等语言的程序进行这个扫描和检查,去发现是否存在不安全的库函数和系统调用。这种方法也是有缺点的,通过工具来进行字典检查,往往误报率比较高,需要大量的人工配合进行检查工作。
程序注解法就是利用工具让程序员在编程的时候插入很多注解,包括缓冲区的大小指针是否可以为空输入的有效约定等等,然后利用静态分析的工具,然后结合这个注释对源代码进行扫描,去发现是否存在不安全的函数,或者是否存在我们有漏洞的缓冲区。这个方法的缺点就是它非常依赖我们注释注解的质量
再来看动态检测法,动态检测法就是让程序运行起来去检测,主要有两种方法,一种是输入检测法,另外一种是CAnary base的检测方法。输入检测法就是向我们程序提供不同的输入,检查是否有益处的情况,以及是否有内存越界。输入检查的工具有这个 Pure if I via the faced等等这样一些工具。这种检测方法的缺点就是我们输入检查,实际上是让程序去运行,是一种动态的测试方法,这个方法它的开销会比较大,可能会导致系统性能的明显降低。输入检测法它的检测效果取决于输入是否能够激发缓冲区溢出等安全问题的出现。
CAnary based检测方法,CAnary就是一个检测值,我们将CAlorie放到缓冲区和需要保护的数据之间,如果有攻击对需要保护的数据进行了溢出的话,势必会造成CAlorie被改写。所以我们只需要检测CAlorie是否被改写,就可以检测是否存在缓冲区溢出攻击。比如说有些动态检测工具,steak、god、steak、host等等都具有这样的检测功能。这个检测方法的缺点是需要修改编译器实现这个功能,需要重新的编译程序。另外就是如果缓冲区溢出攻击,它是可以绕开检测值,通过溢出不同的缓冲区造成攻击的话,那这种情况下面就无法检测出来。
基于硬件的防御技术,有些我们计算机的硬件通过引入一些新的特性,可以对缓冲区溢出攻击进行防御。比如英特尔和AMD的64位处理器引入了称为nx,非执行或者AVP高级病毒保护的新特性,将以前的CPU合为一个状态,存在的数据页状态分为了数据页只读和数据页可执行两个独立的状态,这样的话我们就可以把堆栈设置为数据页只读的状态,从而避免在其中埋伏的攻击代码被执行。另外 elf64、ctmvabi通过计算器来传递函数的参数,而不是像原来一样放在堆栈当中,那这样的话就可以避免缓冲区溢出攻击,对函数参数进行溢出。这种防御方法使得我们64位的处理器不仅可以抵制需要注入攻击代码的缓冲区溢出攻击,还可以抵制return-to-libc的这类攻击。