• 20145301《网络对抗》shellcode注入&Return-to-libc攻击深入


    20145301《网络对抗》shellcode注入&Return-to-libc攻击深入

    Shellcode注入

    shellcode是什么?

    • Shellcode是指能完成特殊任务的自包含的二进制代码,根据不同的任务可能是发出一条系统调用或建立一个高权限的Shell,Shellcode也就由此得名。它的最终目的是取得目标机器的控制权,所以一般被攻击者利用系统的漏洞送入系统中执行,从而获取特殊权限的执行环境,或给自己设立有特权的帐户。

    • Linux下有两种基本构造攻击buf的方法:retaddr+nop+shellcode,nop+shellcode+retaddr。

    • 实验的目标是找到返回地址的位置和shellcode的地址。然后通过修改返回地址使其自动执行shellcode

    • apt-get install exestack安装exestack

    实践过程

    • 实验用的是老师上课用的shellcode:
    • 将环境设置为:堆栈可执行、地址随机化关闭
    • 使用anything+retaddr+nops+shellcode的结构构造攻击buf,猜测返回地址所在位置,并且找到shellcode所在地址
    • 在终端注入攻击buf
    • 注意在此时先输入一次“回车”,在后面的调试过程中需要继续运行的时候再输入一次“回车”。 打开另外一个终端,用gdb来调试进程,先找到该进程的进程ID,再打开gdb,用attach指令对该进程进行调试:
    • 对foo函数进行反汇编:
    • 在ret处设置断点,接着继续运行到断点处(也就是要在这是输入第二次回车),查看当前esp的值并依照此位置显示接下来的内存地址内容,来推断shellcode的地址:
    • 由图推断出shellcode地址为:0xffffd42c 继续运行,可以推断返回地址是输入的x01x02x03x04所覆盖的,于是修改之:
    • 将返回地址修改为0xffffd42c,重新注入,成功获得了shell

    Return-to-libc攻击深入

    相关知识

    • 缓冲区溢出的常用攻击方法是用shellcode的地址来覆盖漏洞程序的返回地址,使得漏洞程序去执行存放在栈中shellcode。于是为了阻止这种类型的攻击,一些操作系统(比如Fedora)使得系统管理员具有使栈不可执行的能力。这样的话,一旦程序执行存放在栈中的shellcode就会崩溃,从而阻止了攻击。
    • 但这种保护方式并不是完全有效的,return-to-libc攻击是一种缓冲区溢出的变体攻击。这种攻击不需要一个栈可以执行,甚至不需要一个shellcode。取而代之的是我们让漏洞程序调转到现存的代码(比如已经载入内存的libc库中的system()函数等)来实现我们的攻击。

    实践过程

    • 添加一个用户(但是做到后面突然进不去Linux32环境了。。。索性后面改在root用户做):
    • 进入32位linux环境,将地址随机化关闭,并且把/bin/sh指向zsh:
    • 将漏洞程序保存在/tmp目录下,编译该代码,使用–fno-stack-protector来关闭阻止缓冲区溢出的栈保护机制,并设置给该程序更高权限:
    • 读取环境变量的程序gentenvaddr
    • 将攻击程序保存在/tmp目录下:
    • 通过getenvaddr程序获得BIN_SH地址(0xffffde6d)
    • 通过gdb获得system(0xfe36840)和exit地址(0xfe2a7f0)
    • 将找到的三个内存地址改写在exploit.c中:
    • 删除刚才调试编译的exploit程序和badfile文件,重新编译修改后的exploit.c,接着运行exploit、retlib,攻击成功,获得了root权限:

    深入思考 :将/bin/sh重新指向/bin/bash时的攻击

    • 首先,我们将/bin/sh重新指向/bin/bash,运行漏洞程序:
    • 发现无法获取root权限,因为bash内置了权限降低的机制。
    • setuid()用来重新设置执行目前进程的用户识别码,其有效的用户识别码必须为0(root)。利用函数setuid(0)可以实现我们的目标,在调用系统函数之前,先调用系统函数setuid(0)来提升权限。 我们先要对攻击程序进行修改,在bof的返回地址处写入setuid()的地址,setuid的地址通过gdb来获得:
    • setuid的参数0写在buf[32]
    • 修改完成后,编译运行,攻击成功!!!

    实验总结

    • 这次实验,零零总总出了不少的问题,大多由于自己的不够细致,而恰恰细节决定成败,自己需要反思进步的还有不少。另外从中学会了如何去猜测并验证推断出地址应该所放的位置,当然前提是在地址随机关闭的情况下,如果地址随机,显然再去攻击就没有这么容易了。还是比较佩服黑客或相关技术人员的聪明才智的。希望自己能在这么课程中学到更多。
  • 相关阅读:
    Python类知识点
    安装psycopg2时出错:Error: pg_config executable not found.
    top命令
    Ubuntu18.10创建软件图标
    初始化Redis密码
    Ubuntu修改root密码,ssh 允许root用户登录
    Flask_Migrate数据库迁移
    Ubuntu18.04 systemd开机自启
    dnspython
    记一次Celery的仇
  • 原文地址:https://www.cnblogs.com/5301z/p/6597548.html
Copyright © 2020-2023  润新知