渗透测试是信息安全领域中的一项关键技术,用于评估系统的安全性。它包括尝试利用系统中的各种漏洞,以确保没有未经授权的访问。渗透测试可以分为不同的类别,其中,服务端渗透是关注服务器端安全性的关键类型。本文档是《Metasploit渗透测试魔鬼训练营》的读书笔记,其中涉及到内网网络服务端渗透的多个关键知识点。
内存攻防技术是服务端渗透测试中的一个重要方面。内存攻防的核心问题在于图灵机模型在实现时没有严格区分数据与指令,导致恶意数据可被当作指令执行。这一根本原因导致了缓冲区溢出问题,其中最常见的是栈溢出。栈溢出通常由于缺乏对缓冲区边界条件的检查而引起,当写入数据的长度超过分配的缓冲区空间时,就会发生溢出,从而可能导致程序崩溃或执行攻击者的恶意代码。
缓冲区溢出攻击主要有几种类型,包括覆盖函数返回地址、覆盖异常处理结构等。在这些攻击中,攻击者通常会尝试覆盖返回地址,利用堆栈的后进先出(LIFO)特性,通过在高地址向低地址写入数据,改变程序的执行流程。其中,使用Jump ESP的地址来覆盖返回地址是一种常见的技术。结构化异常处理(Structured Exception Handling,SEA)也是攻击者利用的技术之一,通过布置含有shellcode的指令块,攻击者可实现控制程序执行的目的。
网络服务攻击是服务端渗透测试中的另一个核心议题。攻击者针对Windows自身的网络服务、微软的网络服务、第三方网络服务以及工业控制系统服务发起攻击。例如,NetBIOS网络服务运行在UDP的137、138、139端口上,而SMB(Server Message Block)网络服务运行在445端口,也可调用NBT(NetBIOS over TCP/IP)的139端口来接收数据。远程桌面协议(RDP,运行在TCP的3389端口)是另一个潜在的攻击面。此外,针对第三方服务,如Oracle数据库服务(端口1521),存在特定的漏洞,攻击者可以利用这些漏洞执行任意代码。
当涉及到Linux系统时,服务端渗透测试关注的焦点之一是Samba安全漏洞。Samba是使Linux系统能够通过网络与Windows系统共享文件和打印机的软件。由于Linux与Windows在进程内存空间布局、系统功能调用、动态链接库实现机制等方面存在差异,这导致了Linux环境下的安全漏洞往往与Windows环境下的漏洞不同。例如,在Linux中,由于地址空间布局的差异,进程内存空间的首字节不存在空字节问题,因此攻击者不必担心数据截断问题。另外,Linux和Windows在废弃机处理方式、系统功能调用实现方式上存在差异,这些差异影响了安全漏洞的利用方式。
针对这些漏洞,防御技术也在不断发展。地址空间布局随机化(Address Space Layout Randomization,ASLR)是一种防御技术,通过随机化进程地址空间的布局,使得攻击者难以准确预测攻击载荷的位置。堆的不可执行(NX bit)技术防止了数据段中的代码被执行。这些技术都是为了提高系统的抗攻击能力而设计的。
Metasploit框架是渗透测试中非常强大的工具,它允许安全专家快速搜索和使用漏洞攻击代码。例如,使用Metasploit攻击时,首先需要搜索漏洞对应的模块并启动,然后展示攻击载荷并选择合适的一个。设置攻击载荷为reverse_tcp,接着配置攻击参数,包括目标地址、端口等。攻击过程涉及到攻击模块源码的解析,以及对特定漏洞机理的分析,如Ms8-62和Ms8-067漏洞,它们都是针对Microsoft服务的已知漏洞。
服务端渗透测试涉及的技术和知识点非常丰富,包括但不限于内存攻防技术、网络服务攻击方法、针对特定服务的攻击实例、操作系统差异、漏洞利用和防御机制等。掌握这些知识点对于进行有效的渗透测试至关重要。