【安全健行】(2):Linux漏洞基础

2015/5/12 18:36:42

时隔这么久,自己终于重新开始了安全之路,虽然每天的工作和研读的论文也都是安全领域的技术,但是自己心里真正的安全还是漏洞的研究。因此,自己决定业余来自学这部分,今天算是一个正式的开始吧!

今天来简单介绍下Linux漏洞,因为Linux给予了用户更大的自由度和操控性,因此更加适合进行安全研究,我们也从Linux开始。这部分主要分为以下小节:

  • 栈的操作
  • 缓冲区溢出的基本原理
  • 本地缓冲区溢出漏洞攻击框架
  • 小缓冲区的漏洞攻击框架

一、栈的操作

是操作系统进程内存中特有的结构,当系统运行一个程序,程序执行所需要的信息、数据都会以进程的形式存放到内存中供随时读写,这时内存中程序代码的大致结构就像下面这个样子:

栈是一种特殊的数据结构,可以想象出餐馆叠在一起的盘子,每次放上一个新盘子,之前最上面的盘子就到了下面,新盘子成为了最顶上的盘子;而取盘子时,总是从上向下依次取出,这样的数据结构我们称之为先进后出(FILO),栈就是一种这样的结构。

栈的增长顺序,在任何一个系统中都是由高内存向低内存扩展,我能想到一个直观的理由是系统默认可以从低内存开始处理数据(不考虑大端存储的话)。

栈有两个基本的操作,一个是将数据/元素压入栈中,即PUSH操作;另一个则相反,是将栈顶的元素弹出,存储到寄存器中,即POP操作。

内存中每个进程在内存栈段中都有自己的栈,而且栈始终是由最高内存地址向最低内存地址反向增长的。关于栈有两个重要的寄存器,一个是扩展基地址指针EBP,它指向栈底,即较高地址;另一个是扩展栈顶指针ESP,指向栈的较低地址。

系统在实际运行程序时,栈的应用往往表现在函数调用。每个函数都会有自己的栈,因此当发生一次函数调用时,调用函数和被调用函数都要进行一些栈的“交接”。比如对于调用函数来说,需要做以下工作:

  1. 调用程序首先将被调用函数的参数按照逆序压入栈中,从而对函数调用进行设置;
  2. 将当前的EIP指针(扩展指令指针,只向CPU下一步要处理的指令)保存到栈上,这样在被调用函数返回时就可以在离开的地方继续执行,这个地址被称作返回地址
  3. 执行call命令,将被调用函数的地址放入EIP中执行;

这样,调用函数将当前的运行状态完整保存到栈中,同时压入了被调用函数的参数,接下来,就是被调用函数的工作了,我们一般称之为“开场白”

  1. “开场白”:保存当前EBP到栈中,然后将ESP设置为EBP,然后ESP减小,留出存放变量的空间;
  2. “收场白”:其实要简单些,这里主要是将ESP增加到EBP,释放清空栈,然后弹出EIP,继续之前中断的执行,一般就是利用leave和ret两个指令完成。

我在自己的虚拟机Ubuntu12.04上编写了一个简单的C程序,然后使用disassemble命令反汇编程序文件,可以看到清晰的“开场白”和“收场白”

二、缓冲区溢出

缓冲区,本身是系统用于临时存放数据的一块内存区域,我们经常会用到变量复制的操作,将一个缓冲区的数据复制到另一个缓冲区,但是遗憾地是并非所有的函数都执行了严格的缓冲区大小检查操作。因此,当向一个缓冲区中复制超过其大小的数据时,数据就会超出其边界,覆盖影响到其相邻的区域。

假设我们现在有一个具有两个参数的函数调用过程,我们通过此时缓冲区在内存中的结构来说明下缓冲区溢出的原理。

在被调用函数得到执行权之前,调用函数会讲被调用函数的参数逆序压进栈中,这里就是Temp1和Temp2,然后压栈保存当前的EIP指针,最后利用Call命令将被调用函数的地址设置为EIP开始执行。

被调用函数的栈从EBP开始,到ESP为止,中间可以是函数内部定义的局部变量。如果函数内部定义了一个变量name是一个10字节的数组,当将一个100字节的Temp2复制到name时无疑会出现数据的越界,比如覆盖到EBP,甚至到达EIP,而此时原先的EIP便遭到了破坏,造成了缓冲区溢出。

缓冲区溢出的结果一般会造成拒绝服务,但是这是一个相对比较好的结果,因为起码程序给出了提示,有些时候EIP会被攻击者控制并以用户级访问权限执行恶意代码。而第三种则是最糟糕的情况,也就是EIP被控制并在系统级或根级执行恶意代码,此时攻击者获得了系统最高权限。

三、本地缓冲区溢出漏洞攻击

本地缓冲区溢出漏洞攻击要比远程漏洞攻击容易些,因为能够访问系统内存空间,并且更容易调试攻击代码。

一般一个漏洞攻击程序由三个部分构成:

  1. NOP雪橇:汇编代码中有一个空指令NOP,意味着不执行任何操作,而只是移动到吓一跳命令。缓冲区溢出攻击的思路是通过缓冲区溢出覆盖控制EIP,使得EIP跳转到我们的攻击代码,而有时控制计算的并非十分精确,现实中也存在多种情况,因此我们需要添加一段NOP指令作为返回地址的“缓冲”,以防EIP超出攻击代码的范围。
  2. Shellcode:上面所说EIP需要指向一个攻击代码,这个代码就是我们的Shellcode了。原本Shellcode的作用仅仅是返回一个执行shell,也是因此得名,但是现在的Shellcode可以执行更为复杂的攻击。Shellcode是执行黑客命令的机器代码,因此实质上是二进制码,通常以十六进制表示。
  3. 重复返回地址:确定好NOP雪橇和Shellcode的地址后,就需要确定EIP指向的地址,并且进行一定程度的重复,作为缓冲区溢出的填充,一定要覆盖到EIP,作为EIP指向Shellcode才可以实施攻击。

最后,我们将以上三个部分组合起来,就是一个缓冲区溢出攻击的框架:

四、小缓冲区的溢出漏洞攻击

一般Shellcode不会太大,但是也不会太小,如果我们发现存在漏洞的缓冲区很小,不足以存放上面的Shellcode,那该如何呢?

方法就是将Shellcode存放到环境变量的位置,然后缓冲区覆盖EIP指向Shellcode。

这样之所以可以成功,是因为所有Linux ELF文件在映射到内存中时会将最后的相对地址设为0xbfffffff。环境变量和参数存储在这个区域,这些数据的下面就是函数栈,结构如图:

这样,我们就可以继续将EIP指向Shellcode执行攻击。

PS

好了,Linux漏洞的基础知识就介绍到这里了,一些内存、堆栈的知识可以参考我之前的文章。今天虽然讲漏洞,但是没有列出代码和实验演示,感兴趣地朋友可以去Metasploit的网站浏览更多信息,那里有许多攻击实验的分享。

ReferGray Hat Hacking: The Ethical Hacker‘s Handbook, Third Edition

时间: 2024-08-11 05:37:14

【安全健行】(2):Linux漏洞基础的相关文章

Linux系统管理——基础命令篇

终于开始接触Linux,现在是一个标准的菜鸟,那么就踏踏实实,一步一步开始进阶,希望我的博客慢慢可以给后来人带来帮助. 废话少说,下面就是我所接触的Linux系统管理的一些基础命令,以及我个人添加的命令的释义,还望大大们多多指教. 一.Linux命令行基础 [[email protected] ~]# uname -r       //查看内核版本 [[email protected] ~]# uname -a       //查看内核相关详细信息 [[email protected] ~]#

Kali Linux渗透基础知识整理(二)漏洞扫描

Kali Linux渗透基础知识整理系列文章回顾 漏洞扫描 网络流量 Nmap Hping3 Nessus whatweb DirBuster joomscan WPScan 网络流量 网络流量就是网络上传输的数据量. TCP协议 TCP是因特网中的传输层协议,使用三次握手协议建立连接.当主动方发出SYN连接请求后,等待对方回答SYN+ACK ,并最终对对方的 SYN 执行 ACK 确认.这种建立连接的方法可以防止产生错误的连接,TCP使用的流量控制协议是可变大小的滑动窗口协议. 连接建立 TC

linux系统基础优化

1.Linux系统基础优化 一.关闭SELinux功能 Selinux是什么? 安全工具,控制太严格,生产环境不用它,使用其他安全手段. 简介: SELinux带给Linux的主要价值是:提供了一个灵活的,可配置的MAC机制. Security-Enhanced Linux (SELinux)由以下两部分组成: 1) Kernel SELinux模块(/kernel/security/selinux) 2) 用户态工具 SELinux是一个安全体系结构,它通过LSM(Linux Security

Linux入门基础命令(四)

Linux入门基础命令(四)文件系统与目录结构: 1.文件和被组织成一个单根倒置树结构2.文件系统从根目录下开始,用"/表示"3.以.开头的文件为隐藏文件4.路径分割的 /5.文件有两类数据(元数据:metadata 数据:data)6.文件系统分层结构:LSB(Linux Standard Base)FHS:(Filesystem Hierarchy Standard)7.文件名最长255个字节8.包括路径在内文件名称最长4095个字节9.蓝色-->目录 绿色-->可执行

linux网络基础设置 以及 软件安装

一. linux网络基础设置 网络设置基本可以分为:网卡设置.网关设置.DNS设置三部分 ifconfig命令 ifconfig命令被用于配置和显示Linux内核中网络接口的网络参数.用ifconfig命令配置的网卡信息,在网卡重启后机器重启后,配置就不存在.要想将上述的配置信息永远的存的电脑里,那就要修改网卡的配置文件了. 参数 add<地址>:设置网络设备IPv6的ip地址: del<地址>:删除网络设备IPv6的IP地址: down:关闭指定的网络设备: up:启动指定的网络

Linux网络管理基础

Linux网络管理基础 动态路由 Bonding Network Teaming 静态路由实验 Linux的网络管理,了解基本的网络知识是基础,除此,要掌握好ifconig命令.ip命令.nmcli命令(CentOS 7),以及涉及到网络的配置文件. 配置动态路由: 通过守护进程获取动态路由,安装quagga包,支持RIP.OSPF.BGP,通过命令vtysh配置. [[email protected] ~]#yum -y install quagga 切换到服务启动脚本目录下启动或者直接ser

Linux操作系统基础解析之(四)——Linux基本命令剖析(1)

Linux操作系统自从出现以来,就备受关注.但是人们往往会有这样的一个印象:Linux比Windows难.为什么好多人都会有这样的想法呢?很简单,因为Windows是在更早的时候,甚至是大多数国人都没有认识到计算机的时候就已经被安装到X86架构的计算机上了.Microsoft公司寻求Intel公司的技术支持,并且建立合作之后,PC的市场就几乎被这两家公司垄断了.所以,很多人刚刚开始接触并逐渐学会使用计算机,Intel的X86架构的主机,而且这个主机上一般安装的都是Windows操作系统.因此,大

Linux零基础入学之1-3 RHEL7基本命令操作和启动级别设置

§Linux零基础入学之1-3 RHEL7基本命令操作和启动级别设置 [本节内容] *Linux终端介绍 *shell提示符 *Bash shell基本语法 *基本命令的使用:ls.pwd.cd *查看系统折BIOS设置 *Linux如何获得帮助 *Linux关机命令:shutdown.init 0等 *Linux 7个启动级别 *设置服务器在来电后自动开机 [Linux终端介绍] tty    控制台终端 pts    代表虚拟终端 tty1-tty6 > 刚进入的图形界面(桌面)为tty1

Linux下基础命令(六)

Linux计划任务与日志的管理 linux终究按任务与日志管理 –           Linux中的计划任务 –           at计划任务的使用 –           cron计划任务的使用 Linux服务器的日志管理 –           日志的种类和记录的方式 –           实战-自定义ssh服务的日志存储 –           实战-日志的回滚 –           实战-搭建rsyslog远程日志服务器 什么是计划任务 大家平常都会有一些比如说:你每天固定几点