《Python安全实践-PythonHacking》课件-第8章_第1页
《Python安全实践-PythonHacking》课件-第8章_第2页
《Python安全实践-PythonHacking》课件-第8章_第3页
《Python安全实践-PythonHacking》课件-第8章_第4页
《Python安全实践-PythonHacking》课件-第8章_第5页
已阅读5页,还剩71页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第八章Python漏洞挖掘和利用8.1漏洞简介8.2Python模糊测试8.3Freefloat漏洞分析8.4Python编写exploit习题

8.1漏洞简介

安全漏洞是在硬件、软件及协议的具体实现或系统安全策略上存在的缺陷,使得攻击者能够在未授权的情况下访问或破坏系统。通常,安全漏洞可以分为软件编写存在的瑕疵(Bug)、系统配置不当、敏感信息泄露、明文数据传输、逻辑缺陷、数据表示漏洞等类型。表8-1给出了目前常见的软件安全漏洞,涉及Web类、操作系统类、协议类、口令使用不当等多种安全漏洞。

8.2Python模糊测试

8.2.1模糊测试简介模糊测试是一种介于完全的手工渗透测试与完全的自动化测试之间的安全性测试类型。模糊测试方法通过向目标软件或者系统提供非预期的输入,监视软件或者系统是否出现异常来发现软件漏洞的。

1.模糊测试方法

模糊测试需要往目标软件或者系统输入的数据可以通过两种方法来产生:基于变异的和基于生成的。

(1)基于变异的模糊测试方法,是指对已有数据样本应用变异技术来创建测试用例的方法。

(2)基于生成的模糊测试方法,是指通过对目标协议或文件格式建模的方法从零开始产生测试用例。

2.模糊测试的过程

模糊测试方法的选择需要依赖于目标应用程序、研究者的技能,以及需要测试的数据所采用的格式等多种不同的因素,没有一种“绝对正确”的模糊测试方法。但不论采用哪种模糊测试方法,模糊测试总要经历以下几个阶段,如图8-1所示。

图8-1模糊测试的阶段

(1)识别目标。通常目标应用程序拥有多个功能模块和多种调用接口,需要详尽分析模块接口和外部接口,才能有效选择模糊测试工具或技术。选择目标应用程序后,还必须选择应用程序中具有的目标文件或库。

(2)识别输入。几乎所有可被用户利用的漏洞都是因为应用程序接受了用户的输入,并且在处理数据时没有过滤非法数据或执行确认例程,因此对用户的输入进行模糊测试非常重要。

(3)生成模糊测试数据。一旦识别出输入数据,就能进行模糊测试了。如何使用预定的值,如何变异已有的数据或动态生成数据,这些决策将取决于目标应用程序及其数据格式。不管选择了哪种方法,这个过程中都应该采用自动化测试方法。

(4)执行模糊测试数据:与(3)同时进行,执行过程可能包括发送数据包给目标应用程序,打开一个文件或发起一个目标进程。同样,这一步也需要引入自动化测试方法。

(5)监视异常。在模糊测试过程中,对异常的监视至关重要。监视异常可以采用多种形式,并且应该不依赖目标应用程序和所选择的模糊测试类型。

(6)确定可利用性。一旦安全漏洞被发现,因审核目标的不同,还可能需要确定该漏洞是否可以进一步被利用。这是一个典型的人工分析过程,需要具备安全领域的专业知识,因此这个过程可以由其他人员完成,而不是最初执行模糊测试的人员。

3.模糊测试工具

WebFuzzer:是一个Web应用程序的模糊测试器,用于检查远程漏洞,如SQL注入、跨站脚本、远程代码执行、文件泄露、目录遍历、PHP文件包含、shell转义等。

SNMPFuzzer:是针对网络管理协议的模糊测试工具,由Perl语言编写,拥有全新的协议测试用例产生引擎,提供测试案例和响应故障的有效对应方法,以及更多的测试粒度和更友好的用户界面。

FTPFuzzer:是一个简单的基于GUI的文件传输协议模糊测试器,用于测试FTP服务器的实现。它允许用户指定FTP命令、参数以及字符串的模式来进行模糊测试。

Fuzzball2:是TCP和IP协议的模糊测试器,它会向目标主机发送一串伪造的数据包。

8.2.2

FTP服务模糊测试

1.

FTP协议

1)

FTP协议简介

FTP协议是因特网中使用最广泛的文件传输协议,它是TCP/IP模型中的应用层协议。FTP协议工作在面向连接的、可靠的传输层协议(TCP)之上,为数据传输提供可靠性保证。FTP协议包括两个组成部分:FTP服务端和FTP客户端。其中FTP服务端用来存储文件,用户可以使用FTP客户端通过FTP协议访问位于FTP服务端上的资源。

FTP协议在实现文件传输时会建立两条连接:一条连接用于命令控制;另一条连接用于数据传输。FTP协议将命令和数据分开传送的方法提高了传输效率。

默认情况下FTP协议使用TCP端口中的20和21两个端口,其中20端口用于传输数据,21端口用于传输控制信息。但是,是否使用20端口作为传输数据的端口,与FTP使用的传输模式有关,如果采用主动模式,那么数据传输端口就是20端口;如果采用被动模式,则具体使用哪个端口需要服务端和客户端协商决定。

2)

FTP协议工作模式

FTP协议的工作模式有主动模式和被动模式。主动模式下,客户端随机打开一个大于1024的端口N向服务端的命令端口(21端口)发起连接,同时开放N+1端口进行监听,并向服务端发出“PORTN+1”命令,由服务端从它自己的数据端口(20端口)主动连接到客户端指定的数据端口(N+1)。FTP的客户端只是告诉服务端自己的端口号,让服务端来连接客户端指定的端口。对于客户端的防火墙来说,这是由外到内的连接,该连接可能会被客户端的防火墙阻塞。

为了解决服务端主动发起客户端的连接阻塞问题,有了另一种FTP连接方式,即被动模式。命令连接和数据连接都由客户端发起,这样就解决了从服务端到客户端的数据端口的连接被防火墙过滤的问题。被动模式下,客户端打开两个任意的大于1024的本地端口N和N+1,第一个端口连接服务端的21端口,提交PASV命令;然后服务端会开启一个任意的端口并返回响应的命令给客户端;客户端收到命令取得端口号之后,会通过N+1端口连接到服务端口,接着在两个端口之间进行数据传输。

FTP命令主要用于控制连接,命令以NVTASCII码的形式传送,要求在每行结尾都要有一对回车换行符(CRLF)。常见的FTP命令如表8-2所示。

FTP服务端对命令的响应都是采用ASCII形式的3位数字,响应也是以NVTASCII码形式传送,要求在每行结尾加上CRLF对。常见的FTP响应代码如表8-3所示。

2.

Python模糊测试FTP服务端

下面使用Python强大的网络分组构造库Scapy,对实际的FTP服务端软件FreefloatServer进行模糊测试以发现安全漏洞。

本次实验环境的相关信息如下:

(1)客户端:Kali系统,IP地址为38。

(2)服务端:Windows7系统,IP地址为39。

由于FTP协议是基于面向连接的、可靠的传输层TCP协议,因此需要首先建立TCP三次握手才能建立一个有效的文件传输连接。

三次握手的异常RST包如图8-2所示。

图8-2三次握手的异常RST包

发现服务端收不到来自客户端的ACK确认包,反而收到的是客户端发送给服务端的连接复位分组RESET。这主要是因为Kali客户端的底层网络系统在收到服务端返回的第二次握手包ACK + SYN以后,检测到系统本身没有发送过任何的SYN握手包,所以重置了这个连接。此时需要配置防火墙的iptables规则将发送给服务端的RST包拦下。

在Kali终端输入:

iptables-AOUTPUT-ptcp–tcp-flagsRSTRST-jDROP

重新运行脚本,则三次握手成功建立了,如图8-3所示。

图8-3三次握手成功

不断增加USER命令的参数长度进行模糊测试,最终发现当输入约250个字节时,FreefloatServer服务端崩溃,如图8-4所示。

图8-4

FreefloatServer服务软件出现异常

此时用ImmunityDebugger进行调试,发现EIP寄存器已经被A字符覆盖,说明FreefloatServer在处理USER命令时发生了栈溢出,如图8-5所示,模糊测试成功!

图8-5检查EIP寄存器值

8.3Freefloat漏洞分析

分析栈溢出漏洞的三种方法:关键函数、敏感字符串和IDAPython方法。限于篇幅仅详细介绍第一种方法,第二种和第三种方法请读者自行验证。

8.3.1关键函数方法

漏洞产生的原因是服务端接收了用户发送的非法用户名,并把它放进栈中覆盖(破坏)了栈中原来的一些数据。我们知道,在套接字(Socket)网络编程中,recv()函数用于把接收到的数据复制到缓冲区中,那么异常一定是发生在recv()函数执行之后。因此可以对recv()函数进行跟踪,检查后续执行的函数调用、对数据的处理操作等。

下面用反汇编工具IDA对FreefloatServer进行分析,具体步骤如下:

(1)在IDA的“Functionname”窗口里搜索recv(),找到后双击就可以进入recv()的代码,如图8-6所示。

(2)光标移到想分析的代码处按下F5键,将汇编代码转换为伪代码,按Esc键返回上一步,如图8-7所示。

图8-7伪代码

(3)在函数处单击右键,选择Xrefsto,就可以看到直接和间接调用它的函数。函数调用流程图如图8-8所示。

图8-8函数调用流程图

(4)双击CODEXREF后的函数就可以转到调用它的函数处,可见有两个函数调用了recv(

);再双击图8-8中的recr()函数转到sub_401DE0(

)函数,具体内容如图8-9所示。

图8-9401DE0函数

图8-10所示是401DE0(

)的伪代码,v2是recv(

)函数的返回值。

图8-10

recv()函数伪代码

根据微软API开发手册对recv()函数的原型说明,该函数总共有4个参数,形式如下:

intrecv(sockets,char*buf,intlen,intflags)

①参数说明:

第一个参数sockets指定接收套接字描述符。

第二个参数char*buf指向一个缓冲区,该缓冲区用来存放recv()函数接收到的数据。

第三个参数intlen指明buf的长度。

第四个参数intflags指定调用方式,一般为0。

②返回值:若无错误发生,recv(

)返回读入的字节数。如果连接已中止,那么返回0。如果发送错误,那么返回 -1。

③分析:recv(

)的返回值赋给了v2,v2里存储的是此次复制到缓冲区的字节数。在v2不为0同时也不为 -1(成功把数据复制到缓冲区)的情况下,把(v1+24)这个地址的数x变为(x+v2),所以(v1+24)存储的应该是缓冲区已经被占用的字节数,它的初始值是0。

根据recv(

)第二个参数是指向缓冲区首地址的指针可以知道,(v1+20)处存储的就是缓冲区的首地址,每次通过首地址*(_DWORD*)(this+20)加偏移地址*(_DWORD*)(this+24)寻找下一个可用的缓冲区首地址,这样就可以多次使用这1024个字节的缓冲区,直到缓冲区全部放满接收的数据。若recv(

)成功复制,则函数401DE0(

)返回1;否则函数返回0。那么它把返回值交给了谁呢?当然是调用它的函数了。

(5)利用交叉引用找到并调用401DE0()函数中StartAddress()。正常情况下,401DE0()函数会返回1,取非后为0,那么接着就要调用4020E0()函数,如图8-11所示。

图8-11

recv()函数执行后的下一步函数调用

图8-12所示是4020E0(

)函数的部分代码,它对数据进行了一些处理后调用了402190()函数。

图8-124020E0()函数伪代码

(6)进入402190(

)函数,然后惊喜地发现里面的“USER”字符串。strncmp(

)函数用来比较v2和USER字符串的前5个字符。如果这两个字符相等的话,就返回0。如果处理的是USER命令的话,就会进入下面的流程。具体内容如图8-13所示。

图8-13402190()函数伪代码

(7)进入402DE0(

)函数,发现IDA提示v17在栈里面,距离栈底FCh个字节长度,strcpy(

)函数把a3指向的数据复制到栈中且以v17为首地址,如果a3指向的数据很多(Passwordrequiredfor(22个)+数据),大于FCh(252),就可能造成栈溢出。也就是说,当用户输入的USER后面的数据多于230时,就会覆盖返回地址。

复制拷贝操作如图8-14所示。

图8-14复制拷贝操作

这样就可以发现原来FreefloatServer处理USER命令时,用到了strcpy(

)函数,且当用户发送的USER后面的数据大于230个字符时,就会覆盖返回地址,该函数执行完后就会出错。

根据上述分析可以画出整个USER命令的处理流程图,如图8-15所示。

图8-15函数处理USER命令流程图

8.3.2敏感字符串方法

打开字符串窗口可以发现一些关键的字符串,从里面找到了字符串“USER”,就可以发现sub_402190(

)函数引用了“USER”;然后可以把它转换成伪代码进行分析;最后也会找到关键函数sub_402DE0(

)。

8.3.3

IDAPython方法

使用IDAPython脚本,将IDA置成调试状态,加载一个脚本。这个脚本是在程序的每一个函数中都设置断点,捕捉每一个函数,并把它的信息回显出来。运行程序之后,能够得到程序现在正在执行的是哪个函数,此时发送大量数据对服务器进行模糊测试,如果程序停下来了,那么就可以从停下的那个位置自下而上地找出安全漏洞所出现的函数。程序运行出现异常后的截图如图8-16所示。

图8-16程序异常后的截图

8.3.4

Freefloat漏洞验证

经过上述的分析已经知道,当向Freefloat服务端发送USER后面的数据大于230个字符时,堆栈中的敏感数据就会被覆盖。下面用OD调试器对此作一验证。

把程序加载到OD,在00402DE0下断点,将程序运行起来并向服务端发送“USER+230(最大能容纳的数据数量)+4(覆盖返回地址的数据)”,程序会停在00402DE0,查看堆栈窗口就可以发现返回地址在00BBFC20里(返回到FTPServe.004028F2,来自FTPServe.00402DE0)。

返回地址入栈如图8-17所示。8-17返回地址入栈

接着,从00402DE0开始一步一步地单步执行。发现它在00402E5F处执行了REPMOVSDWORDPTRES:[EDI],DWORDPTRDS:[ESI],然后返回地址就被覆盖了,如图8-18所示。

8-18返回地址被覆盖

其实这些数据就是处理后要发送给客户端的数据,在数据的后面还要加上“.\r\n+Null”,在内存里就用2E0D0A00(一般在数据末尾都要加00,便于计算字符串长度,通常长度值赋给寄存器ECX)表示,这点会在软件保护里用到。所以最后数据处理完以后如图8-19所示。

图8-19字符串结束符

这些数据会被作为一个参数传入send(

)函数中,然后经过协议最终传送给用户。传送结束后函数返回00402DE0(

),00402DE0(

)再想返回FTPServe.004028F2时就会出现问题,因为返回地址已经被覆盖,0x41414141不可读,程序就会停止运行。返回地址被修改导致无效EIP,如图8-20所示。

图8-20返回地址被修改导致无效EIP

8.4Python编写exploit

1.漏洞利用程序一个漏洞利用程序就是一段通过触发一个漏洞进而控制目标系统的代码。攻击代码通常会释放攻击载荷,里面包含了攻击者想要执行的代码。exploits利用代码可以在本地也可以向远程进行攻击。

2.实验原理

(1)

FreefloatFTP。本实验利用的是FreefloatFTP在对USER命令的解析处理过程中存在缓冲区溢出漏洞,攻击者可利用此漏洞在受影响的应用程序上下文内执行任意代码。

(2)缓冲区溢出。缓冲区溢出是指向程序输入缓冲区中写入超过缓冲区所能保存的最大数据量的数据,从而破坏程序的运行,甚至获取系统的控制权。它是一种非常普遍和非常危险的漏洞,在各种操作系统、应用软件中广泛存在。

缓冲区溢出的原理如图8-21所示。

图8-21缓冲区溢出的原理图

3.实验环境

本次实验目标机器为Windows7、FreefloatFTP、ImmunityDebugger,目标机器IP地址为29。

攻击机器为Kali2、Python、Telnet、Netcat,攻击机器IP地址为38。

首先在目标机器上运行FTP服务端,并加载到ImmunityDebugger中,在攻击机器上通过Telnet连接,确保攻击机器能够访问它。网络连接如图8-22所示。

图8-22网络连接

4.创建exploit

为了利用上述漏洞,首先利用Metasploit创建exploit,然后定位有效的注入点来插入exploit进行实践即可。但是在创建exploit之前,需要找出“坏”字符。“坏”字符就是导致shellcode不能正常复制到内存的字符,它们很可能导致缓冲区溢出失败,因此需要将其进行移除。

首先在目标机器中打开FreefloatServer,然后将其加载到ImmunityDebugger中,并点击运行。其次在攻击机器中运行上述脚本,观察ImmunityDebugger中的变化。堆栈布局如图8-23所示。

图8-23堆栈布局(1)

从ImmunityDebugger中可以发现,EIP中的内容是0x42424242,0x42是ASCII表示的字符B,说明当向该服务端发送多于230个字符后,EIP就指向了紧跟其后的地址。从数据窗口中可以发现,ESP指向的地址0x0223FC00与EIP

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论