三.网络服务渗透攻击
3.1 内存攻防技术
3.1.1 缓冲区溢出漏洞机理
缓冲区溢出是程序由于缺乏对缓冲区的边界条件检查而引起的一种异常行为。
一般根据缓冲区溢出的内存位置不同,将缓冲区溢出分为栈溢出和堆溢出。
3.1.2 栈溢出利用原理
栈溢出发生在向栈中写数据时,当数据长度超过栈分配的空间时,就会造成溢出。
①覆盖函数返回地址利用方式
程序一般在执行函数时会把该函数返回地址和函数的调用参数,局部变量一起保存在栈中,这就给了攻击者溢出栈缓冲区从而达到修改函数返回地址的机会。
由于程序每次运行时,栈中变量的地址都会变化,所以会通过一些跳转寄存器的指令作为跳板,使程序能够执行到栈中的shellcode,最常见的是以JMP ESP的地址来覆盖返回地址,从而使得程序执行该指令后重新跳转回栈中,来执行缓冲区溢出之后的数据。
②覆盖异常处理结构利用方式
程序运行时可能会发生异常,此时就需要异常处理机制,windows提供了SEH来处理异常。
异常处理结构以链表的形式存储在栈中,操作系统会从链表头到尾寻找处理此异常的函数,如果没找到,则由最后一个函数即系统默认的异常处理函数来负责。
覆盖异常处理结构,就是用特定的地址覆盖栈中异常处理结构体中的异常处理函数指针,并触发异常,去加载篡改后的函数指针。
3.1.3堆溢出利用原理
堆是程序运行时动态分配的内存,位置不固定,具体实现比较复杂,这里只简单介绍最常见的空闲堆块操作引起的堆缓冲区溢出。
空闲堆块含有两个指针,分别指向前后两个空闲块。
同一个堆中的堆块内存通常是连续的,所以,若数据超出了某个堆块的大小,将会导致数据溢出覆盖堆块后方的相邻空闲块,包含的两个指针将会被覆盖。
在得到这样的机会后,攻击者可以进行堆覆盖溢出。
3.1.4缓冲区溢出利用的限制条件
需要考虑缓冲区空间的大小、样式、过滤坏字符。
3.2 网络服务渗透攻击面
3.2.1针对windows系统自带的网络服务渗透攻击
1.NetBIOS网络服务
以NBT协议来实现,包括UDP137端口上的NetBIOS名字服务,UDP138端口上的NetBIOS数据报服务和UDP139端口上的会话服务。利用NetBIOS的渗透攻击很少,metasploit没有此类模块。
2.SMB服务
针对SMB服务的渗透攻击模块在metasploit中的 exploit/windows/smb,其中只有少数直接针对SMB,大部分都是针对MSPRC over SMB通道。
3.MSRPC 网络服务
MSRPC是windows自带网络服务最大的攻击面,metasploit框架中也存在此类渗透模块,位于 exploit/windows/smb和exploit/windows/dcerpc。
4.RDP远程桌面服务
默认运行在3389端口。
3.2.2针对windows操作系统微软网络服务的渗透攻击
常见的有IIS服务,MSSQL服务,Exchange电子邮件服务,MSDTC服务,DNS域名服务,WINS服务等,可能存在着很大安全漏洞,从而成为攻击者的目标。
3.2.3针对windows操作系统上第三方网络服务的渗透攻击
常见的有Apache,IBMWebSphere,Tomcat,Oracle,Mysql,Ser-U,FileZilla等。攻击者通过扫描服务的默认端口,来探测是否使用了一些常见的第三方服务。
3.2.4针对工业控制系统服务软件的渗透攻击
工业控制系统指在工业领域用于控制生成设备的系统,包括SCADA系统,DCS以及其他一些设备控制器。metasploit 在 exploit/windows/scada目录中有很多针对这些软件的渗透模块。
3.2.5Linux和Windows之间的差异
①进程内存空间的布局差异
windows的栈的内存地址的首字节均为0X00即NULL,通常是需要考虑的坏字符,而linux中栈的内存地址没有空字节,无需考虑坏字符导致输入截断的问题。
②对程序运行过程中废弃栈的处理方式差异
windows会向废弃的栈写入一些随机数据,而Linux不做任何操作
③系统功能调用的实现方式差异
windows通过API及内核处理程序调用链来完成系统功能调用,Linux通过”int 80“中断处理来调用系统功能,所以在实现shellcode存在不小的差异
④不同的动态链接库实现机制
Linux引入GOT表和PLT表,使用多种复位项,实现了”位置无关代码“,达到了更好的共享性能。
3.2.6Linux系统服务渗透攻击原理
和windows原理基本一致,针对Linux的攻击包含一些自身的特点。
由于源代码开放,可以进行白盒测试。
由于发行版众多,同样的漏洞针对不同的系统环境需要调整。
Linux的安全性更加依赖用户。