笔记内容参考安全牛课堂苑房弘老师的Kali Linux渗透测试教程
所有漏洞的根源均来自于数据的输入,缓冲区溢出的原理在于数据与代码边界模糊,当缓冲区边界限制不严格时,由于变量传入畸形数据或程序运行错误,导致缓冲区被“撑暴”,从而覆盖了相邻内存区域的数据,成功修改内存数据,可造成进程劫持,执行恶意代码,获取服务器控制权等后果。
为更好理解缓冲区溢出原理,参考笔者转载的文章:
手把手教你栈溢出从入门到放弃(上)
手把手教你栈溢出从入门到放弃(下)
文章目录
一、发现漏洞的方法
(一)源码审计
软件开发人员,或者利用社工等方式获取源码进行审查、调试。条件苛刻,一般源码难以获取。
(二)逆向工程(Reverse Engineering)
利用逆向工程获取汇编源码进行分析,汇编代码分析工作量大,难度高。
(三)模糊测试(Fuzzing)
是一种通过向目标系统提供非预期的输入并监视异常结果来发现软件漏洞的方法,通常情况下会使用一个有效的输入和添加随机误差来完成,需要借助软件调试工具(如:ImmunityDebugger)。
二、模糊测试过程
首先要了解一些针对缓冲区溢出的安全保护技术,因为在模糊测试过程中要绕开这些保护机制。
- DEP (Data Execution Prevention): 阻止数据页(默认的堆,栈以及内存池页)执行代码。在Linux中该机制为NX(No-eXecute)。
- ASLR (Address Space Layout Randomization): 堆、栈、共享库映射等线性区布局的随机化,增加攻击者预测目的地址的难度
- 堆栈cookies:启用堆栈cookies机制后,函数执行时会先往栈里插入cookies,该cookies往往放置在ebp/rbp的上方,当函数返回的时候会验证cookie信息,如果不合法就停止程序运行,使得攻击者在覆盖返回地址的时候将cookie信息给覆盖掉,导致栈保护检查失败而阻止shellcode的执行。在Linux中将堆栈cookies机制称为canary。
(一)Windows
测试软件为’SLMail 5.5.0 Mail Server’,其PASS命令存在缓冲区溢出漏洞。基本思路:(调试工具用ImmunityDebugger)
1.利用python脚本测试 PASS 命令接收到大量数据时是否会溢出,一般到3000个字符仍未出现溢出现象则说明该处应该不存在溢出漏洞。
2.发现溢出漏洞后,判断EIP对应的地址,基本方法有:二分法、唯一字符串法。唯一字符串法可以利用metasploit脚本usr/share/metasploit-framework/tools/pattern_create.rb 3000
生成。
3.将EIP修改为Shellcode对应的内存地址,将Shellcode写入到该地址空间,程序读取EIP寄存器数值,将跳转到 shellcode 代码段并执行。
4.通过调试工具发现,发送的数据填充EIP后,紧接着会填充ESP指向的空间,因此我们将Shellcode放到ESP的位置。
5.判断ESP地址到栈底的距离,即可以存放Shellcode的大小。利用python脚本向软件发送数据测试,通过调试软件看有多少数据存放在ESP指向的空间。现代计算机系统进程的内存空间视图如图所示: